ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBlNmQ5ZWJmLi5kMDg5MGZlIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00Nyw2ICs0NywxOSBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGlibWVkaWFfbmF0aXZlLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb2ZsaW5nZXJfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9mbGluZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3kuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmF1ZGlvcG9saWN5c2VydmljZV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5c2VydmljZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3ltYW5hZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lzZXJ2aWNlX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJtZWRpYXRlcykKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQubWsgYi9jYW1lcmEvQW5kcm9pZC5tawppbmRleCA1Y2VkYWIwLi5kYTVhYzU5IDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5taworKysgYi9jYW1lcmEvQW5kcm9pZC5tawpAQCAtMSwzICsxLDE3IEBACisjIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKIENBTUVSQV9DTElFTlRfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtOCw2ICsyMiw3IEBACiAJQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhTWV0YWRhdGEuY3BwIFwKIAlDYW1lcmFQYXJhbWV0ZXJzLmNwcCBcCisJQ2FwdHVyZVJlc3VsdC5jcHAgXAogCUNhbWVyYVBhcmFtZXRlcnMyLmNwcCBcCiAJSUNhbWVyYS5jcHAgXAogCUlDYW1lcmFDbGllbnQuY3BwIFwKQEAgLTIyLDYgKzM3LDggQEAKIAljYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBcCiAJUHJvQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhQmFzZS5jcHAgXAorCUNhbWVyYVV0aWxzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTM1LDYgKzUyLDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCiAKIExPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYV9jbGllbnQKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYS5jcHAgYi9jYW1lcmEvQ2FtZXJhLmNwcAppbmRleCAyMjE5OWZhLi44NWY0NGYwIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtNzcsNiArNzcsMzIgQEAKICAgICByZXR1cm4gQ2FtZXJhQmFzZVQ6OmNvbm5lY3QoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQpOwogfQogCitzdGF0dXNfdCBDYW1lcmE6OmNvbm5lY3RMZWdhY3koaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICBzcDxDYW1lcmE+JiBjYW1lcmEpCit7CisgICAgQUxPR1YoIiVzOiBjb25uZWN0IGxlZ2FjeSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKGNhbWVyYUlkKTsKKyAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjbCA9IGM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IENhbWVyYUJhc2VUOjpnZXRDYW1lcmFTZXJ2aWNlKCk7CisKKyAgICBpZiAoY3MgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBjcy5nZXQoKS0+Y29ubmVjdExlZ2FjeShjbCwgY2FtZXJhSWQsIGhhbFZlcnNpb24sIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgLypvdXQqL2MtPm1DYW1lcmEpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE9LICYmIGMtPm1DYW1lcmEgIT0gMCkgeworICAgICAgICBjLT5tQ2FtZXJhLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChjKTsKKyAgICAgICAgYy0+bVN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICBjYW1lcmEgPSBjOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGNhbWVyYTogJWQiLCBjYW1lcmFJZCk7CisgICAgICAgIGMuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdHVzX3QgQ2FtZXJhOjpyZWNvbm5lY3QoKQogewogICAgIEFMT0dWKCJyZWNvbm5lY3QiKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcCBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAppbmRleCA1NTM3NmIwLi4wNDY5NGNkIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIERlYXRoTm90aWZpZXIoKSB7CiAgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CiAgICAgICAgICAgICBBTE9HVigiYmluZGVyRGllZCIpOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICAgICAgICAgIGdDYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CkBAIC0xNTMsNyArMTUzLDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDYW0sIHR5cGVuYW1lIFRDYW1UcmFpdHM+Ci12b2lkIENhbWVyYUJhc2U8VENhbSwgVENhbVRyYWl0cz46OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBDYW1lcmFCYXNlPFRDYW0sIFRDYW1UcmFpdHM+OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CiAgICAgQUxPR1coIm1lZGlhc2VydmVyJ3MgcmVtb3RlIGJpbmRlciBDYW1lcmEgb2JqZWN0IGRpZWQiKTsKICAgICBub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfU0VSVkVSX0RJRUQsIC8qZXh0MiovMCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA3NzY1OTE0Li4wNDM0MzdmIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTI1LDYgKzI1LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisjZGVmaW5lIEFMSUdOX1RPKHZhbCwgYWxpZ25tZW50KSBcCisgICAgKCgodWludHB0cl90KSh2YWwpICsgKChhbGlnbm1lbnQpIC0gMSkpICYgfigoYWxpZ25tZW50KSAtIDEpKQorCiB0eXBlZGVmIFBhcmNlbDo6V3JpdGFibGVCbG9iIFdyaXRhYmxlQmxvYjsKIHR5cGVkZWYgUGFyY2VsOjpSZWFkYWJsZUJsb2IgUmVhZGFibGVCbG9iOwogCkBAIC0yNzAsNyArMjczLDggQEAKICAgICBpZiAoIChyZXMgPSBjaGVja1R5cGUodGFnLCBUWVBFX0JZVEUpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KLSAgICByZXR1cm4gdXBkYXRlSW1wbCh0YWcsIChjb25zdCB2b2lkKilzdHJpbmcuc3RyaW5nKCksIHN0cmluZy5zaXplKCkpOworICAgIC8vIHN0cmluZy5zaXplKCkgZG9lc24ndCBjb3VudCB0aGUgbnVsbCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisgICAgcmV0dXJuIHVwZGF0ZUltcGwodGFnLCAoY29uc3Qgdm9pZCopc3RyaW5nLnN0cmluZygpLCBzdHJpbmcuc2l6ZSgpICsgMSk7CiB9CiAKIHN0YXR1c190IENhbWVyYU1ldGFkYXRhOjp1cGRhdGVJbXBsKHVpbnQzMl90IHRhZywgY29uc3Qgdm9pZCAqZGF0YSwKQEAgLTQzMSw0MCArNDM1LDcwIEBACiAgICAgICAgICpvdXQgPSBOVUxMOwogICAgIH0KIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQotICAgIGludDMyX3QgbWV0YWRhdGFTaXplVG1wID0gLTE7Ci0gICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmbWV0YWRhdGFTaXplVG1wKSkgIT0gT0spIHsKKyAgICAvLyBTZWUgQ2FtZXJhTWV0YWRhdGE6OndyaXRlVG9QYXJjZWwgZm9yIHBhcmNlbCBkYXRhIGxheW91dCBkaWFncmFtIGFuZCBleHBsYW5hdGlvbi4KKyAgICAvLyBhcmcwID0gYmxvYlNpemUgKGludDMyKQorICAgIGludDMyX3QgYmxvYlNpemVUbXAgPSAtMTsKKyAgICBpZiAoKGVyciA9IGRhdGEucmVhZEludDMyKCZibG9iU2l6ZVRtcCkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgc2l6ZSAoZXJyb3IgJWQgJXMpIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IG1ldGFkYXRhU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4obWV0YWRhdGFTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYmxvYlNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJsb2JTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYWxpZ25tZW50ID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9hbGlnbm1lbnQoKTsKIAotICAgIGlmIChtZXRhZGF0YVNpemUgPT0gMCkgeworICAgIC8vIFNwZWNpYWwgY2FzZTogemVybyBibG9iIHNpemUgbWVhbnMgemVybyBzaXplZCAoTlVMTCkgbWV0YWRhdGEuCisgICAgaWYgKGJsb2JTaXplID09IDApIHsKICAgICAgICAgQUxPR1YoIiVzOiBSZWFkIDAtc2l6ZWQgbWV0YWRhdGEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gTk9URTogdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gbWUuIHNob3VsZG50IHRoZSBibG9iCisgICAgaWYgKGJsb2JTaXplIDw9IGFsaWdubWVudCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGJsb2IgaXMgbWFsZm9ybWVkLCBibG9iU2l6ZSglenUpIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBhbGlnbm1lbnQoJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgYWxpZ25tZW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgbWV0YWRhdGFTaXplID0gYmxvYlNpemUgLSBhbGlnbm1lbnQ7CisKKyAgICAvLyBOT1RFOiB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBtZS4gc2hvdWxkbid0IHRoZSBibG9iCiAgICAgLy8ga25vdyBob3cgYmlnIGl0IGlzPyB3aHkgZG8gd2UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBzaXplCiAgICAgLy8gdG8gUGFyY2VsOjpyZWFkQmxvYiA/Ci0KICAgICBSZWFkYWJsZUJsb2IgYmxvYjsKICAgICAvLyBhcmcxID0gbWV0YWRhdGEgKGJsb2IpCiAgICAgZG8gewotICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IobWV0YWRhdGFTaXplLCAmYmxvYikpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGJsb2IgKHNpemVkICVkKS4gUG9zc2libGUgIgorICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IoYmxvYlNpemUsICZibG9iKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgYmxvYiAoc2l6ZWQgJXp1KS4gUG9zc2libGUgIgogICAgICAgICAgICAgICAgICAgIiBzZXJpYWxpemF0aW9uIGJ1Zy4gRXJyb3IgJWQgJXMiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZXRhZGF0YVNpemUsIGVyciwgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogdG1wID0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KGJsb2IuZGF0YSgpKTsKIAorICAgICAgICAvLyBhcmcyID0gb2Zmc2V0IChibG9iKQorICAgICAgICAvLyBNdXN0IGJlIGFmdGVyIGJsb2Igc2luY2Ugd2UgZG9uJ3Qga25vdyBvZmZzZXQgdW50aWwgYWZ0ZXIgd3JpdGVCbG9iLgorICAgICAgICBpbnQzMl90IG9mZnNldFRtcDsKKyAgICAgICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmb2Zmc2V0VG1wKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgb2Zmc2V0VG1wIChlcnJvciAlZCAlcykiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldFRtcCk7CisgICAgICAgIGlmIChvZmZzZXQgPj0gYWxpZ25tZW50KSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIG9mZnNldCglenUpIHNob3VsZCBiZSBsZXNzIHRoYW4gYWxpZ25tZW50KCV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJsb2JTaXplLCBhbGlnbm1lbnQpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihibG9iLmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiB0bXAgPQorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGFTdGFydCk7CisgICAgICAgIEFMT0dWKCIlczogYWxpZ25tZW50IGlzOiAlenUsIG1ldGFkYXRhIHN0YXJ0OiAlcCwgb2Zmc2V0OiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWxpZ25tZW50LCB0bXAsIG9mZnNldCk7CiAgICAgICAgIG1ldGFkYXRhID0gYWxsb2NhdGVfY29weV9jYW1lcmFfbWV0YWRhdGFfY2hlY2tlZCh0bXAsIG1ldGFkYXRhU2l6ZSk7CiAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSBjb25zaWRlciB0aGF0IGFsbG9jYXRpb24gb25seSBmYWlscyBpZiB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICAgLy8gYWxzbyBmYWlsZWQsIHRoZXJlZm9yZSB0aGUgcmVhZEZyb21QYXJjZWwgd2FzIGEgZmFpbHVyZS4KKyAgICAgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgYWxsb2NhdGlvbiBhbmQgY29weSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSB3aGlsZSgwKTsKQEAgLTQ4NSwzOCArNTE5LDgwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogbWV0YWRhdGEpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQorICAgIC8qKgorICAgICAqIEJlbG93IGlzIHRoZSBjYW1lcmEgbWV0YWRhdGEgcGFyY2VsIGxheW91dDoKKyAgICAgKgorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICAgIGFyZzA6IGJsb2JTaXplICAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAgICAgICAgKGxlbmd0aCA9IDQpICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS1Ta2lwIHRoZSByZXN0IGlmIGJsb2JTaXplID09IDAuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICBhcmcxOiBibG9iICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfCAobGVuZ3RoID0gdmFyaWFibGUsIHNlZSBhcmcxIGxheW91dCBiZWxvdykgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqIHwgICAgICAgICAgICAgIGFyZzI6IG9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAobGVuZ3RoID0gNCkgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqLwogCisgICAgLy8gYXJnMCA9IGJsb2JTaXplIChpbnQzMikKICAgICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAvLyBXcml0ZSB6ZXJvIGJsb2JTaXplIGZvciBudWxsIG1ldGFkYXRhLgogICAgICAgICByZXR1cm4gZGF0YS53cml0ZUludDMyKDApOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFsd2F5cyBtYWtlIHRoZSBibG9iIHNpemUgc3VmZmljaWVudGx5IGxhcmdlciwgYXMgd2UgbmVlZCBwdXQgYWxpZ25tZW50CisgICAgICogcGFkZGluZyBhbmQgbWV0YWRhdGEgaW50byB0aGUgYmxvYi4gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgYWxpZ25tZW50CisgICAgICogb2Zmc2V0IGJlZm9yZSB3cml0ZUJsb2IuIFRoZW4gd3JpdGUgdGhlIG1ldGFkYXRhIHRvIGFsaWduZWQgb2Zmc2V0LgorICAgICAqLwogICAgIGNvbnN0IHNpemVfdCBtZXRhZGF0YVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2NvbXBhY3Rfc2l6ZShtZXRhZGF0YSk7Ci0gICAgcmVzID0gZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1ldGFkYXRhU2l6ZSkpOworICAgIGNvbnN0IHNpemVfdCBhbGlnbm1lbnQgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2FsaWdubWVudCgpOworICAgIGNvbnN0IHNpemVfdCBibG9iU2l6ZSA9IG1ldGFkYXRhU2l6ZSArIGFsaWdubWVudDsKKyAgICByZXMgPSBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYmxvYlNpemUpKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gYXJnMSA9IG1ldGFkYXRhIChibG9iKQorICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIC8qKgorICAgICAqIGFyZzEgPSBtZXRhZGF0YSAoYmxvYikuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBzaXplIGlzIHRoZSBzdW0gb2YgZnJvbnQgcGFkZGluZyBzaXplLCBtZXRhZGF0YSBzaXplIGFuZCBiYWNrIHBhZGRpbmcKKyAgICAgKiBzaXplLCB3aGljaCBpcyBlcXVhbCB0byBtZXRhZGF0YVNpemUgKyBhbGlnbm1lbnQuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBsYXlvdXQgaXM6CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLVN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJsb2IgKHVuYWxpZ25lZCkuCisgICAgICogfCAgICAgICAgICAgZnJvbnQgcGFkZGluZyAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgIChzaXplID0gb2Zmc2V0KSAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PC0tLS1BbGlnbmVkIHN0YXJ0IGFkZHJlc3Mgb2YgbWV0YWRhdGEuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICBtZXRhZGF0YSAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAoc2l6ZSA9IG1ldGFkYXRhU2l6ZSkgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICBiYWNrIHBhZGRpbmcgICAgICAgICAgICAgfAorICAgICAqIHwgICAgIChzaXplID0gYWxpZ25tZW50IC0gb2Zmc2V0KSAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLUVuZCBhZGRyZXNzIG9mIGJsb2IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCbG9iIHN0YXJ0IGFkZHJlc3MgKyBibG9iIHNpemUpLgorICAgICAqLwogICAgIFdyaXRhYmxlQmxvYiBibG9iOwogICAgIGRvIHsKLSAgICAgICAgcmVzID0gZGF0YS53cml0ZUJsb2IobWV0YWRhdGFTaXplLCAmYmxvYik7CisgICAgICAgIHJlcyA9IGRhdGEud3JpdGVCbG9iKGJsb2JTaXplLCAmYmxvYik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvcHlfY2FtZXJhX21ldGFkYXRhKGJsb2IuZGF0YSgpLCBtZXRhZGF0YVNpemUsIG1ldGFkYXRhKTsKLQotICAgICAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KilibG9iLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZtZXRhZGF0YVNpemUpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBGYWlsZWQgdG8gdmFsaWRhdGUgbWV0YWRhdGEgJXAgYWZ0ZXIgd3JpdGluZyBibG9iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iLmRhdGEoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWV0YWRhdGEgd3JpdHRlbiB0byBibG9iLiBWYWxpZGF0aW9uIHN1Y2Nlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IEFMSUdOX1RPKGJsb2IuZGF0YSgpLCBhbGlnbm1lbnQpOworICAgICAgICBvZmZzZXQgPSBtZXRhZGF0YVN0YXJ0IC0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJsb2IuZGF0YSgpKTsKKyAgICAgICAgQUxPR1YoIiVzOiBhbGlnbm1lbnQgaXM6ICV6dSwgbWV0YWRhdGEgc3RhcnQ6ICVwLCBvZmZzZXQ6ICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkICo+KG1ldGFkYXRhU3RhcnQpLCBvZmZzZXQpOworICAgICAgICBjb3B5X2NhbWVyYV9tZXRhZGF0YShyZWludGVycHJldF9jYXN0PHZvaWQqPihtZXRhZGF0YVN0YXJ0KSwgbWV0YWRhdGFTaXplLCBtZXRhZGF0YSk7CiAKICAgICAgICAgLy8gTm90IHRvbyBiaWcgb2YgYSBwcm9ibGVtIHNpbmNlIHJlY2VpdmluZyBzaWRlIGRvZXMgaGFyZCB2YWxpZGF0aW9uCiAgICAgICAgIC8vIERvbid0IGNoZWNrIHRoZSBzaXplIHNpbmNlIHRoZSBjb21wYWN0IHNpemUgY291bGQgYmUgbGFyZ2VyCkBAIC01MjgsNiArNjA0LDkgQEAKICAgICB9IHdoaWxlKGZhbHNlKTsKICAgICBibG9iLnJlbGVhc2UoKTsKIAorICAgIC8vIGFyZzIgPSBvZmZzZXQgKGludDMyKQorICAgIHJlcyA9IGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihvZmZzZXQpKTsKKwogICAgIHJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCBjNTFmMjY1Li4yNWQ2MzJkIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gUGFyYW1ldGVyIGtleXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjYW1lcmEgYXBwbGljYXRpb24gYW5kIGRyaXZlci4KQEAgLTQ1Niw3ICs0NTcsNyBAQAogCiB2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmR1bXAoKSBjb25zdAogewotICAgIEFMT0dEKCJkdW1wOiBtTWFwLnNpemUgPSAlZCIsIG1NYXAuc2l6ZSgpKTsKKyAgICBBTE9HRCgiZHVtcDogbU1hcC5zaXplID0gJXp1IiwgbU1hcC5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7IGkrKykgewogICAgICAgICBTdHJpbmc4IGssIHY7CiAgICAgICAgIGsgPSBtTWFwLmtleUF0KGkpOwpAQCAtNDY1LDEyICs0NjYsMTIgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYVBhcmFtZXRlcnM6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgQ2FtZXJhUGFyYW1ldGVyczo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiQ2FtZXJhUGFyYW1ldGVyczo6ZHVtcDogbU1hcC5zaXplID0gJWRcbiIsIG1NYXAuc2l6ZSgpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIkNhbWVyYVBhcmFtZXRlcnM6OmR1bXA6IG1NYXAuc2l6ZSA9ICV6dVxuIiwgbU1hcC5zaXplKCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgU3RyaW5nOCBrLCB2OwpAQCAtNDgzLDQgKzQ4NCw0NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRTdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cyhWZWN0b3I8aW50PiYgZm9ybWF0cykgY29uc3QgeworICAgIGNvbnN0IGNoYXIqIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzID0KKyAgICAgICAgICBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZPUk1BVFMpOworCisgICAgU3RyaW5nOCBmbXRTdHIoc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMpOworICAgIGNoYXIqIHByZXZGbXRzID0gZm10U3RyLmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7CisKKyAgICBjaGFyKiBzYXZlUHRyOworICAgIGNoYXIqIGZtdCA9IHN0cnRva19yKHByZXZGbXRzLCAiLCIsICZzYXZlUHRyKTsKKyAgICB3aGlsZSAoZm10KSB7CisgICAgICAgIGludCBhY3R1YWwgPSBwcmV2aWV3Rm9ybWF0VG9FbnVtKGZtdCk7CisgICAgICAgIGlmIChhY3R1YWwgIT0gLTEpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKGFjdHVhbCk7CisgICAgICAgIH0KKyAgICAgICAgZm10ID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmc2F2ZVB0cik7CisgICAgfQorICAgIGZtdFN0ci51bmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7Cit9CisKKworaW50IENhbWVyYVBhcmFtZXRlcnM6OnByZXZpZXdGb3JtYXRUb0VudW0oY29uc3QgY2hhciogZm9ybWF0KSB7CisgICAgcmV0dXJuCisgICAgICAgICFmb3JtYXQgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOgorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1lVVjQyMlNQKSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUCA6IC8vIE5WMTYKKyAgICAgICAgIXN0cmNtcChmb3JtYXQsIFBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOiAvLyBOVjIxCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfWVVWNDIySSkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSSA6ICAvLyBZVVkyCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfWVVWNDIwUCkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyIDogICAgICAgICAvLyBZVjEyCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfUkdCNTY1KSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUgOiAgICAgIC8vIFJHQjU2NQorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1JHQkE4ODg4KSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCA6ICAgIC8vIFJHQjg4ODgKKyAgICAgICAgIXN0cmNtcChmb3JtYXQsIFBJWEVMX0ZPUk1BVF9CQVlFUl9SR0dCKSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBV19TRU5TT1IgOiAgIC8vIFJhdyBzZW5zb3IgZGF0YQorICAgICAgICAtMTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCmluZGV4IGVhYzc5ZTEuLjM3OGFmZWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcApAQCAtMzYyLDYgKzM2Miw3IEBACiAKIHN0YXR1c190IENhbWVyYVBhcmFtZXRlcnMyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKIHsKKyAgICAodm9pZClhcmdzOwogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcCBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNDRhYwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVV0aWxzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAodHJhbnNmb3JtID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzOiBudWxsIHRyYW5zZm9ybSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKnRyYW5zZm9ybSA9IDA7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBmaW5kIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlGYWNpbmcgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0ZBQ0lORyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBmaW5kIGFuZHJvaWQubGVucy5mYWNpbmcgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnQzMl90JiBmbGFncyA9ICp0cmFuc2Zvcm07CisKKyAgICBib29sIG1pcnJvciA9IChlbnRyeUZhY2luZy5kYXRhLnU4WzBdID09IEFORFJPSURfTEVOU19GQUNJTkdfRlJPTlQpOworICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIGlmICghbWlycm9yKSB7CisgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSEFMIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIHZhbHVlOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRnJvbnQgY2FtZXJhIG5lZWRzIHRvIGJlIGhvcml6b250YWxseSBmbGlwcGVkIGZvciBtaXJyb3ItbGlrZSBiZWhhdmlvci4KKyAgICAgICAgLy8gTm90ZTogRmxpcHMgYXJlIGFwcGxpZWQgYmVmb3JlIHJvdGF0ZXM7IHVzaW5nIFhPUiBoZXJlIGFzIHNvbWUgb2YgdGhlc2UgZmxhZ3MgYXJlCisgICAgICAgIC8vIGNvbXBvc2VkIGluIHRlcm1zIG9mIG90aGVyIGZsaXAvcm90YXRpb24gZmxhZ3MsIGFuZCBhcmUgbm90IGJpdHdpc2UtT1JhYmxlLgorICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9IIF4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSCBeCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0ggXgorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIQUwgYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24gdmFsdWU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWFnaWMgZmxhZyBtYWtlcyBzdXJmYWNlZmxpbmdlciB1bi1yb3RhdGUgdGhlIGJ1ZmZlcnMKKyAgICAgKiB0byBjb3VudGVyIHRoZSBleHRyYSBnbG9iYWwgZGV2aWNlIFVJIHJvdGF0aW9uIHdoZW5ldmVyIHRoZSB1c2VyCisgICAgICogcGh5c2ljYWxseSByb3RhdGVzIHRoZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiBCeSBkb2luZyB0aGlzLCB0aGUgY2FtZXJhIGJ1ZmZlciBhbHdheXMgZW5kcyB1cCBhbGlnbmVkCisgICAgICogd2l0aCB0aGUgcGh5c2ljYWwgY2FtZXJhIGZvciBhICJzZWUgdGhyb3VnaCIgZWZmZWN0LgorICAgICAqCisgICAgICogSW4gZXNzZW5jZSwgdGhlIGJ1ZmZlciBvbmx5IGdldHMgcm90YXRlZCBkdXJpbmcgcHJldmlldyB1c2UtY2FzZXMuCisgICAgICogVGhlIHVzZXIgaXMgc3RpbGwgcmVzcG9uc2libGUgdG8gcmUtY3JlYXRlIHN0cmVhbXMgb2YgdGhlIHByb3BlcgorICAgICAqIGFzcGVjdCByYXRpbywgb3IgdGhlIHByZXZpZXcgd2lsbCBlbmQgdXAgbG9va2luZyBub24tdW5pZm9ybWx5CisgICAgICogc3RyZXRjaGVkLgorICAgICAqLworICAgIGZsYWdzIHw9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0lOVkVSU0VfRElTUExBWTsKKworICAgIEFMT0dWKCIlczogZmluYWwgdHJhbnNmb3JtID0gMHgleCIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworCisgICAgcmV0dXJuIE9LOworfQorCisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcCBiL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM2MTYwCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEtQ2FwdHVyZVJlc3VsdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgQ2FwdHVyZVJlc3VsdEV4dHJhczo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gcmVxdWVzdElkID49IDA7Cit9CisKK3N0YXR1c190IENhcHR1cmVSZXN1bHRFeHRyYXM6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+cmVhZEludDMyKCZyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZidXJzdElkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQzMigmYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQ2NCgmZnJhbWVOdW1iZXIpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYXB0dXJlUmVzdWx0RXh0cmFzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihidXJzdElkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVOdW1iZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KCkgOgorICAgICAgICBtTWV0YWRhdGEoKSwgbVJlc3VsdEV4dHJhcygpIHsKK30KKworQ2FwdHVyZVJlc3VsdDo6Q2FwdHVyZVJlc3VsdChjb25zdCBDYXB0dXJlUmVzdWx0ICZvdGhlclJlc3VsdCkgeworICAgIG1SZXN1bHRFeHRyYXMgPSBvdGhlclJlc3VsdC5tUmVzdWx0RXh0cmFzOworICAgIG1NZXRhZGF0YSA9IG90aGVyUmVzdWx0Lm1NZXRhZGF0YTsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6cmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpIHsKKworICAgIEFMT0dWKCIlczogcGFyY2VsID0gJXAiLCBfX0ZVTkNUSU9OX18sIHBhcmNlbCk7CisKKyAgICBpZiAocGFyY2VsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJjZWwgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbU1ldGFkYXRhLmNsZWFyKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICByZXMgPSBtTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWwuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJlcyA9IG1SZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVzdWx0IGV4dHJhcyBmcm9tIHBhcmNlbC4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogUmVhZCByZXN1bHQgZXh0cmFzIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworCisgICAgQUxPR1YoIiVzOiBwYXJjZWwgPSAlcCIsIF9fRlVOQ1RJT05fXywgcGFyY2VsKTsKKworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICByZXMgPSBtTWV0YWRhdGEud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgbWV0YWRhdGEgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBXcm90ZSBtZXRhZGF0YSB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmVzID0gbVJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSByZXN1bHQgZXh0cmFzIHRvIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogV3JvdGUgcmVzdWx0IGV4dHJhcyB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIE9LOworfQorCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA1ZmM4OWZiLi41NDg1MjA1IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3LDYgKzE3LDggQEAKIAogI2RlZmluZSBMT0dfVEFHICJCcENhbWVyYVNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMzQsNiArMzYsNyBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTQzLDYgKzE0NiwyNCBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8vIEdldCBlbnVtZXJhdGlvbiBhbmQgZGVzY3JpcHRpb24gb2YgdmVuZG9yIHRhZ3MgZm9yIGNhbWVyYQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcigvKm91dCovc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9DQU1FUkFfVkVORE9SX1RBR19ERVNDUklQVE9SLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGlmIChyZWFkRXhjZXB0aW9uQ29kZShyZXBseSkpIHJldHVybiAtRVBST1RPOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZDsKKyAgICAgICAgICAgIGlmIChWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVGcm9tUGFyY2VsKCZyZXBseSwgLypvdXQqL2QpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICAvLyBjb25uZWN0IHRvIGNhbWVyYSBzZXJ2aWNlIChhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSkKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCkBAIC0xNjUsNiArMTg2LDI5IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAoYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPElDYW1lcmE+JiBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2FtZXJhSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFsVmVyc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihjbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbGllbnRVaWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAocHJvIGNsaWVudCkKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RQcm8oY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGNhbWVyYUNiLCBpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKQEAgLTIzMyw2ICsyNzcsNDEgQEAKICAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExlZ2FjeVBhcmFtZXRlcnMoaW50IGNhbWVyYUlkLCBTdHJpbmcxNiogcGFyYW1ldGVycykgeworICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9MRUdBQ1lfUEFSQU1FVEVSUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CisKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaW50MzJfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOyAvLyAtMSBtZWFucyBudWxsCisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IGRhdGEucmVhZFN0cmluZzE2KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IFN0cmluZzE2KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNDYW1lcmFBcGkoaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGFwaVZlcnNpb24pOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpTVVBQT1JUU19DQU1FUkFfQVBJLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKworICAgICAgICBzdGF0dXNfdCByZXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmFTZXJ2aWNlLCAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhU2VydmljZSIpOwpAQCAtMjc1LDYgKzM1NCwyMiBAQAogICAgICAgICAgICAgaW5mby53cml0ZVRvUGFyY2VsKHJlcGx5KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfQ0FNRVJBX1ZFTkRPUl9UQUdfREVTQ1JJUFRPUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcihkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworCisgICAgICAgICAgICAvLyBvdXQtdmFyaWFibGVzIGFyZSBhZnRlciBleGNlcHRpb24gYW5kIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsgLy8gbWVhbnMgdGhlIHBhcmNlbGFibGUgaXMgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICBkLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDT05ORUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IGNhbWVyYUNsaWVudCA9CkBAIC0yODQsNyArMzc5LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovIGNhbWVyYSk7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqL2NhbWVyYSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChjYW1lcmEgIT0gTlVMTCkgewpAQCAtMzA0LDcgKzM5OSw3IEBACiAgICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4gY2FtZXJhOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdFBybyhjYW1lcmFDbGllbnQsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki8gY2FtZXJhKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CkBAIC0zMjQsNyArNDE5LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBjYW1lcmE7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RGV2aWNlKGNhbWVyYUNsaWVudCwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqLyBjYW1lcmEpOworICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki9jYW1lcmEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoY2FtZXJhICE9IE5VTEwpIHsKQEAgLTM1MSw2ICs0NDYsNTAgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0xFR0FDWV9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBTdHJpbmcxNiBwYXJhbWV0ZXJzOworCisgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRMZWdhY3lQYXJhbWV0ZXJzKGNhbWVyYUlkLCAmcGFyYW1ldGVycykpOworICAgICAgICAgICAgLy8gb3V0IHBhcmFtZXRlcnMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOyAvLyBwYXJhbWV0ZXJzIGlzIGFsd2F5cyBhdmFpbGFibGUKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KHBhcmFtZXRlcnMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVUFBPUlRTX0NBTUVSQV9BUEk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGNhbWVyYUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBhcGlWZXJzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWQsIGFwaVZlcnNpb24pKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDT05ORUNUX0xFR0FDWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjYW1lcmFDbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDMyX3QgaGFsVmVyc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBjbGllbnROYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKKyAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RMZWdhY3koY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvUHJvQ2FtZXJhLmNwcCBiL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCmluZGV4IGJhNWE0OGMuLjQ4ZjhlOGUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCisrKyBiL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCkBAIC0yNDksMTEgKzI0OSwxNCBAQAogICAgIHNwIDxJUHJvQ2FtZXJhVXNlcj4gYyA9IG1DYW1lcmE7CiAgICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoYnEsIGhlYXBDb3VudC8qLCBzeW5jaHJvbm91c01vZGUqLyk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIGhlYXBDb3VudAorICAgICAgICAgICAgLyosIHN5bmNocm9ub3VzTW9kZSovKTsKICAgICBjYy0+c2V0TmFtZShTdHJpbmc4KCJQcm9DYW1lcmE6Om1DcHVDb25zdW1lciIpKTsKIAotICAgIHNwPFN1cmZhY2U+IHN0YyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAKICAgICBzdGF0dXNfdCBzID0gY3JlYXRlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Yy0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLApkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGE2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlZlbmRvclRhZ0Rlc2NyaXB0b3IiCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCisjaW5jbHVkZSAiY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdik7CitzdGF0aWMgdm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90KiB0YWdBcnJheSk7CitzdGF0aWMgY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X3RhZ19uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90IHRhZyk7CitzdGF0aWMgaW50IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKKworfSAvKiBleHRlcm4gIkMiICovCisKKworc3RhdGljIE11dGV4IHNMb2NrOworc3RhdGljIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yOworCitWZW5kb3JUYWdEZXNjcmlwdG9yOjpWZW5kb3JUYWdEZXNjcmlwdG9yKCkge30KKworVmVuZG9yVGFnRGVzY3JpcHRvcjo6flZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgc2l6ZV90IGxlbiA9IG1SZXZlcnNlTWFwcGluZy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgIHsKKyAgICAgICAgZGVsZXRlIG1SZXZlcnNlTWFwcGluZ1tpXTsKKyAgICB9Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIGlmICh2T3BzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB2ZW5kb3JfdGFnX29wcyBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCB0YWdDb3VudCA9IHZPcHMtPmdldF90YWdfY291bnQodk9wcyk7CisgICAgaWYgKHRhZ0NvdW50IDwgMCB8fCB0YWdDb3VudCA+IElOVDMyX01BWCkgeworICAgICAgICBBTE9HRSgiJXM6IHRhZyBjb3VudCAlZCBmcm9tIHZlbmRvciBvcHMgaXMgaW52YWxpZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHRhZ0FycmF5OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFnQXJyYXkucmVzaXplKHRhZ0NvdW50KSAhPSB0YWdDb3VudCwKKyAgICAgICAgICAgICIlczogdG9vIG1hbnkgKCV1KSB2ZW5kb3IgdGFncyBkZWZpbmVkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworCisgICAgdk9wcy0+Z2V0X2FsbF90YWdzKHZPcHMsIC8qb3V0Ki90YWdBcnJheS5lZGl0QXJyYXkoKSk7CisKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBkZXNjLT5tVGFnQ291bnQgPSB0YWdDb3VudDsKKworICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBzZWN0aW9uczsKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpOworICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHRhZyBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9OYW1lTWFwLmFkZCh0YWcsIFN0cmluZzgodGFnTmFtZSkpOworICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHZPcHMtPmdldF9zZWN0aW9uX25hbWUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisKKyAgICAgICAgc2VjdGlvbnMuYWRkKHNlY3Rpb25TdHJpbmcpOworICAgICAgICB0YWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgaW50IHRhZ1R5cGUgPSB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9UeXBlTWFwLmFkZCh0YWcsIHRhZ1R5cGUpOworICAgIH0KKworICAgIGRlc2MtPm1TZWN0aW9ucyA9IHNlY3Rpb25zOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcgPSB0YWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKworICAgICAgICAvLyBTZXQgdXAgdGFnIHRvIHNlY3Rpb24gaW5kZXggbWFwCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBzZWN0aW9ucy5pbmRleE9mKHNlY3Rpb25TdHJpbmcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4ICV6ZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsIGluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKworICAgICAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgdGFnQ291bnQgPSAwOworICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ0NvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3Igb3BzIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICB1aW50MzJfdCB0YWcsIHNlY3Rpb25JbmRleDsKKyAgICB1aW50MzJfdCBtYXhTZWN0aW9uSW5kZXggPSAwOworICAgIGludDMyX3QgdGFnVHlwZTsKKyAgICBWZWN0b3I8dWludDMyX3Q+IGFsbFRhZ3M7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFnQ291bnQ7ICsraSkgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZ0YWcpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgdGFnIGlkIGZyb20gcGFyY2VsIGZvciBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJlcyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ1R5cGUpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgdHlwZSBmcm9tIHBhcmNlbCBmb3IgdGFnICVkIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCB0YWdOYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgICAgICBpZiAodGFnTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHRhZyBuYW1lIHdhcyBOVUxMIGZvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmVzID0gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZzZWN0aW9uSW5kZXgpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgc2VjdGlvbiBpbmRleCBmb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWF4U2VjdGlvbkluZGV4ID0gKG1heFNlY3Rpb25JbmRleCA+PSBzZWN0aW9uSW5kZXgpID8gbWF4U2VjdGlvbkluZGV4IDogc2VjdGlvbkluZGV4OworCisgICAgICAgIGFsbFRhZ3MuYWRkKHRhZyk7CisgICAgICAgIGRlc2MtPm1UYWdUb05hbWVNYXAuYWRkKHRhZywgdGFnTmFtZSk7CisgICAgICAgIGRlc2MtPm1UYWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvbkluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvVHlwZU1hcC5hZGQodGFnLCB0YWdUeXBlKTsKKyAgICB9CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNlY3Rpb25Db3VudDsKKyAgICBpZiAodGFnQ291bnQgPiAwKSB7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIocmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJnNlY3Rpb25Db3VudCkpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCBzZWN0aW9uIGNvdW50IGZvci4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VjdGlvbkNvdW50IDwgKG1heFNlY3Rpb25JbmRleCArIDEpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEluY29ycmVjdCBudW1iZXIgb2Ygc2VjdGlvbnMgZGVmaW5lZCwgcmVjZWl2ZWQgJXp1LCBuZWVkcyAlZC4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlY3Rpb25Db3VudCwgKG1heFNlY3Rpb25JbmRleCArIDEpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXNjLT5tU2VjdGlvbnMuc2V0Q2FwYWNpdHkoc2VjdGlvbkNvdW50KSA8PSAwLAorICAgICAgICAgICAgICAgICJWZWN0b3IgY2FwYWNpdHkgbXVzdCBiZSBwb3NpdGl2ZSIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlY3Rpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHNlY3Rpb25OYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgaWYgKHNlY3Rpb25OYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHNlY3Rpb24gbmFtZSB3YXMgTlVMTCBmb3Igc2VjdGlvbiAlenUuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tU2VjdGlvbnMuYWRkKHNlY3Rpb25OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdGljX2Nhc3Q8c2l6ZV90Pih0YWdDb3VudCkgIT0gYWxsVGFncy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ291bnQgbXVzdCBiZSB0aGUgc2FtZSBhcyBhbGxUYWdzIHNpemUiKTsKKyAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IGFsbFRhZ3NbaV07CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IGRlc2MtPm1TZWN0aW9uc1tkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyldOworCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnQ291bnQoKSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnQXJyYXkodWludDMyX3QqIHRhZ0FycmF5KSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB0YWdBcnJheVtpXSA9IG1UYWdUb05hbWVNYXAua2V5QXQoaSk7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRTZWN0aW9uTmFtZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvU2VjdGlvbk1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtU2VjdGlvbnNbbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUF0KGluZGV4KV0uc3RyaW5nKCk7Cit9CisKK2NvbnN0IGNoYXIqIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFRhZ05hbWUodWludDMyX3QgdGFnKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1UYWdUb05hbWVNYXAuaW5kZXhPZktleSh0YWcpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaW5kZXgpLnN0cmluZygpOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnVHlwZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvTmFtZU1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19UWVBFX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKK30KKworc3RhdHVzX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKG1UYWdDb3VudCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICB1aW50MzJfdCB0YWcsIHNlY3Rpb25JbmRleDsKKyAgICBpbnQzMl90IHRhZ1R5cGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgdGFnID0gbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKyAgICAgICAgU3RyaW5nOCB0YWdOYW1lID0gbVRhZ1RvTmFtZU1hcFtpXTsKKyAgICAgICAgc2VjdGlvbkluZGV4ID0gbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICB0YWdUeXBlID0gbVRhZ1RvVHlwZU1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVJbnQzMih0YWcpKSAhPSBPSykgYnJlYWs7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKHRhZ1R5cGUpKSAhPSBPSykgYnJlYWs7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzgodGFnTmFtZSkpICE9IE9LKSBicmVhazsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPndyaXRlSW50MzIoc2VjdGlvbkluZGV4KSkgIT0gT0spIGJyZWFrOworICAgIH0KKworICAgIHNpemVfdCBudW1TZWN0aW9ucyA9IG1TZWN0aW9ucy5zaXplKCk7CisgICAgaWYgKG51bVNlY3Rpb25zID4gMCkgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVJbnQzMihudW1TZWN0aW9ucykpICE9IE9LKSByZXR1cm4gcmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlY3Rpb25zOyArK2kpIHsKKyAgICAgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzgobVNlY3Rpb25zW2ldKSkgIT0gT0spIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0QWxsU2VjdGlvbk5hbWVzKCkgY29uc3QgeworICAgIHJldHVybiBtU2VjdGlvbnM7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6Omxvb2t1cFRhZyhTdHJpbmc4IG5hbWUsIFN0cmluZzggc2VjdGlvbiwgLypvdXQqL3VpbnQzMl90KiB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFNlY3Rpb24gJyVzJyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHNlY3Rpb24uc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgbmFtZUluZGV4ID0gbVJldmVyc2VNYXBwaW5nW2luZGV4XS0+aW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAobmFtZUluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFRhZyBuYW1lICclcycgZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCBuYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodGFnICE9IE5VTEwpIHsKKyAgICAgICAgKnRhZyA9IG1SZXZlcnNlTWFwcGluZ1tpbmRleF0tPnZhbHVlQXQobmFtZUluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKKworICAgIHNpemVfdCBzaXplID0gbVRhZ1RvTmFtZU1hcC5zaXplKCk7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiJSpzRHVtcGluZyBjb25maWd1cmVkIHZlbmRvciB0YWcgZGVzY3JpcHRvcnM6IE5vbmUgc2V0XG4iLAorICAgICAgICAgICAgICAgIGluZGVudGF0aW9uLCAiIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkcHJpbnRmKGZkLCAiJSpzRHVtcGluZyBjb25maWd1cmVkIHZlbmRvciB0YWcgZGVzY3JpcHRvcnM6ICV6dSBlbnRyaWVzXG4iLAorICAgICAgICAgICAgaW5kZW50YXRpb24sICIiLCBzaXplKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSAgbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKworICAgICAgICBpZiAodmVyYm9zaXR5IDwgMSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiUqczB4JXhcbiIsIGluZGVudGF0aW9uICsgMiwgIiIsIHRhZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IG5hbWUgPSBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaSk7CisgICAgICAgIHVpbnQzMl90IHNlY3Rpb25JZCA9IG1UYWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uTmFtZSA9IG1TZWN0aW9uc1tzZWN0aW9uSWRdOworICAgICAgICBpbnQgdHlwZSA9IG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKKyAgICAgICAgY29uc3QgY2hhciogdHlwZU5hbWUgPSAodHlwZSA+PSAwICYmIHR5cGUgPCBOVU1fVFlQRVMpID8KKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdHlwZV9uYW1lc1t0eXBlXSA6ICJVTktOT1dOIjsKKyAgICAgICAgZHByaW50ZihmZCwgIiUqczB4JXggKCVzKSB3aXRoIHR5cGUgJWQgKCVzKSBkZWZpbmVkIGluIHNlY3Rpb24gJXNcbiIsIGluZGVudGF0aW9uICsgMiwKKyAgICAgICAgICAgICIiLCB0YWcsIG5hbWUuc3RyaW5nKCksIHR5cGUsIHR5cGVOYW1lLCBzZWN0aW9uTmFtZS5zdHJpbmcoKSk7CisgICAgfQorCit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcihjb25zdCBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPSBkZXNjOworCisgICAgdmVuZG9yX3RhZ19vcHNfdCogb3BzUHRyID0gTlVMTDsKKyAgICBpZiAoZGVzYyAhPSBOVUxMKSB7CisgICAgICAgIG9wc1B0ciA9ICYoZGVzYy0+bVZlbmRvck9wcyk7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ19jb3VudCA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX2NvdW50OworICAgICAgICBvcHNQdHItPmdldF9hbGxfdGFncyA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfYWxsX3RhZ3M7CisgICAgICAgIG9wc1B0ci0+Z2V0X3NlY3Rpb25fbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lOworICAgICAgICBvcHNQdHItPmdldF90YWdfbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX25hbWU7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ190eXBlID0gdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZTsKKyAgICB9CisgICAgaWYoKHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX29wcyhvcHNQdHIpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBzZXQgdmVuZG9yIHRhZyBkZXNjcmlwdG9yLCByZWNlaXZlZCBlcnJvciAlcyAoJWQpLiIKKyAgICAgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3Jfb3BzKE5VTEwpOworICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLmNsZWFyKCk7Cit9CisKK3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICByZXR1cm4gc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit9CisKK2V4dGVybiAiQyIgeworCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogLyp2Ki8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19DT1VOVF9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnQ291bnQoKTsKK30KKwordm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qdiovLCB1aW50MzJfdCogdGFnQXJyYXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLT5nZXRUYWdBcnJheSh0YWdBcnJheSk7Cit9CisKK2NvbnN0IGNoYXIqIHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qdiovLCB1aW50MzJfdCB0YWcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0U2VjdGlvbk5hbWUodGFnKTsKK30KKworY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfbmFtZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLywgdWludDMyX3QgdGFnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnTmFtZSh0YWcpOworfQorCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLywgdWludDMyX3QgdGFnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfVFlQRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnVHlwZSh0YWcpOworfQorCit9IC8qIGV4dGVybiAiQyIgKi8KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKaW5kZXggNjEzMzU4YS4uNGNjN2I1ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ2LDEyICs0NywxNCBAQAogICAgIHsKICAgICB9CiAKLSAgICB2b2lkIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSkKKyAgICB2b2lkIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKQogICAgIHsKICAgICAgICAgQUxPR1YoIm9uRGV2aWNlRXJyb3IiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVycm9yQ29kZSkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7IC8vIHRvIG1hcmsgcHJlc2VuY2Ugb2YgQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QKKyAgICAgICAgcmVzdWx0RXh0cmFzLndyaXRlVG9QYXJjZWwoJmRhdGEpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0FNRVJBX0VSUk9SLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICAgICAgZGF0YS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtNjUsMjUgKzY4LDI4IEBACiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KIAotICAgIHZvaWQgb25DYXB0dXJlU3RhcnRlZChpbnQzMl90IHJlcXVlc3RJZCwgaW50NjRfdCB0aW1lc3RhbXApCisgICAgdm9pZCBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdCwgaW50NjRfdCB0aW1lc3RhbXApCiAgICAgewogICAgICAgICBBTE9HVigib25DYXB0dXJlU3RhcnRlZCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocmVxdWVzdElkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHRFeHRyYXMgb2JqZWN0CisgICAgICAgIHJlc3VsdC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDQVBUVVJFX1NUQVJURUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgICAgICBkYXRhLndyaXRlTm9FeGNlcHRpb24oKTsKICAgICB9CiAKIAotICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCkgeworICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcXVlc3RJZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsgLy8gdG8gbWFyayBwcmVzZW5jZSBvZiBtZXRhZGF0YSBvYmplY3QKLSAgICAgICAgcmVzdWx0LndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBtZXRhZGF0YS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHQgb2JqZWN0CisgICAgICAgIHJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFU1VMVF9SRUNFSVZFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KQEAgLTEwNCw3ICsxMTAsMTMgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhRXJyb3JDb2RlPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIG9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5yZWFkRnJvbVBhcmNlbChjb25zdF9jYXN0PFBhcmNlbCo+KCZkYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJObyBDYXB0dXJlUmVzdWx0RXh0cmFzIG9iamVjdCBpcyBwcmVzZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25EZXZpY2VFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICBkYXRhLnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xMTgsMjMgKzEzMCwzMyBAQAogICAgICAgICBjYXNlIENBUFRVUkVfU1RBUlRFRDogewogICAgICAgICAgICAgQUxPR1YoIm9uQ2FwdHVyZVN0YXJ0ZWQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdDsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTm8gQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QgaXMgcHJlc2VudCBpbiByZXN1bHQhIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKHJlcXVlc3RJZCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQocmVzdWx0LCB0aW1lc3RhbXApOwogICAgICAgICAgICAgZGF0YS5yZWFkRXhjZXB0aW9uQ29kZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFJFU1VMVF9SRUNFSVZFRDogewogICAgICAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXN1bHQ7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlYWRGcm9tUGFyY2VsKGNvbnN0X2Nhc3Q8UGFyY2VsKj4oJmRhdGEpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIk5vIG1ldGFkYXRhIG9iamVjdCBpcyBwcmVzZW50IGluIHJlc3VsdCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChyZXF1ZXN0SWQsIHJlc3VsdCk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTm8gY2FwdHVyZSByZXN1bHQgZXh0cmFzIG9iamVjdCBpcyBwcmVzZW50IGluIHJlc3VsdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChtZXRhZGF0YSwgcmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIGRhdGEucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcAppbmRleCAxZTU4MjJmLi5mZjRhMGMyIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuY3BwCkBAIC0zNSw3ICszNSwxMCBAQAogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU1VCTUlUX1JFUVVFU1QsCisgICAgU1VCTUlUX1JFUVVFU1RfTElTVCwKICAgICBDQU5DRUxfUkVRVUVTVCwKKyAgICBCRUdJTl9DT05GSUdVUkUsCisgICAgRU5EX0NPTkZJR1VSRSwKICAgICBERUxFVEVfU1RSRUFNLAogICAgIENSRUFURV9TVFJFQU0sCiAgICAgQ1JFQVRFX0RFRkFVTFRfUkVRVUVTVCwKQEAgLTc1LDcgKzc4LDggQEAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGludCBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LCBib29sIHN0cmVhbWluZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC04OSwxNSArOTMsNjcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1pbmcpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVwZWF0aW5nKTsKIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1QsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBzdGF0dXNfdCByZXNGcmFtZU51bWJlciA9IEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc0ZyYW1lTnVtYmVyID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWlmICgocmVzICE9IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisgICAgICAgICAgICByZXMgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3QsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyZXF1ZXN0TGlzdC5zaXplKCkpOworCisgICAgICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0TGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IHJlcXVlc3RMaXN0LmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9ICppdDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPndyaXRlVG9QYXJjZWwoJmRhdGEpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVwZWF0aW5nKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1RfTElTVCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBzdGF0dXNfdCByZXNGcmFtZU51bWJlciA9IEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc0ZyYW1lTnVtYmVyID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTEwNiw2ICsxNjIsMzcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENBTkNFTF9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYmVnaW5Db25maWd1cmUoKQorICAgIHsKKyAgICAgICAgQUxPR1YoImJlZ2luQ29uZmlndXJlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQkVHSU5fQ09ORklHVVJFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmRDb25maWd1cmUoKQorICAgIHsKKyAgICAgICAgQUxPR1YoImVuZENvbmZpZ3VyZSIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVORF9DT05GSUdVUkUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTE5NywxNCArMjg0LDI1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKICAgICB7CiAgICAgICAgIEFMT0dWKCJmbHVzaCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZMVVNILCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogcHJpdmF0ZToKQEAgLTIzOSwxMSArMzM3LDQzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIHJlcGVhdGluZyA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIC8vIHJldHVybiBjb2RlOiByZXF1ZXN0SWQgKGludDMyKQogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgc3RyZWFtaW5nKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VibWl0UmVxdWVzdChyZXF1ZXN0LCByZXBlYXRpbmcsICZsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVQk1JVF9SRVFVRVNUX0xJU1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0OworICAgICAgICAgICAgaW50IHJlcXVlc3RMaXN0U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RMaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IG5ldyBDYXB0dXJlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC0+cmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkEgcmVxdWVzdCBpcyBtaXNzaW5nLiBTZW5kaW5nIGluIG51bGwgcmVxdWVzdC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgcmVwZWF0aW5nLCAmbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGxhc3RGcmFtZU51bWJlcik7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTI1MSw3ICszODEsMTAgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2FuY2VsUmVxdWVzdChyZXF1ZXN0SWQpKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERFTEVURV9TVFJFQU06IHsKQEAgLTMzOSw5ICs0NzIsMjQgQEAKICAgICAgICAgY2FzZSBGTFVTSDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFEZXZpY2VVc2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgQkVHSU5fQ09ORklHVVJFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihiZWdpbkNvbmZpZ3VyZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFTkRfQ09ORklHVVJFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmRDb25maWd1cmUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZWMxMzkxMS4uNjEzODVlNSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTEsOSArMSwyNCBAQAorIyBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJbWFpbi5jcHAgXAogCVByb0NhbWVyYVRlc3RzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1dGlscyBcCkBAIC0yNiw2ICs0MSw4IEBACiAJZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCiAJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKIAlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvY2FtZXJhL3Rlc3RzIFwKIAlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKIAlmcmFtZXdvcmtzL2F2L2luY2x1ZGUvY2FtZXJhIFwKIAlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL1ZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzIgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX3Rlc3RzX2Zha2VfdmVuZG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworZW51bSB7CisgICAgQkFEX1RBR19BUlJBWSA9IDB4REVBREJFRUZ1LAorICAgIEJBRF9UQUcgPSAweDhERUFEQkFEdSwKK307CisKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAgICAgIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKworc3RhdGljIGJvb2wgQ29udGFpbnNUYWcodWludDMyX3QqIHRhZ0FycmF5LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgdGFnKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgaWYgKHRhZyA9PSB0YWdBcnJheVtpXSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2RlZmluZSBFWFBFQ1RfQ09OVEFJTlNfVEFHKHQsIGEpIFwKKyAgICBFWFBFQ1RfVFJVRShDb250YWluc1RhZyhhLCBBUlJBWV9TSVpFKGEpLCB0KSkKKworI2RlZmluZSBBU1NFUlRfTk9UX05VTEwoeCkgXAorICAgIEFTU0VSVF9UUlVFKCh4KSAhPSBOVUxMKQorCitleHRlcm4gIkMiIHsKKworc3RhdGljIGludCBkZWZhdWx0X2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcykgeworICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9nZXRfYWxsX3RhZ3MoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QqIHRhZ0FycmF5KSB7CisgICAgLy9Ob29wCit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWZhdWx0X2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9TRUNUSU9OX05BTUVfRVJSOworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVmYXVsdF9nZXRfdGFnX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9UQUdfVFlQRV9FUlI7Cit9CisKK30gLypleHRlcm4gIkMiKi8KKworLy8gU2V0IGRlZmF1bHQgdmVuZG9yIG9wZXJhdGlvbnMgZm9yIGEgdmVuZG9yX3RhZ19vcHMgc3RydWN0CitzdGF0aWMgdm9pZCBGaWxsV2l0aERlZmF1bHRzKHZlbmRvcl90YWdfb3BzX3QqIHZPcHMpIHsKKyAgICBBU1NFUlRfTk9UX05VTEwodk9wcyk7CisgICAgdk9wcy0+Z2V0X3RhZ19jb3VudCA9IGRlZmF1bHRfZ2V0X3RhZ19jb3VudDsKKyAgICB2T3BzLT5nZXRfYWxsX3RhZ3MgPSBkZWZhdWx0X2dldF9hbGxfdGFnczsKKyAgICB2T3BzLT5nZXRfc2VjdGlvbl9uYW1lID0gZGVmYXVsdF9nZXRfc2VjdGlvbl9uYW1lOworICAgIHZPcHMtPmdldF90YWdfbmFtZSA9IGRlZmF1bHRfZ2V0X3RhZ19uYW1lOworICAgIHZPcHMtPmdldF90YWdfdHlwZSA9IGRlZmF1bHRfZ2V0X3RhZ190eXBlOworfQorCisvKioKKyAqIFRlc3QgaWYgdmFsdWVzIGZyb20gVmVuZG9yVGFnRGVzY3JpcHRvciBtZXRob2RzIG1hdGNoIGNvcnJlc3BvbmRpbmcgdmFsdWVzCisgKiBmcm9tIHZlbmRvcl90YWdfb3BzIGZ1bmN0aW9ucy4KKyAqLworVEVTVChWZW5kb3JUYWdEZXNjcmlwdG9yVGVzdCwgQ29uc2lzdGVudFdpdGhWZW5kb3JUYWdzKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdkRlc2M7CisgICAgY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqdk9wcyA9ICZmYWtldmVuZG9yX29wczsKKyAgICBFWFBFQ1RfRVEoT0ssIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKHZPcHMsIC8qb3V0Ki92RGVzYykpOworCisgICAgQVNTRVJUX05PVF9OVUxMKHZEZXNjKTsKKworICAgIC8vIEVuc3VyZSByZWFzb25hYmxlIHRhZyBjb3VudAorICAgIGludCB0YWdDb3VudCA9IHZEZXNjLT5nZXRUYWdDb3VudCgpOworICAgIEVYUEVDVF9FUSh0YWdDb3VudCwgdk9wcy0+Z2V0X3RhZ19jb3VudCh2T3BzKSk7CisKKyAgICB1aW50MzJfdCBkZXNjVGFnQXJyYXlbdGFnQ291bnRdOworICAgIHVpbnQzMl90IG9wc1RhZ0FycmF5W3RhZ0NvdW50XTsKKworICAgIC8vIEdldCBhbGwgdGFnIGlkcworICAgIHZEZXNjLT5nZXRUYWdBcnJheShkZXNjVGFnQXJyYXkpOworICAgIHZPcHMtPmdldF9hbGxfdGFncyh2T3BzLCBvcHNUYWdBcnJheSk7CisKKyAgICBBU1NFUlRfTk9UX05VTEwoZGVzY1RhZ0FycmF5KTsKKyAgICBBU1NFUlRfTk9UX05VTEwob3BzVGFnQXJyYXkpOworCisgICAgdWludDMyX3QgdGFnOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnQ291bnQ7ICsraSkgeworICAgICAgICAvLyBGb3IgZWFjaCB0YWcgaWQsIGNoZWNrIHdoZXRoZXIgdHlwZSwgc2VjdGlvbiBuYW1lLCB0YWcgbmFtZSBtYXRjaAorICAgICAgICB0YWcgPSBkZXNjVGFnQXJyYXlbaV07CisgICAgICAgIEVYUEVDVF9DT05UQUlOU19UQUcodGFnLCBvcHNUYWdBcnJheSk7CisgICAgICAgIEVYUEVDVF9FUSh2RGVzYy0+Z2V0VGFnVHlwZSh0YWcpLCB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzYy0+Z2V0U2VjdGlvbk5hbWUodGFnKSwgdk9wcy0+Z2V0X3NlY3Rpb25fbmFtZSh2T3BzLCB0YWcpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKHZEZXNjLT5nZXRUYWdOYW1lKHRhZyksIHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpKTsKKyAgICB9Cit9CisKKy8qKgorICogVGVzdCBpZiB2YWx1ZXMgZnJvbSBWZW5kb3JUYWdEZXNjcmlwdG9yIG1ldGhvZHMgc3RheSBjb25zaXN0ZW50IGFmdGVyIGJlaW5nCisgKiBwYXJjZWxsZWQvdW5wYXJjZWxsZWQuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIENvbnNpc3RlbnRBY3Jvc3NQYXJjZWwpIHsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiB2RGVzY09yaWdpbmFsLCB2RGVzY1BhcmNlbGVkOworICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKnZPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcyh2T3BzLCAvKm91dCovdkRlc2NPcmlnaW5hbCkpOworCisgICAgQVNTRVJUX1RSVUUodkRlc2NPcmlnaW5hbCAhPSBOVUxMKTsKKworICAgIFBhcmNlbCBwOworCisgICAgLy8gQ2hlY2sgd2hldGhlciBwYXJjZWwgcmVhZC93cml0ZSBzdWNjZWVkCisgICAgRVhQRUNUX0VRKE9LLCB2RGVzY09yaWdpbmFsLT53cml0ZVRvUGFyY2VsKCZwKSk7CisgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVGcm9tUGFyY2VsKCZwLCB2RGVzY1BhcmNlbGVkKSk7CisKKyAgICAvLyBFbnN1cmUgY29uc2lzdGVudCB0YWcgY291bnQKKyAgICBpbnQgdGFnQ291bnQgPSB2RGVzY09yaWdpbmFsLT5nZXRUYWdDb3VudCgpOworICAgIEFTU0VSVF9FUSh0YWdDb3VudCwgdkRlc2NQYXJjZWxlZC0+Z2V0VGFnQ291bnQoKSk7CisKKyAgICB1aW50MzJfdCBkZXNjVGFnQXJyYXlbdGFnQ291bnRdOworICAgIHVpbnQzMl90IGRlc2MyVGFnQXJyYXlbdGFnQ291bnRdOworCisgICAgLy8gR2V0IGFsbCB0YWcgaWRzCisgICAgdkRlc2NPcmlnaW5hbC0+Z2V0VGFnQXJyYXkoZGVzY1RhZ0FycmF5KTsKKyAgICB2RGVzY1BhcmNlbGVkLT5nZXRUYWdBcnJheShkZXNjMlRhZ0FycmF5KTsKKworICAgIEFTU0VSVF9OT1RfTlVMTChkZXNjVGFnQXJyYXkpOworICAgIEFTU0VSVF9OT1RfTlVMTChkZXNjMlRhZ0FycmF5KTsKKworICAgIHVpbnQzMl90IHRhZzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyArK2kpIHsKKyAgICAgICAgLy8gRm9yIGVhY2ggdGFnIGlkLCBjaGVjayBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSB0d28gdmVuZG9yIHRhZworICAgICAgICAvLyBkZXNjcmlwdG9ycyBmb3IgZWFjaCB0eXBlLCBzZWN0aW9uIG5hbWUsIHRhZyBuYW1lCisgICAgICAgIHRhZyA9IGRlc2NUYWdBcnJheVtpXTsKKyAgICAgICAgRVhQRUNUX0NPTlRBSU5TX1RBRyh0YWcsIGRlc2MyVGFnQXJyYXkpOworICAgICAgICBFWFBFQ1RfRVEodkRlc2NPcmlnaW5hbC0+Z2V0VGFnVHlwZSh0YWcpLCB2RGVzY1BhcmNlbGVkLT5nZXRUYWdUeXBlKHRhZykpOworICAgICAgICBFWFBFQ1RfU1RSRVEodkRlc2NPcmlnaW5hbC0+Z2V0U2VjdGlvbk5hbWUodGFnKSwgdkRlc2NQYXJjZWxlZC0+Z2V0U2VjdGlvbk5hbWUodGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzY09yaWdpbmFsLT5nZXRUYWdOYW1lKHRhZyksIHZEZXNjUGFyY2VsZWQtPmdldFRhZ05hbWUodGFnKSk7CisgICAgfQorfQorCisvKioKKyAqIFRlc3QgZGVmYXVsdHMgYW5kIGVycm9yIGNvbmRpdGlvbnMuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIEVycm9yQ29uZGl0aW9ucykgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZEZXNjOworICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wczsKKyAgICBGaWxsV2l0aERlZmF1bHRzKCZ2T3BzKTsKKworICAgIC8vIEVuc3VyZSBjcmVhdGUgZmFpbHMgd2hlbiB1c2luZyBudWxsIHZPcHMKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygvKnZPcHMqL05VTEwsIHZEZXNjKSk7CisKKyAgICAvLyBFbnN1cmUgY3JlYXRlIHdvcmtzIHdoZW4gdGhlcmUgYXJlIG5vIHZ0YWdzIGRlZmluZWQgaW4gYSB3ZWxsLWZvcm1lZCB2T3BzCisgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygmdk9wcywgdkRlc2MpKTsKKworICAgIC8vIEVuc3VyZSBkZWZhdWx0cyBhcmUgcmV0dXJuZWQgd2hlbiBubyB2dGFncyBhcmUgZGVmaW5lZCwgb3IgdGFnIGlzIHVua25vd24KKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19DT1VOVF9FUlIsIHZEZXNjLT5nZXRUYWdDb3VudCgpKTsKKyAgICB1aW50MzJfdCogdGFnQXJyYXkgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oQkFEX1RBR19BUlJBWSk7CisgICAgdWludDMyX3QqIHRlc3RBcnJheSA9IHRhZ0FycmF5OworICAgIHZEZXNjLT5nZXRUYWdBcnJheSh0YWdBcnJheSk7CisgICAgRVhQRUNUX0VRKHRlc3RBcnJheSwgdGFnQXJyYXkpOworICAgIEVYUEVDVF9FUShWRU5ET1JfU0VDVElPTl9OQU1FX0VSUiwgdkRlc2MtPmdldFNlY3Rpb25OYW1lKEJBRF9UQUcpKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19OQU1FX0VSUiwgdkRlc2MtPmdldFRhZ05hbWUoQkFEX1RBRykpOworICAgIEVYUEVDVF9FUShWRU5ET1JfVEFHX1RZUEVfRVJSLCB2RGVzYy0+Z2V0VGFnVHlwZShCQURfVEFHKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgZ2xvYmFsIGNhbiBiZSBzZXQvY2xlYXJlZAorICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKmZha2VPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gcHJldkdsb2JhbCA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgIEVYUEVDVF9UUlVFKFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSA9PSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoT0ssIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcih2RGVzYykpOworICAgIEVYUEVDVF9UUlVFKFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSAhPSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1NFQ1RJT05fTkFNRV9FUlIsIHZEZXNjLT5nZXRTZWN0aW9uTmFtZShCQURfVEFHKSk7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IocHJldkdsb2JhbCkpOworICAgIEVYUEVDVF9FUShwcmV2R2xvYmFsLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkpOworfQorCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAKaW5kZXggNmMzNzUwMS4uMDNlMDA2MiAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmNwcApAQCAtNjcsOSArNjcsMTEgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKC8qbmV3IEdyYXBoaWNCdWZmZXJBbGxvYygpKi8pOwotICAgIG1HbENvbnN1bWVyID0gbmV3IEdMQ29uc3VtZXIobUJ1ZmZlclF1ZXVlLCBtRXh0VGV4dHVyZU5hbWUsCi0gICAgICAgICAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihjb25zdW1lciwgbUV4dFRleHR1cmVOYW1lLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB0cnVlLCBmYWxzZSk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOwpAQCAtNzksNyArODEsNyBAQAogCiAgICAgbVBpeGVsQnVmID0gbmV3IHVpbnQ4X3Rbd2lkdGggKiBoZWlnaHQgKiBrR2xCeXRlc1BlclBpeGVsXTsKIAotICAgICpwQnVmZmVyUHJvZHVjZXIgPSBtQnVmZmVyUXVldWU7CisgICAgKnBCdWZmZXJQcm9kdWNlciA9IHByb2R1Y2VyOwogCiAgICAgQUxPR0QoIkZyYW1lT3V0cHV0OjpjcmVhdGVJbnB1dFN1cmZhY2UgT0siKTsKICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oIGIvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuaAppbmRleCA0YWMzZThhLi5jNDllYzNiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmgKQEAgLTM0LDkgKzM0LDYgQEAKICAgICAgICAgbUV4dFRleHR1cmVOYW1lKDApLAogICAgICAgICBtUGl4ZWxCdWYoTlVMTCkKICAgICAgICAge30KLSAgICB2aXJ0dWFsIH5GcmFtZU91dHB1dCgpIHsKLSAgICAgICAgZGVsZXRlW10gbVBpeGVsQnVmOwotICAgIH0KIAogICAgIC8vIENyZWF0ZSBhbiAiaW5wdXQgc3VyZmFjZSIsIHNpbWlsYXIgaW4gcHVycG9zZSB0byBhIE1lZGlhQ29kZWMgaW5wdXQKICAgICAvLyBzdXJmYWNlLCB0aGF0IHRoZSB2aXJ0dWFsIGRpc3BsYXkgY2FuIHNlbmQgYnVmZmVycyB0by4gIEFsc28gY29uZmlndXJlcwpAQCAtNTksNiArNTYsMTEgQEAKICAgICBGcmFtZU91dHB1dChjb25zdCBGcmFtZU91dHB1dCYpOwogICAgIEZyYW1lT3V0cHV0JiBvcGVyYXRvcj0oY29uc3QgRnJhbWVPdXRwdXQmKTsKIAorICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfkZyYW1lT3V0cHV0KCkgeworICAgICAgICBkZWxldGVbXSBtUGl4ZWxCdWY7CisgICAgfQorCiAgICAgLy8gKG92ZXJyaWRlcyBHTENvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIG1ldGhvZCkKICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOwogCkBAIC03NSwxMCArNzcsNiBAQAogICAgIC8vIFNldCBieSB0aGUgRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBjYWxsYmFjay4KICAgICBib29sIG1GcmFtZUF2YWlsYWJsZTsKIAotICAgIC8vIE91ciBxdWV1ZS4gIFRoZSBwcm9kdWNlciBzaWRlIGlzIHBhc3NlZCB0byB0aGUgdmlydHVhbCBkaXNwbGF5LCB0aGUKLSAgICAvLyBjb25zdW1lciBzaWRlIGZlZWRzIGludG8gb3VyIEdMQ29uc3VtZXIuCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKLQogICAgIC8vIFRoaXMgcmVjZWl2ZXMgZnJhbWVzIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhbmQgbWFrZXMgdGhlbSBhdmFpbGFibGUKICAgICAvLyBhcyBhbiBleHRlcm5hbCB0ZXh0dXJlLgogICAgIHNwPEdMQ29uc3VtZXI+IG1HbENvbnN1bWVyOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAppbmRleCA5NmUyNWI4Li43ZmVmNTNkIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCiAjZGVmaW5lIExPR19UQUcgIlNjcmVlblJlY29yZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDkgKzMxLDYgQEAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCiAjaW5jbHVkZSAic2NyZWVucmVjb3JkLmgiCiAjaW5jbHVkZSAiT3ZlcmxheS5oIgogI2luY2x1ZGUgIlRleHRSZW5kZXJlci5oIgpAQCAtNDcsNyArNDgsNyBAQAogICAgICAgICAicm8ucmV2aXNpb24iLAogICAgICAgICAiZGFsdmlrLnZtLmhlYXBncm93dGhsaW1pdCIsCiAgICAgICAgICJkYWx2aWsudm0uaGVhcHNpemUiLAotICAgICAgICAicGVyc2lzdC5zeXMuZGFsdmlrLnZtLmxpYiIsCisgICAgICAgICJwZXJzaXN0LnN5cy5kYWx2aWsudm0ubGliLjIiLAogICAgICAgICAvLyJyby5wcm9kdWN0LmNwdS5hYmkiLAogICAgICAgICAvLyJyby5ib290bG9hZGVyIiwKICAgICAgICAgLy8idGhpcy1uZXZlci1hcHBlYXJzISIsCkBAIC04NCw3ICs4NSw3IEBACiAgICAgYXNzZXJ0KG1TdGF0ZSA9PSBSVU5OSU5HKTsKIAogICAgIEFMT0dWKCJPdmVybGF5OjpzdGFydCBzdWNjZXNzZnVsIik7Ci0gICAgKnBCdWZmZXJQcm9kdWNlciA9IG1CdWZmZXJRdWV1ZTsKKyAgICAqcEJ1ZmZlclByb2R1Y2VyID0gbVByb2R1Y2VyOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTY5LDkgKzE3MCwxMCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtQnVmZmVyUXVldWUgPSBuZXcgQnVmZmVyUXVldWUoLypuZXcgR3JhcGhpY0J1ZmZlckFsbG9jKCkqLyk7Ci0gICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihtQnVmZmVyUXVldWUsIG1FeHRUZXh0dXJlTmFtZSwKLSAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihjb25zdW1lciwgbUV4dFRleHR1cmVOYW1lLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB0cnVlLCBmYWxzZSk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOwpAQCAtMTg3LDcgKzE4OSw3IEBACiAgICAgQUxPR1YoIk92ZXJsYXk6OnJlbGVhc2VfbCIpOwogICAgIG1PdXRwdXRTdXJmYWNlLmNsZWFyKCk7CiAgICAgbUdsQ29uc3VtZXIuY2xlYXIoKTsKLSAgICBtQnVmZmVyUXVldWUuY2xlYXIoKTsKKyAgICBtUHJvZHVjZXIuY2xlYXIoKTsKIAogICAgIG1UZXhQcm9ncmFtLnJlbGVhc2UoKTsKICAgICBtRXh0VGV4UHJvZ3JhbS5yZWxlYXNlKCk7CkBAIC0yMzQsNyArMjM2LDcgQEAKIAogICAgIGNoYXIgdGV4dEJ1Zls2NF07CiAgICAgZ2V0VGltZVN0cmluZ19sKG1vbm90b25pY05zZWMsIHRleHRCdWYsIHNpemVvZih0ZXh0QnVmKSk7Ci0gICAgU3RyaW5nOCB0aW1lU3RyKFN0cmluZzg6OmZvcm1hdCgiJXMgZj0lbGxkICglemQpIiwKKyAgICBTdHJpbmc4IHRpbWVTdHIoU3RyaW5nODo6Zm9ybWF0KCIlcyBmPSUiIFBSSWQ2NCAiICglemQpIiwKICAgICAgICAgICAgIHRleHRCdWYsIGZyYW1lTnVtYmVyLCBtVG90YWxEcm9wcGVkRnJhbWVzKSk7CiAgICAgbVRleHRSZW5kZXJlci5kcmF3U3RyaW5nKG1UZXhQcm9ncmFtLCBQcm9ncmFtOjprSWRlbnRpdHksIDAsIDAsIHRpbWVTdHIpOwogCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmggYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmgKaW5kZXggYjg0NzNiNC4uYjFiNWMyOSAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5oCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuaApAQCAtNDcsNyArNDcsNiBAQAogICAgICAgICBtTGFzdEZyYW1lTnVtYmVyKC0xKSwKICAgICAgICAgbVRvdGFsRHJvcHBlZEZyYW1lcygwKQogICAgICAgICB7fQotICAgIHZpcnR1YWwgfk92ZXJsYXkoKSB7IGFzc2VydChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gU1RPUFBFRCk7IH0KIAogICAgIC8vIENyZWF0ZXMgYSB0aHJlYWQgdGhhdCBwZXJmb3JtcyB0aGUgb3ZlcmxheS4gIFBhc3MgaW4gdGhlIHN1cmZhY2UgdGhhdAogICAgIC8vIG91dHB1dCB3aWxsIGJlIHNlbnQgdG8uCkBAIC03MSw2ICs3MCw5IEBACiAgICAgT3ZlcmxheShjb25zdCBPdmVybGF5Jik7CiAgICAgT3ZlcmxheSYgb3BlcmF0b3I9KGNvbnN0IE92ZXJsYXkmKTsKIAorICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfk92ZXJsYXkoKSB7IGFzc2VydChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gU1RPUFBFRCk7IH0KKwogICAgIC8vIERyYXcgdGhlIGluaXRpYWwgaW5mbyBzY3JlZW4uCiAgICAgc3RhdGljIHZvaWQgZG9EcmF3SW5mb1BhZ2UoY29uc3QgRWdsV2luZG93JiB3aW5kb3csCiAgICAgICAgICAgICBjb25zdCBQcm9ncmFtJiB0ZXhSZW5kZXIsIFRleHRSZW5kZXJlciYgdGV4dFJlbmRlcmVyKTsKQEAgLTEyMCw5ICsxMjIsOSBAQAogICAgIC8vIHN1cmZhY2UuCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbU91dHB1dFN1cmZhY2U7CiAKLSAgICAvLyBPdXIgcXVldWUuICBUaGUgcHJvZHVjZXIgc2lkZSBpcyBwYXNzZWQgdG8gdGhlIHZpcnR1YWwgZGlzcGxheSwgdGhlCi0gICAgLy8gY29uc3VtZXIgc2lkZSBmZWVkcyBpbnRvIG91ciBHTENvbnN1bWVyLgotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgLy8gUHJvZHVjZXIgc2lkZSBvZiBxdWV1ZSwgcGFzc2VkIGludG8gdGhlIHZpcnR1YWwgZGlzcGxheS4KKyAgICAvLyBUaGUgY29uc3VtZXIgZW5kIGZlZWRzIGludG8gb3VyIEdMQ29uc3VtZXIuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogCiAgICAgLy8gVGhpcyByZWNlaXZlcyBmcmFtZXMgZnJvbSB0aGUgdmlydHVhbCBkaXNwbGF5IGFuZCBtYWtlcyB0aGVtIGF2YWlsYWJsZQogICAgIC8vIGFzIGFuIGV4dGVybmFsIHRleHR1cmUuCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvVGV4dFJlbmRlcmVyLmNwcAppbmRleCA3ODQwNTVjLi42YTkxNzZiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL1RleHRSZW5kZXJlci5jcHAKQEAgLTM1Myw2ICszNTMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImdvb2RQb3M9JWQgZm9yIHN0cj0nJXMnIiwgZ29vZFBvcywgc3RyKTsKKyAgICBBTE9HVigiZ29vZFBvcz0lenUgZm9yIHN0cj0nJXMnIiwgZ29vZFBvcywgc3RyKTsKICAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyKj4oc3RyICsgZ29vZFBvcyk7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCAwMmVkNTNhLi4wMmRmMWQyIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTE0LDYgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogI2RlZmluZSBMT0dfVEFHICJTY3JlZW5SZWNvcmQiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMzYsMTggKzQ5LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KICNpbmNsdWRlICJzY3JlZW5yZWNvcmQuaCIKICNpbmNsdWRlICJPdmVybGF5LmgiCiAjaW5jbHVkZSAiRnJhbWVPdXRwdXQuaCIKQEAgLTM1NCw3ICszNTUsNyBAQAogICAgICAgICBjYXNlIE5PX0VSUk9SOgogICAgICAgICAgICAgLy8gZ290IGEgYnVmZmVyCiAgICAgICAgICAgICBpZiAoKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiR290IGNvZGVjIGNvbmZpZyBidWZmZXIgKCV1IGJ5dGVzKSIsIHNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJHb3QgY29kZWMgY29uZmlnIGJ1ZmZlciAoJXp1IGJ5dGVzKSIsIHNpemUpOwogICAgICAgICAgICAgICAgIGlmIChtdXhlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIC0tIHdlIHBhc3NlZCB0aGUgQ1NEIGludG8gTWVkaWFNdXhlciB3aGVuCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGdvdCB0aGUgZm9ybWF0IGNoYW5nZSBub3RpZmljYXRpb24KQEAgLTM2Miw3ICszNjMsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiR290IGRhdGEgaW4gYnVmZmVyICVkLCBzaXplPSVkLCBwdHM9JWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBkYXRhIGluIGJ1ZmZlciAlenUsIHNpemU9JXp1LCBwdHM9JSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXgsIHNpemUsIHB0c1VzZWMpOwogCiAgICAgICAgICAgICAgICAgeyAvLyBzY29wZQpAQCAtNDczLDcgKzQ3NCw3IEBACiAKICAgICBBTE9HVigiRW5jb2RlciBzdG9wcGluZyAocmVxPSVkKSIsIGdTdG9wUmVxdWVzdGVkKTsKICAgICBpZiAoZ1ZlcmJvc2UpIHsKLSAgICAgICAgcHJpbnRmKCJFbmNvZGVyIHN0b3BwaW5nOyByZWNvcmRlZCAldSBmcmFtZXMgaW4gJWxsZCBzZWNvbmRzXG4iLAorICAgICAgICBwcmludGYoIkVuY29kZXIgc3RvcHBpbmc7IHJlY29yZGVkICV1IGZyYW1lcyBpbiAlIiBQUklkNjQgIiBzZWNvbmRzXG4iLAogICAgICAgICAgICAgICAgIGRlYnVnTnVtRnJhbWVzLCBuYW5vc2Vjb25kc190b19zZWNvbmRzKAogICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRXaGVuTnNlYykpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcAppbmRleCA1ZDJkNzIxLi4xYjJmNzkyIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yNzUsNyArMjc2LDggQEAKIAogICAgIG1FeHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKIAotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobVBhdGguY19zdHIoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1QYXRoLmNfc3RyKCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRXh0cmFjdG9yLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcAppbmRleCAxNGI0MzA2Li41ODcwNzdhIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBzdGF0dXNfdCBTaW5lU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCBlZDdkNmNiLi45NjA3M2YxIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xLDQgKzEsMTggQEAKLSNpbmNsdWRlICJTaW5lU291cmNlLmgiCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CkBAIC0xMCw0MSArMjQsNzkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1pbnQgbWFpbigpIHsKLSAgICAvLyBXZSBvbmx5IGhhdmUgYW4gQU1SLVdCIGVuY29kZXIgb24gc2hvbGVzLi4uCi0gICAgc3RhdGljIGJvb2wgb3V0cHV0V0JBTVIgPSBmYWxzZTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1DaGFubmVscyA9IDE7CitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZCBkdXJhdGlvbl0gWy1tXSBbLXddIFs8b3V0cHV0LWZpbGU+XVxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJFbmNvZGVzIGVpdGhlciBhIHNpbmUgd2F2ZSBvciBtaWNyb3Bob25lIGlucHV0IHRvIEFNUiBmb3JtYXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1kICAgIGR1cmF0aW9uIGluIHNlY29uZHMsIGRlZmF1bHQgNSBzZWNvbmRzXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbSAgICB1c2UgbWljcm9waG9uZSBmb3IgaW5wdXQsIGRlZmF1bHQgc2luZSBzb3VyY2VcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC13ICAgIHVzZSBBTVIgd2lkZWJhbmQgKGRlZmF1bHQgbmFycm93YmFuZClcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxvdXRwdXQtZmlsZT4gb3V0cHV0IGZpbGUgZm9yIEFNUiBlbmNvZGluZywiCisgICAgICAgICAgICAiIGlmIHVuc3BlY2lmaWVkLCBkZWNvZGUgdG8gc3BlYWtlci5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgY2hhbm5lbHMgPSAxOyAvLyBub3QgcGVybWl0dGVkIHRvIGJlIHN0ZXJlbyBub3cKKyAgICB1bnNpZ25lZCBkdXJhdGlvbiA9IDU7CisgICAgYm9vbCB1c2VNaWMgPSBmYWxzZTsKKyAgICBib29sIG91dHB1dFdCQU1SID0gZmFsc2U7CisgICAgYm9vbCBwbGF5VG9TcGVha2VyID0gdHJ1ZTsKKyAgICBjb25zdCBjaGFyKiBmaWxlT3V0ID0gTlVMTDsKKyAgICBpbnQgY2g7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZDptdyIpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgZHVyYXRpb24gPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICB1c2VNaWMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgb3V0cHV0V0JBTVIgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIGZpbGVPdXQgPSBhcmd2WzBdOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGtTYW1wbGVSYXRlID0gb3V0cHV0V0JBTVIgPyAxNjAwMCA6IDgwMDA7CisgICAgY29uc3QgaW50MzJfdCBrQml0UmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOwogCiAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOworICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2U7CiAKLSNpZiAwCi0gICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG5ldyBTaW5lU291cmNlKGtTYW1wbGVSYXRlLCBrTnVtQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbmV3IEF1ZGlvU291cmNlKAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsCi0gICAgICAgICAgICBrU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGtOdW1DaGFubmVscykpOwotI2VuZGlmCisgICAgaWYgKHVzZU1pYykgeworICAgICAgICAvLyB0YWxrIGludG8gdGhlIGFwcHJvcHJpYXRlIG1pY3JvcGhvbmUgZm9yIHRoZSBkdXJhdGlvbgorICAgICAgICBzb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCisgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICBrU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVscyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdXNlIGEgc2luZSBzb3VyY2UgYXQgNTAwIGh6LgorICAgICAgICBzb3VyY2UgPSBuZXcgU2luZVNvdXJjZShrU2FtcGxlUmF0ZSwgY2hhbm5lbHMpOworICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCiAgICAgbWV0YS0+c2V0Q1N0cmluZygKICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKICAgICAgICAgICAgIG91dHB1dFdCQU1SID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKIAotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGtOdW1DaGFubmVscyk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbHMpOwogICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrU2FtcGxlUmF0ZSk7Ci0KKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwga0JpdFJhdGUpOwogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIGlmIChzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heElucHV0U2l6ZSkpIHsKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKQEAgLTU1LDQ3ICsxMDcsNDEgQEAKICAgICAgICAgICAgIG1ldGEsIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywKICAgICAgICAgICAgIHNvdXJjZSk7CiAKLSNpZiAxCi0gICAgc3A8QU1SV3JpdGVyPiB3cml0ZXIgPSBuZXcgQU1SV3JpdGVyKCIvc2RjYXJkL291dC5hbXIiKTsKLSAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKLSAgICB3cml0ZXItPnN0YXJ0KCk7Ci0gICAgc2xlZXAoMTApOwotICAgIHdyaXRlci0+c3RvcCgpOwotI2Vsc2UKLSAgICBzcDxNZWRpYVNvdXJjZT4gZGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgICAgICBtZXRhLCBmYWxzZSAvKiBjcmVhdGVFbmNvZGVyICovLAotICAgICAgICAgICAgZW5jb2Rlcik7CisgICAgaWYgKGZpbGVPdXQgIT0gTlVMTCkgeworICAgICAgICAvLyB0YXJnZXQgZmlsZSBzcGVjaWZpZWQsIHdyaXRlIGVuY29kZWQgQU1SIG91dHB1dAorICAgICAgICBzcDxBTVJXcml0ZXI+IHdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZmlsZU91dCk7CisgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOworICAgICAgICB3cml0ZXItPnN0YXJ0KCk7CisgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKKyAgICAgICAgd3JpdGVyLT5zdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGRlY29kZSB0byBzcGVha2VyCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCisgICAgICAgICAgICAgICAgbWV0YSwgZmFsc2UgLyogY3JlYXRlRW5jb2RlciAqLywKKyAgICAgICAgICAgICAgICBlbmNvZGVyKTsKIAotI2lmIDAKLSAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOwotICAgIHBsYXllci0+c2V0U291cmNlKGRlY29kZXIpOwotCi0gICAgcGxheWVyLT5zdGFydCgpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgcGxheWVyLT5zdG9wKCk7Ci0KLSAgICBkZWxldGUgcGxheWVyOwotICAgIHBsYXllciA9IE5VTEw7Ci0jZWxpZiAwCi0gICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKLSAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggYnVmZmVyCi0KLSAgICAgICAgcHV0Y2hhcignLicpOwotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKHBsYXlUb1NwZWFrZXIpIHsKKyAgICAgICAgICAgIEF1ZGlvUGxheWVyICpwbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIoTlVMTCk7CisgICAgICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShkZWNvZGVyKTsKKyAgICAgICAgICAgIHBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIHNvdXJjZS0+c3RvcCgpOyAvLyBtdXN0IHN0b3Agc291cmNlIG90aGVyd2lzZSBkZWxldGUgcGxheWVyIHdpbGwgaGFuZworICAgICAgICAgICAgZGVsZXRlIHBsYXllcjsgLy8gdGhlcmUgaXMgbm8gcGxheWVyLT5zdG9wKCkuLi4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyOworICAgICAgICAgICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCBidWZmZXIgKHNhdmUgaXQgZXZlbnR1YWxseT8pCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdG9wIGFmdGVyIHNvbWUgY291bnQgdGhvdWdoLi4uCisgICAgICAgICAgICAgICAgcHV0Y2hhcignLicpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7Ci0jZW5kaWYKLSNlbmRpZgotCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IGZkZmVmZGYuLmZkMDJiY2MgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiY29kZWMiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlNpbXBsZVBsYXllci5oIgpAQCAtMjMsNiArMjQsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC03NSw3ICs3Nyw3IEBACiAgICAgc3RhdGljIGludDY0X3Qga1RpbWVvdXQgPSA1MDBsbDsKIAogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0yOTEsMTMgKzI5MywxMyBAQAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIHN0YXRlLT5tQ29kZWMtPnJlbGVhc2UoKSk7CiAKICAgICAgICAgaWYgKHN0YXRlLT5tSXNBdWRpbykgewotICAgICAgICAgICAgcHJpbnRmKCJ0cmFjayAlZDogJWxsZCBieXRlcyByZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCisgICAgICAgICAgICBwcmludGYoInRyYWNrICV6dTogJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAogICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgKiAxRTYgLyAxMDI0IC8gZWxhcHNlZFRpbWVVcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoInRyYWNrICVkOiAlbGxkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKKyAgICAgICAgICAgIHByaW50ZigidHJhY2sgJXp1OiAlIiBQUklkNjQgIiBmcmFtZXMgZGVjb2RlZCwgJS4yZiBmcHMuICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKICAgICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tTnVtQnVmZmVyc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCAqIDFFNiAvIGVsYXBzZWRUaW1lVXMsCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCmluZGV4IGNjYTMzZTAuLmY0YTMzZTggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCkBAIC0xNiw5ICsxNiwxMSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIm11eGVyIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtNTgsNyArNjAsNyBAQAogICAgICAgICBpbnQgdHJpbUVuZFRpbWVNcywKICAgICAgICAgaW50IHJvdGF0aW9uRGVncmVlcykgewogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci4gJXNcbiIsIHBhdGgpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0xOTgsNyArMjAwLDcgQEAKICAgICB0cmFja0luZGV4TWFwLmNsZWFyKCk7CiAKICAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbXV4ZXJTdGFydFRpbWVVczsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNVQ0NFU1M6IG11eGVyIGdlbmVyYXRlIHRoZSB2aWRlbyBpbiAlbGxkIG1zXG4iLAorICAgIGZwcmludGYoc3RkZXJyLCAiU1VDQ0VTUzogbXV4ZXIgZ2VuZXJhdGUgdGhlIHZpZGVvIGluICUiIFBSSWQ2NCAiIG1zXG4iLAogICAgICAgICAgICAgZWxhcHNlZFRpbWVVcyAvIDEwMDApOwogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggYjdhNDBjMi4uZmRjMzUyZSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMjk2LDcgKzI5Niw3IEBACiB9CiAjZWxzZQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyICoqIC8qIGFyZ3YgKi8pIHsKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAppbmRleCBjMzBjMTIyLi45ZjU0N2M3IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgpAQCAtNzIsNyArNzMsNyBAQAogICAgICAgICByZXR1cm4gbWV0YTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgX191bnVzZWQpIHsKICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC04Miw3ICs4Myw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyBfX3VudXNlZCkgewogCiAgICAgICAgIGlmIChtTnVtRnJhbWVzT3V0cHV0ICUgMTAgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIuIik7CkBAIC05OSw4ICsxMDAsMTIgQEAKICAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgY29udGVudHMuIHdlIGp1c3QgdGVzdCB2aWRlbyBlbmNvZGVyCiAgICAgICAgIC8vIEFsc28sIGJ5IHNraXBwaW5nIHRoZSBjb250ZW50IGdlbmVyYXRpb24sIHdlIGNhbiByZXR1cm4gZnJvbQogICAgICAgICAvLyByZWFkKCkgbXVjaCBmYXN0ZXIuCi0gICAgICAgIC8vY2hhciB4ID0gKGNoYXIpKChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVggKiAyNTUpOwotICAgICAgICAvL21lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworI2lmIDAKKyAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHNvbGlkIHBsYW5lcyBvZiBjb2xvci4KKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgeCA9IDB4NjA7CisgICAgICAgIG1lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworICAgICAgICB4ID0geCA+PSAweGEwID8gMHg2MCA6IHggKyAxOworI2VuZGlmCiAgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKDAsIG1TaXplKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCkBAIC0xNjIsNyArMTY3LDcgQEAKICAgICBpbnQgbGV2ZWwgPSAtMTsgICAgICAgIC8vIEVuY29kZXIgc3BlY2lmaWMgZGVmYXVsdAogICAgIGludCBwcm9maWxlID0gLTE7ICAgICAgLy8gRW5jb2RlciBzcGVjaWZpYyBkZWZhdWx0CiAgICAgaW50IGNvZGVjID0gMDsKLSAgICBjaGFyICpmaWxlTmFtZSA9ICIvc2RjYXJkL291dHB1dC5tcDQiOworICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gIi9zZGNhcmQvb3V0cHV0Lm1wNCI7CiAgICAgYm9vbCBwcmVmZXJTb2Z0d2FyZUNvZGVjID0gZmFsc2U7CiAKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CkBAIC0zMTIsNyArMzE3LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZWNvcmQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb2RpbmcgJWQgZnJhbWVzIGluICVsbGQgdXNcbiIsIG5GcmFtZXMsIChlbmQtc3RhcnQpLzEwMDApOworICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb2RpbmcgJWQgZnJhbWVzIGluICUiIFBSSWQ2NCAiIHVzXG4iLCBuRnJhbWVzLCAoZW5kLXN0YXJ0KS8xMDAwKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgImVuY29kaW5nIHNwZWVkIGlzOiAlLjJmIGZwc1xuIiwgKG5GcmFtZXMgKiAxRTkpIC8gKGVuZC1zdGFydCkpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCmluZGV4IGM4MTc0NDMuLjBmNzI5YTMgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKQEAgLTE2LDEwICsxNiwxNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgInNmMiIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTQyLDYgKzQ3LDE4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCit2b2xhdGlsZSBzdGF0aWMgYm9vbCBjdHJsYyA9IGZhbHNlOworCitzdGF0aWMgc2lnaGFuZGxlcl90IG9sZGhhbmRsZXIgPSBOVUxMOworCitzdGF0aWMgdm9pZCBteXNpZ2hhbmRsZXIoaW50IHNpZ251bSkgeworICAgIGlmIChzaWdudW0gPT0gU0lHSU5UKSB7CisgICAgICAgIGN0cmxjID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvbGRoYW5kbGVyKHNpZ251bSk7Cit9CisKIHN0cnVjdCBDb250cm9sbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBDb250cm9sbGVyKGNvbnN0IGNoYXIgKnVyaSwgYm9vbCBkZWNvZGVBdWRpbywKICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLCBib29sIHJlbmRlclRvU3VyZmFjZSkKQEAgLTYyLDcgKzc5LDMwIEBACiAgICAgdmlydHVhbCB+Q29udHJvbGxlcigpIHsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnRTdGF0aXN0aWNzKCkgeworICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbVN0YXJ0VGltZVVzOworCisgICAgICAgIGlmIChtRGVjb2RlQXVkaW8pIHsKKyAgICAgICAgICAgIHByaW50ZigiJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJSIgUFJJZDY0ICIgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgbU51bU91dHB1dEJ1ZmZlcnNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaWYgKGN0cmxjKSB7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBwcmludFN0YXRpc3RpY3MoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIGN0cmxjID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgogICAgICAgICAgICAgewpAQCAtNzUsNyArMTE1LDggQEAKICNlbmRpZgogCiAgICAgICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBtVVJJLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9CiAgICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CkBAIC05OCw3ICsxMzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vICVzIHRyYWNrIGZvdW5kXG4iLCBtRGVjb2RlQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Tb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKQEAgLTE2Nyw0MiArMjExLDI4IEBACiAgICAgICAgICAgICAgICAgaW50MzJfdCB3aGF0OwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKIAotICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBvbkZpbGxUaGlzQnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBpZiAoKG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQrKyAlIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgb25EcmFpblRoaXNCdWZmZXIobXNnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEVPUwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpID8gIiRcbiIgOiAiRVxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRFT1MKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50Zigod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0RU9TKSA/ICIkXG4iIDogIkVcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtU3RhcnRUaW1lVXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWNvZGVBdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlbGxkIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCAqIDFFNiAvIDEwMjQgLyBkZWxheVVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgIHByaW50U3RhdGlzdGljcygpOwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtTdGF0ZSA9IFNFRUtfRkxVU0hfQ09NUExFVEVEOwogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKSktPnBvc3QoNTAwMDAwMGxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgICAgICBtRGVjb2RlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlTG9vcGVyICE9IGxvb3BlcigpKSB7CkBAIC0yMTAsMTIgKzI0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBsb29wZXIoKS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoInNvbWV0aGluZyB3ZW50IHdyb25nLCBjb2RlYyByZXBvcnRlZCBhbiBlcnJvci4iKTsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02MzgsNiArNjYyLDggQEAKIAogICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKGNvbnRyb2xsZXIpOwogCisgICAgc2lnbmFsKFNJR0lOVCwgbXlzaWdoYW5kbGVyKTsKKwogICAgIGNvbnRyb2xsZXItPnN0YXJ0QXN5bmMoKTsKIAogICAgIENIRUNLX0VRKGxvb3Blci0+c3RhcnQodHJ1ZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8pLCAoc3RhdHVzX3QpT0spOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMzBiZjFiLi44MWVkY2I0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMTQsMjAgKzE0LDIyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAic3RhZ2VmcmlnaHQiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQogI2luY2x1ZGUgImpwZWcuaCIKICNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCkBAIC00OSw4ICs1MSw2IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIAotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KICNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgpAQCAtODksOCArODksOCBAQAogICAgIGludDY0X3QgbWluVXMgPSBkZWNvZGVUaW1lc1VzLT5pdGVtQXQoMCk7CiAgICAgaW50NjRfdCBtYXhVcyA9IGRlY29kZVRpbWVzVXMtPml0ZW1BdChuIC0gMSk7CiAKLSAgICBwcmludGYoIm1pbiBkZWNvZGUgdGltZSAlbGxkIHVzICglLjJmIHNlY3MpXG4iLCBtaW5VcywgbWluVXMgLyAxRTYpOwotICAgIHByaW50ZigibWF4IGRlY29kZSB0aW1lICVsbGQgdXMgKCUuMmYgc2VjcylcbiIsIG1heFVzLCBtYXhVcyAvIDFFNik7CisgICAgcHJpbnRmKCJtaW4gZGVjb2RlIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsIG1pblVzLCBtaW5VcyAvIDFFNik7CisgICAgcHJpbnRmKCJtYXggZGVjb2RlIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsIG1heFVzLCBtYXhVcyAvIDFFNik7CiAKICAgICBzaXplX3QgY291bnRzWzEwMF07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7ICsraSkgewpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgIGludDY0X3Qgc2xvdFVzID0gbWluVXMgKyAoaSAqIChtYXhVcyAtIG1pblVzKSAvIDEwMCk7CiAKICAgICAgICAgZG91YmxlIGZwcyA9IDFFNiAvIHNsb3RVczsKLSAgICAgICAgcHJpbnRmKCJbJS4yZiBmcHNdOiAlZFxuIiwgZnBzLCBjb3VudHNbaV0pOworICAgICAgICBwcmludGYoIlslLjJmIGZwc106ICV6dVxuIiwgZnBzLCBjb3VudHNbaV0pOwogICAgIH0KIH0KIApAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBwcmludGYoImJ1ZmZlciBoYXMgdGltZXN0YW1wICVsbGQgdXMgKCUuMmYgc2VjcylcbiIsCisgICAgICAgICAgICAgICAgcHJpbnRmKCJidWZmZXIgaGFzIHRpbWVzdGFtcCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIHRpbWVzdGFtcFVzIC8gMUU2KTsKIAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyA9IChyYW5kKCkgKiAoZmxvYXQpZHVyYXRpb25VcykgLyBSQU5EX01BWDsKICAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzKTsKIAotICAgICAgICAgICAgICAgIHByaW50Zigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAorICAgICAgICAgICAgICAgIHByaW50Zigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM4OCw3ICszODgsNyBAQAogICAgICAgICAvLyBzaXplcyBtYXkgYmUgZGlmZmVyZW50IGFjcm9zcyBkZWNvZGVycy4KICAgICAgICAgcHJpbnRmKCJhdmcuICUuMmYgS0Ivc2VjXG4iLCB0b3RhbEJ5dGVzIC8gMTAyNCAqIDFFNiAvIGRlbGF5KTsKIAotICAgICAgICBwcmludGYoImRlY29kZWQgYSB0b3RhbCBvZiAlbGxkIGJ5dGVzXG4iLCB0b3RhbEJ5dGVzKTsKKyAgICAgICAgcHJpbnRmKCJkZWNvZGVkIGEgdG90YWwgb2YgJSIgUFJJZDY0ICIgYnl0ZXNcbiIsIHRvdGFsQnl0ZXMpOwogICAgIH0KIH0KIApAQCAtNTc0LDcgKzU3NCw4IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCi0gICAgICAgICAgICBwcmludGYoIiVsbGRcdCVsbGRcdCVsbGRcbiIsIHNlZWtUaW1lVXMsIHRpbWVVcywgc2Vla1RpbWVVcyAtIHRpbWVVcyk7CisgICAgICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiXHQlIiBQUklkNjQgIlx0JSIgUFJJZDY0ICJcbiIsCisgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgdGltZVVzLCBzZWVrVGltZVVzIC0gdGltZVVzKTsKIAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwpAQCAtNjQ1LDcgKzY0Niw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9CiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzW2pdOwogCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyVsZC8lbGQiLCBqID4gMCA/ICIsICIgOiAiIiwKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzJSIgUFJJdTMyICIvJSIgUFJJdTMyLCBqID4gMCA/ICIsICIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlLCBwcm9maWxlTGV2ZWwubUxldmVsKTsKICAgICAgICAgICAgIH0KIApAQCAtOTM4LDkgKzkzOSwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ0hFQ0sodXNlU3VyZmFjZVRleEFsbG9jKTsKIAotICAgICAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoYnEsIDAgLyogdGV4ICovKTsKLSAgICAgICAgICAgIGdTdXJmYWNlID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIDAgLyogdGV4ICovLAorICAgICAgICAgICAgICAgICAgICBHTENvbnN1bWVyOjpURVhUVVJFX0VYVEVSTkFMLCB0cnVlIC8qIHVzZUZlbmNlU3luYyAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNDb250cm9sbGVkQnlBcHAgKi8pOworICAgICAgICAgICAgZ1N1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCkBAIC05NTgsNyArOTYzLDggQEAKIAogICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CiAKLSAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoZmlsZW5hbWUpOworICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkgJiYgZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UuXG4iKTsKQEAgLTEwNzEsNyArMTA3Nyw3IEBACiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRodW1iVGltZVVzOwogICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYlRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ0aHVtYm5haWxUaW1lOiAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAorICAgICAgICAgICAgICAgICAgICBwcmludGYoInRodW1ibmFpbFRpbWU6ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJUaW1lVXMsIHRodW1iVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBkYmE2N2E5Li4wNTY2ZDE0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTE1OSw3ICsxNjAsOSBAQAogTXlDb252ZXJ0aW5nU3RyZWFtU291cmNlOjpNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgOiBtQ3VycmVudEJ1ZmZlckluZGV4KC0xKSwKICAgICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0KDApIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShmaWxlbmFtZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworCiAgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKIAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOwpAQCAtMzcxLDcgKzM3NCw3IEBACiAgICAgfQogCiAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIgPQotICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoY2xpZW50LCAwKTsKKyAgICAgICAgc2VydmljZS0+Y3JlYXRlKGNsaWVudCwgQVVESU9fU0VTU0lPTl9BTExPQ0FURSk7CiAKICAgICBpZiAocGxheWVyICE9IE5VTEwgJiYgcGxheWVyLT5zZXREYXRhU291cmNlKHNvdXJjZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgcGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcCBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCmluZGV4IDU0MDBiZGQuLjU4NGM2YTYgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCisrKyBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1NaW1lVHlwZVZlY3Rvci5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1pbWVUeXBlVmVjdG9yLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IFN0cmluZzggaXRlbSA9IG1NaW1lVHlwZVZlY3Rvci5pdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZW0uc3RyaW5nKCksIG1pbWVUeXBlLnN0cmluZygpKSkgewpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZEZpbGVTdWZmaXgoY29uc3QgU3RyaW5nOCYgZmlsZVR5cGUpIGNvbnN0IHsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmlsZVN1ZmZpeFZlY3Rvci5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBTdHJpbmc4IGl0ZW0gPSBtRmlsZVN1ZmZpeFZlY3Rvci5pdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZW0uc3RyaW5nKCksIGZpbGVUeXBlLnN0cmluZygpKSkgewpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCmluZGV4IGRjOTczZGEuLmFhMGFiOWIgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5taworKysgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKQEAgLTM5LDQgKzM5LDYgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IGRjY2QyM2QuLmQ4YWViMGMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMTAxLDcgKzEwMSw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpsb2FkUGx1Z0lucyhjb25zdCBTdHJpbmc4JiBwbHVnSW5EaXJQYXRoKSB7CiAgICAgbVBsdWdJbk1hbmFnZXIubG9hZFBsdWdJbnMocGx1Z0luRGlyUGF0aCk7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJblBhdGhMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgU3RyaW5nOCBwbHVnSW5QYXRoID0gcGx1Z0luUGF0aExpc3RbaV07CiAgICAgICAgIERybVN1cHBvcnRJbmZvKiBpbmZvID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJblBhdGgpLmdldFN1cHBvcnRJbmZvKDApOwogICAgICAgICBpZiAoTlVMTCAhPSBpbmZvKSB7CkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmICghbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5pc0VtcHR5KCkpIHsKICAgICAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgICAgICByRHJtRW5naW5lLmluaXRpYWxpemUodW5pcXVlSWQpOwogICAgICAgICAgICAgckRybUVuZ2luZS5zZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgdGhpcyk7CkBAIC0xNDksNyArMTQ5LDcgQEAKIHZvaWQgRHJtTWFuYWdlcjo6cmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwotICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgIHJEcm1FbmdpbmUudGVybWluYXRlKHVuaXF1ZUlkKTsKICAgICB9CkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5QYXRoTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5QYXRoTGlzdFtpXSk7CiAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUuY2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKTsKIApAQCAtMzE4LDcgKzMxOCw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpyZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUucmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKICAgICAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKQEAgLTQxMiw3ICs0MTIsNyBAQAogICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5JZCA9IHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CiAgICAgICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIG1pbWUpOwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CiAgICAgICAgICAgICBTdHJpbmc4IHBsdWdJbklkID0gcGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCk7CiAgICAgICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKICAgICAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUub3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUsIHVyaSwgbWltZSk7CkBAIC01NjUsNyArNTY1LDcgQEAKICAgICBTdHJpbmc4IHBsdWdJbklkKCIiKTsKIAogICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CiAKICAgICAgICAgICAgIGlmIChkcm1TdXBwb3J0SW5mby5pc1N1cHBvcnRlZE1pbWVUeXBlKG1pbWVUeXBlKSkgewpAQCAtNTgxLDcgKzU4MSw3IEBACiAgICAgU3RyaW5nOCBwbHVnSW5JZCgiIik7CiAgICAgY29uc3QgU3RyaW5nOCBmaWxlU3VmZml4ID0gcGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCk7CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CiAKICAgICAgICAgaWYgKGRybVN1cHBvcnRJbmZvLmlzU3VwcG9ydGVkRmlsZVN1ZmZpeChmaWxlU3VmZml4KSkgewpAQCAtNTk5LDcgKzU5OSw3IEBACiAKIHZvaWQgRHJtTWFuYWdlcjo6b25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxpc3RlbmVyTG9jayk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TZXJ2aWNlTGlzdGVuZXJzLnNpemUoKTsgaW5kZXgrKykgeworICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtU2VydmljZUxpc3RlbmVycy5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgaW50IHVuaXF1ZUlkID0gbVNlcnZpY2VMaXN0ZW5lcnMua2V5QXQoaW5kZXgpOwogCiAgICAgICAgIGlmICh1bmlxdWVJZCA9PSBldmVudC5nZXRVbmlxdWVJZCgpKSB7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDJiNzE5MDQuLjYzMzQxZTAgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zNCw3ICszNCwxOCBAQAogc3RhdGljIFZlY3Rvcjx1aWRfdD4gdHJ1c3RlZFVpZHM7CiAKIHN0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgLy8gVE9ETworICAgIC8vIEZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGZvciByZWZlcmVuY2UuCisgICAgLy8gRWFjaCBPRU0gbWFudWZhY3R1cmVyIHNob3VsZCBpbXBsZW1lbnQvcmVwbGFjZSB3aXRoIHRoZWlyIG93biBzb2x1dGlvbnMuCisgICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0cnVzdGVkVWlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAodHJ1c3RlZFVpZHNbaV0gPT0gdWlkKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKaW5kZXggN2JiMTQzZi4uYzFkMDE5YSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5GaWxlTGlzdCA9IGdldFBsdWdJblBhdGhMaXN0KHJzUGx1Z0luRGlyUGF0aCk7CiAKICAgICAgICAgaWYgKCFwbHVnSW5GaWxlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGx1Z0luRmlsZUxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luRmlsZUxpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBsb2FkUGx1Z0luKHBsdWdJbkZpbGVMaXN0W2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAqCiAgICAgICovCiAgICAgdm9pZCB1bmxvYWRQbHVnSW5zKCkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1fcGx1Z0luSWRMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wbHVnSW5JZExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHVubG9hZFBsdWdJbihtX3BsdWdJbklkTGlzdFtpXSk7CiAgICAgICAgIH0KICAgICAgICAgbV9wbHVnSW5JZExpc3QuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDIzNGFlZjIuLmY0MDA3MzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMzE2LDYgKzMxNiw3IEBACiAKICAgICBpZiAoLTEgPCBmaWxlRGVzYykgewogICAgICAgICBpZiAoRndkTG9ja0ZpbGVfYXR0YWNoKGZpbGVEZXNjKSA8IDApIHsKKyAgICAgICAgICAgIGNsb3NlKGZpbGVEZXNjKTsKICAgICAgICAgICAgIHJldHVybiBtaW1lU3RyaW5nOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZSA9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjhkNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrQmxvY2tCaXRDb3VudCA9IGtCbG9ja1NpemUgKiA4OworCithbmRyb2lkOjpzdGF0dXNfdCBBZXNDdHJEZWNyeXB0b3I6OmRlY3J5cHQoY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBrZXksCisgICAgICAgIGNvbnN0IEl2IGl2LCBjb25zdCB1aW50OF90KiBzb3VyY2UsCisgICAgICAgIHVpbnQ4X3QqIGRlc3RpbmF0aW9uLAorICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisgICAgdWludDMyX3QgYmxvY2tPZmZzZXQgPSAwOworICAgIHVpbnQ4X3QgcHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyW2tCbG9ja1NpemVdOworICAgIG1lbXNldChwcmV2aW91c0VuY3J5cHRlZENvdW50ZXIsIDAsIGtCbG9ja1NpemUpOworCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgQUVTX0tFWSBvcGVuc3NsS2V5OworICAgIEFFU19zZXRfZW5jcnlwdF9rZXkoa2V5LmFycmF5KCksIGtCbG9ja0JpdENvdW50LCAmb3BlbnNzbEtleSk7CisgICAgSXYgb3BlbnNzbEl2OworICAgIG1lbWNweShvcGVuc3NsSXYsIGl2LCBzaXplb2Yob3BlbnNzbEl2KSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7ICsraSkgeworICAgICAgICBjb25zdCBTdWJTYW1wbGUmIHN1YlNhbXBsZSA9IHN1YlNhbXBsZXNbaV07CisKKyAgICAgICAgaWYgKHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiArIG9mZnNldCwgc291cmNlICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGUubU51bUJ5dGVzT2ZDbGVhckRhdGEpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWJTYW1wbGUubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID4gMCkgeworICAgICAgICAgICAgQUVTX2N0cjEyOF9lbmNyeXB0KHNvdXJjZSArIG9mZnNldCwgZGVzdGluYXRpb24gKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEsICZvcGVuc3NsS2V5LAorICAgICAgICAgICAgICAgICAgICBvcGVuc3NsSXYsIHByZXZpb3VzRW5jcnlwdGVkQ291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgJmJsb2NrT2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSBzdWJTYW1wbGUubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgKmJ5dGVzRGVjcnlwdGVkT3V0ID0gb2Zmc2V0OworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxNjI2NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0FFU19DVFJfREVDUllQVE9SX0hfCisjZGVmaW5lIENMRUFSS0VZX0FFU19DVFJfREVDUllQVE9SX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8VXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgQWVzQ3RyRGVjcnlwdG9yIHsKK3B1YmxpYzoKKyAgICBBZXNDdHJEZWNyeXB0b3IoKSB7fQorCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgZGVjcnlwdChjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGtleSwgY29uc3QgSXYgaXYsCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFlc0N0ckRlY3J5cHRvcik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTg1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEFlc0N0ckRlY3J5cHRvci5jcHAgXAorICAgIENsZWFyS2V5VVVJRC5jcHAgXAorICAgIENyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAgXAorICAgIENyeXB0b0ZhY3RvcnkuY3BwIFwKKyAgICBDcnlwdG9QbHVnaW4uY3BwIFwKKyAgICBEcm1GYWN0b3J5LmNwcCBcCisgICAgRHJtUGx1Z2luLmNwcCBcCisgICAgSW5pdERhdGFQYXJzZXIuY3BwIFwKKyAgICBKc29uV2ViS2V5LmNwcCBcCisgICAgU2Vzc2lvbi5jcHAgXAorICAgIFNlc3Npb25MaWJyYXJ5LmNwcCBcCisgICAgVXRpbHMuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgYmlvbmljIFwKKyAgICBleHRlcm5hbC9qc21uIFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgXAorICAgIGZyYW1ld29ya3MvYXYvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkgXAorICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJkcm1jbGVhcmtleXBsdWdpbgorCitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gbWVkaWFkcm0KKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3J5cHRvIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgIGxpYnV0aWxzIFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlianNtbiBcCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCdWlsZCB1bml0IHRlc3RzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS90ZXN0cy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVR5cGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4OTU5YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VHlwZXMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9UWVBFU19IXworI2RlZmluZSBDTEVBUktFWV9UWVBFU19IXworCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSBBRVNfQkxPQ0tfU0laRTsKK3R5cGVkZWYgdWludDhfdCBLZXlJZFtrQmxvY2tTaXplXTsKK3R5cGVkZWYgdWludDhfdCBJdltrQmxvY2tTaXplXTsKKwordHlwZWRlZiBhbmRyb2lkOjpDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSBTdWJTYW1wbGU7CisKK3R5cGVkZWYgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8YW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+LAorICAgICAgICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gPiBLZXlNYXA7CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9UWVBFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwNTBmNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitib29sIGlzQ2xlYXJLZXlVVUlEKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrQ2xlYXJLZXlVVUlEWzE2XSA9IHsKKyAgICAgICAgMHgxMCwweDc3LDB4RUYsMHhFQywweEMwLDB4QjIsMHg0RCwweDAyLAorICAgICAgICAweEFDLDB4RTMsMHgzQywweDFFLDB4NTIsMHhFMiwweEZCLDB4NEIKKyAgICB9OworCisgICAgcmV0dXJuICFtZW1jbXAodXVpZCwga0NsZWFyS2V5VVVJRCwgc2l6ZW9mKGtDbGVhcktleVVVSUQpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuaAppbmRleCAxM2NhYzZkLi5hYzk5NDE4Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaWZuZGVmIENMRUFSS0VZX1VVSURfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfVVVJRF9IXwogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPHN0ZGludC5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCituYW1lc3BhY2UgY2xlYXJrZXlkcm0gewogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCitib29sIGlzQ2xlYXJLZXlVVUlEKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwogCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfVVVJRF9IXwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCmluZGV4IDEzY2FjNmQuLmVjMTQyMGUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgIkNyeXB0b0ZhY3RvcnkuaCIKKyNpbmNsdWRlICJEcm1GYWN0b3J5LmgiCiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK2V4dGVybiAiQyIgewogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCithbmRyb2lkOjpEcm1GYWN0b3J5KiBjcmVhdGVEcm1GYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgY2xlYXJrZXlkcm06OkRybUZhY3RvcnkoKTsKK30KIAorYW5kcm9pZDo6Q3J5cHRvRmFjdG9yeSogY3JlYXRlQ3J5cHRvRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbmV3IGNsZWFya2V5ZHJtOjpDcnlwdG9GYWN0b3J5KCk7Cit9CisKK30gLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKaW5kZXggMTNjYWM2ZC4uZDlhY2VjMQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2lmbmRlZiBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXworI2RlZmluZSBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXwogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworZXh0ZXJuICJDIiB7CisgICAgYW5kcm9pZDo6RHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOworICAgIGFuZHJvaWQ6OkNyeXB0b0ZhY3RvcnkqIGNyZWF0ZUNyeXB0b0ZhY3RvcnkoKTsKK30KIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLwotCisjZW5kaWYgLy8gQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzMTg5YgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSAiQ3J5cHRvRmFjdG9yeS5oIgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiQ3J5cHRvUGx1Z2luLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2Jvb2wgQ3J5cHRvRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgY29uc3QgeworICAgIHJldHVybiBpc0NsZWFyS2V5VVVJRCh1dWlkKTsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgQ3J5cHRvRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAorICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgYW5kcm9pZDo6Q3J5cHRvUGx1Z2luKiogcGx1Z2luKSB7CisgICAgaWYgKCFpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgeworICAgICAgICAqcGx1Z2luID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhbmRyb2lkOjpzcDxTZXNzaW9uPiBzZXNzaW9uID0gU2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbigKKyAgICAgICAgICAgIGRhdGEsIHNpemUpOworICAgICpwbHVnaW4gPSBuZXcgQ3J5cHRvUGx1Z2luKHNlc3Npb24pOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhiYzRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19GQUNUT1JZX0hfCisjZGVmaW5lIENMRUFSS0VZX0NSWVBUT19GQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIENyeXB0b0ZhY3RvcnkgOiBwdWJsaWMgYW5kcm9pZDo6Q3J5cHRvRmFjdG9yeSB7CitwdWJsaWM6CisgICAgQ3J5cHRvRmFjdG9yeSgpIHt9CisgICAgdmlydHVhbCB+Q3J5cHRvRmFjdG9yeSgpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbioqIHBsdWdpbik7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3J5cHRvRmFjdG9yeSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYWQxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkNyeXB0b1BsdWdpbi5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpWZWN0b3I7Cit1c2luZyBhbmRyb2lkOjpBU3RyaW5nOwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7CisKKy8vIFJldHVybnMgbmVnYXRpdmUgdmFsdWVzIGZvciBlcnJvciBjb2RlIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgZm9yIHRoZSBzaXplIG9mCisvLyBkZWNyeXB0ZWQgZGF0YS4gIEluIHRoZW9yeSwgdGhlIG91dHB1dCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgaW5wdXQKKy8vIHNpemUsIGJ1dCBpbiBwcmFjdGljZSB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGZvciBBRVMtQ1RSLgorc3NpemVfdCBDcnlwdG9QbHVnaW46OmRlY3J5cHQoYm9vbCBzZWN1cmUsIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGUgbW9kZSwgY29uc3Qgdm9pZCogc3JjUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdFB0ciwgQVN0cmluZyogZXJyb3JEZXRhaWxNc2cpIHsKKyAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgIGVycm9yRGV0YWlsTXNnLT5zZXRUbygiU2VjdXJlIGRlY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGVhcktleS4iKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIGlmIChtb2RlID09IGtNb2RlX1VuZW5jcnlwdGVkKSB7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBzdWJTYW1wbGVzW2ldOworCisgICAgICAgICAgICBpZiAoc3ViU2FtcGxlLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZXJyb3JEZXRhaWxNc2ctPnNldFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVuY3J5cHRlZCBzdWJzYW1wbGVzIGZvdW5kIGluIGFsbGVnZWRseSB1bmVuY3J5cHRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0RFQ1JZUFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdWJTYW1wbGUubU51bUJ5dGVzT2ZDbGVhckRhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihkc3RQdHIpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzcmNQdHIpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGUubU51bUJ5dGVzT2ZDbGVhckRhdGEpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzdWJTYW1wbGUubU51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KG9mZnNldCk7CisgICAgfSBlbHNlIGlmIChtb2RlID09IGtNb2RlX0FFU19DVFIpIHsKKyAgICAgICAgc2l6ZV90IGJ5dGVzRGVjcnlwdGVkOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtU2Vzc2lvbi0+ZGVjcnlwdChrZXlJZCwgaXYsIHNyY1B0ciwgZHN0UHRyLCBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdWJTYW1wbGVzLCAmYnl0ZXNEZWNyeXB0ZWQpOworICAgICAgICBpZiAocmVzID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4oYnl0ZXNEZWNyeXB0ZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyb3JEZXRhaWxNc2ctPnNldFRvKCJEZWNyeXB0aW9uIEVycm9yIik7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVycm9yRGV0YWlsTXNnLT5zZXRUbygKKyAgICAgICAgICAgICAgICAiU2VsZWN0ZWQgZW5jcnlwdGlvbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENsZWFyS2V5IERSTSAiCisgICAgICAgICAgICAgICAgIlBsdWdpbi4iKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMmQ5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9DUllQVE9fUExVR0lOX0hfCisjZGVmaW5lIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIENyeXB0b1BsdWdpbiA6IHB1YmxpYyBhbmRyb2lkOjpDcnlwdG9QbHVnaW4geworcHVibGljOgorICAgIENyeXB0b1BsdWdpbihjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgc2Vzc2lvbikgOiBtU2Vzc2lvbihzZXNzaW9uKSB7fQorICAgIHZpcnR1YWwgfkNyeXB0b1BsdWdpbigpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIqIG1pbWUpIGNvbnN0IHsKKyAgICAgICAgVU5VU0VEKG1pbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IGRlY3J5cHQoCisgICAgICAgICAgICBib29sIHNlY3VyZSwgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgTW9kZSBtb2RlLCBjb25zdCB2b2lkKiBzcmNQdHIsCisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgdm9pZCogZHN0UHRyLCBhbmRyb2lkOjpBU3RyaW5nKiBlcnJvckRldGFpbE1zZyk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3J5cHRvUGx1Z2luKTsKKworICAgIGFuZHJvaWQ6OnNwPFNlc3Npb24+IG1TZXNzaW9uOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyNzVjZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlICJEcm1GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitib29sIERybUZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKKyAgICByZXR1cm4gaXNDbGVhcktleVVVSUQodXVpZCk7Cit9CisKK2Jvb2wgRHJtRmFjdG9yeTo6aXNDb250ZW50VHlwZVN1cHBvcnRlZChjb25zdCBhbmRyb2lkOjpTdHJpbmc4ICZpbml0RGF0YVR5cGUpIHsKKyAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgdHlwZXMgaGFuZGVkIGJ5IEluaXREYXRhUGFyc2VyLgorICAgIHJldHVybiBpbml0RGF0YVR5cGUgPT0gImNlbmMiIHx8CisgICAgICAgICAgIGluaXREYXRhVHlwZSA9PSAid2VibSI7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IERybUZhY3Rvcnk6OmNyZWF0ZURybVBsdWdpbigKKyAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgYW5kcm9pZDo6RHJtUGx1Z2luKiogcGx1Z2luKSB7CisgICAgaWYgKCFpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgeworICAgICAgICAqcGx1Z2luID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IERybVBsdWdpbihTZXNzaW9uTGlicmFyeTo6Z2V0KCkpOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjRkM2QwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCisjZGVmaW5lIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgRHJtRmFjdG9yeSA6IHB1YmxpYyBhbmRyb2lkOjpEcm1GYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBEcm1GYWN0b3J5KCkge30KKyAgICB2aXJ0dWFsIH5Ecm1GYWN0b3J5KCkge30KKworICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKKworICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGFuZHJvaWQ6OlN0cmluZzggJmluaXREYXRhVHlwZSk7CisKKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGNyZWF0ZURybVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGFuZHJvaWQ6OkRybVBsdWdpbioqIHBsdWdpbik7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtRmFjdG9yeSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZmNhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKworI2luY2x1ZGUgIlNlc3Npb24uaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6c3A7CisKK3N0YXR1c190IERybVBsdWdpbjo6b3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OmNsb3NlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgbVNlc3Npb25MaWJyYXJ5LT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKKyAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCkgeworICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworICAgIGlmIChrZXlUeXBlICE9IGtLZXlUeXBlX1N0cmVhbWluZykgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2NvcGUpOworICAgIGRlZmF1bHRVcmwuY2xlYXIoKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgaW5pdERhdGFUeXBlLCAmcmVxdWVzdCk7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2NvcGUpOworICAgIHN0YXR1c190IHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CisgICAgaWYgKHJlcyA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICBrZXlTZXRJZC5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3QgeworICAgIGlmIChuYW1lID09ICJ2ZW5kb3IiKSB7CisgICAgICAgIHZhbHVlID0gIkdvb2dsZSI7CisgICAgfSBlbHNlIGlmIChuYW1lID09ICJ2ZXJzaW9uIikgeworICAgICAgICB2YWx1ZSA9ICIxLjAiOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiZGVzY3JpcHRpb24iKSB7CisgICAgICAgIHZhbHVlID0gIkNsZWFyS2V5IENETSI7CisgICAgfSBlbHNlIGlmIChuYW1lID09ICJhbGdvcml0aG1zIikgeworICAgICAgICB2YWx1ZSA9ICIiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gc3RyaW5nIHByb3BlcnR5ICVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkZjljZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCisjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KKworI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OktleWVkVmVjdG9yOwordXNpbmcgYW5kcm9pZDo6TGlzdDsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworY2xhc3MgRHJtUGx1Z2luIDogcHVibGljIGFuZHJvaWQ6OkRybVBsdWdpbiB7CitwdWJsaWM6CisgICAgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKKyAgICAgICAgICAgIDogbVNlc3Npb25MaWJyYXJ5KHNlc3Npb25MaWJyYXJ5KSB7fQorICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0S2V5UmVxdWVzdCgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKKyAgICAgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVLZXlzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlS2V5cygKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGtleVNldElkKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlLZXlTdGF0dXMoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBpbmZvTWFwKSBjb25zdCB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoaW5mb01hcCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjZXJ0X3R5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjZXJ0X2F1dGhvcml0eSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKKyAgICAgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwpIHsKKyAgICAgICAgVU5VU0VEKGNlcnRfdHlwZSk7CisgICAgICAgIFVOVVNFRChjZXJ0X2F1dGhvcml0eSk7CisgICAgICAgIFVOVVNFRChyZXF1ZXN0KTsKKyAgICAgICAgVU5VU0VEKGRlZmF1bHRVcmwpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgd3JhcHBlZEtleSkgeworICAgICAgICBVTlVTRUQocmVzcG9uc2UpOworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGUpOworICAgICAgICBVTlVTRUQod3JhcHBlZEtleSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVucHJvdmlzaW9uRGV2aWNlKCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+JiBzZWN1cmVTdG9wcykgeworICAgICAgICBVTlVTRUQoc2VjdXJlU3RvcHMpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzc1JlbGVhc2UpIHsKKyAgICAgICAgVU5VU0VEKHNzUmVsZWFzZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgVU5VU0VEKG5hbWUpOworICAgICAgICBVTlVTRUQodmFsdWUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFN0cmluZzgmIHZhbHVlKSB7CisgICAgICAgIFVOVVNFRChuYW1lKTsKKyAgICAgICAgVU5VU0VEKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7CisgICAgICAgIFVOVVNFRChuYW1lKTsKKyAgICAgICAgVU5VU0VEKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IFN0cmluZzgmIGFsZ29yaXRobSkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGFsZ29yaXRobSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBTdHJpbmc4JiBhbGdvcml0aG0pIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChhbGdvcml0aG0pOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbnB1dCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaXYsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIG91dHB1dCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGtleUlkKTsKKyAgICAgICAgVU5VU0VEKGlucHV0KTsKKyAgICAgICAgVU5VU0VEKGl2KTsKKyAgICAgICAgVU5VU0VEKG91dHB1dCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGlucHV0LAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpdiwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5SWQpOworICAgICAgICBVTlVTRUQoaW5wdXQpOworICAgICAgICBVTlVTRUQoaXYpOworICAgICAgICBVTlVTRUQob3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbigKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5SWQpOworICAgICAgICBVTlVTRUQobWVzc2FnZSk7CisgICAgICAgIFVOVVNFRChzaWduYXR1cmUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnkoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSwgYm9vbCYgbWF0Y2gpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlJZCk7CisgICAgICAgIFVOVVNFRChtZXNzYWdlKTsKKyAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7CisgICAgICAgIFVOVVNFRChtYXRjaCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25SU0EoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFsZ29yaXRobSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoYWxnb3JpdGhtKTsKKyAgICAgICAgVU5VU0VEKG1lc3NhZ2UpOworICAgICAgICBVTlVTRUQod3JhcHBlZEtleSk7CisgICAgICAgIFVOVVNFRChzaWduYXR1cmUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybVBsdWdpbik7CisKKyAgICBTZXNzaW9uTGlicmFyeSogbVNlc3Npb25MaWJyYXJ5OworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjJkNzNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpBU3RyaW5nOwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworbmFtZXNwYWNlIHsKKyAgICBjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworICAgIGNvbnN0IHNpemVfdCBrU3lzdGVtSWRTaXplID0gMTY7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEluaXREYXRhUGFyc2VyOjpwYXJzZShjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpIHsKKyAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgdGhlIGtleSBJRHMKKyAgICBWZWN0b3I8Y29uc3QgdWludDhfdCo+IGtleUlkczsKKyAgICBpZiAoaW5pdERhdGFUeXBlID09ICJjZW5jIikgeworICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXMgPSBwYXJzZVBzc2goaW5pdERhdGEsICZrZXlJZHMpOworICAgICAgICBpZiAocmVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpbml0RGF0YVR5cGUgPT0gIndlYm0iKSB7CisgICAgICAgIC8vIFdlYk0gImluaXQgZGF0YSIgaXMganVzdCBhIHNpbmdsZSBrZXkgSUQKKyAgICAgICAgaWYgKGluaXREYXRhLnNpemUoKSAhPSBrS2V5SWRTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgICAgIH0KKyAgICAgICAga2V5SWRzLnB1c2goaW5pdERhdGEuYXJyYXkoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0CisgICAgU3RyaW5nOCByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlJZHMpOworICAgIGxpY2Vuc2VSZXF1ZXN0LT5jbGVhcigpOworICAgIGxpY2Vuc2VSZXF1ZXN0LT5hcHBlbmRBcnJheSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlcXVlc3RKc29uLnN0cmluZygpKSwKKyAgICAgICAgICAgIHJlcXVlc3RKc29uLnNpemUoKSk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBJbml0RGF0YVBhcnNlcjo6cGFyc2VQc3NoKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIFZlY3Rvcjxjb25zdCB1aW50OF90Kj4qIGtleUlkcykgeworICAgIHNpemVfdCByZWFkUG9zaXRpb24gPSAwOworCisgICAgLy8gVmFsaWRhdGUgc2l6ZSBmaWVsZAorICAgIHVpbnQzMl90IGV4cGVjdGVkU2l6ZSA9IGluaXREYXRhLnNpemUoKTsKKyAgICBleHBlY3RlZFNpemUgPSBodG9ubChleHBlY3RlZFNpemUpOworICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sICZleHBlY3RlZFNpemUsCisgICAgICAgICAgICAgICBzaXplb2YoZXhwZWN0ZWRTaXplKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBzaXplb2YoZXhwZWN0ZWRTaXplKTsKKworICAgIC8vIFZhbGlkYXRlIFBTU0ggYm94IGlkZW50aWZpZXIKKyAgICBjb25zdCBjaGFyIHBzc2hJZGVudGlmaWVyWzRdID0geydwJywgJ3MnLCAncycsICdoJ307CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgcHNzaElkZW50aWZpZXIsCisgICAgICAgICAgICAgICBzaXplb2YocHNzaElkZW50aWZpZXIpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihwc3NoSWRlbnRpZmllcik7CisKKyAgICAvLyBWYWxpZGF0ZSBFTUUgdmVyc2lvbiBudW1iZXIKKyAgICBjb25zdCB1aW50OF90IHBzc2hWZXJzaW9uMVs0XSA9IHsxLCAwLCAwLCAwfTsKKyAgICBpZiAobWVtY21wKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBwc3NoVmVyc2lvbjEsCisgICAgICAgICAgICAgICBzaXplb2YocHNzaFZlcnNpb24xKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBzaXplb2YocHNzaFZlcnNpb24xKTsKKworICAgIC8vIFZhbGlkYXRlIHN5c3RlbSBJRAorICAgIGlmICghaXNDbGVhcktleVVVSUQoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0pKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IGtTeXN0ZW1JZFNpemU7CisKKyAgICAvLyBSZWFkIGtleSBJRCBjb3VudAorICAgIHVpbnQzMl90IGtleUlkQ291bnQ7CisgICAgbWVtY3B5KCZrZXlJZENvdW50LCAmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgc2l6ZW9mKGtleUlkQ291bnQpKTsKKyAgICBrZXlJZENvdW50ID0gbnRvaGwoa2V5SWRDb3VudCk7CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihrZXlJZENvdW50KTsKKyAgICBpZiAocmVhZFBvc2l0aW9uICsgKGtleUlkQ291bnQgKiBrS2V5SWRTaXplKSAhPQorICAgICAgICAgICAgaW5pdERhdGEuc2l6ZSgpIC0gc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBrZXkgSUQgb2Zmc2V0cworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrZXlJZENvdW50OyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGtleUlkUG9zaXRpb24gPSByZWFkUG9zaXRpb24gKyAoaSAqIGtLZXlJZFNpemUpOworICAgICAgICBrZXlJZHMtPnB1c2goJmluaXREYXRhW2tleUlkUG9zaXRpb25dKTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitTdHJpbmc4IEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoY29uc3QgVmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CisgICAgY29uc3QgU3RyaW5nOCBrUmVxdWVzdFByZWZpeCgie1wia2lkc1wiOlsiKTsKKyAgICBjb25zdCBTdHJpbmc4IGtSZXF1ZXN0U3VmZml4KCJdLFwidHlwZVwiOlwidGVtcG9yYXJ5XCJ9Iik7CisgICAgY29uc3QgU3RyaW5nOCBrQmFzZTY0UGFkZGluZygiPSIpOworCisgICAgU3RyaW5nOCByZXF1ZXN0KGtSZXF1ZXN0UHJlZml4KTsKKyAgICBBU3RyaW5nIGVuY29kZWRJZDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleUlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBlbmNvZGVkSWQuY2xlYXIoKTsKKyAgICAgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0KGtleUlkc1tpXSwga0tleUlkU2l6ZSwgJmVuY29kZWRJZCk7CisgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIsIik7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5hcHBlbmRGb3JtYXQoIlwiJXNcIiIsIGVuY29kZWRJZC5jX3N0cigpKTsKKyAgICB9CisgICAgcmVxdWVzdC5hcHBlbmQoa1JlcXVlc3RTdWZmaXgpOworCisgICAgLy8gQW5kcm9pZCdzIEJhc2U2NCBlbmNvZGVyIHByb2R1Y2VzIHBhZGRpbmcuIEVNRSBmb3JiaWRzIHBhZGRpbmcuCisgICAgcmVxdWVzdC5yZW1vdmVBbGwoa0Jhc2U2NFBhZGRpbmcpOworICAgIHJldHVybiByZXF1ZXN0OworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwNWQyYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfSU5JVF9EQVRBX1BBUlNFUl9IXworI2RlZmluZSBDTEVBUktFWV9JTklUX0RBVEFfUEFSU0VSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBJbml0RGF0YVBhcnNlciB7CitwdWJsaWM6CisgICAgSW5pdERhdGFQYXJzZXIoKSB7fQorCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2UoY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEluaXREYXRhUGFyc2VyKTsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IHBhcnNlUHNzaChjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKTsKKworICAgIGFuZHJvaWQ6OlN0cmluZzggZ2VuZXJhdGVSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9JTklUX0RBVEFfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Kc29uV2ViS2V5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZmZhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Kc29uV2ViS2V5LmNwcApAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkpzb25XZWJLZXkiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCituYW1lc3BhY2UgeworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrS2V5c1RhZygia2V5cyIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrS2V5VHlwZVRhZygia3R5Iik7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtLZXlUYWcoImsiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0tleUlkVGFnKCJraWQiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0Jhc2U2NFBhZGRpbmcoIj0iKTsKK30KKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6QUJ1ZmZlcjsKK3VzaW5nIGFuZHJvaWQ6OkFTdHJpbmc7CisKK0pzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7Cit9CisKK0pzb25XZWJLZXk6On5Kc29uV2ViS2V5KCkgeworfQorCisvKgorICogUGFyc2VzIGEgSlNPTiBXZWIgS2V5IFNldCBzdHJpbmcsIGluaXRpYWxpemVzIGEgS2V5TWFwIHdpdGgga2V5IGlkOmtleQorICogcGFpcnMgZnJvbSB0aGUgSlNPTiBXZWIgS2V5IFNldC4gQm90aCBrZXkgaWRzIGFuZCBrZXlzIGFyZSBiYXNlNjR1cmwKKyAqIGVuY29kZWQuIFRoZSBLZXlNYXAgY29udGFpbnMgYmFzZTY0dXJsIGRlY29kZWQga2V5IGlkOmtleSBwYWlycy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpleHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25XZWJLZXlTZXQsCisgICAgICAgIEtleU1hcCoga2V5cykgeworCisgICAga2V5cy0+Y2xlYXIoKTsKKyAgICBpZiAoIXBhcnNlSnNvbldlYktleVNldChqc29uV2ViS2V5U2V0LCAmbUpzb25PYmplY3RzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbUpzb25PYmplY3RzWzBdIGNvbnRhaW5zIHRoZSBlbnRpcmUgSlNPTiBXZWIgS2V5IFNldCwgaW5jbHVkaW5nCisgICAgLy8gYWxsIHRoZSBiYXNlNjQgZW5jb2RlZCBrZXlzLiBFYWNoIGtleSBpcyBhbHNvIHN0b3JlZCBzZXBhcmF0ZWx5IGFzCisgICAgLy8gYSBKU09OIG9iamVjdCBpbiBtSnNvbk9iamVjdHNbMS4ubl0gd2hlcmUgbiBpcyB0aGUgdG90YWwKKyAgICAvLyBudW1iZXIgb2Yga2V5cyBpbiB0aGUgc2V0LgorICAgIGlmICghaXNKc29uV2ViS2V5U2V0KG1Kc29uT2JqZWN0c1swXSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzggZW5jb2RlZEtleSwgZW5jb2RlZEtleUlkOworICAgIFZlY3Rvcjx1aW50OF90PiBkZWNvZGVkS2V5LCBkZWNvZGVkS2V5SWQ7CisKKyAgICAvLyBtSnNvbk9iamVjdHNbMV0gY29udGFpbnMgdGhlIGZpcnN0IEpTT04gV2ViIEtleSBpbiB0aGUgc2V0CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtSnNvbk9iamVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZW5jb2RlZEtleUlkLmNsZWFyKCk7CisgICAgICAgIGVuY29kZWRLZXkuY2xlYXIoKTsKKworICAgICAgICBpZiAoIXBhcnNlSnNvbk9iamVjdChtSnNvbk9iamVjdHNbaV0sICZtVG9rZW5zKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZmluZEtleShtSnNvbk9iamVjdHNbaV0sICZlbmNvZGVkS2V5SWQsICZlbmNvZGVkS2V5KSkgeworICAgICAgICAgICAgaWYgKGVuY29kZWRLZXlJZC5pc0VtcHR5KCkgfHwgZW5jb2RlZEtleS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTXVzdCBoYXZlIGJvdGgga2V5IGlkIGFuZCBrZXkgaW4gdGhlIEpzb25XZWJLZXkgc2V0LiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRlY29kZUJhc2U2NFN0cmluZyhlbmNvZGVkS2V5SWQsICZkZWNvZGVkS2V5SWQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZWNvZGUga2V5IGlkKCVzKSIsIGVuY29kZWRLZXlJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGVjb2RlQmFzZTY0U3RyaW5nKGVuY29kZWRLZXksICZkZWNvZGVkS2V5KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGVjb2RlIGtleSglcykiLCBlbmNvZGVkS2V5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5cy0+YWRkKGRlY29kZWRLZXlJZCwgZGVjb2RlZEtleSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnNvbldlYktleTo6ZGVjb2RlQmFzZTY0U3RyaW5nKGNvbnN0IFN0cmluZzgmIGVuY29kZWRUZXh0LAorICAgICAgICBWZWN0b3I8dWludDhfdD4qIGRlY29kZWRUZXh0KSB7CisKKyAgICBkZWNvZGVkVGV4dC0+Y2xlYXIoKTsKKworICAgIC8vIGVuY29kZWRUZXh0IHNob3VsZCBub3QgY29udGFpbiBwYWRkaW5nIGNoYXJhY3RlcnMgYXMgcGVyIEVNRSBzcGVjLgorICAgIGlmIChlbmNvZGVkVGV4dC5maW5kKGtCYXNlNjRQYWRkaW5nKSAhPSAtMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2luY2UgYW5kcm9pZDo6ZGVjb2RlQmFzZTY0KCkgcmVxdWlyZXMgcGFkZGluZyBjaGFyYWN0ZXJzLAorICAgIC8vIGFkZCB0aGVtIHNvIGxlbmd0aCBvZiBlbmNvZGVkVGV4dCBpcyBleGFjdGx5IGEgbXVsdGlwbGUgb2YgNC4KKyAgICBpbnQgcmVtYWluZGVyID0gZW5jb2RlZFRleHQubGVuZ3RoKCkgJSA0OworICAgIFN0cmluZzggcGFkZGVkVGV4dChlbmNvZGVkVGV4dCk7CisgICAgaWYgKHJlbWFpbmRlciA+IDApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0IC0gcmVtYWluZGVyOyArK2kpIHsKKyAgICAgICAgICAgIHBhZGRlZFRleHQuYXBwZW5kKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFuZHJvaWQ6OnNwPEFCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBhbmRyb2lkOjpkZWNvZGVCYXNlNjQoQVN0cmluZyhwYWRkZWRUZXh0LnN0cmluZygpKSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgY29udGVudCBmb3VuZC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRlY29kZWRUZXh0LT5hcHBlbmRBcnJheShidWZmZXItPmJhc2UoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEpzb25XZWJLZXk6OmZpbmRLZXkoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCwgU3RyaW5nOCoga2V5SWQsCisgICAgICAgIFN0cmluZzgqIGVuY29kZWRLZXkpIHsKKworICAgIFN0cmluZzgga2V5LCB2YWx1ZTsKKworICAgIC8vIE9ubHkgYWxsb3cgc3ltbWV0cmljIGtleSwgaS5lLiAia3R5Ijoib2N0IiBwYWlyLgorICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleVR5cGVUYWcpID49IDApIHsKKyAgICAgICAgZmluZFZhbHVlKGtLZXlUeXBlVGFnLCAmdmFsdWUpOworICAgICAgICBpZiAoMCAhPSB2YWx1ZS5jb21wYXJlKGtTeW1tZXRyaWNLZXlWYWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5SWRUYWcpID49IDApIHsKKyAgICAgICAgZmluZFZhbHVlKGtLZXlJZFRhZywga2V5SWQpOworICAgIH0KKworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleVRhZykgPj0gMCkgeworICAgICAgICBmaW5kVmFsdWUoa0tleVRhZywgZW5jb2RlZEtleSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEpzb25XZWJLZXk6OmZpbmRWYWx1ZShjb25zdCBTdHJpbmc4ICZrZXksIFN0cmluZzgqIHZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisgICAgY29uc3QgY2hhciogdmFsdWVUb2tlbjsKKyAgICBmb3IgKFZlY3RvcjxTdHJpbmc4Pjo6Y29uc3RfaXRlcmF0b3IgbmV4dFRva2VuID0gbVRva2Vucy5iZWdpbigpOworICAgICAgICBuZXh0VG9rZW4gIT0gbVRva2Vucy5lbmQoKTsgKytuZXh0VG9rZW4pIHsKKyAgICAgICAgaWYgKDAgPT0gKCpuZXh0VG9rZW4pLmNvbXBhcmUoa2V5KSkgeworICAgICAgICAgICAgaWYgKG5leHRUb2tlbiArIDEgPT0gbVRva2Vucy5lbmQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlVG9rZW4gPSAoKihuZXh0VG9rZW4gKyAxKSkuc3RyaW5nKCk7CisgICAgICAgICAgICB2YWx1ZS0+c2V0VG8odmFsdWVUb2tlbik7CisgICAgICAgICAgICBuZXh0VG9rZW4rKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEpzb25XZWJLZXk6OmlzSnNvbldlYktleVNldChjb25zdCBTdHJpbmc4JiBqc29uT2JqZWN0KSBjb25zdCB7CisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5c1RhZykgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIkpTT04gV2ViIEtleSBkb2VzIG5vdCBjb250YWluIGtleXMuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQYXJzZXMgYSBKU09OIG9iamVjdHMgc3RyaW5nIGFuZCBpbml0aWFsaXplcyBhIHZlY3RvciBvZiB0b2tlbnMuCisgKgorICogQHJldHVybiBSZXR1cm5zIGZhbHNlIGZvciBlcnJvcnMsIHRydWUgZm9yIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgSnNvbldlYktleTo6cGFyc2VKc29uT2JqZWN0KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QsCisgICAgICAgIFZlY3RvcjxTdHJpbmc4PiogdG9rZW5zKSB7CisgICAganNtbl9wYXJzZXIgcGFyc2VyOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBudW1Ub2tlbnMgPSBqc21uX3BhcnNlKCZwYXJzZXIsCisgICAgICAgIGpzb25PYmplY3Quc3RyaW5nKCksIGpzb25PYmplY3Quc2l6ZSgpLCBOVUxMLCAwKTsKKyAgICBpZiAobnVtVG9rZW5zIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIG51bVRva2Vucyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQganNtblRva2Vuc1NpemUgPSBudW1Ub2tlbnMgKiBzaXplb2YoanNtbnRva190KTsKKyAgICBtSnNtblRva2Vucy5jbGVhcigpOworICAgIG1Kc21uVG9rZW5zLnNldENhcGFjaXR5KGpzbW5Ub2tlbnNTaXplKTsKKworICAgIGpzbW5faW5pdCgmcGFyc2VyKTsKKyAgICBpbnQgc3RhdHVzID0ganNtbl9wYXJzZSgmcGFyc2VyLCBqc29uT2JqZWN0LnN0cmluZygpLAorICAgICAgICBqc29uT2JqZWN0LnNpemUoKSwgbUpzbW5Ub2tlbnMuZWRpdEFycmF5KCksIG51bVRva2Vucyk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdG9rZW5zLT5jbGVhcigpOworICAgIFN0cmluZzggdG9rZW47CisgICAgY29uc3QgY2hhciAqcGpzOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtVG9rZW5zOyArK2opIHsKKyAgICAgICAgcGpzID0ganNvbk9iamVjdC5zdHJpbmcoKSArIG1Kc21uVG9rZW5zW2pdLnN0YXJ0OworICAgICAgICBpZiAobUpzbW5Ub2tlbnNbal0udHlwZSA9PSBKU01OX1NUUklORyB8fAorICAgICAgICAgICAgICAgIG1Kc21uVG9rZW5zW2pdLnR5cGUgPT0gSlNNTl9QUklNSVRJVkUpIHsKKyAgICAgICAgICAgIHRva2VuLnNldFRvKHBqcywgbUpzbW5Ub2tlbnNbal0uZW5kIC0gbUpzbW5Ub2tlbnNbal0uc3RhcnQpOworICAgICAgICAgICAgdG9rZW5zLT5hZGQodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIEpTT04gV2ViIEtleSBTZXQgc3RyaW5nIGFuZCBpbml0aWFsaXplcyBhIHZlY3RvciBvZiBKU09OIG9iamVjdHMuCisgKgorICogQHJldHVybiBSZXR1cm5zIGZhbHNlIGZvciBlcnJvcnMsIHRydWUgZm9yIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgSnNvbldlYktleTo6cGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25XZWJLZXlTZXQsCisgICAgICAgIFZlY3RvcjxTdHJpbmc4PioganNvbk9iamVjdHMpIHsKKyAgICBpZiAoanNvbldlYktleVNldC5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIkVtcHR5IEpTT04gV2ViIEtleSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVGhlIGpzbW4gcGFyc2VyIG9ubHkgc3VwcG9ydHMgdW5pY29kZSBlbmNvZGluZy4KKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICAvLyBDb21wdXRlcyBudW1iZXIgb2YgdG9rZW5zLiBBIHRva2VuIG1hcmtzIHRoZSB0eXBlLCBvZmZzZXQgaW4KKyAgICAvLyB0aGUgb3JpZ2luYWwgc3RyaW5nLgorICAgIGpzbW5faW5pdCgmcGFyc2VyKTsKKyAgICBpbnQgbnVtVG9rZW5zID0ganNtbl9wYXJzZSgmcGFyc2VyLAorICAgICAgICAgICAganNvbldlYktleVNldC5zdHJpbmcoKSwganNvbldlYktleVNldC5zaXplKCksIE5VTEwsIDApOworICAgIGlmIChudW1Ub2tlbnMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgbnVtVG9rZW5zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBqc21uVG9rZW5zU2l6ZSA9IG51bVRva2VucyAqIHNpemVvZihqc21udG9rX3QpOworICAgIG1Kc21uVG9rZW5zLnNldENhcGFjaXR5KGpzbW5Ub2tlbnNTaXplKTsKKworICAgIGpzbW5faW5pdCgmcGFyc2VyKTsKKyAgICBpbnQgc3RhdHVzID0ganNtbl9wYXJzZSgmcGFyc2VyLCBqc29uV2ViS2V5U2V0LnN0cmluZygpLAorICAgICAgICAgICAganNvbldlYktleVNldC5zaXplKCksIG1Kc21uVG9rZW5zLmVkaXRBcnJheSgpLCBudW1Ub2tlbnMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzggdG9rZW47CisgICAgY29uc3QgY2hhciAqcGpzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVG9rZW5zOyArK2kpIHsKKyAgICAgICAgcGpzID0ganNvbldlYktleVNldC5zdHJpbmcoKSArIG1Kc21uVG9rZW5zW2ldLnN0YXJ0OworICAgICAgICBpZiAobUpzbW5Ub2tlbnNbaV0udHlwZSA9PSBKU01OX09CSkVDVCkgeworICAgICAgICAgICAgdG9rZW4uc2V0VG8ocGpzLCBtSnNtblRva2Vuc1tpXS5lbmQgLSBtSnNtblRva2Vuc1tpXS5zdGFydCk7CisgICAgICAgICAgICBqc29uT2JqZWN0cy0+YWRkKHRva2VuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU1MGVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfSlNPTl9XRUJfS0VZX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSAianNtbi5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpLZXllZFZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6OnNwOwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworY2xhc3MgSnNvbldlYktleSB7CisgcHVibGljOgorICAgIEpzb25XZWJLZXkoKTsKKyAgICB2aXJ0dWFsIH5Kc29uV2ViS2V5KCk7CisKKyAgICBib29sIGV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbldlYktleVNldCwKKyAgICAgICAgICAgIEtleU1hcCoga2V5cyk7CisKKyBwcml2YXRlOgorICAgIFZlY3Rvcjxqc21udG9rX3Q+IG1Kc21uVG9rZW5zOworICAgIFZlY3RvcjxTdHJpbmc4PiBtSnNvbk9iamVjdHM7CisgICAgVmVjdG9yPFN0cmluZzg+IG1Ub2tlbnM7CisKKyAgICBib29sIGRlY29kZUJhc2U2NFN0cmluZyhjb25zdCBTdHJpbmc4JiBlbmNvZGVkVGV4dCwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpOworICAgIGJvb2wgZmluZEtleShjb25zdCBTdHJpbmc4JiBqc29uT2JqZWN0LCBTdHJpbmc4KiBrZXlJZCwKKyAgICAgICAgICAgIFN0cmluZzgqIGVuY29kZWRLZXkpOworICAgIHZvaWQgZmluZFZhbHVlKGNvbnN0IFN0cmluZzggJmtleSwgU3RyaW5nOCogdmFsdWUpOworICAgIGJvb2wgaXNKc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QpIGNvbnN0OworICAgIGJvb2wgcGFyc2VKc29uT2JqZWN0KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QsIFZlY3RvcjxTdHJpbmc4PiogdG9rZW5zKTsKKyAgICBib29sIHBhcnNlSnNvbldlYktleVNldChjb25zdCBTdHJpbmc4JiBqc29uV2ViS2V5U2V0LCBWZWN0b3I8U3RyaW5nOD4qIGpzb25PYmplY3RzKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpzb25XZWJLZXkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAgLy8gQ0xFQVJLRVlfSlNPTl9XRUJfS0VZX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDE2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmNwcApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCisjaW5jbHVkZSAiQWVzQ3RyRGVjcnlwdG9yLmgiCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6Ok11dGV4OwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OworCitzdGF0dXNfdCBTZXNzaW9uOjpnZXRLZXlSZXF1ZXN0KAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgIFZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3QgeworICAgIEluaXREYXRhUGFyc2VyIHBhcnNlcjsKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBpbml0RGF0YVR5cGUsIGtleVJlcXVlc3QpOworfQorCitzdGF0dXNfdCBTZXNzaW9uOjpwcm92aWRlS2V5UmVzcG9uc2UoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSkgeworICAgIFN0cmluZzggcmVzcG9uc2VTdHJpbmcoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyZXNwb25zZS5hcnJheSgpKSwgcmVzcG9uc2Uuc2l6ZSgpKTsKKyAgICBLZXlNYXAga2V5czsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NYXBMb2NrKTsKKyAgICBKc29uV2ViS2V5IHBhcnNlcjsKKyAgICBpZiAocGFyc2VyLmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQocmVzcG9uc2VTdHJpbmcsICZrZXlzKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEtleU1hcDo6a2V5X3R5cGUmIGtleUlkID0ga2V5cy5rZXlBdChpKTsKKyAgICAgICAgICAgIGNvbnN0IEtleU1hcDo6dmFsdWVfdHlwZSYga2V5ID0ga2V5cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgbUtleU1hcC5hZGQoa2V5SWQsIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXR1c190IFNlc3Npb246OmRlY3J5cHQoCisgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3Qgdm9pZCogc291cmNlLAorICAgICAgICB2b2lkKiBkZXN0aW5hdGlvbiwgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NYXBMb2NrKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBrZXlJZFZlY3RvcjsKKyAgICBrZXlJZFZlY3Rvci5hcHBlbmRBcnJheShrZXlJZCwga0Jsb2NrU2l6ZSk7CisgICAgaWYgKG1LZXlNYXAuaW5kZXhPZktleShrZXlJZFZlY3RvcikgPCAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICB9CisKKyAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleSA9IG1LZXlNYXAudmFsdWVGb3Ioa2V5SWRWZWN0b3IpOworICAgIEFlc0N0ckRlY3J5cHRvciBkZWNyeXB0b3I7CisgICAgcmV0dXJuIGRlY3J5cHRvci5kZWNyeXB0KAorICAgICAgICAgICAga2V5LCBpdiwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNvdXJjZSksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihkZXN0aW5hdGlvbiksIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBudW1TdWJTYW1wbGVzLCBieXRlc0RlY3J5cHRlZE91dCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiMGRjMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9TRVNTSU9OX0hfCisjZGVmaW5lIENMRUFSS0VZX1NFU1NJT05fSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgU2Vzc2lvbiA6IHB1YmxpYyBhbmRyb2lkOjpSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTZXNzaW9uKGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKQorICAgICAgICAgICAgOiBtU2Vzc2lvbklkKHNlc3Npb25JZCkge30KKyAgICB2aXJ0dWFsIH5TZXNzaW9uKCkge30KKworICAgIGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfQorCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgZ2V0S2V5UmVxdWVzdCgKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0OworCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSk7CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBkZWNyeXB0KAorICAgICAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB2b2lkKiBzb3VyY2UsCisgICAgICAgICAgICB2b2lkKiBkZXN0aW5hdGlvbiwgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlc3Npb24pOworCisgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CisKKyAgICBhbmRyb2lkOjpNdXRleCBtTWFwTG9jazsKKyAgICBLZXlNYXAgbUtleU1hcDsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9TRVNTSU9OX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0N2M1MwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6Ok11dGV4OwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitNdXRleCBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbkxvY2s7CitTZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b24gPSBOVUxMOworCitTZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OmdldCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzU2luZ2xldG9uTG9jayk7CisKKyAgICBpZiAoc1NpbmdsZXRvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dEKCJJbnN0YW50aWF0aW5nIFNlc3Npb24gTGlicmFyeSBTaW5nbGV0b24uIik7CisgICAgICAgIHNTaW5nbGV0b24gPSBuZXcgU2Vzc2lvbkxpYnJhcnkoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc1NpbmdsZXRvbjsKK30KKworY29uc3Qgc3A8U2Vzc2lvbj4mIFNlc3Npb25MaWJyYXJ5OjpjcmVhdGVTZXNzaW9uKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworCisgICAgU3RyaW5nOCBzZXNzaW9uSWRTdHJpbmcgPSBTdHJpbmc4Ojpmb3JtYXQoIiV1IiwgbU5leHRTZXNzaW9uSWQpOworICAgIG1OZXh0U2Vzc2lvbklkICs9IDE7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICBzZXNzaW9uSWQuYXBwZW5kQXJyYXkoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzZXNzaW9uSWRTdHJpbmcuc3RyaW5nKCkpLAorICAgICAgICAgICAgc2Vzc2lvbklkU3RyaW5nLnNpemUoKSk7CisKKyAgICBtU2Vzc2lvbnMuYWRkKHNlc3Npb25JZCwgbmV3IFNlc3Npb24oc2Vzc2lvbklkKSk7CisgICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uSWQpOworfQorCitjb25zdCBzcDxTZXNzaW9uPiYgU2Vzc2lvbkxpYnJhcnk6OmZpbmRTZXNzaW9uKAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbklkKTsKK30KKworY29uc3Qgc3A8U2Vzc2lvbj4mIFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbigKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKSwgc2l6ZSk7CisgICAgcmV0dXJuIGZpbmRTZXNzaW9uKHNlc3Npb25JZCk7Cit9CisKK3ZvaWQgU2Vzc2lvbkxpYnJhcnk6OmRlc3Ryb3lTZXNzaW9uKGNvbnN0IHNwPFNlc3Npb24+JiBzZXNzaW9uKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7XAorICAgIG1TZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb24tPnNlc3Npb25JZCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Yzg4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX1NFU1NJT05fTElCUkFSWV9IXworI2RlZmluZSBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgU2Vzc2lvbkxpYnJhcnkgeworcHVibGljOgorICAgIHN0YXRpYyBTZXNzaW9uTGlicmFyeSogZ2V0KCk7CisKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgY3JlYXRlU2Vzc2lvbigpOworCisgICAgY29uc3QgYW5kcm9pZDo6c3A8U2Vzc2lvbj4mIGZpbmRTZXNzaW9uKAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgY29uc3QgYW5kcm9pZDo6c3A8U2Vzc2lvbj4mIGZpbmRTZXNzaW9uKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZvaWQgZGVzdHJveVNlc3Npb24oY29uc3QgYW5kcm9pZDo6c3A8U2Vzc2lvbj4mIHNlc3Npb24pOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlc3Npb25MaWJyYXJ5KTsKKworICAgIFNlc3Npb25MaWJyYXJ5KCkgOiBtTmV4dFNlc3Npb25JZCgxKSB7fQorCisgICAgc3RhdGljIGFuZHJvaWQ6Ok11dGV4IHNTaW5nbGV0b25Mb2NrOworICAgIHN0YXRpYyBTZXNzaW9uTGlicmFyeSogc1NpbmdsZXRvbjsKKworICAgIGFuZHJvaWQ6Ok11dGV4IG1TZXNzaW9uc0xvY2s7CisgICAgdWludDMyX3QgbU5leHRTZXNzaW9uSWQ7CisgICAgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8YW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+LCBhbmRyb2lkOjpzcDxTZXNzaW9uPiA+CisgICAgICAgICAgICBtU2Vzc2lvbnM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfU0VTU0lPTl9MSUJSQVJZX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjNjQzYgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmNwcApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBvcGVyYXRvcjwoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsaHMsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmcmhzKSB7CisgICAgaWYgKGxocy5zaXplKCkgPCByaHMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAobGhzLnNpemUoKSA+IHJocy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbWVtY21wKCh2b2lkICopbGhzLmFycmF5KCksICh2b2lkICopcmhzLmFycmF5KCksIHJocy5zaXplKCkpIDwgMDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0MzEyNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfVVRJTFNfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfVVRJTFNfSF8KKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisvLyBBZGQgYSBjb21wYXJpc29uIG9wZXJhdG9yIGZvciB0aGlzIFZlY3RvciBzcGVjaWFsaXphdGlvbiBzbyB0aGF0IGl0IGNhbiBiZQorLy8gdXNlZCBhcyBhIGtleSBpbiBhIEtleWVkVmVjdG9yLgorbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIG9wZXJhdG9yPChjb25zdCBWZWN0b3I8dWludDhfdD4gJmxocywgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyaHMpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KTsKKworI2VuZGlmIC8vIENMRUFSS0VZX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BZXNDdHJEZWNyeXB0b3JVbml0dGVzdC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BZXNDdHJEZWNyeXB0b3JVbml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5ZTQwMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiQWVzQ3RyRGVjcnlwdG9yLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBBZXNDdHJEZWNyeXB0b3JUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIHVpbnQ4X3QgS2V5W2tCbG9ja1NpemVdOworCisgICAgc3RhdHVzX3QgYXR0ZW1wdERlY3J5cHQoY29uc3QgS2V5JiBrZXksIGNvbnN0IEl2JiBpdiwgY29uc3QgdWludDhfdCogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVZlY3RvcjsKKyAgICAgICAga2V5VmVjdG9yLmFwcGVuZEFycmF5KGtleSwga0Jsb2NrU2l6ZSk7CisKKyAgICAgICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKKyAgICAgICAgcmV0dXJuIGRlY3J5cHRvci5kZWNyeXB0KGtleVZlY3RvciwgaXYsIHNvdXJjZSwgZGVzdGluYXRpb24sIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdWJTYW1wbGVzLCBieXRlc0RlY3J5cHRlZE91dCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHNpemVfdCB0b3RhbFNpemU+CisgICAgdm9pZCBhdHRlbXB0RGVjcnlwdEV4cGVjdGluZ1N1Y2Nlc3MoY29uc3QgS2V5JiBrZXksIGNvbnN0IEl2JiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBlbmNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcykgeworICAgICAgICB1aW50OF90IG91dHB1dEJ1ZmZlclt0b3RhbFNpemVdID0ge307CisgICAgICAgIHNpemVfdCBieXRlc0RlY3J5cHRlZCA9IDA7CisgICAgICAgIEFTU0VSVF9FUShhbmRyb2lkOjpPSywgYXR0ZW1wdERlY3J5cHQoa2V5LCBpdiwgZW5jcnlwdGVkLCBvdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNEZWNyeXB0ZWQpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRvdGFsU2l6ZSwgYnl0ZXNEZWNyeXB0ZWQpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKG91dHB1dEJ1ZmZlciwgZGVjcnlwdGVkLCB0b3RhbFNpemUpKTsKKyAgICB9Cit9OworCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNDb250aWd1b3VzRW5jcnlwdGVkQmxvY2spIHsKKyAgICBjb25zdCBzaXplX3Qga1RvdGFsU2l6ZSA9IDY0OworICAgIGNvbnN0IHNpemVfdCBrTnVtU3Vic2FtcGxlcyA9IDE7CisKKyAgICAvLyBUZXN0IHZlY3RvcnMgZnJvbSBOSVNULTgwMC0zOEEKKyAgICBLZXkga2V5ID0geworICAgICAgICAweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAorICAgICAgICAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjCisgICAgfTsKKworICAgIEl2IGl2ID0geworICAgICAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorICAgICAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCisgICAgfTsKKworICAgIHVpbnQ4X3QgZW5jcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweDg3LCAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LAorICAgICAgICAweDFiLCAweGVmLCAweDY4LCAweDY0LCAweDk5LCAweDBkLCAweGI2LCAweGNlLAorICAgICAgICAweDk4LCAweDA2LCAweGY2LCAweDZiLCAweDc5LCAweDcwLCAweGZkLCAweGZmLAorICAgICAgICAweDg2LCAweDE3LCAweDE4LCAweDdiLCAweGI5LCAweGZmLCAweGZkLCAweGZmLAorICAgICAgICAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LCAweGQzLCAweDVlLAorICAgICAgICAweDViLCAweDRmLCAweDA5LCAweDAyLCAweDBkLCAweGIwLCAweDNlLCAweGFiLAorICAgICAgICAweDFlLCAweDAzLCAweDFkLCAweGRhLCAweDJmLCAweGJlLCAweDAzLCAweGQxLAorICAgICAgICAweDc5LCAweDIxLCAweDcwLCAweGEwLCAweGYzLCAweDAwLCAweDljLCAweGVlCisgICAgfTsKKworICAgIHVpbnQ4X3QgZGVjcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweDZiLCAweGMxLCAweGJlLCAweGUyLCAweDJlLCAweDQwLCAweDlmLCAweDk2LAorICAgICAgICAweGU5LCAweDNkLCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhLAorICAgICAgICAweGFlLCAweDJkLCAweDhhLCAweDU3LCAweDFlLCAweDAzLCAweGFjLCAweDljLAorICAgICAgICAweDllLCAweGI3LCAweDZmLCAweGFjLCAweDQ1LCAweGFmLCAweDhlLCAweDUxLAorICAgICAgICAweDMwLCAweGM4LCAweDFjLCAweDQ2LCAweGEzLCAweDVjLCAweGU0LCAweDExLAorICAgICAgICAweGU1LCAweGZiLCAweGMxLCAweDE5LCAweDFhLCAweDBhLCAweDUyLCAweGVmLAorICAgICAgICAweGY2LCAweDlmLCAweDI0LCAweDQ1LCAweGRmLCAweDRmLCAweDliLCAweDE3LAorICAgICAgICAweGFkLCAweDJiLCAweDQxLCAweDdiLCAweGU2LCAweDZjLCAweDM3LCAweDEwCisgICAgfTsKKworICAgIFN1YlNhbXBsZSBzdWJTYW1wbGVzW2tOdW1TdWJzYW1wbGVzXSA9IHsKKyAgICAgICAgezAsIDY0fQorICAgIH07CisKKyAgICBhdHRlbXB0RGVjcnlwdEV4cGVjdGluZ1N1Y2Nlc3M8a1RvdGFsU2l6ZT4oa2V5LCBpdiwgZW5jcnlwdGVkLCBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIGtOdW1TdWJzYW1wbGVzKTsKK30KKworVEVTVF9GKEFlc0N0ckRlY3J5cHRvclRlc3QsIERlY3J5cHRzQWxpZ25lZEJpZnVyY2F0ZWRFbmNyeXB0ZWRCbG9jaykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNjQ7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMjsKKworICAgIC8vIFRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7MCwgMzJ9LAorICAgICAgICB7MCwgMzJ9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNVbmFsaWduZWRCaWZ1cmNhdGVkRW5jcnlwdGVkQmxvY2spIHsKKyAgICBjb25zdCBzaXplX3Qga1RvdGFsU2l6ZSA9IDY0OworICAgIGNvbnN0IHNpemVfdCBrTnVtU3Vic2FtcGxlcyA9IDI7CisKKyAgICAvLyBUZXN0IHZlY3RvcnMgZnJvbSBOSVNULTgwMC0zOEEKKyAgICBLZXkga2V5ID0geworICAgICAgICAweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAorICAgICAgICAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjCisgICAgfTsKKworICAgIEl2IGl2ID0geworICAgICAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorICAgICAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCisgICAgfTsKKworICAgIHVpbnQ4X3QgZW5jcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweDg3LCAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LAorICAgICAgICAweDFiLCAweGVmLCAweDY4LCAweDY0LCAweDk5LCAweDBkLCAweGI2LCAweGNlLAorICAgICAgICAweDk4LCAweDA2LCAweGY2LCAweDZiLCAweDc5LCAweDcwLCAweGZkLCAweGZmLAorICAgICAgICAweDg2LCAweDE3LCAweDE4LCAweDdiLCAweGI5LCAweGZmLCAweGZkLCAweGZmLAorICAgICAgICAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LCAweGQzLCAweDVlLAorICAgICAgICAweDViLCAweDRmLCAweDA5LCAweDAyLCAweDBkLCAweGIwLCAweDNlLCAweGFiLAorICAgICAgICAweDFlLCAweDAzLCAweDFkLCAweGRhLCAweDJmLCAweGJlLCAweDAzLCAweGQxLAorICAgICAgICAweDc5LCAweDIxLCAweDcwLCAweGEwLCAweGYzLCAweDAwLCAweDljLCAweGVlCisgICAgfTsKKworICAgIHVpbnQ4X3QgZGVjcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweDZiLCAweGMxLCAweGJlLCAweGUyLCAweDJlLCAweDQwLCAweDlmLCAweDk2LAorICAgICAgICAweGU5LCAweDNkLCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhLAorICAgICAgICAweGFlLCAweDJkLCAweDhhLCAweDU3LCAweDFlLCAweDAzLCAweGFjLCAweDljLAorICAgICAgICAweDllLCAweGI3LCAweDZmLCAweGFjLCAweDQ1LCAweGFmLCAweDhlLCAweDUxLAorICAgICAgICAweDMwLCAweGM4LCAweDFjLCAweDQ2LCAweGEzLCAweDVjLCAweGU0LCAweDExLAorICAgICAgICAweGU1LCAweGZiLCAweGMxLCAweDE5LCAweDFhLCAweDBhLCAweDUyLCAweGVmLAorICAgICAgICAweGY2LCAweDlmLCAweDI0LCAweDQ1LCAweGRmLCAweDRmLCAweDliLCAweDE3LAorICAgICAgICAweGFkLCAweDJiLCAweDQxLCAweDdiLCAweGU2LCAweDZjLCAweDM3LCAweDEwCisgICAgfTsKKworICAgIFN1YlNhbXBsZSBzdWJTYW1wbGVzW2tOdW1TdWJzYW1wbGVzXSA9IHsKKyAgICAgICAgezAsIDI5fSwKKyAgICAgICAgezAsIDM1fQorICAgIH07CisKKyAgICBhdHRlbXB0RGVjcnlwdEV4cGVjdGluZ1N1Y2Nlc3M8a1RvdGFsU2l6ZT4oa2V5LCBpdiwgZW5jcnlwdGVkLCBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIGtOdW1TdWJzYW1wbGVzKTsKK30KKworVEVTVF9GKEFlc0N0ckRlY3J5cHRvclRlc3QsIERlY3J5cHRzT25lTWl4ZWRTdWJTYW1wbGUpIHsKKyAgICBjb25zdCBzaXplX3Qga1RvdGFsU2l6ZSA9IDcyOworICAgIGNvbnN0IHNpemVfdCBrTnVtU3Vic2FtcGxlcyA9IDE7CisKKyAgICAvLyBCYXNlZCBvbiB0ZXN0IHZlY3RvcnMgZnJvbSBOSVNULTgwMC0zOEEKKyAgICBLZXkga2V5ID0geworICAgICAgICAweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAorICAgICAgICAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjCisgICAgfTsKKworICAgIEl2IGl2ID0geworICAgICAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorICAgICAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCisgICAgfTsKKworICAgIHVpbnQ4X3QgZW5jcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAvLyA4IGNsZWFyIGJ5dGVzCisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIC8vIDY0IGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDg3LCAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LAorICAgICAgICAweDFiLCAweGVmLCAweDY4LCAweDY0LCAweDk5LCAweDBkLCAweGI2LCAweGNlLAorICAgICAgICAweDk4LCAweDA2LCAweGY2LCAweDZiLCAweDc5LCAweDcwLCAweGZkLCAweGZmLAorICAgICAgICAweDg2LCAweDE3LCAweDE4LCAweDdiLCAweGI5LCAweGZmLCAweGZkLCAweGZmLAorICAgICAgICAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LCAweGQzLCAweDVlLAorICAgICAgICAweDViLCAweDRmLCAweDA5LCAweDAyLCAweDBkLCAweGIwLCAweDNlLCAweGFiLAorICAgICAgICAweDFlLCAweDAzLCAweDFkLCAweGRhLCAweDJmLCAweGJlLCAweDAzLCAweGQxLAorICAgICAgICAweDc5LCAweDIxLCAweDcwLCAweGEwLCAweGYzLCAweDAwLCAweDljLCAweGVlCisgICAgfTsKKworICAgIHVpbnQ4X3QgZGVjcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDAwLCAweDY0LCAweDBiLCAweGJiLAorICAgICAgICAweDZiLCAweGMxLCAweGJlLCAweGUyLCAweDJlLCAweDQwLCAweDlmLCAweDk2LAorICAgICAgICAweGU5LCAweDNkLCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhLAorICAgICAgICAweGFlLCAweDJkLCAweDhhLCAweDU3LCAweDFlLCAweDAzLCAweGFjLCAweDljLAorICAgICAgICAweDllLCAweGI3LCAweDZmLCAweGFjLCAweDQ1LCAweGFmLCAweDhlLCAweDUxLAorICAgICAgICAweDMwLCAweGM4LCAweDFjLCAweDQ2LCAweGEzLCAweDVjLCAweGU0LCAweDExLAorICAgICAgICAweGU1LCAweGZiLCAweGMxLCAweDE5LCAweDFhLCAweDBhLCAweDUyLCAweGVmLAorICAgICAgICAweGY2LCAweDlmLCAweDI0LCAweDQ1LCAweGRmLCAweDRmLCAweDliLCAweDE3LAorICAgICAgICAweGFkLCAweDJiLCAweDQxLCAweDdiLCAweGU2LCAweDZjLCAweDM3LCAweDEwCisgICAgfTsKKworICAgIFN1YlNhbXBsZSBzdWJTYW1wbGVzW2tOdW1TdWJzYW1wbGVzXSA9IHsKKyAgICAgICAgezgsIDY0fQorICAgIH07CisKKyAgICBhdHRlbXB0RGVjcnlwdEV4cGVjdGluZ1N1Y2Nlc3M8a1RvdGFsU2l6ZT4oa2V5LCBpdiwgZW5jcnlwdGVkLCBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIGtOdW1TdWJzYW1wbGVzKTsKK30KKworVEVTVF9GKEFlc0N0ckRlY3J5cHRvclRlc3QsIERlY3J5cHRzQWxpZ25lZE1peGVkU3ViU2FtcGxlcykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gODA7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMjsKKworICAgIC8vIEJhc2VkIG9uIHRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgLy8gMzIgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHg5NCwgMHhiYSwgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwKKyAgICAgICAgLy8gMzIgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4OTQsIDB4YmEsIDB4ODgsIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7OCwgMzJ9LAorICAgICAgICB7OCwgMzJ9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNVbmFsaWduZWRNaXhlZFN1YlNhbXBsZXMpIHsKKyAgICBjb25zdCBzaXplX3Qga1RvdGFsU2l6ZSA9IDgwOworICAgIGNvbnN0IHNpemVfdCBrTnVtU3Vic2FtcGxlcyA9IDI7CisKKyAgICAvLyBCYXNlZCBvbiB0ZXN0IHZlY3RvcnMgZnJvbSBOSVNULTgwMC0zOEEKKyAgICBLZXkga2V5ID0geworICAgICAgICAweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAorICAgICAgICAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjCisgICAgfTsKKworICAgIEl2IGl2ID0geworICAgICAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorICAgICAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCisgICAgfTsKKworICAgIHVpbnQ4X3QgZW5jcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAvLyA4IGNsZWFyIGJ5dGVzCisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIC8vIDMwIGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDg3LCAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LAorICAgICAgICAweDFiLCAweGVmLCAweDY4LCAweDY0LCAweDk5LCAweDBkLCAweGI2LCAweGNlLAorICAgICAgICAweDk4LCAweDA2LCAweGY2LCAweDZiLCAweDc5LCAweDcwLCAweGZkLCAweGZmLAorICAgICAgICAweDg2LCAweDE3LCAweDE4LCAweDdiLCAweGI5LCAweGZmLAorICAgICAgICAvLyA4IGNsZWFyIGJ5dGVzCisgICAgICAgIDB4OTQsIDB4YmEsIDB4ODgsIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsCisgICAgICAgIC8vIDM0IGVuY3J5cHRlZCBieXRlcworICAgICAgICAweGZkLCAweGZmLCAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LAorICAgICAgICAweGQzLCAweDVlLCAweDViLCAweDRmLCAweDA5LCAweDAyLCAweDBkLCAweGIwLAorICAgICAgICAweDNlLCAweGFiLCAweDFlLCAweDAzLCAweDFkLCAweGRhLCAweDJmLCAweGJlLAorICAgICAgICAweDAzLCAweGQxLCAweDc5LCAweDIxLCAweDcwLCAweGEwLCAweGYzLCAweDAwLAorICAgICAgICAweDljLCAweGVlCisgICAgfTsKKworICAgIHVpbnQ4X3QgZGVjcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDAwLCAweDY0LCAweDBiLCAweGJiLAorICAgICAgICAweDZiLCAweGMxLCAweGJlLCAweGUyLCAweDJlLCAweDQwLCAweDlmLCAweDk2LAorICAgICAgICAweGU5LCAweDNkLCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhLAorICAgICAgICAweGFlLCAweDJkLCAweDhhLCAweDU3LCAweDFlLCAweDAzLCAweGFjLCAweDljLAorICAgICAgICAweDllLCAweGI3LCAweDZmLCAweGFjLCAweDQ1LCAweGFmLCAweDk0LCAweGJhLAorICAgICAgICAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LCAweDhlLCAweDUxLAorICAgICAgICAweDMwLCAweGM4LCAweDFjLCAweDQ2LCAweGEzLCAweDVjLCAweGU0LCAweDExLAorICAgICAgICAweGU1LCAweGZiLCAweGMxLCAweDE5LCAweDFhLCAweDBhLCAweDUyLCAweGVmLAorICAgICAgICAweGY2LCAweDlmLCAweDI0LCAweDQ1LCAweGRmLCAweDRmLCAweDliLCAweDE3LAorICAgICAgICAweGFkLCAweDJiLCAweDQxLCAweDdiLCAweGU2LCAweDZjLCAweDM3LCAweDEwCisgICAgfTsKKworICAgIFN1YlNhbXBsZSBzdWJTYW1wbGVzW2tOdW1TdWJzYW1wbGVzXSA9IHsKKyAgICAgICAgezgsIDMwfSwKKyAgICAgICAgezgsIDM0fQorICAgIH07CisKKyAgICBhdHRlbXB0RGVjcnlwdEV4cGVjdGluZ1N1Y2Nlc3M8a1RvdGFsU2l6ZT4oa2V5LCBpdiwgZW5jcnlwdGVkLCBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIGtOdW1TdWJzYW1wbGVzKTsKK30KKworVEVTVF9GKEFlc0N0ckRlY3J5cHRvclRlc3QsIERlY3J5cHRzQ29tcGxleE1peGVkU3ViU2FtcGxlcykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNzI7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gNjsKKworICAgIC8vIEJhc2VkIG9uIHRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIC8vIDQgY2xlYXIgYnl0ZXMKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywKKyAgICAgICAgLy8gMSBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg4NywKKyAgICAgICAgLy8gOSBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwgMHgxYiwKKyAgICAgICAgMHhlZiwKKyAgICAgICAgLy8gMTEgY2xlYXIgYnl0ZXMKKyAgICAgICAgMHg4MSwgMHg0ZiwgMHgyNCwgMHg4NywgMHgwZSwgMHhkZSwgMHhiYSwgMHhhZCwKKyAgICAgICAgMHgxMSwgMHg5YiwgMHg0NiwKKyAgICAgICAgLy8gMjAgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsCisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHg5NCwgMHhiYSwgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwKKyAgICAgICAgLy8gMyBjbGVhciBieXRlcworICAgICAgICAweDEwLCAweGY1LCAweDIyLAorICAgICAgICAvLyAxNCBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHhmZCwgMHhmZiwgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwKKyAgICAgICAgMHhkMywgMHg1ZSwgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwKKyAgICAgICAgLy8gMiBjbGVhciBieXRlcworICAgICAgICAweDAyLCAweDAxCisgICAgfTsKKworICAgIHVpbnQ4X3QgZGVjcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDZiLCAweGMxLCAweGJlLCAweGUyLAorICAgICAgICAweDJlLCAweDQwLCAweDlmLCAweDk2LCAweGU5LCAweDNkLCAweDgxLCAweDRmLAorICAgICAgICAweDI0LCAweDg3LCAweDBlLCAweGRlLCAweGJhLCAweGFkLCAweDExLCAweDliLAorICAgICAgICAweDQ2LCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhLCAweGFlLAorICAgICAgICAweDJkLCAweDhhLCAweDU3LCAweDFlLCAweDAzLCAweGFjLCAweDljLCAweDllLAorICAgICAgICAweGI3LCAweDZmLCAweGFjLCAweDQ1LCAweGFmLCAweDk0LCAweGJhLCAweDg4LAorICAgICAgICAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LCAweDEwLCAweGY1LCAweDIyLAorICAgICAgICAweDhlLCAweDUxLCAweDMwLCAweGM4LCAweDFjLCAweDQ2LCAweGEzLCAweDVjLAorICAgICAgICAweGU0LCAweDExLCAweGU1LCAweGZiLCAweGMxLCAweDE5LCAweDAyLCAweDAxCisgICAgfTsKKworICAgIFN1YlNhbXBsZSBzdWJTYW1wbGVzW2tOdW1TdWJzYW1wbGVzXSA9IHsKKyAgICAgICAgezQsIDF9LAorICAgICAgICB7MCwgOX0sCisgICAgICAgIHsxMSwgMjB9LAorICAgICAgICB7OCwgMH0sCisgICAgICAgIHszLCAxNH0sCisgICAgICAgIHsyLCAwfQorICAgIH07CisKKyAgICBhdHRlbXB0RGVjcnlwdEV4cGVjdGluZ1N1Y2Nlc3M8a1RvdGFsU2l6ZT4oa2V5LCBpdiwgZW5jcnlwdGVkLCBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIGtOdW1TdWJzYW1wbGVzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzViYjIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDUyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkcyBDbGVhcktleSBEcm0gVGVzdHMKKyMKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gQ2xlYXJLZXlEcm1Vbml0VGVzdAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBBZXNDdHJEZWNyeXB0b3JVbml0dGVzdC5jcHAgXAorICAgIEluaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwIFwKKyAgICBKc29uV2ViS2V5VW5pdHRlc3QuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgYmlvbmljIFwKKyAgICBleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9qc21uIFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCisgICAgZnJhbWV3b3Jrcy9hdi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleSBcCisgICAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGliZ3Rlc3QgXAorICAgIGxpYmd0ZXN0X21haW4gXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjcnlwdG8gXAorICAgIGxpYmRybWNsZWFya2V5cGx1Z2luIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgIGxpYnN0bHBvcnQgXAorICAgIGxpYnV0aWxzIFwKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmE2NWVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSB7CisgICAgY29uc3Qgc2l6ZV90IGtLZXlJZFNpemUgPSAxNjsKKyAgICBjb25zdCBTdHJpbmc4IGtDZW5jVHlwZSgiY2VuYyIpOworICAgIGNvbnN0IFN0cmluZzgga1dlYk1UeXBlKCJ3ZWJtIik7CisgICAgY29uc3QgU3RyaW5nOCBrQmFzZTY0UGFkZGluZygiPSIpOworfQorCitjbGFzcyBJbml0RGF0YVBhcnNlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHN0YXR1c190IGF0dGVtcHRQYXJzZShjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpIHsKKyAgICAgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBpbml0RGF0YVR5cGUsIGxpY2Vuc2VSZXF1ZXN0KTsKKyAgICB9CisKKyAgICB2b2lkIGF0dGVtcHRQYXJzZUV4cGVjdGluZ1N1Y2Nlc3MoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nOD4mIGV4cGVjdGVkS2V5cykgeworICAgICAgICBjb25zdCBTdHJpbmc4IGtSZXF1ZXN0UHJlZml4KCJ7XCJraWRzXCI6WyIpOworICAgICAgICBjb25zdCBTdHJpbmc4IGtSZXF1ZXN0U3VmZml4KCJdLFwidHlwZVwiOlwidGVtcG9yYXJ5XCJ9Iik7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OworICAgICAgICBBU1NFUlRfRVEoYW5kcm9pZDo6T0ssIGF0dGVtcHRQYXJzZShpbml0RGF0YSwgaW5pdERhdGFUeXBlLCAmcmVxdWVzdCkpOworCisgICAgICAgIFN0cmluZzggcmVxdWVzdFN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyZXF1ZXN0LmFycmF5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoMCwgcmVxdWVzdFN0cmluZy5maW5kKGtSZXF1ZXN0UHJlZml4KSk7CisgICAgICAgIEVYUEVDVF9FUShyZXF1ZXN0U3RyaW5nLnNpemUoKSAtIGtSZXF1ZXN0U3VmZml4LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdHJpbmcuZmluZChrUmVxdWVzdFN1ZmZpeCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4cGVjdGVkS2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQVN0cmluZyBlbmNvZGVkSWRBU3RyaW5nOworICAgICAgICAgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0KGV4cGVjdGVkS2V5c1tpXSwga0tleUlkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RlZElkQVN0cmluZyk7CisgICAgICAgICAgICBTdHJpbmc4IGVuY29kZWRJZChlbmNvZGVkSWRBU3RyaW5nLmNfc3RyKCkpOworICAgICAgICAgICAgZW5jb2RlZElkLnJlbW92ZUFsbChrQmFzZTY0UGFkZGluZyk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShyZXF1ZXN0U3RyaW5nLmNvbnRhaW5zKGVuY29kZWRJZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhdHRlbXB0UGFyc2VFeHBlY3RpbmdGYWlsdXJlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSkgeworICAgICAgICBWZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKKyAgICAgICAgQVNTRVJUX05FKGFuZHJvaWQ6Ok9LLCBhdHRlbXB0UGFyc2UoaW5pdERhdGEsIGluaXREYXRhVHlwZSwgJnJlcXVlc3QpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIHJlcXVlc3Quc2l6ZSgpKTsKKyAgICB9Cit9OworCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBQYXJzZXNTaW5nbGVLZXlQc3NoKSB7CisgICAgdWludDhfdCBwc3NoWzUyXSA9IHsKKyAgICAgICAgMCwgMCwgMCwgNTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgU2l6ZQorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQU1NICisgICAgICAgIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwgLy8gU3lzdGVtIElECisgICAgICAgIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgICAgIDAsIDAsIDAsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBDb3VudAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQgIzEKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICAgICAgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBTaXplIChhbHdheXMgMCkKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShwc3NoLCA1Mik7CisKKyAgICBWZWN0b3I8U3RyaW5nOD4gZXhwZWN0ZWRLZXlzOworICAgIGV4cGVjdGVkS2V5cy5wdXNoKFN0cmluZzgoIjAxMjM0NTY3ODkwQUJDREUiKSk7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdTdWNjZXNzKGluaXREYXRhLCBrQ2VuY1R5cGUsIGV4cGVjdGVkS2V5cyk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIFBhcnNlc011bHRpcGxlS2V5UHNzaCkgeworICAgIHVpbnQ4X3QgcHNzaFs4NF0gPSB7CisgICAgICAgIDAsIDAsIDAsIDg0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFNpemUKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFNTSAorICAgICAgICAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsIC8vIFN5c3RlbSBJRAorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLAorICAgICAgICAwLCAwLCAwLCAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgQ291bnQKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElEICMxCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgICAgIDB4NDMsIDB4NmMsIDB4NjUsIDB4NjEsIDB4NzIsIDB4NGIsIDB4NjUsIDB4NzksIC8vIEtleSBJRCAjMgorICAgICAgICAweDQzLCAweDZjLCAweDY1LCAweDYxLCAweDcyLCAweDRiLCAweDY1LCAweDc5LCAvLyAgICJDbGVhcktleUNsZWFyS2V5IgorICAgICAgICAweDIwLCAweDQ3LCAweDRmLCAweDRmLCAweDQ3LCAweDRjLCAweDQ1LCAweDIwLCAvLyBLZXkgSUQgIzMKKyAgICAgICAgMHgyMCwgMHg0NywgMHg0ZiwgMHg0ZiwgMHg0NywgMHg0YywgMHg0NSwgMHgyMCwgLy8gICAiIEdPT0dMRSAgR09PR0xFICIKKyAgICAgICAgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBTaXplIChhbHdheXMgMCkKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShwc3NoLCA4NCk7CisKKyAgICBWZWN0b3I8U3RyaW5nOD4gZXhwZWN0ZWRLZXlzOworICAgIGV4cGVjdGVkS2V5cy5wdXNoKFN0cmluZzgoIjAxMjM0NTY3ODkwQUJDREUiKSk7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiQ2xlYXJLZXlDbGVhcktleSIpKTsKKyAgICBleHBlY3RlZEtleXMucHVzaChTdHJpbmc4KCIgR09PR0xFICBHT09HTEUgIikpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nU3VjY2Vzcyhpbml0RGF0YSwga0NlbmNUeXBlLCBleHBlY3RlZEtleXMpOworfQorCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBQYXJzZXNXZWJNKSB7CisgICAgdWludDhfdCBpbml0RGF0YVJhd1sxNl0gPSB7CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRAorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KGluaXREYXRhUmF3LCAxNik7CisKKyAgICBWZWN0b3I8U3RyaW5nOD4gZXhwZWN0ZWRLZXlzOworICAgIGV4cGVjdGVkS2V5cy5wdXNoKFN0cmluZzgoIjAxMjM0NTY3ODkwQUJDREUiKSk7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdTdWNjZXNzKGluaXREYXRhLCBrV2ViTVR5cGUsIGV4cGVjdGVkS2V5cyk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaFRvb1NtYWxsKSB7CisgICAgdWludDhfdCBwc3NoWzE2XSA9IHsKKyAgICAgICAgMCwgMCwgMCwgNTIsCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywKKyAgICAgICAgMSwgMCwgMCwgMCwKKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYworICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDE2KTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yV2ViTVRvb1NtYWxsKSB7CisgICAgdWludDhfdCBpbml0RGF0YVJhd1s4XSA9IHsKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNworICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KGluaXREYXRhUmF3LCA4KTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtXZWJNVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaEJhZFN5c3RlbUlkKSB7CisgICAgdWludDhfdCBwc3NoWzUyXSA9IHsKKyAgICAgICAgMCwgMCwgMCwgNTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgU2l6ZQorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQU1NICisgICAgICAgIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwgLy8gU3lzdGVtIElECisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsCisgICAgICAgIDAsIDAsIDAsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBDb3VudAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQgIzEKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICAgICAgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBTaXplIChhbHdheXMgMCkKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShwc3NoLCA1Mik7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdGYWlsdXJlKGluaXREYXRhLCBrQ2VuY1R5cGUpOworfQorCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBGYWlsc0ZvclBzc2hCYWRTaXplKSB7CisgICAgdWludDhfdCBwc3NoWzUyXSA9IHsKKyAgICAgICAgMCwgMCwgNzAsIDIwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgU2l6ZQorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQU1NICisgICAgICAgIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwgLy8gU3lzdGVtIElECisgICAgICAgIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgICAgIDAsIDAsIDAsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBDb3VudAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQgIzEKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICAgICAgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBTaXplIChhbHdheXMgMCkKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShwc3NoLCA1Mik7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdGYWlsdXJlKGluaXREYXRhLCBrQ2VuY1R5cGUpOworfQorCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBGYWlsc0ZvclBzc2hXcm9uZ1ZlcnNpb24pIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaEJhZEtleUNvdW50KSB7CisgICAgdWludDhfdCBwc3NoWzUyXSA9IHsKKyAgICAgICAgMCwgMCwgMCwgNTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgU2l6ZQorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQU1NICisgICAgICAgIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwgLy8gU3lzdGVtIElECisgICAgICAgIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgICAgIDAsIDAsIDAsIDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBDb3VudAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQgIzEKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICAgICAgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBTaXplIChhbHdheXMgMCkKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShwc3NoLCA1Mik7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdGYWlsdXJlKGluaXREYXRhLCBrQ2VuY1R5cGUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjBkODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkpzb25XZWJLZXkuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Cit1c2luZyBhbmRyb2lkOjpWZWN0b3I7CisKK2NsYXNzIEpzb25XZWJLZXlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAgIEpzb25XZWJLZXkqIGp3azsKKworICAgIEpzb25XZWJLZXlUZXN0KCkgeworICAgICAgICBqd2sgPSBuZXcgSnNvbldlYktleTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5Kc29uV2ViS2V5VGVzdCgpIHsKKyAgICAgICAgaWYgKGp3aykKKyAgICAgICAgICAgIGRlbGV0ZSBqd2s7CisgICAgfQorfTsKKwordm9pZCBzdHJpbmdGcm9tVmVjdG9yKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCisgICAgICAgIFN0cmluZzgqIGNvbnZlcnRlZCkgeworICAgIGNvbnZlcnRlZC0+Y2xlYXIoKTsKKyAgICBpZiAoaW5wdXQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnZlcnRlZC0+YXBwZW5kRm9ybWF0KCIlYyIsIGlucHV0Lml0ZW1BdChpKSk7CisgICAgfQorfQorCit2b2lkIHZlcmlmeUtleXMoY29uc3QgS2V5TWFwJiBrZXlzLCBjb25zdCBTdHJpbmc4KiBjbGVhcktleXMpIHsKKyAgICBpZiAoa2V5cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZzgga2V5U3RyaW5nOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICBzdHJpbmdGcm9tVmVjdG9yKGtleXMudmFsdWVBdChpKSwgJmtleVN0cmluZyk7CisgICAgICAgIEVYUEVDVF9FUShrZXlTdHJpbmcsIGNsZWFyS2V5c1tpXSk7CisgICAgfQorfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE5vU3ltbWV0cmljS2V5KSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJyc2FcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeFwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiMS1HYXdnZ3VGeUdyV0thdjdBWDRWS1VnXCIiCisgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfRkFMU0UoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuaXNFbXB0eSgpKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBOb0tleXNUYWcpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCIxLUdhd2dndUZ5R3JXS2F2N0FYNFZLVWdcIiIKKyAgICAgICAgICAgICAgICAifSwiCisgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzJcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeVwiIgorICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfRkFMU0UoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuaXNFbXB0eSgpKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBOb0tleUlkKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJU0U9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeVwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX1RSVUUoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuc2l6ZSgpID09IDEpOworCisgICAgY29uc3QgU3RyaW5nOCBjbGVhcktleXMoIkdvb2QgZGF5ISIpOworICAgIHZlcmlmeUtleXMoa2V5cywgJmNsZWFyS2V5cyk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgTm9LZXkpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJgXCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeVwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX1RSVUUoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuc2l6ZSgpID09IDEpOworCisgICAgY29uc3QgU3RyaW5nOCBjbGVhcktleXMoIkdvb2QgZGF5ISIpOworICAgIHZlcmlmeUtleXMoa2V5cywgJmNsZWFyS2V5cyk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgTWFsZm9ybWVkS2V5KSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIkdhd2dndUZ5R3JXS2F2N0FYNFY/Pz9cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiNjdlZjBnZDhwdmZkMD1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiR2F3Z2d1RnlHcldLYXY3QVg0Vj8/P1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6IgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiOlwiR2F3Z2d1RnlHcldLYXY3QVg0Vj8/P1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCI2N2VmMGdkOHB2ZmQwPVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9UUlVFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAxKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzKCJHb29kIGRheSEiKTsKKyAgICB2ZXJpZnlLZXlzKGtleXMsICZjbGVhcktleXMpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIEVtcHR5SnNvbldlYktleSkgeworICAgIGNvbnN0IFN0cmluZzgganM7CisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX0ZBTFNFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLmlzRW1wdHkoKSk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgTWFsZm9ybWVkSnNvbldlYktleSkgeworICAgIC8vIE1pc3NpbmcgYmVnaW4gYXJyYXkgJ1snCisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiR2F3Z2d1RnlHcldLYXY3QVg0VktVZ1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCI2N2VmMGdkOHB2ZmQwPVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICJdIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9GQUxTRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5pc0VtcHR5KCkpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIFNhbWVLZXlJZCkgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVNFXCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJUVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeFwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpOworICAgIEVYUEVDVF9UUlVFKGtleXMuc2l6ZSgpID09IDIpOworCisgICAgY29uc3QgU3RyaW5nOCBjbGVhcktleXNbXSA9CisgICAgICAgICAgICB7IFN0cmluZzgoIkhlbGxvIEZyaWVuZCEiKSwgU3RyaW5nOCgiR29vZCBkYXkhIikgfTsKKyAgICB2ZXJpZnlLZXlzKGtleXMsIGNsZWFyS2V5cyk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgRXh0cmFjdFdlbGxGb3JtZWRLZXlzKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lRXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzNcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXpcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cyk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMik7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5c1tdID0KKyAgICAgICAgICAgIHsgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISIpLCBTdHJpbmc4KCJHb29kIGRheSEiKSB9OworICAgIHZlcmlmeUtleXMoa2V5cywgY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBFeHRyYWN0S2V5cykgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVNFXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJUVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcInJzYVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1ctcnNhXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwicnNhLTY3ZWYwZ2Q4cHZmZDA9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXM1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBelwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cyk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMyk7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5c1tdID0KKyAgICAgICAgICAgIHsgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISEiKSwgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISIpLAorICAgICAgICAgICAgICBTdHJpbmc4KCJHb29kIGRheSEiKSB9OworICAgIHZlcmlmeUtleXMoa2V5cywgY2xlYXJLZXlzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKaW5kZXggYWRhMjNhMi4uMjZjMjQ1YiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5tawpAQCAtMjEsNyArMjEsOCBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGlibW9ja2RybWNyeXB0b3BsdWdpbgogCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX1NIQVJFRF9MSUJSQVJJRVMpL21lZGlhZHJtCitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gbWVkaWFkcm0KIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlidXRpbHMgbGlibG9nCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmNwcAppbmRleCBkZjBiY2EzLi4yZWE1NTRiIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAKQEAgLTI5OSw2ICsyOTksMTIgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIHN0YXR1c190IE1vY2tEcm1QbHVnaW46OnVucHJvdmlzaW9uRGV2aWNlKCkKKyAgICB7CisgICAgICAgIEFMT0dEKCJNb2NrRHJtUGx1Z2luOjp1bnByb3Zpc2lvbkRldmljZSgpIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICBzdGF0dXNfdCBNb2NrRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTcyNiw3ICs3MzIsNyBAQAogICAgIHsKICAgICAgICAgU3RyaW5nOCByZXN1bHQ7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJbJWRdIHtjbGVhcjolZCwgZW5jcnlwdGVkOiVkfSAiLCBpLAorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiWyV6dV0ge2NsZWFyOiV6dSwgZW5jcnlwdGVkOiV6dX0gIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oCmluZGV4IDk3ZDcwNTIuLjRiNjMyOTkgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oCkBAIC04NSw2ICs4NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKIAorICAgICAgICBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpOworCiAgICAgICAgIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKTsKICAgICAgICAgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAppbmRleCA3OTY4MmI4Li4yYjYwODQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaApAQCAtNzQsNiArNzQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkKTsKIAorICAgIHN0YXRpYyAgc3RhdHVzX3QgIGNvbm5lY3RMZWdhY3koaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgc3A8Q2FtZXJhPiYgY2FtZXJhKTsKKwogICAgICAgICAgICAgdmlydHVhbCAgICAgfkNhbWVyYSgpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICByZWNvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAppbmRleCBkNTIxNTQzLi5jNjA3NGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCkBAIC0xMDIsNiArMTAyLDEyIEBACiAgICAgdm9pZCBkdW1wKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFZlY3RvciBjb250YWluaW5nIHRoZSBzdXBwb3J0ZWQgcHJldmlldyBmb3JtYXRzCisgICAgICogYXMgZW51bXMgZ2l2ZW4gaW4gZ3JhcGhpY3MuaC4KKyAgICAgKi8KKyAgICB2b2lkIGdldFN1cHBvcnRlZFByZXZpZXdGb3JtYXRzKFZlY3RvcjxpbnQ+JiBmb3JtYXRzKSBjb25zdDsKKwogICAgIC8vIFBhcmFtZXRlciBrZXlzIHRvIGNvbW11bmljYXRlIGJldHdlZW4gY2FtZXJhIGFwcGxpY2F0aW9uIGFuZCBkcml2ZXIuCiAgICAgLy8gVGhlIGFjY2VzcyAocmVhZC93cml0ZSwgcmVhZCBvbmx5LCBvciB3cml0ZSBvbmx5KSBpcyB2aWV3ZWQgZnJvbSB0aGUKICAgICAvLyBwZXJzcGVjdGl2ZSBvZiBhcHBsaWNhdGlvbnMsIG5vdCBkcml2ZXIuCkBAIC02NzQsNiArNjgwLDEzIEBACiAgICAgLy8gSGlnaC1keW5hbWljIHJhbmdlIG1vZGUKICAgICBzdGF0aWMgY29uc3QgY2hhciBMSUdIVEZYX0hEUltdOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGhlIHN1cHBvcnRlZCBwcmV2aWV3IGZvcm1hdHMgYXMgYW4gZW51bSBnaXZlbiBpbiBncmFwaGljcy5oCisgICAgICogY29ycnNwb25kaW5nIHRvIHRoZSBmb3JtYXQgZ2l2ZW4gaW4gdGhlIGlucHV0IHN0cmluZyBvciAtMSBpZiBubyBzdWNoCisgICAgICogY29udmVyc2lvbiBleGlzdHMuCisgICAgICovCisgICAgc3RhdGljIGludCBwcmV2aWV3Rm9ybWF0VG9FbnVtKGNvbnN0IGNoYXIqIGZvcm1hdCk7CisKIHByaXZhdGU6CiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPFN0cmluZzgsU3RyaW5nOD4gICAgbU1hcDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZmMDVkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NBTUVSQV9DTElFTlRfQ0FNRVJBVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX0NBTUVSQV9DTElFTlRfQ0FNRVJBVVRJTFNfSAorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENhbWVyYVV0aWxzIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgbmF0aXZlCisgKiBjYW1lcmEgY2xpZW50LCBhbmQgdGhlIGNhbWVyYSBzZXJ2aWNlLgorICovCitjbGFzcyBDYW1lcmFVdGlscyB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBBTmF0aXZlV2luZG93IHRyYW5zZm9ybSBmcm9tIHRoZSBzdGF0aWMgY2FtZXJhCisgICAgICAgICAqIG1ldGFkYXRhLiAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgc2Vuc29yIG9yaWVudGF0aW9uIGFuZCBsZW5zIGZhY2luZworICAgICAgICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBjYW1lcmEgZGV2aWNlLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRSb3RhdGlvblRyYW5zZm9ybShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgICAgICAgICAvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKTsKKyAgICBwcml2YXRlOgorICAgICAgICBDYW1lcmFVdGlscygpOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworCisjZW5kaWYgLyogQU5EUk9JRF9DQU1FUkFfQ0xJRU5UX0NBTUVSQVVUSUxTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTdkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DQVBUVVJFUkVTVUxUX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQVBUVVJFUkVTVUxUX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENhcHR1cmVSZXN1bHRFeHRyYXMgaXMgYSBzdHJ1Y3R1cmUgdG8gZW5jYXBzdWxhdGUgdmFyaW91cyBpbmRpY2VzIGZvciBhIGNhcHR1cmUgcmVzdWx0LgorICogVGhlc2UgaW5kaWNlcyBhcmUgZnJhbWV3b3JrLWludGVybmFsIGFuZCBub3Qgc2VudCB0byB0aGUgSEFMLgorICovCitzdHJ1Y3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyB7CisgICAgLyoqCisgICAgICogQW4gaW50ZWdlciB0byBpbmRleCB0aGUgcmVxdWVzdCBzZXF1ZW5jZSB0aGF0IHRoaXMgcmVzdWx0IGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgaW50MzJfdCByZXF1ZXN0SWQ7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHRvIGluZGV4IHRoaXMgcmVzdWx0IGluc2lkZSBhIHJlcXVlc3Qgc2VxdWVuY2UsIHN0YXJ0aW5nIGZyb20gMC4KKyAgICAgKi8KKyAgICBpbnQzMl90IGJ1cnN0SWQ7CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IGFmVHJpZ2dlcklkOworCisgICAgLyoqCisgICAgICogVE9ETzogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgZmllbGQuCisgICAgICovCisgICAgaW50MzJfdCBwcmVjYXB0dXJlVHJpZ2dlcklkOworCisgICAgLyoqCisgICAgICogQSA2NGJpdCBpbnRlZ2VyIHRvIGluZGV4IHRoZSBmcmFtZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzdWx0LgorICAgICAqLworICAgIGludDY0X3QgZnJhbWVOdW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFydGlhbCByZXN1bHQgY291bnQgKGluZGV4KSBmb3IgdGhpcyBjYXB0dXJlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHBhcnRpYWxSZXN1bHRDb3VudDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGluaXRpYWxpemVzIG9iamVjdCBhcyBpbnZhbGlkIGJ5IHNldHRpbmcgcmVxdWVzdElkIHRvIGJlIC0xLgorICAgICAqLworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKQorICAgICAgICA6IHJlcXVlc3RJZCgtMSksCisgICAgICAgICAgYnVyc3RJZCgwKSwKKyAgICAgICAgICBhZlRyaWdnZXJJZCgwKSwKKyAgICAgICAgICBwcmVjYXB0dXJlVHJpZ2dlcklkKDApLAorICAgICAgICAgIGZyYW1lTnVtYmVyKDApLAorICAgICAgICAgIHBhcnRpYWxSZXN1bHRDb3VudCgwKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgaXQncyBhIHZhbGlkIENhcHR1cmVSZXN1bHRFeHRyYXMgb2JqZWN0LgorICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS4gSXQgaXMgdmFsaWQgb25seSB3aGVuIHJlcXVlc3RJZCBpcyBub24tbmVnYXRpdmUuCisgICAgICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICByZWFkRnJvbVBhcmNlbChQYXJjZWwqIHBhcmNlbCk7CisgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Q7Cit9OworCitzdHJ1Y3QgQ2FwdHVyZVJlc3VsdCA6IHB1YmxpYyB2aXJ0dWFsIExpZ2h0UmVmQmFzZTxDYXB0dXJlUmVzdWx0PiB7CisgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgbU1ldGFkYXRhOworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgICAgIG1SZXN1bHRFeHRyYXM7CisKKyAgICBDYXB0dXJlUmVzdWx0KCk7CisKKyAgICBDYXB0dXJlUmVzdWx0KGNvbnN0IENhcHR1cmVSZXN1bHQmIG90aGVyUmVzdWx0KTsKKworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCogcGFyY2VsKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKK307CisKK30KKworI2VuZGlmIC8qIEFORFJPSURfSEFSRFdBUkVfQ0FQVFVSRVJFU1VMVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaAppbmRleCBmMzQyMTIyLi5mN2YwNmJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKQEAgLTMxLDYgKzMxLDggQEAKIGNsYXNzIElDYW1lcmFEZXZpY2VVc2VyOwogY2xhc3MgSUNhbWVyYURldmljZUNhbGxiYWNrczsKIGNsYXNzIENhbWVyYU1ldGFkYXRhOworY2xhc3MgVmVuZG9yVGFnRGVzY3JpcHRvcjsKK2NsYXNzIFN0cmluZzE2OwogCiBjbGFzcyBJQ2FtZXJhU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CkBAIC00NywyMSArNDksNDAgQEAKICAgICAgICAgQUREX0xJU1RFTkVSLAogICAgICAgICBSRU1PVkVfTElTVEVORVIsCiAgICAgICAgIEdFVF9DQU1FUkFfQ0hBUkFDVEVSSVNUSUNTLAorICAgICAgICBHRVRfQ0FNRVJBX1ZFTkRPUl9UQUdfREVTQ1JJUFRPUiwKKyAgICAgICAgR0VUX0xFR0FDWV9QQVJBTUVURVJTLAorICAgICAgICBTVVBQT1JUU19DQU1FUkFfQVBJLAorICAgICAgICBDT05ORUNUX0xFR0FDWSwKICAgICB9OwogCiAgICAgZW51bSB7CiAgICAgICAgIFVTRV9DQUxMSU5HX1VJRCA9IC0xCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBBUElfVkVSU0lPTl8xID0gMSwKKyAgICAgICAgQVBJX1ZFUlNJT05fMiA9IDIsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEID0gLTEKKyAgICAgIH07CisKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENhbWVyYVNlcnZpY2UpOwogCiAgICAgdmlydHVhbCBpbnQzMl90ICBnZXROdW1iZXJPZkNhbWVyYXMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSA9IDA7CisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSA9IDA7CisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpID0gMDsKIAogICAgIC8vIFJldHVybnMgJ09LJyBpZiBvcGVyYXRpb24gc3VjY2VlZGVkCiAgICAgLy8gLSBFcnJvcnM6IEFMUkVBRFlfRVhJU1RTIGlmIHRoZSBsaXN0ZW5lciB3YXMgYWxyZWFkeSBhZGRlZApAQCAtOTcsNiArMTE4LDMwIEBACiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVVzZXI+JiBkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGVnYWN5UGFyYW1ldGVycygKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIE9LIGlmIGRldmljZSBzdXBwb3J0cyBjYW1lcmEyIGFwaSwKKyAgICAgKiByZXR1cm5zIC1FT1BOT1RTVVBQIGlmIGl0IGRvZXNuJ3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0NhbWVyYUFwaSgKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pID0gMDsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdGhlIGRldmljZSBhcyBhIGxlZ2FjeSBkZXZpY2UgZm9yIGEgZ2l2ZW4gSEFMIHZlcnNpb24uCisgICAgICogRm9yIGhhbFZlcnNpb24sIHVzZSBDQU1FUkFfQVBJX0RFVklDRV9WRVJTSU9OXyogZm9yIGEgcGFydGljdWxhcgorICAgICAqIHZlcnNpb24sIG9yIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgZm9yIGEgc2VydmljZS1zZWxlY3RlZCB2ZXJzaW9uLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdExlZ2FjeShjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGludCBjbGllbnRVaWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmggYi9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1OGFjZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVkVORE9SX1RBR19ERVNDUklQVE9SX0gKKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX3ZlbmRvcl90YWdzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXJjZWw7CisKKy8qKgorICogVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3RzIGFyZSBwYXJjZWxhYmxlIGNvbnRhaW5lcnMgZm9yIHRoZSB2ZW5kb3IgdGFnCisgKiBkZWZpbml0aW9ucyBwcm92aWRlZCwgYW5kIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBwYXNzIHRoZSB2ZW5kb3IgdGFnCisgKiBpbmZvcm1hdGlvbiBlbnVtZXJhdGVkIGJ5IHRoZSBIQUwgdG8gY2xpZW50cyBvZiB0aGUgY2FtZXJhIHNlcnZpY2UuCisgKi8KK2NsYXNzIFZlbmRvclRhZ0Rlc2NyaXB0b3IKKyAgICAgICAgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyAnZ2V0KicgbWV0aG9kcyBpbXBsZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICogZnVuY3Rpb25zIGRlZmluZWQgaW4KKyAgICAgICAgICogc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlL3N5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaAorICAgICAgICAgKi8KKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmVuZG9yIHRhZ3MgZGVmaW5lZC4KKyAgICAgICAgaW50IGdldFRhZ0NvdW50KCkgY29uc3Q7CisKKyAgICAgICAgLy8gUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBpZCdzIG9mIHZlbmRvciB0YWdzIGRlZmluZWQuCisgICAgICAgIHZvaWQgZ2V0VGFnQXJyYXkodWludDMyX3QqIHRhZ0FycmF5KSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBzZWN0aW9uIG5hbWUgc3RyaW5nIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGNvbnN0IGNoYXIqIGdldFNlY3Rpb25OYW1lKHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgdGFnIG5hbWUgc3RyaW5nIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGNvbnN0IGNoYXIqIGdldFRhZ05hbWUodWludDMyX3QgdGFnKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB0YWcgdHlwZSBmb3IgYSBnaXZlbiB2ZW5kb3IgdGFnIGlkLgorICAgICAgICBpbnQgZ2V0VGFnVHlwZSh1aW50MzJfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgaW50byB0aGUgZ2l2ZW4gcGFyY2VsLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIFBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCBhIHZlY3RvciBjb250YWluaW5nIGFsbCB2ZW5kb3IgdGFnCisgICAgICAgICAqIHNlY3Rpb25zLCBvciBhbiBlbXB0eSB2ZWN0b3IgaWYgbm9uZSBhcmUgZGVmaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBnZXRBbGxTZWN0aW9uTmFtZXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogTG9va3VwIHRoZSB0YWcgaWQgZm9yIGEgZ2l2ZW4gdGFnIG5hbWUgYW5kIHNlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgbG9va3VwVGFnKFN0cmluZzggbmFtZSwgU3RyaW5nOCBzZWN0aW9uLCAvKm91dCovdWludDMyX3QqIHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIER1bXAgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHZlbmRvciB0YWdzIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdDsKKworICAgICAgICAvLyBTdGF0aWMgbWV0aG9kczoKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gcGFyY2VsLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHZlbmRvcl90YWdfb3BzX3QKKyAgICAgICAgICogc3RydWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcyhjb25zdCB2ZW5kb3JfdGFnX29wc190KiB2T3BzLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdG8gdXNlIGZvciB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqIENhbWVyYSBtZXRhZGF0YSBvcGVyYXRpb25zIHRoYXQgYWNjZXNzIHZlbmRvciB0YWdzIHdpbGwgdXNlIHRoZQorICAgICAgICAgKiB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIHNldCB0aGlzIHdheS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKGNvbnN0IHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xlYXJzIHRoZSBnbG9iYWwgdmVuZG9yIHRhZyBkZXNjcmlwdG9yIHVzZWQgYnkgdGhpcyBwcm9jZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHZvaWQgY2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdXNlZCBieSB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqIFRoaXMgd2lsbCBjb250YWluIE5VTEwgaWYgbm8gdmVuZG9yIHRhZ3MgYXJlIGRlZmluZWQuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZ2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qPiBtUmV2ZXJzZU1hcHBpbmc7CisgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBTdHJpbmc4PiBtVGFnVG9OYW1lTWFwOworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgdWludDMyX3Q+IG1UYWdUb1NlY3Rpb25NYXA7IC8vIFZhbHVlIGlzIG9mZnNldCBpbiBtU2VjdGlvbnMKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIGludDMyX3Q+IG1UYWdUb1R5cGVNYXA7CisgICAgICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBtU2VjdGlvbnM7CisgICAgICAgIC8vIG11c3QgYmUgaW50MzJfdCB0byBiZSBjb21wYXRpYmxlIHdpdGggUGFyY2VsOjp3cml0ZUludDMyCisgICAgICAgIGludDMyX3QgbVRhZ0NvdW50OworICAgIHByaXZhdGU6CisgICAgICAgIHZlbmRvcl90YWdfb3BzIG1WZW5kb3JPcHM7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisKKyNkZWZpbmUgVkVORE9SX1RBR19ERVNDUklQVE9SX0gKKyNlbmRpZiAvKiBWRU5ET1JfVEFHX0RFU0NSSVBUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmggYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaAppbmRleCA4ZGFjNGYyLi42NzA0ODBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApAQCAtMjQsOSArMjQsMTIgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBjbGFzcyBDYW1lcmFNZXRhZGF0YTsKIAorCiBjbGFzcyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDogcHVibGljIElJbnRlcmZhY2UKIHsKICAgICAvKioKQEAgLTM5LDI0ICs0MiwyOSBAQAogICAgICAqIEVycm9yIGNvZGVzIGZvciBDQU1FUkFfTVNHX0VSUk9SCiAgICAgICovCiAgICAgZW51bSBDYW1lcmFFcnJvckNvZGUgeworICAgICAgICBFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUiA9IC0xLCAvLyBUbyBpbmRpY2F0ZSBhbGwgaW52YWxpZCBlcnJvciBjb2RlcwogICAgICAgICBFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEID0gMCwKICAgICAgICAgRVJST1JfQ0FNRVJBX0RFVklDRSA9IDEsCi0gICAgICAgIEVSUk9SX0NBTUVSQV9TRVJWSUNFID0gMgorICAgICAgICBFUlJPUl9DQU1FUkFfU0VSVklDRSA9IDIsCisgICAgICAgIEVSUk9SX0NBTUVSQV9SRVFVRVNUID0gMywKKyAgICAgICAgRVJST1JfQ0FNRVJBX1JFU1VMVCA9IDQsCisgICAgICAgIEVSUk9SX0NBTUVSQV9CVUZGRVIgPSA1LAogICAgIH07CiAKICAgICAvLyBPbmUgd2F5Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25EZXZpY2VFcnJvcihDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25EZXZpY2VFcnJvcihDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CiAKICAgICAvLyBPbmUgd2F5CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25EZXZpY2VJZGxlKCkgPSAwOwogCiAgICAgLy8gT25lIHdheQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQoaW50MzJfdCByZXF1ZXN0SWQsCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCkgPSAwOwogCiAgICAgLy8gT25lIHdheQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uUmVzdWx0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaCBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaAppbmRleCBmNzFmMzAyLi4zNTQ4OGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIHN0cnVjdCBjYW1lcmFfbWV0YWRhdGE7CiAKQEAgLTMwLDYgKzMxLDEwIEBACiBjbGFzcyBDYXB0dXJlUmVxdWVzdDsKIGNsYXNzIENhbWVyYU1ldGFkYXRhOwogCitlbnVtIHsKKyAgICBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUyA9IC0xLAorfTsKKwogY2xhc3MgSUNhbWVyYURldmljZVVzZXIgOiBwdWJsaWMgSUludGVyZmFjZQogewogICAgIC8qKgpAQCAtNDQsOSArNDksNTUgQEAKICAgICAgKiBSZXF1ZXN0IEhhbmRsaW5nCiAgICAgICoqLwogCisgICAgLyoqCisgICAgICogRm9yIHN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIKKyAgICAgKiBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICogRm9yIG5vbi1zdHJlYW1pbmcgcmVxdWVzdHMsIG91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGxhc3QKKyAgICAgKiBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKi8KICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKKworICAgIC8qKgorICAgICAqIEZvciBzdHJlYW1pbmcgcmVxdWVzdHMsIG91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyCisgICAgICogb2YgdGhlIHByZXZpb3VzIHJlcGVhdGluZyByZXF1ZXN0LgorICAgICAqIEZvciBub24tc3RyZWFtaW5nIHJlcXVlc3RzLCBvdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBleHBlY3RlZCBsYXN0CisgICAgICogZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgc3VibWl0UmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogQmVnaW4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogYmVnaW5Db25maWd1cmUgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBjYWxsIHRvIGRlbGV0ZVN0cmVhbSwgY3JlYXRlU3RyZWFtLAorICAgICAqIG9yIGVuZENvbmZpZ3VyZS4gIEl0IGlzIG5vdCB2YWxpZCB0byBjYWxsIHRoaXMgd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBpZGxlLgorICAgICAqIDxwPgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGJlZ2luQ29uZmlndXJlKCkgPSAwOworCisgICAgLyoqCisgICAgICogRW5kIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIGVuZENvbmZpZ3VyZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZSAoaS5lLiBhZnRlcgorICAgICAqIGEgY2FsbCB0byBiZWdpbkNvbmZpZ3VyZSBhbmQgc3Vic2VxdWVudCBjcmVhdGVTdHJlYW0vZGVsZXRlU3RyZWFtIGNhbGxzKS4gIFRoaXMKKyAgICAgKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHJlcXVlc3RzIGNhbiBiZSBzdWJtaXR0ZWQuCisgICAgICogPHA+CisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZW5kQ29uZmlndXJlKCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNyZWF0ZVN0cmVhbSgKQEAgLTY0LDggKzExNSwxMiBAQAogICAgIC8vIFdhaXQgdW50aWwgYWxsIHRoZSBzdWJtaXR0ZWQgcmVxdWVzdHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgd2FpdFVudGlsSWRsZSgpID0gIDA7CiAKLSAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBhbmQgaW4tcHJvZ3Jlc3Mgd29yayBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGZsdXNoKCkgPSAwOworICAgIC8qKgorICAgICAqIEZsdXNoIGFsbCBwZW5kaW5nIGFuZCBpbi1wcm9ncmVzcyB3b3JrIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHJlcGVhdGluZyByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGZsdXNoKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGVmMzkyZjAuLjdiZTQ0OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC02MSw2ICs2MSwxNyBAQAogICAgIC8vICBidWZmZXItPmZyYW1lQ291bnQgIDAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzID0ga0ludmFsaWRQVFMpID0gMDsKIAorICAgIC8vIFJlbGVhc2UgKGEgcG9ydGlvbiBvZikgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IG9idGFpbmVkIGJ5IGdldE5leHRCdWZmZXIoKS4KKyAgICAvLyBJdCBpcyBwZXJtaXNzaWJsZSB0byBjYWxsIHJlbGVhc2VCdWZmZXIoKSBtdWx0aXBsZSB0aW1lcyBwZXIgZ2V0TmV4dEJ1ZmZlcigpLgorICAgIC8vIE9uIGVudHJ5OgorICAgIC8vICBidWZmZXItPmZyYW1lQ291bnQgIG51bWJlciBvZiBmcmFtZXMgdG8gcmVsZWFzZSwgbXVzdCBiZSA8PSBudW1iZXIgb2YgZnJhbWVzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgb2J0YWluZWQgYnV0IG5vdCB5ZXQgcmVsZWFzZWQKKyAgICAvLyAgYnVmZmVyLT5yYXcgICAgICAgICB1bnVzZWQKKyAgICAvLyBPbiByZXR1cm46CisgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgMDsgaW1wbGVtZW50YXRpb24gTVVTVCBzZXQgdG8gemVybworICAgIC8vICBidWZmZXItPnJhdyAgICAgICAgIHVuZGVmaW5lZDsgaW1wbGVtZW50YXRpb24gaXMgUEVSTUlUVEVEIHRvIHNldCB0byBhbnkgdmFsdWUsCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgc28gaWYgY2FsbGVyIG5lZWRzIHRvIGNvbnRpbnVlIHVzaW5nIHRoaXMgYnVmZmVyIGl0IG11c3QKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBrZWVwIHRyYWNrIG9mIHRoZSBwb2ludGVyIGl0c2VsZgogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggZWVmMWI0MS4uNTgzNjk1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtMzYsNyArMzYsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGVmZmVjdF9wYXJhbV9jYmxrX3Q7CitzdHJ1Y3QgZWZmZWN0X3BhcmFtX2NibGtfdDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMTgsOCArMjE4LDkgQEAKICAgICAgKiAgICAgIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCiAgICAgICogY2JmOiAgICAgICAgIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIChzZWUgZWZmZWN0X2NhbGxiYWNrX3QpCiAgICAgICogdXNlcjogICAgICAgIHBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KLSAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLiBJZiAwLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCi0gICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gSWYgbm90IDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCisgICAgICogc2Vzc2lvbklEOiAgIGF1ZGlvIHNlc3Npb24gdGhpcyBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0by4KKyAgICAgKiAgICAgIElmIGVxdWFsIHRvIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgdGhlIGVmZmVjdCB3aWxsIGJlIGdsb2JhbCB0bworICAgICAqICAgICAgdGhlIG91dHB1dCBtaXguICBPdGhlcndpc2UsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCiAgICAgICogICAgICAoQXVkaW9UcmFjayBvciBNZWRpYVBMYXllcikgd2l0aGluIHRoZSBzYW1lIGF1ZGlvIHNlc3Npb24uCiAgICAgICogaW86ICBIQUwgYXVkaW8gb3V0cHV0IG9yIGlucHV0IHN0cmVhbSB0byB3aGljaCB0aGlzIGVmZmVjdCBtdXN0IGJlIGF0dGFjaGVkLiBMZWF2ZSBhdCAwIGZvcgogICAgICAqICAgICAgYXV0b21hdGljIG91dHB1dCBzZWxlY3Rpb24gYnkgQXVkaW9GbGluZ2VyLgpAQCAtMjMwLDggKzIzMSw4IEBACiAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAotICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORQogICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIENvbnN0cnVjdG9yLgpAQCAtMjQyLDggKzI0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gMAorICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICAgICk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb0VmZmVjdCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCkBAIC0yNjQsOCArMjY1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb0VmZmVjdC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQKQEAgLTQ1Myw2ICs0NTQsNyBAQAogICAgIHNwPEVmZmVjdENsaWVudD4gICAgICAgIG1JRWZmZWN0Q2xpZW50OyAgICAgLy8gSUVmZmVjdENsaWVudCBpbXBsZW1lbnRhdGlvbgogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKICAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nCisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YWZkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFVRElPX1BPTElDWV9IRUxQRVJfSF8KKyNkZWZpbmUgQVVESU9fUE9MSUNZX0hFTFBFUl9IXworCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCit7CisgICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOworICAgIH0KKworICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIH0KK30KKworI2VuZGlmIC8vQVVESU9fUE9MSUNZX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDA1MjA2NGQuLjRlZGMxYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBhdWRpb190cmFja19jYmxrX3Q7CitzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190OwogY2xhc3MgQXVkaW9SZWNvcmRDbGllbnRQcm94eTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzksOCArMzksMTIgQEAKICAgICAgKiBLZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEgTkFUSVZFX0VWRU5UXyouCiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKLSAgICAgICAgRVZFTlRfTU9SRV9EQVRBID0gMCwgICAgICAgIC8vIFJlcXVlc3QgdG8gcmVhZCBtb3JlIGRhdGEgZnJvbSBQQ00gYnVmZmVyLgotICAgICAgICBFVkVOVF9PVkVSUlVOID0gMSwgICAgICAgICAgLy8gUENNIGJ1ZmZlciBvdmVycnVuIG9jY3VycmVkLgorICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byByZWFkIGF2YWlsYWJsZSBkYXRhIGZyb20gYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBldmVudCBpcyBkZWxpdmVyZWQgYnV0IHRoZSBjYWxsYmFjayBoYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCB3YW50IHRvIHJlYWQgdGhlIGF2YWlsYWJsZSBkYXRhLCB0aGUgaGFuZGxlciBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIGV2ZW50IGJ5IHNldHRpbmcgZnJhbWVDb3VudCB0byB6ZXJvLgorICAgICAgICBFVkVOVF9PVkVSUlVOID0gMSwgICAgICAgICAgLy8gQnVmZmVyIG92ZXJydW4gb2NjdXJyZWQuCiAgICAgICAgIEVWRU5UX01BUktFUiA9IDIsICAgICAgICAgICAvLyBSZWNvcmQgaGVhZCBpcyBhdCB0aGUgc3BlY2lmaWVkIG1hcmtlciBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFNlZSBzZXRNYXJrZXJQb3NpdGlvbigpKS4KICAgICAgICAgRVZFTlRfTkVXX1BPUyA9IDMsICAgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IGEgbmV3IHBvc2l0aW9uCkBAIC02MCw5ICs2NCwxMCBAQAogICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50OyAgICAgLy8gbnVtYmVyIG9mIHNhbXBsZSBmcmFtZXMgY29ycmVzcG9uZGluZyB0byBzaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgaXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgYXZhaWxhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IGRyYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCwgYnV0IHdpbGwgbWFrZSB0aGUgcHJpbWFyeSBmaWVsZCBpbiBmdXR1cmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoY3VycmVudGx5IGlnbm9yZWQgYnV0IHdpbGwgbWFrZSB0aGUgcHJpbWFyeSBmaWVsZCBpbiBmdXR1cmUpCiAKICAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBkcmFpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGlzIHJlZHVuZGFudCB3aXRoIHJlc3BlY3QgdG8gZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBUUkFOU0ZFUl9PQlRBSU4gbW9kZSBpcyBicm9rZW4gZm9yIDgtYml0IGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGRlZmluZSB0aGUgZnJhbWUgZm9ybWF0CkBAIC03Niw3ICs4MSw3IEBACiAKICAgICAvKiBBcyBhIGNvbnZlbmllbmNlLCBpZiBhIGNhbGxiYWNrIGlzIHN1cHBsaWVkLCBhIGhhbmRsZXIgdGhyZWFkCiAgICAgICogaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByaW9yaXR5LiBUaGlzIHRocmVhZAotICAgICAqIGludm9rZXMgdGhlIGNhbGxiYWNrIHdoZW4gYSBuZXcgYnVmZmVyIGJlY29tZXMgcmVhZHkgb3IgdmFyaW91cyBjb25kaXRpb25zIG9jY3VyLgorICAgICAqIGludm9rZXMgdGhlIGNhbGxiYWNrIHdoZW4gYSBuZXcgYnVmZmVyIGJlY29tZXMgYXZhaWxhYmxlIG9yIHZhcmlvdXMgY29uZGl0aW9ucyBvY2N1ci4KICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqCiAgICAgICogZXZlbnQ6ICAgdHlwZSBvZiBldmVudCBub3RpZmllZCAoc2VlIGVudW0gQXVkaW9SZWNvcmQ6OmV2ZW50X3R5cGUpLgpAQCAtOTksNiArMTA0LDggQEAKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KICAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCiAgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCisgICAgICogZnJhbWVDb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyBpcyBOT19FUlJPUiwKKyAgICAgKiBhbmQgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4KICAgICAgKi8KIAogICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWluRnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCkBAIC0xMDksNyArMTE2LDcgQEAKICAgICAvKiBIb3cgZGF0YSBpcyB0cmFuc2ZlcnJlZCBmcm9tIEF1ZGlvUmVjb3JkCiAgICAgICovCiAgICAgZW51bSB0cmFuc2Zlcl90eXBlIHsKLSAgICAgICAgVFJBTlNGRVJfREVGQVVMVCwgICAvLyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHk7IGRldGVybWluZSBmcm9tIG90aGVyIHBhcmFtZXRlcnMKKyAgICAgICAgVFJBTlNGRVJfREVGQVVMVCwgICAvLyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHk7IGRldGVybWluZSBmcm9tIHRoZSBvdGhlciBwYXJhbWV0ZXJzCiAgICAgICAgIFRSQU5TRkVSX0NBTExCQUNLLCAgLy8gY2FsbGJhY2sgRVZFTlRfTU9SRV9EQVRBCiAgICAgICAgIFRSQU5TRkVSX09CVEFJTiwgICAgLy8gRklYTUUgZGVwcmVjYXRlZDogY2FsbCBvYnRhaW5CdWZmZXIoKSBhbmQgcmVsZWFzZUJ1ZmZlcigpCiAgICAgICAgIFRSQU5TRkVSX1NZTkMsICAgICAgLy8gc3luY2hyb25vdXMgcmVhZCgpCkBAIC0xMzcsNyArMTQ0LDcgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGJlIGxhcmdlciBpZiB0aGUgcmVxdWVzdGVkIHNpemUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBjdXJyZW50IGF1ZGlvIEhBTAogICAgICAqICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeS4gIFplcm8gbWVhbnMgdG8gdXNlIGEgZGVmYXVsdCB2YWx1ZS4KICAgICAgKiBjYmY6ICAgICAgICAgICAgICAgIENhbGxiYWNrIGZ1bmN0aW9uLiBJZiBub3QgbnVsbCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICB0byBjb25zdW1lIG5ldyBQQ00gZGF0YSBhbmQgaW5mb3JtIG9mIG1hcmtlciwgcG9zaXRpb24gdXBkYXRlcywgZXRjLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgdG8gY29uc3VtZSBuZXcgZGF0YSBhbmQgaW5mb3JtIG9mIG1hcmtlciwgcG9zaXRpb24gdXBkYXRlcywgZXRjLgogICAgICAqIHVzZXI6ICAgICAgICAgICAgICAgQ29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KICAgICAgKiBub3RpZmljYXRpb25GcmFtZXM6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lIG5vdGlmaWNhdGlvbkZyYW1lcyBQQ00KICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyBhcmUgcmVhZHkgaW4gcmVjb3JkIHRyYWNrIG91dHB1dCBidWZmZXIuCkBAIC0xNTEsMTEgKzE1OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FKTsKIApAQCAtMTcxLDkgKzE3OCwxMCBAQAogICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIGludGlhbGl6YXRpb24KICAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogQXVkaW9SZWNvcmQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCBvciByZWNvcmQgZGV2aWNlIGlzIGFscmVhZHkgaW4gdXNlCi0gICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciAoY2hhbm5lbHMsIGZvcm1hdCwgc2FtcGxlUmF0ZS4uLikKKyAgICAgKiAgLSBCQURfVkFMVUU6IGludmFsaWQgcGFyYW1ldGVyIChjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlLi4uKQogICAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIHNlcnZlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKiAgLSBQRVJNSVNTSU9OX0RFTklFRDogcmVjb3JkaW5nIGlzIG5vdCBhbGxvd2VkIGZvciB0aGUgcmVxdWVzdGluZyBwcm9jZXNzCisgICAgICogSWYgc3RhdHVzIGlzIG5vdCBlcXVhbCB0byBOT19FUlJPUiwgZG9uJ3QgY2FsbCBhbnkgb3RoZXIgQVBJcyBvbiB0aGlzIEF1ZGlvUmVjb3JkLgogICAgICAqCiAgICAgICogUGFyYW1ldGVycyBub3QgbGlzdGVkIGluIHRoZSBBdWRpb1JlY29yZCBjb25zdHJ1Y3RvcnMgYWJvdmU6CiAgICAgICoKQEAgLTE4MywxNiArMTkxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CiAKLSAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1JlY29yZC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQKKyAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1JlY29yZC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZm9yIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvUmVjb3JkIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKICAgICAgKiBhbiB1bmluaXRpYWxpemVkIEF1ZGlvUmVjb3JkIHByb2R1Y2VzIHVuZGVmaW5lZCByZXN1bHRzLgogICAgICAqIFNlZSBzZXQoKSBtZXRob2QgYWJvdmUgZm9yIHBvc3NpYmxlIHJldHVybiBjb2Rlcy4KQEAgLTIyMSw3ICsyMjksNyBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24gPSAwKTsKIAotICAgIC8qIFN0b3AgYSB0cmFjay4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQuICBOb3RlIHRoYXQgb2J0YWluQnVmZmVyKCkgc3RpbGwKKyAgICAvKiBTdG9wIGEgdHJhY2suICBUaGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQuICBOb3RlIHRoYXQgb2J0YWluQnVmZmVyKCkgc3RpbGwKICAgICAgKiB3b3JrcyBhbmQgd2lsbCBkcmFpbiBidWZmZXJzIHVudGlsIHRoZSBwb29sIGlzIGV4aGF1c3RlZCwgYW5kIHRoZW4gd2lsbCByZXR1cm4gV09VTERfQkxPQ0suCiAgICAgICovCiAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wKCk7CkBAIC0yMzIsMTEgKzI0MCwxNiBAQAogICAgICAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0ICAgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KIAorICAgIC8qIFJldHVybiB0aGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50LgorICAgICAqIFRoaXMgaXMgYXBwcm94aW1hdGVseSBob3cgb2Z0ZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQsIGZvciB0cmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLLgorICAgICAqLworICAgICAgICAgICAgc2l6ZV90ICAgICAgbm90aWZpY2F0aW9uRnJhbWVzKCkgY29uc3QgIHsgcmV0dXJuIG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7IH0KKwogICAgIC8qIFNldHMgbWFya2VyIHBvc2l0aW9uLiBXaGVuIHJlY29yZCByZWFjaGVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHNwZWNpZmllZCwKICAgICAgKiBhIGNhbGxiYWNrIHdpdGggZXZlbnQgdHlwZSBFVkVOVF9NQVJLRVIgaXMgY2FsbGVkLiBDYWxsaW5nIHNldE1hcmtlclBvc2l0aW9uCiAgICAgICogd2l0aCBtYXJrZXIgPT0gMCBjYW5jZWxzIG1hcmtlciBub3RpZmljYXRpb24gY2FsbGJhY2suCiAgICAgICogVG8gc2V0IGEgbWFya2VyIGF0IGEgcG9zaXRpb24gd2hpY2ggd291bGQgY29tcHV0ZSBhcyAwLAotICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byB0aGUgc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgorICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCiAgICAgICogSWYgdGhlIEF1ZGlvUmVjb3JkIGhhcyBiZWVuIG9wZW5lZCB3aXRoIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIGFzc29jaWF0ZWQsCiAgICAgICogdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwuCiAgICAgICoKQEAgLTM3OCw4ICszOTEsMTAgQEAKICAgICAgKiByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdmFsdWUgYnkgdGhpcyBmdW5jdGlvbiBjYWxsLiAgU3VjaCBsb3NzIHR5cGljYWxseSBvY2N1cnMgd2hlbiB0aGUKICAgICAgKiB1c2VyIHNwYWNlIHByb2Nlc3MgaXMgYmxvY2tlZCBsb25nZXIgdGhhbiB0aGUgY2FwYWNpdHkgb2YgYXVkaW8gZHJpdmVyIGJ1ZmZlcnMuCiAgICAgICogVW5pdHM6IHRoZSBudW1iZXIgb2YgaW5wdXQgYXVkaW8gZnJhbWVzLgorICAgICAqIEZJWE1FIFRoZSBzaWRlLWVmZmVjdCBvZiByZXNldHRpbmcgdGhlIGNvdW50ZXIgbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIG11bHRpLWNsaWVudC4KKyAgICAgKiBDb25zaWRlciBtYWtpbmcgaXQgbW9yZSBsaWtlIEF1ZGlvVHJhY2s6OmdldFVuZGVycnVuRnJhbWVzIHdoaWNoIGRvZXNuJ3QgaGF2ZSBzaWRlIGVmZmVjdHMuCiAgICAgICovCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdCgpIGNvbnN0OworICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgLyogY29weWluZyBhdWRpbyByZWNvcmQgb2JqZWN0cyBpcyBub3QgYWxsb3dlZCAqLwpAQCAtNDEyLDYgKzQyNyw3IEBACiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZDsgICAgLy8gd2hldGhlciB0aHJlYWQgaXMgcmVxdWVzdGVkIHRvIHBhdXNlIGF0IG5leHQgbG9vcCBlbnRyeQogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1QYXVzZWRJbnQ7IC8vIHdoZXRoZXIgdGhyZWFkIGludGVybmFsbHkgcmVxdWVzdHMgcGF1c2UKICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICBtUGF1c2VkTnM7ICAvLyBpZiBtUGF1c2VkSW50IHRoZW4gYXNzb2NpYXRlZCB0aW1lb3V0LCBvdGhlcndpc2UgaWdub3JlZAorICAgICAgICBib29sICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50OyAgIC8vIHdoZXRoZXIgdG8gaWdub3JlIG5leHQgbVBhdXNlZEludCByZXF1ZXN0CiAgICAgfTsKIAogICAgICAgICAgICAgLy8gYm9keSBvZiBBdWRpb1JlY29yZFRocmVhZDo6dGhyZWFkTG9vcCgpCkBAIC00MjIsOSArNDM4LDEwIEBACiAgICAgICAgICAgICAvLyAgICAgIE5TX0lOQUNUSVZFIGluYWN0aXZlIHNvIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCByZS1zdGFydGVkCiAgICAgICAgICAgICAvLyAgICAgIE5TX05FVkVSICAgIG5ldmVyIGFnYWluCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBOU19XSEVORVZFUiA9IC0xLCBOU19JTkFDVElWRSA9IC0yLCBOU19ORVZFUiA9IC0zOwotICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOworICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoKTsKIAogICAgICAgICAgICAgLy8gY2FsbGVyIG11c3QgaG9sZCBsb2NrIG9uIG1Mb2NrIGZvciBhbGwgX2wgbWV0aG9kcworCiAgICAgICAgICAgICBzdGF0dXNfdCBvcGVuUmVjb3JkX2woc2l6ZV90IGVwb2NoKTsKIAogICAgICAgICAgICAgLy8gRklYTUUgZW51bSBpcyBmYXN0ZXIgdGhhbiBzdHJjbXAoKSBmb3IgcGFyYW1ldGVyICdmcm9tJwpAQCAtNDQ0LDE0ICs0NjEsMTYgQEAKICAgICAvLyBmb3Igbm90aWZpY2F0aW9uIEFQSXMKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOyAvLyByZXF1ZXN0ZWQgbnVtYmVyIG9mIGZyYW1lcyBiZXR3ZWVuIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OyAvLyBhY3R1YWwgbnVtYmVyIG9mIGZyYW1lcyBiZXR3ZWVuIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gY2FsbGJhY2sKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmVmcmVzaFJlbWFpbmluZzsgIC8vIHByb2Nlc3NBdWRpb0J1ZmZlcigpIHNob3VsZCByZWZyZXNoIG5leHQgMgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nOyAgICAgIC8vIHByb2Nlc3NBdWRpb0J1ZmZlcigpIHNob3VsZCByZWZyZXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJlbWFpbmluZ0ZyYW1lcyBhbmQgbVJldHJ5T25QYXJ0aWFsQnVmZmVyCiAKICAgICAvLyBUaGVzZSBhcmUgcHJpdmF0ZSB0byBwcm9jZXNzQXVkaW9CdWZmZXIoKSwgYW5kIGFyZSBub3QgcHJvdGVjdGVkIGJ5IGEgbG9jawogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXM7ICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgdG8gcmVxdWVzdCBpbiBvYnRhaW5CdWZmZXIoKQogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZXRyeU9uUGFydGlhbEJ1ZmZlcjsgIC8vIHNsZWVwIGFuZCByZXRyeSBhZnRlciBwYXJ0aWFsIG9idGFpbkJ1ZmZlcigpCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVkU2VxdWVuY2U7ICAgICAgLy8gbGFzdCBvYnNlcnZlZCB2YWx1ZSBvZiBtU2VxdWVuY2UKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQogCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAvLyBpbiB3cmFwcGluZyAob3ZlcmZsb3cpIGZyYW1lIHVuaXRzCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbU1hcmtlclJlYWNoZWQ7CkBAIC00NjAsOSArNDc5LDEzIEBACiAKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtU3RhdHVzOwogCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7ICAgICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gY3VycmVudCBJQXVkaW9SZWNvcmQsIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IElBdWRpb1JlY29yZCBpcyBuZWVkZWQsIG5vbi1kZWNyZWFzaW5nCisKICAgICAvLyBjb25zdGFudCBhZnRlciBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplOyAgICAgICAgIC8vIGFwcC1sZXZlbCBmcmFtZSBzaXplID09IEF1ZGlvRmxpbmdlciBmcmFtZSBzaXplCkBAIC00NzMsMTIgKzQ5NiwxMyBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlucHV0OyAgICAgICAgICAgICAvLyByZXR1cm5lZCBieSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQoKQotCi0gICAgLy8gbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvUmVjb3JkIG9iamVjdCBpcyByZS1jcmVhdGVkCisgICAgLy8gTmV4dCA1IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCisgICAgLy8gcHJvdmlkZWQgdGhlIGluaXRpYWwgc2V0KCkgd2FzIHN1Y2Nlc3NmdWwKICAgICBzcDxJQXVkaW9SZWNvcmQ+ICAgICAgICBtQXVkaW9SZWNvcmQ7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAvLyByZS1sb2FkIGFmdGVyIG1Mb2NrLnVubG9jaygpCisgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dCgpCiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNQcmlvcml0eTsgIC8vIGJlZm9yZSBzdGFydCgpCiAgICAgU2NoZWRQb2xpY3kgICAgICAgICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODQ3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfUFVCTElDX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfUFVCTElDX0gKKworLy8gQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYIGlzIHRoZSBtYXhpbXVtIHJhdGlvIGJldHdlZW4gdGhlIG9yaWdpbmFsCisvLyBhdWRpbyBzYW1wbGUgcmF0ZSBhbmQgdGhlIHRhcmdldCByYXRlIHdoZW4gZG93bnNhbXBsaW5nLAorLy8gYXMgcGVybWl0dGVkIGluIHRoZSBhdWRpbyBmcmFtZXdvcmssIGUuZy4gQXVkaW9UcmFjayBhbmQgQXVkaW9GbGluZ2VyLgorLy8gSW4gcHJhY3RpY2UsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBkb3duc2FtcGxlIG1vcmUgdGhhbiA2OjEKKy8vIGZvciBiZXN0IGF1ZGlvIHF1YWxpdHksIGV2ZW4gdGhvdWdoIHRoZSBhdWRpbyBmcmFtZXdvcmsgcGVybWl0cyBhIGxhcmdlcgorLy8gZG93bnNhbXBsaW5nIHJhdGlvLgorLy8gVE9ETzogcmVwbGFjZSB3aXRoIGFuIEFQSQorI2RlZmluZSBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggMjU2CisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDIyNWVmNzYuLmY4YzAxOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNjcsMjAgKzY4LDI0IEBACiAKICAgICAvLyByZXR1cm5zIHRydWUgaW4gKnN0YXRlIGlmIHRyYWNrcyBhcmUgYWN0aXZlIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtIG9yIGhhdmUgYmVlbiBhY3RpdmUKICAgICAvLyBpbiB0aGUgcGFzdCBpblBhc3RNcyBtaWxsaXNlY29uZHMKLSAgICBzdGF0aWMgc3RhdHVzX3QgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgKnN0YXRlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApOworICAgIHN0YXRpYyBzdGF0dXNfdCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCAqc3RhdGUsIHVpbnQzMl90IGluUGFzdE1zKTsKICAgICAvLyByZXR1cm5zIHRydWUgaW4gKnN0YXRlIGlmIHRyYWNrcyBhcmUgYWN0aXZlIGZvciB3aGF0IHF1YWxpZmllcyBhcyByZW1vdGUgcGxheWJhY2sKICAgICAvLyBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbSBvciBoYXZlIGJlZW4gYWN0aXZlIGluIHRoZSBwYXN0IGluUGFzdE1zIG1pbGxpc2Vjb25kcy4gUmVtb3RlCiAgICAgLy8gcGxheWJhY2sgaXNuJ3QgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbG9jYWwgcGxheWJhY2suCiAgICAgc3RhdGljIHN0YXR1c190IGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgKnN0YXRlLAotICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zKTsKICAgICAvLyByZXR1cm5zIHRydWUgaW4gKnN0YXRlIGlmIGEgcmVjb3JkZXIgaXMgY3VycmVudGx5IHJlY29yZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCiAgICAgc3RhdGljIHN0YXR1c190IGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgYm9vbCAqc3RhdGUpOwogCiAgICAgLy8gc2V0L2dldCBhdWRpbyBoYXJkd2FyZSBwYXJhbWV0ZXJzLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIGxpc3Qgb2YgcGFyYW1ldGVycwogICAgIC8vIGtleSB2YWx1ZSBwYWlycyBpbiB0aGUgZm9ybToga2V5MT12YWx1ZTE7a2V5Mj12YWx1ZTI7Li4uCiAgICAgLy8gU29tZSBrZXlzIGFyZSByZXNlcnZlZCBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycyAoU2VlIEF1ZGlvUGFyYW1ldGVyIGNsYXNzKS4KKyAgICAvLyBUaGUgdmVyc2lvbnMgd2l0aCBhdWRpb19pb19oYW5kbGVfdCBhcmUgaW50ZW5kZWQgZm9yIGludGVybmFsIG1lZGlhIGZyYW1ld29yayB1c2Ugb25seS4KICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgc3RhdGljIFN0cmluZzggIGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOworICAgIC8vIFRoZSB2ZXJzaW9ucyB3aXRob3V0IGF1ZGlvX2lvX2hhbmRsZV90IGFyZSBpbnRlbmRlZCBmb3IgSk5JLgorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgIHN0YXRpYyBTdHJpbmc4ICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwogCiAgICAgc3RhdGljIHZvaWQgc2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYik7CiAKQEAgLTkwLDM2ICs5NSwzNyBAQAogICAgIHN0YXRpYyBmbG9hdCBsaW5lYXJUb0xvZyhpbnQgdm9sdW1lKTsKICAgICBzdGF0aWMgaW50IGxvZ1RvTGluZWFyKGZsb2F0IHZvbHVtZSk7CiAKKyAgICAvLyBSZXR1cm5lZCBzYW1wbGluZ1JhdGUgYW5kIGZyYW1lQ291bnQgb3V0cHV0IHZhbHVlcyBhcmUgZ3VhcmFudGVlZAorICAgIC8vIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyA9PSBOT19FUlJPUgogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRTYW1wbGluZ1JhdGUodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRTYW1wbGluZ1JhdGVGb3JBdHRyKHVpbnQzMl90KiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0RnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0TGF0ZW5jeSh1aW50MzJfdCogbGF0ZW5jeSwKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRTYW1wbGluZ1JhdGUoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNhbXBsaW5nUmF0ZSk7CiAgICAgLy8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgYXVkaW8gSEFMIHdyaXRlIGJ1ZmZlci4gQ29ycmVzcG9uZHMgdG8KLSAgICAvLyBhdWRpb19zdHJlYW0tPmdldF9idWZmZXJfc2l6ZSgpL2F1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCkKKyAgICAvLyBhdWRpb19zdHJlYW0tPmdldF9idWZmZXJfc2l6ZSgpL2F1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZSgpCiAgICAgc3RhdGljIHN0YXR1c190IGdldEZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCk7CiAgICAgLy8gcmV0dXJucyB0aGUgYXVkaW8gb3V0cHV0IHN0cmVhbSBsYXRlbmN5IGluIG1zLiBDb3JyZXNwb25kcyB0bwogICAgIC8vIGF1ZGlvX3N0cmVhbV9vdXQtPmdldF9sYXRlbmN5KCkKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGxhdGVuY3kpOwogCiAgICAgc3RhdGljIGJvb2wgcm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CiAKKyAgICAvLyByZXR1cm4gc3RhdHVzIE5PX0VSUk9SIGltcGxpZXMgKmJ1ZmZTaXplID4gMAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgc2l6ZV90KiBidWZmU2l6ZSk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKIAogICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IEF1ZGlvRmxpbmdlciB0byBhdWRpbyBIQUwgYW5kCi0gICAgLy8gYXVkaW8gZHNwIHRvIERBQyBzaW5jZSB0aGUgb3V0cHV0IG9uIHdoaWNoIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGlzIHBsYXlpbmcKLSAgICAvLyBoYXMgZXhpdGVkIHN0YW5kYnkuCisgICAgLy8gYXVkaW8gZHNwIHRvIERBQyBzaW5jZSB0aGUgc3BlY2lmaWVkIG91dHB1dCBJL08gaGFuZGxlIGhhcyBleGl0ZWQgc3RhbmRieS4KICAgICAvLyByZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAvLyAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbiwgaGFsRnJhbWVzIGFuZCBkc3BGcmFtZXMgcG9pbnQgdG8gdmFsaWQgZGF0YQogICAgIC8vIC0gSU5WQUxJRF9PUEVSQVRJT046IE5vdCBzdXBwb3J0ZWQgb24gY3VycmVudCBoYXJkd2FyZSBwbGF0Zm9ybQpAQCAtMTI3LDE2ICsxMzMsMjYgQEAKICAgICAvLyBOT1RFOiB0aGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgaGFyZHdhcmUgcGxhdGZvcm1zIGFuZCBpdCBpcwogICAgIC8vIG5lY2Vzc2FyeSB0byBjaGVjayByZXR1cm5lZCBzdGF0dXMgYmVmb3JlIHVzaW5nIHRoZSByZXR1cm5lZCB2YWx1ZXMuCiAgICAgc3RhdGljIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpoYWxGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqZHNwRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmhhbEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRzcEZyYW1lcyk7CiAKICAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiBpbnB1dCBmcmFtZXMgbG9zdCBieSBIQUwgaW1wbGVtZW50YXRpb24sIG9yIDAgaWYgdGhlIGhhbmRsZSBpcyBpbnZhbGlkCi0gICAgc3RhdGljIHNpemVfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOworICAgIHN0YXRpYyB1aW50MzJfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOwogCi0gICAgc3RhdGljIGludCBuZXdBdWRpb1Nlc3Npb25JZCgpOwotICAgIHN0YXRpYyB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKLSAgICBzdGF0aWMgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbik7CisgICAgLy8gQWxsb2NhdGUgYSBuZXcgdW5pcXVlIElEIGZvciB1c2UgYXMgYW4gYXVkaW8gc2Vzc2lvbiBJRCBvciBJL08gaGFuZGxlLgorICAgIC8vIElmIHVuYWJsZSB0byBjb250YWN0IEF1ZGlvRmxpbmdlciwgcmV0dXJucyBBVURJT19VTklRVUVfSURfQUxMT0NBVEUgaW5zdGVhZC4KKyAgICAvLyBGSVhNRSBJZiBBdWRpb0ZsaW5nZXIgd2VyZSB0byBldmVyIGV4aGF1c3QgdGhlIHVuaXF1ZSBJRCBuYW1lc3BhY2UsCisgICAgLy8gICAgICAgdGhpcyBtZXRob2QgY291bGQgZmFpbCBieSByZXR1cm5pbmcgZWl0aGVyIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURQorICAgIC8vICAgICAgIG9yIGFuIHVuc3BlY2lmaWVkIGV4aXN0aW5nIHVuaXF1ZSBJRC4KKyAgICBzdGF0aWMgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpOworCisgICAgc3RhdGljIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCk7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCk7CisKKyAgICAvLyBHZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgdXNlZCBmb3IgYW4gYXVkaW8gc2Vzc2lvbi4KKyAgICAvLyBSZXR1cm4gYSB2YWxpZCBzb3VyY2Ugb3IgQVVESU9fSFdfU1lOQ19JTlZBTElEIGlmIGFuIGVycm9yIG9jY3VycworICAgIC8vIG9yIG5vIEhXIHN5bmMgc291cmNlIGlzIHVzZWQuCisgICAgc3RhdGljIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKICAgICAvLyB0eXBlcyBvZiBpbyBjb25maWd1cmF0aW9uIGNoYW5nZSBldmVudHMgcmVjZWl2ZWQgd2l0aCBpb0NvbmZpZ0NoYW5nZWQoKQogICAgIGVudW0gaW9fY29uZmlnX2V2ZW50IHsKQEAgLTE1NSw3ICsxNzEsOCBAQAogICAgIGNsYXNzIE91dHB1dERlc2NyaXB0b3IgewogICAgIHB1YmxpYzoKICAgICAgICAgT3V0cHV0RGVzY3JpcHRvcigpCi0gICAgICAgIDogc2FtcGxpbmdSYXRlKDApLCBmb3JtYXQoQVVESU9fRk9STUFUX0RFRkFVTFQpLCBjaGFubmVsTWFzaygwKSwgZnJhbWVDb3VudCgwKSwgbGF0ZW5jeSgwKSAge30KKyAgICAgICAgOiBzYW1wbGluZ1JhdGUoMCksIGZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIGNoYW5uZWxNYXNrKDApLCBmcmFtZUNvdW50KDApLCBsYXRlbmN5KDApCisgICAgICAgICAgICB7fQogCiAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZTsKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OwpAQCAtMTkzLDI3ICsyMTAsNDQgQEAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKICAgICBzdGF0aWMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOworCisgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgY3JlYXRlVHJhY2soKSwKKyAgICAvLyBvciByZWxlYXNlIGl0IHdpdGggcmVsZWFzZU91dHB1dCgpLgogICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CisgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7CiAgICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pOwogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgIC8vIENsaWVudCBtdXN0IHN1Y2Nlc3NmdWxseSBoYW5kIG9mZiB0aGUgaGFuZGxlIHJlZmVyZW5jZSB0byBBdWRpb0ZsaW5nZXIgdmlhIG9wZW5SZWNvcmQoKSwKKyAgICAvLyBvciByZWxlYXNlIGl0IHdpdGggcmVsZWFzZUlucHV0KCkuCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190KTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CkBAIC0yNTUsOCArMjg5LDU2IEBACiAgICAgLy8gY2hlY2sgcHJlc2VuY2Ugb2YgYXVkaW8gZmxpbmdlciBzZXJ2aWNlLgogICAgIC8vIHJldHVybnMgTk9fRVJST1IgaWYgYmluZGluZyB0byBzZXJ2aWNlIHN1Y2NlZWRzLCBERUFEX09CSkVDVCBvdGhlcndpc2UKICAgICBzdGF0aWMgc3RhdHVzX3QgY2hlY2tBdWRpb0ZsaW5nZXIoKTsKKworICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisKKyAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCisgICAgc3RhdGljIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgIC8qIFJlbGVhc2UgYW4gYXVkaW8gcGF0Y2ggKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIC8qIExpc3QgZXhpc3RpbmcgYXVkaW8gcGF0Y2hlcyAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgc3RhdGljIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCisgICAgc3RhdGljIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCk7CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKyAgICBjbGFzcyBBdWRpb1BvcnRDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCisgICAgeworICAgIHB1YmxpYzoKKworICAgICAgICAgICAgICAgIEF1ZGlvUG9ydENhbGxiYWNrKCkge30KKyAgICAgICAgdmlydHVhbCB+QXVkaW9Qb3J0Q2FsbGJhY2soKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlRGllZCgpID0gMDsKKworICAgIH07CisKKyAgICBzdGF0aWMgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFjayhzcDxBdWRpb1BvcnRDYWxsYmFjaz4gY2FsbEJhY2spOworCiBwcml2YXRlOgogCiAgICAgY2xhc3MgQXVkaW9GbGluZ2VyQ2xpZW50OiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsIHB1YmxpYyBCbkF1ZGlvRmxpbmdlckNsaWVudApAQCAtMjc1LDcgKzM1Nyw4IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKTsKICAgICB9OwogCi0gICAgY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBCbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudAogICAgIHsKICAgICBwdWJsaWM6CiAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCgpIHsKQEAgLTI4Myw2ICszNjYsMTAgQEAKIAogICAgICAgICAvLyBEZWF0aFJlY2lwaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworICAgICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICB9OwogCiAgICAgc3RhdGljIHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gZ0F1ZGlvRmxpbmdlckNsaWVudDsKQEAgLTMwMiwxMSArMzg5LDExIEBACiAKICAgICBzdGF0aWMgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4gZ0F1ZGlvUG9saWN5U2VydmljZTsKIAotICAgIC8vIG1hcHBpbmcgYmV0d2VlbiBzdHJlYW0gdHlwZXMgYW5kIG91dHB1dHMKLSAgICBzdGF0aWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX2lvX2hhbmRsZV90PiBnU3RyZWFtT3V0cHV0TWFwOwogICAgIC8vIGxpc3Qgb2Ygb3V0cHV0IGRlc2NyaXB0b3JzIGNvbnRhaW5pbmcgY2FjaGVkIHBhcmFtZXRlcnMKICAgICAvLyAoc2FtcGxpbmcgcmF0ZSwgZnJhbWVjb3VudCwgY2hhbm5lbCBjb3VudC4uLikKICAgICBzdGF0aWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBPdXRwdXREZXNjcmlwdG9yICo+IGdPdXRwdXRzOworCisgICAgc3RhdGljIHNwPEF1ZGlvUG9ydENhbGxiYWNrPiBnQXVkaW9Qb3J0Q2FsbGJhY2s7CiB9OwogCiB9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAppbmRleCBjMjljN2U1Li45OWU5YzNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlIDx0aW1lLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwogY2xhc3MgQXVkaW9UaW1lc3RhbXAgewogcHVibGljOgogICAgIEF1ZGlvVGltZXN0YW1wKCkgOiBtUG9zaXRpb24oMCkgewpAQCAtMzAsNCArMzIsNiBAQAogICAgIHN0cnVjdCB0aW1lc3BlYyBtVGltZTsgICAgIC8vIGNvcnJlc3BvbmRpbmcgQ0xPQ0tfTU9OT1RPTklDIHdoZW4gZnJhbWUgaXMgZXhwZWN0ZWQgdG8gcHJlc2VudAogfTsKIAorfSAgIC8vIG5hbWVzcGFjZQorCiAjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fVElNRVNUQU1QX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKaW5kZXggNDczNjM2OS4uYjUyNTZmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBhdWRpb190cmFja19jYmxrX3Q7CitzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190OwogY2xhc3MgQXVkaW9UcmFja0NsaWVudFByb3h5OwogY2xhc3MgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OwogCkBAIC0zNiwxMSArMzYsNiBAQAogY2xhc3MgQXVkaW9UcmFjayA6IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgZW51bSBjaGFubmVsX2luZGV4IHsKLSAgICAgICAgTU9OTyAgID0gMCwKLSAgICAgICAgTEVGVCAgID0gMCwKLSAgICAgICAgUklHSFQgID0gMQotICAgIH07CiAKICAgICAvKiBFdmVudHMgdXNlZCBieSBBdWRpb1RyYWNrIGNhbGxiYWNrIGZ1bmN0aW9uIChjYWxsYmFja190KS4KICAgICAgKiBLZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2suamF2YSBOQVRJVkVfRVZFTlRfKi4KQEAgLTgyLDYgKzc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoY3VycmVudGx5IGlnbm9yZWQsIGJ1dCB3aWxsIG1ha2UgdGhlIHByaW1hcnkgZmllbGQgaW4gZnV0dXJlKQogCiAgICAgICAgIHNpemVfdCAgICAgIHNpemU7ICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzID09IGZyYW1lQ291bnQgKiBmcmFtZVNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCBpdCBpcyB1bnVzZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBmaWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGlzIHJlZHVuZGFudCB3aXRoIHJlc3BlY3QgdG8gZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgVFJBTlNGRVJfT0JUQUlOIG1vZGUgaXMgYnJva2VuIGZvciA4LWJpdCBkYXRhCkBAIC05MSw3ICs4Nyw3IEBACiAgICAgICAgICAgICB2b2lkKiAgICAgICByYXc7CiAgICAgICAgICAgICBzaG9ydCogICAgICBpMTY7ICAgICAgLy8gc2lnbmVkIDE2LWJpdAogICAgICAgICAgICAgaW50OF90KiAgICAgaTg7ICAgICAgIC8vIHVuc2lnbmVkIDgtYml0LCBvZmZzZXQgYnkgMHg4MAotICAgICAgICB9OworICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0OiB1bnVzZWQsIG91dHB1dDogcG9pbnRlciB0byBidWZmZXIKICAgICB9OwogCiAgICAgLyogQXMgYSBjb252ZW5pZW5jZSwgaWYgYSBjYWxsYmFjayBpcyBzdXBwbGllZCwgYSBoYW5kbGVyIHRocmVhZApAQCAtMTIzLDYgKzExOSw4IEBACiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCiAgICAgICogIC0gTk9fSU5JVDogYXVkaW8gc2VydmVyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAogICAgICAqICAtIEJBRF9WQUxVRTogdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbgorICAgICAqIGZyYW1lQ291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSBub24temVybyBpZiBzdGF0dXMgaXMgTk9fRVJST1IsCisgICAgICogYW5kIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuCiAgICAgICovCiAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWluRnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCkBAIC0xNTYsOSArMTU0LDEwIEBACiAgICAgICogc3RyZWFtVHlwZTogICAgICAgICBTZWxlY3QgdGhlIHR5cGUgb2YgYXVkaW8gc3RyZWFtIHRoaXMgdHJhY2sgaXMgYXR0YWNoZWQgdG8KICAgICAgKiAgICAgICAgICAgICAgICAgICAgIChlLmcuIEFVRElPX1NUUkVBTV9NVVNJQykuCiAgICAgICogc2FtcGxlUmF0ZTogICAgICAgICBEYXRhIHNvdXJjZSBzYW1wbGluZyByYXRlIGluIEh6LgotICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KLSAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzay4KKyAgICAgKiBmb3JtYXQ6ICAgICAgICAgICAgIEF1ZGlvIGZvcm1hdC4gIEZvciBtaXhlZCB0cmFja3MsIGFueSBQQ00gZm9ybWF0IHN1cHBvcnRlZCBieSBzZXJ2ZXIgaXMgT0sKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9yIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgd2hpY2ggaXMgaGFuZGxlZCBvbiBjbGllbnQgc2lkZS4gIEZvciBkaXJlY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCBvZmZsb2FkZWQgdHJhY2tzLCB0aGUgcG9zc2libGUgZm9ybWF0KHMpIGRlcGVuZHMgb24gdGhlIG91dHB1dCBzaW5rLgorICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrLCBzdWNoIHRoYXQgYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIGlzIHRydWUuCiAgICAgICogZnJhbWVDb3VudDogICAgICAgICBNaW5pbXVtIHNpemUgb2YgdHJhY2sgUENNIGJ1ZmZlciBpbiBmcmFtZXMuIFRoaXMgZGVmaW5lcyB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgY29udHJpYnV0aW9uIHRvIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSBvZiB0aGUgdHJhY2suIFRoZSBhY3R1YWwgc2l6ZSBzZWxlY3RlZCBieSB0aGUgQXVkaW9UcmFjayBjb3VsZCBiZQpAQCAtMTgwLDE1ICsxNzksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCk7CiAKICAgICAvKiBDcmVhdGVzIGFuIGF1ZGlvIHRyYWNrIGFuZCByZWdpc3RlcnMgaXQgd2l0aCBBdWRpb0ZsaW5nZXIuCiAgICAgICogV2l0aCB0aGlzIGNvbnN0cnVjdG9yLCB0aGUgdHJhY2sgaXMgY29uZmlndXJlZCBmb3Igc3RhdGljIGJ1ZmZlciBtb2RlLgpAQCAtMjA5LDExICsyMTAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvVHJhY2sgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgogICAgICAqIEFsc28gZGVzdHJveXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIEF1ZGlvVHJhY2suCkBAIC0yNDEsMTcgKzI0NCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1RyYWNrLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9UcmFjayBBUEkgKGV4Y2VwdCBmb3Igc2V0KCkpLCBiZWNhdXNlIHVzaW5nCkBAIC0yNzksNyArMjg0LDcgQEAKICAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0ICAgeyByZXR1cm4gbUZyYW1lU2l6ZTsgfQogCiAgICAgICAgICAgICB1aW50MzJfdCAgICBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9Ci0gICAgICAgICAgICB1aW50MzJfdCAgICBmcmFtZUNvdW50KCkgY29uc3QgIHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CisgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgIHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAKICAgICAvKiBSZXR1cm4gdGhlIHN0YXRpYyBidWZmZXIgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yIG9yIHNldCgpLCBvciAwIGZvciBzdHJlYW1pbmcgbW9kZSAqLwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gc2hhcmVkQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbVNoYXJlZEJ1ZmZlcjsgfQpAQCAtMzM2LDcgKzM0MSw3IEBACiAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRTYW1wbGVSYXRlKHVpbnQzMl90IHNhbXBsZVJhdGUpOwogCi0gICAgLyogUmV0dXJuIGN1cnJlbnQgc291cmNlIHNhbXBsZSByYXRlIGluIEh6LCBvciAwIGlmIHVua25vd24gKi8KKyAgICAvKiBSZXR1cm4gY3VycmVudCBzb3VyY2Ugc2FtcGxlIHJhdGUgaW4gSHogKi8KICAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldFNhbXBsZVJhdGUoKSBjb25zdDsKIAogICAgIC8qIEVuYWJsZXMgbG9vcGluZyBhbmQgc2V0cyB0aGUgc3RhcnQgYW5kIGVuZCBwb2ludHMgb2YgbG9vcGluZy4KQEAgLTM2MSw3ICszNjYsNyBAQAogICAgIC8qIFNldHMgbWFya2VyIHBvc2l0aW9uLiBXaGVuIHBsYXliYWNrIHJlYWNoZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkLCBhIGNhbGxiYWNrIHdpdGgKICAgICAgKiBldmVudCB0eXBlIEVWRU5UX01BUktFUiBpcyBjYWxsZWQuIENhbGxpbmcgc2V0TWFya2VyUG9zaXRpb24gd2l0aCBtYXJrZXIgPT0gMCBjYW5jZWxzIG1hcmtlcgogICAgICAqIG5vdGlmaWNhdGlvbiBjYWxsYmFjay4gIFRvIHNldCBhIG1hcmtlciBhdCBhIHBvc2l0aW9uIHdoaWNoIHdvdWxkIGNvbXB1dGUgYXMgMCwKLSAgICAgKiBhIHdvcmthcm91bmQgaXMgdG8gdGhlIHNldCB0aGUgbWFya2VyIGF0IGEgbmVhcmJ5IHBvc2l0aW9uIHN1Y2ggYXMgfjAgb3IgMS4KKyAgICAgKiBhIHdvcmthcm91bmQgaXMgdG8gc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgogICAgICAqIElmIHRoZSBBdWRpb1RyYWNrIGhhcyBiZWVuIG9wZW5lZCB3aXRoIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIGFzc29jaWF0ZWQsIHRoZSBvcGVyYXRpb24gd2lsbAogICAgICAqIGZhaWwuCiAgICAgICoKQEAgLTQyNSw3ICs0MzAsNyBAQAogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgogICAgICAqICAtIEJBRF9WQUxVRTogIHBvc2l0aW9uIGlzIE5VTEwKICAgICAgKi8KLSAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3Q7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pOwogCiAgICAgLyogRm9yIHN0YXRpYyBidWZmZXIgbW9kZSBvbmx5LCB0aGlzIHJldHVybnMgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gZnJhbWVzCiAgICAgICogcmVsYXRpdmUgdG8gc3RhcnQgb2YgYnVmZmVyLiAgSXQgaXMgYW5hbG9nb3VzIHRvIHRoZSBwb3NpdGlvbiB1bml0cyB1c2VkIGJ5CkBAIC00NTAsOSArNDU1LDEwIEBACiAgICAgICogIG5vbmUuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCB2YWx1ZToKLSAgICAgKiAgaGFuZGxlIG9uIGF1ZGlvIGhhcmR3YXJlIG91dHB1dAorICAgICAqICBoYW5kbGUgb24gYXVkaW8gaGFyZHdhcmUgb3V0cHV0LCBvciBBVURJT19JT19IQU5ETEVfTk9ORSBpZiB0aGUKKyAgICAgKiAgdHJhY2sgbmVlZGVkIHRvIGJlIHJlLWNyZWF0ZWQgYnV0IHRoYXQgZmFpbGVkCiAgICAgICovCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAgICBnZXRPdXRwdXQoKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgIGdldE91dHB1dCgpIGNvbnN0OwogCiAgICAgLyogUmV0dXJucyB0aGUgdW5pcXVlIHNlc3Npb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhY2suCiAgICAgICoKQEAgLTUyOCwxNSArNTM0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKmVsYXBzZWQgPSBOVUxMLCBzaXplX3QgKm5vbkNvbnRpZyA9IE5VTEwpOwogcHVibGljOgogCi0vL0VMX0ZJWE1FIHRvIGJlIHJlY29uY2lsZWQgd2l0aCBuZXcgb2J0YWluQnVmZmVyKCkgcmV0dXJuIGNvZGVzIGFuZCBjb250cm9sIGJsb2NrIHByb3h5Ci0vLyAgICAgICAgICAgIGVudW0gewotLy8gICAgICAgICAgICBOT19NT1JFX0JVRkZFUlMgPSAweDgwMDAwMDAxLCAgIC8vIHNhbWUgbmFtZSBpbiBBdWRpb0ZsaW5nZXIuaCwgb2sgdG8gYmUgZGlmZmVyZW50IHZhbHVlCi0vLyAgICAgICAgICAgIFRFQVJfRE9XTiAgICAgICA9IDB4ODAwMDAwMDIsCi0vLyAgICAgICAgICAgIFNUT1BQRUQgPSAxLAotLy8gICAgICAgICAgICBTVFJFQU1fRU5EX1dBSVQsCi0vLyAgICAgICAgICAgIFNUUkVBTV9FTkQKLS8vICAgICAgICB9OwotCiAgICAgLyogUmVsZWFzZSBhIGZpbGxlZCBidWZmZXIgb2YgImF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50IiBmcmFtZXMgZm9yIEF1ZGlvRmxpbmdlciB0byBwcm9jZXNzLiAqLwogICAgIC8vIEZJWE1FIG1ha2UgcHJpdmF0ZSB3aGVuIG9idGFpbkJ1ZmZlcigpIGZvciBUUkFOU0ZFUl9PQlRBSU4gaXMgcmVtb3ZlZAogICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyKTsKQEAgLTU1MSw4ICs1NDgsMTEgQEAKICAgICAgKiAgICAgIFdPVUxEX0JMT0NLICAgICAgICAgd2hlbiBvYnRhaW5CdWZmZXIoKSByZXR1cm5zIHNhbWUsIG9yCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2sgd2FzIHN0b3BwZWQgZHVyaW5nIHRoZSB3cml0ZQogICAgICAqICAgICAgb3IgYW55IG90aGVyIGVycm9yIGNvZGUgcmV0dXJuZWQgYnkgSUF1ZGlvVHJhY2s6OnN0YXJ0KCkgb3IgcmVzdG9yZVRyYWNrX2woKS4KKyAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIG9ubHkgcmV0dXJuIHVudGlsIGFsbCBkYXRhIGhhcyBiZWVuIHRyYW5zZmVycmVkLiBTZXQgJ2Jsb2NraW5nJyB0bworICAgICAqIGZhbHNlIGZvciB0aGUgbWV0aG9kIHRvIHJldHVybiBpbW1lZGlhdGVseSB3aXRob3V0IHdhaXRpbmcgdG8gdHJ5IG11bHRpcGxlIHRpbWVzIHRvIHdyaXRlCisgICAgICogdGhlIGZ1bGwgY29udGVudCBvZiB0aGUgYnVmZmVyLgogICAgICAqLwotICAgICAgICAgICAgc3NpemVfdCAgICAgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nID0gdHJ1ZSk7CiAKICAgICAvKgogICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyB0cmFjay4KQEAgLTU2Niw3ICs1NjYsNyBAQAogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0VW5kZXJydW5GcmFtZXMoKSBjb25zdDsKIAogICAgIC8qIEdldCB0aGUgZmxhZ3MgKi8KLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRGbGFncygpIGNvbnN0IHsgQXV0b011dGV4IF9sKG1Mb2NrKTsgcmV0dXJuIG1GbGFnczsgfQogCiAgICAgLyogU2V0IHBhcmFtZXRlcnMgLSBvbmx5IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGlyZWN0IG91dHB1dCAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKQEAgLTU4MCw3ICs1ODAsMTUgQEAKICAgICAgKiBDYXV0aW9uOiBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvbyBvZnRlbiBtYXkgYmUgaW5lZmZpY2llbnQ7CiAgICAgICogaWYgeW91IG5lZWQgYSBoaWdoIHJlc29sdXRpb24gbWFwcGluZyBiZXR3ZWVuIGZyYW1lIHBvc2l0aW9uIGFuZCBwcmVzZW50YXRpb24gdGltZSwKICAgICAgKiBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhhdCBhdCBhcHBsaWNhdGlvbiBsZXZlbCwgYmFzZWQgb24gdGhlIGxvdyByZXNvbHV0aW9uIHRpbWVzdGFtcHMuCi0gICAgICogUmV0dXJucyBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCisgICAgICogUmV0dXJucyBOT19FUlJPUiAgICBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCisgICAgICogICAgICAgICBXT1VMRF9CTE9DSyBpZiBjYWxsZWQgaW4gU1RPUFBFRCBvciBGTFVTSEVEIHN0YXRlLCBvciBpZiBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0L0FDVElWRSwgd2hlbiB0aGUgbnVtYmVyIG9mIGZyYW1lcyBjb25zdW1lZCBpcyBsZXNzIHRoYW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICBvdmVyYWxsIGhhcmR3YXJlIGxhdGVuY3kgdG8gcGh5c2ljYWwgb3V0cHV0LiBJbiBXT1VMRF9CTE9DSyBjYXNlcywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9uZSBtaWdodCBwb2xsIGFnYWluLCBvciB1c2UgZ2V0UG9zaXRpb24oKSwgb3IgdXNlIDAgcG9zaXRpb24gYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHRpbWUgZm9yIHRoZSB0aW1lc3RhbXAuCisgICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiAgaWYgY2FsbGVkIG9uIGEgRmFzdFRyYWNrLCB3cm9uZyBzdGF0ZSwgb3Igc29tZSBvdGhlciBlcnJvci4KKyAgICAgKgorICAgICAqIFRoZSB0aW1lc3RhbXAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBvbiByZXR1cm4sIGlmIHN0YXR1cyBpcyBub3QgTk9fRVJST1IuCiAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CiAKQEAgLTU4OSw2ICs1OTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soY29uc3QgQXVkaW9UcmFjayYgb3RoZXIpOwogICAgICAgICAgICAgQXVkaW9UcmFjayYgb3BlcmF0b3IgPSAoY29uc3QgQXVkaW9UcmFjayYgb3RoZXIpOwogCisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRBdHRyaWJ1dGVzRnJvbVN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFN0cmVhbVR5cGVGcm9tQXR0cmlidXRlcyhhdWRpb19hdHRyaWJ1dGVzX3QmIGFhKTsKKyAgICAvKiBwYWEgaXMgZ3VhcmFudGVlZCBub24tTlVMTCAqLworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpOworCiAgICAgLyogYSBzbWFsbCBpbnRlcm5hbCBjbGFzcyB0byBoYW5kbGUgdGhlIGNhbGxiYWNrICovCiAgICAgY2xhc3MgQXVkaW9UcmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQKICAgICB7CkBAIC02MjYsNTMgKzYzOSw2MyBAQAogICAgICAgICAgICAgLy8gICAgICBOU19JTkFDVElWRSBpbmFjdGl2ZSBzbyBkb24ndCBydW4gYWdhaW4gdW50aWwgcmUtc3RhcnRlZAogICAgICAgICAgICAgLy8gICAgICBOU19ORVZFUiAgICBuZXZlciBhZ2FpbgogICAgICAgICAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgTlNfV0hFTkVWRVIgPSAtMSwgTlNfSU5BQ1RJVkUgPSAtMiwgTlNfTkVWRVIgPSAtMzsKLSAgICAgICAgICAgIG5zZWNzX3QgcHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+JiB0aHJlYWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgcHJvY2Vzc1N0cmVhbUVuZChpbnQzMl90IHdhaXRDb3VudCk7CisgICAgICAgICAgICBuc2Vjc190IHByb2Nlc3NBdWRpb0J1ZmZlcigpOwogCisgICAgICAgICAgICBib29sICAgICBpc09mZmxvYWRlZCgpIGNvbnN0OworICAgICAgICAgICAgYm9vbCAgICAgaXNEaXJlY3QoKSBjb25zdDsKKyAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSBjb25zdDsKIAogICAgICAgICAgICAgLy8gY2FsbGVyIG11c3QgaG9sZCBsb2NrIG9uIG1Mb2NrIGZvciBhbGwgX2wgbWV0aG9kcwogCi0gICAgICAgICAgICBzdGF0dXNfdCBjcmVhdGVUcmFja19sKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlcG9jaCk7CisgICAgICAgICAgICBzdGF0dXNfdCBjcmVhdGVUcmFja19sKCk7CiAKICAgICAgICAgICAgIC8vIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUKICAgICAgICAgICAgIHZvaWQgZmx1c2hfbCgpOwogCiAgICAgICAgICAgICB2b2lkIHNldExvb3BfbCh1aW50MzJfdCBsb29wU3RhcnQsIHVpbnQzMl90IGxvb3BFbmQsIGludCBsb29wQ291bnQpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0X2woKTsKIAogICAgICAgICAgICAgLy8gRklYTUUgZW51bSBpcyBmYXN0ZXIgdGhhbiBzdHJjbXAoKSBmb3IgcGFyYW1ldGVyICdmcm9tJwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdG9yZVRyYWNrX2woY29uc3QgY2hhciAqZnJvbSk7CiAKLSAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3QKKyAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkX2woKSBjb25zdAogICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwOyB9CiAKLSAgICAvLyBOZXh0IDMgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMAorICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgY29uc3QKKyAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUR8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSAhPSAwOyB9CisKKyAgICAgICAgICAgIGJvb2wgICAgIGlzRGlyZWN0X2woKSBjb25zdAorICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KKworICAgICAgICAgICAgLy8gaW5jcmVtZW50IG1Qb3NpdGlvbiBieSB0aGUgZGVsdGEgb2YgbVNlcnZlciwgYW5kIHJldHVybiBuZXcgdmFsdWUgb2YgbVBvc2l0aW9uCisgICAgICAgICAgICB1aW50MzJfdCB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CisKKyAgICAvLyBOZXh0IDQgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMAogICAgIHNwPElBdWRpb1RyYWNrPiAgICAgICAgIG1BdWRpb1RyYWNrOwogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOyAgICAgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBieSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KCkKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+ICAgIG1BdWRpb1RyYWNrVGhyZWFkOworCiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVZvbHVtZVsyXTsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgIG11dGFibGUgdWludDMyX3QgICAgICAgIG1TYW1wbGVSYXRlOyAgICAgICAgICAgIC8vIG11dGFibGUgYmVjYXVzZSBnZXRTYW1wbGVSYXRlKCkgY2FuIHVwZGF0ZSBpdC4KLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBjdXJyZW50IElBdWRpb1RyYWNrCi0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQ7ICAgICAgICAgLy8gZnJhbWUgY291bnQgdG8gcmVxdWVzdCB0aGUgbmV4dCB0aW1lIGEgbmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUF1ZGlvVHJhY2sgaXMgbmVlZGVkCi0KKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBjdXJyZW50IElBdWRpb1RyYWNrLCB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGJhY2sgYnkgQXVkaW9GbGluZ2VyIHRvIHRoZSBjbGllbnQKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudDsgICAgICAgICAvLyBmcmFtZSBjb3VudCB0byByZXF1ZXN0IHRoZSBmaXJzdCBvciBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG5ldyBJQXVkaW9UcmFjayBpcyBuZWVkZWQsIG5vbi1kZWNyZWFzaW5nCiAKICAgICAvLyBjb25zdGFudCBhZnRlciBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgICAgICAgIC8vIGFzIHJlcXVlc3RlZCBieSBjbGllbnQsIG5vdCBmb3JjZWQgdG8gMTYtYml0CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICBtQ2hhbm5lbE1hc2s7CisgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlcjsKICAgICB0cmFuc2Zlcl90eXBlICAgICAgICAgICBtVHJhbnNmZXI7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgICAgbU9mZmxvYWRJbmZvQ29weTsKKyAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCogbU9mZmxvYWRJbmZvOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyaWJ1dGVzOwogCiAgICAgLy8gbUZyYW1lU2l6ZSBpcyBlcXVhbCB0byBtRnJhbWVTaXplQUYgZm9yIG5vbi1QQ00gb3IgMTYtYml0IFBDTSBkYXRhLiAgRm9yIDgtYml0IFBDTSBkYXRhLCBpdCdzCiAgICAgLy8gdHdpY2UgYXMgbGFyZ2UgYXMgbUZyYW1lU2l6ZSBiZWNhdXNlIGRhdGEgaXMgZXhwYW5kZWQgdG8gMTYtYml0IGJlZm9yZSBpdCdzIHN0b3JlZCBpbiBidWZmZXIuCkBAIC03MDUsMjEgKzcyOCwzOSBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7IC8vIGFjdHVhbCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBpbml0aWFsIHNvdXJjZSBzYW1wbGUgcmF0ZQotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nOyAgICAgIC8vIHByb2Nlc3NBdWRpb0J1ZmZlcigpIHNob3VsZCByZWZyZXNoIG5leHQgMgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nOyAgICAgIC8vIHByb2Nlc3NBdWRpb0J1ZmZlcigpIHNob3VsZCByZWZyZXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJlbWFpbmluZ0ZyYW1lcyBhbmQgbVJldHJ5T25QYXJ0aWFsQnVmZmVyCiAKICAgICAvLyBUaGVzZSBhcmUgcHJpdmF0ZSB0byBwcm9jZXNzQXVkaW9CdWZmZXIoKSwgYW5kIGFyZSBub3QgcHJvdGVjdGVkIGJ5IGEgbG9jawogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXM7ICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgdG8gcmVxdWVzdCBpbiBvYnRhaW5CdWZmZXIoKQogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZXRyeU9uUGFydGlhbEJ1ZmZlcjsgIC8vIHNsZWVwIGFuZCByZXRyeSBhZnRlciBwYXJ0aWFsIG9idGFpbkJ1ZmZlcigpCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU9ic2VydmVkU2VxdWVuY2U7ICAgICAgLy8gbGFzdCBvYnNlcnZlZCB2YWx1ZSBvZiBtU2VxdWVuY2UKIAotICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxvb3BQZXJpb2Q7ICAgICAgICAgICAgLy8gaW4gZnJhbWVzLCB6ZXJvIG1lYW5zIGxvb3BpbmcgaXMgZGlzYWJsZWQKKwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1NYXJrZXJQb3NpdGlvbjsgICAgICAgIC8vIGluIHdyYXBwaW5nIChvdmVyZmxvdykgZnJhbWUgdW5pdHMKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtTWFya2VyUmVhY2hlZDsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTmV3UG9zaXRpb247ICAgICAgICAgICAvLyBpbiBmcmFtZXMKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVXBkYXRlUGVyaW9kOyAgICAgICAgICAvLyBpbiBmcmFtZXMsIHplcm8gbWVhbnMgbm8gRVZFTlRfTkVXX1BPUworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TZXJ2ZXI7ICAgICAgICAgICAgICAgIC8vIGluIGZyYW1lcywgbGFzdCBrbm93biBtUHJveHktPmdldFBvc2l0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBjb3VudCBvZiBmcmFtZXMgY29uc3VtZWQgYnkgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGJ5IG5ldyBJQXVkaW9UcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIGl0IGlzIHJlc2V0IGJ5IHN0b3AoKSBpcyBUQkQKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUG9zaXRpb247ICAgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIGxpa2UgbVNlcnZlciBleGNlcHQgY29udGludWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9ub3RvbmljYWxseSBhZnRlciBuZXcgSUF1ZGlvVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvdWxkIGJlIGVhc2lseSB3aWRlbmVkIHRvIHVpbnQ2NF90CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbGVhc2VkOyAgICAgICAgICAgICAgLy8gaW4gZnJhbWVzLCBjb3VudCBvZiBmcmFtZXMgcmVsZWFzZWQgdG8gc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG5vdCBuZWNlc3NhcmlseSBjb25zdW1lZCBieSBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgYnkgc3RvcCgpIGJ1dCBjb250aW51ZXMgbW9ub3RvbmljYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIG5ldyBJQXVkaW9UcmFjayB0byByZXN0b3JlIG1Qb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY291bGQgYmUgZWFzaWx5IHdpZGVuZWQgdG8gdWludDY0X3QKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtU3RhcnRVczsgICAgICAgICAgICAgICAvLyB0aGUgc3RhcnQgdGltZSBhZnRlciBmbHVzaCBvciBzdG9wLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXNlZCBmb3Igb2ZmbG9hZGVkIGFuZCBkaXJlY3QgdHJhY2tzLgogCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWdzOworICAgICAgICAvLyBjb25zdCBhZnRlciBzZXQoKSwgZXhjZXB0IGZvciBiaXRzIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgYW5kIEFVRElPX09VVFBVVF9GTEFHX09GRkxPQUQuCisgICAgICAgIC8vIG1Mb2NrIG11c3QgYmUgaGVsZCB0byByZWFkIG9yIHdyaXRlIHRob3NlIGJpdHMgcmVsaWFibHkuCisKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKIApAQCAtNzM5LDcgKzc4MCw2IEBACiAgICAgc3A8QXVkaW9UcmFja0NsaWVudFByb3h5PiAgICAgICBtUHJveHk7ICAgICAgICAgLy8gcHJpbWFyeSBvd25lciBvZiB0aGUgbWVtb3J5CiAKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtSW5VbmRlcnJ1bjsgICAgICAgICAgICAvLyB3aGV0aGVyIHRyYWNrIGlzIGN1cnJlbnRseSBpbiB1bmRlcnJ1biBzdGF0ZQotICAgIFN0cmluZzggICAgICAgICAgICAgICAgIG1OYW1lOyAgICAgICAgICAgICAgICAgIC8vIHNlcnZlcidzIG5hbWUgZm9yIHRoaXMgSUF1ZGlvVHJhY2sKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUGF1c2VkUG9zaXRpb247CiAKIHByaXZhdGU6CkBAIC03NTQsOCArNzk0LDggQEAKIAogICAgIHNwPERlYXRoTm90aWZpZXI+ICAgICAgIG1EZWF0aE5vdGlmaWVyOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TZXF1ZW5jZTsgICAgICAgICAgICAgIC8vIGluY3JlbWVudGVkIGZvciBlYWNoIG5ldyBJQXVkaW9UcmFjayBhdHRlbXB0Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbU91dHB1dDsgICAgICAgICAgICAgICAgLy8gY2FjaGVkIG91dHB1dCBpbyBoYW5kbGUKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkOworICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiB9OwogCiBjbGFzcyBUaW1lZEF1ZGlvVHJhY2sgOiBwdWJsaWMgQXVkaW9UcmFjawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmggYi9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFhMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0NIQVJBQ1RFUl9FTkNPRElOR19ERVRFQ1RPUl9ICisjZGVmaW5lIF9DSEFSQUNURVJfRU5DT0RJTkdfREVURUNUT1JfSAorCisjaW5jbHVkZSA8bWVkaWEvbWVkaWFzY2FubmVyLmg+CisKKyNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgorCisjaW5jbHVkZSAidW5pY29kZS91Y252LmgiCisjaW5jbHVkZSAidW5pY29kZS91Y3NkZXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzdHJpbmcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yIHsKKworICAgIHB1YmxpYzoKKyAgICBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCk7CisgICAgICAgIH5DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCk7CisKKyAgICAgICAgdm9pZCBhZGRUYWcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworICAgICAgICBzaXplX3Qgc2l6ZSgpOworCisgICAgICAgIHZvaWQgZGV0ZWN0QW5kQ29udmVydCgpOworICAgICAgICBzdGF0dXNfdCBnZXRUYWcoaW50IGluZGV4LCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhcioqdmFsdWUpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCAqZ2V0UHJlZmVycmVkKAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlucHV0LCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hLCBzaXplX3QgbWF0Y2hlcywKKyAgICAgICAgICAgICAgICBib29sICpnb29kbWF0Y2gsIGludCAqaGlnaGVzdG1hdGNoKTsKKworICAgICAgICBib29sIGlzRnJlcXVlbnQoY29uc3QgdWludDE2X3QgKnZhbHVlcywgdWludDMyX3QgYyk7CisKKyAgICAgICAgLy8gY2FjaGVkIG5hbWUgYW5kIHZhbHVlIHN0cmluZ3MsIGZvciBuYXRpdmUgZW5jb2Rpbmcgc3VwcG9ydC4KKyAgICAgICAgLy8gVE9ETzogcmVwbGFjZSB0aGVzZSB3aXRoIGJ5dGUgYmxvYiBhcnJheXMgdGhhdCBkb24ndCByZXF1aXJlIHRoZSBkYXRhIHRvIGJlCisgICAgICAgIC8vIHNpbmdsZW51bGxieXRlLXRlcm1pbmF0ZWQKKyAgICAgICAgU3RyaW5nQXJyYXkgICAgIG1OYW1lczsKKyAgICAgICAgU3RyaW5nQXJyYXkgICAgIG1WYWx1ZXM7CisKKyAgICAgICAgVUNvbnZlcnRlciogICAgIG1VdGY4Q29udjsKK307CisKKworCit9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IDg5OWQ3OWYuLjMxYTE0ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC01MCw2ICs1MCw3IEBACiAgICAgICAgIFRSQUNLX1RJTUVEICAgPSAxLCAgLy8gY2xpZW50IHJlcXVlc3RzIGEgVGltZWRBdWRpb1RyYWNrCiAgICAgICAgIFRSQUNLX0ZBU1QgICAgPSAyLCAgLy8gY2xpZW50IHJlcXVlc3RzIGEgZmFzdCBBdWRpb1RyYWNrIG9yIEF1ZGlvUmVjb3JkCiAgICAgICAgIFRSQUNLX09GRkxPQUQgPSA0LCAgLy8gY2xpZW50IHJlcXVlc3RzIG9mZmxvYWQgdG8gaHcgY29kZWMKKyAgICAgICAgVFJBQ0tfRElSRUNUID0gOCwgICAvLyBjbGllbnQgcmVxdWVzdHMgYSBkaXJlY3Qgb3V0cHV0CiAgICAgfTsKICAgICB0eXBlZGVmIHVpbnQzMl90IHRyYWNrX2ZsYWdzX3Q7CiAKQEAgLTY0LDM3ICs2NSwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBBdWRpb0ZsaW5nZXIgdGFrZXMgb3ZlciB0aGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBhbmQgd2lsbCByZWxlYXNlIGl0IHdoZW4gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBvbiBmYWlsdXJlLCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwgIC8vIC0xIG1lYW5zIHVudXNlZCwgb3RoZXJ3aXNlIG11c3QgYmUgdmFsaWQgbm9uLTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0OiBpZ25vcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dDogc2VydmVyJ3MgZGVzY3JpcHRpb24gb2YgSUF1ZGlvVHJhY2sgZm9yIGRpc3BsYXkgaW4gbG9ncy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXR0ZW1wdCB0byBwYXJzZSwgYXMgdGhlIGZvcm1hdCBjb3VsZCBjaGFuZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpID0gMDsKIAogICAgIHZpcnR1YWwgc3A8SUF1ZGlvUmVjb3JkPiBvcGVuUmVjb3JkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzZnVsIHJldHVybiwgQXVkaW9GbGluZ2VyIHRha2VzIG92ZXIgdGhlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgYW5kIHdpbGwgcmVsZWFzZSBpdCB3aGVuIHRoZSB0cmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgb24gZmFpbHVyZSwgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLCAgLy8gLTEgbWVhbnMgdW51c2VkLCBvdGhlcndpc2UgbXVzdCBiZSB2YWxpZCBub24tMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywgICAvLyByZXR1cm4gdmFsdWUgMCBtZWFucyBpdCBmb2xsb3dzIGNibGsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgPSAwOwogCiAgICAgLyogcXVlcnkgdGhlIGF1ZGlvIGhhcmR3YXJlIHN0YXRlLiBUaGlzIHN0YXRlIG5ldmVyIGNoYW5nZXMsCiAgICAgICogYW5kIHRoZXJlZm9yZSBjYW4gYmUgY2FjaGVkLgogICAgICAqLwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCA9IDA7Ci0jaWYgMAotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0ID0gMDsKLSNlbmRpZgogICAgIHZpcnR1YWwgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwogCkBAIC0xNDIsNDAgKzE0NSw0MSBAQAogICAgIHZpcnR1YWwgc2l6ZV90IGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1PdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24oc2l6ZV90ICpoYWxGcmFtZXMsIHNpemVfdCAqZHNwRnJhbWVzLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkgPSAwOworICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKSBjb25zdCA9IDA7CiAKQEAgLTE4OCw2ICsxOTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlciBkb2Vzbid0IHRha2Ugb3ZlciBoYW5kbGUgcmVmZXJlbmNlIGZyb20gY2xpZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKQEAgLTIwOSw2ICsyMTQsMjkgQEAKICAgICAvLyBhbmQgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UuICBGb3IgYSBkZWZpbml0aW9uIG9mIHdoYXQgImxvdyBSQU0iIG1lYW5zLCBzZWUKICAgICAvLyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UoKS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKSA9IDA7CisKKyAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpID0gMDsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgPSAwOworCisgICAgLyogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKworICAgIC8qIFJlbGVhc2UgYW4gYXVkaW8gcGF0Y2ggKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykgPSAwOworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworCisgICAgLyogR2V0IHRoZSBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIHVzZWQgZm9yIGFuIGF1ZGlvIHNlc3Npb24gKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDA5YjllYTYuLjE2ZmU5Y2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIApAQCAtNTUsNiArNTYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKSA9IDA7CkBAIC02MywxMyArNzAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSAwKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkgPSAwOwpAQCAtOTksNiArMTEwLDQwIEBACiAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykgPSAwOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgPSAwOworCisgICAgLyogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKworICAgIC8qIFJlbGVhc2UgYW4gYXVkaW8gcGF0Y2ggKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKSA9IDA7CisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGYwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAorCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KTsKKworICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgPSAwOworICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHBhdGNoIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaAppbmRleCBlY2NjMmNhLi4yMDAzOTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKQEAgLTM0LDkgKzM0LDYgQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvUmVjb3JkKTsKIAotICAgIC8qIGdldCB0aGlzIHRyYWNrcyBjb250cm9sIGJsb2NrICovCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QgPSAwOwotCiAgICAgLyogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KICAgICAgKiBtYWtlIGl0IGFjdGl2ZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAppbmRleCA1YzhhNDg0Li42MTlhYzc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCkBAIC04OCw3ICs4OCw3IEBACiAgICAgLyogU2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSA9IDA7CiAKLSAgICAvKiBSZXR1cm4gTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkICovCisgICAgLyogUmV0dXJuIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4gIHRpbWVzdGFtcCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLiAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApID0gMDsKIAogICAgIC8qIFNpZ25hbCB0aGUgcGxheWJhY2sgdGhyZWFkIGZvciBhIGNoYW5nZSBpbiBjb250cm9sIGJsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lEcm0uaCBiL2luY2x1ZGUvbWVkaWEvSURybS5oCmluZGV4IDMyYWUyOGUuLjY4ZGU4N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSURybS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSURybS5oCkBAIC03MCw2ICs3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzZWE4YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNMaXN0LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9JTUVESUFDT0RFQ0xJU1RfSAorI2RlZmluZSBBTkRST0lEX0lNRURJQUNPREVDTElTVF9ICisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gIC8vIGZvciBzdGF0dXNfdAorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKKworY2xhc3MgSU1lZGlhQ29kZWNMaXN0OiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFDb2RlY0xpc3QpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRDb2RlY3MoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzcDxNZWRpYUNvZGVjSW5mbz4gZ2V0Q29kZWNJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5VHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXggPSAwKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0ID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5NZWRpYUNvZGVjTGlzdDogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYUNvZGVjTGlzdD4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0lNRURJQUNPREVDTElTVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2M2ViNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJX01FRElBX0hUVFBfQ09OTkVDVElPTl9IXworCisjZGVmaW5lIElfTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbjsKKworLyoqIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggSU1lZGlhSFRUUENvbm5lY3Rpb24uYWlkbCAqLworCitzdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgSUludGVyZmFjZSB7CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUhUVFBDb25uZWN0aW9uKTsKKworICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSU1lZGlhSFRUUENvbm5lY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJX01FRElBX0hUVFBfQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NmQ2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSV9NRURJQV9IVFRQX1NFUlZJQ0VfSF8KKworI2RlZmluZSBJX01FRElBX0hUVFBfU0VSVklDRV9IXworCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCisvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQU2VydmljZS5haWRsICovCisKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhSFRUUFNlcnZpY2UpOworCisgICAgdmlydHVhbCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgPSAwOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElNZWRpYUhUVFBTZXJ2aWNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSV9NRURJQV9IVFRQX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCA2ZGJiMmQ3Li4yNTI5ODAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNiw2ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworCiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjogcHVibGljIElJbnRlcmZhY2UKIHsKIHB1YmxpYzoKQEAgLTMzLDYgKzM1LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggMGNiZDI2OS4uZGI2MmNkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0zMyw2ICszMyw3IEBACiBjbGFzcyBTdXJmYWNlOwogY2xhc3MgSVN0cmVhbVNvdXJjZTsKIGNsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiAKIGNsYXNzIElNZWRpYVBsYXllcjogcHVibGljIElJbnRlcmZhY2UKIHsKQEAgLTQxLDggKzQyLDExIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4qIGhlYWRlcnMpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+JiBzb3VyY2UpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAyOTk4YjM3Li5kN2U1ODRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMzQsNiArMzQsOCBAQAogc3RydWN0IElDcnlwdG87CiBzdHJ1Y3QgSURybTsKIHN0cnVjdCBJSERDUDsKK3N0cnVjdCBJTWVkaWFDb2RlY0xpc3Q7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFSZWNvcmRlcjsKIGNsYXNzIElPTVg7CiBjbGFzcyBJUmVtb3RlRGlzcGxheTsKQEAgLTQ5LDkgKzUxLDE0IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gY3JlYXRlTWV0YWRhdGFSZXRyaWV2ZXIoKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBhdWRpb1Nlc3Npb25JZCA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOwpAQCAtNTksNiArNjYsNyBAQAogICAgIHZpcnR1YWwgc3A8SUNyeXB0bz4gICAgICAgICBtYWtlQ3J5cHRvKCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SURybT4gICAgICAgICAgICBtYWtlRHJtKCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SUhEQ1A+ICAgICAgICAgICBtYWtlSERDUChib29sIGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0Q29kZWNMaXN0KCkgY29uc3QgPSAwOwogCiAgICAgLy8gQ29ubmVjdHMgdG8gYSByZW1vdGUgZGlzcGxheS4KICAgICAvLyAnaWZhY2UnIHNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYWwgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IKQEAgLTkzLDkgKzEwMSw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgYWRkQmF0dGVyeURhdGEodWludDMyX3QgcGFyYW1zKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwdWxsQmF0dGVyeURhdGEoUGFyY2VsKiByZXBseSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JT01YLmggYi9pbmNsdWRlL21lZGlhL0lPTVguaAppbmRleCBkN2JlMDZmLi41OTVlNTFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lPTVguaAorKysgYi9pbmNsdWRlL21lZGlhL0lPTVguaApAQCAtMzgsOCArMzgsOCBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoT01YKTsKIAotICAgIHR5cGVkZWYgdm9pZCAqYnVmZmVyX2lkOwotICAgIHR5cGVkZWYgdm9pZCAqbm9kZV9pZDsKKyAgICB0eXBlZGVmIHVpbnQzMl90IGJ1ZmZlcl9pZDsKKyAgICB0eXBlZGVmIHVpbnQzMl90IG5vZGVfaWQ7CiAKICAgICAvLyBHaXZlbiBhIG5vZGVfaWQgYW5kIHRoZSBjYWxsaW5nIHByb2Nlc3MnIHBpZCwgcmV0dXJucyB0cnVlIGlmZgogICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT01YIGludGVyZmFjZSBsaXZlcyBpbiB0aGUgc2FtZQpAQCAtODcsNiArODcsMTAgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKICAgICAgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCkgPSAwOwogCisgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSA9IDA7CiAKQEAgLTE0Myw2ICsxNDcsOCBAQAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fU1VTUEVORCwgIC8vIGRhdGEgaXMgYSBib29sCiAgICAgICAgIElOVEVSTkFMX09QVElPTl9SRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVksICAvLyBkYXRhIGlzIGFuIGludDY0X3QKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQLCAvLyBkYXRhIGlzIGludDY0X3QKKyAgICAgICAgSU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUsIC8vIGRhdGEgaXMgYW4gaW50NjRfdAorICAgICAgICBJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRSwgLy8gZGF0YSBpcyBhbiBpbnQ2NF90WzJdCiAgICAgfTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLApAQCAtMTgyLDggKzE4OCw2IEBACiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX2xlbmd0aDsKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3M7CiAgICAgICAgICAgICBPTVhfVElDS1MgdGltZXN0YW1wOwotICAgICAgICAgICAgT01YX1BUUiBwbGF0Zm9ybV9wcml2YXRlOwotICAgICAgICAgICAgT01YX1BUUiBkYXRhX3B0cjsKICAgICAgICAgfSBleHRlbmRlZF9idWZmZXJfZGF0YTsKIAogICAgIH0gdTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDU2YWRiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0NPREVDX0lORk9fSF8KKworI2RlZmluZSBNRURJQV9DT0RFQ19JTkZPX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBQYXJjZWw7CitzdHJ1Y3QgQ29kZWNDYXBhYmlsaXRpZXM7CisKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbyA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdHJ1Y3QgUHJvZmlsZUxldmVsIHsKKyAgICAgICAgdWludDMyX3QgbVByb2ZpbGU7CisgICAgICAgIHVpbnQzMl90IG1MZXZlbDsKKyAgICB9OworCisgICAgc3RydWN0IENhcGFiaWxpdGllcyA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzKSBjb25zdDsKKyAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoVmVjdG9yPHVpbnQzMl90PiAqY29sb3JGb3JtYXRzKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdDsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldERldGFpbHMoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzOworICAgICAgICBWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHM7CisgICAgICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1EZXRhaWxzOworCisgICAgICAgIENhcGFiaWxpdGllcygpOworCisgICAgICAgIC8vIHJlYWQgb2JqZWN0IGZyb20gcGFyY2VsIGV2ZW4gaWYgb2JqZWN0IGNyZWF0aW9uIGZhaWxzCisgICAgICAgIHN0YXRpYyBzcDxDYXBhYmlsaXRpZXM+IEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKKworICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYXBhYmlsaXRpZXMpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBNZWRpYUNvZGVjSW5mbzsKKyAgICB9OworCisgICAgYm9vbCBpc0VuY29kZXIoKSBjb25zdDsKKyAgICBib29sIGhhc1F1aXJrKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworICAgIHZvaWQgZ2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3Q7CisgICAgY29uc3Qgc3A8Q2FwYWJpbGl0aWVzPiBnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisgICAgY29uc3QgY2hhciAqZ2V0Q29kZWNOYW1lKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemF0aW9uIG92ZXIgQmluZGVyCisgICAgICovCisgICAgc3RhdGljIHNwPE1lZGlhQ29kZWNJbmZvPiBGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB2YXJpYWJsZSBzZXQgb25seSBpbiBjb25zdHJ1Y3RvciAtIHRoZXNlIGFyZSBhY2Nlc3NlZCBieSBNZWRpYUNvZGVjTGlzdAorICAgIC8vIHRvIGF2b2lkIGR1cGxpY2F0aW9uIG9mIHNhbWUgdmFyaWFibGVzCisgICAgQVN0cmluZyBtTmFtZTsKKyAgICBib29sIG1Jc0VuY29kZXI7CisgICAgYm9vbCBtSGFzU29sZU1pbWU7IC8vIHdhcyBpbml0aWFsaXplZCB3aXRoIG1pbWUKKworICAgIFZlY3RvcjxBU3RyaW5nPiBtUXVpcmtzOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPENhcGFiaWxpdGllcz4gPiBtQ2FwczsKKworICAgIHNwPENhcGFiaWxpdGllcz4gbUN1cnJlbnRDYXBzOyAvLyBjdXJyZW50bHkgaW5pdGFsaXplZCBjYXBhYmlsaXRpZXMKKworICAgIHNzaXplX3QgZ2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OworCisgICAgLyogTWV0aG9kcyB1c2VkIGJ5IE1lZGlhQ29kZWNMaXN0IHRvIGNvbnN0cnVjdCB0aGUgaW5mbworICAgICAqIG9iamVjdCBmcm9tIFhNTC4KKyAgICAgKgorICAgICAqIEFmdGVyIGluZm8gb2JqZWN0IGlzIGNyZWF0ZWQ6CisgICAgICogLSBhZGRpdGlvbmFsIHF1aXJrcyBjYW4gYmUgYWRkZWQKKyAgICAgKiAtIGFkZGl0aW9uYWwgbWltZXMgY2FuIGJlIGFkZGVkCisgICAgICogICAtIE9NWCBjb2RlYyBjYXBhYmlsaXRpZXMgY2FuIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgbWltZS10eXBlCisgICAgICogICAtIGEgY2FwYWJpbGl0eSBkZXRhaWwgY2FuIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgbWltZS10eXBlCisgICAgICogICAtIGEgZmVhdHVyZSBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKKyAgICAgKiAgIC0gaW5mbyBvYmplY3QgY2FuIGJlIGNvbXBsZXRlZCB3aGVuIHBhcnNpbmcgb2YgYSBtaW1lLXR5cGUgaXMgZG9uZQorICAgICAqLworICAgIE1lZGlhQ29kZWNJbmZvKEFTdHJpbmcgbmFtZSwgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKTsKKyAgICB2b2lkIGFkZFF1aXJrKGNvbnN0IGNoYXIgKm5hbWUpOworICAgIHN0YXR1c190IGFkZE1pbWUoY29uc3QgY2hhciAqbWltZSk7CisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBDb2RlY0NhcGFiaWxpdGllcyAmY2Fwcyk7CisgICAgdm9pZCBhZGREZXRhaWwoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBBU3RyaW5nICZ2YWx1ZSk7CisgICAgdm9pZCBhZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgaW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCBhZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgY2hhciAqdmFsdWUpOworICAgIHZvaWQgcmVtb3ZlTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICB2b2lkIGNvbXBsZXRlKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjSW5mbyk7CisKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFDb2RlY0xpc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0NPREVDX0lORk9fSF8KKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCmluZGV4IGVjYzNiNjUuLjM4ZGJiMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCkBAIC0yMCwxMCArMjAsMTMgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFzY2FubmVyLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworCiAvLyBBYnN0cmFjdCBiYXNlIGNsYXNzCiBjbGFzcyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlCiB7CkBAIC0zMiw2ICszNSw3IEBACiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2UoKSB7fQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggMjZkODcyOS4uY2YxOGE0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KIAogLy8gRndkIGRlY2wgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGFncmVlcyB0aGF0IHRoZSBzY29wZSBvZiBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXMKQEAgLTk3LDYgKzk4LDcgQEAKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGZsb2F0ICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCA9IDA7CkBAIC0xMzcsNiArMTM5LDcgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKQEAgLTIxMywxMSArMjE2LDYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXJTZXJ2aWNlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IDlmYzk2MmMuLmYwNjFkMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC0zMyw3ICszMyw4IEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfNzIwUCA9IDUsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFAgPSA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1FWR0EgPSA3LAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gNywKKyAgICBDQU1DT1JERVJfUVVBTElUWV8yMTYwUCA9IDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSA4LAogCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX1NUQVJUID0gMTAwMCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVyAgPSAxMDAwLApAQCAtNDQsNyArNDUsMTcgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzcyMFAgPSAxMDA1LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUVZHQSA9IDEwMDcsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMDcsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8yMTYwUCA9IDEwMDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMDgsCisKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfU1RBUlQgPSAyMDAwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTE9XICA9IDIwMDAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9ISUdIID0gMjAwMSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzQ4MFAgPSAyMDAyLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUCA9IDIwMDMsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8xMDgwUCA9IDIwMDQsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUCA9IDIwMDUsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORCA9IDIwMDUsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmggYi9pbmNsdWRlL21lZGlhL1NvdW5kUG9vbC5oCmluZGV4IDJkZDc4Y2MuLjU4MzA0NzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9Tb3VuZFBvb2wuaApAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgZnJpZW5kIGNsYXNzIFNvdW5kUG9vbFRocmVhZDsKICAgICBmcmllbmQgY2xhc3MgU291bmRDaGFubmVsOwogcHVibGljOgotICAgIFNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgaW50IHNyY1F1YWxpdHkpOworICAgIFNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpOwogICAgIH5Tb3VuZFBvb2woKTsKICAgICBpbnQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGludCBwcmlvcml0eSk7CiAgICAgaW50IGxvYWQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGludCBwcmlvcml0eSk7CkBAIC0xODMsOCArMTgzLDcgQEAKICAgICB2b2lkIHNldFByaW9yaXR5KGludCBjaGFubmVsSUQsIGludCBwcmlvcml0eSk7CiAgICAgdm9pZCBzZXRMb29wKGludCBjaGFubmVsSUQsIGludCBsb29wKTsKICAgICB2b2lkIHNldFJhdGUoaW50IGNoYW5uZWxJRCwgZmxvYXQgcmF0ZSk7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KLSAgICBpbnQgc3JjUXVhbGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1TcmNRdWFsaXR5OyB9CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyaWJ1dGVzKCkgeyByZXR1cm4gJm1BdHRyaWJ1dGVzOyB9CiAKICAgICAvLyBjYWxsZWQgZnJvbSBTb3VuZFBvb2xUaHJlYWQKICAgICB2b2lkIHNhbXBsZUxvYWRlZChpbnQgc2FtcGxlSUQpOwpAQCAtMjI1LDggKzIyNCw3IEBACiAgICAgTGlzdDxTb3VuZENoYW5uZWwqPiAgICAgbVN0b3A7CiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBpbnQsIHNwPFNhbXBsZT4gPiAgIG1TYW1wbGVzOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1NYXhDaGFubmVsczsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU3JjUXVhbGl0eTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cmlidXRlczsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQWxsb2NhdGVkOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1OZXh0U2FtcGxlSUQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU5leHRDaGFubmVsSUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5oIGIvaW5jbHVkZS9tZWRpYS9TdHJpbmdBcnJheS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggMGRmNzdjMS4uYjM1Y2YzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFQbGF5ZXJTZXJ2aWNlOwogY2xhc3MgSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7CiAKQEAgLTY4LDYgKzY5LDcgQEAKICAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YVNvdXJjZVVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAppbmRleCA0YzA1ZmMzLi45Y2MyMDhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCkBAIC0xNjAsNiArMTYwLDkgQEAKICAgICAvLyBQbGF5YmFjayByYXRlIGV4cHJlc3NlZCBpbiBwZXJtaWxsZSAoMTAwMCBpcyBub3JtYWwgc3BlZWQpLCBzYXZlZCBhcyBpbnQzMl90LCB3aXRoIG5lZ2F0aXZlCiAgICAgLy8gdmFsdWVzIHVzZWQgZm9yIHJld2luZGluZyBvciByZXZlcnNlIHBsYXliYWNrLgogICAgIEtFWV9QQVJBTUVURVJfUExBWUJBQ0tfUkFURV9QRVJNSUxMRSA9IDEzMDAsICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5CisKKyAgICAvLyBTZXQgYSBQYXJjZWwgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgYSBwYXJjZWxsZWQgSmF2YSBBdWRpb0F0dHJpYnV0ZSBpbnN0YW5jZQorICAgIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUyA9IDE0MDAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5CiB9OwogCiAvLyBLZWVwIElOVk9LRV9JRF8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllci5qYXZhLgpAQCAtMTcwLDYgKzE3Myw3IEBACiAgICAgSU5WT0tFX0lEX1NFTEVDVF9UUkFDSyA9IDQsCiAgICAgSU5WT0tFX0lEX1VOU0VMRUNUX1RSQUNLID0gNSwKICAgICBJTlZPS0VfSURfU0VUX1ZJREVPX1NDQUxJTkdfTU9ERSA9IDYsCisgICAgSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSyA9IDcKIH07CiAKIC8vIEtlZXAgTUVESUFfVFJBQ0tfVFlQRV8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllci5qYXZhLgpAQCAtMTg5LDYgKzE5Myw4IEBACiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7CiB9OwogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKIGNsYXNzIE1lZGlhUGxheWVyIDogcHVibGljIEJuTWVkaWFQbGF5ZXJDbGllbnQsCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElNZWRpYURlYXRoTm90aWZpZXIKIHsKQEAgLTE5OSw2ICsyMDUsNyBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC0yMjAsMTMgKzIyNywxOSBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludCAqbXNlYyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNMb29waW5nKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaiA9IE5VTEwpOwotICAgIHN0YXRpYyAgc3RhdHVzX3QgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOworICAgIHN0YXRpYyAgc3RhdHVzX3QgICAgICAgIGRlY29kZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCisgICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAorICAgICAgICAgICAgc2l6ZV90ICpwU2l6ZSk7CiAgICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKTsKQEAgLTI0Miw5ICsyNTUsNiBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFJldHJhbnNtaXRFbmRwb2ludChjb25zdCBjaGFyKiBhZGRyU3RyaW5nLCB1aW50MTZfdCBwb3J0KTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXROZXh0TWVkaWFQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXI+JiBwbGF5ZXIpOwogCi0gICAgICAgICAgICBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQogcHJpdmF0ZToKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhcl9sKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2Vla1RvX2woaW50IG1zZWMpOwpAQCAtMjUzLDYgKzI2Myw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoTmV3UGxheWVyKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcik7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXRfbCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGRvU2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgY2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpOwogCiAgICAgc3A8SU1lZGlhUGxheWVyPiAgICAgICAgICAgIG1QbGF5ZXI7CiAgICAgdGhyZWFkX2lkX3QgICAgICAgICAgICAgICAgIG1Mb2NrVGhyZWFkSWQ7CkBAIC0yNjcsNiArMjc4LDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVByZXBhcmVTeW5jOwogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZVN0YXR1czsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7CisgICAgUGFyY2VsKiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCA4OGE0MmEwLi5iMGE2MmE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMzksNyArMzksNyBAQAogZW51bSB2aWRlb19zb3VyY2UgewogICAgIFZJREVPX1NPVVJDRV9ERUZBVUxUID0gMCwKICAgICBWSURFT19TT1VSQ0VfQ0FNRVJBID0gMSwKLSAgICBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIgPSAyLAorICAgIFZJREVPX1NPVVJDRV9TVVJGQUNFID0gMiwKIAogICAgIFZJREVPX1NPVVJDRV9MSVNUX0VORCAgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBhdWRpbyBzb3VyY2UgdHlwZQogfTsKQEAgLTYxLDEyICs2MSwxOCBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FESUYgPSA1LAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCisgICAgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCA9IDcsIC8vIFVzZWQgaW4gdmFsaWRhdGluZyB0aGUgb3V0cHV0IGZvcm1hdC4gIFNob3VsZCBiZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCisKICAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KICAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LAogCiAgICAgLyogSC4yNjQvQUFDIGRhdGEgZW5jYXBzdWxhdGVkIGluIE1QRUcyL1RTICovCiAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTID0gOCwKIAorICAgIC8qIFZQOC9WT1JCSVMgZGF0YSBpbiBhIFdFQk0gY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9XRUJNID0gOSwKKwogICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogfTsKIApAQCAtNzcsNiArODMsNyBAQAogICAgIEFVRElPX0VOQ09ERVJfQUFDID0gMywKICAgICBBVURJT19FTkNPREVSX0hFX0FBQyA9IDQsCiAgICAgQVVESU9fRU5DT0RFUl9BQUNfRUxEID0gNSwKKyAgICBBVURJT19FTkNPREVSX1ZPUkJJUyA9IDYsCiAKICAgICBBVURJT19FTkNPREVSX0xJU1RfRU5EIC8vIG11c3QgYmUgdGhlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBhdWRpbyBlbmNvZGVyIHR5cGUKIH07CkBAIC04Niw2ICs5Myw3IEBACiAgICAgVklERU9fRU5DT0RFUl9IMjYzID0gMSwKICAgICBWSURFT19FTkNPREVSX0gyNjQgPSAyLAogICAgIFZJREVPX0VOQ09ERVJfTVBFR180X1NQID0gMywKKyAgICBWSURFT19FTkNPREVSX1ZQOCA9IDQsCiAKICAgICBWSURFT19FTkNPREVSX0xJU1RfRU5EIC8vIG11c3QgYmUgdGhlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIHRoZSB2aWRlbyBlbmNvZGVyIHR5cGUKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAppbmRleCBhNzM0MDNiLi5kNTU1Mjc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKIHN0cnVjdCBkaXJlbnQ7CkBAIC0yOSw2ICszMCw3IEBACiAKIGNsYXNzIE1lZGlhU2Nhbm5lckNsaWVudDsKIGNsYXNzIFN0cmluZ0FycmF5OworY2xhc3MgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcjsKIAogZW51bSBNZWRpYVNjYW5SZXN1bHQgewogICAgIC8vIFRoaXMgZmlsZSBvciBkaXJlY3Rvcnkgd2FzIHNjYW5uZWQgc3VjY2Vzc2Z1bGx5LgpAQCAtNDEsNiArNDMsMzEgQEAKICAgICBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUiwKIH07CiAKK3N0cnVjdCBNZWRpYUFsYnVtQXJ0IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgTWVkaWFBbGJ1bUFydCAqZnJvbURhdGEoaW50MzJfdCBzaXplLCBjb25zdCB2b2lkKiBkYXRhKTsKKworICAgIHN0YXRpYyB2b2lkIGluaXQoTWVkaWFBbGJ1bUFydCogaW5zdGFuY2UsIGludDMyX3Qgc2l6ZSwgY29uc3Qgdm9pZCogZGF0YSk7CisKKyAgICBNZWRpYUFsYnVtQXJ0ICpjbG9uZSgpOworCisgICAgY29uc3QgY2hhciAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuICZtRGF0YVswXTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBtU2l6ZTsKKyAgICBjaGFyIG1EYXRhW107CisKKyAgICAvLyBZb3UgY2FuJ3QgY29uc3RydWN0IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGRpcmVjdGx5IGJlY2F1c2UgdGhpcyBpcyBhCisgICAgLy8gdmFyaWFibGUtc2l6ZWQgb2JqZWN0IHBhc3NlZCB0aHJvdWdoIHRoZSBiaW5kZXIuCisgICAgTWVkaWFBbGJ1bUFydCgpOworfSBfX3BhY2tlZDsKKwogc3RydWN0IE1lZGlhU2Nhbm5lciB7CiAgICAgTWVkaWFTY2FubmVyKCk7CiAgICAgdmlydHVhbCB+TWVkaWFTY2FubmVyKCk7CkBAIC01Myw4ICs4MCw3IEBACiAKICAgICB2b2lkIHNldExvY2FsZShjb25zdCBjaGFyICpsb2NhbGUpOwogCi0gICAgLy8gZXh0cmFjdHMgYWxidW0gYXJ0IGFzIGEgYmxvY2sgb2YgZGF0YQotICAgIHZpcnR1YWwgY2hhciAqZXh0cmFjdEFsYnVtQXJ0KGludCBmZCkgPSAwOworICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCAqZXh0cmFjdEFsYnVtQXJ0KGludCBmZCkgPSAwOwogCiBwcm90ZWN0ZWQ6CiAgICAgY29uc3QgY2hhciAqbG9jYWxlKCkgY29uc3Q7CkBAIC05NCwxNSArMTIwLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pbWVUeXBlKGNvbnN0IGNoYXIqIG1pbWVUeXBlKSA9IDA7CiAKIHByb3RlY3RlZDoKLSAgICB2b2lkIGNvbnZlcnRWYWx1ZXModWludDMyX3QgZW5jb2RpbmcpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gY2FjaGVkIG5hbWUgYW5kIHZhbHVlIHN0cmluZ3MsIGZvciBuYXRpdmUgZW5jb2Rpbmcgc3VwcG9ydC4KLSAgICBTdHJpbmdBcnJheSogICAgbU5hbWVzOwotICAgIFN0cmluZ0FycmF5KiAgICBtVmFsdWVzOwotCi0gICAgLy8gZGVmYXVsdCBlbmNvZGluZyBiYXNlZCBvbiBNZWRpYVNjYW5uZXI6Om1Mb2NhbGUgc3RyaW5nCi0gICAgdWludDMyX3QgICAgICAgIG1Mb2NhbGVFbmNvZGluZzsKKyAgICAvLyBkZWZhdWx0IGVuY29kaW5nIGZyb20gTWVkaWFTY2FubmVyOjptTG9jYWxlCisgICAgU3RyaW5nOCBtTG9jYWxlOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKaW5kZXggMmM0YWFmZi4uYjE2ZTIwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKQEAgLTI3LDcgKzI3LDcgQEAKIGNsYXNzIEF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UgOiBwdWJsaWMgTkJBSU9fU291cmNlIHsKIAogcHVibGljOgotICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoQXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsIE5CQUlPX0Zvcm1hdCBmb3JtYXQpOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoQXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKICAgICB2aXJ0dWFsIH5BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlKCk7CiAKICAgICAvLyBOQkFJT19Qb3J0IGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaAppbmRleCAwN2Q4Yzg5Li41MTY5ZjFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApAQCAtNDMsOSArNDMsOSBAQAogCiAgICAgLy8gVGhpcyBpcyBhbiBvdmVyLWVzdGltYXRlLCBhbmQgY291bGQgZHVwZSB0aGUgY2FsbGVyIGludG8gbWFraW5nIGEgYmxvY2tpbmcgcmVhZCgpCiAgICAgLy8gRklYTUUgVXNlIGFuIGF1ZGlvIEhBTCBBUEkgdG8gcXVlcnkgdGhlIGJ1ZmZlciBmaWxsaW5nIHN0YXR1cyB3aGVuIGl0J3MgYXZhaWxhYmxlLgotICAgIHZpcnR1YWwgc3NpemVfdCBhdmFpbGFibGVUb1JlYWQoKSB7IHJldHVybiBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzID4+IG1CaXRTaGlmdDsgfQorICAgIHZpcnR1YWwgc3NpemVfdCBhdmFpbGFibGVUb1JlYWQoKSB7IHJldHVybiBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzIC8gbUZyYW1lU2l6ZTsgfQogCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpOworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMpOwogCiAgICAgLy8gTkJBSU9fU2luayBlbmQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKaW5kZXggNzk0OGQ0MC4uOTk0OWI4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCkBAIC00Myw3ICs0Myw3IEBACiAKICAgICAvLyBUaGlzIGlzIGFuIG92ZXItZXN0aW1hdGUsIGFuZCBjb3VsZCBkdXBlIHRoZSBjYWxsZXIgaW50byBtYWtpbmcgYSBibG9ja2luZyB3cml0ZSgpCiAgICAgLy8gRklYTUUgVXNlIGFuIGF1ZGlvIEhBTCBBUEkgdG8gcXVlcnkgdGhlIGJ1ZmZlciBlbXB0eWluZyBzdGF0dXMgd2hlbiBpdCdzIGF2YWlsYWJsZS4KLSAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPj4gbUJpdFNoaWZ0OyB9CisgICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzIC8gbUZyYW1lU2l6ZTsgfQogCiAgICAgdmlydHVhbCBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCmluZGV4IGQzODAyZmUuLmIwOWIzNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAvLyBOb3RlOiB3aGF0ZXZlciBzaGFyZXMgdGhpcyBvYmplY3Qgd2l0aCBhbm90aGVyIHRocmVhZCBuZWVkcyB0byBkbyBzbyBpbiBhbiBTTVAtc2FmZSB3YXkgKGxpa2UKICAgICAvLyBjcmVhdGluZyBpdCB0aGUgb2JqZWN0IGJlZm9yZSBjcmVhdGluZyB0aGUgb3RoZXIgdGhyZWFkLCBvciBzdG9yaW5nIHRoZSBvYmplY3Qgd2l0aCBhCiAgICAgLy8gcmVsZWFzZV9zdG9yZSkuIE90aGVyd2lzZSB0aGUgb3RoZXIgdGhyZWFkIGNvdWxkIHNlZSBhIHBhcnRpYWxseS1jb25zdHJ1Y3RlZCBvYmplY3QuCi0gICAgTW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgTkJBSU9fRm9ybWF0IGZvcm1hdCwgYm9vbCB3cml0ZUNhbkJsb2NrID0gZmFsc2UpOworICAgIE1vbm9QaXBlKHNpemVfdCByZXFGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2sgPSBmYWxzZSk7CiAgICAgdmlydHVhbCB+TW9ub1BpcGUoKTsKIAogICAgIC8vIE5CQUlPX1BvcnQgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKaW5kZXggMWRhMGM3My4uZDQyMjU3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTUyLDMxICs1Myw0MSBAQAogLy8gdGhlIGNvbWJpbmF0aW9ucyB0aGF0IGFyZSBhY3R1YWxseSBuZWVkZWQgd2l0aGluIEF1ZGlvRmxpbmdlci4gIElmIHRoZSBsaXN0IG9mIGNvbWJpbmF0aW9ucyBncm93cwogLy8gdG9vIGxhcmdlLCB0aGVuIHRoaXMgZGVjaXNpb24gc2hvdWxkIGJlIHJlLXZpc2l0ZWQuCiAvLyBTYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBjb3VudCBhcmUgZXhwbGljaXQsIFBDTSBpbnRlcmxlYXZlZCAxNi1iaXQgaXMgYXNzdW1lZC4KLXR5cGVkZWYgdW5zaWduZWQgTkJBSU9fRm9ybWF0OwotZW51bSB7Ci0gICAgRm9ybWF0X0ludmFsaWQKK3N0cnVjdCBOQkFJT19Gb3JtYXQgeworLy8gRklYTUUgbWFrZSB0aGlzIGEgY2xhc3MsIGFuZCBjaGFuZ2UgRm9ybWF0Xy4uLiBnbG9iYWwgbWV0aG9kcyB0byBjbGFzcyBtZXRob2RzCisvL3ByaXZhdGU6CisgICAgdW5zaWduZWQgICAgbVNhbXBsZVJhdGU7CisgICAgdW5zaWduZWQgICAgbUNoYW5uZWxDb3VudDsKKyAgICBhdWRpb19mb3JtYXRfdCAgbUZvcm1hdDsKKyAgICBzaXplX3QgICAgICBtRnJhbWVTaXplOwogfTsKIAotLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIG9mIGFuIE5CQUlPX0Zvcm1hdCBpbiBieXRlcwotc2l6ZV90IEZvcm1hdF9mcmFtZVNpemUoTkJBSU9fRm9ybWF0IGZvcm1hdCk7CitleHRlcm4gY29uc3QgTkJBSU9fRm9ybWF0IEZvcm1hdF9JbnZhbGlkOwogCi0vLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgb2YgYW4gTkJBSU9fRm9ybWF0IGFzIGEgYml0IHNoaWZ0Ci1zaXplX3QgRm9ybWF0X2ZyYW1lQml0U2hpZnQoTkJBSU9fRm9ybWF0IGZvcm1hdCk7CisvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgb2YgYW4gTkJBSU9fRm9ybWF0IGluIGJ5dGVzCitzaXplX3QgRm9ybWF0X2ZyYW1lU2l6ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAKIC8vIENvbnZlcnQgYSBzYW1wbGUgcmF0ZSBpbiBIeiBhbmQgY2hhbm5lbCBjb3VudCB0byBhbiBOQkFJT19Gb3JtYXQKLU5CQUlPX0Zvcm1hdCBGb3JtYXRfZnJvbV9TUl9DKHVuc2lnbmVkIHNhbXBsZVJhdGUsIHVuc2lnbmVkIGNoYW5uZWxDb3VudCk7CisvLyBGSVhNRSByZW5hbWUKK05CQUlPX0Zvcm1hdCBGb3JtYXRfZnJvbV9TUl9DKHVuc2lnbmVkIHNhbXBsZVJhdGUsIHVuc2lnbmVkIGNoYW5uZWxDb3VudCwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKIAogLy8gUmV0dXJuIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiBvZiBhbiBOQkFJT19Gb3JtYXQKLXVuc2lnbmVkIEZvcm1hdF9zYW1wbGVSYXRlKE5CQUlPX0Zvcm1hdCBmb3JtYXQpOwordW5zaWduZWQgRm9ybWF0X3NhbXBsZVJhdGUoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpOwogCiAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgY291bnQgb2YgYW4gTkJBSU9fRm9ybWF0Ci11bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KE5CQUlPX0Zvcm1hdCBmb3JtYXQpOwordW5zaWduZWQgRm9ybWF0X2NoYW5uZWxDb3VudChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAKIC8vIENhbGxiYWNrcyB1c2VkIGJ5IE5CQUlPX1Npbms6OndyaXRlVmlhKCkgYW5kIE5CQUlPX1NvdXJjZTo6cmVhZFZpYSgpIGJlbG93LgogdHlwZWRlZiBzc2l6ZV90ICgqd3JpdGVWaWFfdCkodm9pZCAqdXNlciwgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpOwogdHlwZWRlZiBzc2l6ZV90ICgqcmVhZFZpYV90KSh2b2lkICp1c2VyLCBjb25zdCB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgaW50NjRfdCByZWFkUFRTKTsKIAorLy8gQ2hlY2sgd2hldGhlciBhbiBOQkFJT19Gb3JtYXQgaXMgdmFsaWQKK2Jvb2wgRm9ybWF0X2lzVmFsaWQoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpOworCisvLyBDb21wYXJlIHR3byBOQkFJT19Gb3JtYXQgdmFsdWVzCitib29sIEZvcm1hdF9pc0VxdWFsKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0MSwgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQyKTsKKwogLy8gQWJzdHJhY3QgY2xhc3MgKGludGVyZmFjZSkgcmVwcmVzZW50aW5nIGEgZGF0YSBwb3J0LgogY2xhc3MgTkJBSU9fUG9ydCA6IHB1YmxpYyBSZWZCYXNlIHsKIApAQCAtMTE1LDE1ICsxMjYsMTUgQEAKICAgICB2aXJ0dWFsIE5CQUlPX0Zvcm1hdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtTmVnb3RpYXRlZCA/IG1Gb3JtYXQgOiBGb3JtYXRfSW52YWxpZDsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fUG9ydChOQkFJT19Gb3JtYXQgZm9ybWF0KSA6IG1OZWdvdGlhdGVkKGZhbHNlKSwgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0U2hpZnQoRm9ybWF0X2ZyYW1lQml0U2hpZnQoZm9ybWF0KSkgeyB9CisgICAgTkJBSU9fUG9ydChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkgOiBtTmVnb3RpYXRlZChmYWxzZSksIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemUoRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19Qb3J0KCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCiAKICAgICBib29sICAgICAgICAgICAgbU5lZ290aWF0ZWQ7ICAgIC8vIG1OZWdvdGlhdGVkIGltcGxpZXMgKG1Gb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpCiAgICAgTkJBSU9fRm9ybWF0ICAgIG1Gb3JtYXQ7ICAgICAgICAvLyAobUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkgZG9lcyBub3QgaW1wbHkgbU5lZ290aWF0ZWQKLSAgICBzaXplX3QgICAgICAgICAgbUJpdFNoaWZ0OyAgICAgIC8vIGFzc2lnbiBpbiBwYXJhbGxlbCB3aXRoIGFueSBhc3NpZ25tZW50IHRvIG1Gb3JtYXQKKyAgICBzaXplX3QgICAgICAgICAgbUZyYW1lU2l6ZTsgICAgIC8vIGFzc2lnbiBpbiBwYXJhbGxlbCB3aXRoIGFueSBhc3NpZ25tZW50IHRvIG1Gb3JtYXQKIH07CiAKIC8vIEFic3RyYWN0IGNsYXNzIChpbnRlcmZhY2UpIHJlcHJlc2VudGluZyBhIG5vbi1ibG9ja2luZyBkYXRhIHNpbmssIGZvciB1c2UgYnkgYSBkYXRhIHByb3ZpZGVyLgpAQCAtMjE2LDExICsyMjcsMTEgQEAKIAogICAgIC8vIFJldHVybnMgTk9fRVJST1IgaWYgYSB0aW1lc3RhbXAgaXMgYXZhaWxhYmxlLiAgVGhlIHRpbWVzdGFtcCBpbmNsdWRlcyB0aGUgdG90YWwgbnVtYmVyCiAgICAgLy8gb2YgZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlciwgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWUgb2YgQ0xPQ0tfTU9OT1RPTklDCi0gICAgLy8gYXMgb2YgdGhpcyBwcmVzZW50YXRpb24gY291bnQuCisgICAgLy8gYXMgb2YgdGhpcyBwcmVzZW50YXRpb24gY291bnQuICBUaGUgdGltZXN0YW1wIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgaWYgZXJyb3IgaXMgcmV0dXJuZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KIAogcHJvdGVjdGVkOgotICAgIE5CQUlPX1NpbmsoTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1dyaXR0ZW4oMCkgeyB9CisgICAgTkJBSU9fU2luayhjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1dyaXR0ZW4oMCkgeyB9CiAgICAgdmlydHVhbCB+TkJBSU9fU2luaygpIHsgfQogCiAgICAgLy8gSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGlnbm9yZSB0aGVzZSBpZiB0aGV5IGRvbid0IG5lZWQgdGhlbQpAQCAtMzExLDcgKzMyMiw3IEBACiAgICAgdmlydHVhbCB2b2lkICAgIG9uVGltZXN0YW1wKGNvbnN0IEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fU291cmNlKE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZCkgOiBOQkFJT19Qb3J0KGZvcm1hdCksIG1GcmFtZXNSZWFkKDApIHsgfQorICAgIE5CQUlPX1NvdXJjZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1JlYWQoMCkgeyB9CiAgICAgdmlydHVhbCB+TkJBSU9fU291cmNlKCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKaW5kZXggNmQ1OWVhNy4uYmNiYmMwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMjUsNiArMjUsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIFN0cmluZzg7CisKIGNsYXNzIE5CTG9nIHsKIAogcHVibGljOgpAQCAtMTg3LDYgKzE4OSwxMCBAQAogICAgIGNvbnN0IFNoYXJlZCogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQogICAgIGNvbnN0IHNwPElNZW1vcnk+IG1JTWVtb3J5OyAvLyByZWYtY291bnRlZCB2ZXJzaW9uCiAgICAgaW50MzJfdCAgICAgbUZyb250OyAgICAgICAgIC8vIGluZGV4IG9mIG9sZGVzdCBhY2tub3dsZWRnZWQgRW50cnkKKyAgICBpbnQgICAgIG1GZDsgICAgICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICBtSW5kZW50OyAgICAgICAgICAgIC8vIGluZGVudGF0aW9uIGxldmVsCisKKyAgICB2b2lkICAgIGR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSk7CiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTcXVhc2hUaW1lc3RhbXAgPSA1OyAvLyBzcXVhc2ggdGhpcyBtYW55IG9yIG1vcmUgYWRqYWNlbnQgdGltZXN0YW1wcwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKaW5kZXggNzlhNGVlZS4uZWJhMzdiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKQEAgLTMwLDcgKzMwLDExIEBACiAKIHB1YmxpYzoKICAgICAvLyBtYXhGcmFtZXMgd2lsbCBiZSByb3VuZGVkIHVwIHRvIGEgcG93ZXIgb2YgMiwgYW5kIGFsbCBzbG90cyBhcmUgYXZhaWxhYmxlLiBNdXN0IGJlID49IDIuCi0gICAgUGlwZShzaXplX3QgbWF4RnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0KTsKKyAgICAvLyBidWZmZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcGlwZSBidWZmZXIsCisgICAgLy8gd2hpY2ggbXVzdCBiZSBvZiBzaXplIHJvdW5kdXAobWF4RnJhbWVzKSAqIEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KSBieXRlcy4KKyAgICBQaXBlKHNpemVfdCBtYXhGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCB2b2lkICpidWZmZXIgPSBOVUxMKTsKKworICAgIC8vIElmIGEgYnVmZmVyIHdhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBpdCBpcyBub3QgYXV0b21hdGljYWxseSBmcmVlZCBieSBkZXN0cnVjdG9yLgogICAgIHZpcnR1YWwgflBpcGUoKTsKIAogICAgIC8vIE5CQUlPX1BvcnQgaW50ZXJmYWNlCkBAIC01Nyw2ICs2MSw3IEBACiAgICAgdm9pZCAqIGNvbnN0ICAgIG1CdWZmZXI7CiAgICAgdm9sYXRpbGUgaW50MzJfdCBtUmVhcjsgICAgICAgICAvLyB3cml0dGVuIGJ5IGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUKICAgICB2b2xhdGlsZSBpbnQzMl90IG1SZWFkZXJzOyAgICAgIC8vIG51bWJlciBvZiBQaXBlUmVhZGVyIGNsaWVudHMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoaXMgUGlwZQorICAgIGNvbnN0IGJvb2wgICAgICBtRnJlZUJ1ZmZlckluRGVzdHJ1Y3RvcjsKIH07CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaAppbmRleCBjZGZiNmZlLi5kYWY2YmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApAQCAtNDEsNyArNDEsNyBAQAogCiBwcml2YXRlOgogICAgIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4gbVNvdXJjZTsgICAgIC8vIHRoZSB3cmFwcGVkIHNvdXJjZQotICAgIC8qY29uc3QqLyBzaXplX3QgICAgbUZyYW1lQml0U2hpZnQ7IC8vIGxvZzIoZnJhbWUgc2l6ZSBpbiBieXRlcykKKyAgICAvKmNvbnN0Ki8gc2l6ZV90ICAgIG1GcmFtZVNpemU7IC8vIGZyYW1lIHNpemUgaW4gYnl0ZXMKICAgICB2b2lkKiAgICAgICAgICAgICAgIG1BbGxvY2F0ZWQ7IC8vIHBvaW50ZXIgdG8gYmFzZSBvZiBhbGxvY2F0ZWQgbWVtb3J5CiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2l6ZTsgICAgICAvLyBzaXplIG9mIG1BbGxvY2F0ZWQgaW4gZnJhbWVzCiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtT2Zmc2V0OyAgICAvLyBmcmFtZSBvZmZzZXQgd2l0aGluIG1BbGxvY2F0ZWQgb2YgdmFsaWQgZGF0YQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggOWI1MzRlNy4uYTBlNWQ4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaD4KICNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KIApAQCAtMzEsNDUgKzMyLDM0IEBACiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IE1lbW9yeURlYWxlcjsKK3N0cnVjdCBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zOwogCi1zdHJ1Y3QgQUNvZGVjIDogcHVibGljIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgewotICAgIGVudW0gewotICAgICAgICBrV2hhdEZpbGxUaGlzQnVmZmVyICAgICAgPSAnZmlsbCcsCi0gICAgICAgIGtXaGF0RHJhaW5UaGlzQnVmZmVyICAgICA9ICdkcmFpJywKLSAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAotICAgICAgICBrV2hhdFNodXRkb3duQ29tcGxldGVkICAgPSAnc2NvbScsCi0gICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZWQgICAgICA9ICdmY29tJywKLSAgICAgICAga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkID0gJ291dEMnLAotICAgICAgICBrV2hhdEVycm9yICAgICAgICAgICAgICAgPSAnZXJybycsCi0gICAgICAgIGtXaGF0Q29tcG9uZW50QWxsb2NhdGVkICA9ICdjQWxsJywKLSAgICAgICAga1doYXRDb21wb25lbnRDb25maWd1cmVkID0gJ2NDb24nLAotICAgICAgICBrV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQgPSAnaXNmYycsCi0gICAgICAgIGtXaGF0U2lnbmFsZWRJbnB1dEVPUyAgICA9ICdzZW9zJywKLSAgICAgICAga1doYXRCdWZmZXJzQWxsb2NhdGVkICAgID0gJ2FsbGMnLAotICAgICAgICBrV2hhdE9NWERpZWQgICAgICAgICAgICAgPSAnT01YZCcsCi0gICAgfTsKLQorc3RydWN0IEFDb2RlYyA6IHB1YmxpYyBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLCBwdWJsaWMgQ29kZWNCYXNlIHsKICAgICBBQ29kZWMoKTsKIAotICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCiAgICAgdm9pZCBpbml0aWF0ZVNldHVwKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIHNpZ25hbEZsdXNoKCk7Ci0gICAgdm9pZCBzaWduYWxSZXN1bWUoKTsKLSAgICB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOwogCi0gICAgdm9pZCBzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKTsKIAotICAgIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOwotICAgIHZvaWQgaW5pdGlhdGVTdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKTsKIAotICAgIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpOwogCi0gICAgYm9vbCBpc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrKCkgeyByZXR1cm4gbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2s7IH0KKyAgICAvLyBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIGltcGxlbWVudHMgdGhlIG1lc3NhZ2UgaGFuZGxpbmcKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaGFuZGxlTWVzc2FnZShtc2cpOworICAgIH0KIAotICAgIHN0cnVjdCBQb3J0RGVzY3JpcHRpb24gOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgc3RydWN0IFBvcnREZXNjcmlwdGlvbiA6IHB1YmxpYyBDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbiB7CiAgICAgICAgIHNpemVfdCBjb3VudEJ1ZmZlcnMoKTsKICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEQXQoc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyQXQoc2l6ZV90IGluZGV4KSBjb25zdDsKQEAgLTg2LDYgKzc2LDE2IEBACiAgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBvcnREZXNjcmlwdGlvbik7CiAgICAgfTsKIAorICAgIHN0YXRpYyBib29sIGlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsIElPTVg6Om5vZGVfaWQgbm9kZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yRm9ybWF0LCBPTVhfVTMyICpmbGV4aWJsZUVxdWl2YWxlbnQpOworCisgICAgLy8gUmV0dXJucyAwIGlmIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIE5PVEU6IHRoaXMgaXMgdHJlYXRlZCBieQorICAgIC8vIHNvbWUgT01YIGNvbXBvbmVudHMgYXMgYXV0byBsZXZlbCwgYW5kIGJ5IG90aGVycyBhcyBpbnZhbGlkIGxldmVsLgorICAgIHN0YXRpYyBpbnQgLyogT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSAqLyBnZXRBVkNMZXZlbEZvcigKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHJhdGUsIGludCBiaXRyYXRlLAorICAgICAgICAgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIHByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFDb2RlYygpOwogCkBAIC0xMTksNiArMTE5LDggQEAKICAgICAgICAga1doYXRSZXF1ZXN0SURSRnJhbWUgICAgICAgICA9ICdyaWRyJywKICAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzICAgICAgICAgICA9ICdzZXRQJywKICAgICAgICAga1doYXRTdWJtaXRPdXRwdXRNZXRhRGF0YUJ1ZmZlcklmRU9TID0gJ3N1Ym0nLAorICAgICAgICBrV2hhdE9NWERpZWQgICAgICAgICAgICAgICAgID0gJ09NWGQnLAorICAgICAgICBrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlICAgID0gJ3JlbEMnLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTE3OCw2ICsxODAsOCBAQAogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlclsyXTsKIAogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKIAogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVyc1syXTsKICAgICBib29sIG1Qb3J0RU9TWzJdOwpAQCAtMTkwLDcgKzE5NCw3IEBACiAgICAgYm9vbCBtVXNlTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQ7CiAgICAgYm9vbCBtRmF0YWxFcnJvcjsKICAgICBib29sIG1TaHV0ZG93bkluUHJvZ3Jlc3M7Ci0gICAgYm9vbCBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjazsKKyAgICBib29sIG1FeHBsaWNpdFNodXRkb3duOwogCiAgICAgLy8gSWYgIm1LZWVwQ29tcG9uZW50QWxsb2NhdGVkIiB3ZSBvbmx5IHRyYW5zaXRpb24gYmFjayB0byBMb2FkZWQgc3RhdGUKICAgICAvLyBhbmQgZG8gbm90IHJlbGVhc2UgdGhlIGNvbXBvbmVudCBpbnN0YW5jZS4KQEAgLTE5OCwxNiArMjAyLDI1IEBACiAKICAgICBpbnQzMl90IG1FbmNvZGVyRGVsYXk7CiAgICAgaW50MzJfdCBtRW5jb2RlclBhZGRpbmc7CisgICAgaW50MzJfdCBtUm90YXRpb25EZWdyZWVzOwogCiAgICAgYm9vbCBtQ2hhbm5lbE1hc2tQcmVzZW50OwogICAgIGludDMyX3QgbUNoYW5uZWxNYXNrOwogICAgIHVuc2lnbmVkIG1EZXF1ZXVlQ291bnRlcjsKICAgICBib29sIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzOwogICAgIGludDMyX3QgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0OworICAgIHNpemVfdCBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnM7CiAKICAgICBpbnQ2NF90IG1SZXBlYXRGcmFtZURlbGF5VXM7CiAgICAgaW50NjRfdCBtTWF4UHRzR2FwVXM7CiAKKyAgICBpbnQ2NF90IG1UaW1lUGVyRnJhbWVVczsKKyAgICBpbnQ2NF90IG1UaW1lUGVyQ2FwdHVyZVVzOworCisgICAgYm9vbCBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkOworCisgICAgYm9vbCBtVHVubmVsZWQ7CisKICAgICBzdGF0dXNfdCBzZXRDeWNsaWNJbnRyYU1hY3JvYmxvY2tSZWZyZXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90IG1vZGUpOwogICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCk7CiAgICAgc3RhdHVzX3QgZnJlZUJ1ZmZlcnNPblBvcnQoT01YX1UzMiBwb3J0SW5kZXgpOwpAQCAtMjMxLDYgKzI0NCw5IEBACiAgICAgc3RhdHVzX3Qgc2V0Q29tcG9uZW50Um9sZShib29sIGlzRW5jb2RlciwgY29uc3QgY2hhciAqbWltZSk7CiAgICAgc3RhdHVzX3QgY29uZmlndXJlQ29kZWMoY29uc3QgY2hhciAqbWltZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCisgICAgc3RhdHVzX3QgY29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrKGludDMyX3QgYXVkaW9Id1N5bmMsCisgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93KTsKKwogICAgIHN0YXR1c190IHNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKICAgICAgICAgICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0LApAQCAtMjM5LDcgKzI1NSw3IEBACiAgICAgc3RhdHVzX3Qgc2V0U3VwcG9ydGVkT3V0cHV0Rm9ybWF0KCk7CiAKICAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtMjQ5LDEwICsyNjUsMjAgQEAKICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQpOwogCisgICAgdHlwZWRlZiBzdHJ1Y3QgZHJjUGFyYW1zIHsKKyAgICAgICAgaW50MzJfdCBkcmNDdXQ7CisgICAgICAgIGludDMyX3QgZHJjQm9vc3Q7CisgICAgICAgIGludDMyX3QgaGVhdnlDb21wcmVzc2lvbjsKKyAgICAgICAgaW50MzJfdCB0YXJnZXRSZWZMZXZlbDsKKyAgICAgICAgaW50MzJfdCBlbmNvZGVkVGFyZ2V0TGV2ZWw7CisgICAgfSBkcmNQYXJhbXNfdDsKKwogICAgIHN0YXR1c190IHNldHVwQUFDQ29kZWMoCiAgICAgICAgICAgICBib29sIGVuY29kZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgYml0UmF0ZSwKLSAgICAgICAgICAgIGludDMyX3QgYWFjUHJvZmlsZSwgYm9vbCBpc0FEVFMpOworICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlLCBib29sIGlzQURUUywgaW50MzJfdCBzYnJNb2RlLAorICAgICAgICAgICAgaW50MzJfdCBtYXhPdXRwdXRDaGFubmVsQ291bnQsIGNvbnN0IGRyY1BhcmFtc190JiBkcmMsCisgICAgICAgICAgICBpbnQzMl90IHBjbUxpbWl0ZXJFbmFibGUpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBBQzNDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKQEAgLTI3Myw2ICsyOTksNyBAQAogICAgIHN0YXR1c190IHNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3RhdHVzX3Qgc2V0dXBIMjYzRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHN0YXR1c190IHNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHN0YXR1c190IHNldHVwSEVWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzdGF0dXNfdCBzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHN0YXR1c190IHZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwoaW50MzJfdCBwcm9maWxlLCBpbnQzMl90IGxldmVsKTsKQEAgLTMwMSwxMSArMzI4LDE3IEBACiAgICAgdm9pZCBwcm9jZXNzRGVmZXJyZWRNZXNzYWdlcygpOwogCiAgICAgdm9pZCBzZW5kRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOworICAgIHN0YXR1c190IGdldFBvcnRGb3JtYXQoT01YX1UzMiBwb3J0SW5kZXgsIHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKIAogICAgIHZvaWQgc2lnbmFsRXJyb3IoCiAgICAgICAgICAgICBPTVhfRVJST1JUWVBFIGVycm9yID0gT01YX0Vycm9yVW5kZWZpbmVkLAogICAgICAgICAgICAgc3RhdHVzX3QgaW50ZXJuYWxFcnJvciA9IFVOS05PV05fRVJST1IpOwogCisgICAgc3RhdGljIGJvb2wgZGVzY3JpYmVEZWZhdWx0Q29sb3JGb3JtYXQoRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAmZGVzY3JpYmVQYXJhbXMpOworICAgIHN0YXRpYyBib29sIGRlc2NyaWJlQ29sb3JGb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsIElPTVg6Om5vZGVfaWQgbm9kZSwKKyAgICAgICAgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAmZGVzY3JpYmVQYXJhbXMpOworCiAgICAgc3RhdHVzX3QgcmVxdWVzdElEUkZyYW1lKCk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IGE4Mjk5MTYuLmRkMGExMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMTcyLDcgKzE3Miw3IEBACiAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAogICAgICAgICAgICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpOwogCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBmcmFtZS4KQEAgLTE4NSw2ICsxODUsOCBAQAogICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOwogCisgICAgdm9pZCByZWxlYXNlQ2FtZXJhKCk7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOwogCkBAIC0yMzMsNyArMjM1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUpOwogCiAgICAgdm9pZCBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7Ci0gICAgdm9pZCByZWxlYXNlQ2FtZXJhKCk7CiAgICAgc3RhdHVzX3QgcmVzZXQoKTsKIAogICAgIENhbWVyYVNvdXJjZShjb25zdCBDYW1lcmFTb3VyY2UgJik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkNmU3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xvY2tFc3RpbWF0b3IuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBDTE9DS19FU1RJTUFUT1JfSF8KKworI2RlZmluZSBDTE9DS19FU1RJTUFUT1JfSF8KKworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IENsb2NrRXN0aW1hdG9yIDogUmVmQmFzZSB7CisgICAgdmlydHVhbCBkb3VibGUgZXN0aW1hdGUoZG91YmxlIHgsIGRvdWJsZSB5KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworfTsKKworc3RydWN0IFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yIDogQ2xvY2tFc3RpbWF0b3IgeworICAgIHN0cnVjdCBMaW5lYXJGaXQgeworICAgICAgICAvKioKKyAgICAgICAgICogRml0IHkgPSBhICogeCArIGIsIHdoZXJlIGVhY2ggaW5wdXQgaGFzIGEgd2VpZ2h0CisgICAgICAgICAqLworICAgICAgICBkb3VibGUgbVg7ICAvLyBzdW0od19pICogeF9pKQorICAgICAgICBkb3VibGUgbVhYOyAvLyBzdW0od19pICogeF9pXjIpCisgICAgICAgIGRvdWJsZSBtWTsgIC8vIHN1bSh3X2kgKiB5X2kpCisgICAgICAgIGRvdWJsZSBtWVk7IC8vIHN1bSh3X2kgKiB5X2leMikKKyAgICAgICAgZG91YmxlIG1YWTsgLy8gc3VtKHdfaSAqIHhfaSAqIHlfaSkKKyAgICAgICAgZG91YmxlIG1XOyAgLy8gc3VtKHdfaSkKKworICAgICAgICBMaW5lYXJGaXQoKTsKKyAgICAgICAgdm9pZCByZXNldCgpOworICAgICAgICB2b2lkIGNvbWJpbmUoY29uc3QgTGluZWFyRml0ICZsZik7CisgICAgICAgIHZvaWQgYWRkKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHcpOworICAgICAgICB2b2lkIHNjYWxlKGRvdWJsZSB3KTsKKyAgICAgICAgZG91YmxlIGludGVycG9sYXRlKGRvdWJsZSB4KTsKKyAgICAgICAgZG91YmxlIHNpemUoKSBjb25zdDsKKworICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMaW5lYXJGaXQpOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFc3RpbWF0b3IgZm9yIGYoeCkgPSB5JyB3aGVyZSBpbnB1dCB5JyBpcyBub2lzeSwgYnV0CisgICAgICogdGhlb3JldGljYWxseSBsaW5lYXI6CisgICAgICoKKyAgICAgKiAgICAgIHknID1+IHkgPSBhICogeCArIGIKKyAgICAgKgorICAgICAqIEl0IHVzZXMgbGluZWFyIGZpdCByZWdyZXNzaW9uIG92ZXIgYSB0YXBlcmluZyByb2xsaW5nIHdpbmRvdworICAgICAqIHRvIGdldCBhbiBlc3RpbWF0ZSBmb3IgeSAoZnJvbSB0aGUgY3VycmVudCBhbmQgcGFzdCBpbnB1dHMKKyAgICAgKiAoeCwgeScpKS4KKyAgICAgKgorICAgICAqICAgICBfX19fX19fX19fX18KKyAgICAgKiAgICAvfCAgICAgICAgICB8XAorICAgICAqICAgLyB8ICAgICAgICAgIHwgXAorICAgICAqICAvICB8ICAgICAgICAgIHwgIFwgICA8LS0tIG5ldyBkYXRhICh4LCB5JykKKyAgICAgKiAvICAgfCAgIG1haW4gICB8ICAgXAorICAgICAqIDwtLT48LS0tLS0tLS0tLT48LS0+CisgICAgICogdGFpbCAgICAgICAgICAgIGhlYWQKKyAgICAgKgorICAgICAqIHdlaWdodCBpcyAxIHVuZGVyIHRoZSBtYWluIHdpbmRvdywgdGFwZXJzIGV4cG9uZW50aWFsbHkgYnkKKyAgICAgKiB0aGUgZmFjdG9ycyBnaXZlbiBpbiB0aGUgaGVhZCBhbmQgdGhlIHRhaWwuCisgICAgICoKKyAgICAgKiBBc3N1bWluZyB0aGF0IHggYW5kIHknIGFyZSBtb25vdG9uaWMsIHRoYXQgeCBpcyBzb21ld2hhdAorICAgICAqIGV2ZW5seSBzYW1wbGVkLCBhbmQgdGhhdCBhID1+IDEsIHRoZSBlc3RpbWF0ZWQgeSBpcyBhbHNvCisgICAgICogZ29pbmcgdG8gYmUgbW9ub3RvbmljLgorICAgICAqLworICAgIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKAorICAgICAgICAgICAgc2l6ZV90IGhlYWRMZW5ndGggPSA1LCBkb3VibGUgaGVhZEZhY3RvciA9IDAuNSwKKyAgICAgICAgICAgIHNpemVfdCBtYWluTGVuZ3RoID0gMCwgZG91YmxlIHRhaWxGYWN0b3IgPSAwLjk5KTsKKworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgLy8gYWRkIGEgbmV3IHNhbXBsZSAoeCAtPiB5JykgYW5kIHJldHVybiBhbiBlc3RpbWF0ZWQgdmFsdWUgZm9yIHRoZSB0cnVlIHkKKyAgICB2aXJ0dWFsIGRvdWJsZSBlc3RpbWF0ZShkb3VibGUgeCwgZG91YmxlIHkpOworCitwcml2YXRlOgorICAgIFZlY3Rvcjxkb3VibGU+IG1YSGlzdG9yeTsgLy8gY2lyY3VsYXIgYnVmZmVyCisgICAgVmVjdG9yPGRvdWJsZT4gbVlIaXN0b3J5OyAvLyBjaXJjdWxhciBidWZmZXIKKyAgICBMaW5lYXJGaXQgbUhlYWQ7CisgICAgTGluZWFyRml0IG1NYWluOworICAgIExpbmVhckZpdCBtVGFpbDsKKyAgICBkb3VibGUgbUhlYWRGYWN0b3JJbnY7CisgICAgZG91YmxlIG1UYWlsRmFjdG9yOworICAgIGRvdWJsZSBtRmlyc3RXZWlnaHQ7CisgICAgc2l6ZV90IG1IaXN0b3J5TGVuZ3RoOworICAgIHNpemVfdCBtSGVhZExlbmd0aDsKKyAgICBzaXplX3QgbU51bVNhbXBsZXM7CisgICAgc2l6ZV90IG1TYW1wbGVJeDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmMjdhNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUNfQkFTRV9IXworCisjZGVmaW5lIENPREVDX0JBU0VfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKKworc3RydWN0IENvZGVjQmFzZSA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0RmlsbFRoaXNCdWZmZXIgICAgICA9ICdmaWxsJywKKyAgICAgICAga1doYXREcmFpblRoaXNCdWZmZXIgICAgID0gJ2RyYWknLAorICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCisgICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzY29tJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zjb20nLAorICAgICAgICBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQgPSAnb3V0QycsCisgICAgICAgIGtXaGF0RXJyb3IgICAgICAgICAgICAgICA9ICdlcnJvJywKKyAgICAgICAga1doYXRDb21wb25lbnRBbGxvY2F0ZWQgID0gJ2NBbGwnLAorICAgICAgICBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQgPSAnY0NvbicsCisgICAgICAgIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCA9ICdpc2ZjJywKKyAgICAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAorICAgICAgICBrV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQgICAgPSAnYWxsYycsCisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSkgPSAwOworCisgICAgLy8gcmVxdWlyZSBhbiBleHBsaWNpdCBtZXNzYWdlIGhhbmRsZXIKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgPSAwOworCisgICAgc3RydWN0IFBvcnREZXNjcmlwdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgdmlydHVhbCBzaXplX3QgY291bnRCdWZmZXJzKCkgPSAwOworICAgICAgICB2aXJ0dWFsIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJREF0KHNpemVfdCBpbmRleCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHNwPEFCdWZmZXI+IGJ1ZmZlckF0KHNpemVfdCBpbmRleCkgY29uc3QgPSAwOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBQb3J0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgdmlydHVhbCB+UG9ydERlc2NyaXB0aW9uKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQb3J0RGVzY3JpcHRpb24pOworICAgIH07CisKK3Byb3RlY3RlZDoKKyAgICBDb2RlY0Jhc2UoKTsKKyAgICB2aXJ0dWFsIH5Db2RlY0Jhc2UoKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlY0Jhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQ19CQVNFX0hfCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggMTU3YjFhYS4uMzYzMDI2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTMxLDcgKzMxLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBU3RyaW5nOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgU3RyaW5nODsKK3N0cnVjdCBIVFRQQmFzZTsKIAogY2xhc3MgRGF0YVNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKQEAgLTQzLDggKzQ2LDEzIEBACiAgICAgfTsKIAogICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCisgICAgICAgICAgICBTdHJpbmc4ICpjb250ZW50VHlwZSA9IE5VTEwsCisgICAgICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSA9IE5VTEwpOworCisgICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIERhdGFTb3VyY2UoKSB7fQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzU2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1VSSV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1VSSV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CisKK3N0cnVjdCBEYXRhVVJJU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworICAgIHN0YXRpYyBzcDxEYXRhVVJJU291cmNlPiBDcmVhdGUoY29uc3QgY2hhciAqdXJpKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFVUklTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOworCisgICAgRGF0YVVSSVNvdXJjZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERhdGFVUklTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1VSSV9TT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCBkOTk0Y2IzLi5hOTgxZDFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMzAsNiArMzAsNyBAQAogY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKIHB1YmxpYzoKICAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICAvLyBGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKICAgICBGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CkBAIC01NSw3ICs1Niw3IEBACiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CiAgICAgaW50NjRfdCBtRHJtQnVmT2Zmc2V0OwotICAgIGludDY0X3QgbURybUJ1ZlNpemU7CisgICAgc2l6ZV90IG1Ecm1CdWZTaXplOwogICAgIHVuc2lnbmVkIGNoYXIgKm1Ecm1CdWY7CiAKICAgICBzc2l6ZV90IHJlYWRBdERSTShvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IDNlZjZiOWEuLjI2Y2U1ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTYzLDggKzYzLDggQEAKICAgICBpbnQzMl90IGdldFRpbWVTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIG1UaW1lU2NhbGU7IH0KIAogICAgIHN0YXR1c190IHNldEdlb0RhdGEoaW50IGxhdGl0dWRleDEwMDAwLCBpbnQgbG9uZ2l0dWRleDEwMDAwKTsKLSAgICB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykgeyBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtczsgfQotICAgIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0TXM7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IG1zKSB7IG1TdGFydFRpbWVPZmZzZXRNcyA9IG1zOyB9CisgICAgdmlydHVhbCBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldE1zKCkgY29uc3QgeyByZXR1cm4gbVN0YXJ0VGltZU9mZnNldE1zOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUEVHNFdyaXRlcigpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmluZGV4IDNkNzk1OTYuLmM4YTUwZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTE4LDYgKzE4LDggQEAKIAogI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmg+CisKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTQzLDcgKzQ1LDcgQEAKICAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKIH07CiAKLWNsYXNzIE1lZGlhQnVmZmVyIHsKK2NsYXNzIE1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVyQmFzZSB7CiBwdWJsaWM6CiAgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQogICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKQEAgLTU2LDEwICs1OCwxMCBAQAogCiAgICAgLy8gRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm5zIHRoZSBidWZmZXIgdG8gaXRzCiAgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwIGlmIHRoZSByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMC4KLSAgICB2b2lkIHJlbGVhc2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwogCiAgICAgLy8gSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50LgotICAgIHZvaWQgYWRkX3JlZigpOworICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCk7CiAKICAgICB2b2lkICpkYXRhKCkgY29uc3Q7CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKaW5kZXggMDQ4ODI5Mi4uYTAwNmY3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKQEAgLTM0LDkgKzM0LDEyIEBACiAKICAgICB2b2lkIGFkZF9idWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAKLSAgICAvLyBCbG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZCByZXR1cm5zIGl0IHRvIHRoZSBjYWxsZXIsCi0gICAgLy8gdGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KLSAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcihNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgZmFsc2UsIGl0IGJsb2NrcyB1bnRpbCBhIGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kCisgICAgLy8gcGFzc2VzIGl0IHRvIHRoZSBjYWxsZXIgaW4gKmJ1ZmZlciwgd2hpbGUgcmV0dXJuaW5nIE9LLgorICAgIC8vIFRoZSByZXR1cm5lZCBidWZmZXIgd2lsbCBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgdHJ1ZSBhbmQgYSBidWZmZXIgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwKKyAgICAvLyBidWZmZXIgaXMgc2V0IHRvIE5VTEwgYW5kIGl0IHJldHVybnMgV09VTERfQkxPQ0suCisgICAgc3RhdHVzX3QgYWNxdWlyZV9idWZmZXIoTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IDc2YWE1MDMuLjU0YTRlOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC0yNiwxMCArMjYsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgQUNvZGVjOwogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFTdHJpbmc7CitzdHJ1Y3QgQ29kZWNCYXNlOwogc3RydWN0IElDcnlwdG87CitzdHJ1Y3QgSUJhdHRlcnlTdGF0czsKIHN0cnVjdCBTb2Z0d2FyZVJlbmRlcmVyOwogc3RydWN0IFN1cmZhY2U7CiAKQEAgLTQ0LDExICs0NSwyMCBAQAogICAgICAgICBCVUZGRVJfRkxBR19FT1MgICAgICAgICA9IDQsCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBDQl9JTlBVVF9BVkFJTEFCTEUgPSAxLAorICAgICAgICBDQl9PVVRQVVRfQVZBSUxBQkxFID0gMiwKKyAgICAgICAgQ0JfRVJST1IgPSAzLAorICAgICAgICBDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQgPSA0LAorICAgIH07CisKKyAgICBzdHJ1Y3QgQmF0dGVyeU5vdGlmaWVyOworCiAgICAgc3RhdGljIHNwPE1lZGlhQ29kZWM+IENyZWF0ZUJ5VHlwZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlcik7CisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjPiBDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKIAogICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LApAQCAtNTYsNiArNjYsOCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bywKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKIAorICAgIHN0YXR1c190IHNldENhbGxiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmY2FsbGJhY2spOworCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+KiBidWZmZXJQcm9kdWNlcik7CiAKICAgICBzdGF0dXNfdCBzdGFydCgpOwpAQCAtNjQsNiArNzYsMTAgQEAKICAgICAvLyB1bmNvbmZpZ3VyZWQuCiAgICAgc3RhdHVzX3Qgc3RvcCgpOwogCisgICAgLy8gUmVzZXRzIHRoZSBjb2RlYyB0byB0aGUgSU5JVElBTElaRUQgc3RhdGUuICBDYW4gYmUgY2FsbGVkIGFmdGVyIGFuIGVycm9yCisgICAgLy8gaGFzIG9jY3VyZWQgdG8gbWFrZSB0aGUgY29kZWMgdXNhYmxlLgorICAgIHN0YXR1c190IHJlc2V0KCk7CisKICAgICAvLyBDbGllbnQgTVVTVCBjYWxsIHJlbGVhc2UgYmVmb3JlIHJlbGVhc2luZyBmaW5hbCByZWZlcmVuY2UgdG8gdGhpcwogICAgIC8vIG9iamVjdC4KICAgICBzdGF0dXNfdCByZWxlYXNlKCk7CkBAIC0xMDAsMTYgKzExNiwyMiBAQAogICAgICAgICAgICAgdWludDMyX3QgKmZsYWdzLAogICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0VXMgPSAwbGwpOwogCisgICAgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShzaXplX3QgaW5kZXgsIGludDY0X3QgdGltZXN0YW1wTnMpOwogICAgIHN0YXR1c190IHJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2Uoc2l6ZV90IGluZGV4KTsKICAgICBzdGF0dXNfdCByZWxlYXNlT3V0cHV0QnVmZmVyKHNpemVfdCBpbmRleCk7CiAKICAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiAKICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0OworICAgIHN0YXR1c190IGdldElucHV0Rm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdDsKIAogICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CisgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKwogICAgIHN0YXR1c190IHJlcXVlc3RJRFJGcmFtZSgpOwogCiAgICAgLy8gTm90aWZpY2F0aW9uIHdpbGwgYmUgcG9zdGVkIG9uY2UgdGhlcmUgImlzIHNvbWV0aGluZyB0byBkbyIsIGkuZS4KQEAgLTEzNSw2ICsxNTcsNyBAQAogICAgICAgICBTVEFSVElORywKICAgICAgICAgU1RBUlRFRCwKICAgICAgICAgRkxVU0hJTkcsCisgICAgICAgIEZMVVNIRUQsCiAgICAgICAgIFNUT1BQSU5HLAogICAgICAgICBSRUxFQVNJTkcsCiAgICAgfTsKQEAgLTE1OSw2ICsxODIsNyBAQAogICAgICAgICBrV2hhdEdldEJ1ZmZlcnMgICAgICAgICAgICAgICAgICAgICA9ICdnZXRCJywKICAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZmx1cycsCiAgICAgICAgIGtXaGF0R2V0T3V0cHV0Rm9ybWF0ICAgICAgICAgICAgICAgID0gJ2dldE8nLAorICAgICAgICBrV2hhdEdldElucHV0Rm9ybWF0ICAgICAgICAgICAgICAgICA9ICdnZXRJJywKICAgICAgICAga1doYXREZXF1ZXVlSW5wdXRUaW1lZE91dCAgICAgICAgICAgPSAnZElUTycsCiAgICAgICAgIGtXaGF0RGVxdWV1ZU91dHB1dFRpbWVkT3V0ICAgICAgICAgID0gJ2RPVE8nLAogICAgICAgICBrV2hhdENvZGVjTm90aWZ5ICAgICAgICAgICAgICAgICAgICA9ICdjb2RjJywKQEAgLTE2Niw2ICsxOTAsNyBAQAogICAgICAgICBrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbiAgICA9ICdyYWNOJywKICAgICAgICAga1doYXRHZXROYW1lICAgICAgICAgICAgICAgICAgICAgICAgPSAnZ2V0TicsCiAgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgID0gJ3NldFAnLAorICAgICAgICBrV2hhdFNldENhbGxiYWNrICAgICAgICAgICAgICAgICAgICA9ICdzZXRDJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0xNzksMjYgKzIwNCw0NiBAQAogICAgICAgICBrRmxhZ1Nhd01lZGlhU2VydmVyRGllICAgICAgICAgID0gMTI4LAogICAgICAgICBrRmxhZ0lzRW5jb2RlciAgICAgICAgICAgICAgICAgID0gMjU2LAogICAgICAgICBrRmxhZ0dhdGhlckNvZGVjU3BlY2lmaWNEYXRhICAgID0gNTEyLAorICAgICAgICBrRmxhZ0lzQXN5bmMgICAgICAgICAgICAgICAgICAgID0gMTAyNCwKKyAgICAgICAga0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZCAgICAgICA9IDIwNDgsCiAgICAgfTsKIAogICAgIHN0cnVjdCBCdWZmZXJJbmZvIHsKLSAgICAgICAgdm9pZCAqbUJ1ZmZlcklEOworICAgICAgICB1aW50MzJfdCBtQnVmZmVySUQ7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1EYXRhOwogICAgICAgICBzcDxBQnVmZmVyPiBtRW5jcnlwdGVkRGF0YTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogICAgICAgICBib29sIG1Pd25lZEJ5Q2xpZW50OwogICAgIH07CiAKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7Ci0gICAgc3A8QUNvZGVjPiBtQ29kZWM7CisgICAgc3A8Q29kZWNCYXNlPiBtQ29kZWM7CiAgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKICAgICB1aW50MzJfdCBtUmVwbHlJRDsKICAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgc3RhdHVzX3QgbVN0aWNreUVycm9yOwogICAgIHNwPFN1cmZhY2U+IG1OYXRpdmVXaW5kb3c7CiAgICAgU29mdHdhcmVSZW5kZXJlciAqbVNvZnRSZW5kZXJlcjsKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtQ2FsbGJhY2s7CisKKyAgICBib29sIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkOworICAgIGJvb2wgbUlzVmlkZW87CisKKyAgICAvLyBpbml0aWFsIGNyZWF0ZSBwYXJhbWV0ZXJzCisgICAgQVN0cmluZyBtSW5pdE5hbWU7CisgICAgYm9vbCBtSW5pdE5hbWVJc1R5cGU7CisgICAgYm9vbCBtSW5pdElzRW5jb2RlcjsKKworICAgIC8vIFVzZWQgb25seSB0byBzeW5jaHJvbml6ZSBhc3luY2hyb25vdXMgZ2V0QnVmZmVyQW5kRm9ybWF0CisgICAgLy8gYWNyb3NzIGFsbCB0aGUgb3RoZXIgKHN5bmNocm9ub3VzKSBidWZmZXIgc3RhdGUgY2hhbmdlCisgICAgLy8gb3BlcmF0aW9ucywgc3VjaCBhcyBkZS9xdWV1ZUluL091dHB1dEJ1ZmZlciwgc3RhcnQgYW5kCisgICAgLy8gc3RvcC9mbHVzaC9yZXNldC9yZWxlYXNlLgorICAgIE11dGV4IG1CdWZmZXJMb2NrOwogCiAgICAgTGlzdDxzaXplX3Q+IG1BdmFpbFBvcnRCdWZmZXJzWzJdOwogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiBtUG9ydEJ1ZmZlcnNbMl07CkBAIC0yMjIsNyArMjY3LDkgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0KGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKTsKKyAgICBzdGF0aWMgdm9pZCBQb3N0UmVwbHlXaXRoRXJyb3IoaW50MzJfdCByZXBseUlELCBpbnQzMl90IGVycik7CisKKyAgICBzdGF0dXNfdCBpbml0KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKTsKIAogICAgIHZvaWQgc2V0U3RhdGUoU3RhdGUgbmV3U3RhdGUpOwogICAgIHZvaWQgcmV0dXJuQnVmZmVyc1RvQ29kZWMoKTsKQEAgLTIzMiw2ICsyNzksMTAgQEAKICAgICBzdGF0dXNfdCBvblJlbGVhc2VPdXRwdXRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHNzaXplX3QgZGVxdWV1ZVBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpOwogCisgICAgc3RhdHVzX3QgZ2V0QnVmZmVyQW5kRm9ybWF0KAorICAgICAgICAgICAgc2l6ZV90IHBvcnRJbmRleCwgc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmJ1ZmZlciwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOworCiAgICAgYm9vbCBoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0ID0gZmFsc2UpOwogICAgIGJvb2wgaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcih1aW50MzJfdCByZXBseUlELCBib29sIG5ld1JlcXVlc3QgPSBmYWxzZSk7CiAgICAgdm9pZCBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKQEAgLTI0NCw5ICsyOTUsMjggQEAKIAogICAgIHZvaWQgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCisgICAgdm9pZCBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgdm9pZCBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGludDMyX3QgYWN0aW9uQ29kZSwgY29uc3QgY2hhciAqZGV0YWlsID0gTlVMTCk7CisgICAgdm9pZCBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKKwogICAgIHN0YXR1c190IG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKICAgICBzdGF0dXNfdCBhbWVuZE91dHB1dEZvcm1hdFdpdGhDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIHVwZGF0ZUJhdHRlcnlTdGF0KCk7CisgICAgYm9vbCBpc0V4ZWN1dGluZygpIGNvbnN0OworCisgICAgLyogY2FsbGVkIHRvIGdldCB0aGUgbGFzdCBjb2RlYyBlcnJvciB3aGVuIHRoZSBzdGlja3kgZmxhZyBpcyBzZXQuCisgICAgICogaWYgbm8gc3VjaCBjb2RlYyBlcnJvciBpcyBmb3VuZCwgcmV0dXJucyBVTktOT1dOX0VSUk9SLgorICAgICAqLworICAgIGlubGluZSBzdGF0dXNfdCBnZXRTdGlja3lFcnJvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGlja3lFcnJvciAhPSAwID8gbVN0aWNreUVycm9yIDogVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBzZXRTdGlja3lFcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgIG1TdGlja3lFcnJvciA9IGVycjsKKyAgICB9CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjKTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKaW5kZXggNTkwNjIzYi4uODYwNWQ5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaApAQCAtMjAsNzAgKzIwLDY4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWVkaWFDb2RlY0xpc3QgewotICAgIHN0YXRpYyBjb25zdCBNZWRpYUNvZGVjTGlzdCAqZ2V0SW5zdGFuY2UoKTsKK3N0cnVjdCBBTWVzc2FnZTsKIAotICAgIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAorc3RydWN0IE1lZGlhQ29kZWNMaXN0IDogcHVibGljIEJuTWVkaWFDb2RlY0xpc3QgeworICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldEluc3RhbmNlKCk7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAogICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0OwogCi0gICAgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKIAotICAgIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0OwotICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZShzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIGJvb2wgaXNFbmNvZGVyKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gICAgYm9vbCBjb2RlY0hhc1F1aXJrKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqcXVpcmtOYW1lKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkVHlwZXMoc2l6ZV90IGluZGV4LCBWZWN0b3I8QVN0cmluZz4gKnR5cGVzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhQ29kZWNJbmZvPiBnZXRDb2RlY0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOworICAgIH0KIAotICAgIHN0cnVjdCBQcm9maWxlTGV2ZWwgewotICAgICAgICB1aW50MzJfdCBtUHJvZmlsZTsKLSAgICAgICAgdWludDMyX3QgbUxldmVsOwotICAgIH07Ci0gICAgc3RhdHVzX3QgZ2V0Q29kZWNDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnR5cGUsCi0gICAgICAgICAgICBWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscywKLSAgICAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gKmNvbG9yRm9ybWF0cywKLSAgICAgICAgICAgIHVpbnQzMl90ICpmbGFncykgY29uc3Q7CisgICAgLy8gdG8gYmUgdXNlZCBieSBNZWRpYVBsYXllclNlcnZpY2UgYWxvbmUKKyAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRMb2NhbEluc3RhbmNlKCk7CiAKIHByaXZhdGU6CiAgICAgZW51bSBTZWN0aW9uIHsKICAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKICAgICAgICAgU0VDVElPTl9ERUNPREVSUywKICAgICAgICAgU0VDVElPTl9ERUNPREVSLAorICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKICAgICAgICAgU0VDVElPTl9FTkNPREVSUywKICAgICAgICAgU0VDVElPTl9FTkNPREVSLAorICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9JTkNMVURFLAogICAgIH07CiAKLSAgICBzdHJ1Y3QgQ29kZWNJbmZvIHsKLSAgICAgICAgQVN0cmluZyBtTmFtZTsKLSAgICAgICAgYm9vbCBtSXNFbmNvZGVyOwotICAgICAgICB1aW50MzJfdCBtVHlwZXM7Ci0gICAgICAgIHVpbnQzMl90IG1RdWlya3M7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBNZWRpYUNvZGVjTGlzdCAqc0NvZGVjTGlzdDsKKyAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzQ29kZWNMaXN0OworICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IHNSZW1vdGVMaXN0OwogCiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKKyAgICBWZWN0b3I8U2VjdGlvbj4gbVBhc3RTZWN0aW9uczsKICAgICBpbnQzMl90IG1EZXB0aDsKKyAgICBBU3RyaW5nIG1IcmVmQmFzZTsKIAotICAgIFZlY3RvcjxDb2RlY0luZm8+IG1Db2RlY0luZm9zOwotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNpemVfdD4gbUNvZGVjUXVpcmtzOwotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNpemVfdD4gbVR5cGVzOworICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4gPiBtQ29kZWNJbmZvczsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gbUN1cnJlbnRJbmZvOworICAgIHNwPElPTVg+IG1PTVg7CiAKICAgICBNZWRpYUNvZGVjTGlzdCgpOwogICAgIH5NZWRpYUNvZGVjTGlzdCgpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0gICAgdm9pZCBwYXJzZVhNTEZpbGUoRklMRSAqZmlsZSk7CisgICAgdm9pZCBwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CisgICAgdm9pZCBwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKTsKIAogICAgIHN0YXRpYyB2b2lkIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKAogICAgICAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CkBAIC05MywxMyArOTEsMTggQEAKICAgICB2b2lkIHN0YXJ0RWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOwogCisgICAgc3RhdHVzX3QgaW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMKTsKIAogICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICBzdGF0dXNfdCBhZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgdm9pZCBhZGRUeXBlKGNvbnN0IGNoYXIgKm5hbWUpOwogCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBjaGFyICp0eXBlKTsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNMaXN0KTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyOWM4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTWVkaWFDb2RlY1NvdXJjZV9IXworI2RlZmluZSBNZWRpYUNvZGVjU291cmNlX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQUxvb3BlcjsKK2NsYXNzIEFNZXNzYWdlOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK2NsYXNzIE1lZGlhQ29kZWM7CitjbGFzcyBNZXRhRGF0YTsKKworc3RydWN0IE1lZGlhQ29kZWNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKKyAgICBlbnVtIEZsYWdCaXRzIHsKKyAgICAgICAgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCAgICAgID0gMSwKKyAgICAgICAgRkxBR19VU0VfTUVUQURBVEFfSU5QVVQgICAgID0gMiwKKyAgICB9OworCisgICAgc3RhdGljIHNwPE1lZGlhQ29kZWNTb3VyY2U+IENyZWF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIGJvb2wgaXNWaWRlbygpIGNvbnN0IHsgcmV0dXJuIG1Jc1ZpZGVvOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisKKyAgICAvLyBNZWRpYVNvdXJjZQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKSB7IHJldHVybiBtTWV0YTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLAorICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIC8vIE1lZGlhQnVmZmVyT2JzZXJ2ZXIKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICAvLyBmb3IgQUhhbmRsZXJSZWZsZWN0b3IKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUHVsbGVyOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UHVsbGVyTm90aWZ5LAorICAgICAgICBrV2hhdEVuY29kZXJBY3Rpdml0eSwKKyAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAga1doYXRTdG9wLAorICAgICAgICBrV2hhdFBhdXNlLAorICAgIH07CisKKyAgICBNZWRpYUNvZGVjU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworCisgICAgc3RhdHVzX3Qgb25TdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICBzdGF0dXNfdCBpbml0KCk7CisgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICB2b2lkIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgc3RhdHVzX3QgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICB2b2lkIHNjaGVkdWxlRG9Nb3JlV29yaygpOworICAgIHN0YXR1c190IGRvTW9yZVdvcmsoaW50MzJfdCBudW1JbnB1dCwgaW50MzJfdCBudW1PdXRwdXQpOworICAgIHZvaWQgc3VzcGVuZCgpOworICAgIHZvaWQgcmVzdW1lKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzID0gLTFsbCk7CisgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgc3RhdHVzX3QgcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxNZWRpYUNvZGVjU291cmNlPiA+IG1SZWZsZWN0b3I7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgIHNwPFB1bGxlcj4gbVB1bGxlcjsKKyAgICBzcDxNZWRpYUNvZGVjPiBtRW5jb2RlcjsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgTGlzdDx1aW50MzJfdD4gbVN0b3BSZXBseUlEUXVldWU7CisgICAgYm9vbCBtSXNWaWRlbzsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVN0b3BwaW5nOworICAgIGJvb2wgbURvTW9yZVdvcmtQZW5kaW5nOworICAgIHNwPEFNZXNzYWdlPiBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUVuY29kZXJJbnB1dEJ1ZmZlcnM7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUVuY29kZXJPdXRwdXRCdWZmZXJzOworICAgIExpc3Q8TWVkaWFCdWZmZXIgKj4gbUlucHV0QnVmZmVyUXVldWU7CisgICAgTGlzdDxzaXplX3Q+IG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXM7CisgICAgTGlzdDxpbnQ2NF90PiBtRGVjb2RpbmdUaW1lUXVldWU7IC8vIGRlY29kaW5nIHRpbWUgKHVzKSBmb3IgdmlkZW8KKworICAgIC8vIGF1ZGlvIGRyaWZ0IHRpbWUKKyAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVVczsKKyAgICBMaXN0PGludDY0X3Q+IG1EcmlmdFRpbWVRdWV1ZTsKKworICAgIC8vIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHByb3RlY3RlZCBieSBtT3V0cHV0QnVmZmVyTG9jaworICAgIE11dGV4IG1PdXRwdXRCdWZmZXJMb2NrOworICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyQ29uZDsKKyAgICBMaXN0PE1lZGlhQnVmZmVyKj4gbU91dHB1dEJ1ZmZlclF1ZXVlOworICAgIGJvb2wgbUVuY29kZXJSZWFjaGVkRU9TOworICAgIHN0YXR1c190IG1FcnJvckNvZGU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjU291cmNlKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIE1lZGlhQ29kZWNTb3VyY2VfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCmluZGV4IGNmNWJlZGEuLmU2N2Q0ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaApAQCAtMjUsNiArMjUsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMjsKQEAgLTM4LDYgKzM5LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CkBAIC01OCw2ICs2MCw4IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggNjg2ZjI4Ni4uMmU2NjNlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtMjMsNiArMjMsMTggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CisgICAgLy8gc3RhdHVzX3QgbWFwIGZvciBlcnJvcnMgaW4gdGhlIG1lZGlhIGZyYW1ld29yaworICAgIC8vIE9LIG9yIE5PX0VSUk9SIG9yIDAgcmVwcmVzZW50cyBubyBlcnJvci4KKworICAgIC8vIFNlZSBzeXN0ZW0vY29yZS9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCisgICAgLy8gU3lzdGVtIHN0YW5kYXJkIGVycm9ycyBmcm9tIC0xIHRocm91Z2ggKHBvc3NpYmx5KSAtMTMzCisgICAgLy8KKyAgICAvLyBFcnJvcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmdzIGFuZCBzaWRlIGVmZmVjdHMuCisgICAgLy8gSU5WQUxJRF9PUEVSQVRJT046ICBPcGVyYXRpb24gYXR0ZW1wdGVkIGluIGFuIGlsbGVnYWwgc3RhdGUgKHdpbGwgdHJ5IHRvIHNpZ25hbCB0byBhcHApLgorICAgIC8vIERFQURfT0JKRUNUOiAgICAgICAgU2lnbmFsIGZyb20gQ29kZWNCYXNlIHRvIE1lZGlhQ29kZWMgdGhhdCBNZWRpYVNlcnZlciBoYXMgZGllZC4KKyAgICAvLyBOQU1FX05PVF9GT1VORDogICAgIFNpZ25hbCBmcm9tIENvZGVjQmFzZSB0byBNZWRpYUNvZGVjIHRoYXQgdGhlIGNvbXBvbmVudCB3YXMgbm90IGZvdW5kLgorCisgICAgLy8gTWVkaWEgZXJyb3JzCiAgICAgTUVESUFfRVJST1JfQkFTRSAgICAgICAgPSAtMTAwMCwKIAogICAgIEVSUk9SX0FMUkVBRFlfQ09OTkVDVEVEID0gTUVESUFfRVJST1JfQkFTRSwKQEAgLTQ2LDI2ICs1OCw1NCBAQAogICAgIC8vIGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCiAgICAgRFJNX0VSUk9SX0JBU0UgPSAtMjAwMCwKIAotICAgIEVSUk9SX0RSTV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFLAotICAgIEVSUk9SX0RSTV9OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMSwKLSAgICBFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDIsCi0gICAgRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAzLAotICAgIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICA9IERSTV9FUlJPUl9CQVNFIC0gNCwKLSAgICBFUlJPUl9EUk1fREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUsCi0gICAgRVJST1JfRFJNX0NBTk5PVF9IQU5ETEUgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA2LAotICAgIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNywKLSAgICBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDgsCi0gICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAotICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTAsCisgICAgRVJST1JfRFJNX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFLAorICAgIEVSUk9SX0RSTV9OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMiwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAzLAorICAgIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICAgPSBEUk1fRVJST1JfQkFTRSAtIDQsCisgICAgRVJST1JfRFJNX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNSwKKyAgICBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA2LAorICAgIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDcsCisgICAgRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOCwKKyAgICBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAorICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEwLAorICAgIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT04gPSBEUk1fRVJST1JfQkFTRSAtIDExLAorICAgIEVSUk9SX0RSTV9MQVNUX1VTRURfRVJST1JDT0RFICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDExLAogCi0gICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1MDAsCi0gICAgRVJST1JfRFJNX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCisgICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNTAwLAorICAgIEVSUk9SX0RSTV9WRU5ET1JfTUlOICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDk5OSwKIAogICAgIC8vIEhlYXJ0YmVhdCBFcnJvciBDb2RlcwogICAgIEhFQVJUQkVBVF9FUlJPUl9CQVNFID0gLTMwMDAsCiAgICAgRVJST1JfSEVBUlRCRUFUX1RFUk1JTkFURV9SRVFVRVNURUQgICAgICAgICAgICAgICAgICAgICA9IEhFQVJUQkVBVF9FUlJPUl9CQVNFLAorCisgICAgLy8gTkRLIEVycm9yIGNvZGVzCisgICAgLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKKyAgICAvLyBmcm9tIC0xMDAwMCAoMHhGRkZGRDhGMCAtIDB4RkZGRkQ4RUMpCisgICAgLy8gZnJvbSAtMjAwMDAgKDB4RkZGRkIxRTAgLSAweEZGRkZCMUQ3KQorCisgICAgLy8gQ29kZWMgZXJyb3JzIGFyZSBwZXJtaXR0ZWQgZnJvbSAweDgwMDAxMDAwIHRocm91Z2ggMHg5MDAwRkZGRgorICAgIEVSUk9SX0NPREVDX01BWCAgICA9IChzaWduZWQpMHg5MDAwRkZGRiwKKyAgICBFUlJPUl9DT0RFQ19NSU4gICAgPSAoc2lnbmVkKTB4ODAwMDEwMDAsCisKKyAgICAvLyBTeXN0ZW0gdW5rbm93biBlcnJvcnMgZnJvbSAweDgwMDAwMDAwIC0gMHg4MDAwMDAwNyAoSU5UMzJfTUlOICsgNykKKyAgICAvLyBTZWUgc3lzdGVtL2NvcmUvaW5jbHVkZS91dGlscy9FcnJvcnMuaAogfTsKIAorLy8gYWN0aW9uIGNvZGVzIGZvciBNZWRpYUNvZGVjcyB0aGF0IHRlbGwgdGhlIHVwcGVyIGxheWVyIGFuZCBhcHBsaWNhdGlvbgorLy8gdGhlIHNldmVyaXR5IG9mIGFueSBlcnJvci4KK2VudW0gQWN0aW9uQ29kZSB7CisgICAgQUNUSU9OX0NPREVfRkFUQUwsCisgICAgQUNUSU9OX0NPREVfVFJBTlNJRU5ULAorICAgIEFDVElPTl9DT0RFX1JFQ09WRVJBQkxFLAorfTsKKworLy8gcmV0dXJucyB0cnVlIGlmIGVyciBpcyBhIHJlY29nbml6ZWQgRFJNIGVycm9yIGNvZGUKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0NyeXB0b0Vycm9yKHN0YXR1c190IGVycikgeworICAgIHJldHVybiAoRVJST1JfRFJNX0xBU1RfVVNFRF9FUlJPUkNPREUgPD0gZXJyICYmIGVyciA8PSBFUlJPUl9EUk1fVU5LTk9XTikKKyAgICAgICAgICAgIHx8IChFUlJPUl9EUk1fVkVORE9SX01JTiA8PSBlcnIgJiYgZXJyIDw9IEVSUk9SX0RSTV9WRU5ET1JfTUFYKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRURJQV9FUlJPUlNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAppbmRleCAzMDc2YTk2Li4xODM5MzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCkBAIC02NSw2ICs2NSw4IEBACiAgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCkgeworICAgIH0KIAogcHJvdGVjdGVkOgogICAgIE1lZGlhRXh0cmFjdG9yKCkgOiBtSXNEcm0oZmFsc2UpIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZkOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKKyAgICBNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOworCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOworICAgIEFTdHJpbmcgbUxhc3RVUkk7CisKKyAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7CisgICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKKworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworCisgICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhSFRUUCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0hUVFBfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggZmY2YTY2ZS4uYmJlNDMwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZXRhRGF0YTsKLXN0cnVjdCBNUEVHNFdyaXRlcjsKK3N0cnVjdCBNZWRpYVdyaXRlcjsKIAogLy8gTWVkaWFNdXhlciBpcyB1c2VkIHRvIG11eCBtdWx0aXBsZSB0cmFja3MgaW50byBhIHZpZGVvLiBDdXJyZW50bHksIHdlIG9ubHkKIC8vIHN1cHBvcnQgYSBtcDQgZmlsZSBhcyB0aGUgb3V0cHV0LgpAQCAtNDQsNiArNDQsNyBAQAogICAgIC8vIE91dHB1dEZvcm1hdCBpcyB1cGRhdGVkLgogICAgIGVudW0gT3V0cHV0Rm9ybWF0IHsKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQgPSAwLAorICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKQEAgLTExNSw3ICsxMTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgdWludDMyX3QgZmxhZ3MpIDsKIAogcHJpdmF0ZToKLSAgICBzcDxNUEVHNFdyaXRlcj4gbVdyaXRlcjsKKyAgICBjb25zdCBPdXRwdXRGb3JtYXQgbUZvcm1hdDsKKyAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKICAgICBWZWN0b3I8IHNwPE1lZGlhQWRhcHRlcj4gPiBtVHJhY2tMaXN0OyAgLy8gRWFjaCB0cmFjayBoYXMgaXRzIE1lZGlhQWRhcHRlci4KICAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOyAgLy8gTWV0YWRhdGEgZm9yIHRoZSB3aG9sZSBmaWxlLgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKaW5kZXggMzgxOGU2My4uYTY1M2RiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApAQCAtODIsNiArODIsMTAgQEAKICAgICAgICAgdm9pZCBzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cyk7CiAgICAgICAgIGludDY0X3QgZ2V0TGF0ZUJ5KCkgY29uc3Q7CiAKKyAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOworICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKKyAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OworCiAgICAgcHJpdmF0ZToKICAgICAgICAgZW51bSBPcHRpb25zIHsKICAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLApAQCAtOTEsNiArOTUsNyBAQAogICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwogICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CiAgICAgICAgIGludDY0X3QgbUxhdGVuZXNzVXM7CisgICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwogICAgIH07CiAKICAgICAvLyBDYXVzZXMgdGhpcyBzb3VyY2UgdG8gc3VzcGVuZCBwdWxsaW5nIGRhdGEgZnJvbSBpdHMgdXBzdHJlYW0gc291cmNlCkBAIC0xMDUsNyArMTEwLDcgQEAKICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzdGFydCgpIGFuZCBiZWZvcmUgdGhlCiAgICAgLy8gZmlyc3QgcmVhZCgpIGNhbGwuCiAgICAgLy8gQ2FsbGVlIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBidWZmZXJzIGlmIG5vIGVycm9yIGlzIHJldHVybmVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYgLyogYnVmZmVycyAqLykgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKaW5kZXggNWNjOGRjZi4uZTI3ZWExZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaApAQCAtNDgsNiArNDgsOSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgdmlydHVhbCB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykge30KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiAwOyB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYVdyaXRlcigpIHt9CiAgICAgaW50NjRfdCBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmluZGV4IGY1MWMxMmQuLjNmNDI3OTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTUzLDkgKzUzLDEzIEBACiAgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CiAgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQorICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCiAgICAga0tleVdhbnRzTkFMRnJhZ21lbnRzID0gJ05BTGYnLAogICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKQEAgLTE2MiwxMSArMTY2LDE5IEBACiAgICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90CiAKICAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQorCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVC4KKyAgICBrS2V5VHJhY2tJc0F1dG9zZWxlY3QgPSAnYXV0bycsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVC4KKyAgICBrS2V5VHJhY2tJc0RlZmF1bHQgICAgPSAnZGZsdCcsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gU2ltaWxhciB0byBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIGJ1dCBwZXJ0YWlucyB0byBhdiB0cmFja3MgYXMgd2VsbC4KKyAgICBrS2V5VHJhY2tJc0ZvcmNlZCAgICAgPSAnZnJjZCcsIC8vIGJvb2wgKGludDMyX3QpCiB9OwogCiBlbnVtIHsKICAgICBrVHlwZUVTRFMgICAgICAgID0gJ2VzZHMnLAogICAgIGtUeXBlQVZDQyAgICAgICAgPSAnYXZjYycsCisgICAga1R5cGVIVkNDICAgICAgICA9ICdodmNjJywKICAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCA1YWU2ZjZiLi40MDJlN2Y4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMzEsNiArMzEsNyBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKQEAgLTQ1LDYgKzQ2LDcgQEAKICAgICBOdU1lZGlhRXh0cmFjdG9yKCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKaW5kZXggNTEyMWMxNy4uZTM0MTE2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaApAQCAtMjgsNyArMjgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUNvZGVjTGlzdDsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKIGNsYXNzIE1lbW9yeURlYWxlcjsKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyOwogc3RydWN0IENvZGVjUHJvZmlsZUxldmVsOwpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgICAgICBWZWN0b3I8Q29kZWNOYW1lQW5kUXVpcmtzPiAqbWF0Y2hpbmdDb2RlY05hbWVzQW5kUXVpcmtzKTsKIAogICAgIHN0YXRpYyB1aW50MzJfdCBnZXRDb21wb25lbnRRdWlya3MoCi0gICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCwgc2l6ZV90IGluZGV4KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmbGlzdCk7CiAKICAgICBzdGF0aWMgYm9vbCBmaW5kQ29kZWNRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgdWludDMyX3QgKnF1aXJrcyk7CiAKQEAgLTM1Miw2ICszNTIsOSBAQAogCiAgICAgaW50NjRfdCBnZXREZWNvZGluZ1RpbWVVcygpOwogCisgICAgc3RhdHVzX3QgcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVuc2lnbmVkICpwcm9maWxlLCB1bnNpZ25lZCAqbGV2ZWwpOwogICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIHVuc2lnbmVkICpwcm9maWxlLCB1bnNpZ25lZCAqbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAppbmRleCAyNjUzYjUzLi4wOThhYTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaApAQCAtNDcsNiArNDcsNyBAQAogIHByaXZhdGU6CiAgICAgdm9pZCB3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pOwogICAgIHNpemVfdCByZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSk7CisgICAgaW50MzJfdCBtU2tpcDsKICAgICBpbnQzMl90IG1Gcm9udFBhZGRpbmc7CiAgICAgaW50MzJfdCBtQmFja1BhZGRpbmc7CiAgICAgaW50MzJfdCBtV3JpdGVIZWFkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oCmluZGV4IDY1MTBhNTkuLmViM2FjY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAogICAgICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpOwogCi0gICAgdmlydHVhbCBjaGFyICpleHRyYWN0QWxidW1BcnQoaW50IGZkKTsKKyAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydChpbnQgZmQpOwogCiBwcml2YXRlOgogICAgIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKGNvbnN0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKaW5kZXggZGI1Zjk0Ny4uNDNiNzVmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAvLyBwYXNzIG1ldGFkYXRhIHRocm91Z2ggdGhlIGJ1ZmZlcnMuIEN1cnJlbnRseSwgaXQgaXMgZm9yY2Ugc2V0IHRvIHRydWUKICAgICBib29sIGlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0OwogCi0gICAgc3A8QnVmZmVyUXVldWU+IGdldEJ1ZmZlclF1ZXVlKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0UHJvZHVjZXIoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjZXI7IH0KIAogICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKQogICAgIHN0YXR1c190IHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKQEAgLTEzOSwxMiArMTM5LDE3IEBACiAgICAgLy8gZnJhbWVzIGlzIHNlcGFyYXRlIHRoYW4gdGhlIG9uZSBjYWxsaW5nIHN0b3AuCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7CiAKKyAgICAvLyBTdXJmYWNlTWVkaWFTb3VyY2UgY2FuJ3QgaGFuZGxlIHNpZGViYW5kIHN0cmVhbXMsIHNvIHRoaXMgaXMgbm90IGV4cGVjdGVkCisgICAgLy8gdG8gZXZlciBiZSBjYWxsZWQuIERvZXMgbm90aGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKwogICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKIAogcHJpdmF0ZToKLSAgICAvLyBtQnVmZmVyUXVldWUgaXMgdGhlIGV4Y2hhbmdlIHBvaW50IGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZAotICAgIC8vIHRoaXMgY29uc3VtZXIKLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIEEgQnVmZmVyUXVldWUsIHJlcHJlc2VudGVkIGJ5IHRoZXNlIGludGVyZmFjZXMsIGlzIHRoZSBleGNoYW5nZSBwb2ludAorICAgIC8vIGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZCB0aGlzIGNvbnN1bWVyCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKIAogICAgIHN0cnVjdCBTbG90RGF0YSB7CiAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IGJiYWQyNzEuLmE3OTVjODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTUzLDYgKzUzLDkgQEAKIC8vIENvbnZlcnQgYSBNSU1FIHR5cGUgdG8gYSBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0CiBzdGF0dXNfdCBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCBjb25zdCBjaGFyKiBtaW1lKTsKIAorLy8gQ29udmVydCBhIGFhYyBwcm9maWxlIHRvIGEgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdAordm9pZCBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCB1aW50NjRfdCBlQWFjUHJvZmlsZSk7CisKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIApAQCAtNjAsNiArNjMsOCBAQAogYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwogCitBU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnVyaSwgYm9vbCBpbmNvZ25pdG8gPSBmYWxzZSk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKaW5kZXggOWVjZWVhMy4uNzJlM2Q4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKQEAgLTE4LDggKzE4LDM3IEBACiAKICNkZWZpbmUgQV9CQVNFX0hfCiAKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQorCiAjZGVmaW5lIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKG5hbWUpIFwKICAgICBuYW1lKGNvbnN0IG5hbWUgJik7IFwKICAgICBuYW1lICZvcGVyYXRvcj0oY29uc3QgbmFtZSAmKQogCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNpemUgcGFyYW1ldGVyIGlzIHNhZmUgZm9yIG5ldyBhcnJheSBhbGxvY2F0aW9uICgzMi1iaXQpCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiBpZiAoIWlzU2FmZUFycmF5U2l6ZTx1aW50MzJfdD4oYXJyYXlTaXplKSkgeworICogICAgIHJldHVybiBCQURfVkFMVUU7CisgKiB9CisgKiAuLi4KKyAqIHVpbnQzMl90ICpteUFycmF5ID0gbmV3IHVpbnQzMl90W2FycmF5U2l6ZV07CisgKgorICogVGhlcmUgaXMgYSBidWcgaW4gZ2NjIHZlcnNpb25zIGVhcmxpZXIgdGhhbiA0Ljggd2hlcmUgdGhlIG5ld1tdIGFycmF5IGFsbG9jYXRpb24KKyAqIHdpbGwgb3ZlcmZsb3cgaW4gdGhlIGludGVybmFsIDMyIGJpdCBoZWFwIGFsbG9jYXRpb24sIHJlc3VsdGluZyBpbiBhbgorICogdW5kZXJhbGxvY2F0ZWQgYXJyYXkuIFRoaXMgaXMgYSBzZWN1cml0eSBpc3N1ZSB0aGF0IGFsbG93cyBwb3RlbnRpYWwgb3ZlcndyaXRpbmcKKyAqIG9mIG90aGVyIGhlYXAgZGF0YS4KKyAqCisgKiBBbiBhbHRlcm5hdGl2ZSB0byBjaGVja2luZyBpcyB0byBjcmVhdGUgYSBzYWZlIG5ldyBhcnJheSB0ZW1wbGF0ZSBmdW5jdGlvbiB3aGljaAorICogZWl0aGVyIHRocm93cyBhIHN0ZDo6YmFkX2FsbG9jIGV4Y2VwdGlvbiBvciByZXR1cm5zIE5VTEwvbnVsbHB0cl90OyBOVUxMIGNvbnNpZGVyZWQKKyAqIHNhZmUgc2luY2Ugbm9ybWFsIGFjY2VzcyBvZiBOVUxMIHRocm93cyBhbiBleGNlcHRpb24uCisgKgorICogaHR0cHM6Ly9zZWN1cml0eWJsb2cucmVkaGF0LmNvbS8yMDEyLzEwLzMxL2FycmF5LWFsbG9jYXRpb24taW4tY3h4LworICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2Jvb2wgaXNTYWZlQXJyYXlTaXplKFMgc2l6ZSkgeworICAgIHJldHVybiBzaXplID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBTIGlzIHNpZ25lZCwgaWdub3JlZCBpZiBub3QuCisgICAgICAgICAgICAmJiBzaXplIDw9IDB4ZmZmZmZmZmYgLyBzaXplb2YoVCk7ICAvLyBtYXgtdW5zaWduZWQtMzItYml0LWludCAvIGVsZW1lbnQtc2l6ZS4KK30KKwogI2VuZGlmICAvLyBBX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oCmluZGV4IDU1MTBiMTIuLmMzYmYwZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaApAQCAtMjUsOCArMjUsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQUJpdFJlYWRlciB7CitjbGFzcyBBQml0UmVhZGVyIHsKK3B1YmxpYzoKICAgICBBQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIH5BQml0UmVhZGVyKCk7CiAKICAgICB1aW50MzJfdCBnZXRCaXRzKHNpemVfdCBuKTsKICAgICB2b2lkIHNraXBCaXRzKHNpemVfdCBuKTsKQEAgLTM3LDE4ICszOSwzMiBAQAogCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OwogCi1wcml2YXRlOgorcHJvdGVjdGVkOgogICAgIGNvbnN0IHVpbnQ4X3QgKm1EYXRhOwogICAgIHNpemVfdCBtU2l6ZTsKIAogICAgIHVpbnQzMl90IG1SZXNlcnZvaXI7ICAvLyBsZWZ0LWFsaWduZWQgYml0cwogICAgIHNpemVfdCBtTnVtQml0c0xlZnQ7CiAKLSAgICB2b2lkIGZpbGxSZXNlcnZvaXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZmlsbFJlc2Vydm9pcigpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUJpdFJlYWRlcik7CiB9OwogCitjbGFzcyBOQUxCaXRSZWFkZXIgOiBwdWJsaWMgQUJpdFJlYWRlciB7CitwdWJsaWM6CisgICAgTkFMQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgYXRMZWFzdE51bUJpdHNMZWZ0KHNpemVfdCBuKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1OdW1aZXJvczsKKworICAgIHZpcnR1YWwgdm9pZCBmaWxsUmVzZXJ2b2lyKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOQUxCaXRSZWFkZXIpOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBX0JJVF9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oCmluZGV4IDI4ZjBhZWQuLjYyOTRlZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaApAQCAtMjcsNiArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CiAKIHN0cnVjdCBBQnVmZmVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KTsKQEAgLTQyLDExICs0MywxNyBAQAogCiAgICAgdm9pZCBzZXRSYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKKyAgICAvLyBjcmVhdGUgYnVmZmVyIGZyb20gZHVwIG9mIHNvbWUgbWVtb3J5IGJsb2NrCisgICAgc3RhdGljIHNwPEFCdWZmZXI+IENyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpOworCiAgICAgdm9pZCBzZXRJbnQzMkRhdGEoaW50MzJfdCBkYXRhKSB7IG1JbnQzMkRhdGEgPSBkYXRhOyB9CiAgICAgaW50MzJfdCBpbnQzMkRhdGEoKSBjb25zdCB7IHJldHVybiBtSW50MzJEYXRhOyB9CiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSgpOwogCisgICAgTWVkaWFCdWZmZXJCYXNlICpnZXRNZWRpYUJ1ZmZlckJhc2UoKTsKKyAgICB2b2lkIHNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFCdWZmZXIoKTsKIApAQCAtNTQsNiArNjEsOCBAQAogICAgIHNwPEFNZXNzYWdlPiBtRmFyZXdlbGw7CiAgICAgc3A8QU1lc3NhZ2U+IG1NZXRhOwogCisgICAgTWVkaWFCdWZmZXJCYXNlICptTWVkaWFCdWZmZXJCYXNlOworCiAgICAgdm9pZCAqbURhdGE7CiAgICAgc2l6ZV90IG1DYXBhY2l0eTsKICAgICBzaXplX3QgbVJhbmdlT2Zmc2V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKaW5kZXggZDJlNmIyOC4uM2JiN2Q3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCkBAIC00MywxMyArNDMsMTMgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBU3RhdGUpOwogfTsKIAotc3RydWN0IEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgOiBwdWJsaWMgQUhhbmRsZXIgeworc3RydWN0IEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgewogICAgIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIGhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgLy8gT25seSB0byBiZSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gYSBtZXNzYWdlLgogICAgIHZvaWQgY2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKaW5kZXggOTQwZmM1NS4uNGQ3NmI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCkBAIC01Niw4ICs1Niw2IEBACiAKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgc3A8QU1lc3NhZ2U+ID4gbVJlcGxpZXM7CiAKLSAgICBzdGF0dXNfdCBwb3N0TWVzc2FnZV9sKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUxvb3BlclJvc3Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCmluZGV4IDdlODIzZWIuLmE5ZTIzNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCkBAIC01MCw2ICs1MCw3IEBACiAgICAgdm9pZCBzZXREb3VibGUoY29uc3QgY2hhciAqbmFtZSwgZG91YmxlIHZhbHVlKTsKICAgICB2b2lkIHNldFBvaW50ZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsdWUpOwogICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnMsIHNzaXplX3QgbGVuID0gLTEpOworICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFTdHJpbmcgJnMpOwogICAgIHZvaWQgc2V0T2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPFJlZkJhc2U+ICZvYmopOwogICAgIHZvaWQgc2V0QnVmZmVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2V0TWVzc2FnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm9iaik7CkBAIC01OCw2ICs1OSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOwogCisgICAgYm9vbCBjb250YWlucyhjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKKwogICAgIGJvb2wgZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdDsKICAgICBib29sIGZpbmRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CiAgICAgYm9vbCBmaW5kU2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKnZhbHVlKSBjb25zdDsKQEAgLTEzNCw3ICsxMzcsOSBAQAogICAgICAgICAgICAgUmVjdCByZWN0VmFsdWU7CiAgICAgICAgIH0gdTsKICAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgICAgIHNpemVfdCAgICAgIG1OYW1lTGVuZ3RoOwogICAgICAgICBUeXBlIG1UeXBlOworICAgICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMTQ0LDEyICsxNDksMTQgQEAKICAgICBzaXplX3QgbU51bUl0ZW1zOwogCiAgICAgSXRlbSAqYWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIHZvaWQgZnJlZUl0ZW0oSXRlbSAqaXRlbSk7CisgICAgdm9pZCBmcmVlSXRlbVZhbHVlKEl0ZW0gKml0ZW0pOwogICAgIGNvbnN0IEl0ZW0gKmZpbmRJdGVtKGNvbnN0IGNoYXIgKm5hbWUsIFR5cGUgdHlwZSkgY29uc3Q7CiAKICAgICB2b2lkIHNldE9iamVjdEludGVybmFsKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaiwgVHlwZSB0eXBlKTsKIAorICAgIHNpemVfdCBmaW5kSXRlbUluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lc3NhZ2UpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKaW5kZXggMGY4ZjFlMS4uN2M5ODY5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCkBAIC0xOCwxNCArMTgsMTkgQEAKIAogI2RlZmluZSBBX1NUUklOR19IXwogCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IFN0cmluZzg7CitzdHJ1Y3QgUGFyY2VsOworCiBzdHJ1Y3QgQVN0cmluZyB7CiAgICAgQVN0cmluZygpOwogICAgIEFTdHJpbmcoY29uc3QgY2hhciAqcyk7CiAgICAgQVN0cmluZyhjb25zdCBjaGFyICpzLCBzaXplX3Qgc2l6ZSk7CisgICAgQVN0cmluZyhjb25zdCBTdHJpbmc4ICZmcm9tKTsKICAgICBBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20pOwogICAgIEFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pOwogICAgIH5BU3RyaW5nKCk7CkBAIC02NywxNiArNzIsMjYgQEAKICAgICBzaXplX3QgaGFzaCgpIGNvbnN0OwogCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKIAogICAgIGludCBjb21wYXJlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZUlnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogCisgICAgYm9vbCBlcXVhbHNJZ25vcmVDYXNlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKICAgICBib29sIHN0YXJ0c1dpdGgoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKICAgICBib29sIGVuZHNXaXRoKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3Q7CisgICAgYm9vbCBzdGFydHNXaXRoSWdub3JlQ2FzZShjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIGJvb2wgZW5kc1dpdGhJZ25vcmVDYXNlKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3Q7CiAKICAgICB2b2lkIHRvbG93ZXIoKTsKIAorICAgIHN0YXRpYyBBU3RyaW5nIEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBjaGFyICprRW1wdHlTdHJpbmc7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaAppbmRleCA2MGNiNDFkLi4yNTViY2JlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oCkBAIC0yMCw5ICsyMCw0NCBAQAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1hdGggdGVtcGxhdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAorLyogVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgZGVuIG11c3Qgbm90IGJlIDAgKi8KK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgZGl2Um91bmQoY29uc3QgVCAmbm9tLCBjb25zdCBUICZkZW4pIHsKKyAgICBpZiAoKG5vbSA+PSAwKSBeIChkZW4gPj0gMCkpIHsKKyAgICAgICAgcmV0dXJuIChub20gLSBkZW4gLyAyKSAvIGRlbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKG5vbSArIGRlbiAvIDIpIC8gZGVuOworICAgIH0KK30KKworLyogPT0gY2VpbChub20gLyBkZW4pLiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBkZW4gbXVzdCBub3QgYmUgMCAqLwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCBkaXZVcChjb25zdCBUICZub20sIGNvbnN0IFQgJmRlbikgeworICAgIGlmIChkZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAobm9tIDwgMCA/IG5vbSArIGRlbiArIDEgOiBub20pIC8gZGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAobm9tIDwgMCA/IG5vbSA6IG5vbSArIGRlbiAtIDEpIC8gZGVuOworICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgVCBhYnMoY29uc3QgVCAmYSkgeworICAgIHJldHVybiBhIDwgMCA/IC1hIDogYTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCAmbWluKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCAmbWF4KGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKyAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKK30KKwogdGVtcGxhdGU8Y2xhc3MgVD4KIHZvaWQgRU5TVVJFX1VOU0lHTkVEX1RZUEUoKSB7Ci0gICAgVCBUWVBFX01VU1RfQkVfVU5TSUdORURbKFQpLTEgPCAwID8gLTEgOiAwXTsKKyAgICBUIFRZUEVfTVVTVF9CRV9VTlNJR05FRFsoVCktMSA8IDAgPyAtMSA6IDBdIF9fdW51c2VkOwogfQogCiAvLyBuZWVkbGUgaXMgaW4gcmFuZ2UgW2hheVN0YXJ0LCBoYXlTdGFydCArIGhheVNpemUpCkBAIC00Miw0ICs3NywxMSBAQAogICAgICAgICAgICAgJiYgKFUpKG5lZWRsZVN0YXJ0ICsgbmVlZGxlU2l6ZSAtIGhheVN0YXJ0KSA8PSBoYXlTaXplOwogfQogCisvKiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBwZXJpb2QgbXVzdCBiZSBwb3NpdGl2ZSAqLwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgVCBwZXJpb2RpY0Vycm9yKGNvbnN0IFQgJnZhbCwgY29uc3QgVCAmcGVyaW9kKSB7CisgICAgVCBlcnIgPSBhYnModmFsKSAlIHBlcmlvZDsKKyAgICByZXR1cm4gKGVyciA8IChwZXJpb2QgLyAyKSkgPyBlcnIgOiAocGVyaW9kIC0gZXJyKTsKK30KKwogI2VuZGlmICAvLyBBX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0MThmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNkZWZpbmUgTUVESUFfQlVGRkVSX0JBU0VfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2UgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyQmFzZSgpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyQmFzZSgpIHt9CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJCYXNlKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAmKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckJhc2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCmluZGV4IGYyM2MzMzcuLjM3ZWY2NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEFMb29wZXI7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBNZWRpYVBsYXllckJhc2U7CiBjbGFzcyBNZWRpYVNvdXJjZTsKIGNsYXNzIFBhcmNlbDsKQEAgLTM0LDcgKzM1LDkgQEAKIAogY2xhc3MgVGltZWRUZXh0RHJpdmVyIHsKIHB1YmxpYzoKLSAgICBUaW1lZFRleHREcml2ZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpOworICAgIFRpbWVkVGV4dERyaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICB+VGltZWRUZXh0RHJpdmVyKCk7CiAKQEAgLTc3LDYgKzgwLDcgQEAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPFRpbWVkVGV4dFBsYXllcj4gbVBsYXllcjsKICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogCiAgICAgLy8gVmFyaWFibGVzIHRvIGJlIGd1YXJkZWQgYnkgbUxvY2suCiAgICAgU3RhdGUgbVN0YXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFDb2RlYy5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFDb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2Y0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYUNvZGVjLmgKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DT0RFQ19ICisjZGVmaW5lIF9OREtfTUVESUFfQ09ERUNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgorI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworc3RydWN0IEFNZWRpYUNvZGVjOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWMgQU1lZGlhQ29kZWM7CisKK3N0cnVjdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8geworICAgIGludDMyX3Qgb2Zmc2V0OworICAgIGludDMyX3Qgc2l6ZTsKKyAgICBpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVczsKKyAgICB1aW50MzJfdCBmbGFnczsKK307Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gQU1lZGlhQ29kZWNCdWZmZXJJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKKworZW51bSB7CisgICAgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSA9IDQsCisgICAgQU1FRElBQ09ERUNfQ09ORklHVVJFX0ZMQUdfRU5DT0RFID0gMSwKKyAgICBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgPSAtMywKKyAgICBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCA9IC0yLAorICAgIEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSID0gLTEKK307CisKKy8qKgorICogQ3JlYXRlIGNvZGVjIGJ5IG5hbWUuIFVzZSB0aGlzIGlmIHlvdSBrbm93IHRoZSBleGFjdCBjb2RlYyB5b3Ugd2FudCB0byB1c2UuCisgKiBXaGVuIGNvbmZpZ3VyaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGNvZGVjIGFzIGFuCisgKiBlbmNvZGVyIG9yIGRlY29kZXIuCisgKi8KK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBDcmVhdGUgY29kZWMgYnkgbWltZSB0eXBlLiBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIHVzZSB0aGlzLCBzcGVjaWZ5aW5nIGEKKyAqIG1pbWUgdHlwZSBvYnRhaW5lZCBmcm9tIG1lZGlhIGV4dHJhY3Rvci4KKyAqLworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKTsKKworLyoqCisgKiBDcmVhdGUgZW5jb2RlciBieSBuYW1lLgorICovCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpOworCisvKioKKyAqIGRlbGV0ZSB0aGUgY29kZWMgYW5kIGZyZWUgaXRzIHJlc291cmNlcworICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19kZWxldGUoQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNvZGVjLiBGb3IgZGVjb2RpbmcgeW91IHdvdWxkIHR5cGljYWxseSBnZXQgdGhlIGZvcm1hdCBmcm9tIGFuIGV4dHJhY3Rvci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY29uZmlndXJlKAorICAgICAgICBBTWVkaWFDb2RlYyosCisgICAgICAgIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0LAorICAgICAgICBBTmF0aXZlV2luZG93KiBzdXJmYWNlLAorICAgICAgICBBTWVkaWFDcnlwdG8gKmNyeXB0bywKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIFN0YXJ0IHRoZSBjb2RlYy4gQSBjb2RlYyBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIGl0IGNhbiBiZSBzdGFydGVkLCBhbmQgbXVzdCBiZSBzdGFydGVkCisgKiBiZWZvcmUgYnVmZmVycyBjYW4gYmUgc2VudCB0byBpdC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RhcnQoQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBTdG9wIHRoZSBjb2RlYy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyopOworCisvKgorICogRmx1c2ggdGhlIGNvZGVjJ3MgaW5wdXQgYW5kIG91dHB1dC4gQWxsIGluZGljZXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGNhbGxzIHRvCisgKiBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIgYW5kIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIgYmVjb21lIGludmFsaWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2ZsdXNoKEFNZWRpYUNvZGVjKik7CisKKy8qKgorICogR2V0IGFuIGlucHV0IGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCisgKiBkZXF1ZXVlSW5wdXRCdWZmZXIsIGFuZCBub3QgeWV0IHF1ZXVlZC4KKyAqLwordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKTsKKworLyoqCisgKiBHZXQgYW4gb3V0cHV0IGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCisgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLCBhbmQgbm90IHlldCBxdWV1ZWQuCisgKi8KK3VpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpOworCisvKioKKyAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlci4gQW4gYXBwIHdpbGwgdHlwaWNhbGx5IHVzZSB0aGlzIHdpdGgKKyAqIGdldElucHV0QnVmZmVyKCkgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLCB0aGVuIGNvcHkgdGhlIGRhdGEgdG8gYmUgZW5jb2RlZCBvciBkZWNvZGVkCisgKiBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIGNvZGVjLgorICovCitzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIGludDY0X3QgdGltZW91dFVzKTsKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosCisgICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosCisgICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlciBvZiBwcm9jZXNzZWQgZGF0YS4KKyAqLworc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLCBpbnQ2NF90IHRpbWVvdXRVcyk7CitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyopOworCisvKioKKyAqIElmIHlvdSBhcmUgZG9uZSB3aXRoIGEgYnVmZmVyLCB1c2UgdGhpcyBjYWxsIHRvIHJldHVybiB0aGUgYnVmZmVyIHRvCisgKiB0aGUgY29kZWMuIElmIHlvdSBwcmV2aW91c2x5IHNwZWNpZmllZCBhIHN1cmZhY2Ugd2hlbiBjb25maWd1cmluZyB0aGlzCisgKiB2aWRlbyBkZWNvZGVyIHlvdSBjYW4gb3B0aW9uYWxseSByZW5kZXIgdGhlIGJ1ZmZlci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKTsKKworLyoqCisgKiBJZiB5b3UgYXJlIGRvbmUgd2l0aCBhIGJ1ZmZlciwgdXNlIHRoaXMgY2FsbCB0byB1cGRhdGUgaXRzIHN1cmZhY2UgdGltZXN0YW1wCisgKiBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjb2RlYyB0byByZW5kZXIgaXQgb24gdGhlIG91dHB1dCBzdXJmYWNlLiBJZiB5b3UKKyAqIGhhdmUgbm90IHNwZWNpZmllZCBhbiBvdXRwdXQgc3VyZmFjZSB3aGVuIGNvbmZpZ3VyaW5nIHRoaXMgdmlkZW8gY29kZWMsCisgKiB0aGlzIGNhbGwgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGNvZGVjLgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIGZvciBNZWRpYUNvZGVjLnJlbGVhc2VPdXRwdXRCdWZmZXIuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcyk7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0NMRUFSID0gMCwKKyAgICBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFIgPSAxCit9IGNyeXB0b2luZm9fbW9kZV90OworCisvKioKKyAqIENyZWF0ZSBhbiBBTWVkaWFDb2RlY0NyeXB0b0luZm8gZnJvbSBzY3JhdGNoLiBVc2UgdGhpcyBpZiB5b3UgbmVlZCB0byB1c2UgY3VzdG9tCisgKiBjcnlwdG8gaW5mbywgcmF0aGVyIHRoYW4gb25lIG9idGFpbmVkIGZyb20gQU1lZGlhRXh0cmFjdG9yLgorICoKKyAqIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiBhbiAoYXQgbGVhc3QKKyAqIHBhcnRpYWxseSkgZW5jcnlwdGVkIGlucHV0IHNhbXBsZS4KKyAqIEEgYnVmZmVyJ3MgZGF0YSBpcyBjb25zaWRlcmVkIHRvIGJlIHBhcnRpdGlvbmVkIGludG8gInN1YnNhbXBsZXMiLAorICogZWFjaCBzdWJzYW1wbGUgc3RhcnRzIHdpdGggYSAocG90ZW50aWFsbHkgZW1wdHkpIHJ1biBvZiBwbGFpbiwKKyAqIHVuZW5jcnlwdGVkIGJ5dGVzIGZvbGxvd2VkIGJ5IGEgKGFsc28gcG90ZW50aWFsbHkgZW1wdHkpIHJ1biBvZgorICogZW5jcnlwdGVkIGJ5dGVzLgorICogbnVtQnl0ZXNPZkNsZWFyRGF0YSBjYW4gYmUgbnVsbCB0byBpbmRpY2F0ZSB0aGF0IGFsbCBkYXRhIGlzIGVuY3J5cHRlZC4KKyAqIFRoaXMgaW5mb3JtYXRpb24gZW5jYXBzdWxhdGVzIHBlci1zYW1wbGUgbWV0YWRhdGEgYXMgb3V0bGluZWQgaW4KKyAqIElTTy9JRUMgRkRJUyAyMzAwMS03OjIwMTEgIkNvbW1vbiBlbmNyeXB0aW9uIGluIElTTyBiYXNlIG1lZGlhIGZpbGUgZm9ybWF0IGZpbGVzIi4KKyAqLworQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAorICAgICAgICBpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgdWludDhfdCBrZXlbMTZdLAorICAgICAgICB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgY3J5cHRvaW5mb19tb2RlX3QgbW9kZSwKKyAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAorICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKTsKKworLyoqCisgKiBkZWxldGUgYW4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvIGNyZWF0ZWQgcHJldmlvdXNseSB3aXRoIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcsIG9yCisgKiBvYnRhaW5lZCBmcm9tIEFNZWRpYUV4dHJhY3RvcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopOworCisvKioKKyAqIFRoZSBudW1iZXIgb2Ygc3Vic2FtcGxlcyB0aGF0IG1ha2UgdXAgdGhlIGJ1ZmZlcidzIGNvbnRlbnRzLgorICovCitzaXplX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE51bVN1YlNhbXBsZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKik7CisKKy8qKgorICogQSAxNi1ieXRlIG9wYXF1ZSBrZXkKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEtleShBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50OF90ICpkc3QpOworCisvKioKKyAqIEEgMTYtYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldElWKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ4X3QgKmRzdCk7CisKKy8qKgorICogVGhlIHR5cGUgb2YgZW5jcnlwdGlvbiB0aGF0IGhhcyBiZWVuIGFwcGxpZWQsCisgKiBvbmUgb2YgQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9DTEVBUiBvciBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFIuCisgKi8KK2NyeXB0b2luZm9fbW9kZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRNb2RlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopOworCisvKioKKyAqIFRoZSBudW1iZXIgb2YgbGVhZGluZyB1bmVuY3J5cHRlZCBieXRlcyBpbiBlYWNoIHN1YnNhbXBsZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldENsZWFyQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgc2l6ZV90ICpkc3QpOworCisvKioKKyAqIFRoZSBudW1iZXIgb2YgdHJhaWxpbmcgZW5jcnlwdGVkIGJ5dGVzIGluIGVhY2ggc3Vic2FtcGxlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0RW5jcnlwdGVkQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgc2l6ZV90ICpkc3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvL19OREtfTUVESUFfQ09ERUNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFDcnlwdG8uaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhQ3J5cHRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzNzRjNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhQ3J5cHRvLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfQ1JZUFRPX0gKKyNkZWZpbmUgX05ES19NRURJQV9DUllQVE9fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBTWVkaWFDcnlwdG87Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDcnlwdG8gQU1lZGlhQ3J5cHRvOworCit0eXBlZGVmIHVpbnQ4X3QgQU1lZGlhVVVJRFsxNl07CisKK2Jvb2wgQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCk7CisKK2Jvb2wgQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKTsKKworQU1lZGlhQ3J5cHRvKiBBTWVkaWFDcnlwdG9fbmV3KGNvbnN0IEFNZWRpYVVVSUQgdXVpZCwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpOworCit2b2lkIEFNZWRpYUNyeXB0b19kZWxldGUoQU1lZGlhQ3J5cHRvKiBjcnlwdG8pOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfQ1JZUFRPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRHJtLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYURybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYWZkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYURybS5oCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRFJNX0gKKyNkZWZpbmUgX05ES19NRURJQV9EUk1fSAorCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK3N0cnVjdCBBTWVkaWFEcm07Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm0gQU1lZGlhRHJtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgdWludDhfdCAqcHRyOworICAgIHNpemVfdCBsZW5ndGg7Cit9IEFNZWRpYURybUJ5dGVBcnJheTsKKwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2Vzc2lvbklkOwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2NvcGU7Cit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlTZXRJZDsKK3R5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNlY3VyZVN0b3A7CisKKwordHlwZWRlZiBlbnVtIEFNZWRpYURybUV2ZW50VHlwZSB7CisgICAgLyoqCisgICAgICogVGhpcyBldmVudCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBhcHAgbmVlZHMgdG8gcmVxdWVzdCBhIGNlcnRpZmljYXRlIGZyb20KKyAgICAgKiB0aGUgcHJvdmlzaW9uaW5nIHNlcnZlci4gIFRoZSByZXF1ZXN0IG1lc3NhZ2UgZGF0YSBpcyBvYnRhaW5lZCB1c2luZworICAgICAqIEFNZWRpYURybV9nZXRQcm92aXNpb25SZXF1ZXN0LgorICAgICAqLworICAgIEVWRU5UX1BST1ZJU0lPTl9SRVFVSVJFRCA9IDEsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGV2ZW50IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcCBuZWVkcyB0byByZXF1ZXN0IGtleXMgZnJvbSBhIGxpY2Vuc2UKKyAgICAgKiBzZXJ2ZXIuICBUaGUgcmVxdWVzdCBtZXNzYWdlIGRhdGEgaXMgb2J0YWluZWQgdXNpbmcgQU1lZGlhRHJtX2dldEtleVJlcXVlc3QuCisgICAgICovCisgICAgRVZFTlRfS0VZX1JFUVVJUkVEID0gMiwKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbGljZW5zZWQgdXNhZ2UgZHVyYXRpb24gZm9yIGtleXMgaW4gYSBzZXNzaW9uCisgICAgICogaGFzIGV4cGlyZWQuICBUaGUga2V5cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLgorICAgICAqLworICAgIEVWRU5UX0tFWV9FWFBJUkVEID0gMywKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgbWF5IGluZGljYXRlIHNvbWUgc3BlY2lmaWMgdmVuZG9yLWRlZmluZWQgY29uZGl0aW9uLCBzZWUgeW91cgorICAgICAqIERSTSBwcm92aWRlciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzCisgICAgICovCisgICAgRVZFTlRfVkVORE9SX0RFRklORUQgPSA0Cit9IEFNZWRpYURybUV2ZW50VHlwZTsKKwordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXZlbnRMaXN0ZW5lcikoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBBTWVkaWFEcm1FdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhU2l6ZSk7CisKKworLyoqCisgKiBRdWVyeSBpZiB0aGUgZ2l2ZW4gc2NoZW1lIGlkZW50aWZpZWQgYnkgaXRzIFVVSUQgaXMgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLCBhbmQKKyAqIHdoZXRoZXIgdGhlIGRybSBwbHVnaW4gaXMgYWJsZSB0byBoYW5kbGUgdGhlIG1lZGlhIGNvbnRhaW5lciBmb3JtYXQgc3BlY2lmaWVkIGJ5IG1pbWVUeXBlLgorICoKKyAqIHV1aWQgaWRlbnRpZmllcyB0aGUgdW5pdmVyc2FsIHVuaXF1ZSBJRCBvZiB0aGUgY3J5cHRvIHNjaGVtZS4gdXVpZCBtdXN0IGJlIDE2IGJ5dGVzLgorICogbWltZVR5cGUgaXMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgbWVkaWEgY29udGFpbmVyLCBlLmcuICJ2aWRlby9tcDQiLiAgSWYgbWltZVR5cGUKKyAqIGlzIG5vdCBrbm93biBvciByZXF1aXJlZCwgaXQgY2FuIGJlIHByb3ZpZGVkIGFzIE5VTEwuCisgKi8KK2Jvb2wgQU1lZGlhRHJtX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgKnV1aWQsIGNvbnN0IGNoYXIgKm1pbWVUeXBlKTsKKworLyoqCisgKiBDcmVhdGUgYSBNZWRpYURybSBpbnN0YW5jZSBmcm9tIGEgVVVJRAorICogdXVpZCBpZGVudGlmaWVzIHRoZSB1bml2ZXJzYWwgdW5pcXVlIElEIG9mIHRoZSBjcnlwdG8gc2NoZW1lLiB1dWlkIG11c3QgYmUgMTYgYnl0ZXMuCisgKi8KK0FNZWRpYURybSogQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRChjb25zdCB1aW50OF90ICp1dWlkKTsKKworLyoqCisgKiBSZWxlYXNlIGEgTWVkaWFEcm0gb2JqZWN0CisgKi8KK3ZvaWQgQU1lZGlhRHJtX3JlbGVhc2UoQU1lZGlhRHJtICopOworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyKEFNZWRpYURybSAqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKKworLyoqCisgKiBPcGVuIGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgTWVkaWFEcm0gb2JqZWN0LiAgQSBzZXNzaW9uIElEIGlzIHJldHVybmVkLgorICoKKyAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHByb3Zpc2lvbmluZyBpcyBuZWVkZWQKKyAqIHJldHVybnMgTUVESUFEUk1fUkVTT1VSQ0VfQlVTWV9FUlJPUiBpZiByZXF1aXJlZCByZXNvdXJjZXMgYXJlIGluIHVzZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fb3BlblNlc3Npb24oQU1lZGlhRHJtICosIEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKTsKKworLyoqCisgKiBDbG9zZSBhIHNlc3Npb24gb24gdGhlIE1lZGlhRHJtIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZAorICogd2l0aCBBTWVkaWFEcm1fb3BlblNlc3Npb24uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKTsKKwordHlwZWRlZiBlbnVtIEFNZWRpYURybUtleVR5cGUgeworICAgIC8qKgorICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb25saW5lIHVzZSwgdGhleSB3aWxsCisgICAgICogbm90IGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHN1YnNlcXVlbnQgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkCisgICAgICogdG8gYSBuZXR3b3JrLgorICAgICAqLworICAgIEtFWV9UWVBFX1NUUkVBTUlORyA9IDEsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb2ZmbGluZSB1c2UsIHRoZXkKKyAgICAgKiB3aWxsIGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHVzZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCB0byBhIG5ldHdvcmsuCisgICAgICovCisgICAgS0VZX1RZUEVfT0ZGTElORSA9IDIsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgcHJldmlvdXNseSBzYXZlZCBvZmZsaW5lIGtleXMgc2hvdWxkIGJlIHJlbGVhc2VkLgorICAgICAqLworICAgIEtFWV9UWVBFX1JFTEVBU0UgPSAzCit9IEFNZWRpYURybUtleVR5cGU7CisKKy8qKgorICogIERhdGEgdHlwZSBjb250YWluaW5nIHtrZXksIHZhbHVlfSBwYWlyCisgKi8KK3R5cGVkZWYgc3RydWN0IEFNZWRpYURybUtleVZhbHVlUGFpciB7CisgICAgY29uc3QgY2hhciAqbUtleTsKKyAgICBjb25zdCBjaGFyICptVmFsdWU7Cit9IEFNZWRpYURybUtleVZhbHVlOworCisvKioKKyAqIEEga2V5IHJlcXVlc3QvcmVzcG9uc2UgZXhjaGFuZ2Ugb2NjdXJzIGJldHdlZW4gdGhlIGFwcCBhbmQgYSBsaWNlbnNlIHNlcnZlcgorICogdG8gb2J0YWluIG9yIHJlbGVhc2Uga2V5cyB1c2VkIHRvIGRlY3J5cHQgZW5jcnlwdGVkIGNvbnRlbnQuCisgKiBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdCBpcyB1c2VkIHRvIG9idGFpbiBhbiBvcGFxdWUga2V5IHJlcXVlc3QgYnl0ZSBhcnJheSB0aGF0CisgKiBpcyBkZWxpdmVyZWQgdG8gdGhlIGxpY2Vuc2Ugc2VydmVyLiAgVGhlIG9wYXF1ZSBrZXkgcmVxdWVzdCBieXRlIGFycmF5IGlzCisgKiByZXR1cm5lZCBpbiBLZXlSZXF1ZXN0LmRhdGEuICBUaGUgcmVjb21tZW5kZWQgVVJMIHRvIGRlbGl2ZXIgdGhlIGtleSByZXF1ZXN0IHRvCisgKiBpcyByZXR1cm5lZCBpbiBLZXlSZXF1ZXN0LmRlZmF1bHRVcmwuCisgKgorICogQWZ0ZXIgdGhlIGFwcCBoYXMgcmVjZWl2ZWQgdGhlIGtleSByZXF1ZXN0IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwKKyAqIGl0IHNob3VsZCBkZWxpdmVyIHRvIHRoZSByZXNwb25zZSB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgdGhlIG1ldGhvZAorICogQU1lZGlhRHJtX3Byb3ZpZGVLZXlSZXNwb25zZS4KKyAqCisgKiBzY29wZSBtYXkgYmUgYSBzZXNzaW9uSWQgb3IgYSBrZXlTZXRJZCwgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQga2V5VHlwZS4KKyAqIFdoZW4gdGhlIGtleVR5cGUgaXMgS0VZX1RZUEVfU1RSRUFNSU5HIG9yIEtFWV9UWVBFX09GRkxJTkUsIHNjb3BlIHNob3VsZCBiZSBzZXQKKyAqIHRvIHRoZSBzZXNzaW9uSWQgdGhlIGtleXMgd2lsbCBiZSBwcm92aWRlZCB0by4gIFdoZW4gdGhlIGtleVR5cGUgaXMKKyAqIEtFWV9UWVBFX1JFTEVBU0UsIHNjb3BlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleVNldElkIG9mIHRoZSBrZXlzIGJlaW5nIHJlbGVhc2VkLgorICogUmVsZWFzaW5nIGtleXMgZnJvbSBhIGRldmljZSBpbnZhbGlkYXRlcyB0aGVtIGZvciBhbGwgc2Vzc2lvbnMuCisgKgorICogaW5pdCBjb250YWluZXItc3BlY2lmaWMgZGF0YSwgaXRzIG1lYW5pbmcgaXMgaW50ZXJwcmV0ZWQgYmFzZWQgb24gdGhlIG1pbWUgdHlwZQorICogcHJvdmlkZWQgaW4gdGhlIG1pbWVUeXBlIHBhcmFtZXRlci4gIEl0IGNvdWxkIGNvbnRhaW4sIGZvciBleGFtcGxlLCB0aGUgY29udGVudAorICogSUQsIGtleSBJRCBvciBvdGhlciBkYXRhIG9idGFpbmVkIGZyb20gdGhlIGNvbnRlbnQgbWV0YWRhdGEgdGhhdCBpcyByZXF1aXJlZCBpbgorICogZ2VuZXJhdGluZyB0aGUga2V5IHJlcXVlc3QuIGluaXQgbWF5IGJlIG51bGwgd2hlbiBrZXlUeXBlIGlzIEtFWV9UWVBFX1JFTEVBU0UuCisgKgorICogaW5pdFNpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBpbml0RGF0YQorICoKKyAqIG1pbWVUeXBlIGlkZW50aWZpZXMgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudC4KKyAqCisgKiBrZXlUeXBlIHNwZWNpZmVzIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0LiBUaGUgcmVxdWVzdCBtYXkgYmUgdG8gYWNxdWlyZSBrZXlzIGZvcgorICogICBzdHJlYW1pbmcgb3Igb2ZmbGluZSBjb250ZW50LCBvciB0byByZWxlYXNlIHByZXZpb3VzbHkgYWNxdWlyZWQga2V5cywgd2hpY2ggYXJlCisgKiAgIGlkZW50aWZpZWQgYnkgYSBrZXlTZXRJZC4KKyAqCisgKiBvcHRpb25hbFBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBrZXkgcmVxdWVzdCBtZXNzYWdlIHRvIGFsbG93IGEgY2xpZW50CisgKiAgIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBtZXNzYWdlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlci4KKyAqCisgKiBudW1PcHRpb25hbFBhcmFtZXRlcnMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycyBwcm92aWRlZAorICogICBieSB0aGUgY2FsbGVyCisgKgorICogT24gZXhpdDoKKyAqICAgMS4gVGhlIGtleVJlcXVlc3QgcG9pbnRlciB3aWxsIHJlZmVyZW5jZSB0aGUgb3BhcXVlIGtleSByZXF1ZXN0IGRhdGEuICBJdAorICogICAgICAgd2lsbCByZXNpZGUgaW4gbWVtb3J5IG93bmVkIGJ5IHRoZSBBTWVkaWFEcm0gb2JqZWN0LCBhbmQgd2lsbCByZW1haW4KKyAqICAgICAgIGFjY2Vzc2libGUgdW50aWwgdGhlIG5leHQgY2FsbCB0byBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdCBvciB1bnRpbCB0aGUKKyAqICAgICAgIE1lZGlhRHJtIG9iamVjdCBpcyByZWxlYXNlZC4KKyAqICAgMi4ga2V5UmVxdWVzdFNpemUgd2lsbCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QKKyAqCisgKiByZXR1cm5zIE1FRElBRFJNX05PVF9QUk9WSVNJT05FRF9FUlJPUiBpZiByZXByb3Zpc2lvbmluZyBpcyBuZWVkZWQsIGR1ZSB0byBhCisgKiBwcm9ibGVtIHdpdGggdGhlIGRldmljZSBjZXJ0aWZpY2F0ZS4KKyovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2NvcGUgKnNjb3BlLAorICAgICAgICBjb25zdCB1aW50OF90ICppbml0LCBzaXplX3QgaW5pdFNpemUsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLCBBTWVkaWFEcm1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVZhbHVlICpvcHRpb25hbFBhcmFtZXRlcnMsIHNpemVfdCBudW1PcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LCBzaXplX3QgKmtleVJlcXVlc3RTaXplKTsKKworLyoqCisgKiBBIGtleSByZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBsaWNlbnNlIHNlcnZlciBieSB0aGUgYXBwLCB0aGVuIGl0IGlzCisgKiBwcm92aWRlZCB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLiAgV2hlbiB0aGUKKyAqIHJlc3BvbnNlIGlzIGZvciBhbiBvZmZsaW5lIGtleSByZXF1ZXN0LCBhIGtleVNldElkIGlzIHJldHVybmVkIHRoYXQgY2FuIGJlCisgKiB1c2VkIHRvIGxhdGVyIHJlc3RvcmUgdGhlIGtleXMgdG8gYSBuZXcgc2Vzc2lvbiB3aXRoIEFNZWRpYURybV9yZXN0b3JlS2V5cy4KKyAqIFdoZW4gdGhlIHJlc3BvbnNlIGlzIGZvciBhIHN0cmVhbWluZyBvciByZWxlYXNlIHJlcXVlc3QsIGEgbnVsbCBrZXlTZXRJZCBpcworICogcmV0dXJuZWQuCisgKgorICogc2NvcGUgbWF5IGJlIGEgc2Vzc2lvbklkIG9yIGtleVNldElkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUKKyAqIHJlc3BvbnNlLiAgU2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUgc2Vzc2lvbklkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIGZvciBlaXRoZXIKKyAqIHN0cmVhbWluZyBvciBvZmZsaW5lIGtleSByZXF1ZXN0cy4gIFNjb3BlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleVNldElkIHdoZW4KKyAqIHRoZSByZXNwb25zZSBpcyBmb3IgYSByZWxlYXNlIHJlcXVlc3QuCisgKgorICogcmVzcG9uc2UgcG9pbnRzIHRvIHRoZSBvcGFxdWUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCisgKiByZXNwb25zZVNpemUgc2hvdWxkIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgaW4gYnl0ZXMKKyAqLworCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplLCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpOworCisvKioKKyAqIFJlc3RvcmUgcGVyc2lzdGVkIG9mZmxpbmUga2V5cyBpbnRvIGEgbmV3IHNlc3Npb24uICBrZXlTZXRJZCBpZGVudGlmaWVzIHRoZQorICoga2V5cyB0byBsb2FkLCBvYnRhaW5lZCBmcm9tIGEgcHJpb3IgY2FsbCB0byBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlLgorICoKKyAqIHNlc3Npb25JZCBpcyB0aGUgc2Vzc2lvbiBJRCBmb3IgdGhlIERSTSBzZXNzaW9uCisgKiBrZXlTZXRJZCBpZGVudGlmaWVzIHRoZSBzYXZlZCBrZXkgc2V0IHRvIHJlc3RvcmUKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3Jlc3RvcmVLZXlzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5U2V0SWQgKmtleVNldElkKTsKKworLyoqCisgKiBSZW1vdmUgdGhlIGN1cnJlbnQga2V5cyBmcm9tIGEgc2Vzc2lvbi4KKyAqCisgKiBrZXlTZXRJZCBpZGVudGlmaWVzIGtleXMgdG8gcmVtb3ZlCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZW1vdmVLZXlzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKmtleVNldElkKTsKKworLyoqCisgKiBSZXF1ZXN0IGFuIGluZm9ybWF0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXkgc3RhdHVzIGZvciB0aGUgc2Vzc2lvbi4gIFRoZSBzdGF0dXMgaXMKKyAqIGluIHRoZSBmb3JtIG9mIHtrZXksIHZhbHVlfSBwYWlycy4gIFNpbmNlIERSTSBsaWNlbnNlIHBvbGljaWVzIHZhcnkgYnkgdmVuZG9yLAorICogdGhlIHNwZWNpZmljIHN0YXR1cyBmaWVsZCBuYW1lcyBhcmUgZGV0ZXJtaW5lZCBieSBlYWNoIERSTSB2ZW5kb3IuICBSZWZlciB0byB5b3VyCisgKiBEUk0gcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGVmaW5pdGlvbnMgb2YgdGhlIGZpZWxkIG5hbWVzIGZvciBhIHBhcnRpY3VsYXIKKyAqIERSTSBlbmdpbmUgcGx1Z2luLgorICoKKyAqIE9uIGVudHJ5LCBudW1QYWlycyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhaXJzCisgKiB0aGF0IGNhbiBiZSByZXR1cm5lZCAodGhlIHNpemUgb2YgdGhlIGFycmF5KS4gIE9uIGV4aXQsIG51bVBhaXJzIHdpbGwgYmUgc2V0CisgKiB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd3JpdHRlbiB0byB0aGUgYXJyYXkuICBJZiB0aGUgbnVtYmVyIG9mIHtrZXksIHZhbHVlfSBwYWlycworICogdG8gYmUgcmV0dXJuZWQgaXMgZ3JlYXRlciB0aGFuICpudW1QYWlycywgTUVESUFEUk1fU0hPUlRfQlVGRkVSIHdpbGwgYmUgcmV0dXJuZWQKKyAqIGFuZCBudW1QYWlycyB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIHBhaXJzIGF2YWlsYWJsZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3F1ZXJ5S2V5U3RhdHVzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgQU1lZGlhRHJtS2V5VmFsdWUgKmtleVZhbHVlUGFpcnMsIHNpemVfdCAqbnVtUGFpcnMpOworCisKKy8qKgorICogQSBwcm92aXNpb24gcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIHByb3Zpc2lvbmluZworICogc2VydmVyIHRvIHJldHJpZXZlIGEgZGV2aWNlIGNlcnRpZmljYXRlLiAgSWYgcHJvdmlzaW9uaW5pbmcgaXMgcmVxdWlyZWQsIHRoZQorICogRVZFTlRfUFJPVklTSU9OX1JFUVVJUkVEIGV2ZW50IHdpbGwgYmUgc2VudCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAqIGdldFByb3Zpc2lvblJlcXVlc3QgaXMgdXNlZCB0byBvYnRhaW4gdGhlIG9wYXF1ZSBwcm92aXNpb24gcmVxdWVzdCBieXRlIGFycmF5IHRoYXQKKyAqIHNob3VsZCBiZSBkZWxpdmVyZWQgdG8gdGhlIHByb3Zpc2lvbmluZyBzZXJ2ZXIuCisgKiBPbiBleGl0OgorICogICAgMS4gVGhlIHByb3Zpc2lvbiByZXF1ZXN0IGRhdGEgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHByb3Zpc2lvblJlcXVlc3QsIGluCisgKiAgICAgICAgbWVtb3J5IG93bmVkIGJ5IHRoZSBBTWVkaWFEcm0gb2JqZWN0LiAgSXQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB0aGUKKyAqICAgICAgICBuZXh0IGNhbGwgdG8gZ2V0UHJvdmlzaW9uUmVxdWVzdC4KKyAqICAgIDIuIHByb3Zpc2lvblJlcXVlc3RTaXplIHdpbGwgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0IGRhdGEuCisgKiAgICAzLiBzZXJ2ZXJVcmwgd2lsbCByZWZlcmVuY2UgYSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTAorICogICAgICAgdGhlIHByb3Zpc2lvbmluZyByZXF1ZXN0IHNob3VsZCBiZSBzZW50IHRvLiAgSXQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbAorICogICAgICAgdGhlIG5leHQgY2FsbCB0byBnZXRQcm92aXNpb25SZXF1ZXN0LgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvdmlzaW9uUmVxdWVzdChBTWVkaWFEcm0gKiwgY29uc3QgdWludDhfdCAqKnByb3Zpc2lvblJlcXVlc3QsCisgICAgICAgIHNpemVfdCAqcHJvdmlzaW9uUmVxdWVzdFNpemUsIGNvbnN0IGNoYXIgKipzZXJ2ZXJVcmwpOworCisKKy8qKgorICogQWZ0ZXIgYSBwcm92aXNpb24gcmVzcG9uc2UgaXMgcmVjZWl2ZWQgYnkgdGhlIGFwcCwgaXQgaXMgcHJvdmlkZWQgdG8gdGhlIERSTQorICogZW5naW5lIHBsdWdpbiB1c2luZyB0aGlzIG1ldGhvZC4KKyAqCisgKiByZXNwb25zZSBpcyB0aGUgb3BhcXVlIHByb3Zpc2lvbmluZyByZXNwb25zZSBieXRlIGFycmF5IHRvIHByb3ZpZGUgdG8gdGhlCisgKiAgIERSTSBlbmdpbmUgcGx1Z2luLgorICogcmVzcG9uc2VTaXplIGlzIHRoZSBsZW5ndGggb2YgdGhlIHByb3Zpc2lvbmluZyByZXNwb25zZSBpbiBieXRlcy4KKyAqCisgKiByZXR1cm5zIE1FRElBRFJNX0RFVklDRV9SRVZPS0VEX0VSUk9SIGlmIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAqIHNlcnZlciByZWplY3RlZCB0aGUgcmVxdWVzdAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCB1aW50OF90ICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlU2l6ZSk7CisKKworLyoqCisgKiBBIG1lYW5zIG9mIGVuZm9yY2luZyBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHN0cmVhbXMgcGVyIHN1YnNjcmliZXIKKyAqIGFjcm9zcyBkZXZpY2VzIGlzIHByb3ZpZGVkIHZpYSBTZWN1cmVTdG9wLiBUaGlzIGlzIGFjaGlldmVkIGJ5IHNlY3VyZWx5CisgKiBtb25pdG9yaW5nIHRoZSBsaWZldGltZSBvZiBzZXNzaW9ucy4KKyAqCisgKiBJbmZvcm1hdGlvbiBmcm9tIHRoZSBzZXJ2ZXIgcmVsYXRlZCB0byB0aGUgY3VycmVudCBwbGF5YmFjayBzZXNzaW9uIGlzIHdyaXR0ZW4KKyAqIHRvIHBlcnNpc3RlbnQgc3RvcmFnZSBvbiB0aGUgZGV2aWNlIHdoZW4gZWFjaCBNZWRpYUNyeXB0byBvYmplY3QgaXMgY3JlYXRlZC4KKyAqCisgKiBJbiB0aGUgbm9ybWFsIGNhc2UsIHBsYXliYWNrIHdpbGwgYmUgY29tcGxldGVkLCB0aGUgc2Vzc2lvbiBkZXN0cm95ZWQgYW5kIHRoZQorICogU2VjdXJlIFN0b3BzIHdpbGwgYmUgcXVlcmllZC4gVGhlIGFwcCBxdWVyaWVzIHNlY3VyZSBzdG9wcyBhbmQgZm9yd2FyZHMgdGhlCisgKiBzZWN1cmUgc3RvcCBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIgd2hpY2ggdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBhbmQgbm90aWZpZXMgdGhlCisgKiBzZXJ2ZXIgc2lkZSBkYXRhYmFzZSB0aGF0IHRoZSBzZXNzaW9uIGRlc3RydWN0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gVGhlIHBlcnNpc3RlZAorICogcmVjb3JkIG9uIHRoZSBjbGllbnQgaXMgb25seSByZW1vdmVkIGFmdGVyIHBvc2l0aXZlIGNvbmZpcm1hdGlvbiB0aGF0IHRoZSBzZXJ2ZXIKKyAqIHJlY2VpdmVkIHRoZSBtZXNzYWdlIHVzaW5nIHJlbGVhc2VTZWN1cmVTdG9wcygpLgorICoKKyAqIG51bVNlY3VyZVN0b3BzIGlzIHNldCBieSB0aGUgY2FsbGVyIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWN1cmUgc3RvcHMgdG8KKyAqIHJldHVybi4gIE9uIGV4aXQsICpudW1TZWN1cmVTdG9wcyB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIGFjdHVhbGx5IHJldHVybmVkLgorICogSWYgKm51bVNlY3VyZVN0b3BzIGlzIHRvbyBzbWFsbCBmb3IgdGhlIG51bWJlciBvZiBzZWN1cmUgc3RvcHMgYXZhaWxhYmxlLAorICogTUVESUFEUk1fU0hPUlRfQlVGRkVSIHdpbGwgYmUgcmV0dXJuZWQgYW5kICpudW1TZWN1cmVTdG9wcyB3aWxsIGJlIHNldCB0byB0aGUKKyAqIG51bWJlciByZXF1aXJlZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAorICAgICAgICBBTWVkaWFEcm1TZWN1cmVTdG9wICpzZWN1cmVTdG9wcywgc2l6ZV90ICpudW1TZWN1cmVTdG9wcyk7CisKKy8qKgorICogUHJvY2VzcyB0aGUgU2VjdXJlU3RvcCBzZXJ2ZXIgcmVzcG9uc2UgbWVzc2FnZSBzc1JlbGVhc2UuICBBZnRlciBhdXRoZW50aWNhdGluZworICogdGhlIG1lc3NhZ2UsIHJlbW92ZSB0aGUgU2VjdXJlU3RvcHMgaWRlbnRpZmllZCBpbiB0aGUgcmVzcG9uc2UuCisgKgorICogc3NSZWxlYXNlIGlzIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaW5kaWNhdGluZyB3aGljaCBzZWN1cmUgc3RvcHMgdG8gcmVsZWFzZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVsZWFzZVNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TZWN1cmVTdG9wICpzc1JlbGVhc2UpOworCisvKioKKyAqIFN0cmluZyBwcm9wZXJ0eSBuYW1lOiBpZGVudGlmaWVzIHRoZSBtYWtlciBvZiB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfVkVORE9SID0gInZlbmRvciI7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGlkZW50aWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIERSTSBlbmdpbmUgcGx1Z2luCisgKi8KK2NvbnN0IGNoYXIgKlBST1BFUlRZX1ZFUlNJT04gPSAidmVyc2lvbiI7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGRlc2NyaWJlcyB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworCisvKioKKyAqIFN0cmluZyBwcm9wZXJ0eSBuYW1lOiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNpcGhlciBhbmQgbWFjIGFsZ29yaXRobXMKKyAqIHN1cHBvcnRlZCBieSBDcnlwdG9TZXNzaW9uLiAgVGhlIGxpc3QgbWF5IGJlIGVtcHR5IGlmIHRoZSBEUk0gZW5naW5lCisgKiBwbHVnaW4gZG9lcyBub3Qgc3VwcG9ydCBDcnlwdG9TZXNzaW9uIG9wZXJhdGlvbnMuCisgKi8KK2NvbnN0IGNoYXIgKlBST1BFUlRZX0FMR09SSVRITVMgPSAiYWxnb3JpdGhtcyI7CisKKy8qKgorICogUmVhZCBhIERSTSBlbmdpbmUgcGx1Z2luIFN0cmluZyBwcm9wZXJ0eSB2YWx1ZSwgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUgc3RyaW5nLgorICoKKyAqIHByb3BlcnR5TmFtZSBpZGVudGlmaWVzIHRoZSBwcm9wZXJ0eSB0byBxdWVyeQorICogT24gcmV0dXJuLCBwcm9wZXJ0eVZhbHVlIHdpbGwgYmUgc2V0IHRvIHBvaW50IHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gIFRoZQorICogbWVtb3J5IHRoYXQgdGhlIHZhbHVlIHJlc2lkZXMgaW4gaXMgb3duZWQgYnkgdGhlIE5ESyBNZWRpYURybSBBUEkgYW5kCisgKiB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRQcm9wZXJ0eVN0cmluZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eVZhbHVlKTsKKworLyoqCisgKiBCeXRlIGFycmF5IHByb3BlcnR5IG5hbWU6IHRoZSBkZXZpY2UgdW5pcXVlIGlkZW50aWZpZXIgaXMgZXN0YWJsaXNoZWQgZHVyaW5nCisgKiBkZXZpY2UgcHJvdmlzaW9uaW5nIGFuZCBwcm92aWRlcyBhIG1lYW5zIG9mIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGVhY2ggZGV2aWNlLgorICovCitjb25zdCBjaGFyICpQUk9QRVJUWV9ERVZJQ0VfVU5JUVVFX0lEID0gImRldmljZVVuaXF1ZUlkIjsKKworLyoqCisgKiBSZWFkIGEgRFJNIGVuZ2luZSBwbHVnaW4gYnl0ZSBhcnJheSBwcm9wZXJ0eSB2YWx1ZSwgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUgc3RyaW5nLgorICogT24gcmV0dXJuLCAqcHJvcGVydHlWYWx1ZSB3aWxsIGJlIHNldCB0byBwb2ludCB0byB0aGUgcHJvcGVydHkgdmFsdWUuICBUaGUKKyAqIG1lbW9yeSB0aGF0IHRoZSB2YWx1ZSByZXNpZGVzIGluIGlzIG93bmVkIGJ5IHRoZSBOREsgTWVkaWFEcm0gQVBJIGFuZAorICogd2lsbCByZW1haW4gdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBBTWVkaWFEcm1fZ2V0UHJvcGVydHlCeXRlQXJyYXkuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAorICAgICAgICBBTWVkaWFEcm1CeXRlQXJyYXkgKnByb3BlcnR5VmFsdWUpOworCisvKioKKyAqIFNldCBhIERSTSBlbmdpbmUgcGx1Z2luIFN0cmluZyBwcm9wZXJ0eSB2YWx1ZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworLyoqCisgKiBTZXQgYSBEUk0gZW5naW5lIHBsdWdpbiBieXRlIGFycmF5IHByb3BlcnR5IHZhbHVlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0UHJvcGVydHlCeXRlQXJyYXkoQU1lZGlhRHJtICosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqdmFsdWUsIHNpemVfdCB2YWx1ZVNpemUpOworCisvKioKKyAqIEluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgZGVjcnlwdGlvbiBvZiBEQVNIIENvbW1vbiBFbmNyeXB0ZWQgTWVkaWEsIHRoZQorICogTWVkaWFEcm0gQVBJcyBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIHNlY3VyZWx5IGRlbGl2ZXIgc2Vzc2lvbiBrZXlzIGZyb20KKyAqIGFuIG9wZXJhdG9yJ3Mgc2Vzc2lvbiBrZXkgc2VydmVyIHRvIGEgY2xpZW50IGRldmljZSwgYmFzZWQgb24gdGhlIGZhY3RvcnktaW5zdGFsbGVkCisgKiByb290IG9mIHRydXN0LCBhbmQgdGhlbiBwZXJmb3JtIGVuY3J5cHQsIGRlY3J5cHQsIHNpZ24gYW5kIHZlcmlmeSBvcGVyYXRpb25zCisgKiB3aXRoIHRoZSBzZXNzaW9uIGtleSBvbiBhcmJpdHJhcnkgdXNlciBkYXRhLgorICoKKyAqIE9wZXJhdG9ycyBjcmVhdGUgc2Vzc2lvbiBrZXkgc2VydmVycyB0aGF0IHJlY2VpdmUgc2Vzc2lvbiBrZXkgcmVxdWVzdHMgYW5kIHByb3ZpZGUKKyAqIGVuY3J5cHRlZCBzZXNzaW9uIGtleXMgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGdlbmVyYWwgcHVycG9zZSBjcnlwdG8gb3BlcmF0aW9ucy4KKyAqCisgKiBHZW5lcmljIGVuY3J5cHQvZGVjcnlwdC9zaWduL3ZlcmlmeSBtZXRob2RzIGFyZSBiYXNlZCBvbiB0aGUgZXN0YWJsaXNoZWQgc2Vzc2lvbgorICoga2V5cy4gIFRoZXNlIGtleXMgYXJlIGV4Y2hhbmdlZCB1c2luZyB0aGUgZ2V0S2V5UmVxdWVzdC9wcm92aWRlS2V5UmVzcG9uc2UgbWV0aG9kcy4KKyAqCisgKiBBcHBsaWNhdGlvbnMgb2YgdGhpcyBjYXBhYmlsaXR5IGluY2x1ZGUgc2VjdXJpbmcgdmFyaW91cyB0eXBlcyBvZiBwdXJjaGFzZWQgb3IKKyAqIHByaXZhdGUgY29udGVudCwgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGJvb2tzIGFuZCBvdGhlciBtZWRpYSwgcGhvdG9zIG9yIG1lZGlhCisgKiBkZWxpdmVyeSBwcm90b2NvbHMuCisgKi8KKworLyoKKyAqIEVuY3J5cHQgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSBpbnB1dCBvZiBsZW5ndGggZGF0YVNpemUgdXNpbmcgYWxnb3JpdGhtIHNwZWNpZmllZAorICogYnkgY2lwaGVyQWxnb3JpdGhtLCBhbmQgd3JpdGUgdGhlIGVuY3J5cHRlZCByZXN1bHQgaW50byBvdXRwdXQuICBUaGUgY2FsbGVyIG11c3QKKyAqIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBhY2NlcHQgZGF0YVNpemUgYnl0ZXMuIFRoZSBrZXkKKyAqIHRvIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50bworICogdGhlIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZW5jcnlwdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUpOworCisvKgorICogRGVjcnlwdCB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IGlucHV0IG9mIGxlbmd0aCBkYXRhU2l6ZSB1c2luZyBhbGdvcml0aG0gc3BlY2lmaWVkCisgKiBieSBjaXBoZXJBbGdvcml0aG0sIGFuZCB3cml0ZSB0aGUgZGVjcnlwdGVkIHJlc3VsdCBpbnRvIG91dHB1dC4gIFRoZSBjYWxsZXIgbXVzdAorICogZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGFjY2VwdCBkYXRhU2l6ZSBieXRlcy4gIFRoZSBrZXkKKyAqIHRvIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50bworICogdGhlIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZGVjcnlwdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUpOworCisvKgorICogR2VuZXJhdGUgYSBzaWduYXR1cmUgdXNpbmcgdGhlIHNwZWNpZmllZCBtYWNBbGdvcml0aG0gb3ZlciB0aGUgbWVzc2FnZSBkYXRhCisgKiByZWZlcmVuY2VkIGJ5IG1lc3NhZ2Ugb2Ygc2l6ZSBtZXNzYWdlU2l6ZSBhbmQgc3RvcmUgdGhlIHNpZ25hdHVyZSBpbiB0aGUKKyAqIGJ1ZmZlciByZWZlcmVuY2VkIHNpZ25hdHVyZSBvZiBtYXggc2l6ZSAqc2lnbmF0dXJlU2l6ZS4gIElmIHRoZSBidWZmZXIgaXMgbm90CisgKiBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc2lnbmF0dXJlLCBNRURJQURSTV9TSE9SVF9CVUZGRVIgaXMgcmV0dXJuZWQgYW5kCisgKiAqc2lnbmF0dXJlU2l6ZSBpcyBzZXQgdG8gdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLiAgVGhlIGtleSB0byB1c2UgaXMgaWRlbnRpZmllZAorICogYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZSBzZXNzaW9uIHVzaW5nCisgKiBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zaWduKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAorICAgICAgICB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCAqc2lnbmF0dXJlU2l6ZSk7CisKKy8qCisgKiBQZXJmb3JtIGEgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIG1hY0FsZ29yaXRobSBvdmVyIHRoZSBtZXNzYWdlCisgKiBkYXRhIHJlZmVyZW5jZWQgYnkgdGhlIG1lc3NhZ2UgcGFyYW1ldGVyIG9mIHNpemUgbWVzc2FnZVNpemUuIFJldHVybnMgTUVESUFEUk1fT0sKKyAqIGlmIHRoZSBzaWduYXR1cmUgbWF0Y2hlcywgb3RoZXJ3aXNlIE1FREFJRFJNX1ZFUklGWV9GQUlMRUQgaXMgcmV0dXJuZWQuIFRoZSBrZXkgdG8KKyAqIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGUKKyAqIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fdmVyaWZ5KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgY29uc3QgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAorICAgICAgICBjb25zdCB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCBzaWduYXR1cmVTaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy9fTkRLX01FRElBX0RSTV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MTNlYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9FUlJPUl9ICisjZGVmaW5lIF9OREtfTUVESUFfRVJST1JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBX09LID0gMCwKKworICAgIEFNRURJQV9FUlJPUl9CQVNFICAgICAgICAgICAgICAgICAgPSAtMTAwMDAsCisgICAgQU1FRElBX0VSUk9SX1VOS05PV04gICAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFLAorICAgIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDEsCisgICAgQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gMiwKKyAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1QgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAzLAorICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDQsCisKKyAgICBBTUVESUFfRFJNX0VSUk9SX0JBU0UgICAgICAgICAgICAgID0gLTIwMDAwLAorICAgIEFNRURJQV9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAxLAorICAgIEFNRURJQV9EUk1fUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAyLAorICAgIEFNRURJQV9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAzLAorICAgIEFNRURJQV9EUk1fU0hPUlRfQlVGRkVSICAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA0LAorICAgIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA1LAorICAgIEFNRURJQV9EUk1fVEFNUEVSX0RFVEVDVEVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA2LAorICAgIEFNRURJQV9EUk1fVkVSSUZZX0ZBSUxFRCAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA3LAorICAgIEFNRURJQV9EUk1fTkVFRF9LRVkgICAgICAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA4LAorICAgIEFNRURJQV9EUk1fTElDRU5TRV9FWFBJUkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA5LAorCit9IG1lZGlhX3N0YXR1c190OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRVJST1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0ZTcwMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICisjZGVmaW5lIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiTmRrTWVkaWFDb2RlYy5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIEFNZWRpYUV4dHJhY3RvcjsKKworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgZXh0cmFjdG9yCisgKi8KK0FNZWRpYUV4dHJhY3RvciogQU1lZGlhRXh0cmFjdG9yX25ldygpOworCisvKioKKyAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBleHRyYWN0b3IKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShBTWVkaWFFeHRyYWN0b3IqKTsKKworLyoqCisgKiAgU2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IqLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisKKy8qKgorICogU2V0IHRoZSBVUkkgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwgY29uc3QgY2hhciAqbG9jYXRpb24pOyAvLyBUT0RPIHN1cHBvcnQgaGVhZGVycworCisvKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRyYWNrcyBpbiB0aGUgcHJldmlvdXNseSBzcGVjaWZpZWQgbWVkaWEgZmlsZQorICovCitzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoQU1lZGlhRXh0cmFjdG9yKik7CisKKy8qKgorICogUmV0dXJuIHRoZSBmb3JtYXQgb2YgdGhlIHNwZWNpZmllZCB0cmFjay4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIGZvcm1hdAorICovCitBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KTsKKworLyoqCisgKiBTZWxlY3QgdGhlIHNwZWNpZmllZCB0cmFjay4gU3Vic2VxdWVudCBjYWxscyB0byByZWFkU2FtcGxlRGF0YSwgZ2V0U2FtcGxlVHJhY2tJbmRleCBhbmQKKyAqIGdldFNhbXBsZVRpbWUgb25seSByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHN1YnNldCBvZiB0cmFja3Mgc2VsZWN0ZWQuCisgKiBTZWxlY3RpbmcgdGhlIHNhbWUgdHJhY2sgbXVsdGlwbGUgdGltZXMgaGFzIG5vIGVmZmVjdCwgdGhlIHRyYWNrIGlzCisgKiBvbmx5IHNlbGVjdGVkIG9uY2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KTsKKworLyoqCisgKiBVbnNlbGVjdCB0aGUgc3BlY2lmaWVkIHRyYWNrLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlYWRTYW1wbGVEYXRhLCBnZXRTYW1wbGVUcmFja0luZGV4IGFuZAorICogZ2V0U2FtcGxlVGltZSBvbmx5IHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciB0aGUgc3Vic2V0IG9mIHRyYWNrcyBzZWxlY3RlZC4uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworCisvKioKKyAqIFJlYWQgdGhlIGN1cnJlbnQgc2FtcGxlLgorICovCitzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShBTWVkaWFFeHRyYWN0b3IqLCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBjYXBhY2l0eSk7CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCBzYW1wbGUncyBmbGFncy4KKyAqLwordWludDMyX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKEFNZWRpYUV4dHJhY3RvciopOyAvLyBzZWUgZGVmaW5pdGlvbnMgYmVsb3cKKworLyoqCisgKiBSZXR1cm5zIHRoZSB0cmFjayBpbmRleCB0aGUgY3VycmVudCBzYW1wbGUgb3JpZ2luYXRlcyBmcm9tIChvciAtMQorICogaWYgbm8gbW9yZSBzYW1wbGVzIGFyZSBhdmFpbGFibGUpCisgKi8KK2ludCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChBTWVkaWFFeHRyYWN0b3IqKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNhbXBsZSdzIHByZXNlbnRhdGlvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KKyAqIG9yIC0xIGlmIG5vIG1vcmUgc2FtcGxlcyBhcmUgYXZhaWxhYmxlLgorICovCitpbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqIEFkdmFuY2UgdG8gdGhlIG5leHQgc2FtcGxlLiBSZXR1cm5zIGZhbHNlIGlmIG5vIG1vcmUgc2FtcGxlIGRhdGEKKyAqIGlzIGF2YWlsYWJsZSAoZW5kIG9mIHN0cmVhbSkuCisgKi8KK2Jvb2wgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoQU1lZGlhRXh0cmFjdG9yKik7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQywKKyAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19ORVhUX1NZTkMsCisgICAgQU1FRElBRVhUUkFDVE9SX1NFRUtfQ0xPU0VTVF9TWU5DCit9IFNlZWtNb2RlOworCisvKioKKyAqCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8oQU1lZGlhRXh0cmFjdG9yKiwgaW50NjRfdCBzZWVrUG9zVXMsIFNlZWtNb2RlIG1vZGUpOworCisvKioKKyAqIG1hcHBpbmcgb2YgY3J5cHRvIHNjaGVtZSB1dWlkIHRvIHRoZSBzY2hlbWUgc3BlY2lmaWMgZGF0YSBmb3IgdGhhdCBzY2hlbWUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUHNzaEVudHJ5IHsKKyAgICBBTWVkaWFVVUlEIHV1aWQ7CisgICAgc2l6ZV90IGRhdGFsZW47CisgICAgdm9pZCAqZGF0YTsKK30gUHNzaEVudHJ5OworCisvKioKKyAqIGxpc3Qgb2YgY3J5cHRvIHNjaGVtZXMgYW5kIHRoZWlyIGRhdGEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUHNzaEluZm8geworICAgIHNpemVfdCBudW1lbnRyaWVzOworICAgIFBzc2hFbnRyeSBlbnRyaWVzWzBdOworfSBQc3NoSW5mbzsKKworLyoqCisgKiBHZXQgdGhlIFBTU0ggaW5mbyBpZiBwcmVzZW50LgorICovCitQc3NoSW5mbyogQU1lZGlhRXh0cmFjdG9yX2dldFBzc2hJbmZvKEFNZWRpYUV4dHJhY3RvciopOworCisKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8oQU1lZGlhRXh0cmFjdG9yICopOworCisKK2VudW0geworICAgIEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19TWU5DID0gMSwKKyAgICBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfRU5DUllQVEVEID0gMiwKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRm9ybWF0LmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUZvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjk3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYUZvcm1hdC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYUZvcm1hdDsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUZvcm1hdCBBTWVkaWFGb3JtYXQ7CisKK0FNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQqKTsKKworLyoqCisgKiBIdW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9ybWF0LiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG93bmVkIGJ5IHRoZSBmb3JtYXQsCisgKiBhbmQgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHRvU3RyaW5nLCBvciB1bnRpbCB0aGUgZm9ybWF0IGlzIGRlbGV0ZWQuCisgKi8KK2NvbnN0IGNoYXIqIEFNZWRpYUZvcm1hdF90b1N0cmluZyhBTWVkaWFGb3JtYXQqKTsKKworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCk7Citib29sIEFNZWRpYUZvcm1hdF9nZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KTsKKy8qKgorICogVGhlIHJldHVybmVkIGRhdGEgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCBhbmQgcmVtYWlucyB2YWxpZCBhcyBsb25nIGFzIHRoZSBuYW1lZCBlbnRyeQorICogaXMgcGFydCBvZiB0aGUgZm9ybWF0LgorICovCitib29sIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqc2l6ZSk7CisvKioKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCwgYW5kIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBnZXRTdHJpbmcsCisgKiBvciB1bnRpbCB0aGUgZm9ybWF0IGlzIGRlbGV0ZWQuCisgKi8KK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KTsKKworCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGludDY0X3QgdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZmxvYXQgdmFsdWUpOworLyoqCisgKiBUaGUgcHJvdmlkZWQgc3RyaW5nIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCisgKi8KK3ZvaWQgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7CisvKioKKyAqIFRoZSBwcm92aWRlZCBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCisgKi8KK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKworCisvKioKKyAqIFhYWCBzaG91bGQgdGhlc2UgYmUgaW50cy9lbnVtcyB0aGF0IHdlIGxvb2sgdXAgaW4gYSB0YWJsZSBhcyBuZWVkZWQ/CisgKi8KK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFM7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUw7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEg7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhTXV4ZXIuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhTXV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ5NDZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFNdXhlci5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9NVVhFUl9ICisjZGVmaW5lIF9OREtfTUVESUFfTVVYRVJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYU11eGVyOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhTXV4ZXIgQU1lZGlhTXV4ZXI7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzQgPSAwLAorICAgIEFNRURJQU1VWEVSX09VVFBVVF9GT1JNQVRfV0VCTSAgID0gMSwKK30gT3V0cHV0Rm9ybWF0OworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIKKyAqLworQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX25ldyhpbnQgZmQsIE91dHB1dEZvcm1hdCBmb3JtYXQpOworCisvKioKKyAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBtdXhlcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9kZWxldGUoQU1lZGlhTXV4ZXIqKTsKKworLyoqCisgKiBTZXQgYW5kIHN0b3JlIHRoZSBnZW9kYXRhIChsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlKSBpbiB0aGUgb3V0cHV0IGZpbGUuCisgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBBTWVkaWFNdXhlcl9zdGFydC4gVGhlIGdlb2RhdGEgaXMgc3RvcmVkCisgKiBpbiB1ZHRhIGJveCBpZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNCwgYW5kIGlzCisgKiBpZ25vcmVkIGZvciBvdGhlciBvdXRwdXQgZm9ybWF0cy4KKyAqIFRoZSBnZW9kYXRhIGlzIHN0b3JlZCBhY2NvcmRpbmcgdG8gSVNPLTY3MDkgc3RhbmRhcmQuCisgKgorICogQm90aCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBpbiBkZWdyZWVzLgorICogTGF0aXR1ZGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy05MCwgOTBdLgorICogTG9uZ2l0dWRlIG11c3QgYmUgaW4gdGhlIHJhbmdlIFstMTgwLCAxODBdLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRMb2NhdGlvbihBTWVkaWFNdXhlciosIGZsb2F0IGxhdGl0dWRlLCBmbG9hdCBsb25naXR1ZGUpOworCisvKioKKyAqIFNldHMgdGhlIG9yaWVudGF0aW9uIGhpbnQgZm9yIG91dHB1dCB2aWRlbyBwbGF5YmFjay4KKyAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIEFNZWRpYU11eGVyX3N0YXJ0LiBDYWxsaW5nIHRoaXMKKyAqIG1ldGhvZCB3aWxsIG5vdCByb3RhdGUgdGhlIHZpZGVvIGZyYW1lIHdoZW4gbXV4ZXIgaXMgZ2VuZXJhdGluZyB0aGUgZmlsZSwKKyAqIGJ1dCBhZGQgYSBjb21wb3NpdGlvbiBtYXRyaXggY29udGFpbmluZyB0aGUgcm90YXRpb24gYW5nbGUgaW4gdGhlIG91dHB1dAorICogdmlkZW8gaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIHNvIHRoYXQgYQorICogdmlkZW8gcGxheWVyIGNhbiBjaG9vc2UgdGhlIHByb3BlciBvcmllbnRhdGlvbiBmb3IgcGxheWJhY2suCisgKiBOb3RlIHRoYXQgc29tZSB2aWRlbyBwbGF5ZXJzIG1heSBjaG9vc2UgdG8gaWdub3JlIHRoZSBjb21wb3NpdGlvbiBtYXRyaXgKKyAqIGR1cmluZyBwbGF5YmFjay4KKyAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcywgY2xvY2t3aXNlLgorICogVGhlIHN1cHBvcnRlZCBhbmdsZXMgYXJlIDAsIDkwLCAxODAsIGFuZCAyNzAgZGVncmVlcy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc2V0T3JpZW50YXRpb25IaW50KEFNZWRpYU11eGVyKiwgaW50IGRlZ3JlZXMpOworCisvKioKKyAqIEFkZHMgYSB0cmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgorICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5ldyB0cmFjayBvciBhIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZmFpbHVyZSwKKyAqIHdoaWNoIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIG1lZGlhX3N0YXR1c190LgorICovCitzc2l6ZV90IEFNZWRpYU11eGVyX2FkZFRyYWNrKEFNZWRpYU11eGVyKiwgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQpOworCisvKioKKyAqIFN0YXJ0IHRoZSBtdXhlci4gU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBBTWVkaWFNdXhlcl9hZGRUcmFjayBhbmQKKyAqIGJlZm9yZSBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0YXJ0KEFNZWRpYU11eGVyKik7CisKKy8qKgorICogU3RvcHMgdGhlIG11eGVyLgorICogT25jZSB0aGUgbXV4ZXIgc3RvcHMsIGl0IGNhbiBub3QgYmUgcmVzdGFydGVkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdG9wKEFNZWRpYU11eGVyKik7CisKKy8qKgorICogV3JpdGVzIGFuIGVuY29kZWQgc2FtcGxlIGludG8gdGhlIG11eGVyLgorICogVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzYW1wbGVzIGFyZSB3cml0dGVuIGludG8KKyAqIHRoZSByaWdodCB0cmFja3MuIEFsc28sIGl0IG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGUgc2FtcGxlcyBmb3IgZWFjaCB0cmFjaworICogYXJlIHdyaXR0ZW4gaW4gY2hyb25vbG9naWNhbCBvcmRlciAoZS5nLiBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcHJvdmlkZWQKKyAqIGJ5IHRoZSBlbmNvZGVyLikKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfd3JpdGVTYW1wbGVEYXRhKEFNZWRpYU11eGVyICptdXhlciwKKyAgICAgICAgc2l6ZV90IHRyYWNrSWR4LCBjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX01VWEVSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDdmZDkzNzkuLmZhMWIyMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTQ4LDcgKzQ5LDcgQEAKICNkZWZpbmUgQ0JMS19TVFJFQU1fRU5EX0RPTkUgMHg0MDAgLy8gc2V0IGJ5IHNlcnZlciBvbiByZW5kZXIgY29tcGxldGlvbiwgY2xlYXJlZCBieSBjbGllbnQKIAogLy9FTF9GSVhNRSAyMCBzZWNvbmRzIG1heSBub3QgYmUgZW5vdWdoIGFuZCBtdXN0IGJlIHJlY29uY2lsZWQgd2l0aCBuZXcgb2J0YWluQnVmZmVyIGltcGxlbWVudGF0aW9uCi0jZGVmaW5lIE1BWF9SVU5fT0ZGTE9BREVEX1RJTUVPVVRfTVMgMjAwMDAgLy9hc3N1bWluZyB1cHRvIGEgbWF4aW11bSBvZiAyMCBzZWNvbmRzIG9mIG9mZmxvYWRlZAorI2RlZmluZSBNQVhfUlVOX09GRkxPQURFRF9USU1FT1VUX01TIDIwMDAwIC8vIGFzc3VtaW5nIHVwIHRvIGEgbWF4aW11bSBvZiAyMCBzZWNvbmRzIG9mIG9mZmxvYWRlZAogCiBzdHJ1Y3QgQXVkaW9UcmFja1NoYXJlZFN0cmVhbWluZyB7CiAgICAgLy8gc2ltaWxhciB0byBOQkFJTyBNb25vUGlwZQpAQCAtNjUsNyArNjYsOSBAQAogc3RydWN0IEF1ZGlvVHJhY2tTaGFyZWRTdGF0aWMgewogICAgIFN0YXRpY0F1ZGlvVHJhY2tTaW5nbGVTdGF0ZVF1ZXVlOjpTaGFyZWQKICAgICAgICAgICAgICAgICAgICAgbVNpbmdsZVN0YXRlUXVldWU7Ci0gICAgc2l6ZV90ICAgICAgICAgIG1CdWZmZXJQb3NpdGlvbjsgICAgLy8gdXBkYXRlZCBhc3luY2hyb25vdXNseSBieSBzZXJ2ZXIsCisgICAgLy8gVGhpcyBmaWVsZCBzaG91bGQgYmUgYSBzaXplX3QsIGJ1dCBzaW5jZSBpdCBpcyBsb2NhdGVkIGluIHNoYXJlZCBtZW1vcnkgd2UKKyAgICAvLyBmb3JjZSB0byAzMi1iaXQuICBUaGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGhhdmUgZGlmZmVyZW50IHR5cGVkZWZzIGZvciBzaXplX3QuCisgICAgdWludDMyX3QgICAgICAgIG1CdWZmZXJQb3NpdGlvbjsgICAgLy8gdXBkYXRlZCBhc3luY2hyb25vdXNseSBieSBzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvciBlbnRlcnRhaW5tZW50IHB1cnBvc2VzIG9ubHkiCiB9OwogCkBAIC05NiwxMSArOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBzaG91bGQgYmUgdXNlZCAiZm9yIGVudGVydGFpbm1lbnQgcHVycG9zZXMgb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgZG9uJ3QgbWFrZSBpbXBvcnRhbnQgZGVjaXNpb25zIGJhc2VkIG9uIGl0LgogCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudF87ICAgIC8vIHVzZWQgZHVyaW5nIGNyZWF0aW9uIHRvIHBhc3MgYWN0dWFsIHRyYWNrIGJ1ZmZlciBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gQXVkaW9GbGluZ2VyIHRvIGNsaWVudCwgYW5kIG5vdCByZWZlcmVuY2VkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbW92ZSBoZXJlIGFuZCByZXBsYWNlIGJ5IGNyZWF0ZVRyYWNrKCkgaW4vb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWVkIHRvICJfIiB0byBkZXRlY3QgaW5jb3JyZWN0IHVzZQorICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1QYWQxOyAgICAgIC8vIHVudXNlZAogCiAgICAgdm9sYXRpbGUgICAgaW50MzJfdCAgICAgbUZ1dGV4OyAgICAgLy8gZXZlbnQgZmxhZzogZG93biAoUCkgYnkgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIChWKSBieSBzZXJ2ZXIgb3IgYmluZGVyRGllZCgpIG9yIGludGVycnVwdCgpCkBAIC0xMDgsMTMgKzEwNywxMiBAQAogCiBwcml2YXRlOgogCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgbU1pbmltdW07ICAgICAgIC8vIHNlcnZlciB3YWtlcyB1cCBjbGllbnQgaWYgYXZhaWxhYmxlID49IG1NaW5pbXVtCisgICAgICAgICAgICAgICAgLy8gVGhpcyBmaWVsZCBzaG91bGQgYmUgYSBzaXplX3QsIGJ1dCBzaW5jZSBpdCBpcyBsb2NhdGVkIGluIHNoYXJlZCBtZW1vcnkgd2UKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSB0byAzMi1iaXQuICBUaGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGhhdmUgZGlmZmVyZW50IHR5cGVkZWZzIGZvciBzaXplX3QuCisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbU1pbmltdW07ICAgICAgIC8vIHNlcnZlciB3YWtlcyB1cCBjbGllbnQgaWYgYXZhaWxhYmxlID49IG1NaW5pbXVtCiAKLSAgICAgICAgICAgICAgICAvLyBDaGFubmVsIHZvbHVtZXMgYXJlIGZpeGVkIHBvaW50IFU0LjEyLCBzbyAweDEwMDAgbWVhbnMgMS4wLgotICAgICAgICAgICAgICAgIC8vIExlZnQgY2hhbm5lbCBpcyBpbiBbMDoxNV0sIHJpZ2h0IGNoYW5uZWwgaXMgaW4gWzE2OjMxXS4KLSAgICAgICAgICAgICAgICAvLyBBbHdheXMgcmVhZCBhbmQgd3JpdGUgdGhlIGNvbWJpbmVkIHBhaXIgYXRvbWljYWxseS4KLSAgICAgICAgICAgICAgICAvLyBGb3IgQXVkaW9UcmFjayBvbmx5LCBub3QgdXNlZCBieSBBdWRpb1JlY29yZC4KLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBtVm9sdW1lTFI7CisgICAgICAgICAgICAgICAgLy8gU3RlcmVvIGdhaW5zIGZvciBBdWRpb1RyYWNrIG9ubHksIG5vdCB1c2VkIGJ5IEF1ZGlvUmVjb3JkLgorICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IG1Wb2x1bWVMUjsKIAogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1TYW1wbGVSYXRlOyAgICAvLyBBdWRpb1RyYWNrIG9ubHk6IGNsaWVudCdzIHJlcXVlc3RlZCBzYW1wbGUgcmF0ZSBpbiBIegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciAwID09IGRlZmF1bHQuIFdyaXRlLW9ubHkgY2xpZW50LCByZWFkLW9ubHkgc2VydmVyLgpAQCAtMTc3LDEyICsxNzUsMTEgQEAKIAogLy8gUHJveHkgc2VlbiBieSBBdWRpb1RyYWNrIGNsaWVudCBhbmQgQXVkaW9SZWNvcmQgY2xpZW50CiBjbGFzcyBDbGllbnRQcm94eSA6IHB1YmxpYyBQcm94eSB7Ci1wcm90ZWN0ZWQ6CitwdWJsaWM6CiAgICAgQ2xpZW50UHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwgc2l6ZV90IGZyYW1lU2l6ZSwKICAgICAgICAgICAgIGJvb2wgaXNPdXQsIGJvb2wgY2xpZW50SW5TZXJ2ZXIpOwogICAgIHZpcnR1YWwgfkNsaWVudFByb3h5KCkgeyB9CiAKLXB1YmxpYzoKICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHRpbWVzcGVjIGtGb3JldmVyOwogICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXNwZWMga05vbkJsb2NraW5nOwogCkBAIC0yNDUsNyArMjQyLDExIEBACiAgICAgfQogCiAgICAgdm9pZCAgICAgICAgc2V0TWluaW11bShzaXplX3QgbWluaW11bSkgewotICAgICAgICBtQ2Jsay0+bU1pbmltdW0gPSBtaW5pbXVtOworICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBvbiBhIDY0LWJpdCBjbGllbnQKKyAgICAgICAgaWYgKG1pbmltdW0gPiBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBtaW5pbXVtID0gVUlOVDMyX01BWDsKKyAgICAgICAgfQorICAgICAgICBtQ2Jsay0+bU1pbmltdW0gPSAodWludDMyX3QpIG1pbmltdW07CiAgICAgfQogCiAgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgd291bGQgbmVlZCB0byBiZSBvYnRhaW5lZCBhbmQgcmVsZWFzZWQKQEAgLTI4MSw4ICsyODIsOCBAQAogICAgICAgICBtQ2Jsay0+bVNlbmRMZXZlbCA9IHVpbnQxNl90KHNlbmRMZXZlbCAqIDB4MTAwMCk7CiAgICAgfQogCi0gICAgLy8gY2FsbGVyIG11c3QgbGltaXQgdG8gMCA8PSB2b2x1bWVMUiA8PSAweDEwMDAxMDAwCi0gICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lTFIodWludDMyX3Qgdm9sdW1lTFIpIHsKKyAgICAvLyBzZXQgc3RlcmVvIGdhaW5zCisgICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lTFIoZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3Qgdm9sdW1lTFIpIHsKICAgICAgICAgbUNibGstPm1Wb2x1bWVMUiA9IHZvbHVtZUxSOwogICAgIH0KIApAQCAtMzkyLDggKzM5MywxMCBAQAogY2xhc3MgQXVkaW9UcmFja1NlcnZlclByb3h5IDogcHVibGljIFNlcnZlclByb3h5IHsKIHB1YmxpYzoKICAgICBBdWRpb1RyYWNrU2VydmVyUHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIgPSBmYWxzZSkKLSAgICAgICAgOiBTZXJ2ZXJQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBmcmFtZVNpemUsIHRydWUgLyppc091dCovLCBjbGllbnRJblNlcnZlcikgeyB9CisgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplLCBib29sIGNsaWVudEluU2VydmVyID0gZmFsc2UsIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwKQorICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgdHJ1ZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7CisgICAgICAgIG1DYmxrLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgfQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSgpIHsgfQogCkBAIC00MDEsNyArNDA0LDcgQEAKICAgICAvLyByZXR1cm4gdmFsdWUgb2YgdGhlc2UgbWV0aG9kcyBtdXN0IGJlIHZhbGlkYXRlZCBieSB0aGUgY2FsbGVyCiAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tU2FtcGxlUmF0ZTsgfQogICAgIHVpbnQxNl90ICAgIGdldFNlbmRMZXZlbF9VNF8xMigpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tU2VuZExldmVsOyB9Ci0gICAgdWludDMyX3QgICAgZ2V0Vm9sdW1lTFIoKSBjb25zdCB7IHJldHVybiBtQ2Jsay0+bVZvbHVtZUxSOyB9CisgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgZ2V0Vm9sdW1lTFIoKSBjb25zdCB7IHJldHVybiBtQ2Jsay0+bVZvbHVtZUxSOyB9CiAKICAgICAvLyBlc3RpbWF0ZWQgdG90YWwgbnVtYmVyIG9mIGZpbGxlZCBmcmFtZXMgYXZhaWxhYmxlIHRvIHNlcnZlciB0byByZWFkLAogICAgIC8vIHdoaWNoIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIGZyYW1lcwpAQCAtNDU2LDkgKzQ1OSw4IEBACiBjbGFzcyBBdWRpb1JlY29yZFNlcnZlclByb3h5IDogcHVibGljIFNlcnZlclByb3h5IHsKIHB1YmxpYzoKICAgICBBdWRpb1JlY29yZFNlcnZlclByb3h5KGF1ZGlvX3RyYWNrX2NibGtfdCogY2Jsaywgdm9pZCAqYnVmZmVycywgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplKQotICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgZmFsc2UgLyppc091dCovLAotICAgICAgICAgICAgZmFsc2UgLypjbGllbnRJblNlcnZlciovKSB7IH0KKyAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIpCisgICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCBmYWxzZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7IH0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZFNlcnZlclByb3h5KCkgeyB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oCmluZGV4IDQ2YTU5NDYuLmQ0ODMwNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9TdGF0aWNBdWRpb1RyYWNrU3RhdGUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvU3RhdGljQXVkaW9UcmFja1N0YXRlLmgKQEAgLTI1LDkgKzI1LDEzIEBACiAvLyBzdGF0ZSBpcyB3cmFwcGVkIGJ5IGEgU2luZ2xlU3RhdGVRdWV1ZS4KIHN0cnVjdCBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgewogICAgIC8vIGRvIG5vdCBkZWZpbmUgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgb3IgdmlydHVhbCBtZXRob2RzCi0gICAgc2l6ZV90ICBtTG9vcFN0YXJ0OwotICAgIHNpemVfdCAgbUxvb3BFbmQ7Ci0gICAgaW50ICAgICBtTG9vcENvdW50OworCisgICAgLy8gVGhlc2UgZmllbGRzIHNob3VsZCBib3RoIGJlIHNpemVfdCwgYnV0IHNpbmNlIHRoZXkgYXJlIGxvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSB3ZQorICAgIC8vIGZvcmNlIHRvIDMyLWJpdC4gIFRoZSBjbGllbnQgYW5kIHNlcnZlciBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZWRlZnMgZm9yIHNpemVfdC4KKyAgICB1aW50MzJfdCAgICBtTG9vcFN0YXJ0OworICAgIHVpbnQzMl90ICAgIG1Mb29wRW5kOworCisgICAgaW50ICAgICAgICAgbUxvb3BDb3VudDsKIH07CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKaW5kZXggYTIxMWVkOS4uNTE5M2QwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCkBAIC0yNSw2NCArMjUsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIEEgc2ltcGxlIGJ1ZmZlciB0byBob2xkIGJpbmFyeSBkYXRhCi1jbGFzcyBNZWRpYUFsYnVtQXJ0Ci17Ci1wdWJsaWM6Ci0gICAgTWVkaWFBbGJ1bUFydCgpOiBtU2l6ZSgwKSwgbURhdGEoMCkge30KLQotICAgIGV4cGxpY2l0IE1lZGlhQWxidW1BcnQoY29uc3QgY2hhciogdXJsKSB7Ci0gICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgbURhdGEgPSBOVUxMOwotICAgICAgICBGSUxFICppbiA9IGZvcGVuKHVybCwgInIiKTsKLSAgICAgICAgaWYgKCFpbikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZzZWVrKGluLCAwLCBTRUVLX0VORCk7Ci0gICAgICAgIG1TaXplID0gZnRlbGwoaW4pOyAgLy8gQWxsb2NhdGluZyBidWZmZXIgb2Ygc2l6ZSBlcXVhbHMgdG8gdGhlIGV4dGVybmFsIGZpbGUgc2l6ZS4KLSAgICAgICAgaWYgKG1TaXplID09IDAgfHwgKG1EYXRhID0gbmV3IHVpbnQ4X3RbbVNpemVdKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmY2xvc2UoaW4pOwotICAgICAgICAgICAgaWYgKG1TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcmV3aW5kKGluKTsKLSAgICAgICAgaWYgKGZyZWFkKG1EYXRhLCAxLCBtU2l6ZSwgaW4pICE9IG1TaXplKSB7ICAvLyBSZWFkIGZhaWxlZC4KLSAgICAgICAgICAgIGRlbGV0ZVtdIG1EYXRhOwotICAgICAgICAgICAgbURhdGEgPSBOVUxMOwotICAgICAgICAgICAgbVNpemUgPSAwOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShpbik7Ci0gICAgfQotCi0gICAgTWVkaWFBbGJ1bUFydChjb25zdCBNZWRpYUFsYnVtQXJ0JiBjb3B5KSB7Ci0gICAgICAgIG1TaXplID0gY29weS5tU2l6ZTsKLSAgICAgICAgbURhdGEgPSBOVUxMOyAgLy8gaW5pdGlhbGl6ZSBpdCBmaXJzdAotICAgICAgICBpZiAobVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICBtRGF0YSA9IG5ldyB1aW50OF90W2NvcHkubVNpemVdOwotICAgICAgICAgICBpZiAobURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgbWVtY3B5KG1EYXRhLCBjb3B5Lm1EYXRhLCBtU2l6ZSk7Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIH5NZWRpYUFsYnVtQXJ0KCkgewotICAgICAgICBpZiAobURhdGEgIT0gMCkgewotICAgICAgICAgICAgZGVsZXRlW10gbURhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJbnRlbnRpb25hbCBwdWJsaWMgYWNjZXNzIG1vZGlmaWVyOgotICAgIC8vIFdlIGhhdmUgdG8ga25vdyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGluIG9yZGVyIHRvIHNoYXJlIGl0IGJldHdlZW4KLSAgICAvLyBwcm9jZXNzZXM/Ci0gICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCi0gICAgdWludDhfdCogbURhdGE7ICAgICAgICAgICAgLy8gQWN0dWFsIGJpbmFyeSBkYXRhCi19OwotCiAvLyBSZXByZXNlbnRzIGEgY29sb3IgY29udmVydGVkIChSR0ItYmFzZWQpIHZpZGVvIGZyYW1lCiAvLyB3aXRoIGJpdG1hcCBwaXhlbHMgc3RvcmVkIGluIEZyYW1lQnVmZmVyCiBjbGFzcyBWaWRlb0ZyYW1lCkBAIC0xMjEsOCArNjMsMTEgQEAKICAgICB1aW50MzJfdCBtRGlzcGxheVdpZHRoOwogICAgIHVpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OwogICAgIHVpbnQzMl90IG1TaXplOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtRGF0YQorICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgIC8vIHJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAorICAgIC8vIG1EYXRhIHNob3VsZCBiZSA2NCBiaXQgYWxpZ25lZCB0byBwcmV2ZW50IGFkZGl0aW9uYWwgcGFkZGluZwogICAgIHVpbnQ4X3QqIG1EYXRhOyAgICAgICAgICAgIC8vIEFjdHVhbCBiaW5hcnkgZGF0YQotICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgIC8vIHJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UKKyAgICAvLyBwYWQgc3RydWN0dXJlIHNvIGl0J3MgdGhlIHNhbWUgc2l6ZSBvbiA2NCBiaXQgYW5kIDMyIGJpdAorICAgIGNoYXIgICAgIG1QYWRkaW5nWzggLSBzaXplb2YobURhdGEpXTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkOGViMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJU291bmRUcmlnZ2VyIDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VyOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwNDI5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX0NMSUVOVF9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVNvdW5kVHJpZ2dlckNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckNsaWVudCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlKGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VyQ2xpZW50IDogcHVibGljIEJuSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBjYjAxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVNvdW5kVHJpZ2dlcjsKK2NsYXNzIElTb3VuZFRyaWdnZXJDbGllbnQ7CisKK2NsYXNzIElTb3VuZFRyaWdnZXJId1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorCisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJId1NlcnZpY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1ZTFkZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSAorCisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZW1vcnlEZWFsZXI7CisKK2NsYXNzIFNvdW5kVHJpZ2dlciA6IHB1YmxpYyBCblNvdW5kVHJpZ2dlckNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAoreworcHVibGljOgorCisgICAgdmlydHVhbCB+U291bmRUcmlnZ2VyKCk7CisKKyAgICBzdGF0aWMgIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOworICAgIHN0YXRpYyAgc3A8U291bmRUcmlnZ2VyPiBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKKyAgICBzdGF0aWMgIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSk7CisKKyAgICAgICAgICAgIHZvaWQgZGV0YWNoKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgICAgICAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAorICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2UoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKKworICAgICAgICAgICAgLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBzb3VuZF90cmlnZ2VyX3V1aWRfdCAqZ3VpZCk7CisgICAgICAgICAgICBzdGF0aWMgc3RhdHVzX3QgZ3VpZFRvU3RyaW5nKGNvbnN0IHNvdW5kX3RyaWdnZXJfdXVpZF90ICpndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pOworCitwcml2YXRlOgorICAgICAgICAgICAgU291bmRUcmlnZ2VyKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mKTsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgZ2V0U291bmRUcmlnZ2VySHdTZXJ2aWNlKCk7CisKKyAgICAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4gICAgICAgICAgICAgICAgICAgbUlTb3VuZFRyaWdnZXI7CisgICAgICAgICAgICBjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtTW9kdWxlOworICAgICAgICAgICAgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+ICAgICAgICAgICAgbUNhbGxiYWNrOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckNhbGxiYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyNzdmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckNhbGxiYWNrLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfQ0FMTEJBQ0tfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9DQUxMQkFDS19ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTb3VuZFRyaWdnZXJDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlckNhbGxiYWNrKCkge30KKyAgICB2aXJ0dWFsIH5Tb3VuZFRyaWdnZXJDYWxsYmFjaygpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlRGllZCgpID0gMDsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfQ0FMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjg2ODI3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2VkaXRvcnBsYXllcgotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JwbGF5ZXIKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgIFZpZGVvRWRpdG9yVG9vbHMuY3BwIFwKLSAgICBWaWRlb0VkaXRvclBsYXllci5jcHAgXAotICAgIFByZXZpZXdQbGF5ZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yU1JDLmNwcCBcCi0gICAgRHVtbXlBdWRpb1NvdXJjZS5jcHAgXAotICAgIER1bW15VmlkZW9Tb3VyY2UuY3BwIFwKLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmNwcCBcCi0gICAgUHJldmlld1JlbmRlcmVyLmNwcCBcCi0gICAgSTQyMENvbG9yQ29udmVydGVyLmNwcCBcCi0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIuY3BwCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KLQotCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgIFwKLSAgICBsaWJhdWRpb2ZsaW5nZXIgICAgICAgICAgIFwKLSAgICBsaWJhdWRpb3V0aWxzICAgICAgICAgICAgIFwKLSAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJsb2cgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJFR0wgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJHTEVTdjIgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJkcm1mcmFtZXdvcmsgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICBsaWJzdGFnZWZyaWdodF9vbXggICAgICAgIFwKLSAgICBsaWJzeW5jICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ1aSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgIFwKLQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9sdnBwIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2VkaXRvciBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL3NlcnZpY2VzL2F1ZGlvZmxpbmdlcgotCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgICAtRE00X0VOQUJMRV9SRU5ERVJJTkdNT0RFIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9SRUFERVJTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF8zR1BQX1JFQURFUgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGJjYWI2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEdW1teUF1ZGlvU291cmNlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlICJEdW1teUF1ZGlvU291cmNlLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vL3N0YXRpYwotc3A8RHVtbXlBdWRpb1NvdXJjZT4gRHVtbXlBdWRpb1NvdXJjZTo6Q3JlYXRlKAotICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgIGludDY0X3QgZnJhbWVEdXJhdGlvblVzLCBpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykgewotCi0gICAgQUxPR1YoIkNyZWF0ZSAiKTsKLSAgICByZXR1cm4gbmV3IER1bW15QXVkaW9Tb3VyY2Uoc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb25VcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EdXJhdGlvblVzKTsKLQotfQotCi1EdW1teUF1ZGlvU291cmNlOjpEdW1teUF1ZGlvU291cmNlKAotICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgIGludDY0X3QgZnJhbWVEdXJhdGlvblVzLCBpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykKLSAgICA6IG1TYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlKSwKLSAgICAgIG1DaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSwKLSAgICAgIG1GcmFtZUR1cmF0aW9uVXMoZnJhbWVEdXJhdGlvblVzKSwKLSAgICAgIG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lKDApLAotICAgICAgbUF1ZGlvRHVyYXRpb25VcyhhdWRpb0R1cmF0aW9uVXMpLAotICAgICAgbVRpbWVTdGFtcFVzKDApLAotICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpIHsKLQotICAgIG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lID0gKGludDMyX3QpCi0gICAgICAgICAgICAoKDFMICogbVNhbXBsaW5nUmF0ZSAqIG1GcmFtZUR1cmF0aW9uVXMpLzEwMDAwMDApOwotICAgIG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lID0gbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgICogbUNoYW5uZWxDb3VudDsKLQotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogRSIpOwotICAgIEFMT0dWKCJzYW1wbGluZ1JhdGUgPSAlZCIsIHNhbXBsaW5nUmF0ZSk7Ci0gICAgQUxPR1YoImNoYW5uZWxDb3VudCA9ICVkIiwgY2hhbm5lbENvdW50KTsKLSAgICBBTE9HVigiZnJhbWVEdXJhdGlvblVzID0gJWxsZCIsIGZyYW1lRHVyYXRpb25Vcyk7Ci0gICAgQUxPR1YoImF1ZGlvRHVyYXRpb25VcyA9ICVsbGQiLCBhdWRpb0R1cmF0aW9uVXMpOwotICAgIEFMT0dWKCJtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA9ICVkIiwgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUpOwotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogWCIpOwotfQotCi1EdW1teUF1ZGlvU291cmNlOjp+RHVtbXlBdWRpb1NvdXJjZSgpIHsKLSAgICAvKiBEbyBub3RoaW5nIGhlcmU/ICovCi0gICAgQUxPR1YoIn5EdW1teUF1ZGlvU291cmNlIik7Ci19Ci0KLXZvaWQgRHVtbXlBdWRpb1NvdXJjZTo6c2V0RHVyYXRpb24oaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpIHsKLSAgICBBTE9HVigic2V0RHVyYXRpb246ICVsbGQgdXMgYWRkZWQgdG8gJWxsZCB1cyIsCi0gICAgICAgIGF1ZGlvRHVyYXRpb25VcywgbUF1ZGlvRHVyYXRpb25Vcyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1BdWRpb0R1cmF0aW9uVXMgKz0gYXVkaW9EdXJhdGlvblVzOwotfQotCi1zdGF0dXNfdCBEdW1teUF1ZGlvU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgQUxPR1YoInN0YXJ0OiBFIik7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBtVGltZVN0YW1wVXMgPSAwOwotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKAotICAgICAgICAgICAgbmV3IE1lZGlhQnVmZmVyKG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lICogc2l6ZW9mKGludDE2X3QpKSk7Ci0KLSAgICBBTE9HVigic3RhcnQ6IFgiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IER1bW15QXVkaW9Tb3VyY2U6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLQotICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwID0gTlVMTDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zcDxNZXRhRGF0YT4gRHVtbXlBdWRpb1NvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJnZXRGb3JtYXQiKTsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1DaGFubmVsQ291bnQpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxpbmdSYXRlKTsKLSAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIG1GcmFtZUR1cmF0aW9uVXMpOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJEdW1teUF1ZGlvU291cmNlIik7Ci0KLSAgICByZXR1cm4gbWV0YTsKLX0KLQotc3RhdHVzX3QgRHVtbXlBdWRpb1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotCi0gICAgQUxPR1YoInJlYWQ6IEUiKTsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLQotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7Ci0gICAgICAgIG1UaW1lU3RhbXBVcyA9IHNlZWtUaW1lVXM7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBpZiAobVRpbWVTdGFtcFVzID49IG1BdWRpb0R1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgIEFMT0dJKCJyZWFkOiBFT1MgcmVhY2hlZCAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgbVRpbWVTdGFtcFVzLCBtQXVkaW9EdXJhdGlvblVzKTsKLQotICAgICAgICAgICAgKm91dCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBidWZmZXIgZnJvbSBtQnVmZmVyR3JvdXA6ICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtZW1zZXQoKHVpbnQ4X3QgKikgYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgMCwgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPDwgMSk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgKG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lIDw8IDEpKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbVRpbWVTdGFtcFVzKTsKLQotICAgIEFMT0dWKCJyZWFkOiBvZmZzZXQgID0gJWQsIHNpemUgPSAlZCwgbVRpbWVTdGFtcFVzID0gJWxsZCIsCi0gICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCksIG1UaW1lU3RhbXBVcyk7Ci0KLSAgICBtVGltZVN0YW1wVXMgPSBtVGltZVN0YW1wVXMgKyBtRnJhbWVEdXJhdGlvblVzOwotICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0vLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWYyNWE4Yy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERVTU1ZX0FVRElPU09VUkNFX0hfCi0jZGVmaW5lIERVTU1ZX0FVRElPU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWV0YURhdGE7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKLQotc3RydWN0IER1bW15QXVkaW9Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotCi1wdWJsaWM6Ci0gICAgc3RhdGljIHNwPER1bW15QXVkaW9Tb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi0gICAgdm9pZCBzZXREdXJhdGlvbihpbnQ2NF90IGF1ZGlvRHVyYXRpb25Vcyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EdW1teUF1ZGlvU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgaW50MzJfdCBtU2FtcGxpbmdSYXRlOwotICAgIGludDMyX3QgbUNoYW5uZWxDb3VudDsKLSAgICBpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgaW50MzJfdCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZTsKLSAgICBpbnQ2NF90IG1BdWRpb0R1cmF0aW9uVXM7Ci0gICAgaW50NjRfdCBtVGltZVN0YW1wVXM7Ci0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptQnVmZmVyR3JvdXA7Ci0KLSAgICBEdW1teUF1ZGlvU291cmNlKAotICAgICAgICAgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUsIGludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICBEdW1teUF1ZGlvU291cmNlKGNvbnN0IER1bW15QXVkaW9Tb3VyY2UgJik7Ci0gICAgRHVtbXlBdWRpb1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IER1bW15QXVkaW9Tb3VyY2UgJik7Ci0KLX07Ci0KLX0vL25hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vRFVNTVlfQVVESU9TT1VSQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNmY5MzcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEdW1teVZpZGVvU291cmNlIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLSNpbmNsdWRlICJEdW1teVZpZGVvU291cmNlLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zcDxEdW1teVZpZGVvU291cmNlPiBEdW1teVZpZGVvU291cmNlOjpDcmVhdGUoCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgIHVpbnQ2NF90IGNsaXBEdXJhdGlvbiwgY29uc3QgY2hhciAqaW1hZ2VVcmkpIHsKLQotICAgIEFMT0dWKCJDcmVhdGUiKTsKLSAgICByZXR1cm4gbmV3IER1bW15VmlkZW9Tb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsaXBEdXJhdGlvbiwgaW1hZ2VVcmkpOwotCi19Ci0KLQotRHVtbXlWaWRlb1NvdXJjZTo6RHVtbXlWaWRlb1NvdXJjZSgKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSkgewotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBFIik7Ci0KLSAgICBtRnJhbWVXaWR0aCA9IHdpZHRoOwotICAgIG1GcmFtZUhlaWdodCA9IGhlaWdodDsKLSAgICBtSW1hZ2VDbGlwRHVyYXRpb24gPSBjbGlwRHVyYXRpb247Ci0gICAgbVVyaSA9IGltYWdlVXJpOwotICAgIG1JbWFnZUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiJXMiLCBtVXJpKTsKLSAgICBBTE9HVigiQ29uc3RydWN0b3I6IFgiKTsKLX0KLQotCi1EdW1teVZpZGVvU291cmNlOjp+RHVtbXlWaWRlb1NvdXJjZSgpIHsKLSAgICAvKiBEbyBub3RoaW5nIGhlcmU/ICovCi0gICAgQUxPR1YoIn5EdW1teVZpZGVvU291cmNlIik7Ci19Ci0KLQotCi1zdGF0dXNfdCBEdW1teVZpZGVvU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgQUxPR1YoInN0YXJ0OiBFIik7Ci0KLSAgICAvLyBHZXQgdGhlIGZyYW1lIGJ1ZmZlciBmcm9tIHRoZSByZ2IgZmlsZSwgbVVyaSwKLSAgICAvLyBhbmQgc3RvcmUgaXRzIGNvbnRlbnQgaW50byBhIE1lZGlhQnVmZmVyCi0gICAgc3RhdHVzX3QgZXJyID0gTHZHZXRJbWFnZVRodW1iTmFpbCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiltVXJpLAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVIZWlnaHQsIG1GcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKikgJm1JbWFnZUJ1ZmZlcik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiTHZHZXRJbWFnZVRodW1iTmFpbCBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtSXNGaXJzdEltYWdlRnJhbWUgPSB0cnVlOwotICAgIG1JbWFnZVNlZWtUaW1lID0gMDsKLSAgICBtSW1hZ2VQbGF5U3RhcnRUaW1lID0gMDsKLSAgICBtRnJhbWVUaW1lVXMgPSAwOwotCi0gICAgQUxPR1YoInN0YXJ0OiBYIik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChtSW1hZ2VCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1JbWFnZUJ1ZmZlcik7Ci0gICAgICAgIG1JbWFnZUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1zcDxNZXRhRGF0YT4gRHVtbXlWaWRlb1NvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJnZXRGb3JtYXQiKTsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtRnJhbWVXaWR0aCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgbUZyYW1lSGVpZ2h0KTsKLSAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIG1JbWFnZUNsaXBEdXJhdGlvbik7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkR1bW15VmlkZW9Tb3VyY2UiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBEdW1teVZpZGVvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwKLSAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0KLSAgICBBTE9HVigicmVhZDogRSIpOwotCi0gICAgY29uc3QgaW50MzJfdCBrVGltZVNjYWxlID0gMTAwMDsgIC8qIHRpbWUgc2NhbGUgaW4gbXMgKi8KLSAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgewotICAgICAgICBzZWVraW5nID0gdHJ1ZTsKLSAgICAgICAgbUltYWdlU2Vla1RpbWUgPSBzZWVrVGltZVVzOwotICAgICAgICBNNE9TQV9jbG9ja0dldFRpbWUoJm1JbWFnZVBsYXlTdGFydFRpbWUsIGtUaW1lU2NhbGUpOwotICAgIH0KLQotICAgIGlmICgobUltYWdlU2Vla1RpbWUgPT0gbUltYWdlQ2xpcER1cmF0aW9uKSB8fAotICAgICAgICAobUZyYW1lVGltZVVzID09IChpbnQ2NF90KW1JbWFnZUNsaXBEdXJhdGlvbikpIHsKLSAgICAgICAgQUxPR1YoInJlYWQ6IEVPUyByZWFjaGVkIik7Ci0gICAgICAgICpvdXQgPSBOVUxMOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKAotICAgICAgICAgICAgbUltYWdlQnVmZmVyLCAobUZyYW1lV2lkdGggKiBtRnJhbWVIZWlnaHQgKiAxLjUpKTsKLQotICAgIC8vIFNldCB0aW1lc3RhbXAgb2YgYnVmZmVyCi0gICAgaWYgKG1Jc0ZpcnN0SW1hZ2VGcmFtZSkgewotICAgICAgICBNNE9TQV9jbG9ja0dldFRpbWUoJm1JbWFnZVBsYXlTdGFydFRpbWUsIGtUaW1lU2NhbGUpOwotICAgICAgICBtRnJhbWVUaW1lVXMgPSAgKG1JbWFnZVNlZWtUaW1lICsgMSk7Ci0gICAgICAgIEFMT0dWKCJyZWFkOiBqcGcgMXN0IGZyYW1lIHRpbWVVcyA9ICVsbGQsIGJlZ2luIGN1dCB0aW1lID0gJWxkIiwKLSAgICAgICAgICAgIG1GcmFtZVRpbWVVcywgbUltYWdlU2Vla1RpbWUpOwotCi0gICAgICAgIG1Jc0ZpcnN0SW1hZ2VGcmFtZSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE00T1NBX1RpbWUgIGN1cnJlbnRUaW1lTXM7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmY3VycmVudFRpbWVNcywga1RpbWVTY2FsZSk7Ci0KLSAgICAgICAgbUZyYW1lVGltZVVzID0gbUltYWdlU2Vla1RpbWUgKwotICAgICAgICAgICAgKGN1cnJlbnRUaW1lTXMgLSBtSW1hZ2VQbGF5U3RhcnRUaW1lKSAqIDEwMDBMTDsKLQotICAgICAgICBBTE9HVigicmVhZDoganBnIGZyYW1lIHRpbWVVcyA9ICVsbGQiLCBtRnJhbWVUaW1lVXMpOwotICAgIH0KLQotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtRnJhbWVUaW1lVXMpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgbUZyYW1lV2lkdGggKiBtRnJhbWVIZWlnaHQgKiAxLjUpOwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gZXJyOwotfQotCi19Ly8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2NTE0ZjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEVU1NWV9WSURFT1NPVVJDRV9IXwotI2RlZmluZSBEVU1NWV9WSURFT1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlICJNNE9TQV9DbG9jay5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzICBNZWRpYUJ1ZmZlcjsKLWNsYXNzICBNZXRhRGF0YTsKLQotc3RydWN0IER1bW15VmlkZW9Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotCi1wdWJsaWM6Ci0gICAgc3RhdGljIHNwPER1bW15VmlkZW9Tb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNsaXBEdXJhdGlvbiwgY29uc3QgY2hhciAqaW1hZ2VVcmkpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EdW1teVZpZGVvU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgdWludDMyX3QgbUZyYW1lV2lkdGg7Ci0gICAgdWludDMyX3QgbUZyYW1lSGVpZ2h0OwotICAgIHVpbnQ2NF90IG1JbWFnZUNsaXBEdXJhdGlvbjsKLSAgICBjb25zdCBjaGFyICptVXJpOwotICAgIGludDY0X3QgbUZyYW1lVGltZVVzOwotICAgIGJvb2wgbUlzRmlyc3RJbWFnZUZyYW1lOwotICAgIHZvaWQgKm1JbWFnZUJ1ZmZlcjsKLSAgICBNNE9TQV9UaW1lIG1JbWFnZVBsYXlTdGFydFRpbWU7Ci0gICAgdWludDMyX3QgbUltYWdlU2Vla1RpbWU7Ci0KLSAgICBEdW1teVZpZGVvU291cmNlKAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIHVpbnQ2NF90IGNsaXBEdXJhdGlvbiwgY29uc3QgY2hhciAqaW1hZ2VVcmkpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgIER1bW15VmlkZW9Tb3VyY2UoY29uc3QgRHVtbXlWaWRlb1NvdXJjZSAmKTsKLSAgICBEdW1teVZpZGVvU291cmNlICZvcGVyYXRvcj0oY29uc3QgRHVtbXlWaWRlb1NvdXJjZSAmKTsKLQotfTsKLQotCi19Ly9uYW1lc3BhY2UgYW5kcm9pZAotCi0KLSNlbmRpZiAvL0RVTU1ZX1ZJREVPU09VUkNFX0hfCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIxZDNmZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0k0MjBDb2xvckNvbnZlcnRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPEk0MjBDb2xvckNvbnZlcnRlci5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi1JNDIwQ29sb3JDb252ZXJ0ZXI6Okk0MjBDb2xvckNvbnZlcnRlcigpIHsKLSAgICAvLyBPcGVuIHRoZSBzaGFyZWQgbGlicmFyeQotICAgIG1IYW5kbGUgPSBkbG9wZW4oImxpYkk0MjBjb2xvcmNvbnZlcnQuc28iLCBSVExEX05PVyk7Ci0KLSAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJJNDIwQ29sb3JDb252ZXJ0ZXI6IGNhbm5vdCBsb2FkIGxpYkk0MjBjb2xvcmNvbnZlcnQuc28iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEZpbmQgdGhlIGVudHJ5IHBvaW50Ci0gICAgdm9pZCAoKmdldEk0MjBDb2xvckNvbnZlcnRlcikoSTQyMENvbG9yQ29udmVydGVyICpjb252ZXJ0ZXIpID0KLSAgICAgICAgKHZvaWQgKCopKEk0MjBDb2xvckNvbnZlcnRlciopKSBkbHN5bShtSGFuZGxlLCAiZ2V0STQyMENvbG9yQ29udmVydGVyIik7Ci0KLSAgICBpZiAoZ2V0STQyMENvbG9yQ29udmVydGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkk0MjBDb2xvckNvbnZlcnRlcjogY2Fubm90IGxvYWQgZ2V0STQyMENvbG9yQ29udmVydGVyIik7Ci0gICAgICAgIGRsY2xvc2UobUhhbmRsZSk7Ci0gICAgICAgIG1IYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRmlsbCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMuCi0gICAgZ2V0STQyMENvbG9yQ29udmVydGVyKHRoaXMpOwotCi0gICAgQUxPR0koIkk0MjBDb2xvckNvbnZlcnRlcjogbGliSTQyMGNvbG9yY29udmVydC5zbyBsb2FkZWQiKTsKLX0KLQotYm9vbCBJNDIwQ29sb3JDb252ZXJ0ZXI6OmlzTG9hZGVkKCkgewotICAgIHJldHVybiBtSGFuZGxlICE9IE5VTEw7Ci19Ci0KLUk0MjBDb2xvckNvbnZlcnRlcjo6fkk0MjBDb2xvckNvbnZlcnRlcigpIHsKLSAgICBpZiAobUhhbmRsZSkgewotICAgICAgICBkbGNsb3NlKG1IYW5kbGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL0k0MjBDb2xvckNvbnZlcnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDQ4ZTQ0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBJNDIwX0NPTE9SX0NPTlZFUlRFUl9ICi0jZGVmaW5lIEk0MjBfQ09MT1JfQ09OVkVSVEVSX0gKLQotI2luY2x1ZGUgPElJNDIwQ29sb3JDb252ZXJ0ZXIuaD4KLQotLy8gVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBJNDIwIGNvbG9yIGNvbnZlcnRlciBmdW5jdGlvbnMgaW4KLS8vIElJNDIwQ29sb3JDb252ZXJ0ZXIsIHdoaWNoIGlzIGxvYWRlZCBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuCi1jbGFzcyBJNDIwQ29sb3JDb252ZXJ0ZXI6IHB1YmxpYyBJSTQyMENvbG9yQ29udmVydGVyIHsKLXB1YmxpYzoKLSAgICBJNDIwQ29sb3JDb252ZXJ0ZXIoKTsKLSAgICB+STQyMENvbG9yQ29udmVydGVyKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnZlcnRlciBmdW5jdGlvbnMgYXJlIHN1Y2Nlc3NmdWxseSBsb2FkZWQuCi0gICAgYm9vbCBpc0xvYWRlZCgpOwotcHJpdmF0ZToKLSAgICB2b2lkKiBtSGFuZGxlOwotfTsKLQotI2VuZGlmIC8qIEk0MjBfQ09MT1JfQ09OVkVSVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci9sdnBwL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9OYXRpdmVXaW5kb3dSZW5kZXJlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGIzNjJlZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJOYXRpdmVXaW5kb3dSZW5kZXJlciIKLSNpbmNsdWRlICJOYXRpdmVXaW5kb3dSZW5kZXJlci5oIgotCi0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGd1aS9HTENvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlICJWaWRlb0VkaXRvclRvb2xzLmgiCi0KLSNkZWZpbmUgQ0hFQ0tfRUdMX0VSUk9SIENIRUNLKEVHTF9TVUNDRVNTID09IGVnbEdldEVycm9yKCkpCi0jZGVmaW5lIENIRUNLX0dMX0VSUk9SIENIRUNLKEdMZW51bShHTF9OT19FUlJPUikgPT0gZ2xHZXRFcnJvcigpKQotCi0vLwotLy8gVmVydGV4IGFuZCBmcmFnbWVudCBwcm9ncmFtcwotLy8KLQotLy8gVGhlIG1hdHJpeCBpcyBkZXJpdmVkIGZyb20KLS8vIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCi0vLwotLy8gUiAqIDI1NSA9IDEuMTY0ICogKFkgLSAxNikgKyAxLjU5NiAqIChWIC0gMTI4KQotLy8gRyAqIDI1NSA9IDEuMTY0ICogKFkgLSAxNikgLSAwLjgxMyAqIChWIC0gMTI4KSAtIDAuMzkxICogKFUgLSAxMjgpCi0vLyBCICogMjU1ID0gMS4xNjQgKiAoWSAtIDE2KSArIDIuMDE4ICogKFUgLSAxMjgpCi0vLwotLy8gSGVyZSB3ZSBhc3N1bWUgWVVWIGFyZSBpbiB0aGUgcmFuZ2Ugb2YgWzAsMjU1XSwgUkdCIGFyZSBpbiB0aGUgcmFuZ2Ugb2YKLS8vIFswLCAxXQotI2RlZmluZSBSR0IyWVVWX01BVFJJWCBcCi0iY29uc3QgbWF0NCByZ2IyeXV2ID0gbWF0NCgiXAotIiAgICA2NS41MjI1NSwgICAtMzcuNzkzOTgsICAgMTExLjk4NzMyLCAgICAgMC4wMDAwMCwiXAotIiAgIDEyOC42MjcyOSwgICAtNzQuMTkzMzQsICAgLTkzLjgxMDg4LCAgICAgMC4wMDAwMCwiXAotIiAgICAyNC45MjIzMywgICAxMTEuOTg3MzIsICAgLTE4LjE3NjQ0LCAgICAgMC4wMDAwMCwiXAotIiAgICAxNi4wMDAwMCwgICAxMjguMDAwMDAsICAgMTI4LjAwMDAwLCAgICAgMS4wMDAwMCk7XG4iCi0KLSNkZWZpbmUgWVVWMlJHQl9NQVRSSVggXAotImNvbnN0IG1hdDQgeXV2MnJnYiA9IG1hdDQoIlwKLSIgICAwLjAwNDU2LCAgIDAuMDA0NTYsICAgMC4wMDQ1NiwgICAwLjAwMDAwLCJcCi0iICAgMC4wMDAwMCwgIC0wLjAwMTUzLCAgIDAuMDA3OTEsICAgMC4wMDAwMCwiXAotIiAgIDAuMDA2MjYsICAtMC4wMDMxOSwgICAwLjAwMDAwLCAgIDAuMDAwMDAsIlwKLSIgIC0wLjg3NDE2LCAgIDAuNTMxMzMsICAtMS4wODU5OSwgICAxLjAwMDAwKTtcbiIKLQotc3RhdGljIGNvbnN0IGNoYXIgdlNyY05vcm1hbFtdID0KLSAgICAiYXR0cmlidXRlIHZlYzQgdlBvc2l0aW9uO1xuIgotICAgICJhdHRyaWJ1dGUgdmVjMiB2VGV4UG9zO1xuIgotICAgICJ1bmlmb3JtIG1hdDQgdGV4TWF0cml4O1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgICJ2YXJ5aW5nIGZsb2F0IHRvcERvd247XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjtcbiIKLSAgICAiICB0ZXhDb29yZHMgPSAodGV4TWF0cml4ICogdmVjNCh2VGV4UG9zLCAwLjAsIDEuMCkpLnh5O1xuIgotICAgICIgIHRvcERvd24gPSB2VGV4UG9zLnk7XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGZTcmNOb3JtYWxbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZlNyY1NlcGlhW10gPQotICAgICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyB0ZXhTYW1wbGVyO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgIFJHQjJZVVZfTUFUUklYCi0gICAgWVVWMlJHQl9NQVRSSVgKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIHZlYzQgcmdiID0gdGV4dHVyZTJEKHRleFNhbXBsZXIsIHRleENvb3Jkcyk7XG4iCi0gICAgIiAgdmVjNCB5dXYgPSByZ2IyeXV2ICogcmdiO1xuIgotICAgICIgIHl1diA9IHZlYzQoeXV2LngsIDExNy4wLCAxMzkuMCwgMS4wKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB5dXYycmdiICogeXV2O1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjTmVnYXRpdmVbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgUkdCMllVVl9NQVRSSVgKLSAgICBZVVYyUkdCX01BVFJJWAotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCByZ2IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAiICB2ZWM0IHl1diA9IHJnYjJ5dXYgKiByZ2I7XG4iCi0gICAgIiAgeXV2ID0gdmVjNCgyNTUuMCAtIHl1di54LCB5dXYueSwgeXV2LnosIDEuMCk7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0geXV2MnJnYiAqIHl1djtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZlNyY0dyYWRpZW50W10gPQotICAgICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyB0ZXhTYW1wbGVyO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgICJ2YXJ5aW5nIGZsb2F0IHRvcERvd247XG4iCi0gICAgUkdCMllVVl9NQVRSSVgKLSAgICBZVVYyUkdCX01BVFJJWAotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCByZ2IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAiICB2ZWM0IHl1diA9IHJnYjJ5dXYgKiByZ2I7XG4iCi0gICAgIiAgdmVjNCBtaXhpbiA9IHZlYzQoMTUuMC8zMS4wLCA1OS4wLzYzLjAsIDMxLjAvMzEuMCwgMS4wKTtcbiIKLSAgICAiICB2ZWM0IHl1djIgPSByZ2IyeXV2ICogdmVjNCgobWl4aW4ueHl6ICogdG9wRG93biksIDEpO1xuIgotICAgICIgIHl1diA9IHZlYzQoeXV2LngsIHl1djIueSwgeXV2Mi56LCAxKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB5dXYycmdiICogeXV2O1xuIgotICAgICJ9XG4iOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpOYXRpdmVXaW5kb3dSZW5kZXJlcihzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3csCi0gICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICA6IG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KQotICAgICwgbURzdFdpZHRoKHdpZHRoKQotICAgICwgbURzdEhlaWdodChoZWlnaHQpCi0gICAgLCBtTGFzdFZpZGVvRWZmZWN0KC0xKQotICAgICwgbU5leHRUZXh0dXJlSWQoMTAwKQotICAgICwgbUFjdGl2ZUlucHV0cygwKQotICAgICwgbVRocmVhZENtZChDTURfSURMRSkgewotICAgIGNyZWF0ZVRocmVhZCh0aHJlYWRTdGFydCwgdGhpcyk7Ci19Ci0KLS8vIFRoZSBmdW5jdGlvbnMgYmVsb3cgcnVuIGluIHRoZSBHTCB0aHJlYWQuCi0vLwotLy8gQWxsIEdMLXJlbGF0ZWQgd29yayBpcyBkb25lIGluIHRoaXMgdGhyZWFkLCBhbmQgb3RoZXIgdGhyZWFkcyBzZW5kCi0vLyByZXF1ZXN0cyB0byB0aGlzIHRocmVhZCB1c2luZyBhIGNvbW1hbmQgY29kZS4gV2UgZXhwZWN0IG1vc3Qgb2YgdGhlCi0vLyB0aW1lIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgdGhyZWFkIHNlbmRpbmcgaW4gcmVxdWVzdHMsIHNvIHdlIGxldAotLy8gb3RoZXIgdGhyZWFkcyB3YWl0IHVudGlsIHRoZSByZXF1ZXN0IGlzIGZpbmlzaGVkIGJ5IEdMIHRocmVhZC4KLQotaW50IE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp0aHJlYWRTdGFydCh2b2lkKiBzZWxmKSB7Ci0gICAgQUxPR0QoImNyZWF0ZSB0aHJlYWQiKTsKLSAgICAoKE5hdGl2ZVdpbmRvd1JlbmRlcmVyKilzZWxmKS0+Z2xUaHJlYWQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Z2xUaHJlYWQoKSB7Ci0gICAgaW5pdGlhbGl6ZUVHTCgpOwotICAgIGNyZWF0ZVByb2dyYW1zKCk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGJvb2wgcXVpdCA9IGZhbHNlOwotICAgIHdoaWxlICghcXVpdCkgewotICAgICAgICBzd2l0Y2ggKG1UaHJlYWRDbWQpIHsKLSAgICAgICAgICAgIGNhc2UgQ01EX0lETEU6Ci0gICAgICAgICAgICAgICAgbUNvbmQud2FpdChtTG9jayk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjYXNlIENNRF9SRU5ERVJfSU5QVVQ6Ci0gICAgICAgICAgICAgICAgcmVuZGVyKG1UaHJlYWRSZW5kZXJJbnB1dCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENNRF9SRVNFUlZFX1RFWFRVUkU6Ci0gICAgICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgbVRocmVhZFRleHR1cmVJZCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0xfRVJST1I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENNRF9ERUxFVEVfVEVYVFVSRToKLSAgICAgICAgICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtVGhyZWFkVGV4dHVyZUlkKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ01EX1FVSVQ6Ci0gICAgICAgICAgICAgICAgdGVybWluYXRlRUdMKCk7Ci0gICAgICAgICAgICAgICAgcXVpdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGVsbCB0aGUgcmVxdWVzdGVyIHRoYXQgdGhlIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0gICAgICAgIG1UaHJlYWRDbWQgPSBDTURfSURMRTsKLSAgICAgICAgbUNvbmQuYnJvYWRjYXN0KCk7Ci0gICAgfQotICAgIEFMT0dEKCJxdWl0Iik7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmluaXRpYWxpemVFR0woKSB7Ci0gICAgbUVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICBlZ2xJbml0aWFsaXplKG1FZ2xEaXNwbGF5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBFR0xDb25maWcgY29uZmlnOwotICAgIEVHTGludCBudW1Db25maWdzID0gLTE7Ci0gICAgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgRUdMX1JFRF9TSVpFLCA4LAotICAgICAgICBFR0xfR1JFRU5fU0laRSwgOCwKLSAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKLSAgICAgICAgRUdMX05PTkUKLSAgICB9OwotICAgIGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIG1FZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShtRWdsRGlzcGxheSwgY29uZmlnLAotICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBOVUxMKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBFR0xpbnQgY29udGV4dEF0dHJpYnNbXSA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTF9OT05FIH07Ci0gICAgbUVnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KG1FZ2xEaXNwbGF5LCBjb25maWcsIEVHTF9OT19DT05URVhULAotICAgICAgICBjb250ZXh0QXR0cmlicyk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwgbUVnbENvbnRleHQpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6dGVybWluYXRlRUdMKCkgewotICAgIGVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICBlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Y3JlYXRlUHJvZ3JhbXMoKSB7Ci0gICAgR0x1aW50IHZTaGFkZXI7Ci0gICAgbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCB2U3JjTm9ybWFsLCAmdlNoYWRlcik7Ci0KLSAgICBjb25zdCBjaGFyKiBmU3JjW05VTUJFUl9PRl9FRkZFQ1RTXSA9IHsKLSAgICAgICAgZlNyY05vcm1hbCwgZlNyY1NlcGlhLCBmU3JjTmVnYXRpdmUsIGZTcmNHcmFkaWVudAotICAgIH07Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTUJFUl9PRl9FRkZFQ1RTOyBpKyspIHsKLSAgICAgICAgR0x1aW50IGZTaGFkZXI7Ci0gICAgICAgIGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBmU3JjW2ldLCAmZlNoYWRlcik7Ci0gICAgICAgIGNyZWF0ZVByb2dyYW0odlNoYWRlciwgZlNoYWRlciwgJm1Qcm9ncmFtW2ldKTsKLSAgICAgICAgZ2xEZWxldGVTaGFkZXIoZlNoYWRlcik7Ci0gICAgICAgIENIRUNLX0dMX0VSUk9SOwotICAgIH0KLQotICAgIGdsRGVsZXRlU2hhZGVyKHZTaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjcmVhdGVQcm9ncmFtKAotICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIsIEdMdWludCBmcmFnbWVudFNoYWRlciwgR0x1aW50KiBvdXRQZ20pIHsKLQotICAgIEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKLSAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOwotICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKLSAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgICAgICBpZiAoaW5mb0xlbikgewotICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgIEFMT0dFKCJQcm9ncmFtIGxpbmsgbG9nOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgfQotCi0gICAgKm91dFBnbSA9IHByb2dyYW07Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UsCi0gICAgICAgIEdMdWludCogb3V0U2hhZGVyKSB7Ci0gICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIEdMaW50IGNvbXBpbGVkID0gMDsKLSAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7Ci0gICAgaWYgKCFjb21waWxlZCkgewotICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgIEFMT0dFKCJTaGFkZXIgY29tcGlsZSBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgfQotICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICBzaGFkZXIgPSAwOwotICAgIH0KLSAgICAqb3V0U2hhZGVyID0gc2hhZGVyOwotfQotCi1OYXRpdmVXaW5kb3dSZW5kZXJlcjo6fk5hdGl2ZVdpbmRvd1JlbmRlcmVyKCkgewotICAgIENIRUNLKG1BY3RpdmVJbnB1dHMgPT0gMCk7Ci0gICAgc3RhcnRSZXF1ZXN0KENNRF9RVUlUKTsKLSAgICBzZW5kUmVxdWVzdCgpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpyZW5kZXIoUmVuZGVySW5wdXQqIGlucHV0KSB7Ci0gICAgc3A8R0xDb25zdW1lcj4gU1QgPSBpbnB1dC0+bVNUOwotICAgIHNwPFN1cmZhY2U+IFNUQyA9IGlucHV0LT5tU1RDOwotCi0gICAgaWYgKGlucHV0LT5tSXNFeHRlcm5hbEJ1ZmZlcikgewotICAgICAgICBxdWV1ZUV4dGVybmFsQnVmZmVyKFNUQy5nZXQoKSwgaW5wdXQtPm1CdWZmZXIsCi0gICAgICAgICAgICBpbnB1dC0+bVdpZHRoLCBpbnB1dC0+bUhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcXVldWVJbnRlcm5hbEJ1ZmZlcihTVEMuZ2V0KCksIGlucHV0LT5tQnVmZmVyKTsKLSAgICB9Ci0KLSAgICBTVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLSAgICBnbENsZWFyQ29sb3IoMCwgMCwgMCwgMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoaW5wdXQtPm1SZW5kZXJpbmdNb2RlLAotICAgICAgICBpbnB1dC0+bVdpZHRoLCBpbnB1dC0+bUhlaWdodCk7Ci0KLSAgICBjb25zdCBHTGZsb2F0IHRleHR1cmVDb29yZGluYXRlc1tdID0gewotICAgICAgICAgMC4wZiwgIDEuMGYsCi0gICAgICAgICAwLjBmLCAgMC4wZiwKLSAgICAgICAgIDEuMGYsICAwLjBmLAotICAgICAgICAgMS4wZiwgIDEuMGYsCi0gICAgfTsKLQotICAgIHVwZGF0ZVByb2dyYW1BbmRIYW5kbGUoaW5wdXQtPm1WaWRlb0VmZmVjdCk7Ci0KLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobVBvc2l0aW9uSGFuZGxlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsCi0gICAgICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVBvc2l0aW9uSGFuZGxlKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtVGV4UG9zSGFuZGxlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsCi0gICAgICAgIHRleHR1cmVDb29yZGluYXRlcyk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1UZXhQb3NIYW5kbGUpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgR0xmbG9hdCB0ZXhNYXRyaXhbMTZdOwotICAgIFNULT5nZXRUcmFuc2Zvcm1NYXRyaXgodGV4TWF0cml4KTsKLSAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobVRleE1hdHJpeEhhbmRsZSwgMSwgR0xfRkFMU0UsIHRleE1hdHJpeCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBpbnB1dC0+bVRleHR1cmVJZCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoCi0gICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKAotICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpxdWV1ZUludGVybmFsQnVmZmVyKEFOYXRpdmVXaW5kb3cgKmFudywKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyKSB7Ci0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAoYW53LCB0aW1lVXMgKiAxMDAwKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBhbnctPnF1ZXVlQnVmZmVyKGFudywgYnVmZmVyLT5ncmFwaGljQnVmZmVyKCkuZ2V0KCksIC0xKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgQUxPR0UoInF1ZXVlQnVmZmVyIGZhaWxlZCB3aXRoIGVycm9yICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YURhdGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOwotICAgIG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5UmVuZGVyZWQsIDEpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpxdWV1ZUV4dGVybmFsQnVmZmVyKEFOYXRpdmVXaW5kb3cqIGFudywKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGFudywgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7Ci0gICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYW53LCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKTsKLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICBDSEVDSyhOT19FUlJPUiA9PSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KGFudywgJmFuYikpOwotICAgIENIRUNLKGFuYiAhPSBOVUxMKTsKLQotICAgIC8vIENvcHkgdGhlIGJ1ZmZlcgotICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIGNvcHlJNDIwQnVmZmVyKGJ1ZmZlciwgaW1nLCB3aWR0aCwgaGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpKTsKLSAgICBidWYtPnVubG9jaygpOwotICAgIENIRUNLKE5PX0VSUk9SID09IGFudy0+cXVldWVCdWZmZXIoYW53LCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpLCAtMSkpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjb3B5STQyMEJ1ZmZlcihNZWRpYUJ1ZmZlciogc3JjLCB1aW50OF90KiBkc3QsCi0gICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHN0cmlkZSkgewotICAgIGludCBzdHJpZGVVViA9IChzdHJpZGUgLyAyICsgMHhmKSAmIH4weGY7Ci0gICAgdWludDhfdCogcCA9ICh1aW50OF90KilzcmMtPmRhdGEoKSArIHNyYy0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgLy8gWQotICAgIGZvciAoaW50IGkgPSBzcmNIZWlnaHQ7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgcCwgc3JjV2lkdGgpOwotICAgICAgICBkc3QgKz0gc3RyaWRlOwotICAgICAgICBwICs9IHNyY1dpZHRoOwotICAgIH0KLSAgICAvLyBUaGUgc3JjIGlzIEk0MjAsIHRoZSBkc3QgaXMgWVYxMi4KLSAgICAvLyBVCi0gICAgcCArPSBzcmNXaWR0aCAqIHNyY0hlaWdodCAvIDQ7Ci0gICAgZm9yIChpbnQgaSA9IHNyY0hlaWdodCAvIDI7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgcCwgc3JjV2lkdGggLyAyKTsKLSAgICAgICAgZHN0ICs9IHN0cmlkZVVWOwotICAgICAgICBwICs9IHNyY1dpZHRoIC8gMjsKLSAgICB9Ci0gICAgLy8gVgotICAgIHAgLT0gc3JjV2lkdGggKiBzcmNIZWlnaHQgLyAyOwotICAgIGZvciAoaW50IGkgPSBzcmNIZWlnaHQgLyAyOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIG1lbWNweShkc3QsIHAsIHNyY1dpZHRoIC8gMik7Ci0gICAgICAgIGRzdCArPSBzdHJpZGVVVjsKLSAgICAgICAgcCArPSBzcmNXaWR0aCAvIDI7Ci0gICAgfQotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp1cGRhdGVQcm9ncmFtQW5kSGFuZGxlKHVpbnQzMl90IHZpZGVvRWZmZWN0KSB7Ci0gICAgaWYgKG1MYXN0VmlkZW9FZmZlY3QgPT0gdmlkZW9FZmZlY3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1MYXN0VmlkZW9FZmZlY3QgPSB2aWRlb0VmZmVjdDsKLSAgICBpbnQgaTsKLSAgICBzd2l0Y2ggKG1MYXN0VmlkZW9FZmZlY3QpIHsKLSAgICAgICAgY2FzZSBWSURFT19FRkZFQ1RfTk9ORToKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9fRUZGRUNUX1NFUElBOgotICAgICAgICAgICAgaSA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT19FRkZFQ1RfTkVHQVRJVkU6Ci0gICAgICAgICAgICBpID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9HUkFESUVOVDoKLSAgICAgICAgICAgIGkgPSAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBnbFVzZVByb2dyYW0obVByb2dyYW1baV0pOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgbVBvc2l0aW9uSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbVtpXSwgInZQb3NpdGlvbiIpOwotICAgIG1UZXhQb3NIYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtW2ldLCAidlRleFBvcyIpOwotICAgIG1UZXhNYXRyaXhIYW5kbGUgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbVtpXSwgInRleE1hdHJpeCIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzKAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0KSB7Ci0gICAgZmxvYXQgeCwgeTsKLSAgICBzd2l0Y2ggKHJlbmRlcmluZ01vZGUpIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1Jlc2l6aW5nOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICB5ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00eFZTU19rQ3JvcHBpbmc6Ci0gICAgICAgICAgICB4ID0gZmxvYXQoc3JjV2lkdGgpIC8gbURzdFdpZHRoOwotICAgICAgICAgICAgeSA9IGZsb2F0KHNyY0hlaWdodCkgLyBtRHN0SGVpZ2h0OwotICAgICAgICAgICAgLy8gTWFrZSB0aGUgc21hbGxlciBzaWRlIDEKLSAgICAgICAgICAgIGlmICh4ID4geSkgewotICAgICAgICAgICAgICAgIHggLz0geTsKLSAgICAgICAgICAgICAgICB5ID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeSAvPSB4OwotICAgICAgICAgICAgICAgIHggPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTR4VlNTX2tCbGFja0JvcmRlcnM6Ci0gICAgICAgICAgICB4ID0gZmxvYXQoc3JjV2lkdGgpIC8gbURzdFdpZHRoOwotICAgICAgICAgICAgeSA9IGZsb2F0KHNyY0hlaWdodCkgLyBtRHN0SGVpZ2h0OwotICAgICAgICAgICAgLy8gTWFrZSB0aGUgbGFyZ2VyIHNpZGUgMQotICAgICAgICAgICAgaWYgKHggPiB5KSB7Ci0gICAgICAgICAgICAgICAgeSAvPSB4OwotICAgICAgICAgICAgICAgIHggPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4IC89IHk7Ci0gICAgICAgICAgICAgICAgeSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1swXSA9IC14OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzFdID0geTsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1syXSA9IC14OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzNdID0gLXk7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbNF0gPSB4OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzVdID0gLXk7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbNl0gPSB4OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzddID0geTsKLX0KLQotLy8KLS8vICBUaGUgZnVuY3Rpb25zIGJlbG93IHJ1biBpbiBvdGhlciB0aHJlYWRzLgotLy8KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6c3RhcnRSZXF1ZXN0KGludCBjbWQpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgd2hpbGUgKG1UaHJlYWRDbWQgIT0gQ01EX0lETEUpIHsKLSAgICAgICAgbUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotICAgIG1UaHJlYWRDbWQgPSBjbWQ7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnNlbmRSZXF1ZXN0KCkgewotICAgIG1Db25kLmJyb2FkY2FzdCgpOwotICAgIHdoaWxlIChtVGhyZWFkQ21kICE9IENNRF9JRExFKSB7Ci0gICAgICAgIG1Db25kLndhaXQobUxvY2spOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKLX0KLQotUmVuZGVySW5wdXQqIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjcmVhdGVSZW5kZXJJbnB1dCgpIHsKLSAgICBBTE9HRCgibmV3IHJlbmRlciBpbnB1dCAlZCIsIG1OZXh0VGV4dHVyZUlkKTsKLSAgICBSZW5kZXJJbnB1dCogaW5wdXQgPSBuZXcgUmVuZGVySW5wdXQodGhpcywgbU5leHRUZXh0dXJlSWQpOwotCi0gICAgc3RhcnRSZXF1ZXN0KENNRF9SRVNFUlZFX1RFWFRVUkUpOwotICAgIG1UaHJlYWRUZXh0dXJlSWQgPSBtTmV4dFRleHR1cmVJZDsKLSAgICBzZW5kUmVxdWVzdCgpOwotCi0gICAgbU5leHRUZXh0dXJlSWQrKzsKLSAgICBtQWN0aXZlSW5wdXRzKys7Ci0gICAgcmV0dXJuIGlucHV0OwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpkZXN0cm95UmVuZGVySW5wdXQoUmVuZGVySW5wdXQqIGlucHV0KSB7Ci0gICAgQUxPR0QoImRlc3Ryb3kgcmVuZGVyIGlucHV0ICVkIiwgaW5wdXQtPm1UZXh0dXJlSWQpOwotICAgIEdMdWludCB0ZXh0dXJlSWQgPSBpbnB1dC0+bVRleHR1cmVJZDsKLSAgICBkZWxldGUgaW5wdXQ7Ci0KLSAgICBzdGFydFJlcXVlc3QoQ01EX0RFTEVURV9URVhUVVJFKTsKLSAgICBtVGhyZWFkVGV4dHVyZUlkID0gdGV4dHVyZUlkOwotICAgIHNlbmRSZXF1ZXN0KCk7Ci0KLSAgICBtQWN0aXZlSW5wdXRzLS07Ci19Ci0KLS8vCi0vLyAgUmVuZGVySW5wdXQKLS8vCi0KLVJlbmRlcklucHV0OjpSZW5kZXJJbnB1dChOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIsIEdMdWludCB0ZXh0dXJlSWQpCi0gICAgOiBtUmVuZGVyZXIocmVuZGVyZXIpCi0gICAgLCBtVGV4dHVyZUlkKHRleHR1cmVJZCkgewotICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgIG1TVCA9IG5ldyBHTENvbnN1bWVyKGJxLCBtVGV4dHVyZUlkKTsKLSAgICBtU1RDID0gbmV3IFN1cmZhY2UoYnEpOwotICAgIG5hdGl2ZV93aW5kb3dfY29ubmVjdChtU1RDLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci19Ci0KLVJlbmRlcklucHV0Ojp+UmVuZGVySW5wdXQoKSB7Ci19Ci0KLUFOYXRpdmVXaW5kb3cqIFJlbmRlcklucHV0OjpnZXRUYXJnZXRXaW5kb3coKSB7Ci0gICAgcmV0dXJuIG1TVEMuZ2V0KCk7Ci19Ci0KLXZvaWQgUmVuZGVySW5wdXQ6OnVwZGF0ZVZpZGVvU2l6ZShzcDxNZXRhRGF0YT4gbWV0YSkgewotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtV2lkdGgpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1IZWlnaHQpKTsKLQotICAgIGludCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207Ci0gICAgaWYgKG1ldGEtPmZpbmRSZWN0KGtLZXlDcm9wUmVjdCwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKLSAgICAgICAgbVdpZHRoID0gcmlnaHQgLSBsZWZ0ICsgMTsKLSAgICAgICAgbUhlaWdodCA9IGJvdHRvbSAtIHRvcCArIDE7Ci0gICAgfQotCi0gICAgLy8gSWYgcm90YXRpb24gZGVncmVlcyBpcyA5MCBvciAyNzAsIHN3YXAgd2lkdGggYW5kIGhlaWdodAotICAgIC8vIChtV2lkdGggYW5kIG1IZWlnaHQgYXJlIHRoZSBfcm90YXRlZF8gc291cmNlIHJlY3RhbmdsZSkuCi0gICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7Ci0gICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwotICAgIH0KLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgewotICAgICAgICBpbnQgdG1wID0gbVdpZHRoOwotICAgICAgICBtV2lkdGggPSBtSGVpZ2h0OwotICAgICAgICBtSGVpZ2h0ID0gdG1wOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJJbnB1dDo6cmVuZGVyKE1lZGlhQnVmZmVyKiBidWZmZXIsIHVpbnQzMl90IHZpZGVvRWZmZWN0LAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwgYm9vbCBpc0V4dGVybmFsQnVmZmVyKSB7Ci0gICAgbVZpZGVvRWZmZWN0ID0gdmlkZW9FZmZlY3Q7Ci0gICAgbVJlbmRlcmluZ01vZGUgPSByZW5kZXJpbmdNb2RlOwotICAgIG1Jc0V4dGVybmFsQnVmZmVyID0gaXNFeHRlcm5hbEJ1ZmZlcjsKLSAgICBtQnVmZmVyID0gYnVmZmVyOwotCi0gICAgbVJlbmRlcmVyLT5zdGFydFJlcXVlc3QoTmF0aXZlV2luZG93UmVuZGVyZXI6OkNNRF9SRU5ERVJfSU5QVVQpOwotICAgIG1SZW5kZXJlci0+bVRocmVhZFJlbmRlcklucHV0ID0gdGhpczsKLSAgICBtUmVuZGVyZXItPnNlbmRSZXF1ZXN0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2YjRjYmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9OYXRpdmVXaW5kb3dSZW5kZXJlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE5BVElWRV9XSU5ET1dfUkVOREVSRVJfSF8KLSNkZWZpbmUgTkFUSVZFX1dJTkRPV19SRU5ERVJFUl9IXwotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotCi0vLyBUaGUgTmF0aXZlV2luZG93UmVuZGVyZXIgZHJhd3MgdmlkZW8gZnJhbWVzIHN0b3JlZCBpbiBNZWRpYUJ1ZmZlcnMgdG8KLS8vIGFuIEFOYXRpdmVXaW5kb3cuICBJdCBjYW4gYXBwbHkgInJlbmRlcmluZyBtb2RlIiBhbmQgY29sb3IgZWZmZWN0cyB0bwotLy8gdGhlIGZyYW1lcy4gIlJlbmRlcmluZyBtb2RlIiBpcyB0aGUgb3B0aW9uIHRvIGRvIHJlc2l6aW5nLCBjcm9wcGluZywKLS8vIG9yIGJsYWNrLWJvcmRlcmluZyB3aGVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFzcGVjdCByYXRpbyBhcmUKLS8vIGRpZmZlcmVudC4gQ29sb3IgZWZmZWN0cyBpbmNsdWRlIHNlcGlhLCBuZWdhdGl2ZSwgYW5kIGdyYWRpZW50LgotLy8KLS8vIFRoZSBpbnB1dCB0byBOYXRpdmVXaW5kb3dSZW5kZXJlciBpcyBwcm92aWRlZCBieSB0aGUgUmVuZGVySW5wdXQgY2xhc3MsCi0vLyBhbmQgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGFjdGl2ZSBSZW5kZXJJbnB1dCBhdCB0aGUgc2FtZSB0aW1lLiBBbHRob3VnaAotLy8gd2Ugb25seSBleHBlY3QgdGhhdCBoYXBwZW5zIGJyaWVmbHkgd2hlbiBvbmUgY2xpcCBpcyBhYm91dCB0byBmaW5pc2gKLS8vIGFuZCB0aGUgbmV4dCBjbGlwIGlzIGFib3V0IHRvIHN0YXJ0LgotLy8KLS8vIFdlIGFsbG9jYXRlIGEgU3VyZmFjZSBmb3IgZWFjaCBSZW5kZXJJbnB1dCBhbmQgdGhlIHVzZXIgY2FuIHVzZQotLy8gdGhlIGdldFRhcmdldFdpbmRvdygpIGZ1bmN0aW9uIHRvIGdldCB0aGUgY29ycmVzcG9uZGluZyBBTmF0aXZlV2luZG93Ci0vLyBmb3IgdGhhdCBTdXJmYWNlLiBUaGUgaW50ZW50aW9uIGlzIHRoYXQgdGhlIHVzZXIgY2FuIHBhc3MgdGhhdAotLy8gQU5hdGl2ZVdpbmRvdyB0byBPTVhDb2RlYzo6Q3JlYXRlKCkgc28gdGhlIGNvZGVjIGNhbiBkZWNvZGUgZGlyZWN0bHkKLS8vIHRvIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgdGhlIHRleHR1cmUuCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgR0xDb25zdW1lcjsKLWNsYXNzIFN1cmZhY2U7Ci1jbGFzcyBSZW5kZXJJbnB1dDsKLQotY2xhc3MgTmF0aXZlV2luZG93UmVuZGVyZXIgewotcHVibGljOgotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyKHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICB+TmF0aXZlV2luZG93UmVuZGVyZXIoKTsKLQotICAgIFJlbmRlcklucHV0KiBjcmVhdGVSZW5kZXJJbnB1dCgpOwotICAgIHZvaWQgZGVzdHJveVJlbmRlcklucHV0KFJlbmRlcklucHV0KiBpbnB1dCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gTm8gY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudAotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyKGNvbnN0IE5hdGl2ZVdpbmRvd1JlbmRlcmVyICYpOwotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgTmF0aXZlV2luZG93UmVuZGVyZXIgJik7Ci0KLSAgICAvLyBJbml0aWFsaXphdGlvbiBhbmQgZmluaWFsaXphdGlvbgotICAgIHZvaWQgaW5pdGlhbGl6ZUVHTCgpOwotICAgIHZvaWQgdGVybWluYXRlRUdMKCk7Ci0gICAgdm9pZCBjcmVhdGVQcm9ncmFtcygpOwotICAgIHZvaWQgY3JlYXRlUHJvZ3JhbSgKLSAgICAgICAgICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIsIEdMdWludCBmcmFnbWVudFNoYWRlciwgR0x1aW50KiBvdXRQZ20pOwotICAgIHZvaWQgbG9hZFNoYWRlcigKLSAgICAgICAgICAgIEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlLCBHTHVpbnQqIG91dFNoYWRlcik7Ci0KLSAgICAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGV2ZXJ5IGZyYW1lLgotICAgIHZvaWQgcmVuZGVyKFJlbmRlcklucHV0KiBpbnB1dCk7Ci0gICAgdm9pZCBxdWV1ZUludGVybmFsQnVmZmVyKEFOYXRpdmVXaW5kb3cqIGFudywgTWVkaWFCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgdm9pZCBxdWV1ZUV4dGVybmFsQnVmZmVyKEFOYXRpdmVXaW5kb3cqIGFudywgTWVkaWFCdWZmZXIqIGJ1ZmZlciwKLSAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgdm9pZCBjb3B5STQyMEJ1ZmZlcihNZWRpYUJ1ZmZlciogc3JjLCB1aW50OF90KiBkc3QsCi0gICAgICAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsIGludCBzdHJpZGUpOwotICAgIHZvaWQgdXBkYXRlUHJvZ3JhbUFuZEhhbmRsZSh1aW50MzJfdCB2aWRlb0VmZmVjdCk7Ci0gICAgdm9pZCBjYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzKE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0KTsKLQotICAgIC8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgb25jZSBhbmQgZG9lc24ndCBjaGFuZ2UgYWZ0ZXJ3YXJkcy4KLSAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIGludCBtRHN0V2lkdGgsIG1Ec3RIZWlnaHQ7Ci0gICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKLSAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOwotICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7Ci0gICAgZW51bSB7Ci0gICAgICAgIEVGRkVDVF9OT1JNQUwsCi0gICAgICAgIEVGRkVDVF9TRVBJQSwKLSAgICAgICAgRUZGRUNUX05FR0FUSVZFLAotICAgICAgICBFRkZFQ1RfR1JBRElFTlQsCi0gICAgICAgIE5VTUJFUl9PRl9FRkZFQ1RTCi0gICAgfTsKLSAgICBHTHVpbnQgbVByb2dyYW1bTlVNQkVSX09GX0VGRkVDVFNdOwotCi0gICAgLy8gV2UgdXNlIG9uZSBzaGFkZXIgcHJvZ3JhbSBmb3IgZWFjaCBlZmZlY3QuIG1MYXN0VmlkZW9FZmZlY3QgcmVtZW1iZXJzCi0gICAgLy8gdGhlIHByb2dyYW0gdXNlZCBmb3IgdGhlIGxhc3QgZnJhbWUuIHdoZW4gdGhlIGVmZmVjdCB1c2VkIGNoYW5nZXMsCi0gICAgLy8gd2UgY2hhbmdlIHRoZSBwcm9ncmFtIHVzZWQgYW5kIHVwZGF0ZSB0aGUgaGFuZGxlcy4KLSAgICB1aW50MzJfdCBtTGFzdFZpZGVvRWZmZWN0OwotICAgIEdMaW50IG1Qb3NpdGlvbkhhbmRsZTsKLSAgICBHTGludCBtVGV4UG9zSGFuZGxlOwotICAgIEdMaW50IG1UZXhNYXRyaXhIYW5kbGU7Ci0KLSAgICAvLyBUaGlzIGlzIHRoZSB2ZXJ0ZXggY29vcmRpbmF0ZXMgdXNlZCBmb3IgdGhlIGZyYW1lIHRleHR1cmUuCi0gICAgLy8gSXQncyBjYWxjdWxhdGVkIGFjY29yZGluZyB0aGUgdGhlIHJlbmRlcmluZyBtb2RlIGFuZCB0aGUgc291cmNlIGFuZAotICAgIC8vIGRlc3RpbmF0aW9uIGFzcGVjdCByYXRpby4KLSAgICBHTGZsb2F0IG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzhdOwotCi0gICAgLy8gV2UgdXNlIGEgZGlmZmVyZW50IEdMIGlkIGZvciBlYWNoIFN1cmZhY2UuCi0gICAgR0x1aW50IG1OZXh0VGV4dHVyZUlkOwotCi0gICAgLy8gTnVtYmVyIG9mIGV4aXN0aW5nIFJlbmRlcklucHV0cywganVzdCBmb3IgZGVidWdnaW5nLgotICAgIGludCBtQWN0aXZlSW5wdXRzOwotCi0gICAgLy8gVGhlIEdMIHRocmVhZCBmdW5jdGlvbnMKLSAgICBzdGF0aWMgaW50IHRocmVhZFN0YXJ0KHZvaWQqIHNlbGYpOwotICAgIHZvaWQgZ2xUaHJlYWQoKTsKLQotICAgIC8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRoZSBHTCB0aHJlYWQgYW5kCi0gICAgLy8gb3RoZXIgdGhyZWFkcy4KLSAgICBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbUNvbmQ7Ci0gICAgZW51bSB7Ci0gICAgICAgIENNRF9JRExFLAotICAgICAgICBDTURfUkVOREVSX0lOUFVULAotICAgICAgICBDTURfUkVTRVJWRV9URVhUVVJFLAotICAgICAgICBDTURfREVMRVRFX1RFWFRVUkUsCi0gICAgICAgIENNRF9RVUlULAotICAgIH07Ci0gICAgaW50IG1UaHJlYWRDbWQ7Ci0gICAgUmVuZGVySW5wdXQqIG1UaHJlYWRSZW5kZXJJbnB1dDsKLSAgICBHTHVpbnQgbVRocmVhZFRleHR1cmVJZDsKLQotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBzZW5kIGNvbW1hbmRzIHRvIHRoZSBHTCB0aHJlYWQuCi0gICAgLy8gc2VuZFJlcXVlc3QoKSBhbHNvIHdhaXRzIGZvciB0aGUgR0wgdGhyZWFkIGFja25vd2xlZGdlcyB0aGUKLSAgICAvLyBjb21tYW5kIGlzIGZpbmlzaGVkLgotICAgIHZvaWQgc3RhcnRSZXF1ZXN0KGludCBjbWQpOwotICAgIHZvaWQgc2VuZFJlcXVlc3QoKTsKLQotICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJJbnB1dDsKLX07Ci0KLWNsYXNzIFJlbmRlcklucHV0IHsKLXB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBBTmF0aXZlV2luZG93IGNvcnJlc3BvbmRzIHRvIHRoZSBTdXJmYWNlLgotICAgIEFOYXRpdmVXaW5kb3cqIGdldFRhcmdldFdpbmRvdygpOwotCi0gICAgLy8gVXBkYXRlcyB2aWRlbyBmcmFtZSBzaXplIGZyb20gdGhlIE1lZGlhU291cmNlJ3MgbWV0YWRhdGEuIFNwZWNpZmljYWxseQotICAgIC8vIHdlIGxvb2sgZm9yIGtLZXlXaWR0aCwga0tleUhlaWdodCwgYW5kIChvcHRpb25hbGx5KSBrS2V5Q3JvcFJlY3QuCi0gICAgdm9pZCB1cGRhdGVWaWRlb1NpemUoc3A8TWV0YURhdGE+IG1ldGEpOwotCi0gICAgLy8gUmVuZGVycyB0aGUgYnVmZmVyIHdpdGggdGhlIGdpdmVuIHZpZGVvIGVmZmVjdCBhbmQgcmVuZGluZyBtb2RlLgotICAgIC8vIFRoZSB2aWRlbyBlZmZldHMgYXJlIGRlZmluZWQgaW4gVmlkZW9FZGl0b3JUb29scy5oCi0gICAgLy8gU2V0IGlzRXh0ZXJuYWxCdWZmZXIgdG8gdHJ1ZSBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBnaXZlbiBpcyBub3QKLSAgICAvLyBwcm92aWRlZCBieSB0aGUgU3VyZmFjZS4KLSAgICB2b2lkIHJlbmRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50MzJfdCB2aWRlb0VmZmVjdCwKLSAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGUsIGJvb2wgaXNFeHRlcm5hbEJ1ZmZlcik7Ci1wcml2YXRlOgotICAgIFJlbmRlcklucHV0KE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlciwgR0x1aW50IHRleHR1cmVJZCk7Ci0gICAgflJlbmRlcklucHV0KCk7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIqIG1SZW5kZXJlcjsKLSAgICBHTHVpbnQgbVRleHR1cmVJZDsKLSAgICBzcDxHTENvbnN1bWVyPiBtU1Q7Ci0gICAgc3A8U3VyZmFjZT4gbVNUQzsKLSAgICBpbnQgbVdpZHRoLCBtSGVpZ2h0OwotCi0gICAgLy8gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZHVyaW5nIHJlbmRlcigpIGNhbGxzCi0gICAgdWludDMyX3QgbVZpZGVvRWZmZWN0OwotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtUmVuZGVyaW5nTW9kZTsKLSAgICBib29sIG1Jc0V4dGVybmFsQnVmZmVyOwotICAgIE1lZGlhQnVmZmVyKiBtQnVmZmVyOwotCi0gICAgZnJpZW5kIGNsYXNzIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBOQVRJVkVfV0lORE9XX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmJkOWY4NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJQcmV2aWV3UGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiRHVtbXlBdWRpb1NvdXJjZS5oIgotI2luY2x1ZGUgIkR1bW15VmlkZW9Tb3VyY2UuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclNSQy5oIgotI2luY2x1ZGUgIlByZXZpZXdQbGF5ZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0KLXZvaWQgYWRkQmF0dGVyeURhdGEodWludDMyX3QgcGFyYW1zKSB7Ci0gICAgc3A8SUJpbmRlcj4gYmluZGVyID0KLSAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKLSAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKLSAgICBDSEVDSyhzZXJ2aWNlLmdldCgpICE9IE5VTEwpOwotCi0gICAgc2VydmljZS0+YWRkQmF0dGVyeURhdGEocGFyYW1zKTsKLX0KLQotc3RydWN0IFByZXZpZXdQbGF5ZXJFdmVudCA6IHB1YmxpYyBUaW1lZEV2ZW50UXVldWU6OkV2ZW50IHsKLSAgICBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICBQcmV2aWV3UGxheWVyICpwbGF5ZXIsCi0gICAgICAgICAgICB2b2lkIChQcmV2aWV3UGxheWVyOjoqbWV0aG9kKSgpKQotICAgICAgICA6IG1QbGF5ZXIocGxheWVyKSwKLSAgICAgICAgICBtTWV0aG9kKG1ldGhvZCkgewotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflByZXZpZXdQbGF5ZXJFdmVudCgpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZmlyZShUaW1lZEV2ZW50UXVldWUgKnF1ZXVlLCBpbnQ2NF90IC8qIG5vd191cyAqLykgewotICAgICAgICAobVBsYXllci0+Km1NZXRob2QpKCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFByZXZpZXdQbGF5ZXIgKm1QbGF5ZXI7Ci0gICAgdm9pZCAoUHJldmlld1BsYXllcjo6Km1NZXRob2QpKCk7Ci0KLSAgICBQcmV2aWV3UGxheWVyRXZlbnQoY29uc3QgUHJldmlld1BsYXllckV2ZW50ICYpOwotICAgIFByZXZpZXdQbGF5ZXJFdmVudCAmb3BlcmF0b3I9KGNvbnN0IFByZXZpZXdQbGF5ZXJFdmVudCAmKTsKLX07Ci0KLVByZXZpZXdQbGF5ZXI6OlByZXZpZXdQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKQotICAgIDogbVF1ZXVlU3RhcnRlZChmYWxzZSksCi0gICAgICBtVGltZVNvdXJjZShOVUxMKSwKLSAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3KGZhbHNlKSwKLSAgICAgIG1BdWRpb1BsYXllcihOVUxMKSwKLSAgICAgIG1EaXNwbGF5V2lkdGgoMCksCi0gICAgICBtRGlzcGxheUhlaWdodCgwKSwKLSAgICAgIG1GbGFncygwKSwKLSAgICAgIG1FeHRyYWN0b3JGbGFncygwKSwKLSAgICAgIG1WaWRlb0J1ZmZlcihOVUxMKSwKLSAgICAgIG1MYXN0VmlkZW9UaW1lVXMoLTEpLAotICAgICAgbU5hdGl2ZVdpbmRvd1JlbmRlcmVyKHJlbmRlcmVyKSwKLSAgICAgIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4KDApLAotICAgICAgbUZyYW1lUkdCQnVmZmVyKE5VTEwpLAotICAgICAgbUZyYW1lWVVWQnVmZmVyKE5VTEwpIHsKLQotICAgIENIRUNLX0VRKG1DbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOwotICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7Ci0KLQotICAgIG1WaWRlb1JlbmRlcmVyID0gTlVMTDsKLSAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsKLSAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotICAgIG1BdWRpb01peFN0b3J5Qm9hcmRUUyA9IDA7Ci0gICAgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlID0gMDsKLSAgICBtTnVtYmVyRWZmZWN0cyA9IDA7Ci0gICAgbURlY29kZWRWaWRlb1RzID0gMDsKLSAgICBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQgPSAwOwotICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLSAgICBtUHJvZ3Jlc3NDYkludGVydmFsID0gMDsKLSAgICBtTnVtYmVyRGVjVmlkZW9GcmFtZXMgPSAwOwotICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9IHRydWU7Ci0KLSAgICBtVmlkZW9FdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uVmlkZW9FdmVudCk7Ci0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVZpZGVvTGFnRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KHRoaXMsICZQcmV2aWV3UGxheWVyOjpvblZpZGVvTGFnVXBkYXRlKTsKLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCgKLSAgICAgICAgICAgIHRoaXMsICZQcmV2aWV3UGxheWVyOjpvbkNoZWNrQXVkaW9TdGF0dXMpOwotICAgIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1TdHJlYW1Eb25lRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KAotICAgICAgICAgICAgdGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uU3RyZWFtRG9uZSk7Ci0gICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUHJvZ3Jlc3NDYkV2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCh0aGlzLAotICAgICAgICAgJlByZXZpZXdQbGF5ZXI6Om9uUHJvZ3Jlc3NDYkV2ZW50KTsKLQotICAgIG1PdmVybGF5VXBkYXRlRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KHRoaXMsCi0gICAgICAgICZQcmV2aWV3UGxheWVyOjpvblVwZGF0ZU92ZXJsYXlFdmVudCk7Ci0gICAgbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVJlbmRlcmluZ01vZGUgPSAoTTR4VlNTX01lZGlhUmVuZGVyaW5nKU1FRElBX1JFTkRFUklOR19JTlZBTElEOwotICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gZmFsc2U7Ci0gICAgcmVzZXQoKTsKLX0KLQotUHJldmlld1BsYXllcjo6flByZXZpZXdQbGF5ZXIoKSB7Ci0KLSAgICBpZiAobVF1ZXVlU3RhcnRlZCkgewotICAgICAgICBtUXVldWUuc3RvcCgpOwotICAgIH0KLQotICAgIHJlc2V0KCk7Ci0KLSAgICBpZiAobVZpZGVvUmVuZGVyZXIpIHsKLSAgICAgICAgbU5hdGl2ZVdpbmRvd1JlbmRlcmVyLT5kZXN0cm95UmVuZGVySW5wdXQobVZpZGVvUmVuZGVyZXIpOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBjbGVhcl9sKCk7Ci0gICAgbUNsaWVudC5kaXNjb25uZWN0KCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6Y2FuY2VsUGxheWVyRXZlbnRzX2woYm9vbCB1cGRhdGVQcm9ncmVzc0NiKSB7Ci0gICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1WaWRlb0V2ZW50LT5ldmVudElEKCkpOwotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtU3RyZWFtRG9uZUV2ZW50LT5ldmVudElEKCkpOwotICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1WaWRlb0xhZ0V2ZW50LT5ldmVudElEKCkpOwotICAgIG1WaWRlb0xhZ0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIGlmICh1cGRhdGVQcm9ncmVzc0NiKSB7Ci0gICAgICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtUHJvZ3Jlc3NDYkV2ZW50LT5ldmVudElEKCkpOwotICAgICAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKHBhdGgpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlX2woY29uc3QgY2hhciAqcGF0aCkgewotICAgIHJlc2V0X2woKTsKLQotICAgIG1VcmkgPSBwYXRoOwotCi0gICAgLy8gVGhlIGFjdHVhbCB3b3JrIHdpbGwgYmUgZG9uZSBkdXJpbmcgcHJlcGFyYXRpb24gaW4gdGhlIGNhbGwgdG8KLSAgICAvLyA6OmZpbmlzaFNldERhdGFTb3VyY2VfbCB0byBhdm9pZCBibG9ja2luZyB0aGUgY2FsbGluZyB0aHJlYWQgaW4KLSAgICAvLyBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2VfbChjb25zdCBzcDxNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3RvcikgewotICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7Ci0gICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgKytpKSB7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIWhhdmVWaWRlbyAmJiAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICBzZXRWaWRlb1NvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKLSAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWhhdmVBdWRpbyAmJiAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7Ci0gICAgICAgICAgICBzZXRBdWRpb1NvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKLSAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGZvciB2b3JiaXMgYXVkaW8sIG5vbmUgb2YgdGhlIG90aGVyIGF1ZGlvCi0gICAgICAgICAgICAgICAgLy8gZm9ybWF0cyBldmVuIHN1cHBvcnQgdGhpcyByaW5ndG9uZSBzcGVjaWZpYyBoYWNrIGFuZAotICAgICAgICAgICAgICAgIC8vIHJldHJpZXZpbmcgdGhlIG1ldGFkYXRhIG9uIHNvbWUgZXh0cmFjdG9ycyBtYXkgdHVybiBvdXQKLSAgICAgICAgICAgICAgICAvLyB0byBiZSB2ZXJ5IGV4cGVuc2l2ZS4KLSAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsb29wOwotICAgICAgICAgICAgICAgIGlmIChmaWxlTWV0YSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlBdXRvTG9vcCwgJmxvb3ApCi0gICAgICAgICAgICAgICAgICAgICAgICAgJiYgbG9vcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVVRPX0xPT1BJTkc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhdmVBdWRpbyAmJiBoYXZlVmlkZW8pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQWRkIHRoZSBzdXBwb3J0IGZvciBEdW1teSBhdWRpbyovCi0gICAgaWYoICFoYXZlQXVkaW8gKXsKLSAgICAgICAgbUF1ZGlvVHJhY2sgPSBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoMzIwMDAsIDIsIDIwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobVBsYXlFbmRUaW1lTXNlYykqMTAwMExMKSk7Ci0gICAgICAgIGlmKG1BdWRpb1RyYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWhhdmVBdWRpbyAmJiAhaGF2ZVZpZGVvKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1FeHRyYWN0b3JGbGFncyA9IGV4dHJhY3Rvci0+ZmxhZ3MoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2VfbF9qcGcoKSB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2VfbF9qcGciKTsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgbUF1ZGlvU291cmNlID0gRHVtbXlBdWRpb1NvdXJjZTo6Q3JlYXRlKDMyMDAwLCAyLCAyMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobVBsYXlFbmRUaW1lTXNlYykqMTAwMExMKSk7Ci0gICAgaWYobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgc2V0QXVkaW9Tb3VyY2UobUF1ZGlvU291cmNlKTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyb3IgPSBtQXVkaW9Tb3VyY2UtPnN0YXJ0KCk7Ci0gICAgaWYgKGVycm9yICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvciBzdGFydGluZyBkdW1teSBhdWRpbyBzb3VyY2UiKTsKLSAgICAgICAgbUF1ZGlvU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbUR1cmF0aW9uVXMgPSAobVBsYXlFbmRUaW1lTXNlYyAtIG1QbGF5QmVnaW5UaW1lTXNlYykqMTAwMExMOwotCi0gICAgbVZpZGVvU291cmNlID0gRHVtbXlWaWRlb1NvdXJjZTo6Q3JlYXRlKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvblVzLCBtVXJpKTsKLQotICAgIHVwZGF0ZVNpemVUb1JlbmRlcihtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLSAgICBzZXRWaWRlb1NvdXJjZShtVmlkZW9Tb3VyY2UpOwotICAgIHN0YXR1c190IGVycjEgPSBtVmlkZW9Tb3VyY2UtPnN0YXJ0KCk7Ci0gICAgaWYgKGVycjEgIT0gT0spIHsKLSAgICAgICAgbVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbUlzVmlkZW9Tb3VyY2VKcGcgPSB0cnVlOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpyZXNldF9sKCkgewotCi0gICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7Ci0gICAgfQotCi0gICAgd2hpbGUgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICBtUHJlcGFyZWRDb25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgY2FuY2VsUGxheWVyRXZlbnRzX2woKTsKLSAgICBtQXVkaW9UcmFjay5jbGVhcigpOwotICAgIG1WaWRlb1RyYWNrLmNsZWFyKCk7Ci0KLSAgICAvLyBTaHV0ZG93biBhdWRpbyBmaXJzdCwgc28gdGhhdCB0aGUgcmVzcG9uZSB0byB0aGUgcmVzZXQgcmVxdWVzdAotICAgIC8vIGFwcGVhcnMgdG8gaGFwcGVuIGluc3RhbnRhbmVvdXNseSBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkCi0gICAgLy8gSWYgd2UgZGlkIHRoaXMgbGF0ZXIsIGF1ZGlvIHdvdWxkIGNvbnRpbnVlIHBsYXlpbmcgd2hpbGUgd2UKLSAgICAvLyBzaHV0ZG93biB0aGUgdmlkZW8tcmVsYXRlZCByZXNvdXJjZXMgYW5kIHRoZSBwbGF5ZXIgYXBwZWFyIHRvCi0gICAgLy8gbm90IGJlIGFzIHJlc3BvbnNpdmUgdG8gYSByZXNldCByZXF1ZXN0LgotICAgIGlmIChtQXVkaW9QbGF5ZXIgPT0gTlVMTCAmJiBtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyBJZiB3ZSBoYWQgYW4gYXVkaW8gcGxheWVyLCBpdCB3b3VsZCBoYXZlIGVmZmVjdGl2ZWx5Ci0gICAgICAgIC8vIHRha2VuIHBvc3Nlc3Npb24gb2YgdGhlIGF1ZGlvIHNvdXJjZSBhbmQgc3RvcHBlZCBpdCB3aGVuCi0gICAgICAgIC8vIF9pdF8gaXMgc3RvcHBlZC4gT3RoZXJ3aXNlIHRoaXMgaXMgc3RpbGwgb3VyIHJlc3BvbnNpYmlsaXR5LgotICAgICAgICBtQXVkaW9Tb3VyY2UtPnN0b3AoKTsKLSAgICB9Ci0gICAgbUF1ZGlvU291cmNlLmNsZWFyKCk7Ci0KLSAgICBtVGltZVNvdXJjZSA9IE5VTEw7Ci0KLSAgICAvL1NpbmdsZSBhdWRpbyBwbGF5ZXIgaW5zdGFuY2UgdXNlZAotICAgIC8vU28gZG9ub3QgZGVsZXRlIGl0IGhlcmUKLSAgICAvL0l0IGlzIGRlbGV0ZWQgZnJvbSBQcmV2aWV3Q29udHJvbGxlciBjbGFzcwotICAgIC8vZGVsZXRlIG1BdWRpb1BsYXllcjsKLSAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotCi0gICAgaWYgKG1WaWRlb0J1ZmZlcikgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvU291cmNlLT5zdG9wKCk7Ci0KLSAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBoYWNrIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgT01YCi0gICAgICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAgICAgLy8gdG8gaW5zdGFudGlhdGUgaXQgYWdhaW4uCi0gICAgICAgIHdwPE1lZGlhU291cmNlPiB0bXAgPSBtVmlkZW9Tb3VyY2U7Ci0gICAgICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgICAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1c2xlZXAoMTAwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLQotICAgIG1EdXJhdGlvblVzID0gLTE7Ci0gICAgbUZsYWdzID0gMDsKLSAgICBtRXh0cmFjdG9yRmxhZ3MgPSAwOwotICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gLTE7Ci0gICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gMDsKLSAgICBtVmlkZW9UaW1lVXMgPSAwOwotCi0gICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gMDsKLQotICAgIG1Vcmkuc2V0VG8oIiIpOwotCi0gICAgbUN1cnJlbnRWaWRlb0VmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgIG1Jc1ZpZGVvU291cmNlSnBnID0gZmFsc2U7Ci0gICAgbUZyYW1lUkdCQnVmZmVyID0gTlVMTDsKLSAgICBpZihtRnJhbWVZVVZCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1GcmFtZVlVVkJ1ZmZlcik7Ci0gICAgICAgIG1GcmFtZVlVVkJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwbGF5KCkgewotICAgIEFMT0dWKCJwbGF5Iik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47Ci0gICAgbUZsYWdzICY9IH5JTkZPUk1FRF9BVl9FT1M7Ci0gICAgcmV0dXJuIHBsYXlfbCgpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzdGFydEF1ZGlvUGxheWVyX2woKSB7Ci0gICAgQUxPR1YoInN0YXJ0QXVkaW9QbGF5ZXJfbCIpOwotICAgIENIRUNLKCEobUZsYWdzICYgQVVESU9fUlVOTklORykpOwotCi0gICAgaWYgKG1BdWRpb1NvdXJjZSA9PSBOVUxMIHx8IG1BdWRpb1BsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoIShtRmxhZ3MgJiBBVURJT1BMQVlFUl9TVEFSVEVEKSkgewotICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKLQotICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IHN0YXJ0ZWQgdGhlIE1lZGlhU291cmNlIGluIG9yZGVyIHRvIGVuYWJsZQotICAgICAgICAvLyB0aGUgcHJlZmV0Y2hlciB0byByZWFkIGl0cyBkYXRhLgotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9QbGF5ZXItPnN0YXJ0KAotICAgICAgICAgICAgICAgIHRydWUgLyogc291cmNlQWxyZWFkeVN0YXJ0ZWQgKi8pOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gQVVESU9fUlVOTklORzsKLQotICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpIHsKLSAgICBBTE9HVigic2V0QXVkaW9QbGF5ZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIENIRUNLKCEobUZsYWdzICYgUExBWUlORykpOwotICAgIG1BdWRpb1BsYXllciA9IGF1ZGlvUGxheWVyOwotCi0gICAgQUxPR1YoIlNldEF1ZGlvUGxheWVyIik7Ci0gICAgbUlzQ2hhbmdlU291cmNlUmVxdWlyZWQgPSB0cnVlOwotCi0gICAgLy8gY2hlY2sgaWYgdGhlIG5ldyBhbmQgb2xkIHNvdXJjZSBhcmUgZHVtbXkKLSAgICBzcDxNZWRpYVNvdXJjZT4gYW5BdWRpb1NvdXJjZSA9IG1BdWRpb1BsYXllci0+Z2V0U291cmNlKCk7Ci0gICAgaWYgKGFuQXVkaW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAvLyBBdWRpbyBwbGF5ZXIgZG9lcyBub3QgaGF2ZSBhbnkgc291cmNlIHNldC4KLSAgICAgICAgQUxPR1YoInNldEF1ZGlvUGxheWVyOiBBdWRpbyBwbGF5ZXIgZG9lcyBub3QgaGF2ZSBhbnkgc291cmNlIHNldCIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gSWYgbmV3IHZpZGVvIHNvdXJjZSBpcyBub3QgZHVtbXksIHRoZW4gYWx3YXlzIGNoYW5nZSBzb3VyY2UKLSAgICAvLyBFbHNlIGF1ZGlvIHBsYXllciBjb250aW51ZXMgdXNpbmcgb2xkIGF1ZGlvIHNvdXJjZSBhbmQgdGhlcmUgYXJlCi0gICAgLy8gZnJhbWUgZHJvcHMgdG8gbWFpbnRhaW4gQVYgc3luYwotICAgIHNwPE1ldGFEYXRhPiBtZXRhOwotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgY29uc3QgY2hhciAqcFZpZFNyY1R5cGU7Ci0gICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJnBWaWRTcmNUeXBlKSkgewotICAgICAgICAgICAgaWYgKHN0cmNtcChwVmlkU3JjVHlwZSwgIkR1bW15VmlkZW9Tb3VyY2UiKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiBWaWRlbyBjbGlwIHdpdGggc2lsZW50IGF1ZGlvOyBuZWVkIHRvIGNoYW5nZSBzb3VyY2UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyICpwU3JjVHlwZTE7Ci0gICAgY29uc3QgY2hhciAqcFNyY1R5cGUyOwotICAgIG1ldGEgPSBhbkF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJnBTcmNUeXBlMSkpIHsKLSAgICAgICAgaWYgKHN0cmNtcChwU3JjVHlwZTEsICJEdW1teUF1ZGlvU291cmNlIikgPT0gMCkgewotICAgICAgICAgICAgbWV0YSA9IG1BdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZwU3JjVHlwZTIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwU3JjVHlwZTIsICJEdW1teUF1ZGlvU291cmNlIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHNldCB0aGUgbmV3IHBsYXkgZHVyYXRpb24gZm9yIHRoZSBleGlzdGluZyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2UgKnBNZWRpYVNyYyA9IGFuQXVkaW9Tb3VyY2UuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIER1bW15QXVkaW9Tb3VyY2UgKnBEdW1teUF1ZGlvU291cmNlID0gKER1bW15QXVkaW9Tb3VyY2UqKXBNZWRpYVNyYzsKLSAgICAgICAgICAgICAgICAgICAgLy9JbmNyZW1lbnQgdGhlIGR1cmF0aW9uIG9mIGF1ZGlvIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICBwRHVtbXlBdWRpb1NvdXJjZS0+c2V0RHVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkoKG1QbGF5RW5kVGltZU1zZWMpKjEwMDBMTCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIG5ldyBhdWRpbyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgY29udGludWUgdXNpbmcgb2xkIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0QXVkaW9QbGF5ZXI6IHN0b3AgbmV3IGF1ZGlvIHNvdXJjZSIpOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25TdHJlYW1Eb25lKCkgewotICAgIEFMT0dWKCJvblN0cmVhbURvbmUiKTsKLSAgICAvLyBQb3N0ZWQgd2hlbmV2ZXIgYW55IHN0cmVhbSBmaW5pc2hlcyBwbGF5aW5nLgotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGlmIChtU3RyZWFtRG9uZVN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgIEFMT0dWKCJNRURJQV9FUlJPUiAlZCIsIG1TdHJlYW1Eb25lU3RhdHVzKTsKLQotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBtU3RyZWFtRG9uZVN0YXR1cyk7Ci0KLSAgICAgICAgcGF1c2VfbCh0cnVlIC8qIGF0IGVvcyAqLyk7Ci0KLSAgICAgICAgbUZsYWdzIHw9IEFUX0VPUzsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IGJvb2wgYWxsRG9uZSA9Ci0gICAgICAgIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCB8fCAobUZsYWdzICYgVklERU9fQVRfRU9TKSkKLSAgICAgICAgICAgICYmIChtQXVkaW9Tb3VyY2UgPT0gTlVMTCB8fCAobUZsYWdzICYgQVVESU9fQVRfRU9TKSk7Ci0KLSAgICBpZiAoIWFsbERvbmUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtRmxhZ3MgJiAoTE9PUElORyB8IEFVVE9fTE9PUElORykpIHsKLSAgICAgICAgc2Vla1RvX2woMCk7Ci0KLSAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTUVESUFfUExBWUJBQ0tfQ09NUExFVEUiKTsKLSAgICAgICAgLy9wYXVzZSBiZWZvcmUgc2VuZGluZyBldmVudAotICAgICAgICBwYXVzZV9sKHRydWUgLyogYXQgZW9zICovKTsKLQotICAgICAgICAvL1RoaXMgbG9jayBpcyB1c2VkIHRvIHN5bmNyb25pemUgb25TdHJlYW1Eb25lKCkgaW4gUHJldmlld1BsYXllciBhbmQKLSAgICAgICAgLy9zdG9wUHJldmlldygpIGluIFByZXZpZXdDb250cm9sbGVyCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9ja0NvbnRyb2wpOwotICAgICAgICAvKiBNYWtlIHN1cmUgUHJldmlld1BsYXllciBvbmx5IG5vdGlmaWVzIE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIG9uY2UgZm9yIGVhY2ggY2xpcCEKLSAgICAgICAgICogSXQgaGFwcGVucyB0d2ljZSBpbiBmb2xsb3dpbmcgc2NlbmFyaW8uCi0gICAgICAgICAqIFRvIG1ha2UgdGhlIGNsaXBzIGluIHByZXZpZXcgc3Rvcnlib2FyZCBhcmUgcGxheWVkIGFuZCBzd2l0Y2hlZCBzbW9vdGhseSwKLSAgICAgICAgICogUHJldmlld0NvbnRyb2xsZXIgdXNlcyB0d28gUHJldmlld1BsYXllciBpbnN0YW5jZXMgYW5kIG9uZSBBdWRpb1BsYXllci4KLSAgICAgICAgICogVGhlIHR3byBQcmV2aWV3UGxheWVyIHVzZSB0aGUgc2FtZSBBdWRpb1BsYXllciB0byBwbGF5IHRoZSBhdWRpbywKLSAgICAgICAgICogYW5kIGNoYW5nZSB0aGUgYXVkaW8gc291cmNlIG9mIHRoZSBBdWRpb1BsYXllci4KLSAgICAgICAgICogSWYgdGhlIGF1ZGlvIHNvdXJjZSBvZiBjdXJyZW50IHBsYXlpbmcgY2xpcCBhbmQgbmV4dCBjbGlwIGFyZSBkdW1teQotICAgICAgICAgKiBhdWRpbyBzb3VyY2UoaW1hZ2Ugb3IgdmlkZW8gd2l0aG91dCBhdWRpbyksIGl0IHdpbGwgbm90IGNoYW5nZSB0aGUgYXVkaW8gc291cmNlCi0gICAgICAgICAqIHRvIGF2b2lkIHRoZSAiYXVkaW8gZ2xpdGNoIiwgYW5kIGtlZXAgdXNpbmcgdGhlIGN1cnJlbnQgYXVkaW8gc291cmNlLgotICAgICAgICAgKiBXaGVuIHRoZSB2aWRlbyBvZiBjdXJyZW50IGNsaXAgcmVhY2hlZCB0aGUgRU9TLCBQcmV2aWV3UGxheWVyIHdpbGwgc2V0IEVPUyBmbGFnCi0gICAgICAgICAqIGZvciB2aWRlbyBhbmQgYXVkaW8sIGFuZCBpdCB3aWxsIG5vdGlmeSBNRURJQV9QTEFZQkFDS19DT01QTEVURS4KLSAgICAgICAgICogQnV0IHRoZSBhdWRpbyhkdW1teSBhdWRpbyBzb3VyY2UpIGlzIHN0aWxsIHBsYXlpbmcoZm9yIG5leHQgY2xpcCksCi0gICAgICAgICAqIGFuZCB3aGVuIGl0IHJlYWNoZWQgdGhlIEVPUywgYW5kIHZpZGVvIHJlYWNoZWQgRU9TLAotICAgICAgICAgKiBQcmV2aWV3UGxheWVyIHdpbGwgbm90aWZ5IE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIGFnYWluLiAqLwotICAgICAgICBpZiAoIShtRmxhZ3MgJiBJTkZPUk1FRF9BVl9FT1MpKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFKTsKLSAgICAgICAgICAgIG1GbGFncyB8PSBJTkZPUk1FRF9BVl9FT1M7Ci0gICAgICAgIH0KLSAgICAgICAgbUZsYWdzIHw9IEFUX0VPUzsKLSAgICAgICAgQUxPR1YoIm9uU3RyZWFtRG9uZSBlbmQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwbGF5X2woKSB7Ci0gICAgQUxPR1YoInBsYXlfbCIpOwotCi0gICAgbUZsYWdzICY9IH5TRUVLX1BSRVZJRVc7Ci0KLSAgICBpZiAobUZsYWdzICYgUExBWUlORykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIG1TdGFydE5leHRQbGF5ZXIgPSBmYWxzZTsKLQotICAgIGlmICghKG1GbGFncyAmIFBSRVBBUkVEKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBwcmVwYXJlX2woKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbUZsYWdzIHw9IFBMQVlJTkc7Ci0gICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOwotCi0gICAgYm9vbCBkZWZlcnJlZEF1ZGlvU2VlayA9IGZhbHNlOwotCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gbmV3IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIobUF1ZGlvU2luaywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRTb3VyY2UobUF1ZGlvU291cmNlKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgICAgICAgICAgICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTLCBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgICAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUpOwotCi0gICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOwotICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgc3RhcnRlZCB0aGUgTWVkaWFTb3VyY2UgaW4gb3JkZXIgdG8gZW5hYmxlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByZWZldGNoZXIgdG8gcmVhZCBpdHMgZGF0YS4KLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9QbGF5ZXItPnN0YXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIG1BdWRpb1BsYXllcjsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfihQTEFZSU5HIHwgRklSU1RfRlJBTUUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1UaW1lU291cmNlID0gbUF1ZGlvUGxheWVyOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT19SVU5OSU5HOwotICAgICAgICAgICAgICAgIGRlZmVycmVkQXVkaW9TZWVrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvb2wgaXNBdWRpb1BsYXllclN0YXJ0ZWQgPSBtQXVkaW9QbGF5ZXItPmlzU3RhcnRlZCgpOwotCi0gICAgICAgICAgICBpZiAobUlzQ2hhbmdlU291cmNlUmVxdWlyZWQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJwbGF5X2w6IENoYW5nZSBhdWRpbyBzb3VyY2UgcmVxdWlyZWQiKTsKLQotICAgICAgICAgICAgICAgIGlmIChpc0F1ZGlvUGxheWVyU3RhcnRlZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldFNvdXJjZShtQXVkaW9Tb3VyY2UpOwotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgIG1QcmV2aWV3UGxheWVyQXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFN0b3J5Qm9hcmRUUywgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlKTsKLQotICAgICAgICAgICAgICAgIGlmIChpc0F1ZGlvUGxheWVyU3RhcnRlZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1BsYXllci0+c3RhcnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfihQTEFZSU5HIHwgRklSU1RfRlJBTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInBsYXlfbDogTm8gU291cmNlIGNoYW5nZSByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTLCBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPUExBWUVSX1NUQVJURUQ7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9fUlVOTklORzsKLSAgICAgICAgICAgIG1UaW1lU291cmNlID0gbUF1ZGlvUGxheWVyOwotICAgICAgICAgICAgZGVmZXJyZWRBdWRpb1NlZWsgPSB0cnVlOwotICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtVGltZVNvdXJjZSA9PSBOVUxMICYmIG1BdWRpb1BsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgIG1UaW1lU291cmNlID0gJm1TeXN0ZW1UaW1lU291cmNlOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgc2VlayBvcHRpb24gZm9yIEltYWdlIHNvdXJjZSBmaWxlcyBhbmQgcmVhZC4KLSAgICAvLyBUaGlzIHJlc2V0cyB0aGUgdGltZXN0YW1waW5nIGZvciBpbWFnZSBwbGF5Ci0gICAgaWYgKG1Jc1ZpZGVvU291cmNlSnBnKSB7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICBNZWRpYUJ1ZmZlciAqYUxvY2FsQnVmZmVyOwotICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcyk7Ci0gICAgICAgIG1WaWRlb1NvdXJjZS0+cmVhZCgmYUxvY2FsQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgIGFMb2NhbEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIH0KLQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyBLaWNrIG9mZiB2aWRlbyBwbGF5YmFjawotICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7Ci0gICAgfQotCi0gICAgaWYgKGRlZmVycmVkQXVkaW9TZWVrKSB7Ci0gICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHNlZWsgcmVxdWVzdCB3aGlsZSB3ZSB3ZXJlIHBhdXNlZAotICAgICAgICAvLyBhbmQgd2UncmUganVzdCBzdGFydGluZyB1cCBhZ2FpbiwgaG9ub3IgdGhlIHJlcXVlc3Qgbm93LgotICAgICAgICBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIEFUX0VPUykgewotICAgICAgICAvLyBMZWdhY3kgYmVoYXZpb3VyLCBpZiBhIHN0cmVhbSBmaW5pc2hlcyBwbGF5aW5nIGFuZCB0aGVuCi0gICAgICAgIC8vIGlzIHN0YXJ0ZWQgYWdhaW4sIHdlIHBsYXkgZnJvbSB0aGUgc3RhcnQuLi4KLSAgICAgICAgc2Vla1RvX2woMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmluaXRSZW5kZXJlcl9sKCkgewotICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmKG1WaWRlb1JlbmRlcmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbU5hdGl2ZVdpbmRvd1JlbmRlcmVyLT5jcmVhdGVSZW5kZXJJbnB1dCgpOwotICAgICAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZWVrVG8oaW50NjRfdCB0aW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICgobUV4dHJhY3RvckZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLKSB8fCAobUlzVmlkZW9Tb3VyY2VKcGcpKSB7Ci0gICAgICAgIHJldHVybiBzZWVrVG9fbCh0aW1lVXMpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXRWaWRlb0RpbWVuc2lvbnMoCi0gICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1WaWRlb1dpZHRoIDwgMCB8fCBtVmlkZW9IZWlnaHQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgICp3aWR0aCA9IG1WaWRlb1dpZHRoOwotICAgICpoZWlnaHQgPSBtVmlkZW9IZWlnaHQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6aW5pdEF1ZGlvRGVjb2Rlcl9sKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpIHsKLSAgICAgICAgbUF1ZGlvU291cmNlID0gbUF1ZGlvVHJhY2s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGFSYXdTb3VyY2U7Ci0gICAgICAgIGFSYXdTb3VyY2UgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIG1DbGllbnQuaW50ZXJmYWNlKCksIG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgLy8gY3JlYXRlRW5jb2RlcgotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrKTsKLQotICAgICAgICBpZihhUmF3U291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1BdWRpb1NvdXJjZSA9IG5ldyBWaWRlb0VkaXRvclNSQyhhUmF3U291cmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgIGlmIChtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICAgICAgc2V0RHVyYXRpb25fbChkdXJhdGlvblVzKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbUF1ZGlvU291cmNlLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCkpIHsKLSAgICAgICAgLy8gRm9yIGxlZ2FjeSByZWFzb25zIHdlJ3JlIHNpbXBseSBnb2luZyB0byBpZ25vcmUgdGhlIGFic2VuY2UKLSAgICAgICAgLy8gb2YgYW4gYXVkaW8gZGVjb2RlciBmb3IgUUNFTFAgaW5zdGVhZCBvZiBhYm9ydGluZyBwbGF5YmFjawotICAgICAgICAvLyBhbHRvZ2V0aGVyLgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1BdWRpb1NvdXJjZSAhPSBOVUxMID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjppbml0VmlkZW9EZWNvZGVyX2wodWludDMyX3QgZmxhZ3MpIHsKLSAgICBpbml0UmVuZGVyZXJfbCgpOwotCi0gICAgaWYgKG1WaWRlb1JlbmRlcmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgcmVuZGVyZXIiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbVZpZGVvU291cmNlID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgIG1DbGllbnQuaW50ZXJmYWNlKCksIG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgbVZpZGVvVHJhY2ssCi0gICAgICAgICAgICBOVUxMLCBmbGFncywgbVZpZGVvUmVuZGVyZXItPmdldFRhcmdldFdpbmRvdygpKTsKLQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgIGlmIChtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICAgICAgc2V0RHVyYXRpb25fbChkdXJhdGlvblVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZVNpemVUb1JlbmRlcihtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCkpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbVZpZGVvU291cmNlICE9IE5VTEwgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblZpZGVvRXZlbnQoKSB7Ci0gICAgdWludDMyX3QgaT0wOwotICAgIE00T1NBX0VSUiBlcnIxID0gTTROT19FUlJPUjsKLSAgICBpbnQ2NF90IGltYWdlRnJhbWVUaW1lVXMgPSAwOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1WaWRlb0V2ZW50UGVuZGluZykgewotICAgICAgICAvLyBUaGUgZXZlbnQgaGFzIGJlZW4gY2FuY2VsbGVkIGluIHJlc2V0X2woKSBidXQgaGFkIGFscmVhZHkKLSAgICAgICAgLy8gYmVlbiBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbiBhdCB0aGF0IHRpbWUuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBpZiAobUZsYWdzICYgU0VFS19QUkVWSUVXKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVGltZVNvdXJjZSAqdHNfc3QgPSAgJm1TeXN0ZW1UaW1lU291cmNlOwotICAgIGludDY0X3QgdGltZVN0YXJ0VXMgPSB0c19zdC0+Z2V0UmVhbFRpbWVVcygpOwotCi0gICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLQotICAgICAgICBpZihtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBzZWVrIHRoZSB2aWRlbyBzb3VyY2UgZmlyc3QsIGZvbGxvd2VkIGJ5Ci0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gc291cmNlLgotICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQganVtcHMgaW4gdGhlIERhdGFTb3VyY2Ugb2Zmc2V0IGNhdXNlZCBieQotICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIGNvZGVjIHByZWZldGNoaW5nIGRhdGEgZnJvbSB0aGUgb2xkIGxvY2F0aW9ucwotICAgICAgICAgICAgLy8gd2hpbGUgdGhlIHZpZGVvIGNvZGVjIGlzIGFscmVhZHkgcmVhZGluZyBkYXRhIGZyb20gdGhlIG5ldwotICAgICAgICAgICAgLy8gbG9jYXRpb25zLCB3ZSdsbCAicGF1c2UiIHRoZSBhdWRpbyBzb3VyY2UsIGNhdXNpbmcgaXQgdG8KLSAgICAgICAgICAgIC8vIHN0b3AgcmVhZGluZyBpbnB1dCBkYXRhIHVudGlsIGEgc3Vic2VxdWVudCBzZWVrLgotCi0gICAgICAgICAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwgJiYgKG1GbGFncyAmIEFVRElPX1JVTk5JTkcpKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+QVVESU9fUlVOTklORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+cGF1c2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghbVZpZGVvQnVmZmVyKSB7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgQUxPR1YoIkxWIFBMQVlFUiBzZWVraW5nIHRvICVsbGQgdXMgKCUuMmYgc2VjcykiLCBtU2Vla1RpbWVVcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzIC8gMUU2KTsKLQotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCi0gICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZpZGVvU291cmNlLT5yZWFkKCZtVmlkZW9CdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIENIRUNLKCFtVmlkZW9CdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJMViBQTEFZRVIgVmlkZW9Tb3VyY2Ugc2lnbmFsbGVkIGZvcm1hdCBjaGFuZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGluaXRSZW5kZXJlcl9sKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNpemVUb1JlbmRlcihtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFNvIHZpZGVvIHBsYXliYWNrIGlzIGNvbXBsZXRlLCBidXQgd2UgbWF5IHN0aWxsIGhhdmUKLSAgICAgICAgICAgICAgICAvLyBhIHNlZWsgcmVxdWVzdCBwZW5kaW5nIHRoYXQgbmVlZHMgdG8gYmUgYXBwbGllZCB0byB0aGUgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigidmlkZW8gc3RyZWFtIGVuZGVkIHdoaWxlIHNlZWtpbmchIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeSgtMSk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlByZXZpZXdQbGF5ZXI6IG9uVmlkZW9FdmVudCBFT1MgcmVhY2hlZC4iKTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbGFzdCBkZWNvZGVkIHRpbWVzdGFtcCB0byBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1EZWNvZGVkVmlkZW9UcyA9IChtUGxheUVuZFRpbWVNc2VjKjEwMDBMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVZpZGVvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU29tZSBkZWNvZGVycywgbm90YWJseSB0aGUgUFYgQVZDIHNvZnR3YXJlIGRlY29kZXIKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gc3B1cmlvdXMgZW1wdHkgYnVmZmVycyB0aGF0IHdlIGp1c3Qgd2FudCB0byBpZ25vcmUuCi0KLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHZpZGVvVGltZVVzOwotICAgICAgICAgICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdmlkZW9UaW1lVXMpKTsKLQotICAgICAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgICAgICBpZiAodmlkZW9UaW1lVXMgPCBtU2Vla1RpbWVVcykgewotICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzIGFyZSBiZWZvcmUgc2VlayB0aW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGVtCi0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKCh2aWRlb1RpbWVVcy8xMDAwKSA8IG1QbGF5QmVnaW5UaW1lTXNlYykgewotICAgICAgICAgICAgICAgICAgICAvLyBGcmFtZXMgYXJlIGJlZm9yZSBiZWdpbiBjdXQgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBEb25vdCByZW5kZXIKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbU51bWJlckRlY1ZpZGVvRnJhbWVzKys7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICBzZXRQb3NpdGlvbl9sKHRpbWVVcyk7Ci0KLSAgICBpZiAoIW1TdGFydE5leHRQbGF5ZXIpIHsKLSAgICAgICAgaW50NjRfdCBwbGF5YmFja1RpbWVSZW1haW5pbmcgPSAobVBsYXlFbmRUaW1lTXNlYyAqIDEwMDBMTCkgLSB0aW1lVXM7Ci0gICAgICAgIGlmIChwbGF5YmFja1RpbWVSZW1haW5pbmcgPD0gMTUwMDAwMCkgewotICAgICAgICAgICAgLy9XaGVuIGxlc3MgdGhhbiAxLjUgc2VjIG9mIHBsYXliYWNrIGxlZnQKLSAgICAgICAgICAgIC8vIHNlbmQgbm90aWZpY2F0aW9uIHRvIHN0YXJ0IG5leHQgcGxheWVyCi0KLSAgICAgICAgICAgIG1TdGFydE5leHRQbGF5ZXIgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgweEFBQUFBQUFBKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFNlZWtUeXBlIHdhc1NlZWtpbmcgPSBtU2Vla2luZzsKLSAgICBmaW5pc2hTZWVrSWZOZWNlc3NhcnkodGltZVVzKTsKLSAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwgJiYgIShtRmxhZ3MgJiAoQVVESU9fUlVOTklORykpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHN0YXJ0QXVkaW9QbGF5ZXJfbCgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU3RhcnRpbmcgdGhlIGF1ZGlvIHBsYXllciBmYWlsZWQgdy8gZXJyICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFRpbWVTb3VyY2UgKnRzID0gKG1GbGFncyAmIEFVRElPX0FUX0VPUykgPyAmbVN5c3RlbVRpbWVTb3VyY2UgOiBtVGltZVNvdXJjZTsKLQotICAgIGlmKHRzID09IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZighbUlzVmlkZW9Tb3VyY2VKcGcpIHsKLSAgICAgICAgaWYgKG1GbGFncyAmIEZJUlNUX0ZSQU1FKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgJj0gfkZJUlNUX0ZSQU1FOwotCi0gICAgICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gdGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCByZWFsVGltZVVzLCBtZWRpYVRpbWVVczsKLSAgICAgICAgaWYgKCEobUZsYWdzICYgQVVESU9fQVRfRU9TKSAmJiBtQXVkaW9QbGF5ZXIgIT0gTlVMTAotICAgICAgICAgICAgJiYgbUF1ZGlvUGxheWVyLT5nZXRNZWRpYVRpbWVNYXBwaW5nKCZyZWFsVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7Ci0gICAgICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSByZWFsVGltZVVzIC0gbWVkaWFUaW1lVXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IG5vd1VzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIG1UaW1lU291cmNlRGVsdGFVczsKLQotICAgICAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSBub3dVcyAtIHRpbWVVczsKLQotICAgICAgICBpZiAod2FzU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAvLyBMZXQncyBkaXNwbGF5IHRoZSBmaXJzdCBmcmFtZSBhZnRlciBzZWVraW5nIHJpZ2h0IGF3YXkuCi0gICAgICAgICAgICBsYXRlbmVzc1VzID0gMDsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiQXVkaW8gdGltZSBzdGFtcCA9ICVsbGQgYW5kIHZpZGVvIHRpbWUgc3RhbXAgPSAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMtPmdldFJlYWxUaW1lVXMoKSx0aW1lVXMpOwotICAgICAgICBpZiAobGF0ZW5lc3NVcyA+IDQwMDAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gNDBtcyBsYXRlLgotCi0gICAgICAgICAgICBBTE9HVigiTFYgUExBWUVSIHdlJ3JlIGxhdGUgYnkgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNik7Ci0KLSAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGF0ZW5lc3NVcyA8IC0yNTAwMCkgewotICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDI1bXMgZWFybHkuCi0gICAgICAgICAgICBBTE9HVigiV2UncmUgbW9yZSB0aGFuIDI1bXMgZWFybHksIGxhdGVuZXNzICVsbGQiLCBsYXRlbmVzc1VzKTsKLQotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgyNTAwMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgfHwgbVZpZGVvUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IGluaXRSZW5kZXJlcl9sKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgdGltZXN0YW1wIGV4Y2VlZHMgZW5kQ3V0VGltZSBvZiBjbGlwLCBkb25vdCByZW5kZXIKLSAgICBpZigodGltZVVzLzEwMDApID4gbVBsYXlFbmRUaW1lTXNlYykgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKLSAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKLSAgICAgICAgQUxPR1YoIlByZXZpZXdQbGF5ZXI6IG9uVmlkZW9FdmVudCB0aW1lVXMgPiBtUGxheUVuZFRpbWU7IHNlbmQgRU9TLi4iKTsKLSAgICAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgICAgICAvLyBTZXQgdGhlIGxhc3QgZGVjb2RlZCB0aW1lc3RhbXAgdG8gZHVyYXRpb24KLSAgICAgICAgbURlY29kZWRWaWRlb1RzID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMExMKTsKLSAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKEVSUk9SX0VORF9PRl9TVFJFQU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIENhcHR1cmUgdGhlIGZyYW1lIHRpbWVzdGFtcCB0byBiZSByZW5kZXJlZAotICAgIG1EZWNvZGVkVmlkZW9UcyA9IHRpbWVVczsKLQotICAgIC8vIFBvc3QgcHJvY2Vzc2luZyB0byBhcHBseSB2aWRlbyBlZmZlY3RzCi0gICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiBlZmZlY3Qgc3RhcnR0aW1lIG1hdGNoZXMgdGhlIGNsaXAgYmVpbmcgcHJldmlld2VkCi0gICAgICAgIGlmKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDwgKG1EZWNWaWRlb1RzU3RvcnlCb2FyZC8xMDAwKSkgfHwKLSAgICAgICAgKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPj0KLSAgICAgICAgICgobURlY1ZpZGVvVHNTdG9yeUJvYXJkLzEwMDApICsgbVBsYXlFbmRUaW1lTXNlYyAtIG1QbGF5QmVnaW5UaW1lTXNlYykpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGVmZmVjdCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIGNsaXAsIGNoZWNrIG5leHQgb25lCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBpZiBlZmZlY3QgYXBwbGllcyB0byB0aGlzIHBhcnRpY3VsYXIgZnJhbWUgdGltZXN0YW1wCi0gICAgICAgIGlmKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDw9Ci0gICAgICAgICAoKCh0aW1lVXMrbURlY1ZpZGVvVHNTdG9yeUJvYXJkKS8xMDAwKS1tUGxheUJlZ2luVGltZU1zZWMpKSAmJgotICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lK21FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbikgPj0KLSAgICAgICAgICAgICAoKCh0aW1lVXMrbURlY1ZpZGVvVHNTdG9yeUJvYXJkKS8xMDAwKS1tUGxheUJlZ2luVGltZU1zZWMpKQotICAgICAgICAgICAgICAmJiAobUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uICE9IDApKSB7Ci0gICAgICAgICAgICBzZXRWaWRlb1Bvc3RQcm9jZXNzaW5nTm9kZSgKLSAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSwgVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZXRWaWRlb1Bvc3RQcm9jZXNzaW5nTm9kZSgKLSAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSwgRkFMU0UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9Qcm92aWRlIHRoZSBvdmVybGF5IFVwZGF0ZSBpbmRpY2F0aW9uIHdoZW4gdGhlcmUgaXMgYW4gb3ZlcmxheSBlZmZlY3QKLSAgICBpZiAobUN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GUkFNSU5HKSB7Ci0gICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgJj0gflZJREVPX0VGRkVDVF9GUkFNSU5HOyAvL25ldmVyIGFwcGx5IGZyYW1pbmcgaGVyZS4KLSAgICAgICAgaWYgKCFtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkKSB7Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbmRleDsKLSAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1OdW1iZXJFZmZlY3RzOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVNcyA9IG1EZWNvZGVkVmlkZW9Ucy8xMDAwOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lT2Zmc2V0ID0gbURlY1ZpZGVvVHNTdG9yeUJvYXJkLzEwMDA7Ci0gICAgICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlTdGFydFRpbWUgKyAxKSA8PQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1zICsgdGltZU9mZnNldCAtIG1QbGF5QmVnaW5UaW1lTXNlYykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlTdGFydFRpbWUgLSAxICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpRHVyYXRpb24pID49Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgKyB0aW1lT2Zmc2V0IC0gbVBsYXlCZWdpblRpbWVNc2VjKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBtTnVtYmVyRWZmZWN0cykgewotICAgICAgICAgICAgICAgIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkZyYW1pbmcgaW5kZXggPSAlbGQiLCBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJObyBmcmFtaW5nIGVmZmVjdHMgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkKSB7Ci0gICAgICAgIC8vUG9zdCB0aGUgZXZlbnQgd2hlbiB0aGUgb3ZlcmxheSBpcyBubyBtb3JlIHZhbGlkCi0gICAgICAgIEFMT0dWKCJPdmVybGF5IGlzIERvbmUiKTsKLSAgICAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgICAgICBwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKTsKLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICBtVmlkZW9SZW5kZXJlci0+cmVuZGVyKG1WaWRlb0J1ZmZlciwgbUN1cnJlbnRWaWRlb0VmZmVjdCwKLSAgICAgICAgICAgICAgICBtUmVuZGVyaW5nTW9kZSwgbUlzVmlkZW9Tb3VyY2VKcGcpOwotICAgIH0KLQotICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0KLSAgICAvLyBQb3N0IHByb2dyZXNzIGNhbGxiYWNrIGJhc2VkIG9uIGNhbGxiYWNrIGludGVydmFsIHNldAotICAgIGlmKG1OdW1iZXJEZWNWaWRlb0ZyYW1lcyA+PSBtUHJvZ3Jlc3NDYkludGVydmFsKSB7Ci0gICAgICAgIHBvc3RQcm9ncmVzc0NhbGxiYWNrRXZlbnRfbCgpOwotICAgICAgICBtTnVtYmVyRGVjVmlkZW9GcmFtZXMgPSAwOyAgLy8gcmVzZXQgY291bnRlcgotICAgIH0KLQotICAgIC8vIGlmIHJlYWNoZWQgRW5kQ3V0VGltZSBvZiBjbGlwLCBwb3N0IEVPUyBldmVudAotICAgIGlmKCh0aW1lVXMvMTAwMCkgPj0gbVBsYXlFbmRUaW1lTXNlYykgewotICAgICAgICBBTE9HVigiUHJldmlld1BsYXllcjogb25WaWRlb0V2ZW50IEVPUy4iKTsKLSAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKLSAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKLSAgICAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgICAgICAvLyBTZXQgdGhlIGxhc3QgZGVjb2RlZCB0aW1lc3RhbXAgdG8gZHVyYXRpb24KLSAgICAgICAgbURlY29kZWRWaWRlb1RzID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMExMKTsKLSAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKEVSUk9SX0VORF9PRl9TVFJFQU0pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKCh3YXNTZWVraW5nICE9IE5PX1NFRUspICYmIChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCFtSXNWaWRlb1NvdXJjZUpwZykgewotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMzMwMDApOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwcmVwYXJlKCkgewotICAgIEFMT0dWKCJwcmVwYXJlIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gcHJlcGFyZV9sKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnByZXBhcmVfbCgpIHsKLSAgICBBTE9HVigicHJlcGFyZV9sIik7Ci0gICAgaWYgKG1GbGFncyAmIFBSRVBBUkVEKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1Jc0FzeW5jUHJlcGFyZSA9IGZhbHNlOwotICAgIHN0YXR1c190IGVyciA9IHByZXBhcmVBc3luY19sKCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgd2hpbGUgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICBtUHJlcGFyZWRDb25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1QcmVwYXJlUmVzdWx0OwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgQUxPR1YoInByZXBhcmVBc3luYyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHByZXBhcmVBc3luY19sKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnByZXBhcmVBc3luY19sKCkgewotICAgIEFMT0dWKCJwcmVwYXJlQXN5bmNfbCIpOwotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBhc3luYyBwcmVwYXJlIGFscmVhZHkgcGVuZGluZwotICAgIH0KLQotICAgIGlmICghbVF1ZXVlU3RhcnRlZCkgewotICAgICAgICBtUXVldWUuc3RhcnQoKTsKLSAgICAgICAgbVF1ZXVlU3RhcnRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgbUZsYWdzIHw9IFBSRVBBUklORzsKLSAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KAotICAgICAgICAgICAgdGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uUHJlcGFyZUFzeW5jRXZlbnQpOwotCi0gICAgbVF1ZXVlLnBvc3RFdmVudChtQXN5bmNQcmVwYXJlRXZlbnQpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpmaW5pc2hTZXREYXRhU291cmNlX2woKSB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZTsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yOwotCi0gICAgZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobVVyaS5zdHJpbmcoKSwgTlVMTCk7Ci0KLSAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vSWYgZmlsZSB0eXBlIGlzIC5yZ2IsIHRoZW4gbm8gbmVlZCB0byBjaGVjayBmb3IgRXh0cmFjdG9yCi0gICAgaW50IHVyaUxlbiA9IHN0cmxlbihtVXJpKTsKLSAgICBpbnQgc3RhcnRPZmZzZXQgPSB1cmlMZW4gLSA0OwotICAgIGlmKCFzdHJuY2FzZWNtcChtVXJpK3N0YXJ0T2Zmc2V0LCAiLnJnYiIsIDQpKSB7Ci0gICAgICAgIGV4dHJhY3RvciA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKLSAgICB9Ci0KLSAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImZpbmlzaFNldERhdGFTb3VyY2VfbDogZmFpbGVkIHRvIGNyZWF0ZSBleHRyYWN0b3IiKTsKLSAgICAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbF9qcGcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25QcmVwYXJlQXN5bmNFdmVudCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIEFMT0dWKCJvblByZXBhcmVBc3luY0V2ZW50Iik7Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpIHsKLSAgICAgICAgQUxPR1YoInByZXBhcmUgd2FzIGNhbmNlbGxlZCBiZWZvcmUgZG9pbmcgYW55dGhpbmciKTsKLSAgICAgICAgYWJvcnRQcmVwYXJlKFVOS05PV05fRVJST1IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Vcmkuc2l6ZSgpID4gMCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5pc2hTZXREYXRhU291cmNlX2woKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMICYmIG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGluaXRWaWRlb0RlY29kZXJfbChPTVhDb2RlYzo6a0hhcmR3YXJlQ29kZWNzT25seSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtQXVkaW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0QXVkaW9EZWNvZGVyX2woKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwotCi19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6ZmluaXNoQXN5bmNQcmVwYXJlX2woKSB7Ci0gICAgQUxPR1YoImZpbmlzaEFzeW5jUHJlcGFyZV9sIik7Ci0gICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIDAsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BSRVBBUkVEKTsKLSAgICB9Ci0KLSAgICBtUHJlcGFyZVJlc3VsdCA9IE9LOwotICAgIG1GbGFncyAmPSB+KFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRCk7Ci0gICAgbUZsYWdzIHw9IFBSRVBBUkVEOwotICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7Ci0gICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmFjcXVpcmVMb2NrKCkgewotICAgIEFMT0dWKCJhY3F1aXJlTG9jayIpOwotICAgIG1Mb2NrQ29udHJvbC5sb2NrKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cmVsZWFzZUxvY2soKSB7Ci0gICAgQUxPR1YoInJlbGVhc2VMb2NrIik7Ci0gICAgbUxvY2tDb250cm9sLnVubG9jaygpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpsb2FkRWZmZWN0c1NldHRpbmdzKAotICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3RTZXR0aW5ncywgaW50IG5FZmZlY3RzKSB7Ci0KLSAgICBBTE9HVigibG9hZEVmZmVjdHNTZXR0aW5ncyIpOwotICAgIG1OdW1iZXJFZmZlY3RzID0gbkVmZmVjdHM7Ci0gICAgbUVmZmVjdHNTZXR0aW5ncyA9IHBFZmZlY3RTZXR0aW5nczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmxvYWRBdWRpb01peFNldHRpbmdzKAotICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpIHsKLQotICAgIEFMT0dWKCJsb2FkQXVkaW9NaXhTZXR0aW5ncyIpOwotICAgIG1QcmV2aWV3UGxheWVyQXVkaW9NaXhTZXR0aW5ncyA9IHBBdWRpb01peFNldHRpbmdzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgICAgICBNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLQotICAgIEFMT0dWKCJzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUiKTsKLSAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlID0gcEF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKAotICAgICAgICBNNE9TQV9VSW50MzIgYXVkaW9NaXhTdG9yeUJvYXJkVFMsCi0gICAgICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgIE00T1NBX1VJbnQzMiBwcmltYXJ5VHJhY2tWb2xWYWx1ZSApIHsKLQotICAgIEFMT0dWKCJzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSIpOwotICAgIG1BdWRpb01peFN0b3J5Qm9hcmRUUyA9IGF1ZGlvTWl4U3RvcnlCb2FyZFRTOwotICAgIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUgPSBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWU7Ci0gICAgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlID0gcHJpbWFyeVRyYWNrVm9sVmFsdWU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRQbGF5YmFja0JlZ2luVGltZSh1aW50MzJfdCBtc2VjKSB7Ci0KLSAgICBtUGxheUJlZ2luVGltZU1zZWMgPSBtc2VjOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpIHsKLQotICAgIG1QbGF5RW5kVGltZU1zZWMgPSBtc2VjOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKSB7Ci0KLSAgICBtU3Rvcnlib2FyZFN0YXJ0VGltZU1zZWMgPSBtc2VjOwotICAgIG1EZWNWaWRlb1RzU3RvcnlCb2FyZCA9IG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyAqIDEwMDBMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKSB7Ci0KLSAgICBtUHJvZ3Jlc3NDYkludGVydmFsID0gY2JJbnRlcnZhbDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0TWVkaWFSZW5kZXJpbmdNb2RlKAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKSB7Ci0KLSAgICBtUmVuZGVyaW5nTW9kZSA9IG1vZGU7Ci0KLSAgICAvKiBnZXQgdGhlIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQgYnkgcmVzb2x1dGlvbiAqLwotICAgIHJldHVybiBnZXRWaWRlb1NpemVCeVJlc29sdXRpb24oCi0gICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9TaXplLAotICAgICAgICAgICAgICAgICAgICAmbU91dHB1dFZpZGVvV2lkdGgsICZtT3V0cHV0VmlkZW9IZWlnaHQpOwotCi19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKSB7Ci0KLSAgICBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQgPSBtU3Rvcnlib2FyZFN0YXJ0VGltZU1zZWMgKiAxMDAwTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RQcm9ncmVzc0NhbGxiYWNrRXZlbnRfbCgpIHsKLSAgICBpZiAobVByb2dyZXNzQ2JFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IHRydWU7Ci0KLSAgICBtUXVldWUucG9zdEV2ZW50KG1Qcm9ncmVzc0NiRXZlbnQpOwotfQotCi0KLXZvaWQgUHJldmlld1BsYXllcjo6b25Qcm9ncmVzc0NiRXZlbnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICAvLyBJZiBwbGF5YmFjayBzdGFydHMgZnJvbSBwcmV2aW91cyBJLWZyYW1lLAotICAgIC8vIHRoZW4gc2VuZCBmcmFtZSBzdG9yeWJvYXJkIGR1cmF0aW9uCi0gICAgaWYgKChtRGVjb2RlZFZpZGVvVHMvMTAwMCkgPCBtUGxheUJlZ2luVGltZU1zZWMpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCAwLCBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCAwLAotICAgICAgICAoKChtRGVjb2RlZFZpZGVvVHMrbURlY1ZpZGVvVHNTdG9yeUJvYXJkKS8xMDAwKS1tUGxheUJlZ2luVGltZU1zZWMpKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCkgewotICAgIGlmIChtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLSAgICBtUXVldWUucG9zdEV2ZW50KG1PdmVybGF5VXBkYXRlRXZlbnQpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uVXBkYXRlT3ZlcmxheUV2ZW50KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAoIW1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGludCB1cGRhdGVTdGF0ZSA9IG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQ/IDE6IDA7Ci0gICAgbm90aWZ5TGlzdGVuZXJfbCgweEJCQkJCQkJCLCB1cGRhdGVTdGF0ZSwgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXgpOwotfQotCi0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0VmlkZW9Qb3N0UHJvY2Vzc2luZ05vZGUoCi0gICAgICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdHlwZSwgTTRPU0FfQm9vbCBlbmFibGUpIHsKLQotICAgIHVpbnQzMl90IGVmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotCi0gICAgLy9NYXAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0byBsb2NhbCBlbnVtCi0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZBREVGUk9NQkxBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0JMQUNLQU5EV0hJVEU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfUElOSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW46Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfR1JFRU47Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX1NFUElBOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9ORUdBVElWRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZzoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GUkFNSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZJRlRJRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfQ09MT1JfUkdCMTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0dSQURJRU5UOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGVuYWJsZSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgIC8vSWYgYWxyZWFkeSBzZXQsIHRoZW4gbm8gbmVlZCB0byBzZXQgYWdhaW4KLSAgICAgICAgaWYgKCEobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgfD0gZWZmZWN0OwotICAgICAgICAgICAgaWYgKGVmZmVjdCA9PSBWSURFT19FRkZFQ1RfRklGVElFUykgewotICAgICAgICAgICAgICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSAgewotICAgICAgICAvL1Jlc2V0IG9ubHkgaWYgYWxyZWFkeSBzZXQKLSAgICAgICAgaWYgKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBlZmZlY3QpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgJj0gfmVmZmVjdDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0SW1hZ2VDbGlwUHJvcGVydGllcyh1aW50MzJfdCB3aWR0aCx1aW50MzJfdCBoZWlnaHQpIHsKLSAgICBtVmlkZW9XaWR0aCA9IHdpZHRoOwotICAgIG1WaWRlb0hlaWdodCA9IGhlaWdodDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnJlYWRGaXJzdFZpZGVvRnJhbWUoKSB7Ci0gICAgQUxPR1YoInJlYWRGaXJzdFZpZGVvRnJhbWUiKTsKLQotICAgIGlmICghbVZpZGVvQnVmZmVyKSB7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLAotICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAotICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1WaWRlb1NvdXJjZS0+cmVhZCgmbVZpZGVvQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBDSEVDSyghbVZpZGVvQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9Tb3VyY2Ugc2lnbmFsbGVkIGZvcm1hdCBjaGFuZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGluaXRSZW5kZXJlcl9sKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiRU9TIHJlYWNoZWQuIik7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1WaWRlb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgZGVjb2RlcnMsIG5vdGFibHkgdGhlIFBWIEFWQyBzb2Z0d2FyZSBkZWNvZGVyCi0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHNwdXJpb3VzIGVtcHR5IGJ1ZmZlcnMgdGhhdCB3ZSBqdXN0IHdhbnQgdG8gaWdub3JlLgotCi0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCB2aWRlb1RpbWVVczsKLSAgICAgICAgICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnZpZGVvVGltZVVzKSk7Ci0gICAgICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgICAgIGlmICh2aWRlb1RpbWVVcyA8IG1TZWVrVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBzZWVrIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCh2aWRlb1RpbWVVcy8xMDAwKSA8IG1QbGF5QmVnaW5UaW1lTXNlYykgewotICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzIGFyZSBiZWZvcmUgYmVnaW4gY3V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgc2V0UG9zaXRpb25fbCh0aW1lVXMpOwotCi0gICAgbURlY29kZWRWaWRlb1RzID0gdGltZVVzOwotCi0gICAgcmV0dXJuIE9LOwotCi19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKSB7Ci0gICAgKmxhc3RSZW5kZXJlZFRpbWVNcyA9ICgoKG1EZWNvZGVkVmlkZW9UcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnVwZGF0ZVNpemVUb1JlbmRlcihzcDxNZXRhRGF0YT4gbWV0YSkgewotICAgIGlmIChtVmlkZW9SZW5kZXJlcikgewotICAgICAgICBtVmlkZW9SZW5kZXJlci0+dXBkYXRlVmlkZW9TaXplKG1ldGEpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpyZXNldCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJlc2V0X2woKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpjbGVhcl9sKCkgewotICAgIG1EaXNwbGF5V2lkdGggPSAwOwotICAgIG1EaXNwbGF5SGVpZ2h0ID0gMDsKLQotICAgIGlmIChtRmxhZ3MgJiBQTEFZSU5HKSB7Ci0gICAgICAgIHVwZGF0ZUJhdHRlcnlVc2FnZV9sKCk7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7Ci0KLSAgICAgICAgaWYgKG1GbGFncyAmIFBSRVBBUklOR19DT05ORUNURUQpIHsKLSAgICAgICAgICAgIC8vIFdlIGFyZSBiYXNpY2FsbHkgZG9uZSBwcmVwYXJpbmcsIHdlJ3JlIGp1c3QgYnVmZmVyaW5nCi0gICAgICAgICAgICAvLyBlbm91Z2ggZGF0YSB0byBzdGFydCBwbGF5YmFjaywgd2UgY2FuIHNhZmVseSBpbnRlcnJ1cHQgdGhhdC4KLSAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBjYW5jZWxQbGF5ZXJFdmVudHNfbCh0cnVlKTsKLQotICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgbVZpZGVvVHJhY2suY2xlYXIoKTsKLQotICAgIC8vIFNodXRkb3duIGF1ZGlvIGZpcnN0LCBzbyB0aGF0IHRoZSByZXNwb25lIHRvIHRoZSByZXNldCByZXF1ZXN0Ci0gICAgLy8gYXBwZWFycyB0byBoYXBwZW4gaW5zdGFudGFuZW91c2x5IGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKLSAgICAvLyBJZiB3ZSBkaWQgdGhpcyBsYXRlciwgYXVkaW8gd291bGQgY29udGludWUgcGxheWluZyB3aGlsZSB3ZQotICAgIC8vIHNodXRkb3duIHRoZSB2aWRlby1yZWxhdGVkIHJlc291cmNlcyBhbmQgdGhlIHBsYXllciBhcHBlYXIgdG8KLSAgICAvLyBub3QgYmUgYXMgcmVzcG9uc2l2ZSB0byBhIHJlc2V0IHJlcXVlc3QuCi0gICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMICYmIG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBhbiBhdWRpbyBwbGF5ZXIsIGl0IHdvdWxkIGhhdmUgZWZmZWN0aXZlbHkKLSAgICAgICAgLy8gdGFrZW4gcG9zc2Vzc2lvbiBvZiB0aGUgYXVkaW8gc291cmNlIGFuZCBzdG9wcGVkIGl0IHdoZW4KLSAgICAgICAgLy8gX2l0XyBpcyBzdG9wcGVkLiBPdGhlcndpc2UgdGhpcyBpcyBzdGlsbCBvdXIgcmVzcG9uc2liaWxpdHkuCi0gICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgIH0KLSAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLQotICAgIG1UaW1lU291cmNlID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtQXVkaW9QbGF5ZXI7Ci0gICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7Ci0gICAgfQotCi0gICAgbUR1cmF0aW9uVXMgPSAtMTsKLSAgICBtRmxhZ3MgPSAwOwotICAgIG1FeHRyYWN0b3JGbGFncyA9IDA7Ci0gICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gMDsKLSAgICBtVmlkZW9UaW1lVXMgPSAwOwotCi0gICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gMDsKLQotICAgIG1Vcmkuc2V0VG8oIiIpOwotCi0gICAgbUJpdHJhdGUgPSAtMTsKLSAgICBtTGFzdFZpZGVvVGltZVVzID0gLTE7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6bm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpIHsKLSAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0KLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQobXNnLCBleHQxLCBleHQyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblZpZGVvTGFnVXBkYXRlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtVmlkZW9MYWdFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtVmlkZW9MYWdFdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGludDY0X3QgYXVkaW9UaW1lVXMgPSBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZVVzKCk7Ci0gICAgaW50NjRfdCB2aWRlb0xhdGVCeVVzID0gYXVkaW9UaW1lVXMgLSBtVmlkZW9UaW1lVXM7Ci0KLSAgICBpZiAoIShtRmxhZ3MgJiBWSURFT19BVF9FT1MpICYmIHZpZGVvTGF0ZUJ5VXMgPiAzMDAwMDBsbCkgewotICAgICAgICBBTE9HVigidmlkZW8gbGF0ZSBieSAlbGxkIG1zLiIsIHZpZGVvTGF0ZUJ5VXMgLyAxMDAwbGwpOwotCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgICAgICAgICAgTUVESUFfSU5GTywKLSAgICAgICAgICAgICAgICBNRURJQV9JTkZPX1ZJREVPX1RSQUNLX0xBR0dJTkcsCi0gICAgICAgICAgICAgICAgdmlkZW9MYXRlQnlVcyAvIDEwMDBsbCk7Ci0gICAgfQotCi0gICAgcG9zdFZpZGVvTGFnRXZlbnRfbCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om5vdGlmeVZpZGVvU2l6ZV9sKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgIGludDMyX3QgdldpZHRoLCB2SGVpZ2h0OwotICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKLQotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2V2lkdGgpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJnZIZWlnaHQpKTsKLQotICAgIG1HaXZlbldpZHRoID0gdldpZHRoOwotICAgIG1HaXZlbkhlaWdodCA9IHZIZWlnaHQ7Ci0KLSAgICBpZiAoIW1ldGEtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKSB7Ci0KLSAgICAgICAgY3JvcExlZnQgPSBjcm9wVG9wID0gMDsKLSAgICAgICAgY3JvcFJpZ2h0ID0gdldpZHRoIC0gMTsKLSAgICAgICAgY3JvcEJvdHRvbSA9IHZIZWlnaHQgLSAxOwotCi0gICAgICAgIEFMT0dEKCJnb3QgZGltZW5zaW9ucyBvbmx5ICVkIHggJWQiLCB2V2lkdGgsIHZIZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCJnb3QgY3JvcCByZWN0ICVkLCAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICB9Ci0KLSAgICBtQ3JvcFJlY3QubGVmdCA9IGNyb3BMZWZ0OwotICAgIG1Dcm9wUmVjdC5yaWdodCA9IGNyb3BSaWdodDsKLSAgICBtQ3JvcFJlY3QudG9wID0gY3JvcFRvcDsKLSAgICBtQ3JvcFJlY3QuYm90dG9tID0gY3JvcEJvdHRvbTsKLQotICAgIGludDMyX3QgZGlzcGxheVdpZHRoOwotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlXaWR0aCwgJmRpc3BsYXlXaWR0aCkpIHsKLSAgICAgICAgQUxPR1YoIkRpc3BsYXkgd2lkdGggY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5V2lkdGgsIGRpc3BsYXlXaWR0aCk7Ci0gICAgICAgIG1EaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGg7Ci0gICAgfQotICAgIGludDMyX3QgZGlzcGxheUhlaWdodDsKLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkpIHsKLSAgICAgICAgQUxPR1YoIkRpc3BsYXkgaGVpZ2h0IGNoYW5nZWQgKCVkPT4lZCkiLCBtRGlzcGxheUhlaWdodCwgZGlzcGxheUhlaWdodCk7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gZGlzcGxheUhlaWdodDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHVzYWJsZVdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOwotICAgIGludDMyX3QgdXNhYmxlSGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOwotICAgIGlmIChtRGlzcGxheVdpZHRoICE9IDApIHsKLSAgICAgICAgdXNhYmxlV2lkdGggPSBtRGlzcGxheVdpZHRoOwotICAgIH0KLSAgICBpZiAobURpc3BsYXlIZWlnaHQgIT0gMCkgewotICAgICAgICB1c2FibGVIZWlnaHQgPSBtRGlzcGxheUhlaWdodDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgIGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKLSAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKLSAgICB9Ci0KLSAgICBpZiAocm90YXRpb25EZWdyZWVzID09IDkwIHx8IHJvdGF0aW9uRGVncmVlcyA9PSAyNzApIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwgdXNhYmxlSGVpZ2h0LCB1c2FibGVXaWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwgdXNhYmxlV2lkdGgsIHVzYWJsZUhlaWdodCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwYXVzZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKLQotICAgIHJldHVybiBwYXVzZV9sKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBhdXNlX2woYm9vbCBhdF9lb3MpIHsKLSAgICBpZiAoIShtRmxhZ3MgJiBQTEFZSU5HKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgY2FuY2VsUGxheWVyRXZlbnRzX2woKTsKLQotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAobUZsYWdzICYgQVVESU9fUlVOTklORykpIHsKLSAgICAgICAgaWYgKGF0X2VvcykgewotICAgICAgICAgICAgLy8gSWYgd2UgcGxheWVkIHRoZSBhdWRpbyBzdHJlYW0gdG8gY29tcGxldGlvbiB3ZQotICAgICAgICAgICAgLy8gd2FudCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgc2FtcGxlcyByZW1haW5pbmcgaW4gdGhlIGF1ZGlvCi0gICAgICAgICAgICAvLyB0cmFjaydzIHF1ZXVlIGFyZSBwbGF5ZWQgb3V0LgotICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSh0cnVlIC8qIHBsYXlQZW5kaW5nU2FtcGxlcyAqLyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtRmxhZ3MgJj0gfkFVRElPX1JVTk5JTkc7Ci0gICAgfQotCi0gICAgbUZsYWdzICY9IH5QTEFZSU5HOwotICAgIHVwZGF0ZUJhdHRlcnlVc2FnZV9sKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgUHJldmlld1BsYXllcjo6aXNQbGF5aW5nKCkgY29uc3QgewotICAgIHJldHVybiAobUZsYWdzICYgUExBWUlORykgfHwgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKLSAgICBzZXROYXRpdmVXaW5kb3dfbChzdXJmYWNlKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRTdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVN1cmZhY2UuY2xlYXIoKTsKLSAgICBpZiAoYnVmZmVyUHJvZHVjZXIgIT0gTlVMTCkgewotICAgICAgICBzZXROYXRpdmVXaW5kb3dfbChuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlcikpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCkgewotICAgIGlmIChtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgbVZpZGVvU291cmNlLT5zdG9wKCk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKLSAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5Ci0gICAgLy8gdG8gaW5zdGFudGlhdGUgaXQgYWdhaW4uCi0gICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1WaWRlb1NvdXJjZTsKLSAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHVzbGVlcCgxMDAwKTsKLSAgICB9Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpIHsKLSAgICBtTmF0aXZlV2luZG93ID0gbmF0aXZlOwotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HSSgiYXR0ZW1wdGluZyB0byByZWNvbmZpZ3VyZSB0byB1c2UgbmV3IHN1cmZhY2UiKTsKLQotICAgIGJvb2wgd2FzUGxheWluZyA9IChtRmxhZ3MgJiBQTEFZSU5HKSAhPSAwOwotCi0gICAgcGF1c2VfbCgpOwotCi0gICAgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOwotCi0gICAgQ0hFQ0tfRVEoaW5pdFZpZGVvRGVjb2Rlcl9sKCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICBpZiAobUxhc3RWaWRlb1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgIG1TZWVraW5nID0gU0VFSzsKLSAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKLSAgICAgICAgbVNlZWtUaW1lVXMgPSBtTGFzdFZpZGVvVGltZVVzOwotICAgICAgICBtRmxhZ3MgJj0gfihBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpOwotICAgIH0KLQotICAgIGlmICh3YXNQbGF5aW5nKSB7Ci0gICAgICAgIHBsYXlfbCgpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb1NpbmsoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldExvb3BpbmcoYm9vbCBzaG91bGRMb29wKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1GbGFncyA9IG1GbGFncyAmIH5MT09QSU5HOwotCi0gICAgaWYgKHNob3VsZExvb3ApIHsKLSAgICAgICAgbUZsYWdzIHw9IExPT1BJTkc7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldER1cmF0aW9uX2woaW50NjRfdCBkdXJhdGlvblVzKSB7Ci0gICAgaWYgKG1EdXJhdGlvblVzIDwgMCB8fCBkdXJhdGlvblVzID4gbUR1cmF0aW9uVXMpIHsKLSAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOwotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAqZHVyYXRpb25VcyA9IG1EdXJhdGlvblVzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0UG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25VcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAqcG9zaXRpb25VcyA9IG1TZWVrVGltZVVzOwotICAgIH0gZWxzZSBpZiAobVZpZGVvU291cmNlICE9IE5VTEwKLSAgICAgICAgICAgICYmIChtQXVkaW9QbGF5ZXIgPT0gTlVMTCB8fCAhKG1GbGFncyAmIFZJREVPX0FUX0VPUykpKSB7Ci0gICAgICAgICpwb3NpdGlvblVzID0gbVZpZGVvVGltZVVzOwotICAgIH0gZWxzZSBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgKnBvc2l0aW9uVXMgPSBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZVVzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnBvc2l0aW9uVXMgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRQb3NpdGlvbl9sKGludDY0X3QgdGltZVVzKSB7Ci0gICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZWVrVG9fbChpbnQ2NF90IHRpbWVVcykgewotICAgIEFMT0dWKCJzZWVrVG9fbCIpOwotICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewotICAgICAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOwotICAgICAgICBwbGF5X2woKTsKLSAgICB9Ci0KLSAgICBpZiAoKG1GbGFncyAmIFBMQVlJTkcpICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMICYmIChtRmxhZ3MgJiBWSURFT19BVF9FT1MpKSB7Ci0gICAgICAgIC8vIFZpZGVvIHBsYXliYWNrIGNvbXBsZXRlZCBiZWZvcmUsIHRoZXJlJ3Mgbm8gcGVuZGluZwotICAgICAgICAvLyB2aWRlbyBldmVudCByaWdodCBub3cuIEluIG9yZGVyIGZvciB0aGlzIG5ldyBzZWVrCi0gICAgICAgIC8vIHRvIGJlIGhvbm9yZWQsIHdlIG5lZWQgdG8gcG9zdCBvbmUuCi0KLSAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgIH0KLQotICAgIG1TZWVraW5nID0gU0VFSzsKLSAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVVczsKLSAgICBtRmxhZ3MgJj0gfihBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpOwotCi0gICAgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwotCi0gICAgaWYgKCEobUZsYWdzICYgUExBWUlORykpIHsKLSAgICAgICAgQUxPR1YoInNlZWtpbmcgd2hpbGUgcGF1c2VkLCBzZW5kaW5nIFNFRUtfQ09NUExFVEUgbm90aWZpY2F0aW9uIgotICAgICAgICAgICAgICIgaW1tZWRpYXRlbHkuIik7Ci0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKLSAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKLQotICAgICAgICBpZiAoKG1GbGFncyAmIFBSRVBBUkVEKSAmJiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZsYWdzIHw9IFNFRUtfUFJFVklFVzsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCkgewotICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLICYmIG1WaWRlb1NvdXJjZSA9PSBOVUxMICYmIG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1BsYXllci0+c2Vla1RvKG1TZWVrVGltZVVzKTsKLQotICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpIHsKLSAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7Ci0gICAgbUF1ZGlvVHJhY2sgPSBzb3VyY2U7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0VmlkZW9Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpIHsKLSAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7Ci0gICAgbVZpZGVvVHJhY2sgPSBzb3VyY2U7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6ZmluaXNoU2Vla0lmTmVjZXNzYXJ5KGludDY0X3QgdmlkZW9UaW1lVXMpIHsKLSAgICBpZiAobVNlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7Ci0gICAgICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtU2Vla2luZyA9PSBOT19TRUVLIHx8IChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInNlZWtpbmcgYXVkaW8gdG8gJWxsZCB1cyAoJS4yZiBzZWNzKS4iLCB2aWRlb1RpbWVVcywgdmlkZW9UaW1lVXMgLyAxRTYpOwotCi0gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSB2aWRlbyB0aW1lLCBzZWVrIGF1ZGlvIHRvIHRoZSBvcmlnaW5hbGx5Ci0gICAgICAgIC8vIHJlcXVlc3RlZCBzZWVrIHRpbWUgaW5zdGVhZC4KLQotICAgICAgICBtQXVkaW9QbGF5ZXItPnNlZWtUbyh2aWRlb1RpbWVVcyA8IDAgPyBtU2Vla1RpbWVVcyA6IHZpZGVvVGltZVVzKTsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSB0cnVlOwotICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICghbVNlZWtOb3RpZmljYXRpb25TZW50KSB7Ci0gICAgICAgIC8vIElmIHdlJ3JlIHBsYXlpbmcgdmlkZW8gb25seSwgcmVwb3J0IHNlZWsgY29tcGxldGUgbm93LAotICAgICAgICAvLyBvdGhlcndpc2UgYXVkaW8gcGxheWVyIHdpbGwgbm90aWZ5IHVzIGxhdGVyLgotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotICAgIH0KLQotICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKLSAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25DaGVja0F1ZGlvU3RhdHVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgLy8gRXZlbnQgd2FzIGRpc3BhdGNoZWQgYW5kIHdoaWxlIHdlIHdlcmUgYmxvY2tpbmcgb24gdGhlIG11dGV4LAotICAgICAgICAvLyBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaWYgKG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlICYmICFtQXVkaW9QbGF5ZXItPmlzU2Vla2luZygpKSB7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFtU2Vla05vdGlmaWNhdGlvblNlbnQpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgIH0KLQotICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwotICAgIGlmIChtV2F0Y2hGb3JBdWRpb0VPUyAmJiBtQXVkaW9QbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewotICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IGZhbHNlOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7Ci0gICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChmaW5hbFN0YXR1cyk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RWaWRlb0V2ZW50X2woaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgaWYgKG1WaWRlb0V2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLSAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1WaWRlb0V2ZW50LCBkZWxheVVzIDwgMCA/IDEwMDAwIDogZGVsYXlVcyk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFN0cmVhbURvbmVFdmVudF9sKHN0YXR1c190IHN0YXR1cykgewotICAgIGlmIChtU3RyZWFtRG9uZUV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLQotICAgIG1TdHJlYW1Eb25lU3RhdHVzID0gc3RhdHVzOwotICAgIG1RdWV1ZS5wb3N0RXZlbnQobVN0cmVhbURvbmVFdmVudCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFZpZGVvTGFnRXZlbnRfbCgpIHsKLSAgICBpZiAobVZpZGVvTGFnRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVZpZGVvTGFnRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLSAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1WaWRlb0xhZ0V2ZW50LCAxMDAwMDAwbGwpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBpZiAobUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLSAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQsIGRlbGF5VXMpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmFib3J0UHJlcGFyZShzdGF0dXNfdCBlcnIpIHsKLSAgICBDSEVDSyhlcnIgIT0gT0spOwotCi0gICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwotICAgIH0KLQotICAgIG1QcmVwYXJlUmVzdWx0ID0gZXJyOwotICAgIG1GbGFncyAmPSB+KFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRHxQUkVQQVJJTkdfQ09OTkVDVEVEKTsKLSAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBOVUxMOwotICAgIG1QcmVwYXJlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotdWludDMyX3QgUHJldmlld1BsYXllcjo6Z2V0U291cmNlU2Vla0ZsYWdzKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbUV4dHJhY3RvckZsYWdzOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RBdWRpb0VPUyhpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChkZWxheVVzKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0QXVkaW9TZWVrQ29tcGxldGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woMCAvKiBkZWxheVVzICovKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjp1cGRhdGVCYXR0ZXJ5VXNhZ2VfbCgpIHsKLSAgICB1aW50MzJfdCBwYXJhbXMgPSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0RlY29kZXI7Ci0gICAgaWYgKChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgJiYgKG1BdWRpb1NvdXJjZSAhPSBtQXVkaW9UcmFjaykpIHsKLSAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrQXVkaW87Ci0gICAgfQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tWaWRlbzsKLSAgICB9Ci0gICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhMTNiNTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUFJFVklFV19QTEFZRVJfSF8KLQotI2RlZmluZSBQUkVWSUVXX1BMQVlFUl9IXwotCi0jaW5jbHVkZSAiVGltZWRFdmVudFF1ZXVlLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI7Ci1zdHJ1Y3QgTWVkaWFFeHRyYWN0b3I7Ci0KLXN0cnVjdCBQcmV2aWV3UGxheWVyIHsKLSAgICBQcmV2aWV3UGxheWVyKE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlcik7Ci0gICAgflByZXZpZXdQbGF5ZXIoKTsKLQotICAgIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpOwotICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIHN0YXR1c190IHBsYXkoKTsKLSAgICBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgYm9vbCBpc1BsYXlpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwotICAgIHZvaWQgc2V0U3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKTsKLSAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lVXMpOwotCi0gICAgc3RhdHVzX3QgZ2V0VmlkZW9EaW1lbnNpb25zKGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIGNvbnN0OwotCi0KLSAgICAvLyBGSVhNRTogU3luYyBiZXR3ZWVuIC4uLgotICAgIHZvaWQgYWNxdWlyZUxvY2soKTsKLSAgICB2b2lkIHJlbGVhc2VMb2NrKCk7Ci0KLSAgICBzdGF0dXNfdCBwcmVwYXJlKCk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpwYXRoKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspOwotICAgIHN0YXR1c190IHNldExvb3BpbmcoYm9vbCBzaG91bGRMb29wKTsKLSAgICBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKLSAgICBzdGF0dXNfdCBnZXRQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvblVzKTsKLQotICAgIHVpbnQzMl90IGdldFNvdXJjZVNlZWtGbGFncygpIGNvbnN0OwotCi0gICAgdm9pZCBwb3N0QXVkaW9FT1MoaW50NjRfdCBkZWxheVVzID0gMGxsKTsKLSAgICB2b2lkIHBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOwotCi0gICAgc3RhdHVzX3QgbG9hZEVmZmVjdHNTZXR0aW5ncyhNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3RTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRWZmZWN0cyk7Ci0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvTWl4U2V0dGluZ3MoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzKTsKLSAgICBzdGF0dXNfdCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoTTRPU0FfQ29udGV4dCBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLSAgICBzdGF0dXNfdCBzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbShNNE9TQV9VSW50MzIgYXVkaW9NaXhTdG9yeUJvYXJkVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudE1lZGlhVm9sdW1lVm9sKTsKLQotICAgIHN0YXR1c190IHNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHN0YXR1c190IHNldFBsYXliYWNrRW5kVGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICBzdGF0dXNfdCBzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHN0YXR1c190IHNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKTsKLSAgICBzdGF0dXNfdCBzZXRNZWRpYVJlbmRlcmluZ01vZGUoTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKTsKLQotICAgIHN0YXR1c190IHJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKTsKLSAgICBzdGF0dXNfdCBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotICAgIHN0YXR1c190IHJlYWRGaXJzdFZpZGVvRnJhbWUoKTsKLSAgICBzdGF0dXNfdCBnZXRMYXN0UmVuZGVyZWRUaW1lTXModWludDMyX3QgKmxhc3RSZW5kZXJlZFRpbWVNcyk7Ci0gICAgc3RhdHVzX3Qgc2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBQTEFZSU5HICAgICAgICAgICAgID0gMSwKLSAgICAgICAgTE9PUElORyAgICAgICAgICAgICA9IDIsCi0gICAgICAgIEZJUlNUX0ZSQU1FICAgICAgICAgPSA0LAotICAgICAgICBQUkVQQVJJTkcgICAgICAgICAgID0gOCwKLSAgICAgICAgUFJFUEFSRUQgICAgICAgICAgICA9IDE2LAotICAgICAgICBBVF9FT1MgICAgICAgICAgICAgID0gMzIsCi0gICAgICAgIFBSRVBBUkVfQ0FOQ0VMTEVEICAgPSA2NCwKLSAgICAgICAgQ0FDSEVfVU5ERVJSVU4gICAgICA9IDEyOCwKLSAgICAgICAgQVVESU9fQVRfRU9TICAgICAgICA9IDI1NiwKLSAgICAgICAgVklERU9fQVRfRU9TICAgICAgICA9IDUxMiwKLSAgICAgICAgQVVUT19MT09QSU5HICAgICAgICA9IDEwMjQsCi0gICAgICAgIElORk9STUVEX0FWX0VPUyAgICAgPSAyMDQ4LAotCi0gICAgICAgIC8vIFdlIGFyZSBiYXNpY2FsbHkgZG9uZSBwcmVwYXJpbmcgYnV0IGFyZSBjdXJyZW50bHkgYnVmZmVyaW5nCi0gICAgICAgIC8vIHN1ZmZpY2llbnQgZGF0YSB0byBiZWdpbiBwbGF5YmFjayBhbmQgZmluaXNoIHRoZSBwcmVwYXJhdGlvbiBwaGFzZQotICAgICAgICAvLyBmb3IgZ29vZC4KLSAgICAgICAgUFJFUEFSSU5HX0NPTk5FQ1RFRCA9IDIwNDgsCi0KLSAgICAgICAgLy8gV2UncmUgdHJpZ2dlcmluZyBhIHNpbmdsZSB2aWRlbyBldmVudCB0byBkaXNwbGF5IHRoZSBmaXJzdCBmcmFtZQotICAgICAgICAvLyBhZnRlciB0aGUgc2Vla3BvaW50LgotICAgICAgICBTRUVLX1BSRVZJRVcgICAgICAgID0gNDA5NiwKLQotICAgICAgICBBVURJT19SVU5OSU5HICAgICAgID0gODE5MiwKLSAgICAgICAgQVVESU9QTEFZRVJfU1RBUlRFRCA9IDE2Mzg0LAotCi0gICAgICAgIElOQ09HTklUTyAgICAgICAgICAgPSAzMjc2OCwKLSAgICB9OwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIE9NWENsaWVudCBtQ2xpZW50OwotICAgIFRpbWVkRXZlbnRRdWV1ZSBtUXVldWU7Ci0gICAgYm9vbCBtUXVldWVTdGFydGVkOwotICAgIHdwPE1lZGlhUGxheWVyQmFzZT4gbUxpc3RlbmVyOwotCi0gICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKLQotICAgIFN5c3RlbVRpbWVTb3VyY2UgbVN5c3RlbVRpbWVTb3VyY2U7Ci0gICAgVGltZVNvdXJjZSAqbVRpbWVTb3VyY2U7Ci0KLSAgICBTdHJpbmc4IG1Vcmk7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVZpZGVvVHJhY2s7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IG1WaWRlb1NvdXJjZTsKLSAgICBib29sIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3OwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1BdWRpb1RyYWNrOwotICAgIHNwPE1lZGlhU291cmNlPiBtQXVkaW9Tb3VyY2U7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbUF1ZGlvUGxheWVyOwotICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Ci0KLSAgICBpbnQzMl90IG1EaXNwbGF5V2lkdGg7Ci0gICAgaW50MzJfdCBtRGlzcGxheUhlaWdodDsKLQotICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICB1aW50MzJfdCBtRXh0cmFjdG9yRmxhZ3M7Ci0KLSAgICBpbnQ2NF90IG1UaW1lU291cmNlRGVsdGFVczsKLSAgICBpbnQ2NF90IG1WaWRlb1RpbWVVczsKLQotICAgIGVudW0gU2Vla1R5cGUgewotICAgICAgICBOT19TRUVLLAotICAgICAgICBTRUVLLAotICAgICAgICBTRUVLX1ZJREVPX09OTFkKLSAgICB9OwotICAgIFNlZWtUeXBlIG1TZWVraW5nOwotCi0gICAgYm9vbCBtU2Vla05vdGlmaWNhdGlvblNlbnQ7Ci0gICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLQotICAgIGludDY0X3QgbUJpdHJhdGU7ICAvLyB0b3RhbCBiaXRyYXRlIG9mIHRoZSBmaWxlIChpbiBicHMpIG9yIC0xIGlmIHVua25vd24uCi0KLSAgICBib29sIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlOwotICAgIGJvb2wgbVdhdGNoRm9yQXVkaW9FT1M7Ci0KLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtVmlkZW9FdmVudDsKLSAgICBib29sIG1WaWRlb0V2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtU3RyZWFtRG9uZUV2ZW50OwotICAgIGJvb2wgbVN0cmVhbURvbmVFdmVudFBlbmRpbmc7Ci0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbUNoZWNrQXVkaW9TdGF0dXNFdmVudDsKLSAgICBib29sIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtVmlkZW9MYWdFdmVudDsKLSAgICBib29sIG1WaWRlb0xhZ0V2ZW50UGVuZGluZzsKLQotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1Bc3luY1ByZXBhcmVFdmVudDsKLSAgICBDb25kaXRpb24gbVByZXBhcmVkQ29uZGl0aW9uOwotICAgIGJvb2wgbUlzQXN5bmNQcmVwYXJlOwotICAgIHN0YXR1c190IG1QcmVwYXJlUmVzdWx0OwotICAgIHN0YXR1c190IG1TdHJlYW1Eb25lU3RhdHVzOwotCi0gICAgTWVkaWFCdWZmZXIgKm1WaWRlb0J1ZmZlcjsKLSAgICBpbnQ2NF90IG1MYXN0VmlkZW9UaW1lVXM7Ci0gICAgQVJlY3QgbUNyb3BSZWN0OwotICAgIGludDMyX3QgbUdpdmVuV2lkdGgsIG1HaXZlbkhlaWdodDsKLQotCi0gICAgYm9vbCBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZDsKLQotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyICptTmF0aXZlV2luZG93UmVuZGVyZXI7Ci0gICAgUmVuZGVySW5wdXQgKm1WaWRlb1JlbmRlcmVyOwotCi0gICAgaW50MzJfdCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0OwotCi0gICAgLy9EYXRhIHN0cnVjdHVyZXMgdXNlZCBmb3IgYXVkaW8gYW5kIHZpZGVvIGVmZmVjdHMKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIG1FZmZlY3RzU2V0dGluZ3M7Ci0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIG1QcmV2aWV3UGxheWVyQXVkaW9NaXhTZXR0aW5nczsKLSAgICBNNE9TQV9Db250ZXh0IG1BdWRpb01peFBDTUZpbGVIYW5kbGU7Ci0gICAgTTRPU0FfVUludDMyIG1BdWRpb01peFN0b3J5Qm9hcmRUUzsKLSAgICBNNE9TQV9VSW50MzIgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZTsKLSAgICBNNE9TQV9VSW50MzIgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlOwotICAgIE00T1NBX1VJbnQzMiBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleDsKLQotICAgIHVpbnQzMl90IG1OdW1iZXJFZmZlY3RzOwotICAgIHVpbnQzMl90IG1QbGF5QmVnaW5UaW1lTXNlYzsKLSAgICB1aW50MzJfdCBtUGxheUVuZFRpbWVNc2VjOwotICAgIHVpbnQ2NF90IG1EZWNvZGVkVmlkZW9UczsgLy8gdGltZXN0YW1wIG9mIGN1cnJlbnQgZGVjb2RlZCB2aWRlbyBmcmFtZSBidWZmZXIKLSAgICB1aW50NjRfdCBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQ7IC8vIHRpbWVzdGFtcCBvZiBmcmFtZSByZWxhdGl2ZSB0byBzdG9yeWJvYXJkCi0gICAgdWludDMyX3QgbUN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICB1aW50MzJfdCBtUHJvZ3Jlc3NDYkludGVydmFsOwotICAgIHVpbnQzMl90IG1OdW1iZXJEZWNWaWRlb0ZyYW1lczsgLy8gQ291bnRlciBvZiBudW1iZXIgb2YgdmlkZW8gZnJhbWVzIGRlY29kZWQKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtUHJvZ3Jlc3NDYkV2ZW50OwotICAgIGJvb2wgbVByb2dyZXNzQ2JFdmVudFBlbmRpbmc7Ci0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbU92ZXJsYXlVcGRhdGVFdmVudDsKLSAgICBib29sIG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nOwotICAgIGJvb2wgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZDsKLQotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtUmVuZGVyaW5nTW9kZTsKLSAgICB1aW50MzJfdCBtT3V0cHV0VmlkZW9XaWR0aDsKLSAgICB1aW50MzJfdCBtT3V0cHV0VmlkZW9IZWlnaHQ7Ci0KLSAgICB1aW50MzJfdCBtU3Rvcnlib2FyZFN0YXJ0VGltZU1zZWM7Ci0KLSAgICBib29sIG1Jc1ZpZGVvU291cmNlSnBnOwotICAgIGJvb2wgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7Ci0gICAgaW50NjRfdCBtSW1hZ2VGcmFtZVRpbWVVczsKLSAgICBib29sIG1TdGFydE5leHRQbGF5ZXI7Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9ja0NvbnRyb2w7Ci0KLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVSR0JCdWZmZXI7Ci0gICAgTTRWSUZJX1VJbnQ4KiAgbUZyYW1lWVVWQnVmZmVyOwotCi0gICAgdm9pZCBjYW5jZWxQbGF5ZXJFdmVudHNfbChib29sIHVwZGF0ZVByb2dyZXNzQ2IgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKGNvbnN0IHNwPE1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woY29uc3QgY2hhciAqcGF0aCk7Ci0gICAgdm9pZCBzZXROYXRpdmVXaW5kb3dfbChjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlKTsKLSAgICB2b2lkIHJlc2V0X2woKTsKLSAgICB2b2lkIGNsZWFyX2woKTsKLSAgICBzdGF0dXNfdCBwbGF5X2woKTsKLSAgICBzdGF0dXNfdCBwYXVzZV9sKGJvb2wgYXRfZW9zID0gZmFsc2UpOwotICAgIHN0YXR1c190IGluaXRSZW5kZXJlcl9sKCk7Ci0gICAgc3RhdHVzX3QgaW5pdEF1ZGlvRGVjb2Rlcl9sKCk7Ci0gICAgc3RhdHVzX3QgaW5pdFZpZGVvRGVjb2Rlcl9sKHVpbnQzMl90IGZsYWdzID0gMCk7Ci0gICAgdm9pZCBub3RpZnlWaWRlb1NpemVfbCgpOwotICAgIHZvaWQgbm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCk7Ci0gICAgdm9pZCBvblZpZGVvRXZlbnQoKTsKLSAgICB2b2lkIG9uVmlkZW9MYWdVcGRhdGUoKTsKLSAgICB2b2lkIG9uU3RyZWFtRG9uZSgpOwotICAgIHZvaWQgb25DaGVja0F1ZGlvU3RhdHVzKCk7Ci0gICAgdm9pZCBvblByZXBhcmVBc3luY0V2ZW50KCk7Ci0KLSAgICB2b2lkIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7Ci0gICAgdm9pZCBhYm9ydFByZXBhcmUoc3RhdHVzX3QgZXJyKTsKLQotICAgIHN0YXR1c190IHN0YXJ0QXVkaW9QbGF5ZXJfbCgpOwotICAgIHZvaWQgc2V0VmlkZW9Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOwotICAgIHN0YXR1c190IGZpbmlzaFNldERhdGFTb3VyY2VfbCgpOwotICAgIHZvaWQgc2V0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOwotCi0gICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCB0aW1lVXMpOwotICAgIHZvaWQgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwotICAgIHZvaWQgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KGludDY0X3QgdmlkZW9UaW1lVXMpOwotCi0gICAgdm9pZCBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woaW50NjRfdCBkZWxheVVzKTsKLSAgICB2b2lkIHBvc3RWaWRlb0xhZ0V2ZW50X2woKTsKLSAgICB2b2lkIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChzdGF0dXNfdCBzdGF0dXMpOwotICAgIHZvaWQgcG9zdFZpZGVvRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMgPSAtMSk7Ci0gICAgdm9pZCBzZXRWaWRlb1Bvc3RQcm9jZXNzaW5nTm9kZSgKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSk7Ci0gICAgdm9pZCBwb3N0UHJvZ3Jlc3NDYWxsYmFja0V2ZW50X2woKTsKLSAgICB2b2lkIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKLSAgICB2b2lkIG9uUHJvZ3Jlc3NDYkV2ZW50KCk7Ci0KLSAgICB2b2lkIHBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpOwotICAgIHZvaWQgb25VcGRhdGVPdmVybGF5RXZlbnQoKTsKLQotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbF9qcGcoKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlX2woKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmNfbCgpOwotICAgIHZvaWQgdXBkYXRlQmF0dGVyeVVzYWdlX2woKTsKLSAgICB2b2lkIHVwZGF0ZVNpemVUb1JlbmRlcihzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLSAgICB2b2lkIHNldER1cmF0aW9uX2woaW50NjRfdCBkdXJhdGlvblVzKTsKLSAgICB2b2lkIHNldFBvc2l0aW9uX2woaW50NjRfdCB0aW1lVXMpOwotCi0gICAgUHJldmlld1BsYXllcihjb25zdCBQcmV2aWV3UGxheWVyICYpOwotICAgIFByZXZpZXdQbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBQcmV2aWV3UGxheWVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQUkVWSUVXX1BMQVlFUl9IXwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxY2ZjOGUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlByZXZpZXdSZW5kZXJlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVByZXZpZXdSZW5kZXJlciogUHJldmlld1JlbmRlcmVyOjpDcmVhdGVQcmV2aWV3UmVuZGVyZXIgKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICBQcmV2aWV3UmVuZGVyZXIqIHJlbmRlcmVyID0gbmV3IFByZXZpZXdSZW5kZXJlcihzdXJmYWNlLCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgIGlmIChyZW5kZXJlci0+aW5pdCgpICE9IDApIHsKLSAgICAgICAgZGVsZXRlIHJlbmRlcmVyOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVuZGVyZXI7Ci19Ci0KLVByZXZpZXdSZW5kZXJlcjo6UHJldmlld1JlbmRlcmVyKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KQotICAgIDogbVN1cmZhY2Uoc3VyZmFjZSksCi0gICAgICBtV2lkdGgod2lkdGgpLAotICAgICAgbUhlaWdodChoZWlnaHQpIHsKLX0KLQotaW50IFByZXZpZXdSZW5kZXJlcjo6aW5pdCgpIHsKLSAgICBpbnQgZXJyID0gMDsKLSAgICBBTmF0aXZlV2luZG93KiBhbncgPSBtU3VyZmFjZS5nZXQoKTsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoYW53LCBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKAotICAgICAgICAgICAgYW53LCBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LCAzKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUoCi0gICAgICAgICAgICBhbncsIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSgKLSAgICAgICAgICAgIGFudywgbVdpZHRoLCBtSGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIpOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKGFudywgMCk7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi1mYWlsOgotICAgIHJldHVybiBlcnI7Ci19Ci0KLVByZXZpZXdSZW5kZXJlcjo6flByZXZpZXdSZW5kZXJlcigpIHsKLSAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1TdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotfQotCi0KLS8vCi0vLyBQcm92aWRlcyBhIGJ1ZmZlciBhbmQgYXNzb2NpYXRlZCBzdHJpZGUKLS8vIFRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGUgU3VyZmFjZUZsaW5nZXIKLS8vCi0vLyBGb3Igb3B0aW1hbCBkaXNwbGF5IHBlcmZvcm1hbmNlcywgeW91IHNob3VsZCA6Ci0vLyAxKSBjYWxsIGdldEJ1ZmZlcllWMTIoKQotLy8gMikgZmlsbCB0aGUgYnVmZmVyIHdpdGggeW91ciBkYXRhCi0vLyAzKSBjYWxsIHJlbmRlcllWMTIoKSB0byB0YWtlIHRoZXNlIGNoYW5nZXMgaW50byBhY2NvdW50Ci0vLwotLy8gRm9yIGVhY2ggY2FsbCB0byBnZXRCdWZmZXJZVjEyKCksIHlvdSBtdXN0IGFsc28gY2FsbCByZW5kZXJZVjEyKCkKLS8vIEV4cGVjdGVkIGZvcm1hdCBpbiB0aGUgYnVmZmVyIGlzIFlWMTIgZm9ybWF0cyAoc2ltaWxhciB0byBZVVY0MjAgcGxhbmFyIGZyb21hdCkKLS8vIGZvciBtb3JlIGRldGFpbHMgb24gdGhpcyBZVjEyIGNmIGhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUvaGFyZHdhcmUvaGFyZHdhcmUuaAotLy8KLXZvaWQgUHJldmlld1JlbmRlcmVyOjpnZXRCdWZmZXJZVjEyKHVpbnQ4X3QgKipkYXRhLCBzaXplX3QgKnN0cmlkZSkgewotICAgIGludCBlcnIgPSBPSzsKLQotICAgIGlmICgoZXJyID0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChtU3VyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgICZtQnVmKSkgIT0gMCkgewotICAgICAgICBBTE9HVygibmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKLQotICAgIFJlY3QgYm91bmRzKG1XaWR0aCwgbUhlaWdodCk7Ci0KLSAgICB2b2lkICpkc3Q7Ci0gICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2sobUJ1Zi0+aGFuZGxlLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKLSAgICAgICAgICAgIGJvdW5kcywgJmRzdCkpOwotCi0gICAgKmRhdGEgICA9ICh1aW50OF90Kilkc3Q7Ci0gICAgKnN0cmlkZSA9IG1CdWYtPnN0cmlkZTsKLX0KLQotCi0vLwotLy8gRGlzcGxheSB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyIHByb3ZpZGVkIGJ5IGxhc3QgY2FsbCB0byBnZXRCdWZmZXJZVjEyKCkKLS8vCi0vLyBTZWUgZ2V0QnVmZmVyWVYxMigpIGZvciBkZXRhaWxzLgotLy8KLXZvaWQgUHJldmlld1JlbmRlcmVyOjpyZW5kZXJZVjEyKCkgewotICAgIGludCBlcnIgPSBPSzsKLQotICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOwotCi0gICAgaWYgKG1CdWYhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLX0VRKDAsIG1hcHBlci51bmxvY2sobUJ1Zi0+aGFuZGxlKSk7Ci0KLSAgICAgICAgaWYgKChlcnIgPSBtU3VyZmFjZS0+QU5hdGl2ZVdpbmRvdzo6cXVldWVCdWZmZXIobVN1cmZhY2UuZ2V0KCksIG1CdWYsIC0xKSkgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtQnVmID0gTlVMTDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTI4Mjc2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBQUkVWSUVXX1JFTkRFUkVSX0hfCi0KLSNkZWZpbmUgUFJFVklFV19SRU5ERVJFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN1cmZhY2U7Ci0KLWNsYXNzIFByZXZpZXdSZW5kZXJlciB7Ci1wdWJsaWM6Ci0KLXN0YXRpYyBQcmV2aWV3UmVuZGVyZXIqIENyZWF0ZVByZXZpZXdSZW5kZXJlciAoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOwotCi0gICAgflByZXZpZXdSZW5kZXJlcigpOwotCi0gICAgdm9pZCBnZXRCdWZmZXJZVjEyKHVpbnQ4X3QgKipkYXRhLCBzaXplX3QgKnN0cmlkZSk7Ci0KLSAgICB2b2lkIHJlbmRlcllWMTIoKTsKLQotICAgIHN0YXRpYyBzaXplX3QgQUxJR04oc2l6ZV90IHgsIHNpemVfdCBhbGlnbm1lbnQpIHsKLSAgICAgICAgcmV0dXJuICh4ICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKLSAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCk7Ci0KLSAgICBpbnQgaW5pdCgpOwotCi0gICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7Ci0gICAgc2l6ZV90IG1XaWR0aCwgbUhlaWdodDsKLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKm1CdWY7Ci0KLSAgICBQcmV2aWV3UmVuZGVyZXIoY29uc3QgUHJldmlld1JlbmRlcmVyICYpOwotICAgIFByZXZpZXdSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFByZXZpZXdSZW5kZXJlciAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUFJFVklFV19SRU5ERVJFUl9IXwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3NmY4ZTkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JBdWRpb1BsYXllciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi0jaW5jbHVkZSAiUHJldmlld1BsYXllci5oIgotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpWaWRlb0VkaXRvckF1ZGlvUGxheWVyKAotICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luaywKLSAgICAgICAgUHJldmlld1BsYXllciAqb2JzZXJ2ZXIpCi0gICAgOiBtSW5wdXRCdWZmZXIoTlVMTCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1MYXRlbmN5VXMoMCksCi0gICAgICBtRnJhbWVTaXplKDApLAotICAgICAgbU51bUZyYW1lc1BsYXllZCgwKSwKLSAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzKC0xKSwKLSAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMoLTEpLAotICAgICAgbVNlZWtpbmcoZmFsc2UpLAotICAgICAgbVJlYWNoZWRFT1MoZmFsc2UpLAotICAgICAgbUZpbmFsU3RhdHVzKE9LKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Jc0ZpcnN0QnVmZmVyKGZhbHNlKSwKLSAgICAgIG1GaXJzdEJ1ZmZlclJlc3VsdChPSyksCi0gICAgICBtRmlyc3RCdWZmZXIoTlVMTCksCi0gICAgICBtQXVkaW9TaW5rKGF1ZGlvU2luayksCi0gICAgICBtT2JzZXJ2ZXIob2JzZXJ2ZXIpIHsKLQotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwotICAgIG1CR0F1ZGlvUENNRmlsZUhhbmRsZSA9IE5VTEw7Ci0gICAgbUF1ZGlvUHJvY2VzcyA9IE5VTEw7Ci0gICAgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiA9IDA7Ci0gICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA9IDA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCA9IDA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhQmVnaW5DdXRUUyA9IDA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbVNvdXJjZSA9IE5VTEw7Ci19Ci0KLVZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6On5WaWRlb0VkaXRvckF1ZGlvUGxheWVyKCkgewotCi0gICAgQUxPR1YoIkRlc3RydWN0b3IiKTsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0gICAgaWYgKG1BdWRpb1Byb2Nlc3MgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUF1ZGlvUHJvY2VzczsKLSAgICAgICAgbUF1ZGlvUHJvY2VzcyA9IE5VTEw7Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnBhdXNlKGJvb2wgcGxheVBlbmRpbmdTYW1wbGVzKSB7Ci0gICAgQUxPR1YoInBhdXNlOiBwbGF5UGVuZGluZ1NhbXBsZXM9JWQiLCBwbGF5UGVuZGluZ1NhbXBsZXMpOwotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGlmIChwbGF5UGVuZGluZ1NhbXBsZXMpIHsKLSAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpjbGVhcigpIHsKLSAgICBBTE9HVigiY2xlYXIiKTsKLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwotCi0gICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgYW55IGJ1ZmZlciB3ZSBob2xkIG9udG8gc28gdGhhdCB0aGUKLSAgICAvLyBzb3VyY2UgaXMgYWJsZSB0byBzdG9wKCkuCi0KLSAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJBdWRpb1BsYXllckJhc2UgcmVsZWFzaW5nIGlucHV0IGJ1ZmZlci4iKTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKLSAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5Ci0gICAgLy8gdG8gaW5zdGFudGlhdGUgaXQgYWdhaW4uCi0gICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1Tb3VyY2U7Ci0gICAgbVNvdXJjZS5jbGVhcigpOwotICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgdXNsZWVwKDEwMDApOwotICAgIH0KLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0KLSAgICBtTnVtRnJhbWVzUGxheWVkID0gMDsKLSAgICBtUG9zaXRpb25UaW1lTWVkaWFVcyA9IC0xOwotICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPSAtMTsKLSAgICBtU2Vla2luZyA9IGZhbHNlOwotICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Ci0gICAgbUZpbmFsU3RhdHVzID0gT0s7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVzdW1lKCkgewotICAgIEFMT0dWKCJyZXN1bWUiKTsKLQotICAgIEF1ZGlvTWl4U2V0dGluZ3MgYXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8vIFNpbmdsZSBhdWRpbyBwbGF5ZXIgaXMgdXNlZDsKLSAgICAvLyBQYXNzIG9uIHRoZSBhdWRpbyBkdWNraW5nIHBhcmFtZXRlcnMKLSAgICAvLyB3aGljaCBtaWdodCBoYXZlIGNoYW5nZWQgd2l0aCBuZXcgYXVkaW8gc291cmNlCi0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ190aHJlc2hvbGQgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfbG93Vm9sdW1lID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfbG93Vm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfZW5hYmxlID0KLSAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJJbkR1Y2tpbmdfZW5hYmxlOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVFZvbExldmVsID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUFkZFZvbHVtZSkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlCVENoYW5uZWxDb3VudDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2UFRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzOwotCi0gICAgLy8gQ2FsbCB0byBBdWRpbyBtaXggcGFyYW0gc2V0dGluZwotICAgIG1BdWRpb1Byb2Nlc3MtPnNldE1peFBhcmFtcyhhdWRpb01peFNldHRpbmdzKTsKLQotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZWVrVG8oaW50NjRfdCB0aW1lX3VzKSB7Ci0gICAgQUxPR1YoInNlZWtUbzogJWxsZCIsIHRpbWVfdXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtU2Vla2luZyA9IHRydWU7Ci0gICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7Ci0KLSAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmlzU2Vla2luZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoImlzU2Vla2luZzogbVNlZWtpbmc9JWQiLCBtU2Vla2luZyk7Ci0gICAgcmV0dXJuIG1TZWVraW5nOwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnJlYWNoZWRFT1Moc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSB7Ci0gICAgQUxPR1YoInJlYWNoZWRFT1M6IHN0YXR1cz0lZCIsIG1GaW5hbFN0YXR1cyk7Ci0gICAgKmZpbmFsU3RhdHVzID0gT0s7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICpmaW5hbFN0YXR1cyA9IG1GaW5hbFN0YXR1czsKLSAgICByZXR1cm4gbVJlYWNoZWRFT1M7Ci19Ci0KLWludDY0X3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0UmVhbFRpbWVVcygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBnZXRSZWFsVGltZVVzX2woKTsKLX0KLQotaW50NjRfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRSZWFsVGltZVVzX2woKSB7Ci0gICAgcmV0dXJuIC1tTGF0ZW5jeVVzICsgKG1OdW1GcmFtZXNQbGF5ZWQgKiAxMDAwMDAwKSAvIG1TYW1wbGVSYXRlOwotfQotCi1pbnQ2NF90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldE1lZGlhVGltZVVzKCkgewotICAgIEFMT0dWKCJnZXRNZWRpYVRpbWVVcyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVBvc2l0aW9uVGltZU1lZGlhVXMgPCAwIHx8IG1Qb3NpdGlvblRpbWVSZWFsVXMgPCAwKSB7Ci0gICAgICAgIGlmIChtU2Vla2luZykgewotICAgICAgICAgICAgcmV0dXJuIG1TZWVrVGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaW50NjRfdCByZWFsVGltZU9mZnNldCA9IGdldFJlYWxUaW1lVXNfbCgpIC0gbVBvc2l0aW9uVGltZVJlYWxVczsKLSAgICBpZiAocmVhbFRpbWVPZmZzZXQgPCAwKSB7Ci0gICAgICAgIHJlYWxUaW1lT2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVBvc2l0aW9uVGltZU1lZGlhVXMgKyByZWFsVGltZU9mZnNldDsKLX0KLQotYm9vbCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRNZWRpYVRpbWVNYXBwaW5nKAotICAgICAgICBpbnQ2NF90ICpyZWFsdGltZV91cywgaW50NjRfdCAqbWVkaWF0aW1lX3VzKSB7Ci0gICAgQUxPR1YoImdldE1lZGlhVGltZU1hcHBpbmciKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgKnJlYWx0aW1lX3VzID0gbVBvc2l0aW9uVGltZVJlYWxVczsKLSAgICAqbWVkaWF0aW1lX3VzID0gbVBvc2l0aW9uVGltZU1lZGlhVXM7Ci0KLSAgICByZXR1cm4gbVBvc2l0aW9uVGltZVJlYWxVcyAhPSAtMSAmJiBtUG9zaXRpb25UaW1lTWVkaWFVcyAhPSAtMTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gQmVmb3JlIHNldHRpbmcgc291cmNlLCBzdG9wIGFueSBleGlzdGluZyBzb3VyY2UuCi0gICAgLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgYW55IGJ1ZmZlciB3ZSBob2xkIG9udG8gc28gdGhhdCB0aGUKLSAgICAvLyBzb3VyY2UgaXMgYWJsZSB0byBzdG9wKCkuCi0KLSAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyIHJlbGVhc2luZyBpbnB1dCBidWZmZXIuIik7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtU291cmNlID0gc291cmNlOwotICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Ci19Ci0KLXNwPE1lZGlhU291cmNlPiBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRTb3VyY2UoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbVNvdXJjZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRPYnNlcnZlcihQcmV2aWV3UGxheWVyICpvYnNlcnZlcikgewotICAgIEFMT0dWKCJzZXRPYnNlcnZlciIpOwotICAgIC8vQ0hFQ0soIW1TdGFydGVkKTsKLSAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLX0KLQotYm9vbCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjppc1N0YXJ0ZWQoKSB7Ci0gICAgcmV0dXJuIG1TdGFydGVkOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pIHsKLSAgICBzdGF0aWNfY2FzdDxWaWRlb0VkaXRvckF1ZGlvUGxheWVyICo+KHVzZXIpLT5BdWRpb0NhbGxiYWNrKGV2ZW50LCBpbmZvKTsKLX0KLQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSB7Ci0gICAgaWYgKGV2ZW50ICE9IEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICBzaXplX3QgbnVtQnl0ZXNXcml0dGVuID0gZmlsbEJ1ZmZlcihidWZmZXItPnJhdywgYnVmZmVyLT5zaXplKTsKLQotICAgIGJ1ZmZlci0+c2l6ZSA9IG51bUJ5dGVzV3JpdHRlbjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c3RhcnQoYm9vbCBzb3VyY2VBbHJlYWR5U3RhcnRlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLSAgICBDSEVDSyhtU291cmNlICE9IE5VTEwpOwotICAgIEFMT0dWKCJTdGFydCIpOwotICAgIHN0YXR1c190IGVycjsKLSAgICBNNE9TQV9FUlIgcmVzdWx0ID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRUaW1lID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2Vla1RpbWVTdGFtcCA9IDA7Ci0gICAgTTRPU0FfQm9vbCBiU3RvcnlCb2FyZFRTQmV5b25kQlRFbmRDdXRUaW1lID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgdGhlIEJHIEF1ZGlvIGhhbmRsZXIKLSAgICBtQXVkaW9Qcm9jZXNzID0gbmV3IFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKTsKLSAgICBBdWRpb01peFNldHRpbmdzIGF1ZGlvTWl4U2V0dGluZ3M7Ci0KLSAgICAvLyBQYXNzIG9uIHRoZSBhdWRpbyBkdWNraW5nIHBhcmFtZXRlcnMKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX3RocmVzaG9sZCA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ19sb3dWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19lbmFibGUgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YkluRHVja2luZ19lbmFibGU7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aUJUQ2hhbm5lbENvdW50OwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvLyBDYWxsIHRvIEF1ZGlvIG1peCBwYXJhbSBzZXR0aW5nCi0gICAgbUF1ZGlvUHJvY2Vzcy0+c2V0TWl4UGFyYW1zKGF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgLy8gR2V0IHRoZSBCRyBBdWRpbyBQQ00gZmlsZSBkZXRhaWxzCi0gICAgaWYgKCBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgKSB7Ci0KLSAgICAgICAgLy8gVE9ETyA6IDMyYml0cyByZXF1aXJlZCBmb3IgT1NBTCwgdG8gYmUgdXBkYXRlZCBvbmNlIE9TQUwgaXMgdXBkYXRlZAotICAgICAgICBNNE9TQV9VSW50MzIgdG1wMzIgPSAwOwotICAgICAgICByZXN1bHQgPSBNNE9TQV9maWxlUmVhZEdldE9wdGlvbihtQkdBdWRpb1BDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKikmdG1wMzIpOwotICAgICAgICBtQkdBdWRpb1BDTUZpbGVMZW5ndGggPSB0bXAzMjsKLSAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9IG1CR0F1ZGlvUENNRmlsZUxlbmd0aDsKLQotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzdGFydCBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSA9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBkdXJhdGlvbiBpbiB0aW1lIG9mIHRoZSBhdWRpbyBCVAotICAgICAgICBpZiAoIHJlc3VsdCA9PSBNNE5PX0VSUk9SICkgewotICAgICAgICAgQUxPR1YoIlZFQVA6IGNoYW5uZWxzID0gJWQgZnJlcSA9ICVkIiwKLSAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMsICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0KLSAgICAgICAgICAgIC8vIE5vIHRyaW0KLSAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gKCgKLSAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1CR0F1ZGlvUENNRmlsZUxlbmd0aC9zaXplb2YoTTRPU0FfVUludDE2KS8KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykpKjEwMDAgKSAvCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6IGJlZ2luQ3V0TXMgJWQgLCBlbmRDdXRNcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSBtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRyaW0gcGFydAotICAgICAgICAgICAgaWYgKChtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyA9PSAwKSAmJgotICAgICAgICAgICAgICAgIChtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAvLyBFbmQgdGltZSBpdHNlbGYgdGhlIGZpbGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiA9IG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNczsKLSAgICAgICAgICAgICAgICAvLyBMaW1pdCB0aGUgZmlsZSBsZW5ndGggYWxzbwotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAoKAotICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KSAqCi0gICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSAqCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfVUludDE2KSkgLyAxMDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAobUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zID09IG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1lIGl0c2VsZiB0aGUgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gLQotICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zOwotICAgICAgICAgICAgICAgIC8vIExpbWl0IHRoZSBmaWxlIGxlbmd0aCBhbHNvCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9ICgoCi0gICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMpICoKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyAhPSAwKSkgewotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1lIGl0c2VsZiB0aGUgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gbUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zIC0KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICAgICAgLy8gTGltaXQgdGhlIGZpbGUgbGVuZ3RoIGFsc28KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gKCgKLSAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uICoKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykgKgotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfVUludDE2KSkgLyAxMDAwOyAvKm1ha2UgdG8gc2VjIGZyb20gbXMqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjogZmlsZSBkdXJhdGlvbiByZWNvcmRlZCA6ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXN0IHBsYXllZCBsb2NhdGlvbiB0byBiZSBzZWVrZWQgYXQgZm9yIG5leHQgbWVkaWEgaXRlbQotICAgICAgICBpZiAoIHJlc3VsdCA9PSBNNE5PX0VSUk9SICkgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6Om1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXApOwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnVpQWRkQ3RzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzKTsKLSAgICAgICAgICAgIGlmIChtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID49IG1BdWRpb01peFNldHRpbmdzLT51aUFkZEN0cykgewotICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IChtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wIC0KLSAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnN0YXJ0VGltZSAlZCIsIHN0YXJ0VGltZSk7Ci0gICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gMDsKLSAgICAgICAgICAgIGlmIChzdGFydFRpbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lID49IG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCRyB0cmFjayBzaG91bGQgYmUgbG9vcGVkIGFuZCBzdGFydGVkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9NaXhTZXR0aW5ncy0+Ykxvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBiZWdpbiBjdXQgdGltZSB0byB0aGUgbW9kIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gKChzdGFydFRpbWUlbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9vcGluZyBkaXNhYmxlZCwgZG9ub3QgZG8gQlQgTWl4ICwgc2V0IHRvIGZpbGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gKG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQlQgc3RpbGwgcHJlc2VudCAsIGp1c3Qgc2VlayB0byBzdG9yeSBib2FyZCB0aW1lCi0gICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSBzdGFydFRpbWUgKyBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHNlZWtUaW1lU3RhbXAgdG8gZmlsZSBsb2NhdGlvbgotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQgPSAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MTYpKS8gMTAwMCA7IC8qbWFrZSB0byBzZWMgZnJvbSBtcyovCi0KLSAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9ICgoaW50NjRfdCkoc2Vla1RpbWVTdGFtcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDE2KSkvIDEwMDAgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2UgYWxsb3cgYW4gb3B0aW9uYWwgSU5GT19GT1JNQVRfQ0hBTkdFRCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKLSAgICAvLyBvZiBwbGF5YmFjaywgaWYgdGhlcmUgaXMgb25lLCBnZXRGb3JtYXQgYmVsb3cgd2lsbCByZXRyaWV2ZSB0aGUKLSAgICAvLyB1cGRhdGVkIGZvcm1hdCwgaWYgdGhlcmUgaXNuJ3QsIHdlJ2xsIHN0YXNoIGF3YXkgdGhlIHZhbGlkIGJ1ZmZlcgotICAgIC8vIG9mIGRhdGEgdG8gYmUgdXNlZCBvbiB0aGUgZmlyc3QgYXVkaW8gY2FsbGJhY2suCi0KLSAgICBDSEVDSyhtRmlyc3RCdWZmZXIgPT0gTlVMTCk7Ci0KLSAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBtU291cmNlLT5yZWFkKCZtRmlyc3RCdWZmZXIpOwotICAgIGlmIChtRmlyc3RCdWZmZXJSZXN1bHQgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICBBTE9HVigiSU5GT19GT1JNQVRfQ0hBTkdFRCEhISIpOwotCi0gICAgICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gT0s7Ci0gICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSB0cnVlOwotICAgIH0KLQotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSk7Ci0KLSAgICBzdWNjZXNzID0gZm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpOwotICAgIENIRUNLKHN1Y2Nlc3MpOwotCi0gICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAotICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBudW1DaGFubmVscywgQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKLSAgICAgICAgICAgICAgICAmVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6QXVkaW9TaW5rQ2FsbGJhY2ssIHRoaXMpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxhdGVuY3lVcyA9IChpbnQ2NF90KW1BdWRpb1NpbmstPmxhdGVuY3koKSAqIDEwMDA7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKLQotICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBtU2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG51bUNoYW5uZWxzKSwKLSAgICAgICAgICAgICAgICAwLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmQXVkaW9DYWxsYmFjaywgdGhpcywgMCk7Ci0KLSAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwotCi0gICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxhdGVuY3lVcyA9IChpbnQ2NF90KW1BdWRpb1RyYWNrLT5sYXRlbmN5KCkgKiAxMDAwOwotICAgICAgICBtRnJhbWVTaXplID0gbUF1ZGlvVHJhY2stPmZyYW1lU2l6ZSgpOwotCi0gICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwotICAgIH0KLQotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnJlc2V0KCkgewotCi0gICAgQUxPR1YoInJlc2V0Iik7Ci0gICAgY2xlYXIoKTsKLQotICAgIC8vIENhcHR1cmUgdGhlIGN1cnJlbnQgc2VlayBwb2ludAotICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9IDA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCA9MDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFCZWdpbkN1dFRTPTA7Ci19Ci0KLXNpemVfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaygKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKLSAgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29va2llLAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCkgewotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKm1lID0gKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKiljb29raWU7Ci0KLSAgICBpZiAoZXZlbnQgPT0gTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX0ZJTExfQlVGRkVSICkgewotICAgICAgICByZXR1cm4gbWUtPmZpbGxCdWZmZXIoYnVmZmVyLCBzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotc2l6ZV90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmZpbGxCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLQotICAgIGlmIChtUmVhY2hlZEVPUykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzaXplX3Qgc2l6ZV9kb25lID0gMDsKLSAgICBzaXplX3Qgc2l6ZV9yZW1haW5pbmcgPSBzaXplOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBTV9CdWZmZXIxNiBiZ0ZyYW1lID0ge05VTEwsIDB9OwotICAgIE00QU1fQnVmZmVyMTYgbWl4RnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIxNiBwdEZyYW1lID0ge05VTEwsIDB9OwotICAgIGludDY0X3QgY3VycmVudFN0ZWFtVFMgPSAwOwotICAgIGludDY0X3Qgc3RhcnRUaW1lRm9yQlQgPSAwOwotICAgIE00T1NBX0Zsb2F0IGZQVFZvbExldmVsID0KLSAgICAgKChNNE9TQV9GbG9hdCltQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwpLzEwMDsKLSAgICBNNE9TQV9JbnQxNiAgICAgKnBQVE1kYXRhPU5VTEw7Ci0gICAgTTRPU0FfVUludDMyICAgICB1aVBDTXNpemUgPSAwOwotCi0gICAgYm9vbCBwb3N0U2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgYm9vbCBwb3N0RU9TID0gZmFsc2U7Ci0KLSAgICB3aGlsZSAoKHNpemVfcmVtYWluaW5nID4gMCkmJihlcnI9PU00Tk9fRVJST1IpKSB7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICBpZiAobVNlZWtpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zdFNlZWtDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLQotICAgICAgICAgICAgaWYgKG1Jc0ZpcnN0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gbUZpcnN0QnVmZmVyOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbUZpcnN0QnVmZmVyUmVzdWx0OwotCi0gICAgICAgICAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnJlYWQoJm1JbnB1dEJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBEYXRhIGlzIFByaW1hcnkgVHJhY2ssIG1peCB3aXRoIGJhY2tncm91bmQgdHJhY2sKLSAgICAgICAgICAgICAgICAvLyBhZnRlciByZWFkaW5nIHNhbWUgc2l6ZSBmcm9tIEJhY2tncm91bmQgdHJhY2sgUENNIGZpbGUKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTWl4IG9ubHkgd2hlbiBza2ltIHBvaW50IGlzIGFmdGVyIHN0YXJ0VGltZSBvZiBCVAotICAgICAgICAgICAgICAgICAgICBpZiAoKChtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKiAxMDAwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChtUG9zaXRpb25UaW1lTWVkaWFVcyAtIG1TZWVrVGltZVVzKSkgPj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1BdWRpb01peFNldHRpbmdzLT51aUFkZEN0cyAqIDEwMDApKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpJTlNJREUgTUlYSU5HIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2hlY2tpbmcgJWxsZCA8PSAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQtbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCk7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gKE00T1NBX1ZvaWQqKSgodW5zaWduZWQgaW50KW1JbnB1dEJ1ZmZlci0+ZGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGVuID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgZnAgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVBDTXNpemUgPSAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkvMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQVE1kYXRhID0gKE00T1NBX0ludDE2KikgKCh1aW50OF90KikgbUlucHV0QnVmZmVyLT5kYXRhKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1peCB3aXRoIGJhY2tncm91bmQgbWFsbG9jIHRvIGRvIGxlbiAlZCIsIGxlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJnRnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggbGVuLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiYmdGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmdGcmFtZS5tX2J1ZmZlclNpemUgPSBsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1peEZyYW1lLm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfVUludDE2KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikibWl4RnJhbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peEZyYW1lLm1fYnVmZmVyU2l6ZSA9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1peCB3aXRoIGJnbSB3aXRoIHNpemUgJWxsZCIsIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Qb3NpdGlvblRpbWVNZWRpYVVzKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA8PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggLSBsZW4pKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2hlY2tpbmcgbUJHQXVkaW9QQ01GaWxlSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCltQkdBdWRpb1BDTUZpbGVIYW5kbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIHNlZWtpbmcgZmlsZSB0byAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogMzJiaXRzIHJlcXVpcmVkIGZvciBPU0FMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0bXAzMiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKW1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWRTZWVrKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlUG9zaXRpb24qKSZ0bXAzMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gdG1wMzI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNNE9TQV9maWxlUmVhZFNlZWsgZXJyICVkIiwoaW50KWVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZERhdGEobUJHQXVkaW9QQ01GaWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDgqKWJnRnJhbWUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE00V0FSX05PX0RBVEFfWUVUICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlciBFbmQgb2YgZmlsZSByZWFjaGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSByZWFjaGVkIHRoZSBlbmQgb2YgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBiZWdpbiBjdXQgdGltZSBlcXVhbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGludDY0X3QpKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlciBMb29waW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZQVFZvbExldmVsIDwgMS4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlUcmFja1ZvbHVtZShwUFRNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpUENNc2l6ZSwgZlBUVm9sTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gTTROT19FUlJPUiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsZVJlYWREYXRhIGZvciBhdWRpbyBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsbGQiLCBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gdGhlIHB0ciBkYXRhIHRvIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKXB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RnJhbWUubV9idWZmZXJTaXplID0gbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRvIG1peCBhbmQgZHVjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUHJvY2Vzcy0+bWl4QW5kRHVjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0RnJhbWUsICZiZ0ZyYW1lLCAmbWl4RnJhbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBkZWNvZGVkIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1peEZyYW1lLm1fZGF0YUFkZHJlc3MsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byBiZWdpbiBjdXQgdGltZSBlcXVhbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBtaXhpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBsZXZlbCBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpbWFyeVRyYWNrVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUFRNZGF0YSwgdWlQQ01zaXplLCBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJnRnJhbWUubV9kYXRhQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYmdGcmFtZS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXhGcmFtZS5tX2RhdGFBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtaXhGcmFtZS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiB2b2x1bWUgbGV2ZWwgb2YgcHJpbWFyeSB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmltYXJ5VHJhY2tWb2x1bWUocFBUTWRhdGEsIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKChzdGF0dXMgPT0gT0sgJiYgbUlucHV0QnVmZmVyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgfHwgKHN0YXR1cyAhPSBPSyAmJiBtSW5wdXRCdWZmZXIgPT0gTlVMTCkpOwotCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXI6IG1Tb3VyY2UtPnJlYWQgcmV0dXJuZWQgZXJyICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBpZiAobU9ic2VydmVyICYmICFtUmVhY2hlZEVPUykgewotICAgICAgICAgICAgICAgICAgICBwb3N0RU9TID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gc3RhdHVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgJm1Qb3NpdGlvblRpbWVNZWRpYVVzKSk7Ci0KLSAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPQotICAgICAgICAgICAgICAgICgobU51bUZyYW1lc1BsYXllZCArIHNpemVfZG9uZSAvIG1GcmFtZVNpemUpICogMTAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgLyBtU2FtcGxlUmF0ZTsKLQotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJWQsICIKLSAgICAgICAgICAgICAgICAgICAgICJtUG9zaXRpb25UaW1lTWVkaWFVcz0lLjJmIG1Qb3NpdGlvblRpbWVSZWFsVXM9JS4yZiIsCi0gICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzIC8gMUU2LCBtUG9zaXRpb25UaW1lUmVhbFVzIC8gMUU2KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgY29weSA9IHNpemVfcmVtYWluaW5nOwotICAgICAgICBpZiAoY29weSA+IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGNvcHkgPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KChjaGFyICopZGF0YSArIHNpemVfZG9uZSwKLSAgICAgICAgICAgKGNvbnN0IGNoYXIgKiltSW5wdXRCdWZmZXItPmRhdGEoKSArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICBjb3B5KTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnNldF9yYW5nZShtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpICsgY29weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gY29weSk7Ci0KLSAgICAgICAgc2l6ZV9kb25lICs9IGNvcHk7Ci0gICAgICAgIHNpemVfcmVtYWluaW5nIC09IGNvcHk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBtTnVtRnJhbWVzUGxheWVkICs9IHNpemVfZG9uZSAvIG1GcmFtZVNpemU7Ci0gICAgfQotCi0gICAgaWYgKHBvc3RFT1MpIHsKLSAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9FT1MoKTsKLSAgICB9Ci0KLSAgICBpZiAocG9zdFNlZWtDb21wbGV0ZSkgewotICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOwotICAgIH0KLQotICAgIHJldHVybiBzaXplX2RvbmU7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpIHsKLSAgICBtQXVkaW9NaXhTZXR0aW5ncyA9IHBBdWRpb01peFNldHRpbmdzOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBCR0F1ZGlvUENNRmlsZUhhbmRsZSl7Ci0gICAgbUJHQXVkaW9QQ01GaWxlSGFuZGxlID0gcEJHQXVkaW9QQ01GaWxlSGFuZGxlOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvQ3VycmVudE1lZGlhQmVnaW5DdXRUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWwpIHsKLQotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgPSBwQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFMgPSBwQkdBdWRpb0N1cnJlbnRNZWRpYUJlZ2luQ3V0VFM7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsID0gcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWw7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0UHJpbWFyeVRyYWNrVm9sdW1lKAotICAgIE00T1NBX0ludDE2ICpkYXRhLCBNNE9TQV9VSW50MzIgc2l6ZSwgTTRPU0FfRmxvYXQgdm9sTGV2ZWwpIHsKLQotICAgIHdoaWxlKHNpemUtLSA+IDApIHsKLSAgICAgICAgKmRhdGEgPSAoTTRPU0FfSW50MTYpKCgqZGF0YSkqdm9sTGV2ZWwpOwotICAgICAgICBkYXRhKys7Ci0gICAgfQotfQotCi19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyY2FmNWU4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFZFX0FVRElPX1BMQVlFUl9IXwotI2RlZmluZSBWRV9BVURJT19QTEFZRVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTWFpbi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYVNvdXJjZTsKLWNsYXNzIEF1ZGlvVHJhY2s7Ci1jbGFzcyBQcmV2aWV3UGxheWVyOwotCi1jbGFzcyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyIDogcHVibGljIFRpbWVTb3VyY2UgewotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBSRUFDSEVEX0VPUywKLSAgICAgICAgU0VFS19DT01QTEVURQotICAgIH07Ci0KLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAotICAgICAgICBQcmV2aWV3UGxheWVyICphdWRpb09ic2VydmVyID0gTlVMTCk7Ci0KLSAgICB+VmlkZW9FZGl0b3JBdWRpb1BsYXllcigpOwotCi0gICAgLy8gUmV0dXJuIHRpbWUgaW4gdXMuCi0gICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgYnVmZmVyIHBsYXllZCAoaW4gdXMpLgotICAgIGludDY0X3QgZ2V0TWVkaWFUaW1lVXMoKTsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgYSBtYXBwaW5nIGlzIGVzdGFibGlzaGVkLCBpLmUuIHRoZSBBdWRpb1BsYXllckJhc2UKLSAgICAvLyBoYXMgcGxheWVkIGF0IGxlYXN0IG9uZSBmcmFtZSBvZiBhdWRpby4KLSAgICBib29sIGdldE1lZGlhVGltZU1hcHBpbmcoaW50NjRfdCAqcmVhbHRpbWVfdXMsIGludDY0X3QgKm1lZGlhdGltZV91cyk7Ci0KLSAgICBzdGF0dXNfdCBzdGFydChib29sIHNvdXJjZUFscmVhZHlTdGFydGVkID0gZmFsc2UpOwotICAgIHZvaWQgcGF1c2UoYm9vbCBwbGF5UGVuZGluZ1NhbXBsZXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgcmVzdW1lKCk7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgdGltZV91cyk7Ci0gICAgYm9vbCBpc1NlZWtpbmcoKTsKLSAgICBib29sIHJlYWNoZWRFT1Moc3RhdHVzX3QgKmZpbmFsU3RhdHVzKTsKLQotICAgIHZvaWQgc2V0QXVkaW9NaXhTZXR0aW5ncyhNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotICAgIHZvaWQgc2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKE00T1NBX0NvbnRleHQgcEJHQXVkaW9QQ01GaWxlSGFuZGxlKTsKLSAgICB2b2lkIHNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wLAotICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFCZWdpbkN1dFRTLAotICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWwpOwotCi0gICAgdm9pZCBzZXRPYnNlcnZlcihQcmV2aWV3UGxheWVyICpvYnNlcnZlcik7Ci0gICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwotICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoKTsKLQotICAgIGJvb2wgaXNTdGFydGVkKCk7Ci1wcml2YXRlOgotCi0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKm1BdWRpb01peFNldHRpbmdzOwotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcgKm1BdWRpb1Byb2Nlc3M7Ci0KLSAgICBNNE9TQV9Db250ZXh0IG1CR0F1ZGlvUENNRmlsZUhhbmRsZTsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZUxlbmd0aDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGg7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbjsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50OwotICAgIGludDY0X3QgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFM7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWw7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBzcDxBdWRpb1RyYWNrPiBtQXVkaW9UcmFjazsKLQotICAgIE1lZGlhQnVmZmVyICptSW5wdXRCdWZmZXI7Ci0KLSAgICBpbnQgbVNhbXBsZVJhdGU7Ci0gICAgaW50NjRfdCBtTGF0ZW5jeVVzOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgaW50NjRfdCBtTnVtRnJhbWVzUGxheWVkOwotCi0gICAgaW50NjRfdCBtUG9zaXRpb25UaW1lTWVkaWFVczsKLSAgICBpbnQ2NF90IG1Qb3NpdGlvblRpbWVSZWFsVXM7Ci0KLSAgICBib29sIG1TZWVraW5nOwotICAgIGJvb2wgbVJlYWNoZWRFT1M7Ci0gICAgc3RhdHVzX3QgbUZpbmFsU3RhdHVzOwotICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0KLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgYm9vbCBtSXNGaXJzdEJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0gICAgTWVkaWFCdWZmZXIgKm1GaXJzdEJ1ZmZlcjsKLQotICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwotICAgIFByZXZpZXdQbGF5ZXIgKm1PYnNlcnZlcjsKLQotICAgIHN0YXRpYyB2b2lkIEF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKTsKLSAgICB2b2lkIEF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKTsKLSAgICBzaXplX3QgZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICphdWRpb1NpbmssCi0gICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqbWUsCi0gICAgICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCk7Ci0KLSAgICB2b2lkIHJlc2V0KCk7Ci0gICAgdm9pZCBjbGVhcigpOwotICAgIGludDY0X3QgZ2V0UmVhbFRpbWVVc19sKCk7Ci0gICAgdm9pZCBzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgICAgICAgICBNNE9TQV9JbnQxNiAqZGF0YSwgTTRPU0FfVUludDMyIHNpemUsIE00T1NBX0Zsb2F0IHZvbExldmVsKTsKLQotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoY29uc3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAmKTsKLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gVkVfQVVESU9fUExBWUVSX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI0ZmNmNC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmciCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKSB7Ci0gICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7Ci0KLSAgICBtQXVkVm9sQXJySW5kZXggPSAwOwotICAgIG1Eb0R1Y2tpbmcgPSAwOwotICAgIG1EdWNraW5nX2VuYWJsZSA9IDA7Ci0gICAgbUR1Y2tpbmdfbG93Vm9sdW1lID0gMDsKLSAgICBtRHVja2luZ190aHJlc2hvbGQgPSAwOwotICAgIG1EdWNraW5nRmFjdG9yID0gMDsKLQotICAgIG1CVFZvbExldmVsID0gMDsKLSAgICBtUFRWb2xMZXZlbCA9IDA7Ci0KLSAgICBtSXNTU1JDbmVlZGVkID0gMDsKLSAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAwOwotCi0gICAgbUJURm9ybWF0ID0gTU9OT18xNl9CSVQ7Ci0KLSAgICBtSW5TYW1wbGVSYXRlID0gODAwMDsKLSAgICBtT3V0U2FtcGxlUmF0ZSA9IDE2MDAwOwotICAgIG1QVENoYW5uZWxDb3VudCA9IDI7Ci0gICAgbUJUQ2hhbm5lbENvdW50ID0gMTsKLX0KLQotTTRPU0FfSW50MzIgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6bWl4QW5kRHVjaygKLSAgICAgICAgdm9pZCAqcHJpbWFyeVRyYWNrQnVmZmVyLAotICAgICAgICB2b2lkICpiYWNrZ3JvdW5kVHJhY2tCdWZmZXIsCi0gICAgICAgIHZvaWQgKm91dEJ1ZmZlcikgewotCi0gICAgQUxPR1YoIm1peEFuZER1Y2s6IHRyYWNrIGJ1ZmZlcnMgKHByaW1hcnk6IDB4JXggYW5kIGJhY2tncm91bmQ6IDB4JXgpICIKLSAgICAgICAgICAgICJhbmQgb3V0IGJ1ZmZlciAweCV4IiwKLSAgICAgICAgICAgIHByaW1hcnlUcmFja0J1ZmZlciwgYmFja2dyb3VuZFRyYWNrQnVmZmVyLCBvdXRCdWZmZXIpOwotCi0gICAgTTRBTV9CdWZmZXIxNiogcFByaW1hcnlUcmFjayAgID0gKE00QU1fQnVmZmVyMTYqKXByaW1hcnlUcmFja0J1ZmZlcjsKLSAgICBNNEFNX0J1ZmZlcjE2KiBwQmFja2dyb3VuZFRyYWNrID0gKE00QU1fQnVmZmVyMTYqKWJhY2tncm91bmRUcmFja0J1ZmZlcjsKLSAgICBNNEFNX0J1ZmZlcjE2KiBwTWl4ZWRPdXRCdWZmZXIgID0gKE00QU1fQnVmZmVyMTYqKW91dEJ1ZmZlcjsKLQotICAgIC8vIE91dHB1dCBzaXplIGlmIHNhbWUgYXMgUFQgc2l6ZQotICAgIHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gcFByaW1hcnlUcmFjay0+bV9idWZmZXJTaXplOwotCi0gICAgLy8gQmVmb3JlIG1peGluZywgd2UgbmVlZCB0byBoYXZlIG9ubHkgUFQgYXMgb3V0IGJ1ZmZlcgotICAgIG1lbWNweSgodm9pZCAqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKilwUHJpbWFyeVRyYWNrLT5tX2RhdGFBZGRyZXNzLCBwTWl4ZWRPdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAvLyBJbml0aWFsaXplIGR1Y2tpbmcgdmFyaWFibGVzCi0gICAgLy8gSW5pdGlhbGx5IGNvbnRhaW5zIHRoZSBpbnB1dCBwcmltYXJ5IHRyYWNrCi0gICAgTTRPU0FfSW50MTYgKnBQVE1kYXRhMiA9IChNNE9TQV9JbnQxNiopcE1peGVkT3V0QnVmZmVyLT5tX2RhdGFBZGRyZXNzOwotCi0gICAgLy8gQ29udGFpbnMgQkcgdHJhY2sgcHJvY2Vzc2VkIGRhdGEobGlrZSBjaGFubmVsIGNvbnZlcnNpb24gZXRjLi4KLSAgICBNNE9TQV9JbnQxNiAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KikgcEJhY2tncm91bmRUcmFjay0+bV9kYXRhQWRkcmVzczsKLQotICAgIC8vIFNpbmNlIHdlIG5lZWQgdG8gZ2l2ZSBzYW1wbGUgY291bnQgYW5kIG5vdCBidWZmZXIgc2l6ZQotICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUgPSBwTWl4ZWRPdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSAvIDIgOwotCi0gICAgaWYgKChtRHVja2luZ19lbmFibGUpICYmIChtUFRWb2xMZXZlbCAhPSAwLjApKSB7Ci0gICAgICAgIE00T1NBX0ludDMyIHBlYWtEYlZhbHVlID0gMDsKLSAgICAgICAgTTRPU0FfSW50MzIgcHJldmlvdXNEYlZhbHVlID0gMDsKLSAgICAgICAgTTRPU0FfSW50MTYgKnBQQ00xNlNhbXBsZSA9IChNNE9TQV9JbnQxNiopcFByaW1hcnlUcmFjay0+bV9kYXRhQWRkcmVzczsKLSAgICAgICAgY29uc3Qgc2l6ZV90IG4gPSBwUHJpbWFyeVRyYWNrLT5tX2J1ZmZlclNpemUgLyBzaXplb2YoTTRPU0FfSW50MTYpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGxvb3BJbmRleCA9IDA7IGxvb3BJbmRleCA8IG47ICsrbG9vcEluZGV4KSB7Ci0gICAgICAgICAgICBpZiAocFBDTTE2U2FtcGxlW2xvb3BJbmRleF0gPj0gMCkgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0gPwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlIDogcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZTogLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbUF1ZGlvVm9sdW1lQXJyYXlbbUF1ZFZvbEFyckluZGV4XSA9IGdldERlY2liZWxTb3VuZChwZWFrRGJWYWx1ZSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHRocmVzaG9sZCBpcyBkb25lIGFmdGVyIGtQcm9jZXNzaW5nV2luZG93U2l6ZSBjeWNsZXMKLSAgICAgICAgaWYgKG1BdWRWb2xBcnJJbmRleCA+PSBrUHJvY2Vzc2luZ1dpbmRvd1NpemUgLSAxKSB7Ci0gICAgICAgICAgICBtRG9EdWNraW5nID0gaXNUaHJlc2hvbGRCcmVhY2hlZCgKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVm9sdW1lQXJyYXksIG1BdWRWb2xBcnJJbmRleCwgbUR1Y2tpbmdfdGhyZXNob2xkKTsKLQotICAgICAgICAgICAgbUF1ZFZvbEFyckluZGV4ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRWb2xBcnJJbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQmVsb3cgbG9naWMgY29udHJvbHMgdGhlIG1peGluZyB3ZWlnaHRhZ2UKLSAgICAgICAgLy8gZm9yIEJhY2tncm91bmQgYW5kIFByaW1hcnkgVHJhY2tzCi0gICAgICAgIC8vIGZvciB0aGUgZHVyYXRpb24gb2Ygd2luZG93IHVuZGVyIGFuYWx5c2lzLAotICAgICAgICAvLyB0byBnaXZlIGZhZGUtb3V0IGZvciBCYWNrZ3JvdW5kIGFuZCBmYWRlLWluIGZvciBwcmltYXJ5Ci0gICAgICAgIC8vIEN1cnJlbnQgZmFkaW5nIGZhY3RvciBpcyBkaXN0cmlidXRlZCBpbiBlcXVhbCByYW5nZSBvdmVyCi0gICAgICAgIC8vIHRoZSBkZWZpbmVkIHdpbmRvdyBzaXplLgotICAgICAgICAvLyBGb3IgYSB3aW5kb3cgc2l6ZSA9IDI1Ci0gICAgICAgIC8vICg1MDAgbXMgKHdpbmRvdyB1bmRlciBhbmFseXNpcykgLyAyMCBtcyAoc2FtcGxlIGR1cmF0aW9uKSkKLSAgICAgICAgLy8KLQotICAgICAgICBpZiAobURvRHVja2luZykgewotICAgICAgICAgICAgaWYgKG1EdWNraW5nRmFjdG9yID4gbUR1Y2tpbmdfbG93Vm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgLy8gRkFERSBPVVQgQkcgVHJhY2sKLSAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgZHVja2luZyBmYWN0b3IgaW4gdG90YWwgc3RlcHMgaW4gZmFjdG9yCi0gICAgICAgICAgICAgICAgLy8gb2YgbG93IHZvbHVtZSBzdGVwcyB0byByZWFjaCBsb3cgdm9sdW1lIGxldmVsCi0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgLT0gbUR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRHVja2luZ0ZhY3RvciA9IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtRHVja2luZ0ZhY3RvciA8IDEuMCApIHsKLSAgICAgICAgICAgICAgICAvLyBGQURFIElOIEJHIFRyYWNrCi0gICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIG9mCi0gICAgICAgICAgICAgICAgLy8gbG93IHZvbHVtZSBmYWN0b3IgdG8gcmVhY2ggb3JpZy52b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBtRHVja2luZ0ZhY3RvciArPSBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yID0gMS4wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvLyBlbmQgaWYgLSBtRHVja2luZ19lbmFibGUKLQotCi0gICAgLy8gTWl4aW5nIGxvZ2ljCi0gICAgQUxPR1YoIk91dCBvZiBEdWNraW5nIGFuYWx5c2lzIHVpUENNc2l6ZSAlZCAlZiAlZiIsCi0gICAgICAgICAgICBtRG9EdWNraW5nLCBtRHVja2luZ0ZhY3RvciwgbUJUVm9sTGV2ZWwpOwotICAgIHdoaWxlICh1aVBDTXNpemUtLSA+IDApIHsKLQotICAgICAgICAvLyBTZXQgdm9sIGZhY3RvciBmb3IgQlQgYW5kIFBUCi0gICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwQlRNZGF0YTEqbUJUVm9sTGV2ZWwpOwotICAgICAgICAqcFBUTWRhdGEyID0gKE00T1NBX0ludDE2KSgqcFBUTWRhdGEyKm1QVFZvbExldmVsKTsKLQotICAgICAgICAvLyBNaXggdGhlIHR3byBzYW1wbGVzCi0gICAgICAgIGlmIChtRG9EdWNraW5nKSB7Ci0KLSAgICAgICAgICAgIC8vIER1Y2sgdGhlIEJHIHRyYWNrIHRvIGR1Y2tpbmcgZmFjdG9yIHZhbHVlIGJlZm9yZSBtaXhpbmcKLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCgqcEJUTWRhdGExKSoobUR1Y2tpbmdGYWN0b3IpKTsKLQotICAgICAgICAgICAgLy8gbWl4IGFzIG5vcm1hbCBjYXNlCi0gICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgqcEJUTWRhdGExIC8yICsgKnBQVE1kYXRhMiAvMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCgqcEJUTWRhdGExKSoobUR1Y2tpbmdGYWN0b3IpKTsKLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwQlRNZGF0YTEgLzIgKyAqcFBUTWRhdGEyIC8yKTsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX0ludDMyIHRlbXA7Ci0gICAgICAgIGlmICgqcEJUTWRhdGExIDwgMCkgewotICAgICAgICAgICAgdGVtcCA9IC0oKnBCVE1kYXRhMSkgKiAyOyAvLyBicmluZyB0byBvcmlnaW5hbCBBbXBsaXR1ZGUgbGV2ZWwKLQotICAgICAgICAgICAgaWYgKHRlbXAgPiAzMjc2NykgewotICAgICAgICAgICAgICAgICpwQlRNZGF0YTEgPSAtMzI3NjY7IC8vIGxlc3MgdGhlbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgtdGVtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0ZW1wID0gKCpwQlRNZGF0YTEpICogMjsgLy8gYnJpbmcgdG8gb3JpZ2luYWwgQW1wbGl0dWRlIGxldmVsCi0gICAgICAgICAgICBpZiAoIHRlbXAgPiAzMjc2OCkgewotICAgICAgICAgICAgICAgICpwQlRNZGF0YTEgPSAzMjc2NzsgLy8gbGVzcyB0aGFuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBCVE1kYXRhMSsrOwotICAgICAgICBwUFRNZGF0YTIrKzsKLSAgICB9Ci0KLSAgICBtZW1jcHkoKHZvaWQgKilwTWl4ZWRPdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopcEJhY2tncm91bmRUcmFjay0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgcEJhY2tncm91bmRUcmFjay0+bV9idWZmZXJTaXplKTsKLQotICAgIEFMT0dWKCJtaXhBbmREdWNrOiBYIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OmNhbGN1bGF0ZU91dFJlc2FtcGxlQnVmU2l6ZSgpIHsKLQotICAgIC8vIFRoaXMgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIGNoYW5uZWwgY291bnQgaW4gbUJUQnVmZmVyLm1fYnVmZmVyU2l6ZQotICAgIHJldHVybiAobU91dFNhbXBsZVJhdGUgLyBtSW5TYW1wbGVSYXRlKSAqIG1CVEJ1ZmZlci5tX2J1ZmZlclNpemU7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6c2V0TWl4UGFyYW1zKAotICAgICAgICBjb25zdCBBdWRpb01peFNldHRpbmdzJiBzZXR0aW5nKSB7Ci0gICAgQUxPR1YoInNldE1peFBhcmFtcyIpOwotCi0gICAgbUR1Y2tpbmdfZW5hYmxlICAgICAgID0gc2V0dGluZy5sdkluRHVja2luZ19lbmFibGU7Ci0gICAgbUR1Y2tpbmdfbG93Vm9sdW1lICAgID0gc2V0dGluZy5sdkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgbUR1Y2tpbmdfdGhyZXNob2xkICAgID0gc2V0dGluZy5sdkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgbVBUVm9sTGV2ZWwgICAgICAgICAgID0gc2V0dGluZy5sdlBUVm9sTGV2ZWw7Ci0gICAgbUJUVm9sTGV2ZWwgICAgICAgICAgID0gc2V0dGluZy5sdkJUVm9sTGV2ZWwgOwotICAgIG1CVENoYW5uZWxDb3VudCAgICAgICA9IHNldHRpbmcubHZCVENoYW5uZWxDb3VudDsKLSAgICBtUFRDaGFubmVsQ291bnQgICAgICAgPSBzZXR0aW5nLmx2UFRDaGFubmVsQ291bnQ7Ci0gICAgbUJURm9ybWF0ICAgICAgICAgICAgID0gc2V0dGluZy5sdkJURm9ybWF0OwotICAgIG1JblNhbXBsZVJhdGUgICAgICAgICA9IHNldHRpbmcubHZJblNhbXBsZVJhdGU7Ci0gICAgbU91dFNhbXBsZVJhdGUgICAgICAgID0gc2V0dGluZy5sdk91dFNhbXBsZVJhdGU7Ci0KLSAgICAvLyBSZXNldCB0aGUgZm9sbG93aW5nIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcwotICAgIG1BdWRWb2xBcnJJbmRleCAgICAgICA9IDA7Ci0gICAgbURvRHVja2luZyAgICAgICAgICAgID0gMDsKLSAgICBtRHVja2luZ0ZhY3RvciAgICAgICAgPSAxLjA7Ci0KLSAgICBBTE9HVigiZHVja2luZyBlbmFibGUgMHgleCBsb3dWb2x1bWUgJWYgdGhyZXNob2xkICVkICIKLSAgICAgICAgICAgICJmUFRWb2xMZXZlbCAlZiBCVFZvbExldmVsICVmIiwKLSAgICAgICAgICAgIG1EdWNraW5nX2VuYWJsZSwgbUR1Y2tpbmdfbG93Vm9sdW1lLCBtRHVja2luZ190aHJlc2hvbGQsCi0gICAgICAgICAgICBtUFRWb2xMZXZlbCwgbVBUVm9sTGV2ZWwpOwotCi0gICAgLy8gRGVjaWRlcyBpZiBTU1JDIHN1cHBvcnQgaXMgbmVlZGVkIGZvciB0aGlzIG1peGluZwotICAgIG1Jc1NTUkNuZWVkZWQgPSAoc2V0dGluZy5sdkluU2FtcGxlUmF0ZSAhPSBzZXR0aW5nLmx2T3V0U2FtcGxlUmF0ZSk7Ci0gICAgaWYgKHNldHRpbmcubHZCVENoYW5uZWxDb3VudCAhPSBzZXR0aW5nLmx2UFRDaGFubmVsQ291bnQpewotICAgICAgICBpZiAoc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50ID09IDIpewotICAgICAgICAgICAgbUNoYW5uZWxDb252ZXJzaW9uID0gMTsgLy8gY29udmVydCB0byBNT05PCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAyOyAvLyBDb252ZXJ0IHRvIFNURVJFTwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUNoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICB9Ci19Ci0KLS8vIEZhc3Qgd2F5IHRvIGNvbXB1dGUgMTAgKiBsb2codmFsdWUpCi1NNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpnZXREZWNpYmVsU291bmQoTTRPU0FfVUludDMyIHZhbHVlKSB7Ci0gICAgQUxPR1YoImdldERlY2liZWxTb3VuZDogJWxkIiwgdmFsdWUpOwotCi0gICAgaWYgKHZhbHVlIDw9IDAgfHwgdmFsdWUgPiAweDgwMDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4NDAwMCkgeyAvLyAzMjc2OAotICAgICAgICByZXR1cm4gOTA7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MjAwMCkgeyAvLyAxNjM4NAotICAgICAgICByZXR1cm4gODQ7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MTAwMCkgeyAvLyA4MTkyCi0gICAgICAgIHJldHVybiA3ODsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwODAwKSB7IC8vIDQwMjgKLSAgICAgICAgcmV0dXJuIDcyOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDA0MDApIHsgLy8gMjA0OAotICAgICAgICByZXR1cm4gNjY7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDIwMCkgeyAvLyAxMDI0Ci0gICAgICAgIHJldHVybiA2MDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMTAwKSB7IC8vIDUxMgotICAgICAgICByZXR1cm4gNTQ7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDA4MCkgeyAvLyAyNTYKLSAgICAgICAgcmV0dXJuIDQ4OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwNDApIHsgLy8gMTI4Ci0gICAgICAgIHJldHVybiA0MjsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDIwKSB7IC8vIDY0Ci0gICAgICAgIHJldHVybiAzNjsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDEwKSB7IC8vIDMyCi0gICAgICAgIHJldHVybiAzMDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDA4KSB7IC8vIDE2Ci0gICAgICAgIHJldHVybiAyNDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDA3KSB7IC8vIDgKLSAgICAgICAgcmV0dXJuIDI0OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDMpIHsgLy8gNAotICAgICAgICByZXR1cm4gMTg7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwMSkgeyAvLyAyCi0gICAgICAgIHJldHVybiAxMjsKLSAgICB9IGVsc2UgIHsgLy8gMQotICAgICAgICByZXR1cm4gNjsKLSAgICB9Ci19Ci0KLU00T1NBX0Jvb2wgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6aXNUaHJlc2hvbGRCcmVhY2hlZCgKLSAgICAgICAgTTRPU0FfSW50MzIqIGF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgTTRPU0FfSW50MzIgc3RvcmVDb3VudCwKLSAgICAgICAgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUpIHsKLQotICAgIEFMT0dWKCJpc1RocmVzaG9sZEJyZWFjaGVkIik7Ci0KLSAgICBpbnQgdG90YWxWYWx1ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yZUNvdW50OyArK2kpIHsKLSAgICAgICAgdG90YWxWYWx1ZSArPSBhdmVyYWdlVmFsdWVbaV07Ci0gICAgfQotICAgIHJldHVybiAodG90YWxWYWx1ZSAvIHN0b3JlQ291bnQgPiB0aHJlc2hvbGRWYWx1ZSk7Ci19Ci0KLX0vL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjdhNjlmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFZFX0JBQ0tHUk9VTkRfQVVESU9fUFJPQ19ICi0jZGVmaW5lIFZFX0JBQ0tHUk9VTkRfQVVESU9fUFJPQ19ICi0KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRXhwb3J0LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDE2KiAgIG1fZGF0YUFkZHJlc3M7IC8vIEFuZHJvaWQgU1JDIG5lZWRzIGEgSW50MTYgcG9pbnRlcgotICAgIE00T1NBX1VJbnQzMiAgICBtX2J1ZmZlclNpemU7Ci19IE00QU1fQnVmZmVyMTY7ICAgIC8vIFN0cnVjdHVyZSBjb250YWlucyBJbnQxNl90IHBvaW50ZXIKLQotZW51bSBBdWRpb0Zvcm1hdCB7Ci0gICAgTU9OT18xNl9CSVQsCi0gICAgU1RFUkVPXzE2X0JJVAotfTsKLQotLy8gRm9sbG93aW5nIHN0cnVjdCB3aWxsIGJlIHVzZWQgYnkgYXBwIHRvIHN1cHBseSB0aGUgUFQgYW5kIEJUIHByb3BlcnRpZXMKLS8vIGFsb25nIHdpdGggZHVja2luZyB2YWx1ZXMKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9JbnQzMiBsdkluU2FtcGxlUmF0ZTsgLy8gU2FtcGxpbmcgYXVkaW8gZnJlcSAoODAwMCwxNjAwMCBvciBtb3JlICkKLSAgICBNNE9TQV9JbnQzMiBsdk91dFNhbXBsZVJhdGU7IC8vU2FtcGxpbmcgYXVkaW8gZnJlcSAoODAwMCwxNjAwMCBvciBtb3JlICkKLSAgICBBdWRpb0Zvcm1hdCBsdkJURm9ybWF0OwotCi0gICAgTTRPU0FfSW50MzIgbHZJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIE00T1NBX0Zsb2F0IGx2SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBNNE9TQV9Cb29sIGx2SW5EdWNraW5nX2VuYWJsZTsKLSAgICBNNE9TQV9GbG9hdCBsdlBUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgbHZCVFZvbExldmVsOwotICAgIE00T1NBX0ludDMyIGx2QlRDaGFubmVsQ291bnQ7Ci0gICAgTTRPU0FfSW50MzIgbHZQVENoYW5uZWxDb3VudDsKLX0gQXVkaW9NaXhTZXR0aW5nczsKLQotLy8gVGhpcyBjbGFzcyBpcyBkZWZpbmVkIHRvIGdldCBTRiBTUkMgYWNjZXNzCi1jbGFzcyBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nIHsKLXB1YmxpYzoKLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKCk7Ci0gICAgflZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKSB7fQotCi0gICAgdm9pZCBzZXRNaXhQYXJhbXMoY29uc3QgQXVkaW9NaXhTZXR0aW5ncyYgcGFyYW1zKTsKLQotICAgIE00T1NBX0ludDMyIG1peEFuZER1Y2soCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIHByaW1hcnlUcmFja0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogYmFja2dyb3VuZFRyYWNrQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICB2b2lkKiBtaXhlZE91dHB1dEJ1ZmZlcik7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtQcm9jZXNzaW5nV2luZG93U2l6ZSA9IDEwLAotICAgIH07Ci0KLSAgICBNNE9TQV9JbnQzMiBtSW5TYW1wbGVSYXRlOwotICAgIE00T1NBX0ludDMyIG1PdXRTYW1wbGVSYXRlOwotICAgIEF1ZGlvRm9ybWF0IG1CVEZvcm1hdDsKLQotICAgIE00T1NBX0Jvb2wgbUlzU1NSQ25lZWRlZDsKLSAgICBNNE9TQV9JbnQzMiBtQlRDaGFubmVsQ291bnQ7Ci0gICAgTTRPU0FfSW50MzIgbVBUQ2hhbm5lbENvdW50OwotICAgIE00T1NBX1VJbnQ4IG1DaGFubmVsQ29udmVyc2lvbjsKLQotICAgIE00T1NBX1VJbnQzMiBtRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgTTRPU0FfRmxvYXQgbUR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIE00T1NBX0Zsb2F0IG1EdWNraW5nRmFjdG9yIDsKLSAgICBNNE9TQV9Cb29sIG1EdWNraW5nX2VuYWJsZTsKLSAgICBNNE9TQV9JbnQzMiBtQXVkaW9Wb2x1bWVBcnJheVtrUHJvY2Vzc2luZ1dpbmRvd1NpemVdOwotICAgIE00T1NBX0ludDMyIG1BdWRWb2xBcnJJbmRleDsKLSAgICBNNE9TQV9Cb29sIG1Eb0R1Y2tpbmc7Ci0gICAgTTRPU0FfRmxvYXQgbVBUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgbUJUVm9sTGV2ZWw7Ci0KLSAgICBNNEFNX0J1ZmZlcjE2IG1CVEJ1ZmZlcjsKLQotICAgIE00T1NBX0ludDMyIGdldERlY2liZWxTb3VuZChNNE9TQV9VSW50MzIgdmFsdWUpOwotICAgIE00T1NBX0Jvb2wgIGlzVGhyZXNob2xkQnJlYWNoZWQoTTRPU0FfSW50MzIqIGF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc3RvcmVDb3VudCwgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUpOwotCi0gICAgLy8gVGhpcyByZXR1cm5zIHRoZSBzaXplIG9mIGJ1ZmZlciB3aGljaCBuZWVkcyB0byBhbGxvY2F0ZWQKLSAgICAvLyBiZWZvcmUgcmVzYW1wbGluZyBpcyBjYWxsZWQKLSAgICBNNE9TQV9JbnQzMiBjYWxjdWxhdGVPdXRSZXNhbXBsZUJ1ZlNpemUoKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUuCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyhjb25zdCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nJik7Ci0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyYgb3BlcmF0b3I9KAotICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIFZFX0JBQ0tHUk9VTkRfQVVESU9fUFJPQ19ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDY1NmM0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWaWRlb0VkaXRvclBsYXllciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUGxheWVyLmgiCi0jaW5jbHVkZSAiUHJldmlld1BsYXllci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotVmlkZW9FZGl0b3JQbGF5ZXI6OlZpZGVvRWRpdG9yUGxheWVyKE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlcikKLSAgICA6IG1QbGF5ZXIobmV3IFByZXZpZXdQbGF5ZXIocmVuZGVyZXIpKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQbGF5ZXIiKTsKLSAgICBtUGxheWVyLT5zZXRMaXN0ZW5lcih0aGlzKTsKLX0KLQotVmlkZW9FZGl0b3JQbGF5ZXI6On5WaWRlb0VkaXRvclBsYXllcigpIHsKLSAgICBBTE9HVigiflZpZGVvRWRpdG9yUGxheWVyIik7Ci0KLSAgICByZXNldCgpOwotICAgIG1WZUF1ZGlvU2luay5jbGVhcigpOwotCi0gICAgZGVsZXRlIG1QbGF5ZXI7Ci0gICAgbVBsYXllciA9IE5VTEw7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjppbml0Q2hlY2soKSB7Ci0gICAgQUxPR1YoImluaXRDaGVjayIpOwotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpIHsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0QXVkaW9QbGF5ZXIoYXVkaW9QbGF5ZXIpOwotfQotCi0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgQUxPR0koInNldERhdGFTb3VyY2UoJyVzJykiLCB1cmwpOwotICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkhlYWRlcnMgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKHVybCk7Ci19Ci0KLS8vV2UgZG9ub3QgdXNlIHRoaXMgaW4gcHJldmlldywgZHVtbXkgaW1wbGltZW50YXRpb24gYXMgdGhpcyBpcyBwdXJlIHZpcnR1YWwKLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsCi0gICAgaW50NjRfdCBsZW5ndGgpIHsKLSAgICBBTE9HRSgic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkgTm90IHN1cHBvcnRlZCIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgcmV0dXJuICghT0spOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZSIpOwotCi0gICAgbVBsYXllci0+c2V0U3VyZmFjZShzdXJmYWNlKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgewotICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlIik7Ci0KLSAgICBtUGxheWVyLT5zZXRTdXJmYWNlVGV4dHVyZShidWZmZXJQcm9kdWNlcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cHJlcGFyZSgpIHsKLSAgICBBTE9HVigicHJlcGFyZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c3RhcnQoKSB7Ci0gICAgQUxPR1YoInN0YXJ0Iik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnBsYXkoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICByZXR1cm4gcGF1c2UoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnBhdXNlKCkgewotICAgIEFMT0dWKCJwYXVzZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5wYXVzZSgpOwotfQotCi1ib29sIFZpZGVvRWRpdG9yUGxheWVyOjppc1BsYXlpbmcoKSB7Ci0gICAgQUxPR1YoImlzUGxheWluZyIpOwotICAgIHJldHVybiBtUGxheWVyLT5pc1BsYXlpbmcoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNlZWtUbyhpbnQgbXNlYykgewotICAgIEFMT0dWKCJzZWVrVG8iKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZWVrVG8oKGludDY0X3QpbXNlYyAqIDEwMDApOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKSB7Ci0gICAgQUxPR1YoImdldEN1cnJlbnRQb3NpdGlvbiIpOwotICAgIGludDY0X3QgcG9zaXRpb25VczsKLSAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5nZXRQb3NpdGlvbigmcG9zaXRpb25Vcyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgKm1zZWMgPSAocG9zaXRpb25VcyArIDUwMCkgLyAxMDAwOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldER1cmF0aW9uKGludCAqbXNlYykgewotICAgIEFMT0dWKCJnZXREdXJhdGlvbiIpOwotCi0gICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgKm1zZWMgPSAwOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgKm1zZWMgPSAoZHVyYXRpb25VcyArIDUwMCkgLyAxMDAwOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnJlc2V0KCkgewotICAgIEFMT0dWKCJyZXNldCIpOwotICAgIG1QbGF5ZXItPnJlc2V0KCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0TG9vcGluZyhpbnQgbG9vcCkgewotICAgIEFMT0dWKCJzZXRMb29waW5nIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldExvb3BpbmcobG9vcCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7Ci0gICAgQUxPR0UoInNldFBhcmFtZXRlciBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewotICAgIEFMT0dFKCJnZXRQYXJhbWV0ZXIgbm90IGltcGxlbWVudGVkIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1wbGF5ZXJfdHlwZSBWaWRlb0VkaXRvclBsYXllcjo6cGxheWVyVHlwZSgpIHsKLSAgICBBTE9HVigicGxheWVyVHlwZSIpOwotICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OmFjcXVpcmVMb2NrKCkgewotICAgIEFMT0dWKCJhY3F1aXJlTG9jayIpOwotICAgIG1QbGF5ZXItPmFjcXVpcmVMb2NrKCk7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OnJlbGVhc2VMb2NrKCkgewotICAgIEFMT0dWKCJyZWxlYXNlTG9jayIpOwotICAgIG1QbGF5ZXItPnJlbGVhc2VMb2NrKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjppbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSB7Ci0gICAgTWVkaWFQbGF5ZXJJbnRlcmZhY2U6OnNldEF1ZGlvU2luayhhdWRpb1NpbmspOwotCi0gICAgbVBsYXllci0+c2V0QXVkaW9TaW5rKGF1ZGlvU2luayk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpnZXRNZXRhZGF0YSgKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKSB7Ci0gICAgdXNpbmcgbWVkaWE6Ok1ldGFkYXRhOwotCi0gICAgdWludDMyX3QgZmxhZ3MgPSBtUGxheWVyLT5nZXRTb3VyY2VTZWVrRmxhZ3MoKTsKLQotICAgIE1ldGFkYXRhIG1ldGFkYXRhKHJlY29yZHMpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprUGF1c2VBdmFpbGFibGUsCi0gICAgICAgICAgICBmbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fUEFVU0UpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0JhY2t3YXJkQXZhaWxhYmxlLAotICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUtfQkFDS1dBUkQpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0ZvcndhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBmbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFS19GT1JXQVJEKTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtBdmFpbGFibGUsCi0gICAgICAgICAgICBmbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFSyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpsb2FkRWZmZWN0c1NldHRpbmdzKAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLCBpbnQgbkVmZmVjdHMpIHsKLSAgICBBTE9HVigibG9hZEVmZmVjdHNTZXR0aW5ncyIpOwotICAgIHJldHVybiBtUGxheWVyLT5sb2FkRWZmZWN0c1NldHRpbmdzKHBFZmZlY3RTZXR0aW5ncywgbkVmZmVjdHMpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6bG9hZEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzKSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yUGxheWVyOiBsb2FkQXVkaW9NaXhTZXR0aW5ncyIpOwotICAgIHJldHVybiBtUGxheWVyLT5sb2FkQXVkaW9NaXhTZXR0aW5ncyhwQXVkaW9NaXhTZXR0aW5ncyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgTTRPU0FfQ29udGV4dCBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQbGF5ZXI6IGxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKAotICAgIE00T1NBX1VJbnQzMiBhdWRpb01peFN0b3J5Qm9hcmRUUywKLSAgICBNNE9TQV9VSW50MzIgY3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgIE00T1NBX1VJbnQzMiBwcmltYXJ5VHJhY2tWb2xWYWx1ZSkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yUGxheWVyOiBsb2FkQXVkaW9NaXhTZXR0aW5ncyIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbShhdWRpb01peFN0b3J5Qm9hcmRUUywKLSAgICAgY3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLCBwcmltYXJ5VHJhY2tWb2xWYWx1ZSk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRQbGF5YmFja0JlZ2luVGltZSh1aW50MzJfdCBtc2VjKSB7Ci0gICAgQUxPR1YoInNldFBsYXliYWNrQmVnaW5UaW1lIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldFBsYXliYWNrQmVnaW5UaW1lKG1zZWMpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpIHsKLSAgICBBTE9HVigic2V0UGxheWJhY2tFbmRUaW1lIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldFBsYXliYWNrRW5kVGltZShtc2VjKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFN0b3J5Ym9hcmRTdGFydFRpbWUodWludDMyX3QgbXNlYykgewotICAgIEFMT0dWKCJzZXRTdG9yeWJvYXJkU3RhcnRUaW1lIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldFN0b3J5Ym9hcmRTdGFydFRpbWUobXNlYyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwodWludDMyX3QgY2JJbnRlcnZhbCkgewotICAgIEFMT0dWKCJzZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKGNiSW50ZXJ2YWwpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0TWVkaWFSZW5kZXJpbmdNb2RlKAotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG91dHB1dFZpZGVvU2l6ZSkgewotCi0gICAgQUxPR1YoInNldE1lZGlhUmVuZGVyaW5nTW9kZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRNZWRpYVJlbmRlcmluZ01vZGUobW9kZSwgb3V0cHV0VmlkZW9TaXplKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKSB7Ci0gICAgQUxPR1YoInJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAiKTsKLSAgICByZXR1cm4gbVBsYXllci0+cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0SW1hZ2VDbGlwUHJvcGVydGllcygKLSAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEltYWdlQ2xpcFByb3BlcnRpZXMod2lkdGgsIGhlaWdodCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpyZWFkRmlyc3RWaWRlb0ZyYW1lKCkgewotICAgIHJldHVybiBtUGxheWVyLT5yZWFkRmlyc3RWaWRlb0ZyYW1lKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpnZXRMYXN0UmVuZGVyZWRUaW1lTXModWludDMyX3QgKmxhc3RSZW5kZXJlZFRpbWVNcykgewotICAgIG1QbGF5ZXItPmdldExhc3RSZW5kZXJlZFRpbWVNcyhsYXN0UmVuZGVyZWRUaW1lTXMpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyogSW1wbGVtZW50YXRpb24gb2YgQXVkaW9TaW5rIGludGVyZmFjZSAqLwotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiVmVBdWRpb1NpbmsiCi0KLWludCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6bU1pbkJ1ZmZlckNvdW50ID0gNDsKLWJvb2wgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6Om1Jc09uRW11bGF0b3IgPSBmYWxzZTsKLQotVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OlZlQXVkaW9PdXRwdXQoKQotICAgIDogbUNhbGxiYWNrKE5VTEwpLAotICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpIHsKLSAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBtTGVmdFZvbHVtZSA9IDEuMDsKLSAgICBtUmlnaHRWb2x1bWUgPSAxLjA7Ci0gICAgbUxhdGVuY3kgPSAwOwotICAgIG1Nc2Vjc1BlckZyYW1lID0gMDsKLSAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7Ci0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsKLX0KLQotVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6On5WZUF1ZGlvT3V0cHV0KCkgewotICAgIGNsb3NlKCk7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OnNldE1pbkJ1ZmZlckNvdW50KCkgewotCi0gICAgbUlzT25FbXVsYXRvciA9IGZhbHNlOwotICAgIG1NaW5CdWZmZXJDb3VudCA9IDQ7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmlzT25FbXVsYXRvcigpIHsKLQotICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci0gICAgcmV0dXJuIG1Jc09uRW11bGF0b3I7Ci19Ci0KLWludCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0TWluQnVmZmVyQ291bnQoKSB7Ci0KLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotICAgIHJldHVybiBtTWluQnVmZmVyQ291bnQ7Ci19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmJ1ZmZlclNpemUoKSBjb25zdCB7Ci0KLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKSAqIGZyYW1lU2l6ZSgpOwotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpmcmFtZUNvdW50KCkgY29uc3QgewotCi0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCk7Ci19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmNoYW5uZWxDb3VudCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gbVRyYWNrLT5jaGFubmVsQ291bnQoKTsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6ZnJhbWVTaXplKCkgY29uc3QKLXsKLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmZyYW1lU2l6ZSgpOwotfQotCi11aW50MzJfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6bGF0ZW5jeSAoKSBjb25zdAotewotICAgIHJldHVybiBtTGF0ZW5jeTsKLX0KLQotZmxvYXQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6Om1zZWNzUGVyRnJhbWUoKSBjb25zdAotewotICAgIHJldHVybiBtTXNlY3NQZXJGcmFtZTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QgewotCi0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gbVRyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICp3cml0dGVuKSBjb25zdCB7Ci0KLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgICp3cml0dGVuID0gbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6b3BlbigKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pIHsKLQotICAgIG1DYWxsYmFjayA9IGNiOwotICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKLQotICAgIC8vIENoZWNrIGFyZ3VtZW50ICJidWZmZXJDb3VudCIgYWdhaW5zdCB0aGUgbWluaW51bSBidWZmZXIgY291bnQKLSAgICBpZiAoYnVmZmVyQ291bnQgPCBtTWluQnVmZmVyQ291bnQpIHsKLSAgICAgICAgQUxPR1YoImJ1ZmZlckNvdW50ICglZCkgaXMgdG9vIHNtYWxsIGFuZCBpbmNyZWFzZWQgdG8gJWQiLAotICAgICAgICAgICAgYnVmZmVyQ291bnQsIG1NaW5CdWZmZXJDb3VudCk7Ci0gICAgICAgIGJ1ZmZlckNvdW50ID0gbU1pbkJ1ZmZlckNvdW50OwotCi0gICAgfQotICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgJWQsICVkKSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0LCBidWZmZXJDb3VudCk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSBjbG9zZSgpOwotICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgIGludCBmcmFtZUNvdW50OwotCi0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIG1TdHJlYW1UeXBlKSAhPQotICAgICBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgbVN0cmVhbVR5cGUpICE9Ci0gICAgIE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGZyYW1lQ291bnQgPSAoc2FtcGxlUmF0ZSphZkZyYW1lQ291bnQqYnVmZmVyQ291bnQpL2FmU2FtcGxlUmF0ZTsKLQotICAgIGlmIChjaGFubmVsTWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKLSAgICAgICAgc3dpdGNoKGNoYW5uZWxDb3VudCkgewotICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8QXVkaW9UcmFjaz4gdDsKLSAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAotICAgICAgICAgICAgICAgIHRoaXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBBTE9HVigic2V0Vm9sdW1lIik7Ci0gICAgdC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwotICAgIG1Nc2Vjc1BlckZyYW1lID0gMS5lMyAvIChmbG9hdCkgc2FtcGxlUmF0ZTsKLSAgICBtTGF0ZW5jeSA9IHQtPmxhdGVuY3koKTsKLSAgICBtVHJhY2sgPSB0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OnN0YXJ0KCkgewotCi0gICAgQUxPR1YoInN0YXJ0Iik7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPnN0YXJ0KCk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1UcmFjay0+Z2V0UG9zaXRpb24oJm1OdW1GcmFtZXNXcml0dGVuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c25vb3BXcml0ZSgKLSAgICBjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgLy8gVmlzdWFsaXphdGlvbiBidWZmZXJzIG5vdCBzdXBwb3J0ZWQKLSAgICByZXR1cm47Ci0KLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6d3JpdGUoCi0gICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLQotICAgIExPR19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7Ci0KLSAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgc25vb3BXcml0ZShidWZmZXIsIHNpemUpOwotICAgICAgICBzc2l6ZV90IHJldCA9IG1UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplKTsKLSAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gcmV0IC8gNDsgLy8gYXNzdW1lIDE2IGJpdCBzdGVyZW8KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OnN0b3AoKSB7Ci0KLSAgICBBTE9HVigic3RvcCIpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5zdG9wKCk7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmZsdXNoKCkgewotCi0gICAgQUxPR1YoImZsdXNoIik7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPmZsdXNoKCk7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OnBhdXNlKCkgewotCi0gICAgQUxPR1YoIlZlQXVkaW9PdXRwdXQ6OnBhdXNlIik7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPnBhdXNlKCk7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmNsb3NlKCkgewotCi0gICAgQUxPR1YoImNsb3NlIik7Ci0gICAgbVRyYWNrLmNsZWFyKCk7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotCi0gICAgQUxPR1YoInNldFZvbHVtZSglZiwgJWYpIiwgbGVmdCwgcmlnaHQpOwotICAgIG1MZWZ0Vm9sdW1lID0gbGVmdDsKLSAgICBtUmlnaHRWb2x1bWUgPSByaWdodDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpDYWxsYmFja1dyYXBwZXIoCi0gICAgICAgIGludCBldmVudCwgdm9pZCAqY29va2llLCB2b2lkICppbmZvKSB7Ci0gICAgLy9BTE9HVigiVmVBdWRpb091dHB1dDo6Y2FsbGJhY2t3cmFwcGVyIik7Ci0gICAgaWYgKGV2ZW50ICE9IEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVmVBdWRpb091dHB1dCAqbWUgPSAoVmVBdWRpb091dHB1dCAqKWNvb2tpZTsKLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwotCi0gICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAotICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCi0gICAgICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVIpOwotCi0gICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKLQotICAgIGlmIChhY3R1YWxTaXplID4gMCkgewotICAgICAgICBtZS0+c25vb3BXcml0ZShidWZmZXItPnJhdywgYWN0dWFsU2l6ZSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICByZXN1bHQuYXBwZW5kKCIgVmVBdWRpb091dHB1dFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLTEsICIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUtMSwgIiAgbXNlYyBwZXIgZnJhbWUoJWYpLCBsYXRlbmN5ICglZClcbiIsCi0gICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgbUxhdGVuY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPmR1bXAoZmQsIGFyZ3MpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWludCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkgY29uc3QgewotCi0gICAgcmV0dXJuIG1TZXNzaW9uSWQ7Ci19Ci0KLXVpbnQzMl90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QgewotICAgIGlmIChtTXNlY3NQZXJGcmFtZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKHVpbnQzMl90KSgxLmUzIC8gbU1zZWNzUGVyRnJhbWUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOGMxMjU0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZJREVPRURJVE9SX1BMQVlFUl9ICi0jZGVmaW5lIEFORFJPSURfVklERU9FRElUT1JfUExBWUVSX0gKLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvck1haW4uaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclRvb2xzLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oIgotI2luY2x1ZGUgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFByZXZpZXdQbGF5ZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yUGxheWVyIDogcHVibGljIE1lZGlhUGxheWVySW50ZXJmYWNlIHsKLSAgICBwdWJsaWM6Ci0gICAgY2xhc3MgVmVBdWRpb091dHB1dDogcHVibGljIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVBdWRpb091dHB1dCgpOwotICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+VmVBdWRpb091dHB1dCgpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlYWR5KCkgY29uc3QgeyByZXR1cm4gbVRyYWNrICE9IE5VTEw7IH0KLSAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhbHRpbWUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGJ1ZmZlclNpemUoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVDb3VudCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVTaXplKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGxhdGVuY3koKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBmbG9hdCAgICAgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90KikgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGdldFNlc3Npb25JZCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3Q7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgb3BlbigKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZmx1c2goKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcGF1c2UoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgdm9pZCBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7IG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7Ci0KLSAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgaXNPbkVtdWxhdG9yKCk7Ci0gICAgICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIGdldE1pbkJ1ZmZlckNvdW50KCk7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgc2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyKAotICAgICAgICAgICAgICAgIGludCBldmVudCwgdm9pZCAqbWUsIHZvaWQgKmluZm8pOwotCi0gICAgICAgIHNwPEF1ZGlvVHJhY2s+ICAgICAgICAgIG1UcmFjazsKLSAgICAgICAgQXVkaW9DYWxsYmFjayAgICAgICAgICAgbUNhbGxiYWNrOwotICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWU7Ci0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKLSAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTXNlY3NQZXJGcmFtZTsKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7Ci0gICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7Ci0gICAgICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIG1NaW5CdWZmZXJDb3VudDsgLy8gMTIgZm9yIGVtdWxhdG9yOyBvdGhlcndpc2UgNAotCi0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHNub29wV3JpdGUoY29uc3Qgdm9pZCosIHNpemVfdCk7Ci0gICAgfTsKLQotcHVibGljOgotICAgIFZpZGVvRWRpdG9yUGxheWVyKE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlcik7Ci0gICAgdmlydHVhbCB+VmlkZW9FZGl0b3JQbGF5ZXIoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQgKm1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApOwotICAgIHZpcnR1YWwgcGxheWVyX3R5cGUgcGxheWVyVHlwZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOwotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlTG9jaygpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlTG9jaygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZEVmZmVjdHNTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3RTZXR0aW5ncywgaW50IG5FZmZlY3RzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB4LCBNNE9TQV9VSW50MzIgeSwgTTRPU0FfVUludDMyIHopOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja0JlZ2luVGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrRW5kVGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3J5Ym9hcmRTdGFydFRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwodWludDMyX3QgY2JJbnRlcnZhbCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhUmVuZGVyaW5nTW9kZShNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW1hZ2VDbGlwUHJvcGVydGllcyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWRGaXJzdFZpZGVvRnJhbWUoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKTsKLQotICAgIHN0YXR1c190IHNldEF1ZGlvUGxheWVyKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKmF1ZGlvUGxheWVyKTsKLXByaXZhdGU6Ci0gICAgUHJldmlld1BsYXllciAgICAgICAqbVBsYXllcjsKLSAgICBzcDxWZUF1ZGlvT3V0cHV0PiAgICBtVmVBdWRpb1Npbms7Ci0KLSAgICBWaWRlb0VkaXRvclBsYXllcihjb25zdCBWaWRlb0VkaXRvclBsYXllciAmKTsKLSAgICBWaWRlb0VkaXRvclBsYXllciAmb3BlcmF0b3I9KGNvbnN0IFZpZGVvRWRpdG9yUGxheWVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX1ZJREVPRURJVE9SX1BMQVlFUl9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzNjZDNkMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiUHJldmlld0NvbnRyb2xsZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2luY2x1ZGUgIk00T1NBX1RocmVhZC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0KLVZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIoKQotICAgIDogbUN1cnJlbnRQbGF5ZXIoMCksCi0gICAgICBtVGhyZWFkQ29udGV4dChOVUxMKSwKLSAgICAgIG1QbGF5ZXJTdGF0ZShWZVBsYXllcklkbGUpLAotICAgICAgbVByZXBhcmVSZXFlc3QoTTRPU0FfRkFMU0UpLAotICAgICAgbUNsaXBMaXN0KE5VTEwpLAotICAgICAgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkKDApLAotICAgICAgbU51bWJlckNsaXBzVG9QcmV2aWV3KDApLAotICAgICAgbVN0YXJ0aW5nQ2xpcEluZGV4KDApLAotICAgICAgbVByZXZpZXdMb29waW5nKE00T1NBX0ZBTFNFKSwKLSAgICAgIG1DYWxsQmFja0FmdGVyRnJhbWVDbnQoMCksCi0gICAgICBtRWZmZWN0c1NldHRpbmdzKE5VTEwpLAotICAgICAgbU51bWJlckVmZmVjdHMoMCksCi0gICAgICBtQ3VycmVudENsaXBOdW1iZXIoLTEpLAotICAgICAgbUNsaXBUb3RhbER1cmF0aW9uKDApLAotICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdChWSURFT19FRkZFQ1RfTk9ORSksCi0gICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyhOVUxMKSwKLSAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUoTlVMTCksCi0gICAgICBtVGFyZ2V0KE5VTEwpLAotICAgICAgbUpuaUNvb2tpZShOVUxMKSwKLSAgICAgIG1KbmlDYWxsYmFjayhOVUxMKSwKLSAgICAgIG1DdXJyZW50UGxheWVkRHVyYXRpb24oMCksCi0gICAgICBtQ3VycmVudENsaXBEdXJhdGlvbigwKSwKLSAgICAgIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcCgwKSwKLSAgICAgIG1PdmVybGF5U3RhdGUoT1ZFUkxBWV9DTEVBUiksCi0gICAgICBtQWN0aXZlUGxheWVySW5kZXgoMCksCi0gICAgICBtT3V0cHV0VmlkZW9XaWR0aCgwKSwKLSAgICAgIG1PdXRwdXRWaWRlb0hlaWdodCgwKSwKLSAgICAgIGJTdG9wVGhyZWFkSW5Qcm9ncmVzcyhmYWxzZSksCi0gICAgICBtU2VtVGhyZWFkV2FpdChOVUxMKSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIiKTsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IE00eFZTU19rQmxhY2tCb3JkZXJzOwotICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gZmFsc2U7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtUb3RhbE51bVBsYXllckluc3RhbmNlczsgKytpKSB7Ci0gICAgICAgIG1WZVBsYXllcltpXSA9IE5VTEw7Ci0gICAgfQotfQotCi1WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjp+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpIHsKLSAgICBBTE9HVigiflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIiKTsKLSAgICBNNE9TQV9VSW50MzIgaSA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBTdG9wIHRoZSB0aHJlYWQgaWYgaXRzIHN0aWxsIHJ1bm5pbmcKLSAgICBpZihtVGhyZWFkQ29udGV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTdG9wKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjogZXJyb3IgMHgleCBcCi0gICAgICAgICAgICBpbiB0cnlpbmcgdG8gc3RvcCB0aHJlYWQiLCBlcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY0Nsb3NlKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjogZXJyb3IgMHgleCBcCi0gICAgICAgICAgICBpbiB0cnlpbmcgdG8gY2xvc2UgdGhyZWFkIiwgKHVuc2lnbmVkIGludCkgZXJyKTsKLSAgICAgICAgICAgIC8vIENvbnRpbnVlIGV2ZW4gaWYgZXJyb3IKLSAgICAgICAgfQotCi0gICAgICAgIG1UaHJlYWRDb250ZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOwotICAgICAgICAgcGxheWVySW5zdCsrKSB7Ci0gICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVigiY2xlYXJpbmcgbVZlUGxheWVyICVkIiwgcGxheWVySW5zdCk7Ci0gICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0uY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKG1DbGlwTGlzdCAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIENsZWFuIHVwCi0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihtQ2xpcExpc3RbaV0tPnBGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1DbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+cEZpbGUgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcmVlKG1DbGlwTGlzdFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShtQ2xpcExpc3QpOwotICAgICAgICBtQ2xpcExpc3QgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1FZmZlY3RzU2V0dGluZ3MpIHsKLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEpOwotCi0gICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOwotICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSkgewotICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZENsb3NlIChtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLSAgICAgICAgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyk7Ci0gICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgIH0KLQotICAgIG1PdmVybGF5U3RhdGUgPSBPVkVSTEFZX0NMRUFSOwotCi0gICAgQUxPR1YoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyIHJldHVybnMiKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OmxvYWRFZGl0U2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzLE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBiZ21TZXR0aW5ncykgewotCi0gICAgTTRPU0FfVUludDMyIGkgPSAwLCBpQ2xpcER1cmF0aW9uID0gMCwgcmdiU2l6ZSA9IDA7Ci0gICAgTTRWSUZJX1VJbnQ4ICp0bXAgPSBOVUxMOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoImxvYWRFZGl0U2V0dGluZ3MiKTsKLSAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5ncyBDaGFubmVscyA9ICVkLCBzYW1wbGluZyBGcmVxICVkIiwKLSAgICAgICAgICBiZ21TZXR0aW5ncy0+dWlOYkNoYW5uZWxzLCBiZ21TZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSAgKTsKLSAgICAgICAgICBiZ21TZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IDMyMDAwOwotCi0gICAgQUxPR1YoImxvYWRFZGl0U2V0dGluZ3MgQ2hhbm5lbHMgPSAlZCwgc2FtcGxpbmcgRnJlcSAlZCIsCi0gICAgICAgICAgYmdtU2V0dGluZ3MtPnVpTmJDaGFubmVscywgYmdtU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgICk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIC8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBFZGl0IHNldHRpbmdzIGJlZm9yZSBsb2FkaW5nIG5ldyBvbmVzCi0gICAgbUN1cnJlbnRWaWRlb0VmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotCi0gICAgaWYobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSkgewotICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZENsb3NlIChtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLSAgICAgICAgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYobUJhY2tncm91bmRBdWRpb1NldHRpbmcgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsKLSAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1DbGlwTGlzdCAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIENsZWFuIHVwCi0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihtQ2xpcExpc3RbaV0tPnBGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1DbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+cEZpbGUgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcmVlKG1DbGlwTGlzdFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShtQ2xpcExpc3QpOwotICAgICAgICBtQ2xpcExpc3QgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1FZmZlY3RzU2V0dGluZ3MpIHsKLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEpOwotCi0gICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOwotICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtQ2xpcExpc3QgPT0gTlVMTCkgewotICAgICAgICBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQgPSBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLSAgICAgICAgQUxPR1YoImxvYWRFZGl0U2V0dGluZ3M6ICMgb2YgQ2xpcHMgPSAlZCIsIG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZCk7Ci0KLSAgICAgICAgbUNsaXBMaXN0ID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyopKnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJMdlBQLCBjb3B5IG9mIHBDbGlwTGlzdCIpOwotCi0gICAgICAgIGlmKE5VTEwgPT0gbUNsaXBMaXN0KSB7Ci0gICAgICAgICAgICBBTE9HRSgibG9hZEVkaXRTZXR0aW5nczogTWFsbG9jIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopbUNsaXBMaXN0LDAsCi0gICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyopKnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyKTsKLQotICAgICAgICBmb3IoaT0wO2k8cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7aSsrKSB7Ci0KLSAgICAgICAgICAgIC8vIEFsbG9jYXRlIGN1cnJlbnQgY2xpcAotICAgICAgICAgICAgbUNsaXBMaXN0W2ldID0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyksTTRWUywoTTRPU0FfQ2hhciopImNsaXAgc2V0dGluZ3MiKTsKLQotICAgICAgICAgICAgaWYobUNsaXBMaXN0W2ldID09IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBBbGxvY2F0aW9uIGVycm9yIGZvciBtQ2xpcExpc3RbJWRdIiwgKGludClpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDb3B5IHBsYWluIHN0cnVjdHVyZQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbUNsaXBMaXN0W2ldLAotICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgaWYoTlVMTCAhPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpIHsKLSAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnBGaWxlID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+ZmlsZVBhdGhTaXplLCBNNFZTLAotICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikicENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlIik7Ci0KLSAgICAgICAgICAgICAgICBpZihOVUxMID09IG1DbGlwTGlzdFtpXS0+cEZpbGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVkaXRTZXR0aW5ncyA6IEVSUk9SIGFsbG9jYXRpbmcgZmlsZW5hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1DbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+ZmlsZVBhdGhTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCJOVUxMIGZpbGUgcGF0aCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBkdXJhdGlvbiBvZiBhbGwgY2xpcHMKLSAgICAgICAgICAgIGlDbGlwRHVyYXRpb24gPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIC0KLSAgICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgICAgIG1DbGlwVG90YWxEdXJhdGlvbiA9IG1DbGlwVG90YWxEdXJhdGlvbitpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYobUVmZmVjdHNTZXR0aW5ncyA9PSBOVUxMKSB7Ci0gICAgICAgIG1OdW1iZXJFZmZlY3RzID0gcFNldHRpbmdzLT5uYkVmZmVjdHM7Ci0gICAgICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzOiBtTnVtYmVyRWZmZWN0cyA9ICVkIiwgbU51bWJlckVmZmVjdHMpOwotCi0gICAgICAgIGlmKG1OdW1iZXJFZmZlY3RzICE9IDApIHsKLSAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgbU51bWJlckVmZmVjdHMqc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyksCi0gICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJlZmZlY3RzIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOiBBbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKiltRWZmZWN0c1NldHRpbmdzLDAsCi0gICAgICAgICAgICAgbU51bWJlckVmZmVjdHMqc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotCi0gICAgICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0KLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucFRleHRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopJihtRWZmZWN0c1NldHRpbmdzW2ldKSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKikmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXSksCi0gICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgewotICAgICAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgcEZyYW1pbmcgUkdCIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikibHZwcCBmcmFtaW5nIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVmZmVjdHNTZXR0aW5nczpBbGxvYyBlcnJvciBmb3IgcEZyYW1pbmdCdWYiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBwYWNfZGF0YSAoUkdCKQotICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5yZ2JUeXBlID09IE00VlNTM0dQUF9rUkdCNTY1KXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJnYlNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9oZWlnaHQqMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKAotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjg4OCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmdiU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodCozOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZmZlY3RzU2V0dGluZ3M6IHdyb25nIFJHQiB0eXBlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdG1wID0gKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhyZ2JTaXplLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJmcmFtaW5nIGJ1ZmZlciBwYWNfZGF0YSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKHRtcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVmZmVjdHNTZXR0aW5nczpBbGxvYyBlcnJvciBwRnJhbWluZ0J1ZiBwYWMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwRnJhbWluZ0J1ZmZlciovCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3N0cmlkZTsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV90b3BsZWZ0OwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZTsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgcEZyYW1pbmcgZGF0YQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHJnYlNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5yZ2JUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnJnYlR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nID09IE5VTEwpIHsKLQotICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9IChNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MpLCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciopIkx2UFAsIGNvcHkgb2YgYmdtU2V0dGluZ3MiKTsKLQotICAgICAgICBpZihOVUxMID09IG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKSB7Ci0gICAgICAgICAgICBBTE9HRSgibG9hZEVkaXRTZXR0aW5nczogbUJhY2tncm91bmRBdWRpb1NldHRpbmcgTWFsbG9jIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopbUJhY2tncm91bmRBdWRpb1NldHRpbmcsIDAsc2l6ZW9mKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKikpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKiltQmFja2dyb3VuZEF1ZGlvU2V0dGluZywgKHZvaWQgKiliZ21TZXR0aW5ncywgc2l6ZW9mKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKSk7Ci0KLSAgICAgICAgaWYgKCBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+cEZpbGUgIT0gTTRPU0FfTlVMTCApIHsKLQotICAgICAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlID0gKE00T1NBX1ZvaWQqKSBiZ21TZXR0aW5ncy0+cFBDTUZpbGVQYXRoOwotICAgICAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnVpTmJDaGFubmVscyA9IDI7Ci0gICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IDMyMDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT3BlbiB0aGUgQkcgZmlsZQotICAgICAgICBpZiAoIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT5wRmlsZSAhPSBNNE9TQV9OVUxMICkgewotICAgICAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWRPcGVuKCZtQXVkaW9NaXhQQ01GaWxlSGFuZGxlLAotICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT5wRmlsZSwgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3M6IG1CYWNrZ3JvdW5kQXVkaW8gUENNIEZpbGUgb3BlbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgbU91dHB1dFZpZGVvU2l6ZSA9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemU7Ci0gICAgbUZyYW1lU3RyLnBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewotICAgIEFMT0dWKCJzZXRTdXJmYWNlIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnN0YXJ0UHJldmlldygKLSAgICBNNE9TQV9VSW50MzIgZnJvbU1TLCBNNE9TQV9JbnQzMiB0b01zLCBNNE9TQV9VSW50MTYgY2FsbEJhY2tBZnRlckZyYW1lQ291bnQsCi0gICAgTTRPU0FfQm9vbCBsb29wKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgaSA9IDAsIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gMDsKLSAgICBBTE9HVigic3RhcnRQcmV2aWV3Iik7Ci0KLSAgICBpZihmcm9tTVMgPiAoTTRPU0FfVUludDMyKXRvTXMpIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0UHJldmlldzogZnJvbU1TID4gdG9NcyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKHRvTXMgPT0gMCkgewotICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiB0b01zIGlzIDAiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvLyBJZiBhbHJlYWR5IHN0YXJ0ZWQsIHRoZW4gc3RvcCBwcmV2aWV3IGZpcnN0Ci0gICAgZm9yKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IHN0b3BwaW5nIHByZXZpb3VzbHkgc3RhcnRlZCBwcmV2aWV3IHBsYXliYWNrIik7Ci0gICAgICAgICAgICBzdG9wUHJldmlldygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiByZW5kZXJQcmV2aWV3IHdhcyBjYWxsZWQgcHJldmlvdXNseSwgdGhlbiBkZWxldGUgUmVuZGVyZXIgb2JqZWN0IGZpcnN0Ci0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IGRlbGV0ZSBwcmV2aW91cyBQcmV2aWV3UmVuZGVyZXIiKTsKLSAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSBBdWRpbyBwbGF5ZXIgdG8gYmUgdXNlZCBmb3IgZW50aXJlCi0gICAgLy8gc3Rvcnlib2FyZCBkdXJhdGlvbgotICAgIG1WRUF1ZGlvU2luayA9IG5ldyBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dCgpOwotICAgIG1WRUF1ZGlvUGxheWVyID0gbmV3IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIobVZFQXVkaW9TaW5rKTsKLSAgICBtVkVBdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTZXR0aW5ncyhtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyk7Ci0gICAgbVZFQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLQotICAgIC8vIENyZWF0ZSBWaWRlbyBSZW5kZXJlciB0byBiZSB1c2VkIGZvciB0aGUgZW50aXJlIHN0b3J5Ym9hcmQgZHVyYXRpb24uCi0gICAgdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBnZXRWaWRlb1NpemVCeVJlc29sdXRpb24obU91dHB1dFZpZGVvU2l6ZSwgJndpZHRoLCAmaGVpZ2h0KTsKLSAgICBtTmF0aXZlV2luZG93UmVuZGVyZXIgPSBuZXcgTmF0aXZlV2luZG93UmVuZGVyZXIobVN1cmZhY2UsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgQUxPR1YoInN0YXJ0UHJldmlldzogbG9vcCA9ICVkIiwgbG9vcCk7Ci0gICAgbVByZXZpZXdMb29waW5nID0gbG9vcDsKLQotICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50ID0gJWQiLCBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCk7Ci0gICAgbUNhbGxCYWNrQWZ0ZXJGcmFtZUNudCA9IGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50OwotCi0gICAgZm9yIChpbnQgcGxheWVySW5zdD0wOyBwbGF5ZXJJbnN0PGtUb3RhbE51bVBsYXllckluc3RhbmNlczsgcGxheWVySW5zdCsrKSB7Ci0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XSA9IG5ldyBWaWRlb0VkaXRvclBsYXllcihtTmF0aXZlV2luZG93UmVuZGVyZXIpOwotICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0gPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoInN0YXJ0UHJldmlldzpFcnJvciBjcmVhdGluZyBWaWRlb0VkaXRvclBsYXllciAlZCIscGxheWVySW5zdCk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogb2JqZWN0IGNyZWF0ZWQiKTsKLQotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnNldE5vdGlmeUNhbGxiYWNrKHRoaXMsKG5vdGlmeV9jYWxsYmFja19mKW5vdGlmeSk7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IG5vdGlmeSBjYWxsYmFjayBzZXQiKTsKLQotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPmxvYWRFZmZlY3RzU2V0dGluZ3MobUVmZmVjdHNTZXR0aW5ncywKLSAgICAgICAgIG1OdW1iZXJFZmZlY3RzKTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogZWZmZWN0cyBzZXR0aW5ncyBsb2FkZWQiKTsKLQotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPmxvYWRBdWRpb01peFNldHRpbmdzKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogQXVkaW9NaXhTZXR0aW5ncyBzZXR0aW5ncyBsb2FkZWQiKTsKLQotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogQXVkaW9NaXhQQ01GaWxlSGFuZGxlIHNldCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKAotICAgICAgICAgbUNhbGxCYWNrQWZ0ZXJGcmFtZUNudCk7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IHNldFByb2dyZXNzQ2FsbEJhY2tJbnRlcnZhbCIpOwotICAgIH0KLQotICAgIG1QbGF5ZXJTdGF0ZSA9IFZlUGxheWVySWRsZTsKLSAgICBtUHJlcGFyZVJlcWVzdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgaWYoZnJvbU1TID09IDApIHsKLSAgICAgICAgbUN1cnJlbnRDbGlwTnVtYmVyID0gLTE7Ci0gICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWUgPSBtQ2xpcExpc3RbMF0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICBtVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXAgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogZnJvbU1TPSVkIiwgZnJvbU1TKTsKLSAgICAgICAgaWYoZnJvbU1TID49IG1DbGlwVG90YWxEdXJhdGlvbikgewotICAgICAgICAgICAgQUxPR0UoInN0YXJ0UHJldmlldzogZnJvbU1TID49IG1DbGlwVG90YWxEdXJhdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckNsaXBzSW5TdG9yeUJvYXJkO2krKykgewotICAgICAgICAgICAgaWYoZnJvbU1TIDwgKGlJbmNyZW1lbnRlZER1cmF0aW9uICsgKG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIC0KLSAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdG8gMSBpbmRleCBiZWxvdywKLSAgICAgICAgICAgICAgICAvLyBhcyB0aHJlYWRQcm9jZXNzIGZpcnN0IGluY3JlbWVudHMgdGhlIGNsaXAgaW5kZXgKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBwcm9jZXNzZXMgY2xpcCBpbiB0aHJlYWQgbG9vcAotICAgICAgICAgICAgICAgIG1DdXJyZW50Q2xpcE51bWJlciA9IGktMTsKLSAgICAgICAgICAgICAgICBBTE9HRCgic3RhcnRQcmV2aWV3Om1DdXJyZW50Q2xpcE51bWJlciA9ICVkIGZyb21NUz0lZCIsaSxmcm9tTVMpOwotCi0gICAgICAgICAgICAgICAgLy8gU2F2ZSBvcmlnaW5hbCB2YWx1ZQotICAgICAgICAgICAgICAgIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lID0gbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgICAgIC8vIFNldCBjb3JyZWN0IGJlZ2luIHRpbWUgdG8gc3RhcnQgcGxheWJhY2sKLSAgICAgICAgICAgICAgICBpZigoZnJvbU1TK21DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpID4KLSAgICAgICAgICAgICAgICAoaUluY3JlbWVudGVkRHVyYXRpb24rbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUgKwotICAgICAgICAgICAgICAgICAgICAgKGZyb21NUyAtIGlJbmNyZW1lbnRlZER1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IGlJbmNyZW1lbnRlZER1cmF0aW9uICsKLSAgICAgICAgICAgICAgICAgKG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIC0gbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwID0gaUluY3JlbWVudGVkRHVyYXRpb247Ci0gICAgfQotCi0gICAgZm9yIChpbnQgcGxheWVySW5zdD0wOyBwbGF5ZXJJbnN0PGtUb3RhbE51bVBsYXllckluc3RhbmNlczsgcGxheWVySW5zdCsrKSB7Ci0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oZnJvbU1TLAotICAgICAgICAgbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWUsCi0gICAgICAgICBtQ2xpcExpc3RbaV0tPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvVm9sdW1lUGVyY2VudGFnZSk7Ci0KLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzpzZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wIHNldCAlZCBjdXR0aW1lIFwKLSAgICAgICAgICVkIiwgZnJvbU1TLCBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSk7Ci0gICAgfQotCi0gICAgbVN0YXJ0aW5nQ2xpcEluZGV4ID0gbUN1cnJlbnRDbGlwTnVtYmVyKzE7Ci0KLSAgICAvLyBTdGFydCBwbGF5aW5nIHdpdGggcGxheWVyIGluc3RhbmNlIDAKLSAgICBtQ3VycmVudFBsYXllciA9IDA7Ci0gICAgbUFjdGl2ZVBsYXllckluZGV4ID0gMDsKLQotICAgIGlmKHRvTXMgPT0gLTEpIHsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogUHJldmlldyB0aWxsIGVuZCBvZiBzdG9yeWJvYXJkIik7Ci0gICAgICAgIG1OdW1iZXJDbGlwc1RvUHJldmlldyA9IG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDsKLSAgICAgICAgLy8gU2F2ZSBvcmlnaW5hbCB2YWx1ZQotICAgICAgICBtTGFzdFByZXZpZXdDbGlwRW5kVGltZSA9Ci0gICAgICAgICBtQ2xpcExpc3RbbU51bWJlckNsaXBzVG9QcmV2aWV3LTFdLT51aUVuZEN1dFRpbWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiB0b01zPSVkIiwgdG9Ncyk7Ci0gICAgICAgIGlmKChNNE9TQV9VSW50MzIpdG9NcyA+IG1DbGlwVG90YWxEdXJhdGlvbikgewotICAgICAgICAgICAgQUxPR0UoInN0YXJ0UHJldmlldzogdG9NcyA+IG1DbGlwVG90YWxEdXJhdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotCi0gICAgICAgIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gMDsKLQotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckNsaXBzSW5TdG9yeUJvYXJkO2krKykgewotICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMil0b01zIDw9IChpSW5jcmVtZW50ZWREdXJhdGlvbiArCi0gICAgICAgICAgICAgKG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIC0gbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2F2ZSBvcmlnaW5hbCB2YWx1ZQotICAgICAgICAgICAgICAgIG1MYXN0UHJldmlld0NsaXBFbmRUaW1lID0gbUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBlbmQgY3V0IHRpbWUgb2YgY2xpcCBpbmRleCBpIHRvIHRvTXMKLSAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9IHRvTXM7Ci0KLSAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgY2xpcHMgdG8gYmUgcHJldmlld2VkIGlzIGZyb20gaW5kZXggMCB0byBpCi0gICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGJ5IDEgYXMgaSBzdGFydHMgZnJvbSAwCi0gICAgICAgICAgICAgICAgbU51bWJlckNsaXBzVG9QcmV2aWV3ID0gaSsxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaUluY3JlbWVudGVkRHVyYXRpb24gPSBpSW5jcmVtZW50ZWREdXJhdGlvbiArCi0gICAgICAgICAgICAgICAgIChtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT3BlbiB0aGUgdGhyZWFkIHNlbWFwaG9yZQotICAgIE00T1NBX3NlbWFwaG9yZU9wZW4oJm1TZW1UaHJlYWRXYWl0LCAxKTsKLQotICAgIC8vIE9wZW4gdGhlIHByZXZpZXcgcHJvY2VzcyB0aHJlYWQKLSAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jT3BlbigmbVRocmVhZENvbnRleHQsIChNNE9TQV9UaHJlYWREb0l0KXRocmVhZFByb2MpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBBTE9HRSgiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjpNNE9TQV90aHJlYWRTeW5jT3BlbiBlcnJvciAlZCIsIChpbnQpIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBzdGFja3NpemUKLSAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKG1UaHJlYWRDb250ZXh0LCBNNE9TQV9UaHJlYWRTdGFja1NpemUsCi0gICAgIChNNE9TQV9EYXRhT3B0aW9uKSBrUHJldmlld1RocmVhZFN0YWNrU2l6ZSk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgQUxPR0UoIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6IHRocmVhZFN5bmNTZXRPcHRpb24gZXJyb3IgJWQiLCAoaW50KSBlcnIpOwotICAgICAgICBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgIC8vIFN0YXJ0IHRoZSB0aHJlYWQKLSAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY1N0YXJ0KG1UaHJlYWRDb250ZXh0LCAoTTRPU0FfVm9pZCopdGhpcyk7Ci0gICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBBTE9HRSgiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjogdGhyZWFkU3luY1N0YXJ0IGVycm9yICVkIiwgKGludCkgZXJyKTsKLSAgICAgICAgTTRPU0FfdGhyZWFkU3luY0Nsb3NlKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBiU3RvcFRocmVhZEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQotICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IHByb2Nlc3MgdGhyZWFkIHN0YXJ0ZWQiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfVUludDMyIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnN0b3BQcmV2aWV3KCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHVpbnQzMl90IGxhc3RSZW5kZXJlZEZyYW1lVGltZU1zID0gMDsKLSAgICBBTE9HVigic3RvcFByZXZpZXciKTsKLQotICAgIC8vIFN0b3AgdGhlIHRocmVhZAotICAgIGlmKG1UaHJlYWRDb250ZXh0ICE9IE5VTEwpIHsKLSAgICAgICAgYlN0b3BUaHJlYWRJblByb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrU2VtKTsKLSAgICAgICAgICAgIGlmIChtU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlUG9zdChtU2VtVGhyZWFkV2FpdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jU3RvcChtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVigic3RvcFByZXZpZXc6IGVycm9yIDB4JXggaW4gdHJ5aW5nIHRvIHN0b3AgdGhyZWFkIiwgZXJyKTsKLSAgICAgICAgICAgIC8vIENvbnRpbnVlIGV2ZW4gaWYgZXJyb3IKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RvcFByZXZpZXc6IGVycm9yIDB4JXggaW4gdHJ5aW5nIHRvIGNsb3NlIHRocmVhZCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgIC8vIENvbnRpbnVlIGV2ZW4gaWYgZXJyb3IKLSAgICAgICAgfQotCi0gICAgICAgIG1UaHJlYWRDb250ZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZSB0aGUgc2VtYXBob3JlIGZpcnN0Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2tTZW0pOwotICAgICAgICBpZihtU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVDbG9zZShtU2VtVGhyZWFkV2FpdCk7Ci0gICAgICAgICAgICBBTE9HVigic3RvcFByZXZpZXc6IGNsb3NlIHNlbWFwaG9yZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgbVNlbVRocmVhZFdhaXQgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpbnQgcGxheWVySW5zdD0wOyBwbGF5ZXJJbnN0PGtUb3RhbE51bVBsYXllckluc3RhbmNlczsgcGxheWVySW5zdCsrKSB7Ci0gICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0tPmlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInN0b3AgdGhlIHBsYXllciBmaXJzdCIpOwotICAgICAgICAgICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBsYXllckluc3QgPT0gbUFjdGl2ZVBsYXllckluZGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBsYXN0IHJlbmRlcmVkIGZyYW1lIHRpbWUgc3RhbXAKLSAgICAgICAgICAgICAgICBtVmVQbGF5ZXJbbUFjdGl2ZVBsYXllckluZGV4XS0+Z2V0TGFzdFJlbmRlcmVkVGltZU1zKCZsYXN0UmVuZGVyZWRGcmFtZVRpbWVNcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vVGhpcyBpcyB1c2VkIHRvIHN5bmNyb25pemUgb25TdHJlYW1Eb25lKCkgaW4gUHJldmlld1BsYXllciBhbmQKLSAgICAgICAgICAgIC8vc3RvcFByZXZpZXcoKSBpbiBQcmV2aWV3Q29udHJvbGxlcgotICAgICAgICAgICAgc3A8VmlkZW9FZGl0b3JQbGF5ZXI+IHRlbXAgPSBtVmVQbGF5ZXJbcGxheWVySW5zdF07Ci0gICAgICAgICAgICB0ZW1wLT5hY3F1aXJlTG9jaygpOwotICAgICAgICAgICAgQUxPR1YoInN0b3BQcmV2aWV3OiBjbGVhcmluZyBtVmVQbGF5ZXIiKTsKLSAgICAgICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS5jbGVhcigpOwotICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdID0gTlVMTDsKLSAgICAgICAgICAgIHRlbXAtPnJlbGVhc2VMb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoInN0b3BQcmV2aWV3OiBjbGVhciBhdWRpb1NpbmsgYW5kIGF1ZGlvUGxheWVyIik7Ci0gICAgbVZFQXVkaW9TaW5rLmNsZWFyKCk7Ci0gICAgaWYgKG1WRUF1ZGlvUGxheWVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtVkVBdWRpb1BsYXllcjsKLSAgICAgICAgbVZFQXVkaW9QbGF5ZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGRlbGV0ZSBtTmF0aXZlV2luZG93UmVuZGVyZXI7Ci0gICAgbU5hdGl2ZVdpbmRvd1JlbmRlcmVyID0gTlVMTDsKLQotICAgIC8vIElmIGltYWdlIGZpbGUgcGxheWluZywgdGhlbiBmcmVlIHRoZSBidWZmZXIgcG9pbnRlcgotICAgIGlmKG1GcmFtZVN0ci5wQnVmZmVyICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShtRnJhbWVTdHIucEJ1ZmZlcik7Ci0gICAgICAgIG1GcmFtZVN0ci5wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCBvcmlnaW5hbCBiZWdpbiBjdXR0aW1lIG9mIGZpcnN0IHByZXZpZXdlZCBjbGlwKi8KLSAgICBtQ2xpcExpc3RbbVN0YXJ0aW5nQ2xpcEluZGV4XS0+dWlCZWdpbkN1dFRpbWUgPSBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLSAgICAvLyBSZXNldCBvcmlnaW5hbCBlbmQgY3V0dGltZSBvZiBsYXN0IHByZXZpZXdlZCBjbGlwKi8KLSAgICBtQ2xpcExpc3RbbU51bWJlckNsaXBzVG9QcmV2aWV3LTFdLT51aUVuZEN1dFRpbWUgPSBtTGFzdFByZXZpZXdDbGlwRW5kVGltZTsKLQotICAgIG1QbGF5ZXJTdGF0ZSA9IFZlUGxheWVySWRsZTsKLSAgICBtUHJlcGFyZVJlcWVzdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgbUN1cnJlbnRQbGF5ZWREdXJhdGlvbiA9IDA7Ci0gICAgbUN1cnJlbnRDbGlwRHVyYXRpb24gPSAwOwotICAgIG1SZW5kZXJpbmdNb2RlID0gTTR4VlNTX2tCbGFja0JvcmRlcnM7Ci0gICAgbU91dHB1dFZpZGVvV2lkdGggPSAwOwotICAgIG1PdXRwdXRWaWRlb0hlaWdodCA9IDA7Ci0KLSAgICBBTE9HVigic3RvcFByZXZpZXcoKSBsYXN0UmVuZGVyZWRGcmFtZVRpbWVNcyAlbGQiLCBsYXN0UmVuZGVyZWRGcmFtZVRpbWVNcyk7Ci0gICAgcmV0dXJuIGxhc3RSZW5kZXJlZEZyYW1lVGltZU1zOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6Y2xlYXJTdXJmYWNlKAotICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLCBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZUluZm8pIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lU3RyID0gcEZyYW1lSW5mbzsKLSAgICBNNE9TQV9VSW50MzIgb3V0cHV0QnVmZmVyV2lkdGggPTAsIG91dHB1dEJ1ZmZlckhlaWdodD0wOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBsYW5lT3V0WzNdOwotICAgIEFMT0dWKCJJbnNpZGUgcHJldmlldyBjbGVhciBmcmFtZSIpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIC8vIERlbGV0ZSBwcmV2aW91cyByZW5kZXJlciBpbnN0YW5jZQotICAgIGlmKG1UYXJnZXQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgfQotCi0gICAgb3V0cHV0QnVmZmVyV2lkdGggPSBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aDsKLSAgICBvdXRwdXRCdWZmZXJIZWlnaHQgPSBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQ7Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSByZW5kZXJlcgotICAgIGlmKG1UYXJnZXQgPT0gTlVMTCkgewotCi0gICAgICAgIG1UYXJnZXQgPSBQcmV2aWV3UmVuZGVyZXI6OkNyZWF0ZVByZXZpZXdSZW5kZXJlcigKLSAgICAgICAgICAgIHN1cmZhY2UsCi0gICAgICAgICAgICBvdXRwdXRCdWZmZXJXaWR0aCwgb3V0cHV0QnVmZmVySGVpZ2h0KTsKLQotICAgICAgICBpZihtVGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGNhbm5vdCBjcmVhdGUgUHJldmlld1JlbmRlcmVyIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPdXQgcGxhbmUKLSAgICB1aW50OF90KiBvdXRCdWZmZXI7Ci0gICAgc2l6ZV90IG91dEJ1ZmZlclN0cmlkZSA9IDA7Ci0KLSAgICBBTE9HVigiZG9NZWRpYVJlbmRlcmluZyBDQUxMIGdldEJ1ZmZlcigpIik7Ci0gICAgbVRhcmdldC0+Z2V0QnVmZmVyWVYxMigmb3V0QnVmZmVyLCAmb3V0QnVmZmVyU3RyaWRlKTsKLQotICAgIC8vIFNldCB0aGUgb3V0cHV0IFlVVjQyMCBwbGFuZSB0byBiZSBjb21wYXRpYmxlIHdpdGggWVYxMiBmb3JtYXQKLSAgICAvL0luIFlWMTIgZm9ybWF0LCBzaXplcyBtdXN0IGJlIGV2ZW4KLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lV2lkdGggPSAoKG91dHB1dEJ1ZmZlcldpZHRoICsxKT4+MSk8PDE7Ci0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZUhlaWdodCA9ICgob3V0cHV0QnVmZmVySGVpZ2h0KzEpPj4xKTw8MTsKLQotICAgIHByZXBhcmVZVjEySW1hZ2VQbGFuZShwbGFuZU91dCwgeXYxMlBsYW5lV2lkdGgsIHl2MTJQbGFuZUhlaWdodCwKLSAgICAgKE00T1NBX1VJbnQzMilvdXRCdWZmZXJTdHJpZGUsIChNNFZJRklfVUludDggKilvdXRCdWZmZXIpOwotCi0gICAgLyogRmlsbCB0aGUgc3VyZmFjZSB3aXRoIGJsYWNrIGZyYW1lICovCi0gICAgbWVtc2V0KCh2b2lkICopcGxhbmVPdXRbMF0ucGFjX2RhdGEsMHgwMCxwbGFuZU91dFswXS51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZU91dFswXS51X2hlaWdodCAqIDEuNSk7Ci0gICAgbWVtc2V0KCh2b2lkICopcGxhbmVPdXRbMV0ucGFjX2RhdGEsMTI4LHBsYW5lT3V0WzFdLnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFsyXS5wYWNfZGF0YSwxMjgscGxhbmVPdXRbMl0udV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lT3V0WzJdLnVfaGVpZ2h0KTsKLQotICAgIG1UYXJnZXQtPnJlbmRlcllWMTIoKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6cmVuZGVyUHJldmlld0ZyYW1lKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCi0gICAgICAgICAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZUluZm8sCi0gICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwQ3VyckVkaXRJbmZvKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgaSA9IDAsIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gMCwgdG5UaW1lTXM9MCwgZnJhbWVzaXplID0wOwotICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lU3RyID0gcEZyYW1lSW5mbzsKLSAgICBNNFZJRklfVUludDggKnBpeGVsQXJyYXkgPSBOVUxMOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAocEN1cnJFZGl0SW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgIHBDdXJyRWRpdEluZm8tPm92ZXJsYXlTZXR0aW5nc0luZGV4ID0gLTE7Ci0gICAgfQotICAgIC8vIERlbGV0ZSBwcmV2aW91cyByZW5kZXJlciBpbnN0YW5jZQotICAgIGlmKG1UYXJnZXQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobU91dHB1dFZpZGVvV2lkdGggPT0gMCkgewotICAgICAgICBtT3V0cHV0VmlkZW9XaWR0aCA9IHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoOwotICAgIH0KLQotICAgIGlmKG1PdXRwdXRWaWRlb0hlaWdodCA9PSAwKSB7Ci0gICAgICAgIG1PdXRwdXRWaWRlb0hlaWdodCA9IHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodDsKLSAgICB9Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSByZW5kZXJlcgotICAgIGlmKG1UYXJnZXQgPT0gTlVMTCkgewotICAgICAgICAgbVRhcmdldCA9IFByZXZpZXdSZW5kZXJlcjo6Q3JlYXRlUHJldmlld1JlbmRlcmVyKAotICAgICAgICAgICAgc3VyZmFjZSwKLSAgICAgICAgICAgIG1PdXRwdXRWaWRlb1dpZHRoLCBtT3V0cHV0VmlkZW9IZWlnaHQpOwotCi0gICAgICAgIGlmKG1UYXJnZXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogY2Fubm90IGNyZWF0ZSBQcmV2aWV3UmVuZGVyZXIiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBpeGVsQXJyYXkgPSBOVUxMOwotCi0gICAgLy8gQXBwbHkgcm90YXRpb24gaWYgcmVxdWlyZWQKLSAgICBpZiAocEZyYW1lU3RyLT52aWRlb1JvdGF0aW9uRGVncmVlICE9IDApIHsKLSAgICAgICAgZXJyID0gYXBwbHlWaWRlb1JvdGF0aW9uKChNNE9TQV9Wb2lkICopcEZyYW1lU3RyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGgsIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCwKLSAgICAgICAgICAgICAgICAgIHBGcmFtZVN0ci0+dmlkZW9Sb3RhdGlvbkRlZ3JlZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogY2Fubm90IHJvdGF0ZSB2aWRlbywgZXJyIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgLy8gVmlkZW8gcm90YXRpb24gZG9uZS4KLSAgICAgICAgICAgLy8gU3dhcCB3aWR0aCBhbmQgaGVpZ2h0IGlmIDkwIG9yIDI3MCBkZWdyZWVzCi0gICAgICAgICAgIGlmIChwRnJhbWVTdHItPnZpZGVvUm90YXRpb25EZWdyZWUgIT0gMTgwKSB7Ci0gICAgICAgICAgICAgICBpbnQzMl90IHRlbXAgPSBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aDsKLSAgICAgICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoID0gcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0OwotICAgICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0ID0gdGVtcDsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vIFBvc3Rwcm9jZXNzaW5nIChhcHBseSB2aWRlbyBlZmZlY3QpCi0gICAgaWYocEZyYW1lU3RyLT5iQXBwbHlFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotCi0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIGVmZmVjdCBzdGFydHRpbWUgbWF0Y2hlcyB0aGUgY2xpcCBiZWluZyBwcmV2aWV3ZWQKLSAgICAgICAgICAgIGlmKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDwgcEZyYW1lU3RyLT5jbGlwQmVnaW5DdXRUaW1lKQotICAgICAgICAgICAgIHx8KG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPj0gcEZyYW1lU3RyLT5jbGlwRW5kQ3V0VGltZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGVmZmVjdCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIGNsaXAsIGNoZWNrIG5leHQgb25lCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8PSBwRnJhbWVTdHItPnRpbWVNcykgJiYKLSAgICAgICAgICAgICgobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSttRWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24pID49Ci0gICAgICAgICAgICAgcEZyYW1lU3RyLT50aW1lTXMpICYmIChtRWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24gIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBzZXRWaWRlb0VmZmVjdFR5cGUobUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIFRSVUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0VmlkZW9FZmZlY3RUeXBlKG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL1Byb3ZpZGUgdGhlIG92ZXJsYXkgVXBkYXRlIGluZGljYXRpb24gd2hlbiB0aGVyZSBpcyBhbiBvdmVybGF5IGVmZmVjdAotICAgICAgICBpZiAobUN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GUkFNSU5HKSB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5kZXg7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ICY9IH5WSURFT19FRkZFQ1RfRlJBTUlORzsgLy9uZXZlciBhcHBseSBmcmFtaW5nIGhlcmUuCi0KLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbU51bWJlckVmZmVjdHM7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2luZGV4XS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgewotCi0gICAgICAgICAgICAgICAgICAgIGlmKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSA8PSBwRnJhbWVJbmZvLT50aW1lTXMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpU3RhcnRUaW1lKwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlEdXJhdGlvbikgPj0gcEZyYW1lSW5mby0+dGltZU1zKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGluZGV4IDwgbU51bWJlckVmZmVjdHMpICYmIChwQ3VyckVkaXRJbmZvICE9IE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgcEN1cnJFZGl0SW5mby0+b3ZlcmxheVNldHRpbmdzSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICAgICBBTE9HVigiRnJhbWluZyBpbmRleCA9ICVkIiwgaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiTm8gZnJhbWluZyBlZmZlY3RzIGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtQ3VycmVudFZpZGVvRWZmZWN0ICE9IFZJREVPX0VGRkVDVF9OT05FKSB7Ci0gICAgICAgICAgICBlcnIgPSBhcHBseVZpZGVvRWZmZWN0KChNNE9TQV9Wb2lkICopcEZyYW1lU3RyLT5wQnVmZmVyLAotICAgICAgICAgICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsIHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoLAotICAgICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCwgcEZyYW1lU3RyLT50aW1lTXMsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwaXhlbEFycmF5KTsKLQotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBhcHBseVZpZGVvRWZmZWN0IGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZnJlZShwaXhlbEFycmF5KTsKLSAgICAgICAgICAgICAgICBwaXhlbEFycmF5ID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSByZW5kZXJpbmcgbW9kZQotICAgICAgICAgICAgZXJyID0gZG9JbWFnZVJlbmRlcmluZ01vZGUoKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LCAoTTRPU0FfVm9pZCAqKXBpeGVsQXJyYXkpOwotCi0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6ZG9JbWFnZVJlbmRlcmluZ01vZGUgZXJyb3IgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHBpeGVsQXJyYXkpOwotICAgICAgICAgICAgICAgIHBpeGVsQXJyYXkgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIEFwcGx5IHRoZSByZW5kZXJpbmcgbW9kZQotICAgICAgICBlcnIgPSBkb0ltYWdlUmVuZGVyaW5nTW9kZSgoTTRPU0FfVm9pZCAqKXBGcmFtZVN0ci0+cEJ1ZmZlciwKLSAgICAgICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsIHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoLAotICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LCAoTTRPU0FfVm9pZCAqKXBpeGVsQXJyYXkpOwotCi0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBkb0ltYWdlUmVuZGVyaW5nTW9kZSBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICAgICAgICAgIGZyZWUocGl4ZWxBcnJheSk7Ci0gICAgICAgICAgICBwaXhlbEFycmF5ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtVGFyZ2V0LT5yZW5kZXJZVjEyKCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfVm9pZCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRKbmlDYWxsYmFjayh2b2lkKiBjb29raWUsCi0gICAgam5pX3Byb2dyZXNzX2NhbGxiYWNrX2ZjdCBjYWxsYmFja0ZjdCkgewotICAgIC8vQUxPR1YoInNldEpuaUNhbGxiYWNrIik7Ci0gICAgbUpuaUNvb2tpZSA9IGNvb2tpZTsKLSAgICBtSm5pQ2FsbGJhY2sgPSBjYWxsYmFja0ZjdDsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnByZXBhcmVQbGF5ZXIoCi0gICAgdm9pZCogcGFyYW0sIGludCBwbGF5ZXJJbnN0YW5jZSwgaW50IGluZGV4KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICpwQ29udHJvbGxlciA9Ci0gICAgIChWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICopcGFyYW07Ci0KLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogaW5zdGFuY2UgJWQgZmlsZSAlZCIsIHBsYXllckluc3RhbmNlLCBpbmRleCk7Ci0KLSAgICBjb25zdCBjaGFyKiBmaWxlTmFtZSA9IChjb25zdCBjaGFyKikgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnBGaWxlOwotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXREYXRhU291cmNlKGZpbGVOYW1lLCBOVUxMKTsKLQotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXREYXRhU291cmNlIGluc3RhbmNlICVzIiwKLSAgICAgKGNvbnN0IGNoYXIgKilwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+cEZpbGUpOwotCi0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldFZpZGVvU3VyZmFjZSgKLSAgICAgcENvbnRyb2xsZXItPm1TdXJmYWNlKTsKLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0VmlkZW9TdXJmYWNlIik7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0TWVkaWFSZW5kZXJpbmdNb2RlKAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgcENvbnRyb2xsZXItPm1PdXRwdXRWaWRlb1NpemUpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRNZWRpYVJlbmRlcmluZ01vZGUiKTsKLQotICAgIGlmKChNNE9TQV9VSW50MzIpaW5kZXggPT0gcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0UGxheWJhY2tCZWdpblRpbWUoCi0gICAgICAgIHBDb250cm9sbGVyLT5tRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0UGxheWJhY2tCZWdpblRpbWUoCi0gICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgfQotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRQbGF5YmFja0JlZ2luVGltZSglZCkiLAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOwotCi0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldFBsYXliYWNrRW5kVGltZSgKLSAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpRW5kQ3V0VGltZSk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldFBsYXliYWNrRW5kVGltZSglZCkiLAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlFbmRDdXRUaW1lKTsKLQotICAgIGlmKHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldEltYWdlQ2xpcFByb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldEltYWdlQ2xpcFByb3BlcnRpZXMiKTsKLSAgICB9Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+cHJlcGFyZSgpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBwcmVwYXJlZCIpOwotCi0gICAgaWYocENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lID4gMCkgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2Vla1RvKAotICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lKTsKLQotICAgICAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2Vla1RvKCVkKSIsCi0gICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOwotICAgIH0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcl0tPnNldEF1ZGlvUGxheWVyKHBDb250cm9sbGVyLT5tVkVBdWRpb1BsYXllcik7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+cmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiByZWFkRmlyc3RWaWRlb0ZyYW1lIG9mIGNsaXAiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjp0aHJlYWRQcm9jKE00T1NBX1ZvaWQqIHBhcmFtKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfSW50MzIgaW5kZXggPSAwOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKnBDb250cm9sbGVyID0KLSAgICAgKFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKilwYXJhbTsKLQotICAgIEFMT0dWKCJpbnNpZGUgdGhyZWFkUHJvYyIpOwotICAgIGlmKHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPT0gVmVQbGF5ZXJJZGxlKSB7Ci0gICAgICAgIChwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKSsrOwotCi0gICAgICAgIEFMT0dEKCJ0aHJlYWRQcm9jOiBwbGF5aW5nIGZpbGUgaW5kZXggJWQgdG90YWwgY2xpcHMgJWQiLAotICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciwgcENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldyk7Ci0KLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID49Ci0gICAgICAgICBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KSB7Ci0KLSAgICAgICAgICAgIEFMT0dEKCJBbGwgY2xpcHMgcHJldmlld2VkIik7Ci0KLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBEdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIgPSAwOwotCi0gICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bVByZXZpZXdMb29waW5nID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleDsKLQotICAgICAgICAgICAgICAgIEFMT0dEKCJQcmV2aWV3IGxvb3BpbmcgVFJVRSwgcmVzdGFydGluZyBmcm9tIGNsaXAgaW5kZXggJWQiLAotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBzdG9yeSBib2FyZCB0aW1lc3RhbXAgaW5zaWRlIHRoZSBwbGF5ZXIKLSAgICAgICAgICAgICAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOwotICAgICAgICAgICAgICAgICBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0XS0+cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBlbmRBcmdzID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ29va2llLCBNU0dfVFlQRV9QUkVWSUVXX0VORCwgJmVuZEFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID0gVmVQbGF5ZXJBdXRvU3RvcDsKLQotICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9yaWdpbmFsIGJlZ2luIGN1dHRpbWUgb2YgZmlyc3QgcHJldmlld2VkIGNsaXAKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXhdLT51aUJlZ2luQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLSAgICAgICAgICAgICAgICAvLyBSZXNldCBvcmlnaW5hbCBlbmQgY3V0dGltZSBvZiBsYXN0IHByZXZpZXdlZCBjbGlwCi0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3LTFdLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSB3YXJuaW5nIHRvIE00T1NBIHRocmVhZCBoYW5kbGVyCi0gICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aHJlYWQgaXMgbW92ZWQgZnJvbSBleGVjdXRpbmcgc3RhdGUgdG8gb3BlbiBzdGF0ZQotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGluZGV4PXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXI7Ci0gICAgICAgIGlmKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA9PSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbiArPQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXA7Ci0KLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgIC0gcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotCi0gICAgICAgICAgICBwcmVwYXJlUGxheWVyKCh2b2lkKilwQ29udHJvbGxlciwgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyLCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbiArPQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBEdXJhdGlvbjsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUVuZEN1dFRpbWUgLQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zZXRTdG9yeWJvYXJkU3RhcnRUaW1lKAotICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24pOwotICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc2V0U3Rvcnlib2FyZFN0YXJ0VGltZSIpOwotCi0gICAgICAgIC8vIFNldCB0aGUgbmV4dCBjbGlwIGR1cmF0aW9uIGZvciBBdWRpbyBtaXggaGVyZQotICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgIT0gcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgewotCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcl0tPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uLAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+Q2xpcFByb3BlcnRpZXMudWlDbGlwQXVkaW9Wb2x1bWVQZXJjZW50YWdlKTsKLQotICAgICAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtIGZyb21NUyAlZCBcCi0gICAgICAgICAgICAgQ2xpcEJlZ2luVGltZSAlZCIsIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICsKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENhcHR1cmUgdGhlIGFjdGl2ZSBwbGF5ZXIgYmVpbmcgdXNlZAotICAgICAgICBwQ29udHJvbGxlci0+bUFjdGl2ZVBsYXllckluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyOwotCi0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c3RhcnQoKTsKLSAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHN0YXJ0ZWQiKTsKLQotICAgICAgICBwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID0gVmVQbGF5ZXJCdXN5OwotCi0gICAgfSBlbHNlIGlmKHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPT0gVmVQbGF5ZXJBdXRvU3RvcCkgewotICAgICAgICBBTE9HVigiUHJldmlldyBjb21wbGV0ZWQuLmF1dG8gc3RvcCB0aGUgcGxheWVyIik7Ci0gICAgfSBlbHNlIGlmICgocENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9PSBWZVBsYXllckJ1c3kpICYmIChwQ29udHJvbGxlci0+bVByZXBhcmVSZXFlc3QpKSB7Ci0gICAgICAgIC8vIFByZXBhcmUgdGhlIHBsYXllciBoZXJlCi0gICAgICAgIHBDb250cm9sbGVyLT5tUHJlcGFyZVJlcWVzdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwcmVwYXJlUGxheWVyKCh2b2lkKilwQ29udHJvbGxlciwgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyLAotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcisxKTsKLSAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVXYWl0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCwKLSAgICAgICAgICAgICAgICBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFwQ29udHJvbGxlci0+YlN0b3BUaHJlYWRJblByb2dyZXNzKSB7Ci0gICAgICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc3RhdGUgYnVzeS4uLndhaXQgZm9yIHNlbSIpOwotICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlV2FpdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQsCi0gICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzZW0gd2FpdCByZXR1cm5lZCBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICAvL0Fsd2F5cyByZXR1cm4gTTROT19FUlJPUiB0byBlbnN1cmUgdGhlIHRocmVhZCBrZWVwcyBydW5uaW5nCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6bm90aWZ5KAotICAgIHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKQotewotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKnBDb250cm9sbGVyID0KLSAgICAgKFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKiljb29raWU7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICB1aW50MzJfdCBjbGlwRHVyYXRpb24gPSAwOwotICAgIHN3aXRjaCAobXNnKSB7Ci0gICAgICAgIGNhc2UgTUVESUFfTk9QOiAvLyBpbnRlcmZhY2UgdGVzdCBtZXNzYWdlCi0gICAgICAgICAgICBBTE9HVigiTUVESUFfTk9QIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9QUkVQQVJFRDoKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9QUkVQQVJFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dEKCJub3RpZnk6TUVESUFfUExBWUJBQ0tfQ09NUExFVEUsIG1DdXJyZW50Q2xpcE51bWJlciA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcik7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID0gVmVQbGF5ZXJJZGxlOwotCi0gICAgICAgICAgICAvL3NlbmQgcHJvZ3Jlc3MgY2FsbGJhY2sgd2l0aCBsYXN0IGZyYW1lIHRpbWVzdGFtcAotICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID09Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgewotICAgICAgICAgICAgICAgIGNsaXBEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgLSBwQ29udHJvbGxlci0+bUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGlwRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgIC0gcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwbGF5ZWREdXJhdGlvbiA9IGNsaXBEdXJhdGlvbitwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbjsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ29va2llLCBNU0dfVFlQRV9QUk9HUkVTU19JTkRJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAmcGxheWVkRHVyYXRpb24pOwotCi0gICAgICAgICAgICBpZiAoKHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID09IE9WRVJMQVlfVVBEQVRFKSAmJgotICAgICAgICAgICAgICAgICgoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgIT0KLSAgICAgICAgICAgICAgICAocENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldy0xKSkpIHsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwRWRpdEluZm8gPQotICAgICAgICAgICAgICAgICAgICAoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJDdXJyZW50IEVkaXQgaW5mbyIpOwotICAgICAgICAgICAgICAgIHBFZGl0SW5mby0+b3ZlcmxheVNldHRpbmdzSW5kZXggPSBleHQyOwotICAgICAgICAgICAgICAgIHBFZGl0SW5mby0+Y2xpcEluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU92ZXJsYXlTdGF0ZSA9PSBPVkVSTEFZX0NMRUFSOwotICAgICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1RZUEVfT1ZFUkxBWV9DTEVBUiwgcEVkaXRJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJlZShwRWRpdEluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhwQ29udHJvbGxlci0+bUxvY2tTZW0pOwotICAgICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTUVESUFfRVJST1I6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBlcnJfdmFsID0gZXh0MTsKLSAgICAgICAgICAvLyBBbHdheXMgbG9nIGVycm9ycy4KLSAgICAgICAgICAvLyBleHQxOiBNZWRpYSBmcmFtZXdvcmsgZXJyb3IgY29kZS4KLSAgICAgICAgICAvLyBleHQyOiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZS4KLSAgICAgICAgICAgIEFMT0dFKCJNRURJQV9FUlJPUjsgZXJyb3IgKCVkLCAlZCkiLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgIE1TR19UWVBFX1BMQVlFUl9FUlJPUiwgJmVycl92YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRURJQV9JTkZPOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5mb192YWwgPSBleHQyOwotICAgICAgICAgICAgLy8gZXh0MTogTWVkaWEgZnJhbWV3b3JrIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAvLyBleHQyOiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZS4KLSAgICAgICAgICAgIC8vQUxPR1coIk1FRElBX0lORk87IGluZm8vd2FybmluZyAoJWQsICVkKSIsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgaWYocENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgTVNHX1RZUEVfUFJPR1JFU1NfSU5ESUNBVElPTiwgJmluZm9fdmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTUVESUFfU0VFS19DT01QTEVURToKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9TRUVLX0NPTVBMRVRFOyBSZWNlaXZlZCBzZWVrIGNvbXBsZXRlIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9CVUZGRVJJTkdfVVBEQVRFOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX0JVRkZFUklOR19VUERBVEU7IGJ1ZmZlcmluZyAlZCIsIGV4dDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfU0VUX1ZJREVPX1NJWkU6Ci0gICAgICAgICAgICBBTE9HVigiTUVESUFfU0VUX1ZJREVPX1NJWkU7IE5ldyB2aWRlbyBzaXplICVkIHggJWQiLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PGludD4oMHhBQUFBQUFBQSk6Ci0gICAgICAgICAgICBBTE9HVigiVklERU8gUExBWUJBQ0sgQUxNT1NUIG92ZXIsIHByZXBhcmUgbmV4dCBwbGF5ZXIiKTsKLSAgICAgICAgICAgIC8vIFNlbGVjdCBuZXh0IHBsYXllciBhbmQgcHJlcGFyZSBpdAotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjbGlwIGFmdGVyIHRoaXMgb25lCi0gICAgICAgICAgICBpZiAoKE00T1NBX1VJbnQzMikocENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcisxKSA8Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldykgewotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUHJlcGFyZVJlcWVzdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyKys7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllciA+PSBrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgZmlyc3QgY2xpcCB0byBiZSBwbGF5ZWQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhwQ29udHJvbGxlci0+bUxvY2tTZW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PGludD4oMHhCQkJCQkJCQik6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWSURFTyBQTEFZQkFDSywgVXBkYXRlIE92ZXJsYXkiKTsKLSAgICAgICAgICAgIGludCBvdmVybGF5SW5kZXggPSBleHQyOwotICAgICAgICAgICAgVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyAqcEVkaXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgKFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiQ3VycmVudCBFZGl0IGluZm8iKTsKLSAgICAgICAgICAgIC8vZXh0MSA9IDE7IHN0YXJ0IHRoZSBvdmVybGF5IGRpc3BsYXkKLSAgICAgICAgICAgIC8vICAgICA9IDI7IENsZWFyIHRoZSBvdmVybGF5LgotICAgICAgICAgICAgcEVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGV4dDI7Ci0gICAgICAgICAgICBwRWRpdEluZm8tPmNsaXBJbmRleCA9IHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXI7Ci0gICAgICAgICAgICBBTE9HVigicENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA9ICVkIixwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXh0MSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID0gT1ZFUkxBWV9VUERBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNU0dfVFlQRV9PVkVSTEFZX1VQREFURSwgcEVkaXRJbmZvKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU92ZXJsYXlTdGF0ZSA9IE9WRVJMQVlfQ0xFQVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNU0dfVFlQRV9PVkVSTEFZX0NMRUFSLCBwRWRpdEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEVkaXRJbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigidW5yZWNvZ25pemVkIG1lc3NhZ2U6ICglZCwgJWQsICVkKSIsIG1zZywgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c2V0VmlkZW9FZmZlY3RUeXBlKAotICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdHlwZSwgTTRPU0FfQm9vbCBlbmFibGUpIHsKLQotICAgIE00T1NBX1VJbnQzMiBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLQotICAgIC8vIG1hcCBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHRvIGxvY2FsIGVudW0KLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERVRPQkxBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfQkxBQ0tBTkRXSElURTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9QSU5LOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkVFTjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfU0VQSUE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05FR0FUSVZFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZSQU1JTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXM6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRklGVElFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9DT0xPUl9SR0IxNjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfR1JBRElFTlQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZihlbmFibGUgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAvLyBJZiBhbHJlYWR5IHNldCwgdGhlbiBubyBuZWVkIHRvIHNldCBhZ2FpbgotICAgICAgICBpZighKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBlZmZlY3QpKQotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCB8PSBlZmZlY3Q7Ci0gICAgICAgICAgICBpZihlZmZlY3QgPT0gVklERU9fRUZGRUNUX0ZJRlRJRVMpIHsKLSAgICAgICAgICAgICAgICBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgIHsKLSAgICAgICAgLy8gUmVzZXQgb25seSBpZiBhbHJlYWR5IHNldAotICAgICAgICBpZihtQ3VycmVudFZpZGVvRWZmZWN0ICYgZWZmZWN0KQotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+ZWZmZWN0OwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6YXBwbHlWaWRlb0VmZmVjdCgKLSAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQsIE00T1NBX1VJbnQzMiB0aW1lTXMsIE00T1NBX1ZvaWQqIG91dFB0cikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgdmVQb3N0UHJvY2Vzc1BhcmFtcyBwb3N0UHJvY2Vzc1BhcmFtczsKLQotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnZpZEJ1ZmZlciA9IChNNFZJRklfVUludDgqKWRhdGFQdHI7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMudmlkZW9IZWlnaHQgPSB2aWRlb0hlaWdodDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy50aW1lTXMgPSB0aW1lTXM7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMudGltZU9mZnNldCA9IDA7IC8vU2luY2UgdGltZU1TIGFscmVhZHkgdGFrZXMgY2FyZSBvZiBvZmZzZXQgaW4gdGhpcyBjYXNlCi0gICAgcG9zdFByb2Nlc3NQYXJhbXMuZWZmZWN0c1NldHRpbmdzID0gbUVmZmVjdHNTZXR0aW5nczsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5udW1iZXJFZmZlY3RzID0gbU51bWJlckVmZmVjdHM7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMub3V0VmlkZW9XaWR0aCA9IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm91dFZpZGVvSGVpZ2h0ID0gbU91dHB1dFZpZGVvSGVpZ2h0OwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLmN1cnJlbnRWaWRlb0VmZmVjdCA9IG1DdXJyZW50VmlkZW9FZmZlY3Q7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMucmVuZGVyaW5nTW9kZSA9IG1SZW5kZXJpbmdNb2RlOwotICAgIGlmKG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgcG9zdFByb2Nlc3NQYXJhbXMuaXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgIHBvc3RQcm9jZXNzUGFyYW1zLmlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLy9wb3N0UHJvY2Vzc1BhcmFtcy5yZW5kZXJlciA9IG1UYXJnZXQ7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMub3ZlcmxheUZyYW1lUkdCQnVmZmVyID0gTlVMTDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdmVybGF5RnJhbWVZVVZCdWZmZXIgPSBOVUxMOwotCi0gICAgbVRhcmdldC0+Z2V0QnVmZmVyWVYxMigmKHBvc3RQcm9jZXNzUGFyYW1zLnBPdXRCdWZmZXIpLCAmKHBvc3RQcm9jZXNzUGFyYW1zLm91dEJ1ZmZlclN0cmlkZSkpOwotCi0gICAgZXJyID0gYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZSgmcG9zdFByb2Nlc3NQYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRQcmV2aWV3RnJhbWVSZW5kZXJpbmdNb2RlKAotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLCBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpIHsKLQotICAgIEFMT0dWKCJzZXRNZWRpYVJlbmRlcmluZ01vZGU6IG91dHB1dFZpZGVvU2l6ZSA9ICVkIiwgb3V0cHV0VmlkZW9TaXplKTsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IG1vZGU7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAvKiBnZXQgdGhlIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQgYnkgcmVzb2x1dGlvbiAqLwotICAgIGVyciA9IGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbihvdXRwdXRWaWRlb1NpemUsCi0gICAgICAgICAgICAgICZtT3V0cHV0VmlkZW9XaWR0aCwgJm1PdXRwdXRWaWRlb0hlaWdodCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6ZG9JbWFnZVJlbmRlcmluZ01vZGUoCi0gICAgTTRPU0FfVm9pZCAqIGRhdGFQdHIsIE00T1NBX1VJbnQzMiBjb2xvckZvcm1hdCwgTTRPU0FfVUludDMyIHZpZGVvV2lkdGgsCi0gICAgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0LCBNNE9TQV9Wb2lkKiBvdXRQdHIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBsYW5lSW5bM10sIHBsYW5lT3V0WzNdOwotICAgIE00VklGSV9VSW50OCAqaW5CdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRCdWZmZXJXaWR0aCA9MCwgb3V0cHV0QnVmZmVySGVpZ2h0PTA7Ci0KLSAgICAvL2ZyYW1lU2l6ZSA9ICh2aWRlb1dpZHRoKnZpZGVvSGVpZ2h0KjMpID4+IDE7Ci0gICAgaW5CdWZmZXIgPSAoTTRPU0FfVUludDggKilkYXRhUHRyOwotCi0gICAgLy8gSW4gcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZUluLCB2aWRlb1dpZHRoLAotICAgICAgdmlkZW9IZWlnaHQsIChNNFZJRklfVUludDggKilpbkJ1ZmZlciwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOwotCi0gICAgb3V0cHV0QnVmZmVyV2lkdGggPSBtT3V0cHV0VmlkZW9XaWR0aDsKLSAgICBvdXRwdXRCdWZmZXJIZWlnaHQgPSBtT3V0cHV0VmlkZW9IZWlnaHQ7Ci0KLSAgICAvLyBPdXQgcGxhbmUKLSAgICB1aW50OF90KiBvdXRCdWZmZXI7Ci0gICAgc2l6ZV90IG91dEJ1ZmZlclN0cmlkZSA9IDA7Ci0KLSAgICBBTE9HVigiZG9NZWRpYVJlbmRlcmluZyBDQUxMIGdldEJ1ZmZlcigpIik7Ci0gICAgbVRhcmdldC0+Z2V0QnVmZmVyWVYxMigmb3V0QnVmZmVyLCAmb3V0QnVmZmVyU3RyaWRlKTsKLQotICAgIC8vIFNldCB0aGUgb3V0cHV0IFlVVjQyMCBwbGFuZSB0byBiZSBjb21wYXRpYmxlIHdpdGggWVYxMiBmb3JtYXQKLSAgICAvL0luIFlWMTIgZm9ybWF0LCBzaXplcyBtdXN0IGJlIGV2ZW4KLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lV2lkdGggPSAoKG1PdXRwdXRWaWRlb1dpZHRoICsxKT4+MSk8PDE7Ci0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZUhlaWdodCA9ICgobU91dHB1dFZpZGVvSGVpZ2h0KzEpPj4xKTw8MTsKLQotICAgIHByZXBhcmVZVjEySW1hZ2VQbGFuZShwbGFuZU91dCwgeXYxMlBsYW5lV2lkdGgsIHl2MTJQbGFuZUhlaWdodCwKLSAgICAgKE00T1NBX1VJbnQzMilvdXRCdWZmZXJTdHJpZGUsIChNNFZJRklfVUludDggKilvdXRCdWZmZXIpOwotCi0gICAgZXJyID0gYXBwbHlSZW5kZXJpbmdNb2RlKHBsYW5lSW4sIHBsYW5lT3V0LCBtUmVuZGVyaW5nTW9kZSk7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImRvSW1hZ2VSZW5kZXJpbmdNb2RlOiBhcHBseVJlbmRlcmluZ01vZGUgcmV0dXJuZWQgZXJyPTB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLX0gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc1NmYzMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKLSNkZWZpbmUgQU5EUk9JRF9WRV9QUkVWSUVXQ09OVFJPTExFUl9ICi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclBsYXllci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBDYWxsYmFjayBtZWNoYW5pc20gZnJvbSBQcmV2aWV3Q29udHJvbGxlciB0byBKbmkgICovCi10eXBlZGVmIHZvaWQgKCpqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0KSh2b2lkKiBjb29raWUsIE00T1NBX1VJbnQzMiBtc2dUeXBlLCB2b2lkICphcmdjKTsKLQotc3RydWN0IFN1cmZhY2U7Ci1zdHJ1Y3QgUHJldmlld1JlbmRlcmVyOwotCi1jbGFzcyBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyIHsKLQotcHVibGljOgotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIoKTsKLSAgICB+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpOwotCi0gICAgTTRPU0FfRVJSIGxvYWRFZGl0U2V0dGluZ3MoCi0gICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogYmdtU2V0dGluZ3MpOwotCi0gICAgTTRPU0FfRVJSIHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwotCi0gICAgTTRPU0FfRVJSIHN0YXJ0UHJldmlldygKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmcm9tTVMsIE00T1NBX0ludDMyIHRvTXMsCi0gICAgICAgICAgICBNNE9TQV9VSW50MTYgY2FsbEJhY2tBZnRlckZyYW1lQ291bnQsCi0gICAgICAgICAgICBNNE9TQV9Cb29sIGxvb3ApIDsKLQotICAgIE00T1NBX1VJbnQzMiBzdG9wUHJldmlldygpOwotCi0gICAgTTRPU0FfRVJSIHJlbmRlclByZXZpZXdGcmFtZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVJbmZvLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyAqcEN1cnJFZGl0SW5mbyk7Ci0KLSAgICBNNE9TQV9FUlIgY2xlYXJTdXJmYWNlKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsCi0gICAgICAgICAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZUluZm8pOwotCi0gICAgTTRPU0FfVm9pZCBzZXRKbmlDYWxsYmFjaygKLSAgICAgICAgICAgIHZvaWQqIGNvb2tpZSwKLSAgICAgICAgICAgIGpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QgY2FsbGJhY2tGY3QpOwotCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld0ZyYW1lUmVuZGVyaW5nTW9kZSgKLSAgICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1RvdGFsTnVtUGxheWVySW5zdGFuY2VzID0gMiwKLSAgICAgICAga1ByZXZpZXdUaHJlYWRTdGFja1NpemUgPSA2NTUzNiwKLSAgICB9OwotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgVmVQbGF5ZXJJZGxlID0gMCwKLSAgICAgICAgVmVQbGF5ZXJCdXN5LAotICAgICAgICBWZVBsYXllckF1dG9TdG9wCi0gICAgfSBQbGF5ZXJTdGF0ZTsKLQotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIE9WRVJMQVlfVVBEQVRFID0gMCwKLSAgICAgICAgT1ZFUkxBWV9DTEVBUgotICAgIH0gT3ZlcmxheVN0YXRlOwotCi0gICAgc3A8VmlkZW9FZGl0b3JQbGF5ZXI+IG1WZVBsYXllcltrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXNdOwotICAgIGludCBtQ3VycmVudFBsYXllcjsgIC8vIHBsYXllciBpbnN0YW5jZSBjdXJyZW50bHkgYmVpbmcgdXNlZAotICAgIHNwPFN1cmZhY2U+ICBtU3VyZmFjZTsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIE00T1NBX0NvbnRleHQgbVRocmVhZENvbnRleHQ7Ci0gICAgUGxheWVyU3RhdGUgbVBsYXllclN0YXRlOwotICAgIE00T1NBX0Jvb2wgICAgbVByZXBhcmVSZXFlc3Q7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKm1DbGlwTGlzdDsKLSAgICBNNE9TQV9VSW50MzIgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkOwotICAgIE00T1NBX1VJbnQzMiBtTnVtYmVyQ2xpcHNUb1ByZXZpZXc7Ci0gICAgTTRPU0FfVUludDMyIG1TdGFydGluZ0NsaXBJbmRleDsKLSAgICBNNE9TQV9Cb29sIG1QcmV2aWV3TG9vcGluZzsKLSAgICBNNE9TQV9VSW50MzIgbUNhbGxCYWNrQWZ0ZXJGcmFtZUNudDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIG1FZmZlY3RzU2V0dGluZ3M7Ci0gICAgTTRPU0FfVUludDMyIG1OdW1iZXJFZmZlY3RzOwotICAgIE00T1NBX0ludDMyIG1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICBNNE9TQV9VSW50MzIgbUNsaXBUb3RhbER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudFZpZGVvRWZmZWN0OwotICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZzsKLSAgICBNNE9TQV9Db250ZXh0IG1BdWRpb01peFBDTUZpbGVIYW5kbGU7Ci0gICAgUHJldmlld1JlbmRlcmVyICptVGFyZ2V0OwotICAgIE00T1NBX0NvbnRleHQgbUpuaUNvb2tpZTsKLSAgICBqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0IG1KbmlDYWxsYmFjazsKLSAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIgbUZyYW1lU3RyOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudFBsYXllZER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudENsaXBEdXJhdGlvbjsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBtT3V0cHV0VmlkZW9TaXplOwotICAgIE00T1NBX1VJbnQzMiBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLSAgICBNNE9TQV9VSW50MzIgbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWU7Ci0gICAgTTRPU0FfVUludDMyIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcDsKLSAgICBPdmVybGF5U3RhdGUgbU92ZXJsYXlTdGF0ZTsKLSAgICBpbnQgbUFjdGl2ZVBsYXllckluZGV4OwotCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb0hlaWdodDsKLSAgICBib29sIGJTdG9wVGhyZWFkSW5Qcm9ncmVzczsKLSAgICBNNE9TQV9Db250ZXh0IG1TZW1UaHJlYWRXYWl0OwotICAgIGJvb2wgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7Ci0KLSAgICBzcDxWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dD4gbVZFQXVkaW9TaW5rOwotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKm1WRUF1ZGlvUGxheWVyOwotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiBtTmF0aXZlV2luZG93UmVuZGVyZXI7Ci0KLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVSR0JCdWZmZXI7Ci0gICAgTTRWSUZJX1VJbnQ4KiAgbUZyYW1lWVVWQnVmZmVyOwotICAgIG11dGFibGUgTXV0ZXggbUxvY2tTZW07Ci0KLQotICAgIHN0YXRpYyBNNE9TQV9FUlIgcHJlcGFyZVBsYXllcih2b2lkKiBwYXJhbSwgaW50IHBsYXllckluc3RhbmNlLCBpbnQgaW5kZXgpOwotICAgIHN0YXRpYyBNNE9TQV9FUlIgdGhyZWFkUHJvYyhNNE9TQV9Wb2lkKiBwYXJhbSk7Ci0gICAgc3RhdGljIHZvaWQgbm90aWZ5KHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKTsKLQotICAgIHZvaWQgc2V0VmlkZW9FZmZlY3RUeXBlKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdHlwZSwgTTRPU0FfQm9vbCBlbmFibGUpOwotCi0gICAgTTRPU0FfRVJSIGFwcGx5VmlkZW9FZmZlY3QoCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgTTRPU0FfVUludDMyIHZpZGVvV2lkdGgsIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lTXMsIE00T1NBX1ZvaWQqIG91dFB0cik7Ci0KLSAgICBNNE9TQV9FUlIgZG9JbWFnZVJlbmRlcmluZ01vZGUoCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBjb2xvckZvcm1hdCwgTTRPU0FfVUludDMyIHZpZGVvV2lkdGgsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQsIE00T1NBX1ZvaWQqIG91dFB0cik7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lIQotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIoY29uc3QgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAmKTsKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICZvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICYpOwotfTsKLQotfQotCi0jZW5kaWYgLy8gQU5EUk9JRF9WRV9QUkVWSUVXQ09OVFJPTExFUl9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNmQwODEyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRWRpdG9yU1JDIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yU1JDLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvclNSQzo6VmlkZW9FZGl0b3JTUkMoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JTUkMgJXAoJXApIiwgdGhpcywgc291cmNlLmdldCgpKTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVmYXVsdFNhbXBsaW5nRnJlcWVuY3lIeiA9IGtGcmVxMzIwMDBIejsKLSAgICBtU291cmNlID0gc291cmNlOwotICAgIG1SZXNhbXBsZXIgPSBOVUxMOwotICAgIG1DaGFubmVsQ250ID0gMDsKLSAgICBtU2FtcGxlUmF0ZSA9IDA7Ci0gICAgbU91dHB1dFNhbXBsZVJhdGUgPSBrRGVmYXVsdFNhbXBsaW5nRnJlcWVuY3lIejsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICBtQWNjdU91dEJ1ZmZlclNpemUgID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIG1MZWZ0b3ZlciA9IDA7Ci0gICAgbUZvcm1hdENoYW5nZWQgPSBmYWxzZTsKLSAgICBtU3RvcFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtU2Vla01vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOwotCi0gICAgLy8gSW5wdXQgU291cmNlIHZhbGlkYXRpb24KLSAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKLQotICAgIC8vIFNldCB0aGUgbWV0YWRhdGEgb2YgdGhlIG91dHB1dCBhZnRlciByZXNhbXBsaW5nLgotICAgIG1PdXRwdXRGb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgbU91dHB1dEZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6KTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAyKTsgIC8vIGFsd2F5cyBzdGVyZW8KLX0KLQotVmlkZW9FZGl0b3JTUkM6On5WaWRlb0VkaXRvclNSQygpIHsKLSAgICBBTE9HVigiflZpZGVvRWRpdG9yU1JDICVwKCVwKSIsIHRoaXMsIG1Tb3VyY2UuZ2V0KCkpOwotICAgIHN0b3AoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLQotICAgIC8vIFNldCByZXNhbXBsZXIgaWYgcmVxdWlyZWQKLSAgICBjaGVja0FuZFNldFJlc2FtcGxlcigpOwotCi0gICAgbVNlZWtUaW1lVXMgPSAtMTsKLSAgICBtU2Vla01vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICBtU291cmNlLT5zdGFydCgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlcikgewotICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIH0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgaWYgKG1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICAgICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtSW5pdGlhbFRpbWVTdGFtcFVzID0gLTE7Ci0gICAgbUFjY3VPdXRCdWZmZXJTaXplID0gMDsKLSAgICBtTGVmdG92ZXIgPSAwOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JTUkM6OmdldEZvcm1hdCgpIHsKLSAgICBBTE9HVigiZ2V0Rm9ybWF0Iik7Ci0gICAgcmV0dXJuIG1PdXRwdXRGb3JtYXQ7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yU1JDOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlcl9vdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgQUxPR1YoInJlYWQgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBpZiAobVJlc2FtcGxlcikgewotICAgICAgICAvLyBTdG9yZSB0aGUgc2VlayBwYXJhbWV0ZXJzCi0gICAgICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOwotICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotICAgICAgICAgICAgQUxPR1YoInJlYWQgU2VlayAlbGxkIiwgc2Vla1RpbWVVcyk7Ci0gICAgICAgICAgICBtU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgICAgICAgICBtU2Vla01vZGUgPSBtb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgYXNrIGZvciAxMDI0IGZyYW1lcyBpbiBvdXRwdXQKLSAgICAgICAgLy8gcmVzYW1wbGVyIG91dHB1dCBpcyBhbHdheXMgMiBjaGFubmVscyBhbmQgMzIgYml0cwotICAgICAgICBjb25zdCBzaXplX3Qga091dHB1dEZyYW1lQ291bnQgPSAxMDI0OwotICAgICAgICBjb25zdCBzaXplX3Qga0J5dGVzID0ga091dHB1dEZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDMyX3QpOwotICAgICAgICBpbnQzMl90ICpwVG1wQnVmZmVyID0gKGludDMyX3QgKiljYWxsb2MoMSwga0J5dGVzKTsKLSAgICAgICAgaWYgKCFwVG1wQnVmZmVyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY2FsbG9jIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnk6ICVkIGJ5dGVzIiwga0J5dGVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXNhbXBsZSB0byB0YXJnZXQgcXVhbGl0eQotICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZShwVG1wQnVmZmVyLCBrT3V0cHV0RnJhbWVDb3VudCwgdGhpcyk7Ci0KLSAgICAgICAgaWYgKG1TdG9wUGVuZGluZykgewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgbVN0b3BQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGFuZ2UgcmVzYW1wbGVyIGFuZCByZXRyeSBpZiBmb3JtYXQgY2hhbmdlIGhhcHBlbmVkCi0gICAgICAgIGlmIChtRm9ybWF0Q2hhbmdlZCkgewotICAgICAgICAgICAgbUZvcm1hdENoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0gICAgICAgICAgICBmcmVlKHBUbXBCdWZmZXIpOwotICAgICAgICAgICAgcmV0dXJuIHJlYWQoYnVmZmVyX291dCwgTlVMTCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFCdWZmZXIKLSAgICAgICAgaW50MzJfdCBvdXRCdWZmZXJTaXplID0ga091dHB1dEZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpOwotICAgICAgICBNZWRpYUJ1ZmZlciogb3V0QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG91dEJ1ZmZlclNpemUpOwotCi0gICAgICAgIC8vIENvbnZlcnQgYmFjayB0byAyIGNoYW5uZWxzIGFuZCAxNiBiaXRzCi0gICAgICAgIGRpdGhlckFuZENsYW1wKAotICAgICAgICAgICAgICAgIChpbnQzMl90ICopKCh1aW50OF90KilvdXRCdWZmZXItPmRhdGEoKSArIG91dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgICAgIHBUbXBCdWZmZXIsIGtPdXRwdXRGcmFtZUNvdW50KTsKLSAgICAgICAgZnJlZShwVG1wQnVmZmVyKTsKLQotICAgICAgICAvLyBDb21wdXRlIGFuZCBzZXQgdGhlIG5ldyB0aW1lc3RhbXAKLSAgICAgICAgc3A8TWV0YURhdGE+IHRvID0gb3V0QnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICAgICAgaW50NjRfdCB0b3RhbE91dER1cmF0aW9uVXMgPSAobUFjY3VPdXRCdWZmZXJTaXplICogMTAwMDAwMCkgLyAobU91dHB1dFNhbXBsZVJhdGUgKiAyICogMik7Ci0gICAgICAgIGludDY0X3QgdGltZVVzID0gbUluaXRpYWxUaW1lU3RhbXBVcyArIHRvdGFsT3V0RHVyYXRpb25VczsKLSAgICAgICAgdG8tPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgYWNjdW11bGF0ZSBzaXplCi0gICAgICAgIG1BY2N1T3V0QnVmZmVyU2l6ZSArPSBvdXRCdWZmZXJTaXplOwotICAgICAgICAqYnVmZmVyX291dCA9IG91dEJ1ZmZlcjsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBSZXNhbXBsaW5nIG5vdCByZXF1aXJlZC4gUmVhZCBhbmQgcGFzcy10aHJvdWdoLgotICAgICAgICBNZWRpYUJ1ZmZlciAqYUJ1ZmZlcjsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYUJ1ZmZlciwgb3B0aW9ucyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJyZWFkIHJldHVybnMgZXJyID0gJWQiLCBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICBjaGVja0FuZFNldFJlc2FtcGxlcigpOwotICAgICAgICAgICAgcmV0dXJuIHJlYWQoYnVmZmVyX291dCwgTlVMTCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFT1Mgb3Igc29tZSBvdGhlciBlcnJvcgotICAgICAgICBpZihlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgICpidWZmZXJfb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgKmJ1ZmZlcl9vdXQgPSBhQnVmZmVyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLCBpbnQ2NF90IHB0cykgewotICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyICVkLCBjaGFuID0gJWQiLCBwQnVmZmVyLT5mcmFtZUNvdW50LCBtQ2hhbm5lbENudCk7Ci0gICAgdWludDMyX3QgZG9uZSA9IDA7Ci0gICAgdWludDMyX3Qgd2FudCA9IHBCdWZmZXItPmZyYW1lQ291bnQgKiBtQ2hhbm5lbENudCAqIDI7Ci0gICAgcEJ1ZmZlci0+cmF3ID0gbWFsbG9jKHdhbnQpOwotCi0gICAgd2hpbGUgKG1TdGFydGVkICYmIHdhbnQgPiAwKSB7Ci0gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IGRhdGEgbGVmdCwgcmVhZCBhIG5ldyBidWZmZXIuCi0gICAgICAgIGlmICghbUJ1ZmZlcikgewotICAgICAgICAgICAgLy8gaWYgd2Ugc2VlaywgcmVzZXQgdGhlIGluaXRpYWwgdGltZSBzdGFtcCBhbmQgYWNjdW11bGF0ZWQgdGltZQotICAgICAgICAgICAgUmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgICAgIGlmIChtU2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVwIGNhY2hlTW9yZV9sIFNlZWsgcmVxdWVzdGVkID0gJWxsZCIsIHRoaXMsIG1TZWVrVGltZVVzKTsKLSAgICAgICAgICAgICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9IG1TZWVrTW9kZTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcywgbW9kZSk7Ci0gICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAtMTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbFRpbWVTdGFtcFVzID0gLTE7Ci0gICAgICAgICAgICAgICAgbUFjY3VPdXRCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUJ1ZmZlciwgJm9wdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgICAgICAgICAgICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyOiBzb3VyY2UgcmVhZCByZXR1cm5lZCBJTkZPX0ZPUk1BVF9DSEFOR0VEIik7Ci0gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBjYW5ub3Qgc3dpdGNoIHRvIGEgbmV3IEF1ZGlvUmVzYW1wbGVyIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgaW4gYSBjYWxsYmFjayBjYWxsZWQgYnkgdGhlIEF1ZGlvUmVzYW1wbGVyIGl0c2VsZi4gU28KLSAgICAgICAgICAgICAgICAvLyBqdXN0IHJlbWVtYmVyIHRoZSBmYWN0IHRoYXQgdGhlIGZvcm1hdCBoYXMgY2hhbmdlZCwgYW5kIGxldAotICAgICAgICAgICAgICAgIC8vIHJlYWQoKSBoYW5kbGVzIHRoaXMuCi0gICAgICAgICAgICAgICAgbUZvcm1hdENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVPUyBvciBzb21lIG90aGVyIGVycm9yCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkVPUyBvciBzb21lIGVycjogJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIHN0b3AoKSBoZXJlIGJlY2F1c2Ugc3RvcCgpIHdpbGwgcmVsZWFzZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBBdWRpb1Jlc2FtcGxlciwgYW5kIHdlIGFyZSBpbiBhIGNhbGxiYWNrIG9mIHRoZSBBdWRpb1Jlc2FtcGxlci4KLSAgICAgICAgICAgICAgICAvLyBTbyBqdXN0IHJlbWVtYmVyIHRoZSBmYWN0IGFuZCBsZXQgcmVhZCgpIGNhbGwgc3RvcCgpLgotICAgICAgICAgICAgICAgIG1TdG9wUGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlcik7Ci0gICAgICAgICAgICBtTGVmdG92ZXIgPSBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChtSW5pdGlhbFRpbWVTdGFtcFVzID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBjdXJUUzsKLSAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZnJvbSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOwotICAgICAgICAgICAgICAgIGZyb20tPmZpbmRJbnQ2NChrS2V5VGltZSwgJmN1clRTKTsKLSAgICAgICAgICAgICAgICBBTE9HVigic2V0dGluZyBtSW5pdGlhbFRpbWVTdGFtcFVzIHRvICVsbGQiLCBtSW5pdGlhbFRpbWVTdGFtcFVzKTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbFRpbWVTdGFtcFVzID0gY3VyVFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgY29weSBkYXRhIHRvIHRoZSBkZXN0aW5hdGlvbgotICAgICAgICB1aW50MzJfdCB0b2RvID0gbUxlZnRvdmVyOwotICAgICAgICBpZiAodG9kbyA+IHdhbnQpIHsKLSAgICAgICAgICAgIHRvZG8gPSB3YW50OwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDhfdCogZW5kID0gKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpCi0gICAgICAgICAgICAgICAgKyBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgbWVtY3B5KCh1aW50OF90KilwQnVmZmVyLT5yYXcgKyBkb25lLCBlbmQgLSBtTGVmdG92ZXIsIHRvZG8pOwotICAgICAgICBkb25lICs9IHRvZG87Ci0gICAgICAgIHdhbnQgLT0gdG9kbzsKLSAgICAgICAgbUxlZnRvdmVyIC09IHRvZG87Ci0KLSAgICAgICAgLy8gUmVsZWFzZSBNZWRpYUJ1ZmZlciBhcyBzb29uIGFzIHBvc3NpYmxlLgotICAgICAgICBpZiAobUxlZnRvdmVyID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGRvbmUgLyAobUNoYW5uZWxDbnQgKiAyKTsKLSAgICBBTE9HVigiZ2V0TmV4dEJ1ZmZlciBkb25lICVkIiwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JTUkM6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKSB7Ci0gICAgQUxPR1YoInJlbGVhc2VCdWZmZXI6ICVwIiwgcEJ1ZmZlcnMpOwotICAgIGZyZWUocEJ1ZmZlci0+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/IE00T1NBX1RSVUU6TTRPU0FfRkFMU0UpCi0KLQotI2VuZGlmICAgLypNNE9TQV9PUFRJT05JRF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU2VtYXBob3JlLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjYzMDQ1NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1NlbWFwaG9yZS5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgc2VtYXBob3JlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9TRU1BUEhPUkVfSAotI2RlZmluZSBNNE9TQV9TRU1BUEhPUkVfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZU9wZW4oICBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgICBpbml0aWFsTnVtYmVyICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVQb3N0KCAgTTRPU0FfQ29udGV4dCAgY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlV2FpdCggIE00T1NBX0NvbnRleHQgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICAgIHRpbWVvdXQgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZUNsb3NlKCBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qTTRPU0FfU0VNQVBIT1JFX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTk2YWZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1RocmVhZC5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgdGhyZWFkIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX1RIUkVBRF9ICi0jZGVmaW5lIE00T1NBX1RIUkVBRF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLQotCi0vKiBEZWZpbml0aW9uIG9mIGNvbW1vbiBlcnJvciBjb2RlcyAqLwotI2RlZmluZSBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRPU0FfVEhSRUFELDB4MDAwMDAxKQotCi0KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa1RocmVhZE9wZW5lZCAgID0gMHgxMDAsCi0gICBNNE9TQV9rVGhyZWFkU3RhcnRpbmcgPSAweDIwMCwKLSAgIE00T1NBX2tUaHJlYWRSdW5uaW5nICA9IDB4MzAwLAotICAgTTRPU0Ffa1RocmVhZFN0b3BwaW5nID0gMHg0MDAsCi0gICBNNE9TQV9rVGhyZWFkQ2xvc2VkICA9IDB4NTAwCi19IE00T1NBX1RocmVhZFN0YXRlOwotCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9rVGhyZWFkSGlnaGVzdFByaW9yaXR5ICA9ICAweDAwMCwKLSAgIE00T1NBX2tUaHJlYWRIaWdoUHJpb3JpdHkgICAgID0gIDB4MTAwLAotICAgTTRPU0Ffa1RocmVhZE5vcm1hbFByaW9yaXR5ICAgPSAgMHgyMDAsCi0gICBNNE9TQV9rVGhyZWFkTG93UHJpb3JpdHkgICAgICA9ICAweDMwMCwKLSAgIE00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSAgID0gIDB4NDAwCi19IE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWw7Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX1RocmVhZFN0YXJ0ZWQKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDEpLAotCi0gICBNNE9TQV9UaHJlYWRTdG9wcGVkCi0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDAyKSwKLQotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHkKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDMpLAotCi0gICBNNE9TQV9UaHJlYWROYW1lCi0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDA0KSwKLQotICAgTTRPU0FfVGhyZWFkU3RhY2tTaXplCi0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDA1KSwKLQotICAgTTRPU0FfVGhyZWFkVXNlckRhdGEKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDYpCi0KLX0gTTRPU0FfVGhyZWFkT3B0aW9uSUQ7Ci0KLQotCi10eXBlZGVmIE00T1NBX0VSUiAgKCpNNE9TQV9UaHJlYWREb0l0KShNNE9TQV9Wb2lkKik7Ci10eXBlZGVmIE00T1NBX1ZvaWQgKCpNNE9TQV9UaHJlYWRDYWxsQmFjaykoTTRPU0FfQ29udGV4dCwgTTRPU0FfVm9pZCopOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNPcGVuKCAgICAgTTRPU0FfQ29udGV4dCogICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWREb0l0ICAgICAgZnVuYyApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0YXJ0KCAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqICAgICAgICAgICBwYXJhbSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0b3AoICAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0Nsb3NlKCAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlKCBNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZFN0YXRlKiAgICBzdGF0ZSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU2xlZXAoICAgICAgICBNNE9TQV9VSW50MzIgICAgICAgICAgdGltZSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbihNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICAgICAgdmFsdWUgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24oTTRPU0FfQ29udGV4dCAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogICAgIHZhbHVlICk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qTTRPU0FfVEhSRUFEX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQyNGIwNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGhyZWFkX3ByaXYuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIFRocmVhZCBwcml2YXRlIGZvciBBbmRyb2lkCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9USFJFQURfUFJJVl9ICi0jZGVmaW5lIE00T1NBX1RIUkVBRF9QUklWX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotCi0vKiBDb250ZXh0IGZvciB0aGUgdGhyZWFkICovCi10eXBlZGVmIHN0cnVjdCBNNE9TQV9UaHJlYWRDb250ZXh0IHsKLSAgIE00T1NBX1VJbnQzMiBjb3JlSUQ7ICAgICAgICAgICAgICAgIC8qIHRocmVhZCBjb250ZXh0IGlkZW50aWZpYW50ICovCi0gICBwdGhyZWFkX3QgdGhyZWFkSUQ7ICAgICAgICAgICAgICAgICAvKiB0aHJlYWQgaWRlbnRpZmllci4gKi8KLSAgIE00T1NBX0NoYXIqIG5hbWU7ICAgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBuYW1lICovCi0gICBNNE9TQV9VSW50MzIgc3RhY2tTaXplOyAgICAgICAgICAgICAvKiB0aHJlYWQgc3RhY2tTaXplIGluIGJ5dGVzICovCi0gICBNNE9TQV9UaHJlYWREb0l0IGZ1bmM7ICAgICAgICAgICAgICAvKiB0aHJlYWQgZnVuY3Rpb24gKi8KLSAgIE00T1NBX1ZvaWQqIHBhcmFtOyAgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBwYXJhbWV0ZXIgKi8KLS8qCi0gICBNNE9TQV9Wb2lkKiB1c2VyRGF0YTsgICAgICAgICAgICAgICAvICogdGhyZWFkIHVzZXIgZGF0YSAqIC8KLSovCi0gICBNNE9TQV9UaHJlYWRTdGF0ZSBzdGF0ZTsgICAgICAgICAgICAvKiB0aHJlYWQgYXV0b21hdG9uIHN0YXRlICovCi0gICBNNE9TQV9Db250ZXh0IHN0YXRlTXV0ZXg7ICAgICAgICAgICAvKiBtdXRleCBmb3IgdGhyZWFkIHN0YXRlIG1hbmFnZW1lbnQgKi8KLS8qCi0gICBNNE9TQV9UaHJlYWRDYWxsQmFjayBzdGFydENhbGxCYWNrOyAvICogc3RhcnRpbmcgdGhyZWFkIGNhbGwgYmFjayAqIC8KLSAgIE00T1NBX1RocmVhZENhbGxCYWNrIHN0b3BDYWxsQmFjazsgIC8gKiBzdG9wcGluZyB0aHJlYWQgY2FsbCBiYWNrICogLwotKi8KLSAgIE00T1NBX0NvbnRleHQgc2VtU3RhcnRTdG9wOyAgICAgICAgIC8qIHNlbWFwaG9yZSBmb3Igc3RhcnQgYW5kIHN0b3AgZG9faXQgKi8KLSAgIE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwgcHJpb3JpdHk7IC8qIHRocmVhZCBwcmlvcml0eSBsZXZlbCAqLwotfSBNNE9TQV9UaHJlYWRDb250ZXh0IDsKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFSVEVEICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9TVE9QUEVEICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEgICAgICAgICBNNE9TQV9UUlVFCi0KLSNlbmRpZiAvKk00T1NBX1RIUkVBRF9QUklWX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxZjI1ZWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGltZS5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgVGltZSBtYWNyb3MKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGltZSB0eXBlIGFuZCBhc3NvY2lhdGVkIG1hY3JvcyB3aGljaCBtdXN0Ci0gKiAgICAgICAgICAgICAgIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aW1lLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogJElkOiBNNE9TQV9UaW1lLmgsdiAxLjIgMjAwNy8wMS8wNSAxMzoxMjoyMiB0aGVuYXVsdCBFeHAgJCAqLwotCi0jaWZuZGVmIE00T1NBX1RJTUVfSAotI2RlZmluZSBNNE9TQV9USU1FX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotCi10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgIE00T1NBX1RpbWU7Ci0KLQotLyoqIFRoaXMgbWFjcm8gc2V0cyB0aGUgdW5rbm93biB0aW1lIHZhbHVlICovCi0KLSNkZWZpbmUgTTRPU0FfVElNRV9VTktOT1dOIDB4ODAwMDAwMDAKLQotLyoqIFRoaXMgbWFjcm8gY29udmVydHMgYSB0aW1lIHdpdGggYSB0aW1lIHNjYWxlIHRvIG1pbGxpc2Vjb25kLgotICAgIFRoZSByZXN1bHQgaXMgYSBNNE9TQV9Eb3VibGUqLwotI2RlZmluZSBNNE9TQV9USU1FX1RPX01TKHJlc3VsdCwgdGltZSwgdGltZXNjYWxlKVwKLSAgICAgIHsgcmVzdWx0ID0gKDEwMDAqKE00T1NBX0RvdWJsZSl0aW1lKS8oKE00T1NBX0RvdWJsZSl0aW1lc2NhbGUpOyB9Ci0KLSNlbmRpZiAvKk00T1NBX1RJTUVfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmE2OGQ4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVHlwZXMuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEFic3RyYWN0aW9uIHR5cGVzIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSByZWRlZmluZXMgYmFzaWMgdHlwZXMgd2hpY2ggbXVzdCBiZQotICogICAgICAgICAgICAgICB1c2VkIHRvIGRlY2xhcmUgYW55IHZhcmlhYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfVFlQRVNfSAotI2RlZmluZSBNNE9TQV9UWVBFU19ICi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiTTRPU0FfRXhwb3J0LmgiCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotdHlwZWRlZiBzaWduZWQgY2hhciAgICAgTTRPU0FfQm9vbDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIE00T1NBX1VJbnQ4OwotdHlwZWRlZiBzaWduZWQgY2hhciAgICAgTTRPU0FfSW50ODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIE00T1NBX1VJbnQxNjsKLXR5cGVkZWYgc2lnbmVkIHNob3J0ICAgIE00T1NBX0ludDE2OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgTTRPU0FfVUludDMyOwotdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgTTRPU0FfSW50MzI7Ci0KLXR5cGVkZWYgc2lnbmVkIGNoYXIgICAgIE00T1NBX0NoYXI7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBNNE9TQV9VQ2hhcjsKLQotdHlwZWRlZiBkb3VibGUgICAgICAgICAgTTRPU0FfRG91YmxlOwotdHlwZWRlZiBmbG9hdCAgICAgICAgICAgTTRPU0FfRmxvYXQ7Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIE00T1NBX1dDaGFyOwotCi10eXBlZGVmIHZvaWQgICAgICAgICAgICBNNE9TQV9Wb2lkOwotCi0vKiBNaW4gJiBtYXggZGVmaW5pdGlvbnMqLwotI2RlZmluZSBNNE9TQV9VSU5UOF9NSU4gICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00T1NBX1VJTlQ4X01BWCAgICAgICAgICAgICAgICAyNTUKLQotI2RlZmluZSBNNE9TQV9VSU5UMTZfTUlOICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00T1NBX1VJTlQxNl9NQVggICAgICAgICAgICAgNjU1MzUKLQotI2RlZmluZSBNNE9TQV9VSU5UMzJfTUlOICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00T1NBX1VJTlQzMl9NQVggICAgICAgIDB4RkZGRkZGRkYKLQotI2RlZmluZSBNNE9TQV9JTlQ4X01JTiAgICAgICAgICAgICAgICAtMTI4Ci0jZGVmaW5lIE00T1NBX0lOVDhfTUFYICAgICAgICAgICAgICAgICAxMjcKLQotI2RlZmluZSBNNE9TQV9JTlQxNl9NSU4gICAgICAgICAgICAgLTMyNzY4Ci0jZGVmaW5lIE00T1NBX0lOVDE2X01BWCAgICAgICAgICAgICAgMzI3NjcKLQotI2RlZmluZSBNNE9TQV9JTlQzMl9NSU4gICAgICAgKC0weDdGRkZGRkZGLTEpCi0jZGVmaW5lIE00T1NBX0lOVDMyX01BWCAgICAgICAgIDB4N0ZGRkZGRkYKLQotI2RlZmluZSBNNE9TQV9DSEFSX01JTiAgICAgICAgICAgICAgICAtMTI4Ci0jZGVmaW5lIE00T1NBX0NIQVJfTUFYICAgICAgICAgICAgICAgICAxMjcKLQotI2RlZmluZSBNNE9TQV9VQ0hBUl9NSU4gICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00T1NBX1VDSEFSX01BWCAgICAgICAgICAgICAgICAyNTUKLQotI2RlZmluZSBNNE9TQV9OVUxMICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBNNE9TQV9UUlVFICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBNNE9TQV9GQUxTRSAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBNNE9TQV9XQUlUX0ZPUkVWRVIgICAgICAgMHhmZmZmZmZmZgotCi0jZGVmaW5lIE00T1NBX0NPTlNUICAgICAgICAgICAgICAgICAgIGNvbnN0Ci0jZGVmaW5lIE00T1NBX0lOTElORSAgICAgICAgICAgICAgICAgaW5saW5lCi0KLS8qIFJvbGxvdmVyIG9mZnNldCBvZiB0aGUgY2xvY2sgKi8KLS8qIFRoaXMgdmFsdWUgbXVzdCBiZSB0aGUgb25lIG9mIE00T1NBX2Nsb2NrR2V0VGltZSAqLwotI2RlZmluZSBNNE9TQV9DTE9DS19ST0xMT1ZFUiAgICAgICAgICAgTTRPU0FfSU5UMzJfTUFYCi0KLXR5cGVkZWYgdm9pZCogICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dDsKLQotLyoqIEl0IGlzIGEgdW5pcXVlIElEIGZvciBlYWNoIGNvcmUgY29tcG9uZW50Ki8KLXR5cGVkZWYgIE00T1NBX1VJbnQxNiBNNE9TQV9Db3JlSUQ7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKk00T1NBX1RZUEVTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYzOGIwYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9lZGl0b3Jfb3NhbAotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3Jfb3NhbAotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgTTRPU0FfQ2hhclN0YXIuYyBcCi0gICAgTTRPU0FfQ2xvY2suYyBcCi0gICAgTTRPU0FfRmlsZUNvbW1vbi5jIFwKLSAgICBNNE9TQV9GaWxlUmVhZGVyLmMgXAotICAgIE00T1NBX0ZpbGVXcml0ZXIuYyBcCi0gICAgTTRPU0FfTXV0ZXguYyBcCi0gICAgTTRPU0FfUmFuZG9tLmMgXAotICAgIE00T1NBX1NlbWFwaG9yZS5jIFwKLSAgICBNNE9TQV9UaHJlYWQuYyBcCi0gICAgTTRQU1dfRGVidWdUcmFjZS5jIFwKLSAgICBNNFBTV19NZW1vcnlJbnRlcmZhY2UuYyBcCi0gICAgTTRQU1dfVHJhY2UuYyBcCi0gICAgTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYmxvZwotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgIC1EX19BTkRST0lEX18gXAotICAgIC1ETTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQ09ERUNTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfUkVBREVSUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfM0dQUF9SRUFERVIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTFlMDA4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX29wdGltLmMKLSAqIEBicmllZgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBmaWxlc3lzdGVtIGFjY2VzcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqIEFkZGl0aW9uIG9mIFRyYWNlIElEICoqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLSNpZmRlZiBNNFRSQUNFX0lECi0jdW5kZWYgTTRUUkFDRV9JRAotI2VuZGlmCi0jZGVmaW5lIE00VFJBQ0VfSUQgICAgTTRPU0FfRklMRV9SRUFERVIKLQotCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2luY2x1ZGUgIkxWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCIKLQotI2RlZmluZSBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSNpZm5kZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgI2luY2x1ZGUgIk00T1NBX0ZpbGVBY2Nlc3MuaCIKLSNlbmRpZgotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKHJldHZhbCk7Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRmlsZSByZWFkZXIgY2FjaGUgYnVmZmVycyBwYXJhbWV0ZXJzIChzaXplLCBudW1iZXIgb2YgYnVmZmVycywgZXRjKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9TSVpFICAgIDEwMjQqMTYKLSNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9OQiAgICAgICAgMgotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX05PTkUgICAgLTEKLSNkZWZpbmUgTTRPU0FfRU9GICAgICAgICAgICAgICAgLTEKLQotI2RlZmluZSBNQVhfRklMTFNfU0lOQ0VfTEFTVF9BQ0NFU1MgICAgTTRPU0FfUkVBREJVRkZFUl9OQioyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSByZWFkZXIgQnVmZmVycyBjb250ZXh0IChwcml2YXRlKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgICBkYXRhOyAgICAgICAgLyoqPCBidWZmZXIgZGF0YSAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgc2l6ZTsgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlcG9zOyAgICAvKio8IHBvc2l0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBidWZmZXIgc3RhcnRzICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICByZW1haW47ICAgICAgICAvKio8IGRhdGEgYW1vdW50IG5vdCBhbHJlYWR5IGNvcGllZCBmcm9tIGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbmJGaWxsU2luY2VMYXN0QWNlc3M7ICAgIC8qKjwgVG8ga25vdyBzaW5jZSBob3cgbWFueSB0aW1lIHdlIGRpZG4ndCB1c2UgdGhpcyBidWZmZXIgKi8KLX0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJfb3B0aW07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIEZpbGUgUmVhZGVyIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBJc09wZW5lZDsgICAgICAgLyoqPCBNaWNybyBzdGF0ZSBtYWNoaW5lICovCi0gICAgTTRPU0FfRmlsZUF0dHJpYnV0ZSAgICAgRmlsZUF0dHJpYnV0ZTsgIC8qKjwgT3BlbmluZyBtb2RlICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgcmVhZEZpbGVQb3M7ICAgIC8qKjwgRWZmZWN0aXZlIHBvc2l0aW9uIG9mIHRoZSBHRkwgcmVhZCBwb2ludGVyICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgYWJzb2x1dGVQb3M7ICAgIC8qKjwgVmlydHVhbCBwb3NpdGlvbiBmb3IgbmV4dCByZWFkaW5nICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgZmlsZVNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGZpbGUgKi8KLQotICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyX29wdGltIGJ1ZmZlcltNNE9TQV9SRUFEQlVGRkVSX05CXTsgIC8qKjwgUmVhZCBidWZmZXJzICovCi0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBhRmlsZURlc2M7ICAvKio8IEZpbGUgZGVzY3JpcHRvciAqLwotCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgRlM7ICAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGludGVyZmFjZSAqLwotI2Vsc2UKLSAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlM7ICAgICAgICAvKio8IEZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCi0jZW5kaWYKLQotfSBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW07Ci0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICBHbG9iYWwgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGxvdyBsZXZlbCByZWFkIGFjY2VzcyAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotc3RhdGljIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogZ3ZfTlhQU1dfUkVBRE9QVF9sb3dMZXZlbEZ1bmN0aW9uczsKLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9pbml0KE00T1NBX1ZvaWQgKmxvd0xldmVsX2Z1bmN0aW9uUG9pbnRlcnMsIE00T1NBX1ZvaWQgKm9wdGltaXplZF9mdW5jdGlvblBvaW50ZXJzKQotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogbG93TGV2ZWxfZnAgID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIGxvd0xldmVsX2Z1bmN0aW9uUG9pbnRlcnM7Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBvcHRpbWl6ZWRfZnAgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKikgb3B0aW1pemVkX2Z1bmN0aW9uUG9pbnRlcnM7Ci0KLSAgICAvL1NldCB0aGUgb3B0aW1pemVkIGZ1bmN0aW9ucywgdG8gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyCi0gICAgb3B0aW1pemVkX2ZwLT5vcGVuUmVhZCAgPSBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5yZWFkRGF0YSAgPSBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5zZWVrICAgICAgPSBNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5jbG9zZVJlYWQgPSBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltOwotICAgIG9wdGltaXplZF9mcC0+c2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5nZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbTsKLQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1fY2xlYW5VcCgpCi17Ci0KLSAgICBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1fZ2V0TG93TGV2ZWxGdW5jdGlvbnMoTTRPU0FfVm9pZCAqKkZTKQotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlcioqIHBGdW5jdGlvbnNQb2ludGVyID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlcioqKSBGUzsKLSAgICAqcEZ1bmN0aW9uc1BvaW50ZXIgPSBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgUmVhZCBhY2Nlc3MgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVySW5pdChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IDA7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSAwOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOwotICAgIH0KLQotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IChNNE9TQV9NZW1BZGRyOCkgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00T1NBX1JFQURCVUZGRVJfU0laRSwgCi0gICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0Iik7Ci0gICAgICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVm9pZCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZyZWUoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpOwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIGZyZWUoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaSwgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsIE00T1NBX01lbUFkZHI4IHBEYXRhKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBjb3B5c2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gb2Zmc2V0OwotCi0gICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9PSBNNE9TQV9FT0YpIHJldHVybiBNNE9TQV9FT0Y7Ci0KLSAgICBpZiggICAocG9zIDwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKLSAgICAgICB8fCAocG9zID4gKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgKyBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIC0gMSkpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOyAvKiBub3RoaW5nIGNvcGllZCAqLwotICAgIH0KLQotICAgIG9mZnNldCA9IHBvcyAtIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3M7Ci0KLSAgICBjb3B5c2l6ZSA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgLSBvZmZzZXQ7Ci0gICAgY29weXNpemUgPSAoc2l6ZSA8IGNvcHlzaXplKSA/IHNpemUgOiBjb3B5c2l6ZTsKLQotICAgIG1lbWNweSgodm9pZCAqKXBEYXRhLCAodm9pZCAqKShhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhICsgb2Zmc2V0KSwgY29weXNpemUpOwotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluIC09IGNvcHlzaXplOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID0gMDsKLQotICAgIHJldHVybiBjb3B5c2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaSwgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGdyaWRQb3M7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgIHRlbXBQb3M7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBidWZmZXJTaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZGlmZjsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIHNpemU7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSICAgICAgICAgICAgIGVycm5vID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICBmaWxlUmVhZFNpemUgPSAwOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZmlsZVNlZWtQb3NpdGlvbiA9IDA7Ci0jZWxzZQotICAgIE00T1NBX0ludDMyICAgICAgICAgcmV0X3ZhbDsKLSAgICBNNE9TQV9VSW50MTYgICAgICAgICBlcnJubzsKLSNlbmRpZgotCi0gICAgTTRPU0FfVFJBQ0UzXzQoIkJ1ZmZlckZpbGwgIGkgPSAlZCAgcG9zID0gJWxkICByZWFkID0gJWxkICBvbGQgPSAlbGQiLCBpLCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKTsKLQotICAgIC8qIEF2b2lkIGN5Y2xpbmcgc3RhdGVtZW50IGJlY2F1c2Ugb2YgRU9GICovCi0gICAgaWYocG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUpCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotCi0gICAgLyogUmVsb2NhdGUgdG8gYWJzb2x1dGUgcG9zdGlvbiBpZiBuZWNlc3NhcnkgKi8KLSAgICBidWZmZXJTaXplID0gTTRPU0FfUkVBREJVRkZFUl9TSVpFOwotICAgIHRlbXBQb3MgPSAoTTRPU0FfRmlsZVBvc2l0aW9uKSAocG9zIC8gYnVmZmVyU2l6ZSk7Ci0gICAgZ3JpZFBvcyA9IHRlbXBQb3MgKiBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0gICAgZGlmZiA9IGdyaWRQb3MgLSBhcENvbnRleHQtPnJlYWRGaWxlUG9zOwotCi0gICAgaWYoZGlmZiAhPSAwKQotICAgIHsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAgICAgZmlsZVNlZWtQb3NpdGlvbiA9IGRpZmY7Ci0gICAgICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+c2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlU2Vla1Bvc2l0aW9uKTsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGdyaWRQb3M7Ci0KLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgcmV0X3ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfU2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgZGlmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmVycm5vKTsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGdyaWRQb3M7Ci0KLSAgICAgICAgaWYocmV0X3ZhbCAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLSAgICB9Ci0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zID0gYXBDb250ZXh0LT5yZWFkRmlsZVBvczsKLQotICAgIC8qIFJlYWQgRGF0YSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGZpbGVSZWFkU2l6ZSA9IE00T1NBX1JFQURCVUZGRVJfU0laRTsKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPnJlYWREYXRhKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhLCAmZmlsZVJlYWRTaXplKTsKLQotICAgIHNpemUgPSAoTTRPU0FfRmlsZVBvc2l0aW9uKWZpbGVSZWFkU2l6ZTsKLSAgICBpZiAoKE00Tk9fRVJST1IgIT0gZXJybm8pJiYoTTRXQVJfTk9fREFUQV9ZRVQgIT0gZXJybm8pKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IE00T1NBX0VPRjsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gMDsKLQotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIyID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2Vsc2UKLSAgICBzaXplID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9SZWFkKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAoTTRPU0FfVUludDggKilhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhLCBNNE9TQV9SRUFEQlVGRkVSX1NJWkUsICZlcnJubyk7Ci0gICAgaWYoc2l6ZSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMiA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbmRpZgotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IHNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gc2l6ZTsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA9IDA7Ci0KLSAgICAvKiBSZXRyaWV2ZSBjdXJyZW50IHBvc2l0aW9uICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5nZXRPcHRpb24oYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikgJmFwQ29udGV4dC0+cmVhZEZpbGVQb3MpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIzID0gMHgleCIsIGVycik7Ci0gICAgfQotICAgIGVsc2UgaWYoICAgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPj0gMCkKLSAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA8IE00T1NBX1JFQURCVUZGRVJfU0laRSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgcmV0dXJucyBOTyBEQVRBIFlFVCIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbHNlCi0gICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfVGVsbChhcENvbnRleHQtPmFGaWxlRGVzYywgJmVycm5vKTsKLQotICAgIGlmKCAgIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID49IDApCi0gICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPCBNNE9TQV9SRUFEQlVGRkVSX1NJWkUpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjMgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfSW50OCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpOwotCi0KLSAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBtYXRjaGVzIHdpdGggZ2l2ZW4gcG9zICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZiggICAocG9zID49IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpCi0gICAgICAgICAgICYmIChwb3MgPCAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE9TQV9SRUFEQlVGRkVSX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ludDggTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggY3VycmVudF9pKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ludDggaSxqOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBtaW5fYW1vdW50LG1heF9hbW91bnQ7Ci0gICAgTTRPU0FfSW50OCBtaW5faSxtYXhfY291bnQ7Ci0KLSAgICAvKiB1cGRhdGUgbmJGaWxsU2luY2VMYXN0QWNlc3MgZmllbGQgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzICsrOwotICAgIH0KLQotICAgIC8qIFBsYW4gQSA6IFNjYW4gZm9yIGVtcHR5IGJ1ZmZlciAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWF4X2NvdW50ID0gTTRPU0FfUkVBREJVRkZFUl9OQjsKLSAgICBtYXhfYW1vdW50ID0gTUFYX0ZJTExTX1NJTkNFX0xBU1RfQUNDRVNTOwotCi0gICAgLyogUGxhbiBCIDogU2NhbiBmb3IgZGVhZCBidWZmZXIgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID49IChNNE9TQV9VSW50MzIpIG1heF9hbW91bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heF9hbW91bnQgPSBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzczsKLSAgICAgICAgICAgIG1heF9jb3VudCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYobWF4X2NvdW50PE00T1NBX1JFQURCVUZGRVJfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMigiREVBRCBCVUZGRVI6ICVkLCAlZCIsbWF4X2NvdW50LGFwQ29udGV4dC0+YnVmZmVyW21heF9jb3VudF0ubmJGaWxsU2luY2VMYXN0QWNlc3MpOwotICAgICAgICByZXR1cm4gbWF4X2NvdW50OwotICAgIH0KLQotICAgIG1pbl9pID0gY3VycmVudF9pOwotICAgIG1pbl9hbW91bnQgPSBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0KLSAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBpcyB0aGUgbW9zdCAiZW1wdHkiICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBqID0gKGkrY3VycmVudF9pKSVNNE9TQV9SRUFEQlVGRkVSX05COwotCi0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2pdLnJlbWFpbiA8IG1pbl9hbW91bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbl9hbW91bnQgPSBhcENvbnRleHQtPmJ1ZmZlcltqXS5yZW1haW47Ci0gICAgICAgICAgICBtaW5faSA9IGo7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWluX2k7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiAgICAgICAgICAgIGVycm5vID0gTTROT19FUlJPUjsKLSNlbHNlCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgcmV0X3ZhbDsKLSAgICBNNE9TQV9VSW50MTYgICAgICAgICBlcnJubzsKLSNlbmRpZgotCi0gICAgLyogZ28gdG8gdGhlIGVuZCBvZiBmaWxlKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbihhcENvbnRleHQtPmFGaWxlRGVzYywgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSAmYXBDb250ZXh0LT5maWxlU2l6ZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0jZWxzZQotICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIDAsIE00T1NBX2tGaWxlU2Vla0VuZCwgJmVycm5vKTsKLQotICAgIGlmIChyZXRfdmFsICE9IDApCi0gICAgewotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gTTRPU0FfRU9GOwotICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmV0cmlldmUgc2l6ZSBvZiB0aGUgZmlsZSAqLwotICAgICAgICBhcENvbnRleHQtPmZpbGVTaXplID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gYXBDb250ZXh0LT5maWxlU2l6ZTsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlc3lzdGVtIEFQSSAgICAgICAgICAgICAgICAgICAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBvcGVucyB0aGUgcHJvdmlkZWQgZmlsZURlc2NyaXB0b3IgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKE9VVCkgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBGaWxlRGVzY3JpcHRvciA6ICAgICAgIChJTikgRmlsZSBEZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBmaWxlLgotKiBAcGFyYW0gICAgICAgRmlsZU1vZGVBY2Nlc3MgOiAgICAgICAgKElOKSBGaWxlIG1vZGUgYWNjZXNzLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBwQ29udGV4dCBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUyAgICAgIHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0IChpdCBtdXN0IGJlIGVpdGhlciBpc1RleHRNb2RlIG9yIHJlYWQpCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX05PVF9GT1VORCBUaGUgZmlsZSBjYW4gbm90IGJlIG9wZW5lZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzKQotI2Vsc2UKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHIgKkZTKQotI2VuZGlmCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfRVJSICAgZXJyICAgICAgID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9Wb2lkKiBhRmlsZURlc2MgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0Jvb2wgIGJ1ZmZlcnNfYWxsb2NhdGVkID0gTTRPU0FfRkFMU0U7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIGVycm5vID0gTTROT19FUlJPUjsKLSNlbHNlCi0gICAgTTRPU0FfVUludDE2IGVycm5vOwotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0gcCA9IDB4JXAgZmQgPSAlcyBtb2RlID0gJWx1IiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZURlc2NyaXB0b3IsIEZpbGVNb2RlQWNjZXNzKTsKLQotICAgIC8qICAgICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcEZpbGVEZXNjcmlwdG9yKTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiAgICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQuICovCi0gICAgYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRklMRV9SRUFERVIsIChNNE9TQV9DaGFyICopIk00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSIpOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIGFwQ29udGV4dCk7Ci0KLSAgICAvKiBTZXQgZmlsZXN5c3RlbSBpbnRlcmZhY2UgKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLQotICAgIC8qU2V0IHRoZSBvcHRpbWl6ZWQgZnVuY3Rpb25zLCB0byBiZSBjYWxsZWQgYnkgdGhlIHVzZXIqLwotCi0gICAgYXBDb250ZXh0LT5GUyA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVSZWFkUG9pbnRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlck9wdGltX2luaXQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTD09YXBDb250ZXh0LT5GUykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9GaWxlUmVhZGVyT3B0aW1faW5pdCAtIEVSUk9SIDogYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBhcENvbnRleHQtPkZTLT5vcGVuUmVhZCAgPSBNNE9TQV9maWxlUmVhZE9wZW47Ci0gICAgYXBDb250ZXh0LT5GUy0+cmVhZERhdGEgID0gTTRPU0FfZmlsZVJlYWREYXRhOwotICAgIGFwQ29udGV4dC0+RlMtPnNlZWsgICAgICA9IE00T1NBX2ZpbGVSZWFkU2VlazsKLSAgICBhcENvbnRleHQtPkZTLT5jbG9zZVJlYWQgPSBNNE9TQV9maWxlUmVhZENsb3NlOwotICAgIGFwQ29udGV4dC0+RlMtPnNldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOwotICAgIGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOwotI2Vsc2UKLSAgICBhcENvbnRleHQtPkZTID0gRlM7Ci0jZW5kaWYKLQotICAgIC8qIFZlcmlmeSBhY2Nlc3MgbW9kZSAqLwotICAgIGlmICggICAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpICE9IDApCi0gICAgICAgIHx8ICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpID09IDApKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIGZpbGUgaW4gcmVhZCBtb2RlICovCi0gICAgaWYoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpICE9IDApCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGluIHJlYWQgb25seSovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgICAgICAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPm9wZW5SZWFkKCZhRmlsZURlc2MsIHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgICAgICAgICBpZiAoKGFGaWxlRGVzYyA9PSBNNE9TQV9OVUxMKXx8KE00Tk9fRVJST1IgIT0gZXJybm8pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgYUZpbGVEZXNjID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9PcGVuKHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MsICZlcnJubyk7Ci0KLSAgICAgICAgICAgIGlmIChhRmlsZURlc2MgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICAvKiBBbGxvY2F0ZSBidWZmZXJzICovCi0gICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0KGFwQ29udGV4dCk7Ci0gICAgYnVmZmVyc19hbGxvY2F0ZWQgPSBNNE9TQV9UUlVFOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgKi8KLSAgICBhcENvbnRleHQtPmZpbGVTaXplID0gMDsKLSAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gMDsKLSAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gMDsKLQotICAgIC8qIFJldHJpZXZlIHRoZSBGaWxlIERlc2NyaXB0b3IqLwotICAgIGFwQ29udGV4dC0+YUZpbGVEZXNjID0gYUZpbGVEZXNjOwotCi0gICAgLyogUmV0cmlldmUgdGhlIEZpbGUgbW9kZSBBY2Nlc3MgKi8KLSAgICBhcENvbnRleHQtPkZpbGVBdHRyaWJ1dGUubW9kZUFjY2VzcyA9IChNNE9TQV9GaWxlTW9kZUFjY2VzcykgRmlsZU1vZGVBY2Nlc3M7Ci0KLSAgICAvKlJldHJpZXZlIHRoZSBGaWxlIHJlYWRlciBjb250ZXh0ICovCi0gICAgKnBDb250ZXh0PSAoTTRPU0FfQ29udGV4dClhcENvbnRleHQ7Ci0KLSAgICAvKiBDb21wdXRlIGZpbGUgc2l6ZSAqLwotICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZShhcENvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotY2xlYW51cDoKLQotICAgIC8qIGZyZWUgY29udGV4dCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmKGJ1ZmZlcnNfYWxsb2NhdGVkID09IE00T1NBX1RSVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShhcENvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJlZSggYXBDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSAoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbTogcmV0dXJucyBlcnJvciAweCUweCIsIGVycikKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgcmVhZHMgdGhlICdzaXplJyBieXRlcyBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykKLSogICAgICAgICAgICAgICAgICAgICAgYW5kIHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgJ2RhdGEnIHBvaW50ZXIuIElmICdzaXplJyBieXRlIGNhbiBub3QgYmUgcmVhZCBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciwKLSogICAgICAgICAgICAgICAgICAgICAgJ3NpemUnIHBhcmFtZXRlciBpcyB1cGRhdGVkIHRvIG1hdGNoIHRoZSBjb3JyZWN0IG51bWJlciBvZiByZWFkIGJ5dGVzLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBEYXRhIDogKE9VVCkgRGF0YSBwb2ludGVyIG9mIHRoZSByZWFkIGRhdGEuCi0qIEBwYXJhbSAgICAgICBwU2l6ZSA6IChJTk9VVCkgU2l6ZSBvZiB0aGUgZGF0YSB0byByZWFkIChpbiBieXRlKS4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgcFNpemUsIGZpbGVEZXNjcmlwdG9yIG9yIHBEYXRhIGlzIE5VTEwKLSogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LE00T1NBX01lbUFkZHI4IHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gYVNpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGNvcGllZFNpemU7Ci0gICAgTTRPU0FfSW50OCBzZWxlY3RlZF9idWZmZXIsIGN1cnJlbnRfYnVmZmVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbSBwID0gMHglcCAgZCA9IDB4JXAgIHMgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwRGF0YSwgKnBTaXplKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBEYXRhKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBTaXplKTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgLyogUHJldmVudCByZWFkaW5nIGJleW9uZCBFT0YgKi8KLSAgICBpZigoKnBTaXplID4gMCkgJiYgKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkpCi0gICAgewotICAgICAgICBjb3BpZWRTaXplID0gMDsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIGRhdGEgY2FuIGJlIHJlYWQgZnJvbSBhIGJ1ZmZlciAqLwotICAgIC8qIElmIG5vdCwgZmlsbCBvbmUgYWNjb3JkaW5nIHRvIHF1YW50aXplZCBwb3NpdGlvbnMgKi8KLSAgICBjb3BpZWRTaXplID0gMDsKLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJNYXRjaChhcENvbnRleHQsIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotCi0gICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX1JFQURCVUZGRVJfTk9ORSkKLSAgICB7Ci0gICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyU2VsZWN0KGFwQ29udGV4dCwgMCk7Ci0gICAgICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0gICAgfQotCi0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBpZihlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqcFNpemUgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3BpZWRTaXplID0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemU7Ci0gICAgICAgICAgICAgICAgLypjb3B5IHRoZSBjb250ZW50IGludG8gcERhdGEqLwotICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zLCBjb3BpZWRTaXplLCBwRGF0YSk7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzMoInJlYWQgIHNpemUgPSAlbHUgIGJ1ZmZlciA9ICVkICBwb3MgPSAlbGQiLCAqcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIsIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotCi0gICAgLyogQ29weSBidWZmZXIgaW50byBwRGF0YSAqLwotICAgIHdoaWxlKCgoTTRPU0FfVUludDMyKWNvcGllZFNpemUgPCAqcFNpemUpICYmIChlcnIgPT0gTTROT19FUlJPUikpCi0gICAgewotICAgICAgICBhU2l6ZSA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgaWYoYVNpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKWNvcGllZFNpemUgPCAqcFNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudF9idWZmZXIgPSBzZWxlY3RlZF9idWZmZXI7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJNYXRjaChhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX1JFQURCVUZGRVJfTk9ORSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyU2VsZWN0KGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklmIHdlIGdvdCBhbGwgdGhlIGRhdGEgdGhhdCB3ZSB3YW50ZWQsIHdlIHNob3VsZCByZXR1cm4gbm8gZXJyb3IqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKnBTaXplLWNvcGllZFNpemUpIDw9IChNNE9TQV9VSW50MzIpYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRfYnVmZmVyXS5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypJZiB3ZSBkaWQgbm90IGdldCBlbm91Z2ggZGF0YSwgd2Ugd2lsbCByZXR1cm4gTk9fREFUQV9ZRVQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb3B5IHRoZSBkYXRhIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKndlIHJlYWNoZWQgZW5kIG9mIGZpbGUsIHNvIHN0b3AgdHJ5aW5nIHRvIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fTU9SRV9BVSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29weSB0aGUgZGF0YSByZWFkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU2l6ZSA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKndlIHJlYWNoZWQgZW5kIG9mIGZpbGUsIHNvIHN0b3AgdHJ5aW5nIHRvIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotY2xlYW51cCA6Ci0KLSAgICAvKiBVcGRhdGUgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgcG9pbnRlciAqLwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgY29waWVkU2l6ZTsKLQotICAgIGlmKChlcnIgIT0gTTROT19FUlJPUikmJihlcnIhPU00V0FSX05PX0RBVEFfWUVUKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0gc2l6ZSA9ICVsZCAgY29waWVkID0gJWxkICBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLCBjb3BpZWRTaXplLCBlcnIpOwotICAgIH0KLQotICAgIC8qIEVmZmVjdGl2ZSBjb3BpZWQgc2l6ZSBtdXN0IGJlIHJldHVybmVkICovCi0gICAgKnBTaXplID0gY29waWVkU2l6ZTsKLQotCi0gICAgLyogUmVhZCBpcyBkb25lICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuCi0qICAgICAgICAgICAgICBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0byB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgOgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgYmVnaW5uaW5nIChwb3NpdGlvbiBNVVNUIGJlIHBvc2l0aXZlKSA6IGVuZCBwb3NpdGlvbiA9IHBvc2l0aW9uCi0qICAgICAgICAgICAgICBGcm9tIHRoZSBlbmQgKHBvc2l0aW9uIE1VU1QgYmUgbmVnYXRpdmUpIDogZW5kIHBvc2l0aW9uID0gZmlsZSBzaXplICsgcG9zaXRpb24KLSogICAgICAgICAgICAgIEZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gKHNpZ25lZCBvZmZzZXQpIDogZW5kIHBvc2l0aW9uID0gY3VycmVudCBwb3NpdGlvbiArIHBvc2l0aW9uLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIFNlZWtNb2RlIDogICAgICAoSU4pIFNlZWsgYWNjZXNzIG1vZGUuCi0qIEBwYXJhbSAgICAgICBwUG9zaXRpb24gOiAgICAgKElOKSBQb3NpdGlvbiBpbiB0aGUgZmlsZS4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgU2Vla21vZGUgb3IgZmlsZURlc2NyaXB0b3IgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04gdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbSggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIFNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltIHAgPSAweCVwIG1vZGUgPSAlZCBwb3MgPSAlZCIsIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWtNb2RlLCAqcFBvc2l0aW9uKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBQb3NpdGlvbik7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBTZWVrTW9kZSk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICBzd2l0Y2goU2Vla01vZGUpCi0gICAgewotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA6Ci0gICAgICAgICAgICBpZigqcFBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gKnBQb3NpdGlvbjsKLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQgOgotICAgICAgICAgICAgaWYoKnBQb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+ZmlsZVNpemUgKyAqcFBvc2l0aW9uOwotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgOgotICAgICAgICAgICAgaWYoKChhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbikgPiBhcENvbnRleHQtPmZpbGVTaXplKSB8fAotICAgICAgICAgICAgICAgICgoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArICpwUG9zaXRpb24pIDwgMCkpewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArICpwUG9zaXRpb247Ci0gICAgICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBjbG9zZSB0aGUgZmlsZQotKiAgICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpIGFuZCBhbHNvIGZyZWVzIHRoZSBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MTYgZXJybm87Ci0jZW5kaWYKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZENsb3NlX29wdGltIHAgPSAweCVwIiwgcENvbnRleHQgKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogYnVmZmVyICovCi0gICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGcmVlKGFwQ29udGV4dCk7Ci0KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+Y2xvc2VSZWFkKGFwQ29udGV4dC0+YUZpbGVEZXNjKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycm5vKQotICAgIHsKLSAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0gRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSNlbHNlCi0gICAgYVJldF9WYWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX0Nsb3NlKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotCi0gICAgaWYgKGFSZXRfVmFsICE9IDApCi0gICAgewotICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgfQotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLQotICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8vPj4+PiBHTE0yMDA5MDIxMiA6IHNldCB0aGUgbG93IGxldmVsIGZ1bmN0aW9uIHN0YXRpY2FsbHkKLSAgICBpZiAoYXBDb250ZXh0LT5GUyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSggYXBDb250ZXh0LT5GUyk7Ci0gICAgfQotICAgIC8vPDw8PCBHTE0yMDA5MDIxMiA6IHNldCB0aGUgbG93IGxldmVsIGZ1bmN0aW9uIHN0YXRpY2FsbHkKLQotICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBmcmVlKGFwQ29udGV4dCk7Ci0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gcmVxdWlyZWQgdG8gbWFpbnRhaW4gZnVuY3Rpb24gcG9pbnRlcgotKiAgICAgICAgICAgICAgc3RydWN0dXJlLgotKiBAbm90ZSAgICAgICAgVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHJlcXVpcmVkIHRvIG1haW50YWluIGZ1bmN0aW9uIHBvaW50ZXIKLSogICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0qIEBwYXJhbSAgICAgICBPcHRpb25WYWx1ZSA6ICAgKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbl9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgT3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQKLSogICAgICAgICAgICAgIHdpdGggdGhlIG9wdGlvbklELlRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZwotKiAgICAgICAgICAgICAgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0qIEBub3RlICAgICAgICBUaGUgb3B0aW9ucyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSogQHBhcmFtICAgICAgIE9wdGlvbklkIDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotKiBAcGFyYW0gICAgICAgcE9wdGlvblZhbHVlIDogIChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24uCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcENvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCB0aGUgb3B0aW9uIGlkIGlzIG5vdCB2YWxpZC4KLSogQHJldHVybiAgICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRCBUaGUgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb25fb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIE9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLwotICAgIH0KLQotICAgIC8qIEdldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCi0gICAgc3dpdGNoKE9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyogR2V0IEZpbGUgU2l6ZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplOi8qKjwgR2V0IHNpemUgb2YgdGhlIGZpbGUsIGxpbWl0ZWQgdG8gMzIgYml0IHNpemUgKi8KLQotICAgICAgICAgICAgKCooTTRPU0FfVUludDMyICopcE9wdGlvblZhbHVlKSA9IGFwQ29udGV4dC0+ZmlsZVNpemU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBDaGVjayBFbmQgb2YgZmlsZSBPY2N1cnMgKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRiA6ICAgICAvKio8IFNlZSBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9Cb29sICopcE9wdGlvblZhbHVlKSA9IChhcENvbnRleHQtPmFic29sdXRlUG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogR2V0IEZpbGUgUG9zaXRpb24gKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24gOiAgIC8qKjwgR2V0IGZpbGUgcG9zaXRpb24gKi8KLQotICAgICAgICAgICAgKihNNE9TQV9GaWxlUG9zaXRpb24gKilwT3B0aW9uVmFsdWUgPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogR2V0IEF0dHJpYnV0ZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGUgOiAgLyoqPCBHZXQgdGhlIGZpbGUgYXR0cmlidXRlID0gYWNjZXNzIG1vZGUgKi8KLQotICAgICAgICAgICAgKCooTTRPU0FfRmlsZUF0dHJpYnV0ZSAqKXBPcHRpb25WYWx1ZSkubW9kZUFjY2VzcyA9IGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qKjwgQmFkIG9wdGlvbiBJRCAqLwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0NoYXJTdGFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4MTRjYmYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNERQQUtfQ2hhclN0YXIuYwotICogQGluZ3JvdXAKLSAgKiBAYnJpZWYgICAgICAgIGRlZmluaXRpb24gb2YgdGhlIENoYXIgU3RhciBzZXQgb2YgZnVuY3Rpb25zLgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0vKiBXQVJOSU5HOiBTcGVjaWZpYyBBbmRyb2lkICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYmMncyBzdHJuY3B5KCkuCi0gKiBAbm90ZSAgICAgICBJdCBjb3BpZXMgZXhhY3RseSBsZW4yQ29weSBjaGFyYWN0ZXJzIGZyb20gcFN0ckluIHRvIHBTdHJPdXQsCi0gKiAgICAgICAgICAgICB0cnVuY2F0aW5nICBwU3RySW4gb3IgYWRkaW5nIG51bGwgY2hhcmFjdGVycyB0byBwU3RyT3V0IGlmCi0gKiAgICAgICAgICAgICBuZWNlc3NhcnkuCi0gKiAgICAgICAgICAgICAtIElmIGxlbjJDb3B5IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwKLSAqICAgICAgICAgICAgICAgYSBudWxsIGNoYXJhY3RlciBpcyBhcHBlbmRlZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBjb3BpZWQKLSAqICAgICAgICAgICAgICAgc3RyaW5nLgotICogICAgICAgICAgICAgLSBJZiBsZW4yQ29weSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiBwU3RySW4sIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgICAgcGFkZGVkIHdpdGggbnVsbCBjaGFyYWN0ZXJzIHVwIHRvIGxlbmd0aCBsZW4yQ29weS4KLSAqICAgICAgICAgICAgIC0gcFN0ck91dCBhbmQgcFN0ckluIE1VU1QgTk9UIE9WRVJMQVAgKHRoaXMgaXMgTk9UIENIRUNLRUQpLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgRGVzdGluYXRpb24gY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBTb3VyY2UgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGxlbjJDb3B5OiAoSU4pIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gY29weS4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFN0ck91dCBpcyBNNE9TQV9OVUxMLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyTkNvcHkoTTRPU0FfQ2hhciogcFN0ck91dCwgTTRPU0FfQ2hhciAgICpwU3RySW4sIE00T1NBX1VJbnQzMiBsZW4yQ29weSkKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyTkNvcHlcdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCxNNE9TQV9VSW50MzIgJWxkKSIsCi0gICAgICAgIHBTdHJPdXQscFN0ckluLGxlbjJDb3B5KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0ck91dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29weTpcdHBTdHJPdXQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RySW4pLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyTkNvcHk6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgc3RybmNweSgoY2hhciAqKXBTdHJPdXQsIChjb25zdCBjaGFyICopcFN0ckluLCAoc2l6ZV90KWxlbjJDb3B5KTsKLSAgICBpZihsZW4yQ29weSA8PSAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbikpCi0gICAgewotICAgICAgICBwU3RyT3V0W2xlbjJDb3B5XSA9ICdcMCc7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBjb21wYXJpc29uIG9mIHBTdHJJbjEgYW5kIHBTdHJJbjIuCi0gKiBAbm90ZSAgICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgaW4gcmVzdWx0IGlzIE00T1NBX1RSVUUgaWYgdGhlIHN0cmluZwotICogICAgICAgICAgICAgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIHN0cmljdGx5IGlkZW50aWNhbCB0byB0aGUgc3RyaW5nIHBvaW50ZWQKLSAqICAgICAgICAgICAgIHRvIGJ5IHBTdHJJbjIsIGFuZCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCi0gKiBAcGFyYW0gICAgICBwU3RySW4xOiAoSU4pIEZpcnN0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwU3RySW4yOiAoSU4pIFNlY29uZCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgY21wUmVzdWx0OiAoT1VUKSBDb21wYXJpc29uIHJlc3VsdC4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4xIHBTdHJJbjIgb3IgY21wUmVzdWx0IGlzIE00T1NBX05VTEwuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJBcmVJZGVudGljYWwoTTRPU0FfQ2hhciogcFN0ckluMSwgTTRPU0FfQ2hhciogcFN0ckluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wqIHBSZXN1bHQpCi17Ci0gICAgTTRPU0FfVUludDMyIGkzMixsZW4zMjsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyQXJlSWRlbnRpY2FsXHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgsIgotICAgICAgICAiTTRPU0FfSW50MzIqICV4KSIscFN0ckluMSxwU3RySW4yLHBSZXN1bHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQXJlSWRlbnRpY2FsOlx0cFN0ckluMSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJBcmVJZGVudGljYWw6XHRwU3RySW4yIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUmVzdWx0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockFyZUlkZW50aWNhbDpcdHBSZXN1bHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgbGVuMzIgPSAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbjEpOwotICAgIGlmKGxlbjMyICE9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluMikpCi0gICAgewotICAgICAgICAqcFJlc3VsdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IoaTMyPTA7aTMyPGxlbjMyO2kzMisrKQotICAgIHsKLSAgICAgICAgaWYocFN0ckluMVtpMzJdICE9IHBTdHJJbjJbaTMyXSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBSZXN1bHQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnBSZXN1bHQgPSBNNE9TQV9UUlVFOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9VSW50MzIgZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKLSAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfVUludDMyIHZhbHVlIHBWYWwsIGFzc3VtaW5nIGEKLSAqICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGluIGJhc2UgcHJvdmlkZWQgYnkgdGhlIHBhcmFtZXRlciBiYXNlLiBwU3RyT3V0IGlzCi0gKiAgICAgICAgICAgICBzZXQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFzdAotICogICAgICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBudW1iZXIgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgY29udmVyc2lvbiwgcFN0ck91dCBpcyBub3QKLSAqICAgICAgICAgICAgICAgdXBkYXRlZCwgYW5kIHBWYWwgaXMgc2V0IHRvIG51bGwuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbmVnYXRpdmUgbnVtYmVyLCBwU3RyT3V0IGlzIG5vdCB1cGRhdGVkLCBhbmQgcFZhbCBpcwotICogICAgICAgICAgICAgICBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3csIHBWYWwgaXMgc2V0IHRvIE00T1NBX1VJTlQzMl9NQVguCi0gKiAgICAgICAgICAgICAtIGlmIHBTdHJPdXQgaXMgbm90IHRvIGJlIHVzZWQsIGl0IGNhbiBiZSBzZXQgdG8gTTRPU0FfTlVMTC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFZhbDogKE9VVCkgcmVhZCB2YWx1ZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIE91dHB1dCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgYmFzZTogKElOKSBCYXNlIG9mIHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwVmFsIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ6IGNvbnZlcnNpb24gZmFpbHVyZS4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9OVU1fUkFOR0U6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBudW1iZXIKLSAqICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBNNE9TQV9VSU5UMzJfTUFYLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05FR0FUSVZFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbmVnYXRpdmUKLSAqICAgICAgICAgICAgIG51bWJlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDMyKE00T1NBX0NoYXIqICAgIHBTdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiAgICBwVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX1VJbnQzMiB1bDsKLSAgICBjaGFyKiAgICAgICAgcFRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0VUludDMyXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQzMiogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MzI6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDMyOlx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBlcnJubyA9IDA7Ci0gICAgc3dpdGNoKGJhc2UpCi0gICAgewotICAgIGNhc2UgTTRPU0Ffa2NockRlYzoKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsMTYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJPY3Q6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDgpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIGhhcyBjb252ZXJzaW9uIGZhaWxlZCA/ICovCi0gICAgaWYoKE00T1NBX0NoYXIqKXBUZW1wID09IHBTdHJJbikKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvKiB3YXMgdGhlIG51bWJlciBuZWdhdGl2ZSA/ICovCi0gICAgaWYoKihwU3RySW4rc3Ryc3BuKChjb25zdCBjaGFyICopcFN0ckluLCIgXHQiKSkgPT0gJy0nKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05FR0FUSVZFOwotICAgIH0KLQotICAgIC8qIGhhcyBhbiBvdmVyZmxvdyBvY2N1cmVkID8gKi8KLSAgICBpZihlcnJubyA9PSBFUkFOR0UpCi0gICAgewotICAgICAgICAqcFZhbCA9IE00T1NBX1VJTlQzMl9NQVg7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogbm9taW5hbCBjYXNlICovCi0gICAgKnBWYWwgPSAoTTRPU0FfVUludDMyKXVsOwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICB7Ci0gICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX1VJbnQxNiBmcm9tIHN0cmluZy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQotICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9VSW50MTYgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQotICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCi0gKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDE2X01BWC4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX1VJTlQxNl9NQVguCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTkVHQVRJVkU6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBuZWdhdGl2ZQotICogICAgICAgICAgICAgbnVtYmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MTYgKE00T1NBX0NoYXIqIHBTdHJJbiwgTTRPU0FfVUludDE2ICpwVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHBTdHJPdXQsIE00T1NBX2Nock51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWw7Ci0gICAgY2hhciogICAgICAgIHBUZW1wOwotCi0gICAgTTRPU0FfVFJBQ0UxXzQoIk00T1NBX2NockdldFVJbnQxNlx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9VSW50MTYqICV4IgotICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbixNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MTY6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDE2Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwxMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2NockhleGE6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDE2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hyT2N0OgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCw4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLwotICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogd2FzIHRoZSBudW1iZXIgbmVnYXRpdmUgPyAqLwotICAgIGlmKCoocFN0ckluK3N0cnNwbigoY29uc3QgY2hhciAqKXBTdHJJbiwiIFx0IikpID09ICctJykKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9ORUdBVElWRTsKLSAgICB9Ci0KLSAgICAvKiBoYXMgYW4gb3ZlcmZsb3cgb2NjdXJlZCA/ICovCi0gICAgaWYodWw+TTRPU0FfVUlOVDE2X01BWCkKLSAgICB7Ci0gICAgICAgICpwVmFsID0gTTRPU0FfVUlOVDE2X01BWDsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKLSAgICB9Ci0KLSAgICAvKiBub21pbmFsIGNhc2UgKi8KLSAgICAqcFZhbCA9IChNNE9TQV9VSW50MTYpdWw7Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgIHsKLSAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRPU0FfY2hyU1ByaW50ZihNNE9TQV9DaGFyICAqcFN0ck91dCwgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqZm9ybWF0LCAuLi4pCi17Ci0gICAgdmFfbGlzdCAgICAgICBtYXJrZXI7Ci0gICAgTTRPU0FfQ2hhciAgICpwVGVtcDsKLSAgICBNNE9TQV9DaGFyICAgKnBlcmNlbnRQb2ludGVyOwotICAgIE00T1NBX0NoYXIgICAqbmV3Rm9ybWF0OwotICAgIE00T1NBX0ludDMyICBuZXdGb3JtYXRMZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X2xsID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X3RtID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X2FhID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50OwotICAgIE00T1NBX1VJbnQzMiAgbmJDaGFyOwotICAgIE00T1NBX0ludDMyICAgICBlcnI7Ci0gICAgTTRPU0FfQ2hhciBmbGFnQ2hhcltdICAgICAgICAgICAgID0gIictKyAjMCI7Ci0gICAgTTRPU0FfQ2hhciB3aWR0aE9yUHJlY2lzaW9uQ2hhcltdID0gIiowMTIzNDU2Nzg5IjsKLSAgICBNNE9TQV9DaGFyIG90aGVyUHJlZml4Q2hhcltdICAgICAgPSAiaGxMIjsKLSAgICBNNE9TQV9DaGFyIGNvbnZlcnNpb25DaGFyW10gICAgICAgPSAiZGlvdXhYbmZlRWdHY0NzU3AlIjsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJTUHJpbnRmXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQzMiAlbGQiCi0gICAgICAgICJNNE9TQV9DaGFyKiAleCkiLHBTdHJPdXQsc3RyT3V0TWF4TGVuLGZvcm1hdCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ck91dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNQcmludGY6XHRwU3RyT3V0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBmb3JtYXQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU1ByaW50ZjpcdGZvcm1hdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICB2YV9zdGFydChtYXJrZXIsZm9ybWF0KTsKLQotICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dbGxbY29udmVyc2lvbl0gKi8KLSAgICBwVGVtcCA9IGZvcm1hdDsKLSAgICB3aGlsZSgqcFRlbXApCi0gICAgewotICAgICAgICBwZXJjZW50UG9pbnRlciA9IChNNE9TQV9DaGFyICopc3RyY2hyKChjb25zdCBjaGFyICopcFRlbXAsJyUnKTsgLyogZ2V0IHRoZSBuZXh0IHBlcmNlbnQgY2hhcmFjdGVyICovCi0gICAgICAgIGlmKCFwZXJjZW50UG9pbnRlcikKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCA9IHBlcmNlbnRQb2ludGVyKzE7ICAgICAgICAgICAvKiBzcGFuIGl0ICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsKGNvbnN0IGNoYXIgKilmbGFnQ2hhcik7ICAgIC8qIHNwYW4gdGhlIG9wdGlvbmFsIGZsYWdzICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7IC8qIHNwYW4gdGhlIG9wdGlvbmFsIHdpZHRoICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgaWYoKnBUZW1wPT0nLicpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUZW1wKys7Ci0gICAgICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7IC8qIHNwYW4gdGhlIG9wdGlvbmFsIHByZWNpc2lvbiAqLwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgaWYoc3RybGVuKChjb25zdCBjaGFyICopcFRlbXApPj0yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKXBUZW1wLCJsbCIsMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnRfbGwrKzsgICAgICAgICAgICAgICAgIC8qIEkgZ290IE9ORSAqLwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAibGwiIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKXBUZW1wLCJ0bSIsMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnRfdG0rKzsKLSAgICAgICAgICAgICAgICBwVGVtcCArPTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsImFhIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF9hYSsrOwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilvdGhlclByZWZpeENoYXIpOyAvKiBzcGFuIHRoZSBvdGhlciBvcHRpb25hbCBwcmVmaXggKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWNvbnZlcnNpb25DaGFyKTsKLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgfQotCi0gICAgY291bnQgPSBjb3VudF9sbCArIGNvdW50X3RtICsgY291bnRfYWE7Ci0KLSAgICBpZighY291bnQpCi0gICAgewotICAgICAgICBlcnI9IHZzbnByaW50ZigoY2hhciAqKXBTdHJPdXQsIChzaXplX3Qpc3RyT3V0TWF4TGVuICsgMSwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG1hcmtlcik7Ci0gICAgICAgIHZhX2VuZChtYXJrZXIpOwotICAgICAgICBpZiAoKGVycjwwKSB8fCAoKE00T1NBX1VJbnQzMillcnI+c3RyT3V0TWF4TGVuKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0ck91dFtzdHJPdXRNYXhMZW5dID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9DSFJfU1RSX09WRVJGTE9XOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIG5ld0Zvcm1hdExlbmd0aCA9IHN0cmxlbigoY29uc3QgY2hhciAqKWZvcm1hdCkgKyAxOwotCi0gICAgbmV3Rm9ybWF0TGVuZ3RoIC09IChjb3VudF9sbCtjb3VudF90bStjb3VudF9hYSk7Ci0KLSAgICBuZXdGb3JtYXQgPShNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3Rm9ybWF0TGVuZ3RoLAotICAgICAgICBNNE9TQV9DSEFSU1RBUiwoTTRPU0FfQ2hhciopIk00T1NBX2NoclByaW50ZjogbmV3Rm9ybWF0Iik7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBuZXdGb3JtYXQpCi0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICBuZXdGb3JtYXRbbmV3Rm9ybWF0TGVuZ3RoLTFdID0gJ1wwJzsKLSAgICBwVGVtcCA9IG5ld0Zvcm1hdDsKLQotICAgIC8qIGNvcHkgZm9ybWF0IHRvIG5ld0Zvcm1hdCwgcmVwbGFjaW5nICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXWxsW2NvbnZlcnNpb25dCi0gICAgICogYnkgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dSTY0W2NvbnZlcnNpb25dICovCi0gICAgd2hpbGUoKmZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iQ2hhciA9IHN0cmNzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsICIlIik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IGNoYXJhY3RlcnMgYmVmb3JlIHRoZSAlIGNoYXJhY3RlciAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgICpwVGVtcCsrID0gKmZvcm1hdCsrOyAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgJSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKWZsYWdDaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIGZsYWcgY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSB3aWR0aCBjaGFyYWN0ZXJzICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgaWYoKmZvcm1hdD09Jy4nKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFRlbXArKyA9ICpmb3JtYXQrKzsgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIGRvdCBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgIGlmKCFmb3JtYXQpIGJyZWFrOwotICAgICAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsKLSAgICAgICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIHdpZHRoIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFmb3JtYXQpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKHN0cmxlbigoY29uc3QgY2hhciAqKWZvcm1hdCk+PTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAibGwiLCAyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWwgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAibGwiIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKWZvcm1hdCwgInRtIiwgMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7IC8qICVsICovCi0gICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgInRtIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJhYSIsIDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOwotICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJhYSIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKW90aGVyUHJlZml4Q2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSBvdGhlciBQcmVmaXggKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopY29udmVyc2lvbkNoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7Ci0gICAgICAgICAgICBmb3JtYXQgKz0gbmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPSBuYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgIH0KLQotICAgIC8qIFplcm8gdGVybWluYXRlIHRoZSBmb3JtYXQgc3RyaW5nLiAqLwotICAgICgqcFRlbXApID0gJ1wwJzsKLQotICAgIGVyciA9IHZzbnByaW50ZigoY2hhciAqKXBTdHJPdXQsIChzaXplX3Qpc3RyT3V0TWF4TGVuICsgMSwgKGNvbnN0IGNoYXIgKiluZXdGb3JtYXQsIG1hcmtlcik7Ci0gICAgdmFfZW5kKG1hcmtlcik7Ci0gICAgZnJlZShuZXdGb3JtYXQpOwotICAgIGlmICgoZXJyPDApIHx8ICgoTTRPU0FfVUludDMyKWVycj5zdHJPdXRNYXhMZW4pKQotICAgIHsKLSAgICAgICAgcFN0ck91dFtzdHJPdXRNYXhMZW5dID0gJ1wwJzsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4MTdiMjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfQ2xvY2suYwotICogQGJyaWVmICAgICAgICBDbG9jayByZWxhdGVkIGZ1bmN0aW9ucwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBjbG9jawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DbG9jay5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGFuIGFic29sdXRlIHRpbWUgdG8gYW4gdW5rbm93biByZWZlcmVuY2Ugd2l0aAotICogICAgICAgICAgICAgYSBoaWdoIHByZWNpc2lvbi4KLSAqIEBub3RlICAgICAgIEl0IG1lYW5zIGl0IGNhbiBvbmx5IGJlIHVzZWQgdG8gZ2V0IGEgcmVsYXRpdmUgdGltZSBieSBjb21wdXRpbmcKLSAqICAgICAgICAgICAgIGRpZmZlcmVuY2VzIGJldHdlZW4gdG8gdGltZXMuCi0gKiAgICAgICAgICAgICBJdCBpcyB0byB0aGUgY2FsbGVyIHRvIGFsbG9jYXRlIHRpbWUuIFRpbWUgaXMgZXhwcmVzc2VkIGluCi0gKiAgICAgICAgICAgICB0aW1lc2NhbGUgdW5pdC4KLSAqICAgICAgICAgICAgIE00T1NBX1JPTExPVkVSX0NMT0NLIGluIE00T1NBX1R5cGVzLmggbXVzdCBiZSBjb25maWd1cmVkIHdpdGggdGhlIHJvbGxvdmVyCi0gKiAgICAgICAgICAgICBvZmZzZXQgb2YgdGhpcyBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgIHRpbWU6IChJTi9PVVQpIHRpbWUKLSAqIEBwYXJhbSAgICAgIHRpbWVzY2FsZTogKElOKSBUaGUgdGltZXNjYWxlICh0aW1lIHVuaXQgcGVyIHNlY29uZCkKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRVNDQUxFX1RPT19CSUc6IHRoZSBwcmVjaXNpb24gb2YgdGhlIHN5c3RlbSBjbG9jayBpcwotICogICAgICAgICAgICAgbm90Ci0gKiAgICAgICAgICAgICBjb21wbGlhbnQgd2l0aCB0aGUgaW5wdXQgdGltZXNjYWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2Nsb2NrR2V0VGltZShNNE9TQV9UaW1lKiBwVGltZSwgTTRPU0FfVUludDMyIHRpbWVzY2FsZSkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfaGk7Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2xvOwotICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9saDsKLSAgICBNNE9TQV9VSW50MzIgZmFjdG9yOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX2Nsb2NrR2V0VGltZVx0XHRNNE9TQV9UaW1lKiAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZSwgdGltZXNjYWxlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBUaW1lLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nsb2NrR2V0VGltZTogcFRpbWUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHRpbWVzY2FsZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nsb2NrR2V0VGltZTogdGltZXNjYWxlIGlzIDAiKTsKLQotICAgIGZhY3RvciA9IDEwMDAwMDAgLyB0aW1lc2NhbGU7Ci0KLSAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCAmdHopID09IDApCi0gICAgewotICAgICAgICB1MzJfdGltZV9sbyA9ICh0di50dl9zZWMgJiAweEZGRkYpICogdGltZXNjYWxlOwotICAgICAgICB1MzJfdGltZV9oaSA9ICgoKHR2LnR2X3NlYyA+PiAxNikgJiAweEZGRkYpICogdGltZXNjYWxlKSArICgodTMyX3RpbWVfbG8gPj4gMTYpICYgMHhGRkZGKTsKLSAgICAgICAgdTMyX3RpbWVfbG8gJj0gMHhGRkZGOwotICAgICAgICB1MzJfdGltZV9sbyArPSB0di50dl91c2VjIC8gZmFjdG9yOwotICAgICAgICB1MzJfdGltZV9oaSArPSAoKHUzMl90aW1lX2xvID4+IDE2KSAmIDB4RkZGRik7Ci0gICAgICAgIHUzMl90aW1lX2xvICY9IDB4RkZGRjsKLSAgICAgICAgdTMyX3RpbWUgPSAoKHUzMl90aW1lX2hpICYgMHg3RkZGKSA8PCAxNikgfCB1MzJfdGltZV9sbzsKLSAgICB9Ci0KLSAgICAvKiBNNE9TQV9UaW1lIGlzIHNpZ25lZCwgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbWF4IHZhbHVlKi8KLSAgICBpZiAodTMyX3RpbWUgPiBNNE9TQV9JTlQzMl9NQVgpCi0gICAgewotICAgICAgICB1MzJfdGltZSA9IHUzMl90aW1lIC0gTTRPU0FfSU5UMzJfTUFYOwotICAgIH0KLQotICAgICpwVGltZSA9IChNNE9TQV9UaW1lKXUzMl90aW1lOwotCi0gICAgaWYoIHRpbWVzY2FsZSA+IDEwMDAwICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzEyZGI1ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlQ29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUNvbW1vbi5jCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgY29tbW9uIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB1c2VkIGJ5IGJvdGggdGhlIGZpbGUgd3JpdGVyCi0gKiAgICAgICAgICAgICAgIGFuZCBmaWxlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgVVNFX1NUQUdFRlJJR0hUX0NPREVDUwotI2Vycm9yICJVU0VfU1RBR0VGUklHSFRfQ09ERUNTIGlzIG5vdCBkZWZpbmVkIgotI2VuZGlmIC8qVVNFX1NUQUdFRlJJR0hUX0NPREVDUyovCi0KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmIC8qVVRGX0NPTlZFUlNJT04qLwotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBwcm92aWRlZCBVUkwgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCi0gKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cmVkLCB0aGUgY29udGV4dCBpcyBzZXQgdG8gTlVMTC4KLSAqIEBwYXJhbSAgICAgIGNvcmVfaWQ6IChJTikgQ29yZSBJRCBvZiB0aGUgY2FsbGVyIChNNE9TQV9GSUxFX1JFQURFUiBvciBNNE9TQV9GSUxFX1dSSVRFUikKLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIHVybDogKElOKSBVUkwgb2YgdGhlIGlucHV0IGZpbGUKLSAqIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotICogICAgICAgICAgICAgYXBwbGljYXRpb24vcHJvY2VzcwotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX1VJbnQxNiBjb3JlX2lkLCBNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBwVXJsLCBNNE9TQV9GaWxlTW9kZUFjY2VzcyBmaWxlTW9kZUFjY2VzcykKLXsKLQotICAgIE00T1NBX0ludDMyIGkgICAgICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgaU1vZGUgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlTYXZlUG9zICAgID0gMDsKLQotICAgIE00T1NBX0NoYXIgIG1vZGVbNF0gICAgICAgICAgICA9ICIiOwotICAgIE00T1NBX0NoYXIqIHBSZWFkU3RyaW5nICAgICAgICA9IChNNE9TQV9DaGFyKikiciI7Ci0gICAgTTRPU0FfQ2hhciogcFdyaXRlU3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJ3IjsKLSAgICBNNE9TQV9DaGFyKiBwQXBwZW5kU3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJhIjsKLSAgICBNNE9TQV9DaGFyKiBwQmluYXJ5U3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJiIjsKLSAgICBNNE9TQV9DaGFyKiBwUGx1c1N0cmluZyAgICAgICAgPSAoTTRPU0FfQ2hhciopIisiOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBGSUxFKiBwRmlsZUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ZpbGVDb250ZXh0ICpwRmlsZUNvbnRleHQgICAgPSBNNE9TQV9OVUxMOwotCi0KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotICAgIC8qRkI6IHRvIHRlc3QgdGhlIFVURjE2LT5VVEY4IGNvbnZlcnNpb24gaW50byBWaWRlbyBBcnRpc3QqLwotICAgIC8qQ29udmVydCB0aGUgVVJMIGZyb20gVVRGMTYgdG8gVVRGOCovCi0gICAgTTRPU0FfVm9pZCogdGVtcENvbnZlcnNpb25CdWY7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBDb252ZXJzaW9uU2l6ZSA9IDEwMDA7Ci0KLSAgICB0ZW1wQ29udmVyc2lvbkJ1ZiA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2ModGVtcENvbnZlcnNpb25TaXplICsxLCAwLCAiY29udmVyc2lvbiBidWYiKTsKLSAgICBpZih0ZW1wQ29udmVyc2lvbkJ1ZiA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIHdoZW4gYWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlclxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIE00T1NBX1RvVVRGOF9PU0FMKHBVcmwsIHRlbXBDb252ZXJzaW9uQnVmLCAmdGVtcENvbnZlcnNpb25TaXplKTsKLSAgICAoKE00T1NBX0NoYXIqKXRlbXBDb252ZXJzaW9uQnVmKVt0ZW1wQ29udmVyc2lvblNpemUgXSA9ICdcMCc7Ci0KLSAgICBwcmludGYoImZpbGUgb3BlbiAlc1xuIiwgdGVtcENvbnZlcnNpb25CdWYpOwotI2VuZGlmIC8qVVRGIENPTlZFUlNJT04qLwotCi0gICAgTTRPU0FfVFJBQ0UzXzQoIk00T1NBX2ZpbGVDb21tb25PcGVuXHRcdE00T1NBX1VJbnQxNiAlZFx0TTRPU0FfQ29udGV4dCogMHgleFx0IgotICAgICAgICAiTTRPU0FfQ2hhciogJXNcdGZpbGVNb2RlQWNjZXNzICVkIiwgY29yZV9pZCwgcENvbnRleHQsIHBVcmwsIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsICAgICAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogcFVybCAgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IGZpbGVNb2RlQWNjZXNzLCAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogZmlsZU1vZGVBY2Nlc3MgaXMgMCIpOwotCi0gICAgLyogUmVhZCBtb2RlIG5vdCBzZXQgZm9yIHRoZSByZWFkZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgIC8qIFJlYWQgbW9kZSBub3Qgc2V0IGZvciB0aGUgcmVhZGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAhKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVSZWFkIik7Ci0KLSAgICAvKiBNNE9TQWZpbGVSZWFkT3BlbiBjYW5ub3QgYmUgdXNlZCB3aXRoIFdyaXRlIGZpbGUgbW9kZSBhY2Nlc3MgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmIChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVdyaXRlIik7Ci0KLSAgICAvKiBBcHBlbmQgYW5kIENyZWF0ZSBmbGFncyBjYW5ub3QgYmUgdXNlZCB3aXRoIFJlYWQgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmIChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVBcHBlbmQiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZUNyZWF0ZSIpOwotCi0gICAgLyogV3JpdGUgbW9kZSBub3Qgc2V0IGZvciB0aGUgd3JpdGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1dSSVRFUiA9PSBjb3JlX2lkKSAmJiAhKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgIC8qIENyZWF0ZSBmbGFnIG5lY2Vzc2FyeSBmb3Igb3BlbmluZyBmaWxlICovCi0gICAgaWYgKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgJiYKLSAgICAgICAgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkmJihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQ3JlYXRlKSkKLSAgICB7Ci0gICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBXcml0ZVN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFBsdXNTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBBcHBlbmRTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFJlYWRTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBXcml0ZVN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkmJihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwoY29uc3QgY2hhciAqKXBQbHVzU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlSXNUZXh0TW9kZSkpCi0gICAgewotICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwQmluYXJ5U3RyaW5nLChzaXplX3QpMSk7Ci0gICAgfQotCi0gICAgLypPcGVuIHRoZSBmaWxlKi8KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0gICAgLypPcGVuIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKil0ZW1wQ29udmVyc2lvbkJ1ZiwgKGNvbnN0IGNoYXIgKiltb2RlKTsKLSAgICAvKkZyZWUgdGhlIHRlbXBvcmFyeSBkZWNvZGVkIGJ1ZmZlciovCi0gICAgZnJlZSh0ZW1wQ29udmVyc2lvbkJ1Zik7Ci0jZWxzZSAvKiBVVEZfQ09OVkVSU0lPTiAqLwotICAgIHBGaWxlSGFuZGxlciA9IGZvcGVuKChjb25zdCBjaGFyICopcFVybCwgKGNvbnN0IGNoYXIgKiltb2RlKTsKLSNlbmRpZiAvKiBVVEZfQ09OVkVSU0lPTiAqLwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVIYW5kbGVyKQotICAgIHsKLSAgICAgICAgc3dpdGNoKGVycm5vKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRU5PRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTk9UX0ZPVU5ELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRmlsZSBub3QgZm91bmQ6ICVzIiwgcFVybCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEVBQ0NFUzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX0xPQ0tFRCwgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBQZXJtaXNzaW9uIGRlbmllZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX0xPQ0tFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgRUlOVkFMOgotICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogSW52YWxpZCBBcmd1bWVudCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICAgfQotICAgICAgICBjYXNlIEVNRklMRToKLSAgICAgICAgIGNhc2UgRU5PU1BDOgotICAgICAgICBjYXNlIEVOT01FTToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBUb28gbWFueSBvcGVuIGZpbGVzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVDb21tb25PcGVuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBmaWxlIGNvbnRleHQgKi8KLSAgICBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uT3BlbjogZmlsZSBjb250ZXh0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0KQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjICAgICAgICA9IHBGaWxlSGFuZGxlcjsKLSAgICBwRmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlICAgID0gZmlsZU1vZGVBY2Nlc3M7Ci0gICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgICAgPSBTZWVrTm9uZTsKLSAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgICAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICAqIE5vdGU6IE5ldmVyIHVzZSB0aGlzIGV4cHJlc3Npb24gImkgPSAodmFsdWUxID09IHZhbHVlMikgPyB4OiB5OyIKLSAgICAgKiBiZWNhdXNlIHRoYXQgZG9lbnMndCBjb21waWxlIG9uIG90aGVyIHBsYXRmb3JtcyAoQURTIGZvciBleGFtcGxlKQotICAgICAqIFVzZTogaWYodmFsdWUxID09IHZhbHVlMikKLSAgICAgKiAgICAgICAgeyBpPSB4OyAuLmV0YwotICAgICAqLwotICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF9yZWFkID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NOb25lQWNjZXNzOwotCi0gICAgaWYgKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF9yZWFkID0gY29yZV9pZDsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IE00T1NBX2tEZXNjUmVhZEFjY2VzczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTRPU0FfRklMRV9XUklURVIgPT0gY29yZV9pZCkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlID0gY29yZV9pZDsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IE00T1NBX2tEZXNjV3JpdGVBY2Nlc3M7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gMDsKLQotICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgdG8gc3RvcmUgdGhlIFVSTCBzdHJpbmcgKi8KLSAgICBwRmlsZUNvbnRleHQtPnVybF9uYW1lID0gKE00T1NBX0NoYXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKChjb25zdCBjaGFyICopcFVybCkrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaWQsIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFVSTCBuYW1lIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT51cmxfbmFtZSkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShwRmlsZUhhbmRsZXIpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBNNE9TQV9jaHJOQ29weShwRmlsZUNvbnRleHQtPnVybF9uYW1lLCBwVXJsLCBzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKSsxKTsKLQotICAgIC8qIEdldCB0aGUgZmlsZSBuYW1lICovCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKHBVcmwsICZwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKLSAgICAgICAgZnJlZShwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKLSAgICAgICAgZnJlZShwRmlsZUNvbnRleHQpOwotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVPcGVuKCYocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCksIDEpOyAvKiBBbGxvY2F0ZSB0aGUgc2VtYXBob3JlICovCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLQotI2lmZGVmIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MKLSAgICAvLyBXb3JrYXJvdW5kIGZvciBmaWxlIHN5c3RlbSBidWcgb24gU3RpbmdyYXkvSG9uZXljb21iIHdoZXJlIGEgZmlsZSByZS1jcmVhdGVkIHdpbGwga2VlcAotICAgIC8vIHRoZSBvcmlnaW5hbCBmaWxlJ3Mgc2l6ZSBmaWxsZWQgd2l0aCAwcy4gRG8gbm90IHNlZWsgdG8gdGhlIGVuZCB0byBhdm9pZCBpbGwgZWZmZWN0cwotICAgIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpIHsKLSAgICAgICAgLyogR2V0IHRoZSBmaWxlIHNpemUgKi8KLSAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgICAgICBmc2VlayhwRmlsZUhhbmRsZXIsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qICAgIDItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgICAgICBpU2l6ZSA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSAgICAgICAgKi8KLSAgICAgICAgZnNlZWsocEZpbGVIYW5kbGVyLCBpU2F2ZVBvcywgU0VFS19TRVQpOy8qICAgIDQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlTaXplID0gMDsKLSAgICB9Ci0jZWxzZSAvKiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTICovCi0gICAgLyogR2V0IHRoZSBmaWxlIHNpemUgKi8KLSAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgZnNlZWsocEZpbGVIYW5kbGVyLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKiAgICAyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlKi8KLSAgICBpU2l6ZSA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSAgICAgICAgKi8KLSAgICBmc2VlayhwRmlsZUhhbmRsZXIsIGlTYXZlUG9zLCBTRUVLX1NFVCk7LyogICAgNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uICovCi0jZW5kaWYgLyogVVNFX1NUQUdFRlJJR0hUX0NPREVDUyAqLwotCi0KLQotICAgIC8qIFdhcm5pbmcgcG9zc2libGUgb3ZlcmZsb3cgaWYgdGhlIGZpbGUgaXMgaGlnaGVyIHRoYW4gMkdCeXRlcyAqLwotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gaVNpemU7Ci0KLSAgICAqcENvbnRleHQgPSBwRmlsZUNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIFVURjE2IHRvIFVURjgKLSAqIEBwYXJhbSAgICAgIHBCdWZmZXJJbjogKElOKSBVVEYxNiBpbnB1dCBwYXRoCi0gKiBAcGFyYW0gICAgICBwQnVmZmVyT3V0OiAoT1VUKSBVVEY4IG91dHB1dCBwYXRoCi0gKiBAcGFyYW0gICAgICBidWZmZXJPdXRTaXplOiAoSU4vT1VUKSBzaXplIG9mIHRoZSBvdXRwdXQgcGF0aAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogdGhlIG91dHB1dCBwYXRoIHNpemUgaXMgbm90IGVub3VnaCB0byBjb250YWluCi0gKiAgICAgICAgICAgICAgIHRoZSBkZWNvZGVkIHBhdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLU00T1NBX0VSUiBNNE9TQV9Ub1VURjhfT1NBTCAoTTRPU0FfVm9pZCAgICpwQnVmZmVySW4sIE00T1NBX1VJbnQ4ICAqcEJ1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKmJ1ZmZlck91dFNpemUpCi17Ci0gICAgTTRPU0FfVUludDE2IGk7Ci0gICAgd2NoYXJfdCAgICAgICp3X3N0ciA9ICh3Y2hhcl90ICopIHBCdWZmZXJJbjsKLSAgICBNNE9TQV9VSW50MzIgbGVuLCBzaXplX25lZWRlZCwgc2l6ZV9naXZlbjsKLSAgICBpZiAocEJ1ZmZlckluID09IE5VTEwpCi0gICAgewotICAgICAgICAqcEJ1ZmZlck91dD1OVUxMOwotICAgICAgICAqYnVmZmVyT3V0U2l6ZT0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBsZW4gICAgICAgICA9IHdjc2xlbih3X3N0cik7Ci0gICAgICAgIHNpemVfbmVlZGVkID0gbGVuKzE7Ci0gICAgICAgIHNpemVfZ2l2ZW4gID0gKmJ1ZmZlck91dFNpemU7Ci0KLSAgICAgICAqYnVmZmVyT3V0U2l6ZT1zaXplX25lZWRlZDsKLSAgICAgICAgaWYgKHNpemVfZ2l2ZW4gPCBzaXplX25lZWRlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQnVmZmVyT3V0W2ldPShNNE9TQV9VSW50OCl3X3N0cltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBCdWZmZXJPdXRbbGVuXT0wOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotI2VuZGlmIC8qVVRGIENPTlZFUlNJT04qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vblNlZWsoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwRmlsZVBvcykKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfY3VycmVudDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19zZWVrOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX251bGwgPSAwOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX25lZ191biA9IC0xOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX2ZpbGVfc2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk00T1NBX2ZpbGVDb21tb25TZWVrXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSAlZFx0TTRPU0FfRmlsZVBvc2l0aW9uKiAweCV4IiwKLSAgICAgICAgcENvbnRleHQsIHNlZWtNb2RlLCBwRmlsZVBvcyk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZVBvcywgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLQotICAgIGZwb3NfZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT5maWxlX3NpemU7Ci0KLSAgICBpZihTZWVrUmVhZCA9PSBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlaykKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbjsKLSAgICB9Ci0gICAgZWxzZSBpZihTZWVrV3JpdGUgPT0gcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWspCi0gICAgewotICAgICAgICBmcG9zX2N1cnJlbnQgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmcG9zX2N1cnJlbnQgPSAwOwotICAgIH0KLQotICAgIHN3aXRjaChzZWVrTW9kZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtDdXJyZW50OgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nOgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3MgLSBmcG9zX2N1cnJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrRW5kOgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3MgKyBmcG9zX2ZpbGVfc2l6ZSAtIGZwb3NfY3VycmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZwb3Nfc2Vla19mcm9tX2JlZ2lubmluZyA9IGZwb3NfY3VycmVudCArIGZwb3Nfc2VlazsKLQotICAgIGlmKGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCBmcG9zX3NlZWssIFNFRUtfQ1VSKSAhPSAwKQotICAgIHsKLSAgICAgICAgc3dpdGNoKGVycm5vKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRUlOVkFMOgotICAgICAgICAgICAgewotICAgICAgICAgICAgLyogbWVhbmluZyB0aGUgdmFsdWUgZm9yIG9yaWdpbiBpcyBpbnZhbGlkIG9yIHRoZSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSBvZmZzZXQgaXMgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRUJBREY6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOy8qIGZpbGUgaGFuZGxlIGlzIGludmFsaWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcmV0dXJuZWQgcG9zaXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlICovCi0gICAgKnBGaWxlUG9zID0gZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nOwotCi0gICAgLyogU0VFSyBkb25lLCByZXNldCBlbmQgb2YgZmlsZSB2YWx1ZSAqLwotICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX0ZBTFNFOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdG8gY2xvc2UgdGhlIGZpbGUgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlci93cml0ZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9VSW50MTYgY29yZV9pZCwgTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTMyX2Vycl9jb2RlPTA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkNsb3NlXHRNNE9TQV9VSW50MTYgJWRcdE00T1NBX0NvbnRleHQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgcENvbnRleHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LAotICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkNsb3NlOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKLSAgICBwRmlsZUNvbnRleHQtPnVybF9uYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUocEZpbGVDb250ZXh0LT5maWxlX25hbWUpOwotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIGkzMl9lcnJfY29kZSA9IGZjbG9zZShwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0KLSAgICBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyA9IE00T1NBX05VTEw7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlQ2xvc2UocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7LyogZnJlZSB0aGUgc2VtYXBob3JlICovCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQpOwotCi0gICAgaWYgKGkzMl9lcnJfY29kZSAhPSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlQ29tbW9uQ2xvc2UiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgKGFzc29jaWF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBjb250ZXh0KQotICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBhdHRyaWJ1dGU6IChPVVQpIFRoZSBmaWxlIGF0dHJpYnV0ZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpCi17Ci0KLSAgICBNNE9TQV9GaWxlQ29udGV4dCogZmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIHN0cnVjdCBzdGF0IFRoZVN0YXQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZVx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICJNNE9TQV9GaWxlQXR0cmlidXRlKiAweCV4IiwgcENvbnRleHQsIHBBdHRyaWJ1dGUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEF0dHJpYnV0ZSwgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZSIpOwotCi0gICAgaWYoc3RhdCgoY2hhciopZmlsZUNvbnRleHQtPnVybF9uYW1lLCAmVGhlU3RhdCkgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X2N0aW1lOwotICAgIHBBdHRyaWJ1dGUtPmxhc3RBY2Nlc3NEYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X2F0aW1lOwotICAgIHBBdHRyaWJ1dGUtPm1vZGlmaWVkRGF0ZS50aW1lID0gKE00T1NBX1RpbWUpVGhlU3RhdC5zdF9tdGltZTsKLQotICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS50aW1lU2NhbGUgPSAxOwotICAgIHBBdHRyaWJ1dGUtPmxhc3RBY2Nlc3NEYXRlLnRpbWVTY2FsZSA9IDE7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWVTY2FsZSA9IDE7Ci0KLSAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnJlZmVyZW5jZVllYXIgPSAxOTcwOwotCi0gICAgcEF0dHJpYnV0ZS0+bW9kZUFjY2VzcyA9IGZpbGVDb250ZXh0LT5hY2Nlc3NfbW9kZTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZmlsZSBVUkwgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTikgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgdXJsOiAoT1VUKSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVSTCAoYWxsb2NhdGVkIGJ5Ci0gKiAgICAgICAgICAgICBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldFVSTChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiogcFVybCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyICAgIHVpTGVuZ3RoOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRVUkxcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfQ2hhcioqIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFVybCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgdWlMZW5ndGggPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwRmlsZUNvbnRleHQtPnVybF9uYW1lKSsxOwotCi0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSB0byBzdG9yZSB0aGUgdXJsX25hbWUgKi8KLSAgICAqcFVybCA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2ModWlMZW5ndGgsIE00T1NBX0ZJTEVfQ09NTU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uR2V0VVJMOiB1cmwiKTsKLSAgICBpZihNNE9TQV9OVUxMID09ICpwVXJsKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uR2V0VVJMIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBNNE9TQV9jaHJOQ29weSgqcFVybCwgcEZpbGVDb250ZXh0LT51cmxfbmFtZSwgdWlMZW5ndGgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lIGFzc29jaWF0ZWQKLSAqICAgICAgICAgICAgIHRvIHRoZSBpbnB1dCBVUkwuCi0gKiBAbm90ZSAgICAgICBUaGUgdXNlciBzaG91bGQgbm90IGZvcmdldCB0byBkZWxldGUgdGhlIG91dHB1dCBzdHJpbmcgdXNpbmcKLSAqICAgICAgICAgICAgIE00T1NBX3N0ckRlc3Ryb3kKLSAqIEBwYXJhbSAgICAgIHBVcmw6ICAgICAgICAgICAgKElOKSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVSTAotICogQHBhcmFtICAgICAgcEZpbGVOYW1lOiAgICAoT1VUKSBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTC4gSXQgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKE00T1NBX0NoYXIqIHBVcmwsIE00T1NBX0NoYXIqKiBwRmlsZU5hbWUpCi17Ci0gICAgTTRPU0FfSW50MzIgaSAgICAgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpVXJsTGVuICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgRmlsZU5hbWVMZW4gPSAwOwotCi0gICAgTTRPU0FfQ2hhciogcHRyVXJsICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfQ2hhciogcHRyRmlsZW5hbWUgICAgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRVUkxcdE00T1NBX0NoYXIqICVzXHRNNE9TQV9DaGFyKiogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXJsLCBwRmlsZU5hbWUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZU5hbWUsICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IHBGaWxlTmFtZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcEZpbGVOYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIC8qUGFyc2UgVVJMKi8KLSAgICBpVXJsTGVuID0gc3RybGVuKChjb25zdCBjaGFyICopcFVybCk7Ci0gICAgZm9yKGk9aVVybExlbi0xOyBpPj0wOyBpLS0pCi0gICAgewotICAgICAgICBpZiAocFVybFtpXSAhPSAnXFwnICYmIHBVcmxbaV0gIT0gJy8nKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlTmFtZUxlbisrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7IC8qIGZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBuYW1lICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdHJGaWxlbmFtZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKEZpbGVOYW1lTGVuKzEsIE00T1NBX0ZJTEVfQ09NTU9OLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZTogRmlsZW5hbWUgc3RyaW5nIik7Ci0gICAgaWYgKHB0ckZpbGVuYW1lID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcHRyVXJsID0gcFVybCArIChpVXJsTGVuIC0gRmlsZU5hbWVMZW4pOwotICAgIE00T1NBX2Nock5Db3B5KHB0ckZpbGVuYW1lLCBwdHJVcmwsIEZpbGVOYW1lTGVuKzEpOwotCi0gICAgKnBGaWxlTmFtZSA9IHB0ckZpbGVuYW1lOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBhNzJmNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyLmMKLSAqIEBhdXRob3IgICAgICAgQ2VkcmljIExlY291dHJlIChjZWRyaWMubGVjb3V0cmVAcGhpbGlwcy5jb20pCi0gKiAgICAgICAgICAgICAgIExhdXJlbnQgRmF5IChsYXVyZW50LmZheUBwaGlsaXBzLmNvbSkKLSAqIEBwYXIgT3JnOiAgICAgUGhpbGlwcyBEaWdpdGFsIFN5c3RlbXMgTGFib3JhdG9yaWVzIC0gUGFyaXMgKFBEU0wtUCkKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHJlYWQgYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCi0qIEBwYXJhbSAgICAgIGNvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSogQHBhcmFtICAgICAgdXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCi0qIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0qIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotKiAgICAgICAgICAgICBmaWxlCi0qIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCi0qIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2ZpbGVSZWFkT3BlbiA6IHBDID0gMHglcCAgZmQgPSAweCVwICBtb2RlID0gJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcEZpbGVEZXNjcmlwdG9yLCBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfRklMRV9SRUFERVIsIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZURlc2NyaXB0b3IsIGZpbGVNb2RlQWNjZXNzKTsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0qICAgICAgICAgICAgIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKSBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScKLSogICAgICAgICAgICAgcG9pbnRlci4KLSogQG5vdGUgICAgICAgSWYgJ3NpemUnIGJ5dGUgY2Fubm90IGJlIHJlYWQgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIsICdzaXplJwotKiAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgdXBkYXRlZCB0byBtYXRjaCB0aGUgY29ycmVjdAotKiBAbm90ZSAgICAgICBudW1iZXIgb2YgcmVhZCBieXRlcy4KLSogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotKiBAcGFyYW0gICAgICBidWZmZXI6IChPVVQpIERhdGEgcG9pbnRlciBvZiB0aGUgcmVhZCBkYXRhCi0qIEBwYXJhbSAgICAgIHNpemU6IChJTi9PVVQpIFNpemUgb2YgdGhlIGRhdGEgdG8gcmVhZCAoaW4gYnl0ZXMpCi0qIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0qIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgIE00V0FSX05PX0RBVEFfWUVUOiB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSB0byBmaWxsIHRoZSAnZGF0YScKLSogICAgICAgICAgICAgYnVmZmVyLCBzbyB0aGUgc2l6ZSBwYXJhbWV0ZXIgaGFzIGJlZW4gdXBkYXRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFNpemUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0VSUiAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0ludDMyICAgIHVpU2l6ZVJlYWQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVJlYWREYXRhIDogZGF0YSA9IDB4JXAgIHNpemUgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgKE00T1NBX05VTEwgIT0gcFNpemUpID8gKCpwU2l6ZSkgOiAwKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGRhdGEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogZGF0YSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFNpemUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBwU2l6ZSBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVSZWFkRGF0YTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykgLyogcmVhZCB3cml0ZSAqLwotICAgIHsKLSAgICAgICAgdWlTaXplUmVhZCA9IGZyZWFkKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgKnBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICAgICAgaWYoLTEgPT0gdWlTaXplUmVhZCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaGFuZGxlIGlzIGludmFsaWQsIG9yIHRoZSBmaWxlIGlzIG5vdCBvcGVuIGZvciByZWFkaW5nLCBvciB0aGUgZmlsZSBpcyBsb2NrZWQgKi8KLSAgICAgICAgICAgICpwU2l6ZSA9IDA7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiArIHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICBpZiAoKE00T1NBX1VJbnQzMil1aVNpemVSZWFkIDwgKnBTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYocEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgIT0gU2Vla1JlYWQpCi0gICAgewotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbikpOwotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVJlYWREYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtSZWFkOwotICAgIH0KLQotICAgIC8qIFJlYWQgZGF0YSAqLwotICAgIHVpU2l6ZVJlYWQgPSBmcmVhZChkYXRhLCBzaXplb2YoTTRPU0FfQ2hhciksICpwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0gICAgaWYoLTEgPT0gdWlTaXplUmVhZCkKLSAgICB7Ci0gICAgICAgIC8qIGhhbmRsZSBpcyBpbnZhbGlkLCBvciB0aGUgZmlsZSBpcyBub3Qgb3BlbiBmb3IgcmVhZGluZywKLSAgICAgICAgIG9yIHRoZSBmaWxlIGlzIGxvY2tlZCAqLwotICAgICAgICAqcFNpemUgPSAwOwotICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uICsgdWlTaXplUmVhZDsKLSAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpdWlTaXplUmVhZCA8ICpwU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLQotICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgfQotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24gaW4gdGhlIGNvcmUgZmlsZQotICogICAgICAgICAgICAgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4gVGhlIHBvc2l0aW9uIGlzIHJlbGF0ZWQgdG8KLSAqICAgICAgICAgICAgIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcsIGZyb20KLSAqICAgICAgICAgICAgIHRoZSBlbmQgb3IgZnJvbSB0aGUgY3VycmVudCBwb3N0aW9uLiBUbyBzdXBwb3J0IGxhcmdlIGZpbGUKLSAqICAgICAgICAgICAgIGFjY2VzcyAobW9yZSB0aGFuIDJHQnl0ZXMpLCB0aGUgcG9zaXRpb24gaXMgcHJvdmlkZWQgb24gYSA2NAotICogICAgICAgICAgICAgYml0cy4KLSAqIEBub3RlICAgICAgIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCi0gKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBtdXN0IG5vdCBjaGFuZ2UuIEVsc2UgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgIHBvc2l0aW9uIHBvaW50ZXIgbXVzdCBiZSB1cGRhdGVkLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWsoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVSZWFkU2VlayA6IG1vZGUgPSAlZCAgcG9zID0gJWx1Iiwgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQb3NpdGlvbiAhPSBNNE9TQV9OVUxMKSA/ICgqcFBvc2l0aW9uKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gc2Vla01vZGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBzZWVrTW9kZSBpcyAwIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFBvc2l0aW9uLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBwUG9zaXRpb24gaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlUmVhZFNlZWs6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgIHsKLSAgICAgICAgIE00T1NBX1VJbnQzMiAgICBTZWVrTW9kZU9wdGlvbjsKLSAgICAgICAgIC8qIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgICAgIGlmIChNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19TRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrRW5kID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfRU5EOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19DVVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfZmlsZVJlYWRTZWVrOiBFTkQgV0lUSCBFUlJPUiAhISEgKENPTlZFUklPTiBFUlJPUiBGT1IgVEhFIFNFRUsgTU9ERSkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsICpwUG9zaXRpb24sIFNlZWtNb2RlT3B0aW9uKTsKLSAgICAgICAgaWYoZXJyICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgIGVycj0oKE00T1NBX1VJbnQzMikoTTRfRVJSKTw8MzApKygoKE00T1NBX0ZJTEVfV1JJVEVSKSYweDAwM0ZGRik8PDE2KSsoTTRPU0FfSW50MTYpKGVycik7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRTZWVrIGVycm9yOiV4IixlcnIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrUmVhZCkKLSAgICB7Ci0KLSAgICAgICAgLyogZnNlZWsgdG8gdGhlIGxhc3QgcmVhZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pKTsKLSAgICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVSZWFkRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrUmVhZDsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgc2Vla01vZGUsIHBQb3NpdGlvbik7Ci0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlUmVhZERhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9ICpwUG9zaXRpb247Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBjbG9zZSB0aGUgZmlsZQotICogICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUgICAgICAgVGhlIGNvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRDbG9zZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2UgOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKE00T1NBX0ZJTEVfV1JJVEVSID09IHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9GSUxFX1JFQURFUiwgcENvbnRleHQpOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byByZXR1cm4gdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgJ3ZhbHVlJyBtdXN0IGJlIGNhc3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHJlbGF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBvcHRpb25JRCBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weQotICogICAgICAgICAgICAgdGhpcyBmaWVsZCB0byBpdHMgaW50ZXJuYWwgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgcE9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHBPcHRpb25WYWx1ZTogKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1dSSVRFX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gMCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IG9wdGlvbklEIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwT3B0aW9uVmFsdWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHBPcHRpb25WYWx1ZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfUkVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9XUklURV9PTkxZLCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9QT1NJVElPTiA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb247Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9QT1NJVElPTiovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfSVNfRU9GID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRjoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfQm9vbCogYklzRW5kT2ZGaWxlID0gKE00T1NBX0Jvb2wqKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpiSXNFbmRPZkZpbGUgPSBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YqLwotCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNhdmVQb3MgICAgPSAwOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNpemUgICAgICAgID0gMDsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQnVnZml4OiB1cGRhdGUgdGhlIGZpbGUgc2l6ZS4KLSAgICAgICAgICAgICogV2hlbiBhIGZpbGUgaXMgaW4gcmVhZCBtb2RlLCBtYXkgYmUgYW5vdGhlciBhcHBsaWNhdGlvbiBpcyB3cml0aW5nIGluLgotICAgICAgICAgICAgKiBTbywgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgLyoxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKjItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgICAgIGlTaXplID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgICAgICAvKjMtIENoZWNrIHRoZSBmaWxlIHNpemUqLwotICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGlTYXZlUG9zLCBTRUVLX1NFVCk7ICAgIC8qNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uKi8KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gaVNpemU7Ci0KLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX0FUVFJJQlVURSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlQXR0cmlidXRlKilwT3B0aW9uVmFsdWUpOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfQVRUUklCVVRFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfVVJMID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRVUkw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKHBDb250ZXh0LCAoTTRPU0FfQ2hhcioqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfVVJMKi8KLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZExvY2tNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICAqKE00T1NBX1VJbnQzMiopcE9wdGlvblZhbHVlID0gcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIik7Ci0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbiAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSkKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBzZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0gKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQKLSAqICAgICAgICAgICAgIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICB2YWx1ZTogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBvcHRpb25JRCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfUkVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19XUklUQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9SRUFEX09OTFksICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlPSAoTTRPU0FfVUludDMyKSooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdmYzE3My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5jCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgd3JpdGVyIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byB3cml0ZSBpbiBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSAqIEBwYXJhbSAgICAgIHBVcmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTE9DS0VEOiB0aGUgZmlsZSBpcyBsb2NrZWQgYnkgYW4gb3RoZXIKLSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVPcGVuKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9maWxlV3JpdGVPcGVuIDogcEMgPSAweCVwICBmZCA9IDB4JXAgIG1vZGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFVybCwgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX0ZJTEVfV1JJVEVSLCBwQ29udGV4dCwgcFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1vZGVBY2Nlc3MpOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlICdzaXplJyBieXRlcyBzdG9yZWQgYXQgJ2RhdGEnIG1lbW9yeQotICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgc2VsZWN0ZWQgYnkgaXRzIGNvbnRleHQuCi0gKiBAbm90ZSAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICBtZW1vcnkgZm9yICdkYXRhJyBwYXJhbWV0ZXIuCi0gKiBAbm90ZSAgICAgICBNb3Jlb3ZlciB0aGUgZGF0YSBwb2ludGVyIG11c3QgYmUgYWxsb2NhdGVkIHRvIHN0b3JlIGF0IGxlYXN0Ci0gKiAgICAgICAgICAgICAnc2l6ZScgYnl0ZXMuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgYnVmZmVyOiAoSU4pIERhdGEgcG9pbnRlciBvZiB0aGUgd3JpdGUgZGF0YQotICogQHBhcmFtICAgICAgc2l6ZTogKElOKSBTaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlIChpbiBieXRlcykKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVNpemUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpU2l6ZVdyaXRlOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVXcml0ZURhdGEgOiBkYXRhID0gMHglcCAgc2l6ZSA9ICVsdSIsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVNpemUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZGF0YSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBkYXRhIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSB1aVNpemUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHVpU2l6ZSBpcyAwIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyICAgIFdyaXRlU2l6ZTsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgV3JpdGVTaXplID0gZndyaXRlKCh2b2lkICopZGF0YSwxLCB1aVNpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICAgICAgaWYoV3JpdGVTaXplICE9IHVpU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyID0gKChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShXcml0ZVNpemUpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVXcml0ZURhdGEgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZmZsdXNoKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgICAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiArIFdyaXRlU2l6ZTsKLQotICAgICAgICAvKiBVcGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICBpZihwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID4gcEZpbGVDb250ZXh0LT5maWxlX3NpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYocEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgIT0gU2Vla1dyaXRlKQotICAgIHsKLSAgICAgICAgLyogZnNlZWsgdG8gdGhlIGxhc3QgcmVhZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgJihwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uKSk7Ci0KLSAgICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLSAgICAgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVXcml0ZURhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrV3JpdGU7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgZGF0YSAqLwotICAgIHVpU2l6ZVdyaXRlID0gZndyaXRlKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgdWlTaXplLCBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0KLSAgICBpZih1aVNpemVXcml0ZSA9PSAoTTRPU0FfVUludDMyKS0xKQotICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIC8qIEFuIGVycm9yIG9jY3VyZWQgKi8KLQotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVXcml0ZURhdGE6IGZ3cml0ZSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uICsgdWlTaXplV3JpdGU7Ci0KLSAgICAvKiBVcGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgIGlmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPiBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLSAgICB9Ci0KLSAgICBpZigoTTRPU0FfVUludDMyKXVpU2l6ZVdyaXRlIDwgdWlTaXplKQotICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZVdyaXRlRGF0YSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlCi0gKiAgICAgICAgICAgICB3cml0ZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpLiBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0bwotICogICAgICAgICAgICAgdGhlIHNlZWtNb2RlIHBhcmFtZXRlciBpdCBjYW4gYmUgZWl0aGVyIGZyb20gdGhlIGJlZ2lubmluZywKLSAqICAgICAgICAgICAgIGZyb20gdGhlIGVuZCBvciBmcm9tIHRoZSBjdXJyZW50IHBvc3Rpb24uIFRvIHN1cHBvcnQgbGFyZ2UgZmlsZQotICogICAgICAgICAgICAgYWNjZXNzIChtb3JlIHRoYW4gMkdCeXRlcyksIHRoZSBwb3NpdGlvbiBpcyBwcm92aWRlZCBvbiBhIDY0Ci0gKiAgICAgICAgICAgICBiaXRzLgotICogQG5vdGUgICAgICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIGluIHRoZSBmaWxlIG11c3Qgbm90IGNoYW5nZS4gRWxzZSB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCi0gKiAgICAgICAgICAgICBtdXN0IGJlIHVwZGF0ZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVXcml0ZVNlZWsgOiBtb2RlID0gJWQgIHBvcyA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSwgKE00T1NBX05VTEwgIT0gcFBvc2l0aW9uKSA/ICgqcFBvc2l0aW9uKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gc2Vla01vZGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBzZWVtTW9kZSBpcyAwIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFBvc2l0aW9uLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBwUG9zaXRpb24gaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYgKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykgLyogcmVhZCB3cml0ZSAqLwotICAgIHsKLSAgICAgICAgIE00T1NBX1VJbnQzMiAgICBTZWVrTW9kZU9wdGlvbjsKLSAgICAgICAgLypUaGUgcG9zaXRpb24gZm9yIHRoZSBzZWVrIG1vZGUgYmV0d2VlbiB0aGUgU0hQIGFuZCB0aGUgT1NBbCBwYXJ0IGFyZSBkaWZmZXJlbnQgKi8KLSAgICAgICAgaWYgKE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX1NFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtFbmQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19FTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0NVUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9maWxlV3JpdGVTZWVrOiBFTkQgV0lUSCBFUlJPUiAhISEgKENPTlZFUklPTiBFUlJPUiBGT1IgVEhFIFNFRUsgTU9ERSkgIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCpwUG9zaXRpb24sU2Vla01vZGVPcHRpb24pOwotICAgICAgICBpZihlcnIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyPSgoTTRPU0FfVUludDMyKShNNF9FUlIpPDwzMCkrKCgoTTRPU0FfRklMRV9XUklURVIpJjB4MDAzRkZGKTw8MTYpKyhNNE9TQV9JbnQxNikoZXJyKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlV3JpdGVTZWVrIGVycm9yOiV4IixlcnIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIHNlZWtNb2RlLCBwUG9zaXRpb24pOwotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlV3JpdGVTZWVrOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSAqcFBvc2l0aW9uOwotCi0gICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrV3JpdGU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byBjbG9zZSB0aGUgZmlsZQotICogICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUgICAgICAgVGhlIGNvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUNsb3NlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVdyaXRlQ2xvc2UgOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfRklMRV9XUklURVIsIHBDb250ZXh0KTsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyB0aGUgc3RyZWFtIGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRmx1c2goTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlRmx1c2ggOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRmx1c2g6IHBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUZsdXNoOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoZmZsdXNoKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKSAhPSAwKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byByZXR1cm4gdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotICogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotICogICAgICAgICAgICAgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgICd2YWx1ZScgbXVzdCBiZSBjYXN0IGFjY29yZGluZyB0byB0aGUgdHlwZSByZWxhdGVkIHRvIHRoZQotICogICAgICAgICAgICAgb3B0aW9uSUQKLSAqICAgICAgICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQKLSAqICAgICAgICAgICAgIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICB2YWx1ZTogKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1dSSVRFX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSAwLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwT3B0aW9uVmFsdWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBwT3Rpb25WYWx1ZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfV1JJVEVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLCBNNEVSUl9XUklURV9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVQb3NpdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb247Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfUE9TSVRJT04qLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICAgIGlmKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2F2ZVBvcyAgICA9IDA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNpemUgICAgICAgID0gMDsKLQotICAgICAgICAgICAgICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgIC8qMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgICAgICpwb3NpdGlvbiA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAvKjMtIENoZWNrIHRoZSBmaWxlIHNpemUqLwotICAgICAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCBpU2F2ZVBvcywgU0VFS19TRVQpOyAgICAvKjQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICAqcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldFVSTDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRVUkwgKHBDb250ZXh0LCAoTTRPU0FfQ2hhcioqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX0FUVFJJQlVURSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUocENvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1JFQURFUl9DT05URVhUID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0UmVhZGVyQ29udGV4dDoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgYWNjZXNzID0gcEZpbGVDb250ZXh0LT5hY2Nlc3NfbW9kZTsKLQotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKCEoYWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogTTRPU0Ffa0ZpbGVSZWFkIik7Ci0KLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMSghKGFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpLCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBNNE9TQV9rRmlsZVdyaXRlIik7Ci0KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSBNNE9TQV9GSUxFX1JFQURFUjsKLQotICAgICAgICAgICAgKnBPcHRpb25WYWx1ZSA9IHBDb250ZXh0OwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfUkVBREVSX0NPTlRFWFQqLwotCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICooTTRPU0FfVUludDMyKilwT3B0aW9uVmFsdWUgPSBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUKLSogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotKiAgICAgICAgICAgICBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0qICAgICAgICAgICAgICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQgdG8gaXRzIGludGVybmFsCi0qICAgICAgICAgICAgIHZhcmlhYmxlLgotKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0qIEBwYXJhbSAgICAgIHZhbHVlOiAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gb3B0aW9uSUQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1dSSVRFUiksCi0gICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwgTTRFUlJfUkVBRF9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlID0gKE00T1NBX1VJbnQzMikqKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZURlc2NNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gKE00T1NBX0ludDMyKSooTTRPU0FfSW50MzIqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfTXV0ZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmJlNmJiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICAgIE11dGV4IGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIG11dGV4Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0KLS8qIENvbnRleHQgZm9yIHRoZSBtdXRleCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIE00T1NBX1VJbnQzMiAgICAgY29yZUlEOyAgICAgICAgICAgICAgIC8qIG11dGV4IGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHB0aHJlYWRfbXV0ZXhfdCAgbXV0ZXg7ICAgICAgICAgICAgICAgIC8qIG11dGV4ICovCi0gICBwdGhyZWFkX3QgICAgICAgIHRocmVhZE93bmVySUQ7ICAgICAgICAvKiB0aHJlYWQgb3duZXIgaWRlbnRpZmlhbnQgKi8KLX0gTTRPU0FfTXV0ZXhDb250ZXh0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IG11dGV4LgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuZCBhbGxvY2F0ZXMgYSB1bmlxdWUgY29udGV4dC4gSXQncyB0aGUKLSAqICAgICAgICAgICAgIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMgY29udGV4dC4gSXQgbXVzdAotICogICAgICAgICAgICAgYmUgZnJlZWQgYnkgdGhlIE00T1NBX211dGV4Q2xvc2UgZnVuY3Rpb24uIFRoZSBjb250ZXh0IHBhcmFtZXRlcgotICogICAgICAgICAgICAgd2lsbCBiZSBzZW50IGJhY2sgdG8gYW55IE9TQUwgY29yZSBtdXRleCBmdW5jdGlvbnMgdG8gYWxsb3cKLSAqICAgICAgICAgICAgIHJldHJpZXZpbmcgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvcGVuZWQgbXV0ZXguCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDooT1VUKSBDb250ZXh0IG9mIHRoZSBjcmVhdGVkIG11dGV4Ci0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleE9wZW4oTTRPU0FfQ29udGV4dCogcENvbnRleHQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopTTRPU0FfTlVMTDsKLSAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHJpYnV0ZSA9IHsgMCB9OwotICAgIE00T1NBX0Jvb2wgb3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXgiLCBwQ29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhPcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfTXV0ZXhDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfTVVURVgsIChNNE9TQV9DaGFyKikiTTRPU0FfbXV0ZXhPcGVuOiBtdXRleCBjb250ZXh0Iik7Ci0KLSAgICBpZihNNE9TQV9OVUxMID09IHBNdXRleENvbnRleHQpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX211dGV4T3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXggYXR0cmlidXRlLiAqLwotICAgIGlmICggMCA9PSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCAmYXR0cmlidXRlICkgKQotICAgIHsKLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXggdHlwZS4gKi8KLSAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoICZhdHRyaWJ1dGUsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleC4gKi8KLSAgICAgICAgICAgIGlmICgwID09IHB0aHJlYWRfbXV0ZXhfaW5pdCggJnBNdXRleENvbnRleHQtPm11dGV4LCAmYXR0cmlidXRlICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wZW5lZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEZXN0cm95IHRoZSBtdXRleCBhdHRyaWJ1dGUuICovCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koICZhdHRyaWJ1dGUgKTsKLSAgICB9Ci0KLSAgICBpZighb3BlbmVkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQ09OVEVYVF9GQUlMRUQsICJNNE9TQV9tdXRleE9wZW46IE9TIG11dGV4IGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICBmcmVlKHBNdXRleENvbnRleHQpOwotICAgICAgICByZXR1cm4gTTRFUlJfQ09OVEVYVF9GQUlMRUQgOwotICAgIH0KLQotICAgIHBNdXRleENvbnRleHQtPmNvcmVJRCA9IE00T1NBX01VVEVYOwotCi0gICAgcE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCA9IDA7Ci0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dCkgcE11dGV4Q29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGxvY2tzIHRoZSBtdXRleC4gIkNvbnRleHQiIGlkZW50aWZpZXMgdGhlIG11dGV4LgotICogQG5vdGUgICAgICAgSWYgdGhlIG11dGV4IGlzIGFscmVhZHkgbG9ja2VkLCB0aGUgY2FsbGluZyB0aHJlYWQgYmxvY2tzIHVudGlsCi0gKiAgICAgICAgICAgICB0aGUgbXV0ZXggYmVjb21lcyBhdmFpbGFibGUgKGJ5IGNhbGxpbmcgTTRPU0FfbXV0ZXhVbmxvY2spIG9yCi0gKiAgICAgICAgICAgICAidGltZW91dCIgaXMgcmVhY2hlZC4gVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIG11dGV4Ci0gKiBAcGFyYW0gICAgICB0aW1lb3V0OihJTikgVGltZSBvdXQgaW4gbWlsbGlzZWNvbmRzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00V0FSX1RJTUVfT1VUOiB0aW1lIG91dCBpcyBlbGFwc2VkIGJlZm9yZSBtdXRleCBoYXMgYmVlbgotICogICAgICAgICAgICAgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfbXV0ZXhMb2NrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfVUludDMyIHRpbWVvdXQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopY29udGV4dDsKLSAgICBwdGhyZWFkX3QgICAgICAgICAgIGN1cnJlbnRUaHJlYWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZXN1bHQ7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICB0czsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIGxlZnQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfbXV0ZXhMb2NrXHRcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgY29udGV4dCwgdGltZW91dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleExvY2s6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihwTXV0ZXhDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfTVVURVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jayIpOwotCi0gICAgY3VycmVudFRocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotCi0gICAgaWYocE11dGV4Q29udGV4dCAtPnRocmVhZE93bmVySUQgPT0gY3VycmVudFRocmVhZCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBUaHJlYWQgdHJpZWQgdG8gbG9jayBhIG11dGV4IGl0IGFscmVhZHkgb3ducyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQgOwotICAgIH0KLQotICAgIC8qIExvY2sgdGhlIG11dGV4LiAqLwotICAgIGlmICggTTRPU0FfV0FJVF9GT1JFVkVSID09IHRpbWVvdXQpCi0gICAgewotICAgICAgICBpZiAoIDAgIT0gcHRocmVhZF9tdXRleF9sb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jazogT1MgbXV0ZXggd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgPSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLSAgICAgICAgd2hpbGUgKCAoIEVCVVNZID09IHJlc3VsdCApICYmICggMCA8IHRpbWVvdXQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRzLnR2X3NlYyAgPSAwOwotICAgICAgICAgICAgaWYgKDEgPD0gdGltZW91dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cy50dl9uc2VjID0gMTAwMDAwMDsKLSAgICAgICAgICAgICAgICB0aW1lb3V0IC09IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IHRpbWVvdXQgKiAxMDAwMDAwOwotICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFub3NsZWVwKCZ0cywgJmxlZnQpOwotICAgICAgICAgICAgcmVzdWx0ID0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKDAgIT0gcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRUJVU1kgPT0gcmVzdWx0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9USU1FX09VVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jazogT1MgbXV0ZXggd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gY3VycmVudFRocmVhZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCB1bmxvY2tzIHRoZSBtdXRleC4gVGhlIG11dGV4IGlzIGlkZW50aWZpZWQgYnkKLSAqICAgICAgICAgICAgIGl0cyBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICBUaGUgTTRPU0FfbXV0ZXhMb2NrIHVuYmxvY2tzIHRoZSB0aHJlYWQgd2l0aCB0aGUgaGlnaGVzdAotICogICAgICAgICAgICAgcHJpb3JpdHkgYW5kIG1hZGUgaXQgcmVhZHkgdG8gcnVuLgotICogQG5vdGUgICAgICAgTm8gaHlwb3RoZXNlcyBjYW4gYmUgbWFkZSBvbiB3aGljaCB0aHJlYWQgd2lsbCBiZSB1bi1ibG9ja2VkCi0gKiAgICAgICAgICAgICBiZXR3ZWVuIHRocmVhZHMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfbXV0ZXhVbmxvY2soTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKWNvbnRleHQ7Ci0gICAgcHRocmVhZF90IGN1cnJlbnRUaHJlYWQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhVbmxvY2tcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4VW5sb2NrOiBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTVVURVggIT0gcE11dGV4Q29udGV4dC0+Y29yZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhVbmxvY2siKTsKLQotICAgIGN1cnJlbnRUaHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKLQotICAgIGlmKHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgIT0gY3VycmVudFRocmVhZCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhVbmxvY2s6IFRocmVhZCB0cmllZCB0byB1bmxvY2sgYSBtdXRleCBpdCBkb2Vzbid0IG93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCA9IDAgOwotCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSBtdXRleCAoaWRlbnRpZnkgYnkgaXRzIGNvbnRleHQpLiBBZnRlcgotICogICAgICAgICAgICAgdGhpcyBjYWxsLCB0aGUgbXV0ZXggYW5kIGl0cyBjb250ZXh0IGlzIG5vIG1vcmUgdXNlYWJsZS4gVGhpcwotICogICAgICAgICAgICAgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBtZW1vcnkgcmVsYXRlZCB0byB0aGlzIG11dGV4LgotICogQG5vdGUgICAgICAgSXQgaXMgYW4gYXBwbGljYXRpb24gaXNzdWUgdG8gd2FycmFudCBubyBtb3JlIHRocmVhZHMgYXJlIGxvY2tlZAotICogICAgICAgICAgICAgb24gdGhlIGRlbGV0ZWQgbXV0ZXguCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIG11dGV4Ci0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleENsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0Kiljb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX211dGV4Q2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4Q2xvc2U6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihwTXV0ZXhDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfTVVURVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jayIpOwotCi0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7Ci0KLSAgICBmcmVlKCBwTXV0ZXhDb250ZXh0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9SYW5kb20uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjRkMDM5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFBTV19UcmFjZS5jCi0gKiBAYnJpZWYgICAgICAgIFRyYWNlIGZ1bmN0aW9uIGZvciB0cmFjZSBtYWNyb3MKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZ2l2ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbiB1c2VkCi0gKiAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKmZvciBwcmludGYgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4gLyogQU5TSSBDIG1hY3JvcyBhbmQgZGVmcyBmb3IgdmFyaWFibGUgYXJncyAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICBNNE9TQV9FUlIgTTRPU0FfcmFuZEluaXQoKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBudW1iZXIgZ2VuZXJhdG9yCi0gKiAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBiZWZvcmUgYW55IGNhbGwgdG8gTTRPU0FfcmFuZCgpCi0gKiAgICAgICAgICAgICAgIG5lZWQgdGhlIHN0ZGxpYiBhbmQgdGltZSBsaWJyYXJpZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCgpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLQotICAgIC8qIFdpbmRvd3MnIHJhbmQgaXMgcm90dGVuLCB0aGUgZmlyc3QgZ2VuZXJhdGVkIHZhbHVlIGFmdGVyIHRoZSBpbml0Ci0gICAgYWJvdmUgaXMgbm90IHJhbmRvbSBlbm91Z2gsIHNvIGxldCdzIHNoYWtlIHRoaW5ncyBhIGxpdHRsZS4uLiAqLwotCi0gICAgZm9yIChpPTA7IGk8MTAwOyBpKyspIHJhbmQoKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9yYW5kKE00T1NBX0ludDMyKiBvdXRfdmFsdWUsIE00T1NBX1VJbnQzMiBtYXhfdmFsdWUpCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAxIGFuZCBtYXhfdmFsdWUKLSAqICAgICAgICAgICAgICAgKGluY2x1c2l2ZSkgd2l0aCBhcHByb3hpbWF0ZWx5IGVxdWFsIHByb2JhYmlsaXR5LCBhbmQKLSAqICAgICAgICAgICAgICAgcmV0dXJucyB0aGlzIG51bWJlciBpbiBvdXRfdmFsdWUuIEZvciBpbnN0YW5jZSwgYSBtYXhfdmFsdWUKLSAqICAgICAgICAgICAgIG9mIDYgd2lsbCBzaW11bGF0ZSBhIGZhaXIgNi1zaWRlZCBkaWNlIHJvbGwuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgb3V0X3ZhbHVlIChPVVQpOiBvbiByZXR1cm4sIHBvaW50cyB0byByYW5kb20gcmVzdWx0Ci0gKiBAcGFyYW0gICAgICAgbWF4X3ZhbHVlIChJTik6IG1heCBleHBlY3RlZCB2YWx1ZQotICogQHJldHVybiAgICAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX3JhbmQoTTRPU0FfSW50MzIqIG91dF92YWx1ZSwgTTRPU0FfVUludDMyIG1heF92YWx1ZSkKLXsKLSAgICBpZiggKG91dF92YWx1ZSA9PSBNNE9TQV9OVUxMKSB8fCAobWF4X3ZhbHVlIDwgMSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAoKm91dF92YWx1ZSkgPSByYW5kKCk7Ci0gICAgLyogbm90aWNlIHRoaXMgYWxnb3JpdGhtIHdpbGwgb25seSB3b3JrIGZvciBtYXhfdmFsdWVzIHN1Y2ggdGhhdCB0aGUgbXVsdGlwbGljYXRpb24KLSAgICB3b24ndCBvdmVyZmxvdywgd2hpY2ggbWVhbnMgdGhhdCBtYXhfdmFsdWUgdHlwaWNhbGx5IHNob3VsZG4ndCBnbyBvdmVyIHRoZSByYW5nZSBvZgotICAgIGFuIEludDE2LiAqLwotICAgICgqb3V0X3ZhbHVlKSA9ICgoKCpvdXRfdmFsdWUpICogbWF4X3ZhbHVlKSAvICgoTTRPU0FfVUludDMyKVJBTkRfTUFYICsgMSkpICsgMTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1NlbWFwaG9yZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzYjU4NTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfU2VtYXBob3JlLmMKLSAqIEBicmllZiAgICAgICAgU2VtYXBob3JlIGZvciBXaW5kb3dzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHNlbWFwaG9yZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLQotI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLQotLyogQ29udGV4dCBmb3IgdGhlIHNlbWFwaG9yZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgTTRPU0FfVUludDMyICAgY29yZUlEOyAgICAgLyogc2VtYXBob3JlIGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHNlbV90ICAgICAgICAgIHNlbWFwaG9yZTsgIC8qIHNlbWFwaG9yZSAqLwotfSBNNE9TQV9TZW1hcGhvcmVDb250ZXh0OwotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgc2VtYXBob3JlIHdpdGggdGhlICJpbml0aWFsQ291bnRlciIKLSAqICAgICAgICAgICAgIHZhbHVlLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuZCBhbGxvY2F0ZXMgYSB1bmlxdWUgY29udGV4dC4gSXQncyB0aGUKLSAqICAgICAgICAgICAgIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMgY29udGV4dC4gSXQgbXVzdAotICogICAgICAgICAgICAgYmUgZnJlZWQgYnkgdGhlIE00T1NBX3NlbWFwaG9yZUNsb3NlIGZ1bmN0aW9uLiBUaGUgY29udGV4dAotICogICAgICAgICAgICAgcGFyYW1ldGVyIHdpbGwgYmUgc2VudCBiYWNrIHRvIGFueSBPU0FMIGNvcmUgc2VtYXBob3JlIGZ1bmN0aW9ucwotICogICAgICAgICAgICAgdG8gYWxsb3cgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZCBzZW1hcGhvcmUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihPVVQpIENvbnRleHQgb2YgdGhlIGNyZWF0ZWQgc2VtYXBob3JlCi0gKiBAcGFyYW0gICAgICBpbml0aWFsX2NvdW50OihJTikgSW5pdGlhbCBjb3VudGVyIG9mIHRoZSBzZW1hcGhvcmUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHByb3ZpZGVkIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVPcGVuKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5pdGlhbF9jb3VudCkKLXsKLSAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc2VtYXBob3JlT3Blblx0XHRNNE9TQV9Db250ZXh0KiAweCV4XHRNNE9TQV9VSW50MzIgIgotICAgICAgICAgICAgICAgICAgIiVkIiwgY29udGV4dCwgaW5pdGlhbF9jb3VudCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAqY29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfU2VtYXBob3JlQ29udGV4dCksIE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX3NlbWFwaG9yZU9wZW46IHNlbWFwaG9yZSBjb250ZXh0Iik7Ci0KLSAgIGlmKHNlbWFwaG9yZUNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICB9Ci0KLSAgIGlmICgwICE9IHNlbV9pbml0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUsIDAsIGluaXRpYWxfY291bnQpKQotICAgewotICAgICAgZnJlZShzZW1hcGhvcmVDb250ZXh0KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAiTTRPU0Ffc2VtYXBob3JlT3BlbjogT1Mgc2VtYXBob3JlIGNyZWF0aW9uIGZhaWxlZCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQ09OVEVYVF9GQUlMRUQ7Ci0gICB9Ci0KLSAgIHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCA9IE00T1NBX1NFTUFQSE9SRSA7Ci0gICAqY29udGV4dCA9IChNNE9TQV9Db250ZXh0KXNlbWFwaG9yZUNvbnRleHQ7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlY3JlbWVudHMgKG9uZSBieSBvbmUpIHRoZSBzZW1hcGhvcmUgY291bnRlci4gVGhlCi0gKiAgICAgICAgICAgICBzZW1hcGhvcmUgaXMgaWRlbnRpZmllZCBieSBpdHMgY29udGV4dCBUaGlzIGNhbGwgaXMgbm90IGJsb2NraW5nCi0gKiAgICAgICAgICAgICBpZiB0aGUgc2VtYXBob3JlIGNvdW50ZXIgaXMgcG9zaXRpdmUgb3IgemVybyAoYWZ0ZXIKLSAqICAgICAgICAgICAgIGRlY3JlbWVudGF0aW9uKS4gVGhpcyBjYWxsIGlzIGJsb2NraW5nIGlmIHRoZSBzZW1hcGhvcmUgY291bnRlcgotICogICAgICAgICAgICAgaXMgbGVzcyB0aGFuIHplcm8gKGFmdGVyIGRlY3JlbWVudGF0aW9uKSwgdW50aWwgdGhlIHNlbWFwaG9yZSBpcwotICogICAgICAgICAgICAgdXBwZXIgdGhhbiB6ZXJvIChzZWUgTTRPU0Ffc2VtYXBob3JlUG9zdCkgb3IgdGltZV9vdXQgaXMKLSAqICAgICAgICAgICAgIHJlYWNoZWQuCi0gKiBAbm90ZSAgICAgICBJZiAidGltZW91dCIgdmFsdWUgaXMgTTRPU0FfV0FJVF9GT1JFVkVSLCB0aGUgY2FsbGluZyB0aHJlYWQKLSAqICAgICAgICAgICAgIHdpbGwgYmxvY2sgaW5kZWZpbml0ZWx5IHVudGlsIHRoZSBzZW1hcGhvcmUgIGlzIHVubG9ja2VkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBzZW1hcGhvcmUKLSAqIEBwYXJhbSAgICAgIHRpbWVvdXQ6KElOKSBUaW1lIG91dCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRV9PVVQ6IHRpbWUgb3V0IGlzIGVsYXBzZWQgYmVmb3JlIHNlbWFwaG9yZSBoYXMgYmVlbgotICogICAgICAgICAgICAgYXZhaWxhYmxlLgotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVdhaXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9JbnQzMiB0aW1lb3V0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgdHM7Ci0gICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICBsZWZ0OwotICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc2VtYXBob3JlV2FpdFx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCB0aW1lb3V0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVXYWl0Iik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlV2FpdCIpOwotCi0gICBpZiAoIChNNE9TQV9JbnQzMilNNE9TQV9XQUlUX0ZPUkVWRVIgPT0gdGltZW91dCkKLSAgIHsKLSAgICAgICBpZiAoIDAgIT0gc2VtX3dhaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSkgKQotICAgICAgIHsKLSAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAiTTRPU0Ffc2VtYXBob3JlV2FpdDogT1Mgc2VtYXBob3JlIHdhaXQgZmFpbGVkIik7Ci0KLSAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUIDsKLSAgICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICAgcmVzdWx0ID0gc2VtX3RyeXdhaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7Ci0gICAgICAgd2hpbGUgKCAoKEVCVVNZID09IHJlc3VsdCkgfHwgKEVBR0FJTiA9PSByZXN1bHQpKSAmJiAoIDAgPCB0aW1lb3V0ICkgKQotICAgICAgIHsKLSAgICAgICAgICAgdHMudHZfc2VjICA9IDA7Ci0gICAgICAgICAgIGlmICgxIDw9IHRpbWVvdXQpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSAxMDAwMDAwOwotICAgICAgICAgICAgICAgdGltZW91dCAtPSAxOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IHRpbWVvdXQgKiAxMDAwMDAwOwotICAgICAgICAgICAgICAgdGltZW91dCA9IDA7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgbmFub3NsZWVwKCZ0cywgJmxlZnQpOwotICAgICAgICAgICByZXN1bHQgPSBzZW1fdHJ5d2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLSAgICAgICB9Ci0gICAgICAgaWYgKDAgIT0gcmVzdWx0KQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKChFQlVTWSA9PSByZXN1bHQpIHx8IChFQUdBSU4gPT0gcmVzdWx0KSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVfT1VUOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVXYWl0OiBPUyBzZW1hcGhvcmUgd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBpbmNyZW1lbnRzIHRoZSBzZW1hcGhvcmUgY291bnRlci4gVGhlIHNlbWFwaG9yZSBpcwotICogICAgICAgICAgICAgaWRlbnRpZmllZCBieSBpdHMgY29udGV4dAotICogQG5vdGUgICAgICAgSWYgdGhlIHNlbWFwaG9yZSBjb3VudGVyIGlzIHVwcGVyIHRoYW4gemVybyAoYWZ0ZXIgYWRkaXRpb24pLAotICogICAgICAgICAgICAgdGhlIE00T1NBX3NlbWFwaG9yZVdhaXQgY2FsbCBvZiB0aGUgdGhyZWFkIHdpdGggdGhlIGhpZ2hlc3QKLSAqICAgICAgICAgICAgIHByaW9yaXR5IGlzIHVuYmxvY2tlZCBhbmQgbWFkZSByZWFkeSB0byBydW4uCi0gKiBAbm90ZSAgICAgICBObyBoeXBvdGhlc2VzIGNhbiBiZSBtYWRlIG9uIHdoaWNoIHRocmVhZCB3aWxsIGJlIHVuYmxvY2tlZAotICogICAgICAgICAgICAgYmV0d2VlbiB0aHJlYWRzIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVQb3N0KE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3NlbWFwaG9yZVBvc3RcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlUG9zdCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZVBvc3QiKTsKLQotICAgc2VtX3Bvc3QoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVsZXRlcyBhIHNlbWFwaG9yZSAoaWRlbnRpZnkgYnkgaXRzIGNvbnRleHQpLgotICogICAgICAgICAgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzZW1hcGhvcmUgYW5kIGl0cyBjb250ZXh0IGlzIG5vIG1vcmUKLSAqICAgICAgICAgICAgIHVzZWFibGUuIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBtZW1vcnkgcmVsYXRlZCB0byB0aGlzCi0gKiAgICAgICAgICAgICBzZW1hcGhvcmUuCi0gKiBAbm90ZSAgICAgICBJdCBpcyBhbiBhcHBsaWNhdGlvbiBpc3N1ZSB0byB3YXJyYW50IG5vIG1vcmUgdGhyZWFkcyBhcmUgbG9ja2VkCi0gKiAgICAgICAgICAgICBvbiB0aGUgZGVsZXRlZCBzZW1hcGhvcmUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc2VtYXBob3JlQ2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlQ2xvc2UiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVDbG9zZSIpOwotCi0gICBzZW1fZGVzdHJveSgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLQotICAgZnJlZShzZW1hcGhvcmVDb250ZXh0KTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1RocmVhZC5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNTQyNDUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWQuYwotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEltcGxlbWVudHMgYW5kIG1hbmlwdWxhdGUgdGhyZWFkcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aHJlYWRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UaHJlYWQuaCIKLSNpbmNsdWRlICJNNE9TQV9UaHJlYWRfcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotCi12b2lkKiBNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvKHZvaWQgKmNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9Cb29sIGF1dG9fa2lsbCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoKLSAgICAgICBNNE9TQV9Wb2lkKiB1c2VyRGF0YTsKLSAgICAqLwotCi0gICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEb1x0XHRMUFZPSUQgMHgleCIsIGNvbnRleHQpOwotCi0gICAgLyoKLSAgICAgICB1c2VyRGF0YSA9IHRocmVhZENvbnRleHQtPnVzZXJEYXRhOwotICAgICovCi0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFJ1bm5pbmc7Ci0KLSAgIE00T1NBX3NlbWFwaG9yZVBvc3QodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKTsKLQotICAgd2hpbGUodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgaWYoKHRocmVhZENvbnRleHQtPmZ1bmModGhyZWFkQ29udGV4dC0+cGFyYW0pKSAhPSBNNE5PX0VSUk9SKQotICAgICAgewotICAgICAgICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgICAgICAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlID09IE00T1NBX2tUaHJlYWRSdW5uaW5nKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvL1BSIDIzNTQgLSBBQ08gOiBTdXBwcmVzcyBzdG9wcGluZyBzdGF0ZSBhbmQgZG9uJ3QKLSAgICAgICAgICAgIC8vICAgICAgICAgdW5sb2NrIG11dGV4IGJlZm9yZSBjbG9zaW5nIHRoZSB0aHJlYWQKLSAgICAgICAgICAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLSAgICAgICAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotICAgICAgfQotCi0gICAgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgIH0KLQotCi0gICBNNE9TQV9zZW1hcGhvcmVQb3N0KHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCk7Ci0KLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLQotICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyB0aHJlYWQuIEFmdGVyIHRoaXMgY2FsbCB0aGUgdGhyZWFkIGlzCi0gKiAgICAgICAgICAgICBpZGVudGlmaWVkIGJ5IGl0cyAiY29udGV4dCIuIFRoZSB0aHJlYWQgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYnkKLSAqICAgICAgICAgICAgIHRoZSAiZnVuYyIgcGFyYW1ldGVyLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgJiBhbGxvY2F0ZXMgYSB1bmlxdWUKLSAqICAgICAgICAgICAgIGNvbnRleHQuIEl0J3MgdGhlIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMKLSAqICAgICAgICAgICAgIGNvbnRleHQuIEl0IG11c3QgYmUgZnJlZWQgYnkgdGhlIE00T1NBX3RocmVhZFN5bmNDbG9zZSBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgIFRoZSBjb250ZXh0IHBhcmFtZXRlciB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIHRocmVhZAotICogICAgICAgICAgICAgZnVuY3Rpb25zIHRvIGFsbG93IHJldHJpZXZpbmcgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvcGVuZWQKLSAqICAgICAgICAgICAgIHRocmVhZC4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgdGhyZWFkLCBidXQgdGhlIHRocmVhZCBpcyBub3QgcnVubmluZy4KLSAqIEBub3RlICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBjcmVhdGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIGZ1bmM6KElOKSAiZG9JdCIgZnVuY3Rpb24gcG9pbnRlciB0byBydW4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY09wZW4oTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWREb0l0IGZ1bmMpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9UaHJlYWREb0l0IDB4JXgiLCBjb250ZXh0LCBmdW5jKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoZnVuYyA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICAqY29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIHRocmVhZENvbnRleHQgPQotICAgICAgKE00T1NBX1RocmVhZENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVGhyZWFkQ29udGV4dCksCi0gICAgICBNNE9TQV9USFJFQUQsIChNNE9TQV9DaGFyKikiTTRPU0FfdGhyZWFkU3luY09wZW46IHRocmVhZCBjb250ZXh0Iik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfdGhyZWFkU3luY09wZW4iKTsKLQotICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5mdW5jID0gZnVuYzsKLSAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IDY0ICogMTAyNDsKLSAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwotICAgdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQgPSAwOwotICAgdGhyZWFkQ29udGV4dC0+Y29yZUlEID0gTTRPU0FfVEhSRUFEOwotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotICAgdGhyZWFkQ29udGV4dC0+cHJpb3JpdHkgPSBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHkgOwotCi0gICBlcnJfY29kZSA9IE00T1NBX211dGV4T3BlbigmKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpKTsKLQotICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY09wZW46IE00T1NBX211dGV4T3BlbiIpOwotCi0gICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICB9Ci0KLSAgIGVycl9jb2RlID0gTTRPU0Ffc2VtYXBob3JlT3BlbigmKHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCksIDApOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jT3BlbjogTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICB9Ci0KLSAgICpjb250ZXh0ID0gdGhyZWFkQ29udGV4dDsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBydW5zIGEgc3BlY2lmaWVkIHRocmVhZC4gVGhlICJwYXJhbSIgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHNldCBhIHNwZWNpZmljIHBhcmFtZXRlciB0byB0aGUKLSAqICAgICAgICAgICAgIGNyZWF0ZWQgdGhyZWFkLiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHVzZWQgYXMgdGhlIHNlY29uZCBvbmUgb2YKLSAqICAgICAgICAgICAgIHRoZSAiTTRPU0FfVGhyZWFkRG9JdCIgZnVuY3Rpb24uCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCBpcyBhIGJsb2NraW5nIHVwIHRvIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KLSAqICAgICAgICAgICAgIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkU3RhcnRpbmcuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSB0aHJlYWQgaXMgcnVubmluZywgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRSdW5uaW5nLgotICogQG5vdGUgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBpbW1lZGlhdGVseS4gSWYgdGhlICJ0aHJlYWRTdGFydGVkIiBvcHRpb25JRAotICogICAgICAgICAgICAgaXMgbm90IE5VTEwsIHRoZSB0aHJlYWQgd2lsbCBjYWxsIGl0IGJlZm9yZSBydW5uaW5nIHRoZSBkb0l0Ci0gKiAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBwYXJhbTooSU4pIEFwcGxpY2F0aW9uIGRhdGEgdGhyZWFkIHBhcmFtZXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQ6IHRoZSB0aHJlYWQgZGlkIG5vdCBzdGFydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RhcnQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwYXJhbSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAgKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBwdGhyZWFkX2F0dHJfdCAgICAgYXR0cmlidXRlID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICBpbnQgICAgICAgICAgICAgICAgbWluICAgICAgID0gMDsKLSAgIGludCAgICAgICAgICAgICAgICBtYXggICAgICAgPSAwOwotICAgaW50ICAgICAgICAgICAgICAgIHByaW9yaXR5ICA9IDA7Ci0gICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc2NoZWQgICAgID0geyAwIH07Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jU3RhcnRcdFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9Wb2lkKiAiCi0gICAgICAgICAgICAgICAgICAiMHgleCIsIGNvbnRleHQsIHBhcmFtKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRTdGFydGluZzsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICB0aHJlYWRDb250ZXh0LT5wYXJhbSA9IHBhcmFtOwotCi0gICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX2luaXQoICZhdHRyaWJ1dGUgKSApCi0gICB7Ci0gICAgICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCAmYXR0cmlidXRlLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCApICkKLSAgICAgIHsKLSAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmYXR0cmlidXRlLCAoc2l6ZV90KXRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSApICkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koICZhdHRyaWJ1dGUsIFNDSEVEX09USEVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRlbnRhdGl2ZSBwYXRjaGVzIHRvIGhhbmRsZSBwcmlvcml0aWVzIGluIGEgYmV0dGVyIHdheSA6ICovCi0gICAgICAgICAgICAgICAgLyogVXNlIEFuZHJvaWQncyBwcmVkZWZpbmVkIHByaW9yaXRpZXMgKHJhbmdlICsxOS4uLTIwKQotICAgICAgICAgICAgICAgICAqcmF0aGVyIHRoYW4gTGludXggb25lcyAoMC4uOTkpKi8KLQotICAgICAgICAgICAgICAgIC8qIEdldCBtaW4gYW5kIG1heCBwcmlvcml0aWVzICovCi0gICAgICAgICAgICAgICAgbWluID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiggU0NIRURfRklGTyApOwotICAgICAgICAgICAgICAgIG1heCA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgoIFNDSEVEX0ZJRk8gKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jU3RhcnQgTUFYPSVkIE1JTj0lZCIsIG1heCwgbWluKTsKLQotICAgICAgICAgICAgICAgIC8qIHRlbnRhdGl2ZSBtb2RpZmljYXRpb24gb2YgdGhlIHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHByaW9yaXR5IGJhc2VkIG9uIGRlZmF1bHQgYW5kcm9pZCBwcmlvcml0aWVzICovCi0gICAgICAgICAgICAgICAgLyogVGhpcyBwcm9iYWJseSByZXF1aXJlcyBzb21lIG1vcmUgdHVuaW5nLAotICAgICAgICAgICAgICAgICAqIG91dGNvbWUgb2YgdGhpcyBwcmlvcml0eSBzZXR0aW5ncyBhcmUgbm90IHlldCBzYXRpc2ZhY3RvcnkgKi8KLSAgICAgICAgICAgICAgICAvKiBJbXBsZW1lbnRpbmcgdGhyZWFkIGhhbmRsaW5nIGJhc2VkIG9uIEFuZHJvaWQncyB0aHJlYWQgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgKiBoZWxwZXJzIG1pZ2h0IGJyaW5nIHNvbWUgaW1wcm92ZW1lbnQgKHNlZSB0aHJlYWRzLmgpICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKHRocmVhZENvbnRleHQtPnByaW9yaXR5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTG93UHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9ESVNQTEFZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRIaWdoUHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9BVURJTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkSGlnaGVzdFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2NoZWQuc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsKLQotICAgICAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSggJmF0dHJpYnV0ZSwgJnNjaGVkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfY3JlYXRlKCAmdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRocmVhZENvbnRleHQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTTRPU0FfRkFMU0UgPT0gTTRPU0FfRVJSX0lTX0VSUk9SKCBNNE9TQV9zZW1hcGhvcmVXYWl0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUiApICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koICZhdHRyaWJ1dGUgKTsKLSAgIH0KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIE00T1NBX0RFQlVHKE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRCwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICByZXR1cm4gTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVEOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHN0b3BzIGEgc3BlY2lmaWVkIHRocmVhZC4KLSAqIEBub3RlICAgICAgIFRoaXMgY2FsbCBpcyBhIGJsb2NraW5nIG9uZSB1cCB0byB0aGUgIk00T1NBX1RocmVhZERvSXQiCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBoYXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICBCZWZvcmUgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkUnVubmluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkU3RvcHBpbmcuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSB0aHJlYWQgaXMgc3RvcHBlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRPcGVuZWQuCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIG9uY2UgdGhlIHRocmVhZCBoYXMgYmVlbiBzdG9wcGVkLiBJZiB0aGUKLSAqICAgICAgICAgICAgICJ0aHJlYWRTdG9wcGVkIiBvcHRpb25JRCBpcyBub3QgTlVMTCwgdGhlIHRocmVhZCB3aWxsIGNhbGwgaXQKLSAqICAgICAgICAgICAgIGJlZm9yZSBkeWluZy4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0b3AoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU3luY1N0b3BcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1N0b3AiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFN0b3BwaW5nOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgTTRPU0Ffc2VtYXBob3JlV2FpdCh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3AsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgdGhyZWFkIChpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0KS4gQWZ0ZXIKLSAqICAgICAgICAgICAgIHRoaXMgY2FsbCB0aGUgdGhyZWFkIGFuZCBpdHMgY29udGV4dCBhcmUgbm8gbW9yZSB1c2VhYmxlLiBUaGlzCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMgdGhyZWFkLgotICogQG5vdGUgICAgICAgQmVmb3JlIHRoZSBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkQ2xvc2VkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU3luY0Nsb3NlXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZENsb3NlZCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZENsb3NlZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIGVycl9jb2RlID0gTTRPU0FfbXV0ZXhDbG9zZSh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlOiBNNE9TQV9tdXRleENsb3NlIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgZXJyX2NvZGUgPSBNNE9TQV9zZW1hcGhvcmVDbG9zZSh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2U6IE00T1NBX3NlbWFwaG9yZUNsb3NlIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBNNE9TQV9OVUxMKQotICAgewotICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKLSAgIH0KLQotICAgZnJlZSh0aHJlYWRDb250ZXh0KTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgdGhyZWFkIHRvIHJldHVybiBpdHMgc3RhdGUuCi0gKiBAbm90ZSAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlYWxsb2NhdGluZyB0aGUgc3RhdGUKLSAqICAgICAgICAgICAgIGZpZWxkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4pIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgc3RhdGU6KE9VVCkgVGhyZWFkIHN0YXRlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRTdGF0ZSogc3RhdGUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGVcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfVGhyZWFkU3RhdGUqIDB4JXgiLCBjb250ZXh0LCBzdGF0ZSk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzdGF0ZSA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSIpOwotCi0gICAqc3RhdGUgPSB0aHJlYWRDb250ZXh0LT5zdGF0ZTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gc2xlZXAgZHVyaW5nICJ0aW1lU2xlZXAiCi0gKiAgICAgICAgICAgICBtaWxsaXNlY29uZHMuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgICB0aW1lOihJTikgVGltZSB0byBzbGVlcCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFNsZWVwKE00T1NBX1VJbnQzMiB0aW1lKQotewotICAgc3RydWN0IHRpbWVzcGVjIHJxdHAgPSB7IDAsIDAgfTsKLSAgIHN0cnVjdCB0aW1lc3BlYyBybXRwID0geyAwLCAwIH07Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTbGVlcFx0XHRNNE9TQV9VSW50MzIgJWQiLCB0aW1lKTsKLQotICAgcnF0cC50dl9zZWMgPSAodGltZV90KXRpbWUvMTAwMDsKLSAgIHJxdHAudHZfbnNlYyA9ICh0aW1lJTEwMDApICogMTAwMDAwMDsKLSAgIG5hbm9zbGVlcCgmcnF0cCwgJnJtdHApOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQotCi1NNE9TQV9FUlIgTTRPU0FfU2V0VGhyZWFkU3luY1ByaW9yaXR5KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCBwcmlvcml0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCkob3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1ByaW9yaXR5XHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgaWYoKE00T1NBX1VJbnQzMilvcHRpb25WYWx1ZT5NNE9TQV9rVGhyZWFkTG93ZXN0UHJpb3JpdHkpCi0gICB7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5wcmlvcml0eSA9IHByaW9yaXR5OwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZKi8KLQotCi0KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FID09IE00T1NBX1RSVUUpCi0KLU00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jTmFtZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfQ2hhciogbmFtZSA9IChNNE9TQV9DaGFyKilvcHRpb25WYWx1ZTsKLSAgIE00T1NBX1VJbnQzMiBuYW1lU2l6ZSA7Ci0KLSAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9TZXRUaHJlYWRTeW5jTmFtZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLCBjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPm5hbWUgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGZyZWUodGhyZWFkQ29udGV4dC0+bmFtZSk7Ci0gICAgICB0aHJlYWRDb250ZXh0LT5uYW1lID0gTTRPU0FfTlVMTDsKLSAgIH0KLQotICAgaWYob3B0aW9uVmFsdWUgIT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIG5hbWVTaXplID0gc3RybGVuKChjb25zdCBjaGFyICopbmFtZSkrMTsKLQotICAgICAgdGhyZWFkQ29udGV4dC0+bmFtZSA9Ci0gICAgICAgICAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5hbWVTaXplLCBNNE9TQV9USFJFQUQsCi0gICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX1NldFRocmVhZFN5bmNOYW1lOiB0aHJlYWQgbmFtZSIpOwotCi0gICAgICBpZih0aHJlYWRDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICB9Ci0KLSAgICAgIG1lbWNweSgodm9pZCAqKXRocmVhZENvbnRleHQtPm5hbWUsICh2b2lkICopbmFtZSwKLSAgICAgICAgICAgICAgICAgICBuYW1lU2l6ZSk7Ci0gICB9Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCi0KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFID09IE00T1NBX1RSVUUpCi0KLU00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhY2tTaXplKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemVcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfRGF0YU9wdGlvbiAweCV4IiwgY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICB0aHJlYWRDb250ZXh0LT5zdGFja1NpemUgPSAoTTRPU0FfVUludDMyKW9wdGlvblZhbHVlOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNvcmUgT1NBTC1UaHJlYWQgY29tcG9uZW50IHRvIHNldCB0aGUgdmFsdWUKLSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgb2YgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotICogICAgICAgICAgICAgInZhbHVlIiBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZCB0byBpdHMgaW50ZXJuYWwKLSAqICAgICAgICAgICAgIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOihJTikgSUQgb2YgdGhlIG9wdGlvbgotICogQHBhcmFtICAgICAgb3B0aW9uVmFsdWU6KElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgbm93Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9SRUFEX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgcmVhZCBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX09wdGlvbklEICVkXHRNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgb3B0aW9uSUQsIG9wdGlvblZhbHVlKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfVEhSRUFEKSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19XUklUQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUkVBRF9PTkxZLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSAhPSBNNE9TQV9rVGhyZWFkT3BlbmVkKQotICAgewotICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUQVRFLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHN3aXRjaChvcHRpb25JRCkKLSAgIHsKLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRQcmlvcml0eToKLSAgICAgIHsKLSAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfU2V0VGhyZWFkU3luY1ByaW9yaXR5KGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkTmFtZToKLSAgICAgIHsKLSAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfU2V0VGhyZWFkU3luY05hbWUoY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFN0YWNrU2l6ZToKLSAgICAgIHsKLSAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfU2V0VGhyZWFkU3luY1N0YWNrU2l6ZShjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUqLwotCi0gICAgICBkZWZhdWx0OgotICAgICAgewotICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICAgICAgICBlcnJfY29kZSA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgIH0KLSAgIH0KLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIHJldHVybiBlcnJfY29kZTsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgT1NBTC1UaHJlYWQgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkCi0gKiAgICAgICAgICAgICB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgIm9wdGlvblZhbHVlIiBtdXN0IGJlIGNhc3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHJlbGF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBvcHRpb25JRC4KLSAqIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlLWFsbG9jYXRpbmcgdGhlICJ2YWx1ZSIKLSAqICAgICAgICAgICAgIGZpZWxkLCB0aGUgY29yZSBPU0FMLVRocmVhZCBjb21wb25lbnQgbXVzdCBwZXJmb3JtIGEgY29weSBvZiBpdHMKLSAqICAgICAgICAgICAgIGludGVybmFsIHZhbHVlIHRvIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOihJTikgSUQgb2YgdGhlIG9wdGlvbgotICogQHBhcmFtICAgICAgb3B0aW9uVmFsdWU6KE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1dSSVRFX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb25cdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfT3B0aW9uSUQgJWRcdE00T1NBX0RhdGFPcHRpb24qIDB4JXgiLAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgb3B0aW9uSUQsIG9wdGlvblZhbHVlKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvblZhbHVlID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9USFJFQUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1JFQURBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9XUklURV9PTkxZLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBzd2l0Y2gob3B0aW9uSUQpCi0gICB7Ci0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkUHJpb3JpdHk6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKiBwcmlvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCopb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICpwcmlvcml0eSA9IHRocmVhZENvbnRleHQtPnByaW9yaXR5OwotCi0gICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWROYW1lOgotICAgICAgewotICAgICAgICAgTTRPU0FfQ2hhcioqIG5hbWUgPSAoTTRPU0FfQ2hhcioqKW9wdGlvblZhbHVlOwotCi0gICAgICAgICAqbmFtZSA9IHRocmVhZENvbnRleHQtPm5hbWU7Ci0KLSAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkU3RhY2tTaXplOgotICAgICAgewotICAgICAgICAgTTRPU0FfVUludDMyKiBzdGFja1NpemUgPSAoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLQotICAgICAgICAgKnN0YWNrU2l6ZSA9IHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZTsKLQotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgfQotCi0gICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX0RlYnVnVHJhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX0RlYnVnVHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGZjYmE5NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19EZWJ1Z1RyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgTTRQU1dfRGVidWdUcmFjZS5jCi0gKiBAYnJpZWYgICAgICBEZWZhdWx0IHRyYWNlIGZ1bmN0aW9uIGZvciBkZWJ1Z2dpbmcgbWFjcm9zCi0gKiBAbm90ZSAgICAgICBUaGlzIGZpbGUgZ2l2ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyYWNlIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICB1c2VkIGluIHRoZSBkZWJ1ZyBpbnN0cnVtZW50YXRpb24gbWFjcm9zLCBiYXNlZCBvbiBwcmludGYuCi0gKiAgICAgICAgICAgICBBcHBsaWNhdGlvbiB3cml0ZXJzIGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIGltcGxlbWVudCB0aGVpcgotICogICAgICAgICAgICAgb3duICJNNE9TQV9EZWJ1Z1RyYWNlIi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+IC8qZm9yIHByaW50ZiAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKiNkZWZpbmUgTk9fRklMRSAqLyAvKiBzdXBwcmVzc2VzIHRoZSBmaWxlIG5hbWUgcHJpbnQgb3V0ICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiB2b2lkIE00T1NBX0RlYnVnVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgY2hhciogZmlsZSwgTTRPU0FfSW50MzIgbGV2ZWwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogY29uZCwgY2hhciogbXNnLCBNNE9TQV9FUlIgZXJyKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdHJhY2UgZm9yIGRlYnVnIHRlc3RzCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGNhbGxlZCBpbiB0aGUgZGVidWcgbWFjcm9zIG9ubHkuCi0gKiAgICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBwcmludGYuCi0gKiBAcGFyYW0gICAgbGluZSAoSU4pOiB0aGUgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSBmaWxlCi0gKiBAcGFyYW0gICAgZmlsZSAoSU4pOiB0aGUgc291cmNlIGZpbGUgbmFtZQotICogQHBhcmFtICAgIGxldmVsIChJTik6IHRoZSBkZWJ1ZyBsZXZlbAotICogQHBhcmFtICAgIG1zZyAoSU4pOiB0aGUgZXJyb3IgbWVzc2FnZQotICogQHBhcmFtICAgIGVyciAoSU4pOiB0aGUgcmV0dXJuIHZhbHVlIChlcnJvciBjb2RlKQotICogQHJldHVybiAgICBub25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgdm9pZCBNNE9TQV9EZWJ1Z1RyYWNlKE00T1NBX0ludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiBlcnIpCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIC8qIHRyeSB0byAiaW5kZW50IiB0aGUgcmVzdWx0aW5nIHRyYWNlcyBkZXBlbmRpbmcgb24gdGhlIGxldmVsICovCi0gICAgZm9yIChpID0wIDsgaSA8IGxldmVsOyBpICsrKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCIgIik7Ci0gICAgfQotCi0jaWZkZWYgTk9fRklMRQotICAgIHByaW50ZigiRXJyb3I6ICVsaSwgb24gJXM6ICVzXG4iLGVycixjb25kLG1zZyk7Ci0jZWxzZSAvKiBOT19GSUxFICAgICAqLwotICAgIHByaW50ZigiRXJyb3I6ICVsaSwgb24gJXM6ICVzIExpbmUgJWx1IGluOiAlc1xuIixlcnIsY29uZCxtc2csbGluZSxmaWxlKTsKLSNlbmRpZiAvKiBOT19GSUxFICAgICAqLwotCi19Ci0KLU00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSBNNE9TQV9Wb2lkIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oTTRPU0FfVUludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZ0NvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IpCi17Ci0gICAgTTRPU0FfRGVidWdUcmFjZShsaW5lLCBmaWxlTmFtZSwgbGV2ZWwsIHN0cmluZ0NvbmRpdGlvbiwgbWVzc2FnZSwgcmV0dXJuZWRFcnJvcik7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhNGNjZWEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFBTV19NZW1vcnlJbnRlcmZhY2UuYwotICogQGJyaWVmICBNZW1vcnkgSW50ZXJmYWNlCi0gKiBAbm90ZSAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBvc2FsIG1lbW9yeSBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaWZuZGVmIE00VlBTX0FEVkFOQ0VEX01FTU9SWV9NQU5BR0VSCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKLSAqIEBicmllZiAgICAgIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbWVtb3J5IGJsb2NrIChhdCBsZWFzdCAzMiBiaXRzIGFsaWduZWQpCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgc2l6ZSAoSU4pOiBzaXplIG9mIGFsbG9jYXRlZCBibG9jayBpbiBieXRlcwotICogQHBhcmFtICAgICAgY29yZUlEIChJTik6IGlkZW50aWZpY2F0aW9uIG9mIHRoZSBjYWxsZXIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgICBzdHJpbmcgKElOKTogZGVzY3JpcHRpb24gb2YgdGhlIGFsbG9jYXRlZCBibG9jayAobnVsbCB0ZXJtaW5hdGVkKQotICogQHJldHVybiAgICAgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrLCBNNE9TQV9OVUxMIGlmIG5vIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKLXsKLSAgICBNNE9TQV9NZW1BZGRyMzIgQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiBJZiBzaXplIGlzIDAsIG1hbGxvYyBvbiBXSU4gT1MgYWxsb2NhdGVzIGEgemVyby1sZW5ndGggaXRlbSBpbgotICAgICAqIHRoZSBoZWFwIGFuZCByZXR1cm5zIGEgdmFsaWQgcG9pbnRlciB0byB0aGF0IGl0ZW0uCi0gICAgICogT24gb3RoZXIgcGxhdGZvcm1zLCBtYWxsb2MgY291bGQgcmV0dXJucyBhbiBpbnZhbGlkIHBvaW50ZXIKLSAgICAgKiBTbywgRE9OJ1QgYWxsb2NhdGUgbWVtb3J5IG9mIDAgYnl0ZSAqLwotICAgIGlmIChzaXplID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gQWRkcmVzczsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSU0ICE9IDApCi0gICAgewotICAgICAgICBzaXplID0gc2l6ZSArIDQgLSAoc2l6ZSU0KTsKLSAgICB9Ci0KLSAgICBBZGRyZXNzID0gKE00T1NBX01lbUFkZHIzMikgbWFsbG9jKHNpemUpOwotCi0gICAgcmV0dXJuIEFkZHJlc3M7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNkOWExZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFBTV19UcmFjZS5jCi0gKiBAYnJpZWYgICAgICAgIFRyYWNlIGZ1bmN0aW9uIGZvciB0cmFjZSBtYWNyb3MKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZ2l2ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbiB1c2VkCi0gKiAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4gLypmb3IgcHJpbnRmICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+IC8qIEFOU0kgQyBtYWNyb3MgYW5kIGRlZnMgZm9yIHZhcmlhYmxlIGFyZ3MgKi8KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2RlZmluZSBOT19GSUxFIC8qIHN1cHByZXNzZXMgdGhlIGZpbGUgbmFtZSBwcmludCBvdXQgKi8KLQotI2RlZmluZSBNQVhfU1RSSU5HX1NJWkUgMTAyNAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHZvaWQgTTRPU0FfVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgTTRPU0FfQ2hhciogZmlsZSAsTTRPU0FfSW50MzIgbGV2ZWwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZvcm1hdCwgLi4uKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdHJhY2UgZm9yIGRlYnVnIHRlc3RzCi0gKiBAbm90ZSAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHJpbnRmLiBGaXJzdCB0aGUgdmFyaWFibGVzIGFyZSByZXRyaWV2ZWQgdXNpbmcKLSAqICAgICAgICAgICAgQU5TSSBDIGRlZnMgYW5kIG1hY3JvcyB3aGljaCBlbmFibGUgdG8gYWNjZXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLSAqICAgICAgICAgICAgVGhlbiB0aGUgcHJpbnRmIGlzIGRvbmUgKHdpdGggc29tZSBvcm5lbWVudGFsIGFkZHMpLgotICogQHBhcmFtICAgIGxldmVsIChJTik6IHRoZSBkZWJ1ZyBsZXZlbAotICogQHBhcmFtICAgIGZvcm1hdCAoSU4pOiB0aGUgInByaW50ZiIgZm9ybWF0ZWQgc3RyaW5nCi0gKiBAcGFyYW0gICAgLi4uIChJTik6IGFzIG1hbnkgcGFyYW1ldGVycyBhcyByZXF1aXJlZCAuLi4KLSAqIEByZXR1cm4gICAgbm9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIHZvaWQgTTRPU0FfVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgTTRPU0FfQ2hhciogZmlsZSAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0NoYXIqIGZvcm1hdCwgLi4uKQotewotICAgIE00T1NBX0NoYXIgbWVzc2FnZVtNQVhfU1RSSU5HX1NJWkVdOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgdmFfbGlzdCBtYXJrZXI7IC8qIHBvaW50ZXIgdG8gbGlzdCBvZiBhcmd1bWVudHMgKi8KLQotICAgIC8qIGdldCB0aGUgdmFyIGFyZ3VtZW50cyBpbnRvIHRoZSBzdHJpbmcgbWVzc2FnZSB0byBiZSBhYmxlIHRvIHByaW50ICovCi0gICAgdmFfc3RhcnQobWFya2VyLGZvcm1hdCk7IC8qIHNldCBwdHIgdG8gZmlyc3QgYXJndW1lbnQgaW4gdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gKi8KLSAgICB2c3ByaW50ZigoY2hhciAqKW1lc3NhZ2UsIChjb25zdCBjaGFyICopZm9ybWF0LG1hcmtlciApOyAgLyogZm9ybWF0cyBhbmQgd3JpdGVzIHRoZSBkYXRhIGludG8gbWVzc2FnZSAqLwotICAgIHZhX2VuZChtYXJrZXIpOyAvKiByZXNldCBwb2ludGVyIHRvIE5VTEwgKi8KLQotICAgIC8qIGRvIHRoZSBhY3R1YWwgcHJpbnQgKi8KLSNpZmRlZiBOT19GSUxFCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVHJhY2UiLCAiJXMiLCAoY2hhciopbWVzc2FnZSk7Ci0jZWxzZSAvKiBOT19GSUxFICAgICAqLwotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RyYWNlIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1lc3NhZ2UsIGxpbmUsIGZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIE00T1NBX1ZvaWQgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nTXNnLCAuLi4pCi17Ci0gICAgTTRPU0FfQ2hhciBtZXNzYWdlW01BWF9TVFJJTkdfU0laRV07Ci0gICAgTTRPU0FfSW50MzIgaTsKLSAgICB2YV9saXN0IG1hcmtlcjsgLyogcG9pbnRlciB0byBsaXN0IG9mIGFyZ3VtZW50cyAqLwotCi0gICAgLyogZ2V0IHRoZSB2YXIgYXJndW1lbnRzIGludG8gdGhlIHN0cmluZyBtZXNzYWdlIHRvIGJlIGFibGUgdG8gcHJpbnQgKi8KLSAgICB2YV9zdGFydChtYXJrZXIsc3RyaW5nTXNnKTsgLyogc2V0IHB0ciB0byBmaXJzdCBhcmd1bWVudCBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiAqLwotICAgIHZzcHJpbnRmKChjaGFyICopbWVzc2FnZSwgKGNvbnN0IGNoYXIgKilzdHJpbmdNc2csbWFya2VyICk7ICAvKiBmb3JtYXRzIGFuZCB3cml0ZXMgdGhlIGRhdGEgaW50byBtZXNzYWdlICovCi0gICAgdmFfZW5kKG1hcmtlcik7IC8qIHJlc2V0IHBvaW50ZXIgdG8gTlVMTCAqLwotCi0gICAgLyogZG8gdGhlIGFjdHVhbCBwcmludCAqLwotI2lmZGVmIE5PX0ZJTEUKLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uIiwgIiVzIiwgKGNoYXIqKW1lc3NhZ2UpOwotI2Vsc2UgLyogTk9fRklMRSAgICAgKi8KLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWVzc2FnZSwgbGluZSwgKGNoYXIqKWZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjlkMTZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19UeXBlcy5oCi0gKiBAYnJpZWYgICBEZWZpbml0aW9uIG9mIHR5cGVzIGZvciB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBNNE1QNFdfVFlQRVNfSAotI2RlZmluZSBNNE1QNFdfVFlQRVNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotLyogaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfU3RyZWFtLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0Q19GdHlwQm94Ci0gKiBAYnJpZWYgICAgICAgSW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlICdmdHlwJyBhdG9tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgTTRNUEFDX0ZUWVBfVEFHIDB4NjY3NDc5NzAgLyogJ2Z0eXAnICovCi0jZGVmaW5lIE00TVBBQ19NQVhfQ09NUEFUSUJMRV9CUkFORFMgMTAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogQWxsIGJyYW5kIGZpZWxkcyBhcmUgYWN0dWFsbHkgY2hhcls0XSBzdG9yZWQgaW4gYmlnLWVuZGlhbiBpbnRlZ2VyIGZvcm1hdCAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIG1ham9yX2JyYW5kOyAgICAgICAgIC8qIGdlbmVyYWxseSAnM2dwNCcgICAgICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtaW5vcl92ZXJzaW9uOyAgICAgICAvKiBnZW5lcmFsbHkgJzAwMDAnIG9yICd4LnggJyAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbmJDb21wYXRpYmxlQnJhbmRzOyAgLyogbnVtYmVyIG9mIGNvbXBhdGlibGUgYnJhbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIGNvbXBhdGlibGVfYnJhbmRzW000TVBBQ19NQVhfQ09NUEFUSUJMRV9CUkFORFNdOyAgIC8qIGFycmF5IG9mIG1heCBjb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kcyAqLwotfSBNNE1QNENfRnR5cEJveDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfbWVtQWRkcgotICogQGJyaWVmICAgICAgICBCdWZmZXIgc3RydWN0dXJlIGZvciB0aGUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc2l6ZTsKLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgYWRkcjsKLX0gTTRNUDRXX21lbUFkZHI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGltZSB0eXBlIGZvciB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfVUludDMyIE00TVA0V19UaW1lMzI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICBNNE1QNFdfU3RhdGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvcmUgTVA0IHdyaXRlciBzdGF0ZXMKLSAqIEBub3RlICAgICAgICAgVGhlc2Ugc3RhdGVzIGFyZSB1c2VkIGludGVybmFseSwgYnV0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBvdXRzaWRlCi0gKiAgICAgICAgICAgICAgIHRoZSB3cml0ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TVA0V19vcGVuZWQgICAgICAgICAgICA9IDB4MTAwLAotICAgIE00TVA0V19yZWFkeSAgICAgICAgICAgICA9IDB4MjAwLAotICAgIE00TVA0V193cml0aW5nICAgICAgICAgICA9IDB4MzAwLAotICAgIE00TVA0V193cml0aW5nX3N0YXJ0QVUgICA9IDB4MzAxLAotICAgIE00TVA0V19jbG9zZWQgICAgICAgICAgICA9IDB4NDAwCi19IE00TVA0V19TdGF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNE1QNFdfT3B0aW9uSUQKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvcmUgTVA0IHdyaXRlciBvcHRpb25zCi0gKiBAbm90ZSAgICAgICAgVGhlc2Ugb3B0aW9ucyBnaXZlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNUDRXX21heEFVcGVyQ2h1bmsgICAgICAgID0gMHhDMTAxLAotICAgIE00TVA0V19tYXhDaHVua1NpemUgICAgICAgICA9IDB4QzEwMiwKLSAgICBNNE1QNFdfbWF4Q2h1bmtJbnRlciAgICAgICAgPSAweEMxMDMsCi0gICAgTTRNUDRXX3ByZVdyaXRlQ2FsbEJhY2sgICAgID0gMHhDMTA0LAotICAgIE00TVA0V19wb3N0V3JpdGVDYWxsQmFjayAgICA9IDB4QzEwNSwKLSAgICBNNE1QNFdfbWF4QVVzaXplICAgICAgICAgICAgPSAweEMxMDYsCi0gICAgTTRNUDRXX0lPRCAgICAgICAgICAgICAgICAgID0gMHhDMTExLAotICAgIE00TVA0V19FU0QgICAgICAgICAgICAgICAgICA9IDB4QzExMiwKLSAgICBNNE1QNFdfU0RQICAgICAgICAgICAgICAgICAgPSAweEMxMTMsCi0gICAgTTRNUDRXX3RyYWNrU2l6ZSAgICAgICAgICAgID0gMHhDMTE0LAotICAgIE00TVA0V19NT09WZmlyc3QgICAgICAgICAgICA9IDB4QzEyMSwKLSAgICBNNE1QNFdfVjJfTU9PRiAgICAgICAgICAgICAgPSAweEMxMzEsCi0gICAgTTRNUDRXX1YyX3RibENvbXByZXMgICAgICAgID0gMHhDMTMyLAotICAgIC8qd2FybmluZzogdW5zcGVjaWZpZWQgb3B0aW9uczoqLwotICAgIE00TVA0V19tYXhGaWxlU2l6ZSAgICAgICAgICA9IDB4QzE1MiwKLSAgICBNNE1QNFdfQ2FtY29kZXJWZXJzaW9uICAgICAgPSAweEMxNTMsIC8qMDAwIHRvIDk5OSAhKi8KLSAgICBNNE1QNFdfZXN0aW1hdGVBdWRpb1NpemUgICAgPSAweEMxNTQsIC8qYXVkaW8gQVVzIGFyZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIHZpZGVvLCAqLwotICAgIC8qdGhpcyBvcHRpb24gTVVTVCBOT1QgYmUgc2V0IGlmIG5vbiBjb25zdGFudCBhdWRpbwotICAgIGZyYW1lIHNpemUgKGUuZy4gaWYgU0lEKSovCi0gICAgTTRNUDRXX2VtYmVkZGVkU3RyaW5nICAgICAgID0gMHhDMTU1LAotICAgIE00TVA0V19pbnRlZ3JhdGlvblRhZyAgICAgICA9IDB4QzE1NiwKLSAgICBNNE1QNFdfbWF4RmlsZUR1cmF0aW9uICAgICAgPSAweEMxNTcsCi0gICAgTTRNUDRXX3NldEZ0eXBCb3ggICAgICAgICAgID0gMHhDMTU4LAotICAgIE00TVA0V19EU0kgICAgICAgICAgICAgICAgICA9IDB4QzE1OSwKLSAgICAvKiBILjI2NCB0cmltbWluZyAqLwotICAgIE00TVA0V19NVUxfUFBTX1NQUyAgICAgICAgICA9IDB4QzE2MCwKLSAgICAvKiBILjI2NCB0cmltbWluZyAqLwotfSBNNE1QNFdfT3B0aW9uSUQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQXVkaW8gJiB2aWRlbyBzdHJlYW0gSURzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgQXVkaW9TdHJlYW1JRCAxCi0jZGVmaW5lIFZpZGVvU3RyZWFtSUQgMgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERlZmF1bHQgcGFyYW1ldGVycyB2YWx1ZXMsIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IE00TVA0V19zZXRPcHRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNE1QNFdfRGVmYXVsdFdpZHRoIDMyMAotI2RlZmluZSBNNE1QNFdfRGVmYXVsdEhlaWdodCAyNDAKLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRNYXhBdVNpemUgIDQwOTYgLypieXRlcyovCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0TWF4Q2h1bmtTaXplIDEwMDAwMCAvKmJ5dGVzKi8KLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRJbnRlcmxlYXZlRHVyIDAgLypieXRlcyovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1N0cmVhbUlEc2l6ZQotICogQGJyaWVmICAgICAgICBWaWRlbyBwbGFuZSBzaXplCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQ7Ci0gICAgTTRPU0FfVUludDE2ICAgIGhlaWdodDsKLSAgICBNNE9TQV9VSW50MTYgICAgd2lkdGg7Ci19IE00TVA0V19TdHJlYW1JRHNpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19UcmFja0RhdGEKLSAqIEBicmllZiAgICAgICBJbnRlcm5hbCBjb3JlIE1QNCB3cml0ZXIgdHJhY2sgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICB0cmFja1R5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICB0aW1lc2NhbGU7ICAgICAgICAgIC8qIFQgKHZpZGVvPTEwMDApLCAoQU1SOD04MDAwKSwgKEFNUjE2PTE2MDAwKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBzYW1wbGVTaXplOyAgICAgICAgIC8qIFMgKHZpZGVvPTApKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHN0dHNUYWJsZUVudHJ5TmI7ICAgLyogSiAoYXVkaW89MSkqLwotICAgIE00TVA0V19UaW1lMzIgICAgICAgIGxhc3RDVFM7ICAgICAgICAgICAvKiBDVFMgb2YgdGhlIHByZXZpb3VzIEFVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0IHRvIDAuR2l2ZXMgZHVyYXRpb24gYXQgdGhlIGVuZC4qLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc2FtcGxlTmI7ICAgICAgICAgICAvKiBLIChhdWRpbz1GKSovCi19IE00TVA0V19UcmFja0RhdGE7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19BdWRpb1RyYWNrRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciBhdWRpbyBzcGVjaWZpYyBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE1QNFdfU3RhdGUgICAgICAgICAgICBtaWNyb1N0YXRlOwotICAgIE00TVA0V19UcmFja0RhdGEgICAgICAgIENvbW1vbkRhdGE7Ci0gICAgTTRPU0FfVUNoYXIqKiAgICAgICAgICAgQ2h1bms7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTaXplVGFibGU7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGU7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZTsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRDaHVuazsgICAgICAgLyogSW5pdCB0byAwKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50UG9zOyAgICAgICAgIC8qIEluaXQgdG8gMCAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFN0c2M7ICAgICAgICAvKiBJbml0IHRvIDAgKi8KLSNlbmRpZgotICAgIE00TVA0V19UaW1lMzIgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uOyAgICAgLyogQ2hlY2sgKEFNUjg9MTYwKSwgKEFNUjE2PTMyMCkqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heENodW5rU2l6ZTsgICAgICAgLyogSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4Q2h1bmtTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgIC8qIEluaXQgdG8gTTRNUDRXX01wNEZpbGVEYXRhLk1heEFVU2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTGFzdEFsbG9jYXRlZENodW5rOwotICAgIC8qIHByZXZpb3VzbHksIGF1ZGlvIGF1IHNpemUgd2FzIHN1cHBvc2VkIGNvbnN0YW50LAotICAgICAqIHdoaWNoIGlzIGFjdHVhbGx5IG5vdCB0aGUgY2FzZSBpZiBzaWxlbmNlcyAoc2lkKS4qLwotICAgIC8qIGF0IGZpcnN0IGF1ZGlvIGF1LCBzYW1wbGVTaXplIGlzIHNldC4gSXQgaXMgbGF0ZXIgcmVzZXQgdG8gMCBpZiBub24gY29uc3RhbnQgc2l6ZS4qLwotICAgIC8qIFNvIHNhbXBsZVNpemUgc2hvdWxkIGJlIHRlc3RlZCB0byBrbm93IHdlaXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgVEFCTEVfU1RTWi4gKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNaOyAvKiB0YWJsZSBzaXplIGlzIDRLKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrczsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFRTOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1heEJpdHJhdGU7ICAgICAvKm5vdCB1c2VkIGluIGFtciBjYXNlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBhdmdCaXRyYXRlOyAgICAgLypub3QgdXNlZCBpbiBhbXIgY2FzZSovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgRFNJOyAgICAgICAgICAgIC8qIERlY29kZXIgU3BlY2lmaWMgSW5mbzogTWF5IGJlIE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRlZCkgZm9yIEFNUiAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIGRzaVNpemU7ICAgICAgICAvKiBEU0kgc2l6ZSwgYWx3YXlzIDkgYnl0ZXMgZm9yIEFNUiAqLwotfSBNNE1QNFdfQXVkaW9UcmFja0RhdGE7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1ZpZGVvVHJhY2tEYXRhCi0gKiBAYnJpZWYgICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciB2aWRlbyBzcGVjaWZpYyBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE1QNFdfU3RhdGUgICAgICAgICAgICBtaWNyb1N0YXRlOwotICAgIE00TVA0V19UcmFja0RhdGEgICAgICAgIENvbW1vbkRhdGE7Ci0gICAgTTRPU0FfVUNoYXIqKiAgICAgICAgICAgQ2h1bms7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTaXplVGFibGU7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGU7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZTsKLSAgICBNNE1QNFdfVGltZTMyKiAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRDaHVuazsgICAgICAgICAgICAvKiBJbml0IHRvIDAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRQb3MgOyAgICAgICAgICAgICAvKiBJbml0IHRvIDAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFN0c2M7ICAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBzdHNzVGFibGVFbnRyeU5iIDsgICAgICAgLyogTiovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgICAgICAgIC8qIFgqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgICAvKiBZKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFRTOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyBKKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrczsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIE00T1NBX1VJbnQxNiogICAgICAgICAgIFRBQkxFX1NUU1o7ICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGlzIDJLKi8KLSNlbHNlCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RTWjsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgNEsqLwotI2VuZGlmCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3M7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RTUzsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgTiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3NCbG9ja3M7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVXBlckNodW5rOyAgICAgICAgICAgLypJbml0IHRvIDAsIGkuZS4gbm90IHVzZWQqLwotI2VuZGlmCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAgICAgIC8qSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4Q2h1bmtTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgICAgICAgLypJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhBVVNpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIExhc3RBbGxvY2F0ZWRDaHVuazsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtYXhCaXRyYXRlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGF2Z0JpdHJhdGU7Ci0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgRFNJOyAgICAgICAgICAgIC8qIERlY29kZXIgU3BlY2lmaWMgSW5mbzogTWF5IGJlIE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRlZCkgZm9yIEgyNjMqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIGRzaVNpemU7ICAgICAgICAvKiBEU0kgc2l6ZSwgYWx3YXlzIDcgYnl0ZXMgZm9yIEgyNjMgKi8KLX0gTTRNUDRXX1ZpZGVvVHJhY2tEYXRhOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfTXA0RmlsZURhdGEKLSAqIEBicmllZiAgICAgICBJbnRlcm5hbCBjb3JlIE1QNCB3cml0ZXIgcHJpdmF0ZSBjb250ZXh0IHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgICAgICAgIHN0YXRlOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgIHVybDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBkdXJhdGlvbjsgICAgLyogRCBpbiBtcywgbWF4IGR1cmF0aW9uIG9mIGF1ZGlvJnZpZGVvKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBmaWxlc2l6ZTsgICAgLyogYWN0dWFsIGZpbGVzaXplIGluIGJ5dGVzKi8KLSAgICBNNE1QNFdfQXVkaW9UcmFja0RhdGEqICAgICAgICBhdWRpb1RyYWNrUHRyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGhhc0F1ZGlvOwotICAgIE00TVA0V19WaWRlb1RyYWNrRGF0YSogICAgICAgIHZpZGVvVHJhY2tQdHI7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgaGFzVmlkZW87Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAvKiBJbml0IHRvIDEwMDAwMCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4QVVTaXplOyAgICAgICAgICAvKiBJbml0IHRvIDQwOTYqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIE1heEZpbGVTaXplOyAgICAgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBNNE1QNFdfVGltZTMyICAgICAgICAgICAgICAgICBJbnRlcmxlYXZlRHVyOyAgICAgIC8qIEluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCwgbXMqLwotICAgIC8qIE00TVA0V19Xcml0ZUNhbGxCYWNrICAgICAgICAgICAgUHJlV3JpdGVDYWxsQmFjazsqLyAgICAvKkluaXQgdG8gTTRPU0FfTlVMTCovCi0gICAgLyogTTRNUDRXX1dyaXRlQ2FsbEJhY2sgICAgICAgICAgICBQb3N0V3JpdGVDYWxsQmFjazsqLyAvKkluaXQgdG8gTTRPU0FfTlVMTCovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgZmlsZVdyaXRlckZ1bmN0aW9uczsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBmaWxlUmVhZGVyRnVuY3Rpb25zOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGNhbWNvZGVyVmVyc2lvbjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZUF1ZGlvU2l6ZTsgIC8qIGRlZmF1bHQgaXMgZmFsc2UqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGF1ZGlvTXNDaHVua0R1cjsgICAgLyogaW4gbXMsIHNldCBvbmx5IGlmIGVzdGltYXRlQXVkaW9TaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0cnVlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBhdWRpb01zU3RvcFRpbWU7ICAgIC8qIHRpbWUgdG8gc3RvcCBhdWRpbywgc2V0IG9ubHkgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0OwotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUN1cnJlbnRQb3M7IC8qIG5ldyBmaWVsZCBmb3Igb2Zmc2V0IHVwZGF0ZSovCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VDaGFyKiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkU3RyaW5nOyAgICAgLyogMTYgYnl0ZXMgc3RyaW5nLCBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZW4gaWYgTlVMTCovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgICAgICAgaW50ZWdyYXRpb25UYWc7ICAgICAvKiA2MCBieXRlcyBzdHJpbmcsIG1lbXNldCB0byAwIGlmIE5VTEwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhGaWxlRHVyYXRpb247ICAgIC8qIEluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgTTRNUDRDX0Z0eXBCb3ggICAgICAgICAgICAgICAgZnR5cDsgICAgICAgICAgICAgICAvKiBmdHlwIGF0b20sIGlmIG5vdCBkZWZpbmVkIHNldCBtYWpvcl9icmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCB3aWxsIHVzZSBkZWZhdWx0IGJveCAqLwotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgIHNhZmV0eUZpbGVVcmw7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuU2FmZXR5RmlsZTsKLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1VTFBQU1NQUzsKLX0gTTRNUDRXX01wNEZpbGVEYXRhOwotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qTTRNUDRXX1RZUEVTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYmU3YWJiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19VdGlscy5oCi0gKiBAYnJpZWYgICBVdGlsaXRpZXMgYW5kIHByaXZhdGUgZnVuY3Rpb25zIGRlY2xhcmF0aW9uIGZvciB0aGUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgTTRNUDRXX1VUSUxTX0gKLSNkZWZpbmUgTTRNUDRXX1VUSUxTX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLS8qIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byB3cml0ZSBkYXRhIGluIGJpZyBlbmRpYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCeXRlKE00T1NBX1VDaGFyIGMsICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUxNihNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMjQoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTMyKE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBXcml0ZSBhIGJ1bGsgb2YgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgZmlsZSwgc2l6ZSBpcyBnaXZlbiBpbiBieXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJsb2NrKGNvbnN0IE00T1NBX1VDaGFyKiBCbG9jaywgTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29udmVydCB0aGUgJ25iJyB1bnNpZ25lZCBpbnRlZ2VycyBpbiAndGFiJyB0YWJsZSBmcm9tIExFIGludG8gQkUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCBNNE1QNFdfdGFibGUzMlRvQkUoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQzMiBuYik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29udmVydCBhbiB1bnNpZ25lZCAzMiBiaXRzIGludGVnZXIgZnJvbSBMRSBpbnRvIEJFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXZvaWQgTTRNUDRXX2NvbnZlcnRJbnQzMkJFKE00T1NBX1VJbnQzMiogdmFsUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZS1hbGxvY2F0aW9uIGZ1bmN0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXZvaWQqIE00TVA0V19yZWFsbG9jKE00T1NBX01lbUFkZHIzMiBwdHIsIE00T1NBX1VJbnQzMiBvbGRTaXplLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGUtYWxsb2NhdGUgdGhlIGNvbnRleHQKLSAqIFRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBpbiB0aGUgd3JpdGVyIGV4dGVybmFsIGludGVyZmFjZSwgYnV0IGlzIGNhbGxlZCBmcm9tCi0gKiB0aGUgZnVuY3Rpb24gTTRNUDRXX2Nsb3NlV3JpdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19mcmVlQ29udGV4dChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQdXQgSGkgYW5kIExvIHUxNiBwYXJ0IGluIGEgdTMyIHZhcmlhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0hpKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgSGkpOwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfTG8oTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBMbyk7Ci1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0hpKE00T1NBX1VJbnQzMiogdGFiKTsKLU00T1NBX1VJbnQxNiBNNE1QNFdfZ2V0MzJfTG8oTTRPU0FfVUludDMyKiB0YWIpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypNNE1QNFdfVVRJTFNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjczYTIyMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1dyaXRlci5oCi0gKiBAYnJpZWYgICBDb3JlIE1QNCB3cml0ZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1QNCB3cml0ZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqICAgICAgICAgIFRoZSBNUDQgd3JpdGVyIHNwZWNpZmljIHR5cGVzIGFyZSBkZWZpbmVkIGluIGZpbGUgTTRNUDRXX1R5cGVzLmgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2lmbmRlZiBNNE1QNFdfV1JJVEVSX0gKLSNkZWZpbmUgTTRNUDRXX1dSSVRFUl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0vKiBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJNNE1QNFdfVHlwZXMuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNUDRXIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNFdBUl9NUDRXX09WRVJTSVpFICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00TVA0X1dSSVRFUiAsMHgwMDAwMDEpCi0jZGVmaW5lIE00V0FSX01QNFdfTk9UX0VWQUxVQUJMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRNUDRfV1JJVEVSICwweDAwMDAwMikKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IE1QNFcgdmVyc2lvbgotICogQHBhcmFtICAgIG1ham9yICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgJ21ham9yJyB2ZXJzaW9uIG51bWJlci4KLSAqIEBwYXJhbSAgICBtaW5vciAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlICdtaW5vcicgdmVyc2lvbiBudW1iZXIuCi0gKiBAcGFyYW0gICAgcmV2aXNpb24gICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHRoZSAncmV2aXNpb24nIG51bWJlci4KLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRWZXJzaW9uKE00T1NBX1VJbnQ4KiBtYWpvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogbWlub3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHJldmlzaW9uKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5pdGlhdGlvbiBvZiB0aGUgTVA0IGZpbGUgY3JlYXRpb24KLSAqIEBwYXJhbSAgICBjb250ZXh0UHRyICAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlIE1QNCB3cml0ZXIgY29udGV4dCB0byBjcmVhdGUuCi0gKiBAcGFyYW0gICAgb3V0cHV0RmlsZURlc2NyaXB0b3IgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBvcGVuLgotICogQHBhcmFtICAgIGZpbGVXcml0ZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMuCi0gKiBAcGFyYW0gICAgdGVtcEZpbGVEZXNjcmlwdG9yICAgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBvcGVuLgotICogQHBhcmFtICAgIGZpbGVSZWFkZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19vcGVuV3JpdGUoIE00T1NBX0NvbnRleHQqICAgICAgICAgICAgICAgICAgY29udGV4dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgICAgZmlsZVdyaXRlckZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgZmlsZVJlYWRlckZ1bmN0aW9uICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFkZCBhIG5ldyB0cmFjawotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgIChJTi9PVVQpICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgc3RyZWFtRGVzY1B0ciAgICAgICAgKElOKSAgICAgIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGZvciB0aGUgbmV3IHRyYWNrLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQ6ICBBbiBhdWRpbyAocmVzcC52aWRlbykgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGlzIGNvbnRleHQgd2hpbGUgYXR0ZW1wdGluZyB0byBhZGQgYW5vdGhlciBvbmUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgZm9yYmlkZGVuLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2FkZFN0cmVhbSggTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiAgICAgc3RyZWFtRGVzY1B0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2lnbmFsIHRvIHRoZSBjb3JlIE1QNCB3cml0ZXIgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHRyYWNrcyB0byBhZGQKLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBJbnZhbGlkIHN0YXRlCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfQ09OVEVYVDogIEF1ZGlvIHNpemUgZXN0aW1hdGlvbiBpcyByZXF1aXJlZCBidXQgbm90IHR3byBzdHJlYW1zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYmVlbiBhZGRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydFdyaXRpbmcoIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQXNrcyB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIGluaXRpYXRlIHRoZSBhY2Nlc3MgdW5pdCBjcmVhdGlvbiBpbgotICogICAgICAgICAgdGhlIHN0cmVhbUlEIHRyYWNrCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHN0cmVhbUlEICAgICAgICAgICAgKElOKSBTdHJlYW0gSUQgb2YgdGhlIHRyYWNrLgotICogQHBhcmFtICAgYXVQdHIgICAgICAgICAgICAgICAoSU4vT1VUKSBBY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDpVbmtub3duIHN0cmVhbSBJRAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydEFVKCBNNE9TQV9Db250ZXh0ICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCAgICAgICBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogICAgYXVQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHdyaXRlIHRoZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtSUQgdHJhY2sKLSAqIEBub3RlICAgIElmIE00TVA0V19XQVJfT1ZFUlNJWkUgaXMgcmV0dXJuZWQsIE00TVA0V19zdGFydEFVIG11c3Qgbm90IGJlIGNhbGxlZCBhbnltb3JlLAotICogICAgICAgICAgYnV0IGRpcmVjdGx5IE00TVA0V19jbG9zZVdyaXRlKCkuCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpICAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgc3RyZWFtSUQgICAgICAgICAgICAoSU4pICAgICAgIFN0cmVhbSBJRCBvZiB0aGUgdHJhY2suCi0gKiBAcGFyYW0gICBhdVB0ciAgICAgICAgICAgICAgIChJTi9PVVQpICAgQWNjZXNzIHVuaXQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiAgICAgICAgVW5rbm93biBzdHJlYW0gSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgSW52YWxpZCBzdGF0ZQotICogQHJldHVybiAgICBNNFdBUl9NUDRXX05PVF9FVkFMVUFCTEU6ICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGV2YWx1YXRlIGF1ZGlvIHNpemUgaWYgYXVkaW8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IHNpemUuCi0gKiBAcmV0dXJuICAgIE00V0FSX01QNFdfT1ZFUlNJWkU6ICAgICAgICBNYXggZmlsZSBzaXplIHdhcyByZWFjaGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfcHJvY2Vzc0FVKCBNNE9TQV9Db250ZXh0ICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgICAgIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgIGF1UHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgIENsb3NlIHRoZSBNUDQgZmlsZQotICogQG5vdGUgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgTVA0IHdyaXRlciwgdGhlIE00TVA0V19mcmVlQ29udGV4dCBtZXRob2QKLSAqICAgICAgICAgICAgd2FzIGluIHRoZSBpbnRlcmZhY2UsIHdoaWNoIGlzIG5vdCB0aGUgY2FzZSBhbnltb3JlLgotICogICAgICAgICAgICBUaGUgY29udGV4dCBpcyBub3cgYWx3YXlzIGRlYWxsb2NhdGVkIGluIHRoZSBNNE1QNFdfY2xvc2VXcml0ZSBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfY2xvc2VXcml0ZSggTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklECi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4pICAgIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBvcHRpb24gICAgICAgICAgICAgICAgIChJTikgICAgT3B0aW9uIElELgotICogQHBhcmFtICAgIHZhbHVlUHRyICAgICAgICAgICAgICAgKE9VVCkgICBQb2ludGVyIHRvIHRoZSBvcHRpb24gdmFsdWUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiAgTm90IGltcGxlbWVudGVkIGluIHRoZSBjdXJyZW50IHZlcnNpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRDogICAgVW5rbm93biBvcHRpb25JRAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiAgICBCYWQgc3RyZWFtIElEIGluIHRoZSBvcHRpb24gdmFsdWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRPcHRpb24oIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgICAgICAgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICAgICp2YWx1ZVB0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAoSU4vT1VUKSAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIG9wdGlvbiAgICAgICAgICAgICAgIChJTikgICAgICBPcHRpb24gSUQuCi0gKiBAcGFyYW0gICAgdmFsdWUgICAgICAgICAgICAgICAgKElOKSAgICAgIE9wdGlvbiB2YWx1ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6ICBOb3QgaW1wbGVtZW50ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbgotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiAgICBVbmtub3duIG9wdGlvbklECi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIEJhZCBzdHJlYW0gSUQgaW4gdGhlIG9wdGlvbiB2YWx1ZQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgICAgICBBIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3NldE9wdGlvbiggTTRPU0FfQ29udGV4dCAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEICAgICAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgdmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBBc2sgdGhlIGNvcmUgTVA0IHdyaXRlciB0byByZXR1cm4gaXRzIHN0YXRlLgotICogQG5vdGUgICAgIEJ5IHNlbGVjdGluZyBhIHNwZWNpZmljIHN0cmVhbUlEIChub3QgbnVsbCksIHRoZSBjYWxsZXIgY2FuIG9idGFpbgotICogICAgICAgICAgIHRoZSBzdGF0ZSBvZiBhIHNwZWNpZmljIHN0cmVhbS4gQnkgdXNpbmcgMCBhcyBzdHJlYW1JRCB0aGUgcmV0dXJuZWQKLSAqICAgICAgICAgICBzdGF0ZSBpcyBub3Qgc3RyZWFtIHNwZWNpZmljLgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOKSAgICAgUG9pbnRlciB0byB0aGUgc3RhdGUgZW51bWVyYXRpb24uCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBzdHJlYW1JRCBvZiB0aGUgc3RyZWFtIHRvIHJldHJpZXZlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm8tc3RhdGUgKDAgZm9yIGdsb2JhbCBzdGF0ZSkuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIFVua25vd24gc3RyZWFtIElECi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRTdGF0ZSggTTRPU0FfQ29udGV4dCAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRXX1N0YXRlKiAgICBzdGF0ZVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgc3RyZWFtSUQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIGN1cnJlbnRseSBleHBlY3RlZCBmaWxlIHNpemUKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRDdXJyZW50RmlsZVNpemUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiAgICAgICAgY3VycmVudEZpbGVTaXplKTsKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotI2VuZGlmIC8qTTRNUDRXX1dSSVRFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhYjMyYmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYjNncHdyaXRlcgotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JfM2dwd3JpdGVyCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICAgIE00TVA0V19JbnRlcmZhY2UuYyBcCi0gICAgICBNNE1QNFdfVXRpbHMuYyBcCi0gICAgICBNNE1QNFdfV3JpdGVyLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLUREVVBMSUNBVEVfU1RUU19JTl9MQVNUX0FVCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmM1MjUwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19JbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfSW50ZXJmYWNlLmMKLSAqIEBicmllZiAgICAzR1BQIGZpbGUgd3JpdGVyIGludGVyZmFjZQotICogQG5vdGUgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBjb21tb24gaW50ZXJmYWNlIGRlZmluZWQKLSAqICAgICAgICAgIGluICJNNFdSSVRFUl9jb21tb24uaCIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0vKioKLSAqIE9TQUwgaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIiAgICAgICAgICAgIC8qKjwgT1NBTCBiYXNpYyB0eXBlcyBkZWZpbml0b24gKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiICAgICAgICAvKio8IEluY2x1ZGUgZm9yIE9TQUwgZmlsZSBhY2Nlc3NlcyBpbXBsZW1lbnRhdGlvbiAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgT1NBTCBtZW1vcnkgYWNjZXNzZXMgaW1wbGVtZW50YXRpb24gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAgICAgICAgIC8qKjwgT1NBTCBkZWJ1ZyB0b29scyAqLwotCi0vKioKLSAqIFdyaXRlciBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAgICAgLyoqPCBEZWZpbml0aW9uIG9mIHRoZSB3cml0ZXIgY29tbW9uIGludGVyZmFjZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1vZHVsZSBmb2xsb3dzICovCi0KLSNpZmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotI2luY2x1ZGUgIk00TVA0V19UeXBlc19Dc3RNZW0uaCIgICAgLyoqPCBNUDQvM0dQIGNvcmUgd3JpdGVyIHR5cGVzICovCi0jaW5jbHVkZSAiTTRNUDRXX1dyaXRlcl9Dc3RNZW0uaCIgICAgLyoqPCBNUDQvM0dQIGNvcmUgd3JpdGVyIGZ1bmN0aW9ucyAqLwotI2Vsc2UKLSNpbmNsdWRlICJNNE1QNFdfVHlwZXMuaCIgICAgICAgICAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1QNFdfV3JpdGVyLmgiICAgICAgICAgICAgLyoqPCBNUDQvM0dQIGNvcmUgd3JpdGVyIGZ1bmN0aW9ucyAqLwotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLS8qKgotICogU3BlY2lmaWMgZXJyb3JzIGZvciB0aGlzIG1vZHVsZSAqLwotI2RlZmluZSBNNFdSSVRFUl8zR1BfRVJSX1VOU1VQUE9SVEVEX1NUUkVBTV9UWVBFIFwKLSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRXUklURVJfM0dQLCAweDAwMDAwMSkKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHdyaXRlciBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCB3cml0ZXIgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NvbnRleHQgICAgcE1QNENvbnRleHQ7ICAgIC8qKjwgTVA0IHdyaXRlciBjb250ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgIG1heEFVc2l6ZXM7ICAgICAgICAvKio8IHRoZSBtYXhpbXVtIEFVIHNpemUgcG9zc2libGUgKi8KLX0gTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dDsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX29wZW5Xcml0ZShNNFdSSVRFUl9Db250ZXh0KiBwQ29udGV4dCwgdm9pZCogcFdoYXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVyUG9pbnRlcikKLSAqIEBicmllZiAgICBPcGVuIGEgd3JpdGVyIHNlc3Npb24uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgKE9VVCkgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsIGFsbG9jYXRlZCBieSB0aGlzIGZ1bmN0aW9uLgotICogQHBhcmFtICAgIG91dHB1dEZpbGVEZXNjcmlwdG9yIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCBmaWxlIHRvIGNyZWF0ZS4KLSAqIEBwYXJhbSAgICBmaWxlV3JpdGVyRnVuY3Rpb24gICAgIChJTikgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNldCBvZiBPU0FMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgd3JpdGUgZnVuY3Rpb25zLgotICogQHBhcmFtICAgIHRlbXBGaWxlRGVzY3JpcHRvciAgICAgKElOKSAgRGVzY3JpcHRvciBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgdG8gb3BlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5VTEwgaWYgbm90IHVzZWQpCi0gKiBAcGFyYW0gICAgZmlsZVJlYWRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YgT1NBTCBmaWxlIHJlYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgKE5VTEwgaWYgbm90IHVzZWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEZpbGVQdHJGY3QgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgb3BlbldyaXRlIChJdHMgY29yZUlEIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX29wZW5Xcml0ZSggTTRXUklURVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0cHV0RmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVyUG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB0ZW1wRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRlclBvaW50ZXIgKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGUiKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVyUG9pbnRlciksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IHBGaWxlV3JpdGVyUG9pbnRlciBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBjb250ZXh0ICovCi0gICAgKnBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgYXBDb250ZXh0ID0gKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQiKTsKLQotICAgIGlmIChNNE9TQV9OVUxMID09IGFwQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOlwKLSAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgY29udGV4dCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIFJlc2V0IGNvbnRleHQgdmFyaWFibGVzICovCi0gICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgYXBDb250ZXh0LT5tYXhBVXNpemVzID0gMDsKLQotICAgIC8qKgotICAgICAqICAgIFJldHVybiB0aGUgd3JpdGVyIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQgPSAoTTRXUklURVJfQ29udGV4dCAqKWFwQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICAgIExhdW5jaCB0aGUgb3BlbldyaXRlIG9mIHRoZSBNUDQgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IGNhbGxpbmcgTTRNUDRXX29wZW5Xcml0ZSgpIik7Ci0KLSAgICBlcnIgPSBNNE1QNFdfb3BlbldyaXRlKCZhcENvbnRleHQtPnBNUDRDb250ZXh0LCBvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgIHBGaWxlV3JpdGVyUG9pbnRlciwgdGVtcEZpbGVEZXNjcmlwdG9yLCBwRmlsZVJlYWRlclBvaW50ZXIgKTsKLQotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfb3BlbldyaXRlIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmcoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBJbmRpY2F0ZXMgdG8gdGhlIHdyaXRlciB0aGF0IHRoZSBzZXR1cCBzZXNzaW9uIGlzIGVuZGVkIGFuZCB0aGF0Ci0gKiAgICAgICAgICB3ZSB3aWxsIHN0YXJ0IHRvIHdyaXRlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBzdGFydFdyaXRpbmcgKEl0cwotICogICAgICAgICAgICBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc6IHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2FsbCB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc6IGNhbGxpbmcgTTRNUDRXX3N0YXJ0V3JpdGluZygpIik7Ci0gICAgZXJyID0gTTRNUDRXX3N0YXJ0V3JpdGluZyhhcENvbnRleHQtPnBNUDRDb250ZXh0KTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3N0YXJ0V3JpdGluZyByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2FkZFN0cmVhbSgKLSAqICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICogICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICpwU3RyZWFtRGVzY3JpcHRpb24pCi0gKiBAYnJpZWYgICAgIEFkZCBhIHN0cmVhbSAoYXVkaW8gb3IgdmlkZW8pLgotICogQG5vdGUgICAgICBEZWNvZGVyIHNwZWNpZmljIGluZm8gcHJvcGVydGllcyBhcmUgY29ycmVjdGx5IHNldCBiZWZvcmUgY2FsbGluZwotICogICAgICAgICAgICB0aGUgY29yZSB3cml0ZXIgYWRkIGZ1bmN0aW9uCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcGFyYW0gICAgIHN0cmVhbURlc2NyaXB0aW9uOiAgICAoSU4pIHN0cmVhbSBkZXNjcmlwdGlvbi4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwU3RyZWFtRGVzY3JpcHRpb24gaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgYWRkU3RyZWFtCi0gKiAgICAgICAgICAgIChJdHMgY29yZUlEIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX2FkZFN0cmVhbShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjcmlwdGlvbikKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0ICphcENvbnRleHQgPQotICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zICpwVmlkZW9JbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zICpwQXVkaW9JbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfU3RyZWFtSURzaXplIHNpemVWYWx1ZTsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBwQ29udGV4dD0weCV4LCAiCi0gICAgICAgICAgICAgICAgICAgInBTdHJlYW1EZXNjcmlwdGlvbj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFN0cmVhbURlc2NyaXB0aW9uKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RyZWFtRGVzY3JpcHRpb24pLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBwU3RyZWFtRGVzY3JpcHRpb24gaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgQWRhcHQgYXVkaW8vdmlkZW8gc3RyZWFtIGluZm9zICovCi0gICAgc3dpdGNoIChwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogIgotICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIGEgVmlkZW8gc3RyZWFtIChzdHJlYW1UeXBlPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogICAgQ29tbW9uIGRlc2NyaXB0aW9ucyAqLwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1JRCA9IFZpZGVvU3RyZWFtSUQ7ICAgIC8qKjwgVGhlIG9ubHkgdmFsdWVzIGNoZWNrZWQgYnkgb3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlIHdyaXRlciBhcmUgc3RyZWFtSUQgKi8KLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+dGltZVNjYWxlID0gMTAwMDsgICAgICAgICAgICAvKio8IGFuZCB0aW1lU2NhbGUgKi8KLQotLyogTm90IHJlY29tbWVuZGVkIGZvciB2aWRlbyBlZGl0aW5nIC0+IHdyaXRlIGV4cGxpY2l0ZWx5IHRoZSAnYml0cicgYm94IGludG8gJ2QyNjMnICovCi0vKiBSZW0gOiBpdCBpcyBSRUwgNSBvZiAzZ3BwIGRvY3VtZW50YXRpb24gKi8KLS8vICAgICAgICAgICAgLyoqCi0vLyAgICAgICAgICAgICAqIEF2ZXJhZ2UgYml0LXJhdGUgbXVzdCBub3QgYmUgc2V0IGluIEgyNjMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFBsYXRmb3JtNCAqLwotLy8gICAgICAgICAgICBpZiAoTTRTWVNfa0gyNjMgPT0gcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPmF2ZXJhZ2VCaXRyYXRlID0gLTE7Ci0vLyAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBEZWNvZGVyIHNwZWNpZmljIGluZm8gKi8KLSAgICAgICAgICAgIHBWaWRlb0luZm8gPSAoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyAqKXBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBwVmlkZW9JbmZvLT5IZWFkZXIuU2l6ZTsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9NZW1BZGRyMzIpcFZpZGVvSW5mby0+SGVhZGVyLnBCdWY7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogVmlkZW86IERTST0weCV4LCBEU0lzaXplPSVkIiwKLSAgICAgICAgICAgICAgICAgcFZpZGVvSW5mby0+SGVhZGVyLnBCdWYsIHBWaWRlb0luZm8tPkhlYWRlci5TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgY2FzZSBNNFNZU19rQU1SX1dCOgotICAgICAgICBjYXNlIE00U1lTX2tBQUM6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0VWUkM6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogYWRkaW5nIGFuIEF1ZGlvIHN0cmVhbSAoc3RyZWFtVHlwZT0weCV4KSIsCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqICAgIENvbW1vbiBkZXNjcmlwdGlvbnMgKi8KLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtSUQgPSBBdWRpb1N0cmVhbUlEOyAgICAvKio8IFRoZSBvbmx5IHZhbHVlIGNoZWNrZWQgYnkgb3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUgd3JpdGVyIGlzIHN0cmVhbUlEICovCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogICAgRGVjb2RlciBzcGVjaWZpYyBpbmZvICovCi0gICAgICAgICAgICBwQXVkaW9JbmZvID0gKE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgKilwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gcEF1ZGlvSW5mby0+SGVhZGVyLlNpemU7Ci0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm8gPSAoTTRPU0FfTWVtQWRkcjMyKXBBdWRpb0luZm8tPkhlYWRlci5wQnVmOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IEF1ZGlvOiBEU0k9MHgleCwgRFNJc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgIHBBdWRpb0luZm8tPkhlYWRlci5wQnVmLCBwQXVkaW9JbmZvLT5IZWFkZXIuU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06XAotICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXUklURVJfM0dQX0VSUl9VTlNVUFBPUlRFRF9TVFJFQU1fVFlQRSAoc3RyZWFtVHlwZT0weCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRXUklURVJfM0dQX0VSUl9VTlNVUFBPUlRFRF9TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIENhbGwgdGhlIE1QNCBjb3JlIHdyaXRlciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBjYWxsaW5nIE00TVA0V19hZGRTdHJlYW0oKSIpOwotICAgIGVyciA9IE00TVA0V19hZGRTdHJlYW0oYXBDb250ZXh0LT5wTVA0Q29udGV4dCxwU3RyZWFtRGVzY3JpcHRpb24pOwotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBNNE1QNFdfYWRkU3RyZWFtIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiAoZXJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBGb3IgVmlkZW8sIHNldCB0aGUgTTRNUDRXX3RyYWNrU2l6ZSBPcHRpb24gKi8KLSAgICBzd2l0Y2ggKHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLSAgICAgICAgICAgIHNpemVWYWx1ZS5zdHJlYW1JRCA9IFZpZGVvU3RyZWFtSUQ7Ci0gICAgICAgICAgICBzaXplVmFsdWUuaGVpZ2h0ID0gKE00T1NBX1VJbnQxNikocFZpZGVvSW5mby0+aGVpZ2h0KTsKLSAgICAgICAgICAgIHNpemVWYWx1ZS53aWR0aCAgPSAoTTRPU0FfVUludDE2KShwVmlkZW9JbmZvLT53aWR0aCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogVmlkZW86IGhlaWdodD0lZCwgd2lkdGg9JWQiLAotICAgICAgICAgICAgICAgICBzaXplVmFsdWUuaGVpZ2h0LCBzaXplVmFsdWUud2lkdGgpOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogY2FsbGluZyBNNE1QNFdfc2V0T3B0aW9uKE00TVA0V190cmFja1NpemUpIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKCBhcENvbnRleHQtPnBNUDRDb250ZXh0LCBNNE1QNFdfdHJhY2tTaXplLAotICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikmc2l6ZVZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogTTRNUDRXX3NldE9wdGlvbiByZXR1cm5zIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIENsb3NlIHRoZSB3cml0ZXIuIFRoZSBjb250ZXh0IGlzIGZyZWVkIGhlcmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIGNsb3NlV3JpdGUgKEl0cyBjb3JlSUQKLSAqICAgICAgICAgICAgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dD0oTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGUgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDYWxsIHRoZSBNUDQgY29yZSB3cml0ZXIgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBhcENvbnRleHQtPnBNUDRDb250ZXh0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOiBjYWxsaW5nIE00TVA0V19jbG9zZVdyaXRlKCkiKTsKLSAgICAgICAgZXJyID0gTTRNUDRXX2Nsb3NlV3JpdGUoYXBDb250ZXh0LT5wTVA0Q29udGV4dCk7Ci0gICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOiBNNE1QNFdfY2xvc2VXcml0ZSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgRGVhbGxvY2F0ZSBvdXIgb3duIGNvbnRleHQgKi8KLSAgICBmcmVlKGFwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uKAotICogICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAqICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotICogQGJyaWVmICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIHdyaXRlciB0byBzZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAotICogICAgICAgICAgICB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvCi0gKiAgICAgICAgICAgIGRlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnQuCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgcHB0aW9uSWQ6ICAgICAoSU4pIElEIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotICogQHBhcmFtICAgICBPcHRpb25WYWx1ZSA6IChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIElEIG9mIHRoZSBvcHRpb24gaXMgbm90IHZhbGlkLgotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBzZXRPcHRpb24gKEl0cyBjb3JlSUQKLSAqICAgICAgICAgICAgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uKAotICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TVA0V19tZW1BZGRyIG1lbXZhbDsKLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIG9wdHZhbDsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uOiBwQ29udGV4dD0weCV4LCBvcHRpb25JRD0weCV4LFwKLSAgICAgICAgIG9wdGlvblZhbHVlPTB4JXgiLCBwQ29udGV4dCwgb3B0aW9uSUQsIG9wdGlvblZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09YXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3NldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4QVVTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01heEFVU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heEFVc2l6ZSwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19tYXhBVXNpemUpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBjaHVuY2sgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01heENodW5ja1NpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heENodW5rU2l6ZSwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19tYXhDaHVua1NpemUpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgRmlsZSBzdHJpbmcgc2lnbmF0dXJlICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nIG9wdGlvbiIpOwotICAgICAgICAgICAgLyogVGhlIGdpdmVuIE00T1NBX0RhdGFPcHRpb24gbXVzdCBhY3R1YWxseQotICAgICAgICAgICAgICAgYmUgYSB0ZXh0IHN0cmluZyAqLwotICAgICAgICAgICAgbWVtdmFsLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgLyoqPCB0aGlzIGlzIG1heCBzdHJpbmcgc2l6ZSBjb3BpZWQgYnkgdGhlIGNvcmUgKi8KLSAgICAgICAgICAgIG1lbXZhbC5zaXplID0gMTY7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX2VtYmVkZGVkU3RyaW5nLCAmbWVtdmFsKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfZW1iZWRkZWRTdHJpbmcpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgRmlsZSBpbnRlZ3JhdGlvbiB0YWcgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rSW50ZWdyYXRpb25UYWc6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rSW50ZWdyYXRpb25UYWcgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBUaGUgZ2l2ZW4gTTRPU0FfRGF0YU9wdGlvbiBtdXN0IGFjdHVhbGx5Ci0gICAgICAgICAgICAgICBiZSBhIHRleHQgc3RyaW5nICovCi0gICAgICAgICAgICBtZW12YWwuYWRkciA9IChNNE9TQV9NZW1BZGRyMzIpb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICAvKio8IHRoaXMgaXMgbWF4IHN0cmluZyBzaXplIGNvcGllZCBieSB0aGUgY29yZSAqLwotICAgICAgICAgICAgbWVtdmFsLnNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX2ludGVncmF0aW9uVGFnLCAmbWVtdmFsKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfaW50ZWdyYXRpb25UYWcpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgRmlsZSB2ZXJzaW9uIHNpZ25hdHVyZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb246Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uIG9wdGlvbiIpOwotICAgICAgICAgICAgLyogVGhlIGdpdmVuIE00T1NBX0RhdGFPcHRpb24gbXVzdCBhY3R1YWxseQotICAgICAgICAgICAgICAgYmUgYSB2ZXJzaW9uIG51bWJlciAqLwotCi0gICAgICAgICAgICAvKio8IEhlcmUgMCBtZWFucyBib3RoIHN0cmVhbXMgKi8KLSAgICAgICAgICAgIG9wdHZhbC5zdHJlYW1JRCA9IDA7Ci0gICAgICAgICAgICAvKio8IHZlcnNpb24gbnVtYmVyICovCi0gICAgICAgICAgICBvcHR2YWwudmFsdWUgPSAqKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX0NhbWNvZGVyVmVyc2lvbiwgJm9wdHZhbCk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX0NhbWNvZGVyVmVyc2lvbikiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBTb21lIG9wdGlvbnMgYXJlIHJlYWQtb25seSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tGaWxlU2l6ZToKLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJ0cnlpbmcgdG8gc2V0IGEgcmVhZC1vbmx5IG9wdGlvbiEgKElEPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfUkVBRF9PTkxZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGZpbGVzaXplIGxpbWl0YXRpb24gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4RmlsZVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4RmlsZVNpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heEZpbGVTaXplLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX21heEZpbGVTaXplKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBmaWxlIGR1cmF0aW9uIGxpbWl0YXRpb24gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01heEZpbGVEdXJhdGlvbiBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4RmlsZUR1cmF0aW9uLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFNldCAnZnR5cCcgYXRvbSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tTZXRGdHlwQm94OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa1NldEZ0eXBCb3ggb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V19zZXRGdHlwQm94LCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX3NldEZ0eXBCb3gpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBEZWNvZGVyIFNwZWNpZmljIEluZm8gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRFNJOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa0RTSSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgTTRNUDRXX0RTSSwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19EU0kpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKisgSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01VTF9QUFNfU1BTOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01VTF9QUFNfU1BTIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCBNNE1QNFdfTVVMX1BQU19TUFMsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfRFNJKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyotIEguMjY0IFRyaW1taW5nICAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBVbmtub3duIG9wdGlvbiAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoInRyeWluZyB0byBzZXQgYW4gdW5rbm93biBvcHRpb24hXAotICAgICAgICAgICAgICAgICAob3B0aW9uSUQ9MHgleCkiLCBvcHRpb25JRCk7Ci0gICAgICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9zZXRPcHRpb246IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uKAotICogICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAqICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotICogQGJyaWVmICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIHdyaXRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAotICogICAgICAgICAgICB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvCi0gKiAgICAgICAgICAgIGRlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnQuCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgT3B0aW9uSWQ6ICAgICAgKElOKSBJZCBvZiB0aGUgb3B0aW9uIHRvIGdldC4KLSAqIEBwYXJhbSAgICAgcE9wdGlvblZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uIHRvIGdldC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgSUQgb2YgdGhlIG9wdGlvbiBpcyBub3QgdmFsaWQuCi0gKiBAcmV0dXJuICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogVGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgZ2V0T3B0aW9uIChJdHMgY29yZUlECi0gKiAgICAgICAgICAgIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldE9wdGlvbigKLSAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9nZXRPcHRpb246IHBDb250ZXh0PTB4JXgsIG9wdGlvbklEPTB4JXgsXAotICAgICAgICAgb3B0aW9uVmFsdWU9MHgleCIsIHBDb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4QVVTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImdldHRpbmcgTTRXUklURVJfa01heEFVU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19nZXRPcHRpb24oYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4QVVzaXplLAotICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikmb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfZ2V0T3B0aW9uKE00TVA0V19tYXhBVXNpemUpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBjaHVuY2sgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImdldHRpbmcgTTRXUklURVJfa01heENodW5ja1NpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0T3B0aW9uKGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heENodW5rU2l6ZSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopJm9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldE9wdGlvbihNNE1QNFdfbWF4Q2h1bmtTaXplKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFRoZSBmaWxlIHNpemUgb3B0aW9uICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImdldHRpbmcgTTRXUklURVJfa0ZpbGVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgLyogZ2V0IHRoZSBjdXJyZW50IGZpbGUgc2l6ZSAqLwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSgKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCAoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19nZXRDdXJyZW50RmlsZVNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBUaGUgZmlsZSBzaXplIHdpdGggYXVkaW8gb3B0aW9uIGhhcyBpdHMgb3duIGZ1bmN0aW9uIGNhbGwKLSAgICAgICAgICAgICAgaW4gdGhlIE1QNCBjb3JlIHdyaXRlciAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImdldHRpbmcgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBnZXQgdGhlIGN1cnJlbnQgZmlsZSBzaXplIC4uLiAqLwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSgKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCAoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19nZXRDdXJyZW50RmlsZVNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9ubyBtb3JlIG5lZWRlZCAzZ3Agd3JpdGVyIGhhcyBpdHMgb3duIG1lY2FuaXNtCi0gICAgICAgICAgICAvLy8qIC4uLiBhZGQgdGhlIGVzdGltYXRlZCBuZXh0IG1heCBBVSBzaXplICovCi0gICAgICAgICAgICAvLyooKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWUpICs9IGFwQ29udGV4dC0+bWF4QVVzaXplczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgVW5rbm93biBvcHRpb24gKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJ0cnlpbmcgdG8gZ2V0IGFuIHVua25vd24gb3B0aW9uIVwKLSAgICAgICAgICAgICAgICAgKG9wdGlvbklEPTB4JXgpIiwgb3B0aW9uSUQpOwotICAgICAgICAgICAgcmV0dXJuICAgIChNNE9TQV9FUlIpTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0QVUoCi0gKiAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAqICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgICAgUHJlcGFyZSBhbiBBY2Nlc3MgVW5pdCB0byBiZSByZWFkeSB0byBzdG9yZSBkYXRhCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQKLSAqICAgICAgICAgICAgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHByZXBhcmVkLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBBVSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiBzdHJlYW1JRCBpcyBub3QgVmlkZW9TdHJlYW1JRCBub3IKLSAqICAgICAgICAgICAgQXVkaW9TdHJlYW1JRCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgc3RhcnRBVSAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zdGFydEFVKAotICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9zdGFydEFVOiBwQ29udGV4dD0weCV4LCBzdHJlYW1JRD0lZCwgcEFVPTB4JXgiLAotICAgICAgICAgcENvbnRleHQsIHN0cmVhbUlELCBwQVUpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQVUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3N0YXJ0QVU6IHBBVSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKAotICAgICAgICAgKChWaWRlb1N0cmVhbUlEICE9IHN0cmVhbUlEKSAmJiAoQXVkaW9TdHJlYW1JRCAhPSBzdHJlYW1JRCkpLAotICAgICAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBXcm9uZyBzdHJlYW1JRCIpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGUgTVA0IHdyaXRlciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogY2FsbGluZyBNNE1QNFdfc3RhcnRBVSgpIik7Ci0gICAgZXJyID0gTTRNUDRXX3N0YXJ0QVUoYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgc3RyZWFtSUQsIHBBVSk7Ci0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zdGFydEFVIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIkFVOiBkYXRhQWRkcmVzcz0weCV4LCBzaXplPSVkIiwKLSAgICAgICAgIHBBVS0+ZGF0YUFkZHJlc3MsIHBBVS0+c2l6ZSk7Ci0KLSAgICAvKiBDb252ZXJ0IG92ZXJzaXplIHRvIGEgcmVxdWVzdCB0b3dhcmQgVkVTIGF1dG9tYXRvbiAqLwotICAgIGlmIChNNFdBUl9NUDRXX09WRVJTSVpFID09IGVycikKLSAgICB7Ci0gICAgICAgIGVyciA9IE00V0FSX1dSSVRFUl9TVE9QX1JFUTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX3N0YXJ0QVU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVKAotICogICAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gKiAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi0gKiBAYnJpZWYgICAgIFdyaXRlIGFuIEFjY2VzcyBVbml0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQKLSAqICAgICAgICAgICAgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHdyaXR0ZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwQVUgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogc3RyZWFtSUQgaXMgbm90IFZpZGVvU3RyZWFtSUQgbm9yCi0gKiAgICAgICAgICAgIEF1ZGlvU3RyZWFtSUQgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHByb2Nlc3NBVQotICogICAgICAgICAgICAoSXRzIGNvcmVJRCBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9wcm9jZXNzQVUoCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiAiCi0gICAgICAgICAgICAgICAgICAgInBDb250ZXh0PTB4JXgsIHN0cmVhbUlEPSVkLCBwQVU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQVUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogcEFVIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoCi0gICAgICAgICAoKFZpZGVvU3RyZWFtSUQgIT0gc3RyZWFtSUQpICYmIChBdWRpb1N0cmVhbUlEICE9IHN0cmVhbUlEKSksCi0gICAgICAgICBNNEVSUl9CQURfU1RSRUFNX0lELAotICAgICAgICAgIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IFdyb25nIHN0cmVhbUlEIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfNCgiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogQVU6ICIKLSAgICAgICAgICJkYXRhQWRkcmVzcz0weCV4LCBzaXplPSVkLCBDVFM9JWQsIG5iRnJhZz0lZCIsCi0gICAgICAgICBwQVUtPmRhdGFBZGRyZXNzLCBwQVUtPnNpemUsIChNNE9TQV9VSW50MzIpcEFVLT5DVFMsIHBBVS0+bmJGcmFnKTsKLQotICAgIGlmKHBBVS0+c2l6ZSA+IGFwQ29udGV4dC0+bWF4QVVzaXplcykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+bWF4QVVzaXplcyA9IHBBVS0+c2l6ZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ2FsbCB0aGUgTVA0IHdyaXRlciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBjYWxsaW5nIE00TVA0V19wcm9jZXNzQVUoKSIpOwotICAgIGVyciA9IE00TVA0V19wcm9jZXNzQVUoYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgc3RyZWFtSUQsIHBBVSk7Ci0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19wcm9jZXNzQVUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICAvKiBDb252ZXJ0IG92ZXJzaXplIHRvIGEgcmVxdWVzdCB0b3dhcmQgVkVTIGF1dG9tYXRvbiAqLwotICAgIGlmKE00V0FSX01QNFdfT1ZFUlNJWkUgPT0gZXJyKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfV1JJVEVSX1NUT1BfUkVROwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoCi0gKiAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICogICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gKiAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKQotICogQGJyaWVmICAgICBHZXQgdGhlIDNHUFAgd3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgUmV0cmlldmVzIHRoZSBzZXQgb2YgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2UgdGhlIDNHUFAgd3JpdGVyLgotICogICAgICAgICAgICBJdCBmb2xsb3dzIHRoZSBjb21tb24gd3JpdGVyIGludGVyZmFjZS4KLSAqIEBwYXJhbSAgICAgVHlwZTogKE9VVCkgcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgd3JpdGVyLiBXaWxsIGFsd2F5cyBiZQotICogICAgICAgICAgICBNNFdSSVRFUl9rM0dQUC4KLSAqIEBwYXJhbSAgICAgU3JjR2xvYmFsSW50ZXJmYWNlOiAoT1VUKSBNYWluIHNldCBvZiBmdW5jdGlvbiB0byB1c2UgdGhpcwotICogICAgICAgICAgICAzR1BQIHdyaXRlcgotICogQHBhcmFtICAgICBTcmNEYXRhSW50ZXJmYWNlOiAgIChPVVQpIFNldCBvZiBmdW5jdGlvbiByZWxhdGVkIHRvIGRhdGFzCi0gKiAgICAgICAgICAgIHRvIHVzZSB0aGlzIDNHUFAgd3JpdGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoCi0gICAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKQotewotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcEdsb2JhbDsKLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICpwRGF0YTsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogIgotICAgICAgICAgIlR5cGU9MHgleCwgU3JjR2xvYmFsSW50ZXJmYWNlPTB4JXgsXAotICAgICAgICAgU3JjRGF0YUludGVyZmFjZT0weCV4IiwgVHlwZSwgU3JjR2xvYmFsSW50ZXJmYWNlLCBTcmNEYXRhSW50ZXJmYWNlKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBUeXBlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBUeXBlIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gU3JjR2xvYmFsSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBTcmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBTcmNEYXRhSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBTcmNEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIFNldCB0aGUgb3V0cHV0IHR5cGUgKi8KLSAgICAqVHlwZSA9IE00V1JJVEVSX2szR1BQOwotCi0gICAgLyoqCi0gICAgICogICAgQWxsb2NhdGUgdGhlIGdsb2JhbCBpbnRlcmZhY2Ugc3RydWN0dXJlICovCi0gICAgcEdsb2JhbCA9IChNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICAgICBNNFdSSVRFUl8zR1AsIChNNE9TQV9DaGFyICopIk00V1JJVEVSX0dsb2JhbEludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBHbG9iYWwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgidW5hYmxlIHRvIGFsbG9jYXRlIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICpTcmNHbG9iYWxJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICAqU3JjRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIEFsbG9jYXRlIHRoZSBkYXRhIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwRGF0YSA9Ci0gICAgICAgIChNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKSwKLSAgICAgICAgTTRXUklURVJfM0dQLCAoTTRPU0FfQ2hhciAqKSJNNFdSSVRFUl9EYXRhSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcERhdGEpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgidW5hYmxlIHRvIGFsbG9jYXRlIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UsXAotICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKHBHbG9iYWwpOwotICAgICAgICAqU3JjR2xvYmFsSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgKlNyY0RhdGFJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBGaWxsIHRoZSBnbG9iYWwgaW50ZXJmYWNlIHN0cnVjdHVyZSAqLwotICAgIHBHbG9iYWwtPnBGY3RPcGVuID0gTTRXUklURVJfM0dQX29wZW5Xcml0ZTsKLSAgICBwR2xvYmFsLT5wRmN0QWRkU3RyZWFtID0gTTRXUklURVJfM0dQX2FkZFN0cmVhbTsKLSAgICBwR2xvYmFsLT5wRmN0U3RhcnRXcml0aW5nID0gTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzsKLSAgICBwR2xvYmFsLT5wRmN0Q2xvc2VXcml0ZSA9IE00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOwotICAgIHBHbG9iYWwtPnBGY3RTZXRPcHRpb24gPSBNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uOwotICAgIHBHbG9iYWwtPnBGY3RHZXRPcHRpb24gPSBNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uOwotCi0gICAgLyoqCi0gICAgICogICAgRmlsbCB0aGUgZGF0YSBpbnRlcmZhY2Ugc3RydWN0dXJlICovCi0gICAgcERhdGEtPnBTdGFydEFVID0gTTRXUklURVJfM0dQX3N0YXJ0QVU7Ci0gICAgcERhdGEtPnBQcm9jZXNzQVUgPSBNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOwotCi0gICAgLyoqCi0gICAgICogICAgU2V0IHRoZSByZXR1cm4gdmFsdWVzICovCi0gICAgKlNyY0dsb2JhbEludGVyZmFjZSA9IHBHbG9iYWw7Ci0gICAgKlNyY0RhdGFJbnRlcmZhY2UgPSBwRGF0YTsKLQotICAgIE00T1NBX1RSQUNFMl8wKCJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1V0aWxzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJlMmFkMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19VdGlscy5jCi0gKiBAYnJpZWYgICBVdGlsaXRpZXMgYW5kIHByaXZhdGUgZnVuY3Rpb25zIGZvciB0aGUgTVA0IHdyaXRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLSNpbmNsdWRlICJNNE1QNFdfVXRpbHMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIgotCi0jZGVmaW5lIEVSUl9DSEVDSyhleHAsIGVycikgaWYgKCEoZXhwKSkgeyByZXR1cm4gZXJyOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCeXRlKE00T1NBX1VDaGFyIGMsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IGZpbGVGdW5jdGlvbi0+d3JpdGVEYXRhKGNvbnRleHQsIChNNE9TQV9NZW1BZGRyOCkmYywgMSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMTYoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDgpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpdmFsLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTI0KE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiAxNiksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDgpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpdmFsLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTMyKE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiAyNCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDE2KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gOCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcil2YWwsIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJsb2NrKGNvbnN0IE00T1NBX1VDaGFyKiBCbG9jaywgTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLCBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gZmlsZUZ1bmN0aW9uLT53cml0ZURhdGEoY29udGV4dCwgKE00T1NBX01lbUFkZHI4KUJsb2NrLCBzaXplKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTTRNUDRXX2NvbnZlcnRJbnQzMkJFKE00T1NBX1VJbnQzMiogdmFsUHRyKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVUNoYXIgYSwgYjsKLSAgICBNNE9TQV9VQ2hhciogYyA9IChNNE9TQV9VQ2hhciopdmFsUHRyOwotICAgIGEgICAgICAgPSAqKGMpOwotICAgIGIgICAgICAgPSAqKGMrMSk7Ci0gICAgKihjKSAgID0gKihjKzMpOwotICAgICooYysxKSA9ICooYysyKTsKLSAgICAqKGMrMikgPSBiOwotICAgICooYyszKSA9IGE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNNE1QNFdfdGFibGUzMlRvQkUoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQzMiBuYikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIGZvciAoaT0wOyBpPG5iOyBpKyspCi0gICAgICAgIE00TVA0V19jb252ZXJ0SW50MzJCRSgmKHRhYilbaV0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQqIE00TVA0V19yZWFsbG9jKE00T1NBX01lbUFkZHIzMiBwdHIsIE00T1NBX1VJbnQzMiBvbGRTaXplLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX01lbUFkZHIzMiBwdHIyID0gKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3U2l6ZSwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInJlYWxsb2MiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwdHIyKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcHRyMiwgKHZvaWQgKilwdHIsIG9sZFNpemUpOwotICAgIH0KLSAgICBmcmVlKHB0cik7Ci0gICAgcmV0dXJuIHB0cjI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19mcmVlQ29udGV4dChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICBNNE9TQV9VSW50MzIgaTsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhKiBtTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKmZyZWVDb250ZXh0IGlzIG5vdyBjYWxsZWQgYWZ0ZXIgY2xvc2VXcml0ZSovCi0gICAgRVJSX0NIRUNLKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19jbG9zZWQsIE00RVJSX1NUQVRFKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qZGVsZXRlIGFsc28gb3RoZXIgY2h1bmtzIGlmIGFueSovCi0gICAgICAgIC8qZm9yIChpPTA7IGk8PW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgICAgICBmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rW2ldKTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmspICYmCi0gICAgICAgICAgICAgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLypub3cgZHluYW1pYyovCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1ogIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1opOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kpOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKmRlbGV0ZSBhbHNvIG90aGVyIGNodW5rcyBpZiBhbnkqLwotICAgICAgICAvKmZvciAoaT0wOyBpPD1tTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrKSovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAgICAgZm9yIChpPTA7IGk8PW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSk7Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmICgoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rKSAmJgotICAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpOwotICAgICAgICB9Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIC8qbm93IGR5bmFtaWMqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLypub3cgZHluYW1pYyovCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWikKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1opOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmcmVlKG1NcDRGaWxlRGF0YVB0cik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0hpKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgSGkpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAqdGFiICY9IDB4RkZGRjsKLSAgICAqdGFiIHw9IEhpPDwxNjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9Wb2lkIE00TVA0V19wdXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDE2IExvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgKnRhYiAmPSAweEZGRkYwMDAwOwotICAgICp0YWIgfD0gTG87Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVUludDE2IE00TVA0V19nZXQzMl9IaShNNE9TQV9VSW50MzIqIHRhYikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIHJldHVybiAoKnRhYiA+PiAxNikgJiAweEZGRkY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVUludDE2IE00TVA0V19nZXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIHJldHVybiAqdGFiICYgMHhGRkZGOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkZmM0NDEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1dyaXRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1dyaXRlci5jCi0gKiBAYnJpZWYgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00TVA0V19Xcml0ZXIuaCIKLSNpbmNsdWRlICJNNE1QNFdfVXRpbHMuaCIKLQotLyogQ2hlY2sgb3B0aW1pc2F0aW9uIGZsYWdzIDogQkVHSU4gKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotI2Vycm9yICJfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBfTTRNUDRXX01PT1ZfRklSU1QiCi0KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotI2lmbmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotI2Vycm9yICJfTTRNUDRXX1VOQlVGRkVSRURfVklERU8gc2hvdWxkIGJlIHVzZWQgd2l0aCBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSIKLQotI2VuZGlmCi0KLSNlbmRpZgotLyogQ2hlY2sgb3B0aW1pc2F0aW9uIGZsYWdzIDogRU5EICovCi0KLSNpZm5kZWYgX000TVA0V19ET05UX1VTRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNlbmRpZiAvKl9NNE1QNFdfRE9OVF9VU0VfVElNRV9IKi8KLQotLypNQUNST1MqLwotI2RlZmluZSBNQUpPUl9WRVJTSU9OIDMKLSNkZWZpbmUgTUlOT1JfVkVSU0lPTiAzCi0jZGVmaW5lIFJFVklTSU9OIDAKLQotI2RlZmluZSBFUlJfQ0hFQ0soZXhwLCBlcnIpIGlmICghKGV4cCkpIHsgcmV0dXJuIGVycjsgfQotI2RlZmluZSBDTEVBTlVQb25FUlIoZnVuYykgaWYgKChlcnIgPSBmdW5jKSAhPSBNNE5PX0VSUk9SKSBnb3RvIGNsZWFudXAKLQotI2RlZmluZSBtYXgoYSxiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0KLS8qKioqKioqKioqKioqKiovCi0vKlN0YXRpYyBibG9ja3MqLwotLyoqKioqKioqKioqKioqKi8KLQotLypDb21tb25CbG9ja3MqLwotCi1jb25zdCBNNE9TQV9VQ2hhciBEZWZhdWx0X2Z0eXAgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsICdmJywgJ3QnLCAneScsICdwJywgJzMnLCAnZycsICdwJywgJzcnLCAweDAwLCAweDAwLAotICAgIDB4MDMsIDB4MDAsICczJywgJ2cnLCAncCcsICc3JywgJ2knLCAncycsICdvJywgJ20nCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazIgW10gPQotewotICAgICdtJywgJ2QnLCAnYScsICd0JwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2szIFtdID0KLXsKLSAgICAnbScsICdvJywgJ28nLCAndicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NkMsICdtJywgJ3YnLCAnaCcsICdkJywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4RTgKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s2IFtdID0KLXsKLSAgICAndCcsICdyJywgJ2EnLCAnaycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NUMsICd0JywgJ2snLCAnaCcsICdkJywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazcgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrN2JpcyBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDQwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazggW10gPQotewotICAgICdtJywgJ2QnLCAnaScsICdhJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgJ20nLCAnZCcsICdoJywgJ2QnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrOSBbXSA9Ci17Ci0gICAgMHg1NSwgMHhDNCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxMCBbXSA9Ci17Ci0gICAgJ20nLCAnaScsICduJywgJ2YnLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAnZCcsICdpJywgJ24nLCAnZicsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgxQywgJ2QnLCAncicsICdlJywgJ2YnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsICd1JywgJ3InLCAnbCcsICcgJywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazExIFtdID0KLXsKLSAgICAncycsICd0JywgJ2InLCAnbCcKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTIgW10gPQotewotICAgICdzJywgJ3QnLCAndCcsICdzJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25IZWFkZXIgW10gPQotewotICAgICdzJywgJ3QnLCAncycsICdkJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMQotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTUgW10gPQotewotICAgICdzJywgJ3QnLCAncycsICd6JywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxNiBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ2MnLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazE3IFtdID0KLXsKLSAgICAncycsICd0JywgJ2MnLCAnbycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEJsb2NrU2lnbmF0dXJlU2tpcEhlYWRlciBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg1RSwgJ3MnLCAnaycsICdpJywgJ3AnCi19OwotLyogZHVlIHRvIGN1cnJlbnQgbGltaXRhdGlvbnMsIHNpemUgbXVzdCBiZSAxNiAqLwotY29uc3QgTTRPU0FfVUNoYXIgQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nIFtdID0KLXsKLSAgICAnTicsICdYJywgJ1AnLCAnUycsICdXJywgJyAnLCAnQycsICdBJywgJ00nLCAnQycsICdPJywgJ1InLCAnRCcsICdFJywKLSAgICAnUicsICcgJwotfTsKLS8qIGZvbGxvd3MgdGhlIHZlcnNpb24gKGxpa2UgIiAzLjAuMiIpLCB0aGVuICIgLS0gIiAqLwotLyogZHVlIHRvIGN1cnJlbnQgbGltaXRhdGlvbnMsIHNpemUgbXVzdCBiZSA2MCAqLwotY29uc3QgTTRPU0FfVUNoYXIgQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnIFtdID0KLXsKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKLQotLypWaWRlb0Jsb2NrcyovCi0vKiAzMjAqMjQwLCBub3cgbm8gbG9uZ2VyIGhhcmRjb2RlZCAqLwotLyogY29uc3QgTTRPU0FfVUNoYXIgVmlkZW9CbG9jazFbXSA9Ci0gICAgeyAweDAxLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweDAwLCAweDAwIH07ICovCi1jb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrMV8xIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDIxLCAnaCcsICdkJywgJ2wnLCAncicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgJ3YnLCAnaScsICdkJywgJ2UnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweEZGLCAweEZGCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrNCBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ3MnLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OyAvKlNUU1MqLwotCi1jb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrNSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgJ3YnLCAnbScsICdoJywgJ2QnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvUmVzb2x1dGlvbnMgW10gPQotewotICAgIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAKLX07Ci0KLS8qTXA0dkJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBNcDR2QmxvY2sxIFtdID0KLXsKLSAgICAnbScsICdwJywgJzQnLCAndicKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIE1wNHZCbG9jazMgW10gPQotewotICAgIDB4MjAsIDB4MTEKLX07Ci0KLS8qSDI2M0Jsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2sxIFtdID0KLXsKLSAgICAncycsICcyJywgJzYnLCAnMycKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsICdkJywgJzInLCAnNicsICczJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMl9iaXRyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDFGLCAnZCcsICcyJywgJzYnLCAnMycKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazMgW10gPQotewotICAgICdQJywgJ0gnLCAnTCcsICdQJywgMHgwMCwgMHgwQSwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrNCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgJ2InLCAnaScsICd0JywgJ3InCi19OwotCi0vKkgyNjRCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgSDI2NEJsb2NrMSBbXSA9Ci17Ci0gICAgJ2EnLCAndicsICdjJywgJzEnCi19OwotCi0vKiBTdG9yZSB0aGUgYXZjQyBmaWVsZCwgdGhlIHZlcnNpb24gKD0xKSwKLSAgICB0aGUgcHJvZmlsZSAoPTY2KSwgdGhlIGNvbXBhdGliaWxpdHkgKD0wKSwgKi8KLQotLyogdGhlIGxldmVsICg9MTApLDExMTExMSArIE5BTCBmaWVsZCBTaXplICg9IDQgLSAxKSwKLSAgICAxMTEgKyBudW1iZXIgb2YgUFBTICg9MSkgKi8KLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2NEJsb2NrMiBbXSA9Ci17Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgaGFyZGNvZGVkIERTSSB2YWx1ZXMgb2YgSDI2NEJsb2NrMgotICAgICAgICAnYScgLCAndicgLCAnYycgLCAnQycKLX07Ci0KLS8qQU1SQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEFNUkJsb2NrMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SQmxvY2sxXzEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsICdoJywgJ2QnLCAnbCcsICdyJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAncycsICdvJywgJ3UnLCAnbicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQXVkaW9TYW1wbGVEZXNjRW50cnlCb2lsZXJwbGF0ZSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SRFNJSGVhZGVyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDExLCAnZCcsICdhJywgJ20nLCAncicKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEFNUkRlZmF1bHREU0kgW10gPQotewotICAgICdQJywgJ0gnLCAnTCcsICdQJywgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMQotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SQmxvY2s0IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAncycsICdtJywgJ2gnLCAnZCcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotLypBTVI4QmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEFNUjhCbG9jazEgW10gPQotewotICAgICdzJywgJ2EnLCAnbScsICdyJwotfTsKLQotLypBTVIxNkJsb2NrcyovCi0vKmNvbnN0IE00T1NBX1VDaGFyIEFNUjE2QmxvY2sxW10gPSB7ICdzJywgJ2EnLCAndycsICdiJ307Ki8KLQotLypBQUNCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgQUFDQmxvY2sxIFtdID0KLXsKLSAgICAnbScsICdwJywgJzQnLCAnYScKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEFBQ0Jsb2NrMiBbXSA9Ci17Ci0gICAgMHg0MCwgMHgxNQotfTsKLQotLypNUEVHQ29uZmlnQmxvY2tzIChBQUMgJiBNUDRWKSovCi1jb25zdCBNNE9TQV9VQ2hhciBNUEVHQ29uZmlnQmxvY2swIFtdID0KLXsKLSAgICAnZScsICdzJywgJ2QnLCAncycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazIgW10gPSB7IDB4MDUgfTsKLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazMgW10gPQotewotICAgIDB4MDYsIDB4MDEsIDB4MDIKLX07Ci0KLS8qRVZSQ0Jsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBFVlJDQmxvY2szXzEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsICdkJywgJ2UnLCAndicsICdjJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgRVZSQ0Jsb2NrM18yIFtdID0KLXsKLSAgICAnUCcsICdIJywgJ0wnLCAnUCcsIDB4MDAsIDB4MDAKLX07Ci0KLS8qRVZSQzhCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgRVZSQzhCbG9jazEgW10gPQotewotICAgICdzJywgJ2UnLCAndicsICdjJwotfTsKLQotLyoqKioqKioqKioqLwotLyogTWV0aG9kcyAqLwotLyoqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0VmVyc2lvbihNNE9TQV9VSW50OCAqbWFqb3IsIE00T1NBX1VJbnQ4ICptaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcmV2aXNpb24gKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gbWFqb3IsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gbWlub3IsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gcmV2aXNpb24sIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAqbWFqb3IgPSBNQUpPUl9WRVJTSU9OOwotICAgICptaW5vciA9IE1JTk9SX1ZFUlNJT047Ci0gICAgKnJldmlzaW9uID0gUkVWSVNJT047Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfU1RUU19BTExPQ19TSVpFOwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfU1RTWl9BTExPQ19TSVpFOwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfU1RTU19BTExPQ19TSVpFOwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfQ0hVTktfQUxMT0NfTkI7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQjsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0vKiBzdHNjWyBdIHRhYmxlIGlzIHNwbGl0dGVkIGF0IDEyIGJpdHMgKi8KLSNkZWZpbmUgTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTksgNDA5NSAvKiAwPW5vdHVzZWQgKi8KLQotI2Vsc2UKLSNkZWZpbmUgTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTksgMTAgICAvKiAwPW5vdHVzZWQgKi8KLQotI2VuZGlmCi0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIE00TVA0V19pbml0aWFsaXplQWxsb2NhdGlvblBhcmFtZXRlcnMoTTRNUDRXX01wNEZpbGVEYXRhICpQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgIE00T1NBX1VJbnQzMiBtYXhNZW1vcnksIHZlc01lbW9yeTsKLSAgICBNNE9TQV9VSW50MzIgbmJWaWRlb0ZyYW1lcywgbmJBdWRpb0ZyYW1lczsKLSAgICBNNE9TQV9VSW50MzIgYXZlcmFnZVZpZGVvQ2h1bms7Ci0KLSAgICAvKi0tLS0tLS0tLS0tKi8KLSAgICAvKiBOQl9GUkFNRVMgKi8KLSAgICAvKi0tLS0tLS0tLS0tKi8KLQotICAgIC8qIG1hZ2ljYWwgZm9ybXVsYSA6IG1lbW9yeSA9IHZlc01lbW9yeSArIDEyICogZnJhbWVyYXRlICogZHVyYXRpb24gKi8KLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgdmVzTWVtb3J5ID0gMHgzMjAwMDsgLyogMjAwIGtCICovCi0KLSNlbHNlCi0KLSAgICB2ZXNNZW1vcnkgPSAweDNFODAwOyAvKiAyNTAga0IgKi8KLQotI2VuZGlmCi0KLSNkZWZpbmUgVklERU9fUE9PTF9NRU1PUlkgMTAwMDAwMAotCi0gICAgbWF4TWVtb3J5ID0gVklERU9fUE9PTF9NRU1PUlk7Ci0KLSAgICBpZiAobWF4TWVtb3J5IDwgdmVzTWVtb3J5KSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBuYlZpZGVvRnJhbWVzID0gKCBtYXhNZW1vcnkgLSB2ZXNNZW1vcnkpIC8gMTI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXOiAlZCBpbWFnZXMgbWF4IiwgbmJWaWRlb0ZyYW1lcyk7Ci0KLSAgICAvKiBWSURFTyAqLwotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgIC8qIGFzc3VtZSBhbiBhdmVyYWdlIG9mIDI1IGZwYyA6IHJlZmVyZW5jZSA9IDE1IGZwcyAqIDJzICogMC44ICovCi0KLSAgICBhdmVyYWdlVmlkZW9DaHVuayA9IDI1MDA7Ci0KLSNlbHNlCi0KLSAgICBpZiAoTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTksgPiAwKQotICAgIHsKLSAgICAgICAgYXZlcmFnZVZpZGVvQ2h1bmsgPSAxMDAgKiBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyAtIDIwCi0gICAgICAgICAgICAqIChNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyAtIDEpOyAvKiBtYXJnaW4gMjAlICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGFzc3VtZSBhbiBhdmVyYWdlIG9mIDUwIGZwYyAqLwotICAgICAgICBhdmVyYWdlVmlkZW9DaHVuayA9IDUwMDA7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIE00TVA0V19TVFRTX0FMTE9DX1NJWkUgPSBuYlZpZGVvRnJhbWVzICogc2l6ZW9mKE00T1NBX1VJbnQzMik7Ci0gICAgTTRNUDRXX1NUU1pfQUxMT0NfU0laRSA9IG5iVmlkZW9GcmFtZXMgKiBzaXplb2YoTTRPU0FfVUludDE2KTsKLSAgICBNNE1QNFdfU1RTU19BTExPQ19TSVpFID0gbmJWaWRlb0ZyYW1lcyAqIHNpemVvZigKLSAgICAgICAgTTRPU0FfVUludDMyKTsgLyogdmVyeSBjb25zZXJ2YXRpdmUgKGFsbCBpbWFnZXMgYXJlIGludHJhKSAqLwotCi0gICAgTTRNUDRXX0NIVU5LX0FMTE9DX05CID0gKCBuYlZpZGVvRnJhbWVzICogMTAwKSAvIGF2ZXJhZ2VWaWRlb0NodW5rICsgMTsKLQotICAgIC8qIEFVRElPICovCi0KLSAgICBuYkF1ZGlvRnJhbWVzID0gbmJWaWRlb0ZyYW1lczsKLSAgICAvKiBhdWRpbyBpcyA1IGZwcywgd2hpY2ggaXMgdGhlIHNtYWxsZXN0IGZyYW1lcmF0ZSBmb3IgdmlkZW8gKi8KLQotICAgIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUgPSAxMDA7IC8qIGNvbXByZXNzZWQgKi8KLSAgICBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFID0gMTAwOyAvKiBjb21wcmVzc2VkICovCi0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQiA9IG5iQXVkaW9GcmFtZXMgLyAxMCArIDE7Ci0KLSNlbHNlCi0KLSAgICBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIgPSBuYkF1ZGlvRnJhbWVzIC8gMzggKyAxOwotCi0jZW5kaWYKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0jZWxzZQotCi0gICAgLyogVklERU8gNSBtaW4gYXQgMjUgZnBzIG51bGwtZW5jICovCi0KLSAgICBNNE1QNFdfU1RUU19BTExPQ19TSVpFID0gMjAwMDA7Ci0gICAgTTRNUDRXX1NUU1pfQUxMT0NfU0laRSA9IDE4MDAwOwotICAgIE00TVA0V19TVFNTX0FMTE9DX1NJWkUgPSA1MDAwOwotICAgIE00TVA0V19DSFVOS19BTExPQ19OQiA9IDUwMDsKLQotICAgIC8qIEFVRElPIDIgbWluIGFhYysgbnVsbC1lbmMgKi8KLQotICAgIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUgPSAzMjAwMDsKLSAgICBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFID0gMjAwMDA7Ci0gICAgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CID0gMTAwMDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX29wZW5Xcml0ZShNNE9TQV9Db250ZXh0ICpjb250ZXh0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0cHV0RmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqZmlsZVdyaXRlckZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdGVtcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpmaWxlUmVhZGVyRnVuY3Rpb24gKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gY29udGV4dFB0ciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBvdXRwdXRGaWxlRGVzY3JpcHRvciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBmaWxlV3JpdGVyRnVuY3Rpb24sIE00RVJSX1BBUkFNRVRFUik7Ci0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAvKiBPcHRpb25hbCwgZmVhdHVyZSB3b24ndCBiZSB1c2VkIGlmIE5VTEwgKi8KLQotICAgIE00T1NBX1RSQUNFMl8xKCJ0ZW1wRmlsZURlc2NyaXB0b3IgPSAlcCIsIHRlbXBGaWxlRGVzY3JpcHRvcik7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSB0ZW1wRmlsZURlc2NyaXB0b3IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJ0ZW1wRmlsZURlc2NyaXB0b3IgaXMgTlVMTCwgUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFIGZlYXR1cmUgbm90IHVzZWQiKTsKLSAgICB9Ci0KLSNlbHNlIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0gICAgLyogTm90IHVzZWQgOiBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSB0ZW1wRmlsZURlc2NyaXB0b3IsIE00RVJSX1BBUkFNRVRFUik7ICovCi0jZW5kaWYgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLSAgICAvKiBOb3QgdXNlZCA6IEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGZpbGVSZWFkZXJGdW5jdGlvbiwgTTRFUlJfUEFSQU1FVEVSKTsgKi8KLQotICAgIC8qIFRoZSBjb250ZXh0IHJldXNlIG1vZGUgd2FzIHN1cHByZXNzZWQqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyID0KLSAgICAgICAgKE00TVA0V19NcDRGaWxlRGF0YSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRNUDRXX01wNEZpbGVEYXRhKSwKLSAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJNUDQgd3JpdGVyIGNvbnRleHQiKTsKLSAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnVybCA9IG91dHB1dEZpbGVEZXNjcmlwdG9yOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyID0gTTRPU0FfTlVMTDsKLSAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZSA9IE00TVA0V19EZWZhdWx0TWF4Q2h1bmtTaXplOyAvKmRlZmF1bHQgICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemUgPSBNNE1QNFdfRGVmYXVsdE1heEF1U2l6ZTsgICAgICAgLypkZWZhdWx0ICAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciA9Ci0gICAgICAgIE00TVA0V19EZWZhdWx0SW50ZXJsZWF2ZUR1cjsgLypkZWZhdWx0ID0gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSA9IDA7IC8qZGVmYXVsdCA9IDAsIGkuZS4gbm90IHVzZWQqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uID0gMDsgLypkZWZhdWx0IGlzICIgMC4wLjAiKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID0KLSAgICAgICAgTTRPU0FfTlVMTDsgLypkZWZhdWx0IGlzIGluIEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRFbWJlZGRlZFN0cmluZyAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPSBNNE9TQV9OVUxMOyAvKmRlZmF1bHQgaXMgMCAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZUR1cmF0aW9uID0gMDsgLypkZWZhdWx0ID0gMCwgaS5lLiBub3QgdXNlZCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMgPSBmaWxlV3JpdGVyRnVuY3Rpb247Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPSBNNE9TQV9GQUxTRTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX29wZW5lZDsKLSAgICBtTXA0RmlsZURhdGFQdHItPmR1cmF0aW9uID0gMDsgLyppKi8KLSAgICAvKnBhdGNoIGZvciBpbnRlZ3JhdGlvblRhZyAxNzQgLT4gMjM4ICgrNjQpKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplID0KLSAgICAgICAgMjM4OyAvKmluaXRpYWxpemF0aW9uIHdpdGggY29uc3RhbnQgcGFydCBpbiBmdHlwK21kYXQrbW9vditza2lwKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPSBNNE9TQV9GQUxTRTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciA9Ci0gICAgICAgIDA7IC8qc2V0IGFuZCB1c2VkIG9ubHkgd2hlbiBlc3RpbWF0ZUF1ZGlvU2l6ZSBpcyB0cnVlKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNTdG9wVGltZSA9Ci0gICAgICAgIDA7IC8qc2V0IGFuZCB1c2VkIG9ubHkgd2hlbiBlc3RpbWF0ZUF1ZGlvU2l6ZSBpcyB0cnVlKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IHRyaW1taW5nICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTID0gTTRPU0FfRkFMU0U7Ci0gICAgLyogLSBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zID0KLSAgICAgICAgMzI7IC8qaW5pdCB3aXRoIGZ0eXAgKyBiZWdpbm5pbmcgb2YgbWRhdCBzaXplKi8KLQotI2VuZGlmCi0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsID0gdGVtcEZpbGVEZXNjcmlwdG9yOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlID0KLSAgICAgICAgTTRPU0FfRkFMU0U7IC8qIE5vIG5lZWQgdG8gY2xlYW4gaXQganVzdCB5ZXQuICovCi0KLSNlbmRpZiAgICAgICAgICAgICAgIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICAvKiBmdHlwIGF0b20gKi8KLQotICAgIG1lbXNldCgodm9pZCAqKSAmbU1wNEZpbGVEYXRhUHRyLT5mdHlwLDAsCi0gICAgICAgIHNpemVvZihtTXA0RmlsZURhdGFQdHItPmZ0eXApKTsKLQotICAgICpjb250ZXh0UHRyID0gbU1wNEZpbGVEYXRhUHRyOwotCi0gICAgTTRNUDRXX2luaXRpYWxpemVBbGxvY2F0aW9uUGFyYW1ldGVycyhtTXA0RmlsZURhdGFQdHIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2FkZFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAqc3RyZWFtRGVzY1B0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0KLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgRVJSX0NIRUNLKCggbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfb3BlbmVkKQotICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9IE00TVA0V19yZWFkeTsKLQotICAgIHN3aXRjaCAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgLypBdWRpbyovCi0gICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+c3RyZWFtSUQgPT0gQXVkaW9TdHJlYW1JRCwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAvKmNoZWNrIGlmIGFuIGF1ZGlvIHRyYWNrIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQqLwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UsCi0gICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQpOwotCi0gICAgICAgICAgICAvKmNoZWNrIGlmIGFsbG9jIG5lZWQgdG8gYmUgZG9uZSovCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID0gKE00TVA0V19BdWRpb1RyYWNrRGF0YQotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRNUDRXX0F1ZGlvVHJhY2tEYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJNNE1QNFdfQXVkaW9UcmFja0RhdGEiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV2UgbXVzdCBpbml0IHRoZXNlIHBvaW50ZXJzIGluIGNhc2UgYW4gYWxsb2MgYmVsbG93IGZhaWxzICovCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLypub3cgZHluYW1pYyovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkNodW5rIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MgPSAxOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuayA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDAyOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4Q2h1bmtTaXplOyAvKiBpbml0IHZhbHVlICovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUyA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVswXSA9IDA7ICAgICAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbMF0gPSAwOyAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlWzBdID0gMDsgICAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPQotICAgICAgICAgICAgICAgIDA7IC8qMXN0IGNodW5rIGlzIENodW5rWzBdKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyA9IDA7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA9IDA7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfcmVhZHk7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGU7Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tBTVIpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlID09IDgwMDAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIDE2MDsgLypBTVI4K3RpbWVzY2FsZT04MDAwID0+IHNhbXBsZSBkdXJhdGlvbiAxNjAgY29uc3RhbnQqLwotCi0gICAgICAgICAgICAgICAgLypVc2UgZ2l2ZW4gRFNJIGlmIHBhc3NlZCwgZWxzZSB1c2UgZGVmYXVsdCB2YWx1ZSovCi0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKmFtciBEU0kgaXMgOSBieXRlcyBsb25nICEqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgOTsgLyphbHdheXMgOSBmb3IgYW1yKi8KLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID09IDksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoOSwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgOSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7IC8qZGVmYXVsdCBzdGF0aWMgYmxvY2sgd2lsbCBiZSB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDA7IC8qYnV0IHRoZSBhY3R1YWwgc3RhdGljIGRzaSBpcyA5IGJ5dGVzICEqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0VWUkMpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPnRpbWVTY2FsZSA9PSA4MDAwLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAxNjA7IC8qRVZSQyt0aW1lc2NhbGU9ODAwMCA9PiBzYW1wbGUgZHVyYXRpb24gMTYwIGNvbnN0YW50Ki8KLQotICAgICAgICAgICAgICAgIC8qVXNlIGdpdmVuIERTSSBpZiBwYXNzZWQsIGVsc2UgdXNlIGRlZmF1bHQgdmFsdWUqLwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypldnJjIERTSSBpcyA2IGJ5dGVzIGxvbmcgISovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICA2OyAvKmFsd2F5cyA2IGZvciBldnJjKi8KLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID09IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoNiwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgNik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7IC8qZGVmYXVsdCBzdGF0aWMgYmxvY2sgd2lsbCBiZSB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDA7IC8qYnV0IHRoZSBhY3R1YWwgc3RhdGljIGRzaSBpcyA2IGJ5dGVzICEqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLypNNFNZU19rQUFDKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmF2ZyBiaXRyYXRlIHNob3VsZCBiZSBzZXQqLwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZSAhPSAtMSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZSAhPSAtMSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAwOyAvKmRvbid0IGtub3cgZm9yIGFhYywgc28gc2V0IDAqLwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotCi0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypubyBkc2k6IHJldHVybiBiYWQgcGFyYW1ldGVyID8qLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRTWVNfa01QRUdfNCk6Ci0gICAgICAgIGNhc2UgKE00U1lTX2tIMjY0KToKLSAgICAgICAgY2FzZSAoTTRTWVNfa0gyNjMpOgotICAgICAgICAgICAgLypWaWRlbyovCi0gICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+c3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAvKmNoZWNrIGlmIGEgdmlkZW8gdHJhY2sgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCovCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSwKLSAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCk7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYWxsb2MgbmVlZCB0byBiZSBkb25lKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPSAoTTRNUDRXX1ZpZGVvVHJhY2tEYXRhCi0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfVmlkZW9UcmFja0RhdGEpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk00TVA0V19WaWRlb1RyYWNrRGF0YSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXZSBtdXN0IGluaXQgdGhlc2UgcG9pbnRlcnMgaW4gY2FzZSBhbiBhbGxvYyBiZWxsb3cgZmFpbHMgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIC8qbm93IGR5bmFtaWMqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0jZWxzZQotICAgICAgICAgICAgICAgIC8qcmUtdXNlIHRoZSBzYW1lIGNodW5rIGFuZCBmbHVzaCBpdCB3aGVuIGZ1bGwqLwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5DaHVuayIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE1QNFdfVGltZTMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE1QNFdfVGltZTMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuayA9IDA7Ci0gICAgICAgICAgICAgICAgLyp0YWJsZXMgYXJlIG5vdyBkeW5hbWljKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFRTX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MgPSAxOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNaX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiIpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfU1RTWl9BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1oiKTsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzID0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNTX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ2MjsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGggPSBNNE1QNFdfRGVmYXVsdFdpZHRoOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5oZWlnaHQgPSBNNE1QNFdfRGVmYXVsdEhlaWdodDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemU7IC8qIGluaXQgdmFsdWUgKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVcGVyQ2h1bmsgPQotICAgICAgICAgICAgICAgIE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPnRpbWVTY2FsZSA9PSAxMDAwLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZSA9IDEwMDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUyA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVswXSA9IDA7ICAgICAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbMF0gPSAwOyAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlWzBdID0gMDsgICAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPQotICAgICAgICAgICAgICAgIDA7IC8qMXN0IGNodW5rIGlzIENodW5rWzBdKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA9IDA7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA9IDA7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3JlYWR5OwotCi0gICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSA9PSBNNFNZU19rSDI2MykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKCBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGUgPT0gLTEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyp0aGUgYml0cmF0ZSB3aWxsIG5vdCBiZSB3cml0dGVuIGlmIHRoZSBiaXRyYXRlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICBpcyBub3QgZnVsbHkgc2V0ICovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypwcm9wcmlldGFyeSBzdG9yYWdlIG9mIGgyNjMgYml0cmF0ZS4KLSAgICAgICAgICAgICAgICAgICAgIFdhcm5pbmc6IG5vdCB0aGUgYWN0dWFsIGJpdHJhdGUgKGJpdCBzZXQgdG8gMSkuKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKCAwICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZGVjb2RlciBzcGVjaWZpYyBpbmZvIHNpemUgaXMgc3VwcG9zZWQgdG8gYmUgYWx3YXlzIDcgYnl0ZXMgbG9uZyAqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPT0gNywKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qdXNlIHRoZSBkZWZhdWx0IGRzaSovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tNUEVHXzQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSAyMjsgLypleHRyYSBieXRlcyAoZnJvbSBoMjYzKSovCi0gICAgICAgICAgICAgICAgLyogYWxsb3cgRFNJIHRvIGJlIE00T1NBX05VTEwsIGluIHdoaWNoIGNhc2UgdGhlIGFjdHVhbCBEU0kgd2lsbCBiZQotICAgICAgICAgICAgICAgICBzZXQgYnkgc2V0T3B0aW9uLiAqLwotICAgICAgICAgICAgICAgIGlmICgoIDAgPT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1QNFYgc3BlY2lmaWMqLwotICAgICAgICAgICAgICAgICAgICAvKmRlY29kZXIgc3BlY2lmaWMgaW5mbyBzaXplIGlzIHN1cHBvc2VkIHRvIGJlIGFsd2F5cyA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAxMDUgc28gdGhhdCBFU0Qgc2l6ZSBjYW4gYmUgY29kZWQgd2l0aCAxIGJ5dGUqLwotICAgICAgICAgICAgICAgICAgICAvKih0aGlzIHNob3VsZCBub3QgYmUgcmVzdHJpY3RpdmUgYmVjYXVzZSBkc2kgaXMgYWx3YXlzIHNob3J0ZXIgISkqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPCAxMDUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyphdmcgYml0cmF0ZSBzaG91bGQgYmUgc2V0Ki8KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGUgIT0gLTEsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tIMjY0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEgyNjQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgaWYgKCgwICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qICsgSC4yNjQgdHJpbW1pbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgU1BTTGVuZ3RoLCBQUFNMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgKkRTSTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBEU0kgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBEU0kgKFNQUyArIFBQUykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgRFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2ICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNQU0xlbmd0aCA9IERTSVs2XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBQU0xlbmd0aCA9IERTSVsxMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMTIpLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzIpLCAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjgpLCBTUFNMZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJKSsyICsgU1BTTGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjApLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzQgKyBTUFNMZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyOCArIFNQU0xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBTTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0gSC4yNjQgdHJpbW1pbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBEU0kgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnVzZSB0aGUgZGVmYXVsdCBkc2kqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfc3RhcnRXcml0aW5nKCBNNE9TQV9Db250ZXh0IGNvbnRleHQgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzID0gTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgLyphdWRpbyBtaWNyb3N0YXRlICovCi0gICAgLyogICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKSovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8pCi0gICAgewotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZzsKLQotICAgICAgICAvKiBGaXJzdCBhdWRpbyBjaHVuayBhbGxvY2F0aW9uICovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5DaHVua1swXSIpOwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgIH0KLQotICAgIC8qdmlkZW8gbWljcm9zdGF0ZSovCi0gICAgLyogICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKSovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8pCi0gICAgewotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZzsKLQotICAgICAgICAvKiBGaXJzdCB2aWRlbyBjaHVuayBhbGxvY2F0aW9uICovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5DaHVua1swXSIpOwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgIH0KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICAvKnNldCBhdWRpb01zQ2h1bmtEdXIgKGR1cmF0aW9uIGluIG1zIGJlZm9yZSBhIG5ldyBjaHVuayBpcyBjcmVhdGVkKQotICAgICAgICAgZm9yIGF1ZGlvIHNpemUgZXN0aW1hdGlvbiovCi0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvLCBNNEVSUl9CQURfQ09OVEVYVCk7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvLCBNNEVSUl9CQURfQ09OVEVYVCk7Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIgPQotICAgICAgICAgICAgMjAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZTsKLQotICAgICAgICBpZiAoKCBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkKLSAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIKLSAgICAgICAgICAgIDwgMjAgKm1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplCi0gICAgICAgICAgICAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIgPSBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAvKm9wZW4gZmlsZSBpbiB3cml0ZSBiaW5hcnkgbW9kZSovCi0KLSAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgKLSAgICAgICAgJm1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dXJsLCBmaWxlTW9kZUFjY2Vzcyk7Ci0gICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSAgICAvKmZ0eXAgYXRvbSovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCAhPSAwKQotICAgIHsKLSAgICAgICAgLyogUHV0IGN1c3RvbWl6ZWQgZnR5cCBib3ggKi8KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKDE2ICsgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHMgKiA0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJFMzIoTTRNUEFDX0ZUWVBfVEFHLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIGVyciA9IE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5taW5vcl92ZXJzaW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLmNvbXBhdGlibGVfYnJhbmRzW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFB1dCBkZWZhdWx0IGZ0eXAgYm94ICovCi0gICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhEZWZhdWx0X2Z0eXAsIHNpemVvZihEZWZhdWx0X2Z0eXApLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgIH0KLQotICAgIC8qaW5pdCBtZGF0IHZhbHVlIHdpdGggMCBidXQgdGhlIHJpZ2h0IHZhbHVlIGlzIHNldCBqdXN0IGJlZm9yZSB0aGUgZmlsZSBpcyBjbG9zZWQqLwotICAgIGVyciA9IE00TVA0V19wdXRCRTMyKDAsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMiwgc2l6ZW9mKENvbW1vbkJsb2NrMiksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgaWYgKDAgIT0gbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZQotICAgICAgICAmJiBNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0VSUiBlcnIyID0gTTROT19FUlJPUjsKLSAgICAgICAgTTRPU0FfQ29udGV4dCBzYWZldHlGaWxlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzYWZldHlGaWxlU2l6ZSA9IDAsIGFkZGVuZHVtID0gMDsKLSAgICAgICAgTTRPU0FfVUNoYXIgZHVtbXlEYXRhWzEwMF07IC8qIFRvIGZpbGwgdGhlIHNhZmV0eSBmaWxlIHdpdGggKi8KLQotICAgICAgICBlcnIgPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJnNhZmV0eUZpbGVDb250ZXh0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsLCBmaWxlTW9kZUFjY2Vzcyk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKiAxMCUgc2VlbXMgdG8gYmUgYSByZWFzb25hYmxlIHdvcnN0IGNhc2UsIGJ1dCBhbHNvIHByb3Zpc2lvbiBmb3IgMWtiIG9mIG1vb3Ygb3ZlcmhlYWQuKi8KLSAgICAgICAgc2FmZXR5RmlsZVNpemUgPSAxMDAwICsgKG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUgKiAxMCArIDk5KSAvIDEwMDsKLQotICAgICAgICAvKiBIZXJlIHdlIGFkZCBzcGFjZSB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgZmFjdCB3ZSBoYXZlIHRvIGZsdXNoIGFueSBwZW5kaW5nCi0gICAgICAgIGNodW5rIGluIGNsb3NlV3JpdGUsIHRoaXMgc3BhY2UgaXMgdGhlIHN1bSBvZiB0aGUgbWF4aW11bSBjaHVuayBzaXplcywgZm9yIGVhY2gKLSAgICAgICAgdHJhY2suICovCi0KLSNpZm5kZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhZmV0eUZpbGVTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYWZldHlGaWxlU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbXNldCgodm9pZCAqKWR1bW15RGF0YSwgMHhDQSxzaXplb2YoZHVtbXlEYXRhKSk7IC8qIEZvciBleHRyYSBzYWZldHkuICovCi0KLSAgICAgICAgZm9yICggaSA9IDA7Ci0gICAgICAgICAgICBpIDwgKHNhZmV0eUZpbGVTaXplICsgc2l6ZW9mKGR1bW15RGF0YSkgLSAxKSAvIHNpemVvZihkdW1teURhdGEpOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT53cml0ZURhdGEoCi0gICAgICAgICAgICAgICAgc2FmZXR5RmlsZUNvbnRleHQsIGR1bW15RGF0YSwgc2l6ZW9mKGR1bW15RGF0YSkpOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiBEb24ndCByZXR1cm4gZnJvbSB0aGUgZnVuY3Rpb24geWV0LCBhcyB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBmaWxlIGZpcnN0LiAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSSBkb24ndCBuZWVkIHRvIGtlZXAgaXQgb3Blbi4gKi8KLSAgICAgICAgZXJyMiA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUoc2FmZXR5RmlsZUNvbnRleHQpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyMiksIGVycjIpOwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJTYWZldHkgZmlsZSBjb3JyZWN0bHkgY3JlYXRlZCIpOwotICAgIH0KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX25ld0F1ZGlvQ2h1bmsoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKmxlZnRTcGFjZUluQ2h1bmsgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV9hdWRpbzsKLQotI2lmbmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgTTRPU0FfVUludDMyIHJlYWxsb2NOYjsKLQotI2VuZGlmCi0KLSAgICAvKiB2aWRlbyBvbmx5ICovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID09IE00T1NBX05VTEwpCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIiBNNE1QNFdfbmV3QXVkaW9DaHVuayAtIGZsdXNoIGF1ZGlvIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoImN1cnJlbnQgY2h1bmsgPSAlZCAgb2Zmc2V0ID0gMHgleCIsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyk7Ci0KLSAgICBzY2FsZV9hdWRpbyA9IDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLypmbHVzaCBjaHVuayovCi0KLSAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHRlbXAgPSBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoCi0gICAgICAgICAgICAiTTRNUDRXX25ld0F1ZGlvQ2h1bms6IHB1dEJsb2NrIGVycm9yIHdoZW4gZmx1c2hpbmcgY2h1bms6ICUjWCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICAvKiBPdWNoLCB3ZSBnb3QgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgZmlsZSwgYnV0IHdlIG5lZWQgdG8gcHJvcGVybHkgcmVhY3Qgc28gdGhhdCB0aGUKLSAgICAgICAgIHN0YXRlIGlzIHN0aWxsIGNvbnNpc3RlbnQgYW5kIHdlIGNhbiBwcm9wZXJseSBjbG9zZSB0aGUgZmlsZSBzbyB0aGF0IHdoYXQgaGFzIGJlZW4KLSAgICAgICAgIHJlY29yZGVkIHNvIGZhciBpcyBub3QgbG9zdC4gWWF5IGVycm9yIHJlY292ZXJ5ISAqLwotCi0gICAgICAgIC8qIEZpcnN0LCB3ZSBkbyBub3Qga25vdyB3aGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUuIFB1dCB1cyBiYWNrIGF0IHdoZXJlIHdlIHdlcmUgYmVmb3JlCi0gICAgICAgIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGRhdGEuIFRoYXQgd2F5LCB3ZSdyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNodW5rIHN0YXRlIGRhdGEuICovCi0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlaygKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZ0ZW1wKTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICJCYWNrdHJhY2tpbmcgdG8gcG9zaXRpb24gMHglMDhYLCBzZWVrIHJldHVybmVkICVkIGFuZCBwb3NpdGlvbiAlMDhYIiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zLCBlcnIsIHRlbXApOwotCi0gICAgICAgIC8qIFRoZW4sIGRvIG5vdCB1cGRhdGUgYW55IGluZm8gd2hhdHNvZXZlciBpbiB0aGUgd3JpdGluZyBzdGF0ZS4gVGhpcyB3aWxsIGhhdmUgdGhlCi0gICAgICAgICBjb25zZXF1ZW5jZSB0aGF0IGl0IHdpbGwgYmUgYXMgaWYgdGhlIGNodW5rIGhhcyBub3QgYmVlbiBmbHVzaGVkIHlldCwgYW5kIHRoZXJlZm9yZQotICAgICAgICAgaXQgd2lsbCBiZSBkb25lIGFzIHBhcnQgb2YgY2xvc2VXcml0ZSAod2hlcmUgdGhlcmUgY291bGQgYmUgcm9vbSB0byBkbyBzbywKLSAgICAgICAgIGlmIHNvbWUgZW1lcmdlbmN5IHJvb20gaXMgZnJlZWQgZm9yIHRoYXQgcHVycG9zZSkuICovCi0KLSAgICAgICAgLyogQW5kIGxhc3RseSAoZm9yIGhlcmUpLCByZXR1cm4gdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSBsaW1pdCBvZiBhdmFpbGFibGUgc3BhY2UuICovCi0KLSAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgfQotCi0gICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICBjaHVua09mZnNldFRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgLyphZGQgY2h1bmsgc2l6ZSB0byBhYnNvbHV0ZUN1cnJlbnRQb3MqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zICs9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIC8qdXBkYXRlIGNodW5rIGluZm8gKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTOwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgKz0gMTsKLSAgICAvKmlmIGF1ZGlvIGFtb3VudCBvZiBkYXRhIGlzIG5vdCBlc3RpbWF0ZWQqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDE2OwotCi0gICAgLyphbGxvYyBuZXcgY2h1bmsqLwotICAgIC8qb25seSBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuaykKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIExhc3RBbGxvY2F0ZWRDaHVuayAoIC0+ID0gY3VycmVudENodW5rKSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rICs9IDE7Ci0KLSAgICAgICAgLyptYXggbmIgb2YgY2h1bmsgaXMgbm93IGR5bmFtaWMqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rCi0gICAgICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3QXVkaW9DaHVuayA6IGF1ZGlvIGNodW5rIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKCgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmspCi0gICAgICAgICAgICAlIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhbGxvY05iID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICAgICArIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQjsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaywKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUNoYXIgKikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua09mZnNldFRhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NpemVUYWJsZSwKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGUsCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZSwKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE1QNFdfVGltZTMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRNUDRXX1RpbWUzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgfQotI2VuZGlmIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayIpOwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICB9Ci0KLSAgICAvKnVwZGF0ZSBsZWZ0U3BhY2VJbkNodW5rLCBjdXJyZW50UG9zIGFuZCBjdXJyZW50Q2h1bmtEdXIqLwotICAgICpsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgLyogY2hlY2sgd2V0aGVyIHRvIHVzZSBhIG5ldyBzdHNjIG9yIG5vdCAqLwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MgPiAwKQotICAgIHsKLSAgICAgICAgaWYgKCggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpICE9IChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgICAgIC0gMV0gJiAweEZGRikpCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYyArPSAxOwotCi0gICAgLyogbWF4IG5iIG9mIGNodW5rIGlzIG5vdyBkeW5hbWljICovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgKyAzID4gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdBdWRpb0NodW5rIDogYXVkaW8gc3RzYyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotICAgIC8qIHNldCBuYiBvZiBzYW1wbGVzIGluIHRoZSBuZXcgY2h1bmsgdG8gMCAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjXSA9Ci0gICAgICAgIDAgKyAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPDwgMTIpOwotCi0jZWxzZQotICAgIC8qc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAwOwotCi0jZW5kaWYKLQotICAgIC8qc2V0IHRpbWUgb2YgdGhlIG5ldyBjaHVuayB0byBsYXN0Q1RTIChmb3IgaW5pdGlhbGl6YXRpb24sIGJ1dCB1cGRhdGVkIGZ1cnRoZXIgdG8gdGhlCi0gICAgQ1RTIG9mIHRoZSBsYXN0IHNhbXBsZSBpbiB0aGUgY2h1bmspKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgKiBzY2FsZV9hdWRpbyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfbmV3VmlkZW9DaHVuayggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqbGVmdFNwYWNlSW5DaHVuayApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX3ZpZGVvOwotCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICBNNE9TQV9VSW50MzIgcmVhbGxvY05iOwotCi0jZW5kaWYKLQotICAgIC8qIGF1ZGlvIG9ubHkgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld1ZpZGVvQ2h1bmsgLSBmbHVzaCB2aWRlbyIpOwotICAgIE00T1NBX1RSQUNFMV8yKCJjdXJyZW50IGNodW5rID0gJWQgIG9mZnNldCA9IDB4JXgiLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuaywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MpOwotCi0gICAgc2NhbGVfdmlkZW8gPSAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgLyogc2FtcGxlcyBhcmUgYWxyZWFkeSB3cml0dGVuIHRvIGZpbGUgKi8KLSNlbHNlCi0gICAgLypmbHVzaCBjaHVuayovCi0KLSAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHRlbXAgPSBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoCi0gICAgICAgICAgICAiTTRNUDRXX25ld1ZpZGVvQ2h1bms6IHB1dEJsb2NrIGVycm9yIHdoZW4gZmx1c2hpbmcgY2h1bms6ICUjWCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICAvKiBPdWNoLCB3ZSBnb3QgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgZmlsZSwgYnV0IHdlIG5lZWQgdG8gcHJvcGVybHkgcmVhY3Qgc28gdGhhdCB0aGUKLSAgICAgICAgIHN0YXRlIGlzIHN0aWxsIGNvbnNpc3RlbnQgYW5kIHdlIGNhbiBwcm9wZXJseSBjbG9zZSB0aGUgZmlsZSBzbyB0aGF0IHdoYXQgaGFzIGJlZW4KLSAgICAgICAgIHJlY29yZGVkIHNvIGZhciBpcyBub3QgbG9zdC4gWWF5IGVycm9yIHJlY292ZXJ5ISAqLwotCi0gICAgICAgIC8qIEZpcnN0LCB3ZSBkbyBub3Qga25vdyB3aGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUuIFB1dCB1cyBiYWNrIGF0IHdoZXJlIHdlIHdlcmUgYmVmb3JlCi0gICAgICAgIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGRhdGEuIFRoYXQgd2F5LCB3ZSdyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNodW5rIHN0YXRlIGRhdGEuICovCi0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlaygKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZ0ZW1wKTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICJCYWNrdHJhY2tpbmcgdG8gcG9zaXRpb24gMHglMDhYLCBzZWVrIHJldHVybmVkICVkIGFuZCBwb3NpdGlvbiAlMDhYIiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zLCBlcnIsIHRlbXApOwotICAgICAgICAvKiBUaGVuLCBkbyBub3QgdXBkYXRlIGFueSBpbmZvIHdoYXRzb2V2ZXIgaW4gdGhlIHdyaXRpbmcgc3RhdGUuIFRoaXMgd2lsbCBoYXZlIHRoZQotICAgICAgICAgY29uc2VxdWVuY2UgdGhhdCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBjaHVuayBoYXMgbm90IGJlZW4gZmx1c2hlZCB5ZXQsIGFuZCB0aGVyZWZvcmUgaXQKLSAgICAgICAgIHdpbGwgYmUgZG9uZSBhcyBwYXJ0IG9mIGNsb3NlV3JpdGUgKHdoZXJlIHRoZXJlIGNvdWxkIGJlIHJvb20gdG8gZG8gc28sIGlmIHNvbWUKLSAgICAgICAgIGVtZXJnZW5jeSByb29tIGlzIGZyZWVkIGZvciB0aGF0IHB1cnBvc2UpLiAqLwotCi0gICAgICAgIC8qIEFuZCBsYXN0bHkgKGZvciBoZXJlKSwgcmV0dXJuIHRoYXQgd2UndmUgcmVhY2hlZCB0aGUgbGltaXQgb2YgYXZhaWxhYmxlIHNwYWNlLgotICAgICAgICAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZXJyb3Igb3JpZ2luYWxseSByZXR1cm5lZCBieSBwdXRCbG9jay4gKi8KLQotICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0KLSAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgLyp1cGRhdGUgY2h1bmsgaW5mbyBiZWZvcmUgdG8gZ28gZm9yIGEgbmV3IG9uZSovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NpemVUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAoTTRPU0FfVUludDMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAqIHNjYWxlX3ZpZGVvKTsKLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rICs9IDE7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSAxNjsKLQotICAgIC8qYWxsb2MgbmV3IGNodW5rKi8KLSAgICAvKm9ubHkgaWYgbm90IGFscmVhZHkgYWxsb2NhdGVkKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuaykKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIExhc3RBbGxvY2F0ZWRDaHVuayAoIC0+ID0gY3VycmVudENodW5rKSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rICs9IDE7Ci0KLSAgICAgICAgLyptYXggbmIgb2YgY2h1bmsgaXMgbm93IGR5bmFtaWMqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgaWYgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuawotICAgICAgICAgICAgKyAzID4gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld1ZpZGVvQ2h1bmsgOiB2aWRlbyBjaHVuayB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIGlmICgoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgICAgICAgICAgJSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWxsb2NOYiA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rCi0gICAgICAgICAgICAgICAgKyBNNE1QNFdfQ0hVTktfQUxMT0NfTkI7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmssCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIKLSAgICAgICAgICAgICAgICAtIE00TVA0V19DSFVOS19BTExPQ19OQikgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VDaGFyICopKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZSwgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlLCAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGUsICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE1QNFdfVGltZTMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGUsICggcmVhbGxvY05iCi0gICAgICAgICAgICAgICAgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpICogc2l6ZW9mKE00TVA0V19UaW1lMzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE1QNFdfVGltZTMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICB9Ci0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIH0KLQotICAgIC8qdXBkYXRlIGxlZnRTcGFjZUluQ2h1bmssIGN1cnJlbnRQb3MgYW5kIGN1cnJlbnRDaHVua0R1ciovCi0gICAgKmxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPSAwOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAvKiBjaGVjayB3ZXRoZXIgdG8gdXNlIGEgbmV3IHN0c2Mgb3Igbm90ICovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA+IDApCi0gICAgewotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKSAhPSAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICAgICAtIDFdICYgMHhGRkYpKQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyArPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MgKz0gMTsKLQotICAgIC8qIG1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyAqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICsgMyA+IE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3VmlkZW9DaHVuayA6IHZpZGVvIHN0c2MgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgbmIgb2Ygc2FtcGxlcyBpbiB0aGUgbmV3IGNodW5rIHRvIDAgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzY10gPQotICAgICAgICAwICsgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rIDw8IDEyKTsKLQotI2Vsc2UKLSAgICAvKnNldCBuYiBvZiBzYW1wbGVzIGluIHRoZSBuZXcgY2h1bmsgdG8gMCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0gMDsKLQotI2VuZGlmCi0KLSAgICAvKnNldCB0aW1lIG9mIHRoZSBuZXcgY2h1bmsgdG8gbGFzdENUUyAoZm9yIGluaXRpYWxpemF0aW9uLCBidXQgdXBkYXRlZCBmdXJ0aGVyIHRvIHRoZQotICAgIENUUyBvZiB0aGUgbGFzdCBzYW1wbGUgaW4gdGhlIGNodW5rKSovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICogc2NhbGVfdmlkZW8pOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0QVUoIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCAqYXVQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotCi0gICAgTTRPU0FfVUludDMyIGxlZnRTcGFjZUluQ2h1bms7Ci0gICAgTTRNUDRXX1RpbWUzMiBjaHVua0R1ck1zOwotCi0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvOwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV92aWRlbzsKLQotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgRVJSX0NIRUNLKGF1UHRyICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiLS0tLS0gTTRNUDRXX3N0YXJ0QVUgLS0tLS0iKTsKLQotICAgIC8qY2hlY2sgbWFjcm8gc3RhdGUqLwotICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfd3JpdGluZyksIE00RVJSX1NUQVRFKTsKLQotICAgIGlmIChzdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlEKSAvKmF1ZGlvIHN0cmVhbSovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3N0YXJ0QVUgLT4gYXVkaW8iKTsKLQotICAgICAgICBzY2FsZV9hdWRpbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0gICAgICAgIC8qYXVkaW8gbWljcm9zdGF0ZSovCi0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlCi0gICAgICAgICAgICA9PSBNNE1QNFdfd3JpdGluZyksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmdfc3RhcnRBVTsKLQotICAgICAgICBsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJhdWRpbyAlZCAgJWQiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zLCBsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICBjaHVua0R1ck1zID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgICAgICogc2NhbGVfYXVkaW8pIC0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRDaHVua10pOwotCi0gICAgICAgIGlmICgobGVmdFNwYWNlSW5DaHVuayA8IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplKQotICAgICAgICAgICAgfHwgKCggbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyICE9IDApCi0gICAgICAgICAgICAmJiAoY2h1bmtEdXJNcyA+PSBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIpKSkKLSAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgICAgICAgICAgLyogb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCAxIHZpZGVvIHNhbXBsZSBpbiB0aGUgY2h1bmsgKi8KLQotICAgICAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID4gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2xvc2UgdGhlIG9wZW5lZCB2aWRlbyBjaHVuayBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgYXVkaW8gb25lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRNUDRXX25ld1ZpZGVvQ2h1bmsoY29udGV4dCwgJmxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0jZW5kaWYKLSAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggc3BhY2UgaW4gY3VycmVudCBjaHVuazogY3JlYXRlIGEgbmV3IG9uZSAqLwotCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfbmV3QXVkaW9DaHVuayhjb250ZXh0LCAmbGVmdFNwYWNlSW5DaHVuayk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgYXVQdHItPnNpemUgPSBsZWZ0U3BhY2VJbkNodW5rOwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0gKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MpOwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSAvKnZpZGVvIHN0cmVhbSovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3N0YXJ0QVUgLT4gdmlkZW8iKTsKLQotICAgICAgICBzY2FsZV92aWRlbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0gICAgICAgIC8qdmlkZW8gbWljcm9zdGF0ZSovCi0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlCi0gICAgICAgICAgICA9PSBNNE1QNFdfd3JpdGluZyksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmdfc3RhcnRBVTsKLQotICAgICAgICBsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0gICAgICAgIGNodW5rRHVyTXMgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgKiBzY2FsZV92aWRlbykgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudENodW5rXSk7Ci0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0KLSNlbmRpZgotCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJ2aWRlbyAlZCAgJWQiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLCBsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICBpZiAoKCBsZWZ0U3BhY2VJbkNodW5rIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUpCi0gICAgICAgICAgICB8fCAoKCBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkKLSAgICAgICAgICAgICYmIChjaHVua0R1ck1zID49IG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cikpCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgfHwgKCggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVXBlckNodW5rICE9IDApCi0gICAgICAgICAgICAmJiAoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVwZXJDaHVuaykpCi0KLSNlbmRpZgotCi0gICAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qbm90IGVub3VnaCBzcGFjZSBpbiBjdXJyZW50IGNodW5rOiBjcmVhdGUgYSBuZXcgb25lKi8KLSAgICAgICAgICAgIGVyciA9IE00TVA0V19uZXdWaWRlb0NodW5rKGNvbnRleHQsICZsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygic3RhcnRBVTogc2l6ZSAweCV4IHBvcyAweCV4IGNodW5rICV1IiwgYXVQdHItPnNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoImFkciA9IDB4JXAiLCBhdVB0ci0+ZGF0YUFkZHJlc3MpOwotCi0gICAgICAgIGlmIChhdVB0ci0+ZGF0YUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18zKCIgZGF0YSA9ICUwOFggJTA4WCAlMDhYIiwgYXVQdHItPmRhdGFBZGRyZXNzWzBdLAotICAgICAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzc1sxXSwgYXVQdHItPmRhdGFBZGRyZXNzWzJdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1UHRyLT5zaXplID0gbGVmdFNwYWNlSW5DaHVuazsKLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyArIDQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbHNlCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gKyA0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0pOwotCi0jZWxzZQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zCi0gICAgICAgICAgICArIDQpOyAvKiBJbiBIMjY0LCB3ZSBtdXN0IHN0YXJ0IGJ5IHRoZSBsZW5ndGggb2YgdGhlIE5BTFUsIGNvZGVkIGluIDQgYnl0ZXMgKi8KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MpOwotCi0jZW5kaWYgLypfTTRNUDRXX1VOQlVGRkVSRURfVklERU8qLwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRNUFdfc3RhcnRBVTogc3RhcnQgYWRkcmVzczolcCwgc2l6ZTolbHUsIHN0cmVhbTolZCIsCi0gICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcywgYXVQdHItPnNpemUsIHN0cmVhbUlEKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wcm9jZXNzQVUoIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICphdVB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE1QNFdfVGltZTMyIGRlbHRhOwotICAgIE00TVA0V19UaW1lMzIgbGFzdFNhbXBsZUR1cjsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICAvKmV4cGVjdGVkU2l6ZSBpcyB0aGUgbWF4IGZpbGVzaXplIHRvIGZvcmVjYXN0IHdoZW4gYWRkaW5nIGEgbmV3IEFVOiovCi0gICAgTTRPU0FfVUludDMyIGV4cGVjdGVkU2l6ZSA9Ci0gICAgICAgIDMyOyAvKmluaXRpYWxpemVkIHdpdGggYW4gZXN0aW1hdGlvbiBvZiB0aGUgbWF4IG1ldGFkYXRhIHNwYWNlIG5lZWRlZCBmb3IgYW4gQVUuKi8KLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfYXVkaW8gPSAwLjA7Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX3ZpZGVvID0gMC4wOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLypjaGVjayBtYWNybyBzdGF0ZSovCi0gICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIk00TVA0V19wcm9jZXNzQVUiKTsKLQotICAgIGlmIChzdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlEKQotICAgICAgICBzY2FsZV9hdWRpbyA9Ci0gICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICBpZiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkKLSAgICAgICAgc2NhbGVfdmlkZW8gPQotICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0gICAgLyogUEwgMjcvMTAvMjAwODogYWZ0ZXIgdGhlIHJlc3VyZ2VuY2Ugb2YgdGhlIEFBQyAxMjggYnVnLCBJIGFkZGVkIGEgZGVidWcgY2hlY2sgdGhhdAotICAgICB0aGUgZW5jb2RlZCBkYXRhIGRpZG4ndCBvdmVyZmxvdyB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBBVSAqLwotCi0gICAgc3dpdGNoKCBzdHJlYW1JRCApCi0gICAgewotICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtSUQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcwotICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgIlVoIG9oLiBCdWZmZXIgb3ZlcmZsb3cgaW4gdGhlIHdyaXRlci4gQWJhbmRvbiBzaGlwISIpOwotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYyKGF1UHRyLT5zaXplCi0gICAgICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSwKLSAgICAgICAgICAgICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAiT29wcy4gQW4gQVUgd2VudCBvdmVyIHRoZSBkZWNsYXJlZCBNYXggQVUgc2l6ZS5cCi0gICAgICAgICAgICAgICAgIFlvdSBtaWdodCB3aXNoIHRvIGludmVzdGlnYXRlIHRoYXQuIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFZpZGVvU3RyZWFtSUQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcwotICAgICAgICAgICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgIlVoIG9oLiBCdWZmZXIgb3ZlcmZsb3cgaW4gdGhlIHdyaXRlci4gQWJhbmRvbiBzaGlwISIpOwotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYyKGF1UHRyLT5zaXplCi0gICAgICAgICAgICAgICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAiT29wcy4gQW4gQVUgd2VudCBvdmVyIHRoZSBkZWNsYXJlZCBNYXggQVUgc2l6ZS5cCi0gICAgICAgICAgICAgICAgICAgICBZb3UgbWlnaHQgd2lzaCB0byBpbnZlc3RpZ2F0ZSB0aGF0LiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLypvbmx5IGlmIG5vdCBpbiB0aGUgY2FzZSBhdWRpbyB3aXRoIGVzdGltYXRlQXVkaW9TaXplCi0gICAgKGVsc2UsIHNpemUgYWxyZWFkeSBlc3RpbWF0ZWQgYXQgdGhpcyBwb2ludCkqLwotICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgfHwgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgLypjaGVjayBmaWxlc2l6ZSBpZiBuZWVkZWQqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3RlZFNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArIGF1UHRyLT5zaXplOwotCi0gICAgICAgICAgICBpZiAoKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpCi0gICAgICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRTaXplICs9IDQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChleHBlY3RlZFNpemUgPiBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJwcm9jZXNzQVUgOiAhISBGSUxFU0laRSBFWENFRURFRCAhISIpOwotCi0gICAgICAgICAgICAgICAgLyogcGF0Y2ggZm9yIGF1dG9zdG9wIGlzIE1heEZpbGVTaXplIGV4Y2VlZGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19wcm9jZXNzQVUgOiBzdG9wIGF0IHRhcmdldGVkIGZpbGVzaXplIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKmNhc2UgYXVkaW9Nc1N0b3BUaW1lIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGR1cmluZyB2aWRlbyBwcm9jZXNzaW5nLAotICAgICBhbmQgbm93IGNoZWNrIGl0IGZvciBhdWRpbyovCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX1RSVUUpCi0gICAgICAgICYmIChzdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNTdG9wVGltZSA8PSAoYXVQdHItPkNUUyAqc2NhbGVfYXVkaW8pKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBidWdmaXg6IGlmIGEgbmV3IGNodW5rIHdhcyBqdXN0IGNyZWF0ZWQsIGNhbmNlbCBpdCBiZWZvcmUgdG8gY2xvc2UgKi8KLSAgICAgICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgIT0gMCkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID09IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IGF1ZGlvIHN0b3AgdGltZSByZWFjaGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlEKSAvKmF1ZGlvIHN0cmVhbSovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3Byb2Nlc3NBVSAtPiBhdWRpbyIpOwotCi0gICAgICAgIC8qYXVkaW8gbWljcm9zdGF0ZSovCi0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlCi0gICAgICAgICAgICA9PSBNNE1QNFdfd3JpdGluZ19zdGFydEFVKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZzsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgKz0gYXVQdHItPnNpemU7Ci0gICAgICAgIC8qIFdhcm5pbmc6IHRpbWUgY29udmVyc2lvbiBjYXN0IDY0dG8zMiEgKi8KLSAgICAgICAgZGVsdGEgPSAoTTRNUDRXX1RpbWUzMilhdVB0ci0+Q1RTCi0gICAgICAgICAgICAtIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTOwotCi0gICAgICAgIC8qIERFQlVHIHN0dHMgZW50cmllcyB3aGljaCBhcmUgZXF1YWwgdG8gMCAqLwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiQV9ERUxUQSA9ICVsZFxuIiwgZGVsdGEpOwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDApIC8qdGVzdCBpZiBmaXJzdCBBVSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qc2V0IGF1IHNpemUqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPSBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAgICAgLypzYW1wbGUgZHVyYXRpb24gaXMgYSBwcmlvcmkgY29uc3RhbnQgaW4gYXVkaW8gY2FzZSwgKi8KLSAgICAgICAgICAgIC8qYnV0IGlmIGFuIEF1IGF0IGxlYXN0IGhhcyBkaWZmZXJlbnQgc2l6ZSwgYSBzdHN6IHRhYmxlIHdpbGwgYmUgY3JlYXRlZCAqLwotCi0gICAgICAgICAgICAvKm1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPSBkZWx0YTsgKi8KLSAgICAgICAgICAgIC8qVE9ETyB0ZXN0IHNhbXBsZSBkdXJhdGlvbj8gKHNob3VsZCBiZSAyMG1zIGluIEFNUjgsIDE2MCB0aWNzIHdpdGggdGltZXNjYWxlIDgwMDApICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKmNoZWNrIGlmIGF1IHNpemUgaXMgY29uc3RhbnQgKGF1ZGlvKSAqLwotICAgICAgICAgICAgLyowIHNhbXBsZSBzaXplIG1lYW5zIG5vbiBjb25zdGFudCBzaXplKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAhPSBhdVB0ci0+c2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgQVUgd2l0aCBkaWZmZXJlbnQgc2l6ZSA9PiBub24gY29uc3RhbnQgc2l6ZSA9PiBTVFNaIHRhYmxlIG5lZWRlZCovCi0gICAgICAgICAgICAgICAgICAgIC8qY29tcHV0YXRpb24gb2YgdGhlIG5iIG9mIGJsb2NrIG9mIHNpemUgTTRNUDRXX1NUU1pfQUxMT0NfU0laRSB0byBhbGxvY2F0ZSovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgMSArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICAgICAgICAgICAgICAqIDQgLyBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1oKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1pbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVTaXplOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZU5iXSA9IGF1UHRyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAwOyAvKnVzZWQgYXMgYSBmbGFnIGluIHRoYXQgY2FzZSovCi0gICAgICAgICAgICAgICAgICAgIC8qbW9yZSBieXRlcyBpbiB0aGUgZmlsZSBpbiB0aGF0IGNhc2U6Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyplbHNlIHRhYmxlIGFscmVhZHkgZXhpc3RzKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICAgICAgaWYgKDQgKihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKyAzKQotICAgICAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICpNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3Byb2Nlc3NBVSA6IGF1ZGlvIHN0c3ogdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBpZiAoNCAqbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKk00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RTWiwgKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmJdID0gYXVQdHItPnNpemU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlbHRhID4gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgLyoga2VlcCB0cmFjayBvZiByZWFsIHNhbXBsZSBkdXJhdGlvbiovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uID0gZGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAwKSAvKnRlc3QgaWYgZmlyc3QgQVUqLwotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0gPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDEpIC8qdGVzdCBpZiBzZWNvbmQgQVUqLwotICAgICAgICB7Ci0jaWZuZGVmIERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdICs9IDE7Ci0KLSNlbmRpZiAvKkRVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSBkZWx0YTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICs9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKnJldHJpZXZlIGxhc3Qgc2FtcGxlIGRlbHRhKi8KLSAgICAgICAgICAgIGxhc3RTYW1wbGVEdXIgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICogKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgLSAxXTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIGlmICg4ICoobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICArIDMpID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IGF1ZGlvIHN0dHMgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgICAgICBpZiAoOCAqbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyArPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTLCAoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0gICAgICAgICAgICBpZiAoZGVsdGEgIT0gbGFzdFNhbXBsZUR1cikgLypuZXcgZW50cnkgaW4gdGhlIHRhYmxlKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKV0gPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpICsgMV0gPSBkZWx0YTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiArPQotICAgICAgICAgICAgICAgICAgICAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmluY3JlYXNlIG9mIDEgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBBVXMgd2l0aCBzYW1lIGR1cmF0aW9uKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSAtIDJdICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICs9IDE7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2NdICs9Ci0gICAgICAgICAgICAxOwotCi0jZWxzZQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdICs9Ci0gICAgICAgICAgICAxOwotCi0jZW5kaWYKLSAgICAgICAgLyogV2FybmluZzogdGltZSBjb252ZXJzaW9uIGNhc3QgNjR0bzMyISAqLwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0KLSAgICAgICAgICAgIChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpIC8qdmlkZW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfcHJvY2Vzc0FVIC0+IHZpZGVvIik7Ci0KLSAgICAgICAgLyogSW4gaDI2NCwgdGhlIHNpemUgb2YgdGhlIEFVIG11c3QgYmUgYWRkZWQgdG8gdGhlIGRhdGEgKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBBZGQgdGhlIHNpemUgb2YgdGhlIE5BTFUgaW4gQkUgKi8KLSAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBUbXBEYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgLT0gMTsKLSAgICAgICAgICAgIHBUbXBEYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClhdVB0ci0+ZGF0YUFkZHJlc3M7Ci0KLSAgICAgICAgICAgIC8vIGJpdCBtYW5pcHVsYXRpb24KLSAgICAgICAgICAgICpwVG1wRGF0YUFkZHJlc3MrKyA9IChNNE9TQV9VSW50OCkoKGF1UHRyLT5zaXplID4+IDI0KSAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUgPj4gMTYpICYgMHgwMDAwMDBGRik7Ci0gICAgICAgICAgICAqcFRtcERhdGFBZGRyZXNzKysgPSAoTTRPU0FfVUludDgpKChhdVB0ci0+c2l6ZSA+PiA4KSAgJiAweDAwMDAwMEZGKTsKLSAgICAgICAgICAgICpwVG1wRGF0YUFkZHJlc3MrKyA9IChNNE9TQV9VSW50OCkoKGF1UHRyLT5zaXplKSAgICAgICAmIDB4MDAwMDAwRkYpOwotCi0gICAgICAgICAgICBhdVB0ci0+c2l6ZSArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nX3N0YXJ0QVUpLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgICAgIC8qIHNhbXBsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZSBub3cgKi8KLQotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2soKE00T1NBX1VDaGFyICopYXVQdHItPmRhdGFBZGRyZXNzLCBhdVB0ci0+c2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotCi0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHRlbXAgPSBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcwotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoCi0gICAgICAgICAgICAgICAgIk00TVA0V19wcm9jZXNzQVU6IHB1dEJsb2NrIGVycm9yIHdoZW4gd3JpdGluZyB1bmJ1ZmZlcmVkIHZpZGVvIHNhbXBsZTogJSNYIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyogT3VjaCwgd2UgZ290IGFuIGVycm9yIHdyaXRpbmcgdG8gdGhlIGZpbGUsIGJ1dCB3ZSBuZWVkIHRvIHByb3Blcmx5IHJlYWN0IHNvIHRoYXQKLSAgICAgICAgICAgICB0aGUgc3RhdGUgaXMgc3RpbGwgY29uc2lzdGVudCBhbmQgd2UgY2FuIHByb3Blcmx5IGNsb3NlIHRoZSBmaWxlIHNvIHRoYXQgd2hhdCBoYXMKLSAgICAgICAgICAgICAgYmVlbiByZWNvcmRlZCBzbyBmYXIgaXMgbm90IGxvc3QuIFlheSBlcnJvciByZWNvdmVyeSEgKi8KLQotICAgICAgICAgICAgLyogRmlyc3QsIHdlIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZS4gUHV0IHVzIGJhY2sgYXQgd2hlcmUgd2Ugd2VyZSBiZWZvcmUKLSAgICAgICAgICAgIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGRhdGEuIFRoYXQgd2F5LCB3ZSdyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNodW5rIGFuZCBzYW1wbGUKLSAgICAgICAgICAgICBzdGF0ZSBkYXRhLmFic29sdXRlQ3VycmVudFBvcyBpcyBvbmx5IHVwZGF0ZWQgZm9yIGNodW5rcywgaXQgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICBvZiB0aGUgY2h1bmssdGhlcmVmb3JlIHdlIG5lZWQgdG8gYWRkIHZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgdG8ga25vdyB3aGVyZSB3ZQotICAgICAgICAgICAgIHdlcmUgaW4gdGhlIGZpbGUuICovCi0gICAgICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPnNlZWsoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZ0ZW1wKTsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICAgICAgICAgIkJhY2t0cmFja2luZyB0byBwb3NpdGlvbiAweCUwOFgsIHNlZWsgcmV0dXJuZWQgJWQgYW5kIHBvc2l0aW9uICUwOFgiLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zCi0gICAgICAgICAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsIGVyciwgdGVtcCk7Ci0KLSAgICAgICAgICAgIC8qIFRoZW4sIGRvIG5vdCB1cGRhdGUgYW55IGluZm8gd2hhdHNvZXZlciBpbiB0aGUgd3JpdGluZyBzdGF0ZS4gVGhpcyB3aWxsIGhhdmUgdGhlCi0gICAgICAgICAgICAgY29uc2VxdWVuY2UgdGhhdCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBzYW1wbGUgaGFzIG5ldmVyIGJlZW4gd3JpdHRlbiwgc28gdGhlIGNodW5rCi0gICAgICAgICAgICAgd2lsbCBiZSBtZXJlbHkgY2xvc2VkIGFmdGVyIHRoZSBwcmV2aW91cyBzYW1wbGUgKHRoZSBzYW1wbGUgd2UgYXR0ZW1wdGVkIHRvIHdyaXRlCi0gICAgICAgICAgICAgaGVyZSBpcyBsb3N0KS4gKi8KLQotICAgICAgICAgICAgLyogQW5kIGxhc3RseSAoZm9yIGhlcmUpLCByZXR1cm4gdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSBsaW1pdCBvZiBhdmFpbGFibGUgc3BhY2UuCi0gICAgICAgICAgICAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZXJyb3Igb3JpZ2luYWxseSByZXR1cm5lZCBieSBwdXRCbG9jay4gKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFMgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUykgewotICAgICAgICAgICAgLy8gRG8gbm90IHJlcG9ydCBhcyBlcnJvciwgaXQgd2lsbCBhYm9ydCB0aGUgZW50aXJlIGZpbGV3cml0ZS4gSnVzdCBza2lwIHRoaXMgZnJhbWUuCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiU2tpcCBmcmFtZS4gVmlkZW8gZnJhbWUgaGFzIHRvbyBvbGQgdGltZXN0YW1wLiIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgKz0gYXVQdHItPnNpemU7Ci0KLSAgICAgICAgLyogV2FybmluZzogdGltZSBjb252ZXJzaW9uIGNhc3QgNjR0bzMyISAqLwotICAgICAgICBkZWx0YSA9IChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFMKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0KLSAgICAgICAgLyogREVCVUcgc3R0cyBlbnRyaWVzIHdoaWNoIGFyZSBlcXVhbCB0byAwICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJWX0RFTFRBID0gJWxkXG4iLCBkZWx0YSk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGlmICgyICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICsgMykKLSAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICpNNE1QNFdfU1RTWl9BTExPQ19TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHZpZGVvIHN0c3ogdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgVEFCTEVfU1RTWlttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmJdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MTYpYXVQdHItPnNpemU7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDsKLQotI2Vsc2UKLQotICAgICAgICBpZiAoNCAqbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAqTTRNUDRXX1NUU1pfQUxMT0NfU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyArPSAxOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgICAgICAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAtIDEpICogTTRNUDRXX1NUU1pfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTWl9BTExPQ19TSVpFKTsKLQotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYl0gPQotICAgICAgICAgICAgYXVQdHItPnNpemU7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDsKLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMCkgLyp0ZXN0IGlmIGZpcnN0IEFVKi8KLSAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9MbygmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdLCAxKTsKLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdLCAwKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IDA7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAxICkgLyp0ZXN0IGlmIHNlY29uZCBBVSovCi0gICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KWRlbHRhKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gZGVsdGE7Ci0KLSNlbmRpZgotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKnJldHJpZXZlIGxhc3Qgc2FtcGxlIGRlbHRhKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBsYXN0U2FtcGxlRHVyID0gTTRNUDRXX2dldDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSk7Ci0KLSAgICAgICAgICAgIGlmICg0ICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICArIDMpID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHZpZGVvIHN0dHMgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgICAgICBsYXN0U2FtcGxlRHVyID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpICsgMV07Ci0KLSAgICAgICAgICAgIGlmICg4ICptTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzICs9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFMsICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgLSAxKSAqIE00TVA0V19TVFRTX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUVFNfQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSBsYXN0U2FtcGxlRHVyKSAvKm5ldyBlbnRyeSBpbiB0aGUgdGFibGUqLwotICAgICAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0MzJfTG8oJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iXSwgMSk7Ci0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYl0sIChNNE9TQV9VSW50MTYpZGVsdGEpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKV0gPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgICAgICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKSsxXSA9IGRlbHRhOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICs9Ci0gICAgICAgICAgICAgICAgICAgIDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qaW5jcmVhc2Ugb2YgMSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIEFVcyB3aXRoIHNhbWUgZHVyYXRpb24qLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdICs9IDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKV0gKz0gMTsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiArPSAxOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjXSArPQotICAgICAgICAgICAgMTsKLQotI2Vsc2UKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSArPQotICAgICAgICAgICAgMTsKLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKGF1UHRyLT5hdHRyaWJ1dGUgPT0gQVVfUkFQKQotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgaWYgKDQgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgKyAzKQotICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUU1NfQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHZpZGVvIHN0c3MgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgICAgICBpZiAoNCAqbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RTU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MgKz0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RTUywgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAtIDEpICogTTRNUDRXX1NUU1NfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTU19BTExPQ19TSVpFKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIFRBQkxFX1NUU1NbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iXSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iICs9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0KLSAgICAgICAgICAgIChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0KLSAgICAvKiBJIG1vdmVkIHNvbWUgc3RhdGUgbW9kaWZpY2F0aW9uIHRvIGFmdGVyIHdlIGtub3cgdGhlIHNhbXBsZSBoYXMgYmVlbiB3cml0dGVuIGNvcnJlY3RseS4gKi8KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zU3RvcFRpbWUgPQotICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpKGF1UHRyLT5DVFMgKiBzY2FsZV92aWRlbyk7Ci0gICAgfQotCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICB8fCAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICAvKnVwZGF0ZSBmaWxlU2l6ZSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gYXVQdHItPnNpemU7Ci0gICAgfQotCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX1RSVUUpCi0gICAgICAgICYmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIGZpbGVzaXplIHdpdGggZXN0aW1hdGVkIGF1ZGlvIGRhdGEgdGhhdCB3aWxsIGJlIGFkZGVkIGxhdGVyLiAgICAqLwotICAgICAgICAvKldhcm5pbmc6IEFzc3VtcHRpb24gaXMgbWFkZSB0aGF0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAtIGF1ZGlvIHNhbXBsZXMgaGF2ZSBjb25zdGFudCBzaXplIChlLmcuIG5vIHNpZCkuICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAtIG1heCBhdWRpbyBzYW1wbGUgc2l6ZSBoYXMgYmVlbiBzZXQsIGFuZCBpcyB0aGUgYWN0dWFsIHNhbXBsZSBzaXplLiAqLwotCi0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciAhPSAwLAotICAgICAgICAgICAgTTRXQVJfTVA0V19OT1RfRVZBTFVBQkxFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSAtPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgKiBzY2FsZV92aWRlbykgKiAoMC4wNS8qYWx3YXlzIDUwIEFNUiBzYW1wbGVzIHBlciBzZWNvbmQqLwotICAgICAgICAgICAgKihNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUKLSAgICAgICAgICAgICsgMTYvKmFkZGl0aW9uYWwgZGF0YSBmb3IgYSBuZXcgY2h1bmsqLwotICAgICAgICAgICAgLyAoTTRPU0FfRG91YmxlKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyKSk7Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSAoTTRPU0FfVUludDMyKSgoIGF1UHRyLT5DVFMgKiBzY2FsZV92aWRlbykKLSAgICAgICAgICAgICogKDAuMDUvKmFsd2F5cyA1MCBBTVIgc2FtcGxlcyBwZXIgc2Vjb25kKi8KLSAgICAgICAgICAgICooTTRPU0FfRG91YmxlKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplCi0gICAgICAgICAgICArIDE2LyphZGRpdGlvbmFsIGRhdGEgZm9yIGEgbmV3IGNodW5rKi8KLSAgICAgICAgICAgIC8gKE00T1NBX0RvdWJsZSltTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1cikpOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV80KCJwcm9jZXNzQVUgOiBzaXplIDB4JXggbW9kZSAlZCBmaWxlc2l6ZSAlbHUgbGltaXQgJWx1IiwKLSAgICAgICAgYXVQdHItPnNpemUsIGF1UHRyLT5hdHRyaWJ1dGUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2Nsb3NlV3JpdGUoIE00T1NBX0NvbnRleHQgY29udGV4dCApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgZXJyMiA9IE00Tk9fRVJST1IsIGVycjMgPSBNNE5PX0VSUk9SOwotCi0gICAgLypXYXJuaW5nOiB0ZXN0IHNob3VsZCBiZSBkb25lIGhlcmUgdG8gZW5zdXJlIGNvbnRleHQtPnBDb250ZXh0IGlzIG5vdCBNNE9TQV9OVUxMLAotICAgICBidXQgQyBpcyBub3QgQysrLi4uKi8KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotCi0gICAgTTRPU0FfVUNoYXIgY2FtY29kZXJfbWFqLCBjYW1jb2Rlcl9taW4sIGNhbWNvZGVyX3JldjsgLypjYW1jb2RlciB2ZXJzaW9uKi8KLSAgICBNNE9TQV9Cb29sIGJBdWRpbyA9Ci0gICAgICAgICgoIG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8pCi0gICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgIT0gMCkpOyAvKigobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgIT0gMCkpOyovCi0gICAgTTRPU0FfQm9vbCBiVmlkZW8gPQotICAgICAgICAoKCBtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvKQotICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICE9IDApKTsgLyooKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKSAmJgotICAgICAgICAgICAgICAgICAgICAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICE9IDApKTsqLwotICAgIE00T1NBX0Jvb2wgYkgyNjMgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJIMjY0ID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiTVA0ViA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkFBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkVWUkMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qaW50ZXJtZWRpYXRlIHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIEEsIEIsIE4sIEFCNE47Ci0KLSAgICAvKlRyYWsgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgYV90cmFrSWQgPSBBdWRpb1N0cmVhbUlEOyAvKiAgICAgKGF1ZGlvPTEpKi8KLSAgICAvKiBmaXJzdCB0cmFrIG9mZnNldCBpcyAzMittb292U2l6ZSwgc2Vjb25kIGVxdWFscyAzMittb292U2l6ZSsxc3RfdHJhY2tfc2l6ZSovCi0gICAgTTRPU0FfVUludDMyIGFfdHJha09mZnNldCA9IDMyOwotICAgIE00T1NBX1VJbnQzMiBhX3N0dHNTaXplID0gMjQ7ICAgICAgICAgIC8qIEEgKGF1ZGlvPTI0KSovCi0gICAgTTRPU0FfVUludDMyIGFfc3RzelNpemUgPSAyMDsgICAgICAgICAgLyogQiAoYXVkaW89MjApKi8KLSAgICBNNE9TQV9VSW50MzIgYV90cmFrU2l6ZSA9IDQwMjsgICAgICAgICAvKiAgICAgKGF1ZGlvPTQwMikqLwotICAgIE00T1NBX1VJbnQzMiBhX21kaWFTaXplID0gMzAyOyAgICAgICAgIC8qICAgICAoYXVkaW89MzAyKSovCi0gICAgTTRPU0FfVUludDMyIGFfbWluZlNpemUgPSAyMjk7ICAgICAgICAgLyogICAgIChhdWRpbz0yMjkpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9zdGJsU2l6ZSA9IDE2OTsgICAgICAgICAvKiAgICAgKGF1ZGlvPTE2OSkqLwotICAgIE00T1NBX1VJbnQzMiBhX3N0c2RTaXplID0gNjk7ICAgICAgICAgIC8qICAgICAoYXVkaW89NjkgKSovCi0gICAgTTRPU0FfVUludDMyIGFfZXNkU2l6ZSA9IDUzOyAgICAgICAgICAgLyogICAgIChhdWRpbz01MyApKi8KLSAgICBNNE9TQV9VSW50MzIgYV9kYXRhU2l6ZSA9IDA7ICAgICAgICAgICAvKiB0ZW1wOiBBdCB0aGUgZW5kLCA9IGN1cnJlbnRQb3MqLwotICAgIE00TVA0V19UaW1lMzIgYV90cmFrRHVyYXRpb24gPSAwOyAgICAgIC8qIGVxdWFscyBsYXN0Q1RTKi8KLSAgICBNNE1QNFdfVGltZTMyIGFfbXNUcmFrRHVyYXRpb24gPSAwOwotICAgIE00T1NBX1VJbnQzMiBhX3N0c2NTaXplID0gMjg7ICAgICAgICAgIC8qIDE2KzEyKm5iY2h1bmtzYXVkaW8qLwotICAgIE00T1NBX1VJbnQzMiBhX3N0Y29TaXplID0gMjA7ICAgICAgICAgIC8qIDE2KzQqbmJjaHVua3NhdWRpbyovCi0KLSAgICBNNE9TQV9VSW50MzIgdl90cmFrSWQgPSBWaWRlb1N0cmVhbUlEOyAvKiAodmlkZW89MikqLwotICAgIC8qIGZpcnN0IHRyYWsgb2Zmc2V0IGlzIDMyK21vb3ZTaXplLCBzZWNvbmQgZXF1YWxzIDMyK21vb3ZTaXplKzFzdF90cmFja19zaXplKi8KLSAgICBNNE9TQV9VSW50MzIgdl90cmFrT2Zmc2V0ID0gMzI7Ci0gICAgTTRPU0FfVUludDMyIHZfc3R0c1NpemUgPSAwOyAgICAgIC8qIEEgKHZpZGVvPTE2KzhKKSovCi0gICAgTTRPU0FfVUludDMyIHZfc3RzelNpemUgPSAwOyAgICAgIC8qIEIgKHZpZGVvPTIwKzRLKSovCi0gICAgTTRPU0FfVUludDMyIHZfdHJha1NpemUgPSAwOyAvKiAoaDI2Mz1BK0IrNE4rNDI2KSwgKG1wNHY9QStCK2RzaSs0Tis0NDgpICovCi0gICAgTTRPU0FfVUludDMyIHZfbWRpYVNpemUgPSAwOyAvKiAoaDI2Mz1BK0IrNE4rMzI2KSwgKG1wNHY9QStCK2RzaSs0TiszNDgpICovCi0gICAgTTRPU0FfVUludDMyIHZfbWluZlNpemUgPSAwOyAvKiAoaDI2Mz1BK0IrNE4rMjUzKSwgKG1wNHY9QStCK2RzaSs0TisyNzUpICovCi0gICAgTTRPU0FfVUludDMyIHZfc3RibFNpemUgPSAwOyAvKiAoaDI2Mz1BK0IrNE4rMTg5KSwgKG1wNHY9QStCK2RzaSs0TisyMTEpICovCi0gICAgTTRPU0FfVUludDMyIHZfc3RzZFNpemUgPSAwOyAgICAgIC8qIChoMjYzPTExNykgICAgICAgICwgKG1wNHY9MTM5K2RzaSAgICApKi8KLSAgICBNNE9TQV9VSW50MzIgdl9lc2RTaXplID0gMDsgICAgICAgLyogKGgyNjM9MTAxKSAgICAgICAgLCAobXA0dj0xNTMrZHNpICAgICkqLwotICAgIE00T1NBX1VJbnQzMiB2X2RhdGFTaXplID0gMDsgICAgICAvKiB0ZW1wOiBBdCB0aGUgZW5kLCA9IGN1cnJlbnRQb3MqLwotICAgIE00TVA0V19UaW1lMzIgdl90cmFrRHVyYXRpb24gPSAwOyAvKiBlcXVhbHMgbGFzdENUUyovCi0gICAgTTRNUDRXX1RpbWUzMiB2X21zVHJha0R1cmF0aW9uID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdl9zdHNjU2l6ZSA9IDI4OyAgICAgLyogMTYrMTIqbmJjaHVua3N2aWRlbyovCi0gICAgTTRPU0FfVUludDMyIHZfc3Rjb1NpemUgPSAyMDsgICAgIC8qIDE2KzQqbmJjaHVua3N2aWRlbyovCi0KLSAgICAvKnZpZGVvIHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIHZfc3Rzc1NpemUgPSAwOyAvKiA0Kk4rMTYgICAgIFNUU1MqLwotCi0gICAgLyphYWMgJiBtcDR2IHRlbXAgdmFyaWFibGUqLwotICAgIE00T1NBX1VJbnQ4IGRzaSA9IDA7Ci0KLSAgICAvKkgyNjQgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgdl9hdmNDU2l6ZSA9IDA7IC8qIGRzaSsxNSovCi0KLSAgICAvKk1QNFYgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgdl9lc2RzU2l6ZSA9IDA7ICAgICAgICAvKiBkc2krMzcqLwotICAgIE00T1NBX1VJbnQ4IHZfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgIDA7IC8qIGRzaSsyMyAod2FybmluZzogY2hlY2sgZHNpPDEwNSBmb3IgY29kaW5nIHNpemUgb24gMSBieXRlKSovCi0gICAgTTRPU0FfVUludDggdl9EQ0Rlc2NyaXB0b3JTaXplID0gMDsgLyogZHNpKzE1Ki8KLQotICAgIC8qQUFDIHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIGFfZXNkc1NpemUgPSAwOyAgICAgICAgLyogZHNpKzM3Ki8KLSAgICBNNE9TQV9VSW50OCBhX0VTRGVzY3JpcHRvclNpemUgPQotICAgICAgICAwOyAvKiBkc2krMjMgKHdhcm5pbmc6IGNoZWNrIGRzaTwxMDUgZm9yIGNvZGluZyBzaXplIG9uIDEgYnl0ZSkqLwotICAgIE00T1NBX1VJbnQ4IGFfRENEZXNjcmlwdG9yU2l6ZSA9IDA7IC8qIGRzaSsxNSovCi0KLSAgICAvKkdlbmVyYWwgdmFyaWFibGVzKi8KLQotICAgIC8qIGF1ZGlvIGNodW5rIHNpemUgKyB2aWRlbyBjaHVuayBzaXplKi8KLSAgICBNNE9TQV9VSW50MzIgbWRhdFNpemUgPSA4OwotICAgIE00T1NBX1VJbnQzMiBtb292U2l6ZSA9IDExNjsgLyogMTE2ICsgNDAyKGF1ZGlvKSArICAgIChBK0IrNE4rNDI2KShoMjYzKSBvciAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKEErQitkc2krNE4rNDQ4KShtcDR2KSAgICAqLwotICAgIE00T1NBX1VJbnQzMiBjcmVhdGlvblRpbWU7IC8qIEMgKi8KLQotICAgIC8qZmxhZyB0byBzZXQgdXAgdGhlIGNodW5rIGludGVybGVhdmUgc3RyYXRlZ3kqLwotICAgIE00T1NBX0Jvb2wgYkludGVybGVhdmVBViA9Ci0gICAgICAgIChiQXVkaW8gJiYgYlZpZGVvICYmIChtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkpOwotCi0gICAgTTRPU0FfQ29udGV4dCBmaWxlV3JpdGVyQ29udGV4dCA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQ7Ci0KLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIE00T1NBX0RvdWJsZSBzY2FsZV9hdWRpbyA9IDAuMDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW8gPSAwLjA7Ci0gICAgTTRNUDRXX1RpbWUzMiBkZWx0YTsKLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBtb292UG9zLCBtZGF0UG9zOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qbWFjcm8gc3RhdGUgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgIC8qaWYgbm8gZGF0YSAhKi8KLSAgICBpZiAoKCFiQXVkaW8pICYmICghYlZpZGVvKSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00Tk9fRVJST1I7IC8qd291bGQgYmUgYmV0dGVyIHRvIHJldHVybiBhIHdhcm5pbmcgPyovCi0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIC8qIFJlbW92ZSBzYWZldHkgZmlsZSB0byBtYWtlIHJvb20gZm9yIHdoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbiBvdXQgaGVyZQotICAgIChjaHVuayBmbHVzaGluZyBhbmQgbW9vdikuICovCi0KLSAgICBpZiAoTTRPU0FfVFJVRSA9PSBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0NvbnRleHQgdGVtcENvbnRleHQ7Ci0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKCZ0ZW1wQ29udGV4dCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlV3JpdGUgfCBNNE9TQV9rRmlsZUNyZWF0ZSk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUodGVtcENvbnRleHQpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsID0gTTRPU0FfTlVMTDsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotCi0gICAgaWYgKGJWaWRlbykKLSAgICB7Ci0gICAgICAgIGlmICgoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWikKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUykKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSgKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLSAgICAgICAgICAgIE00TVA0V19mcmVlQ29udGV4dChjb250ZXh0KTsgLyoqPCBGcmVlIHRoZSBjb250ZXh0IGNvbnRlbnQgKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qdmlkZW8gbWljcm9zdGF0ZSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V19jbG9zZWQ7Ci0KLSAgICAgICAgLypjdXJyZW50IGNodW5rIGlzIHRoZSBsYXN0IG9uZSBhbmQgZ2l2ZXMgdGhlIHRvdGFsIG51bWJlciBvZiB2aWRlbyBjaHVua3MgKC0xKSovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZfZGF0YVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgfQotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotI2lmbmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAgICAgLypmbHVzaCBjaHVuayovCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImZsdXNoIHZpZGVvIHwgQ0xPU0UiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzMoImN1cnJlbnQgY2h1bmsgPSAlZCAgb2Zmc2V0ID0gMHgleCBzaXplID0gMHglMDhYIiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MpOwotCi0gICAgICAgIC8qdXBkYXRlIGNodW5rIG9mZnNldCovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua09mZnNldFRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLQotICAgICAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zICs9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIC8qdXBkYXRlIGxhc3QgY2h1bmsgc2l6ZSwgYW5kIGFkZCB0aGlzIHZhbHVlIHRvIHZfZGF0YVNpemUqLwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NpemVUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgICAgICB2X2RhdGFTaXplICs9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7IC8qYWRkIGxhc3QgY2h1bmsgc2l6ZSovCi0KLSAgICAgICAgdl90cmFrRHVyYXRpb24gPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5sYXN0Q1RTOyAvKiBlcXVhbHMgbGFzdENUUyovCi0KLSAgICAgICAgLyogYnVnZml4OiBpZiBhIG5ldyBjaHVuayB3YXMganVzdCBjcmVhdGVkLCBjYW5jZWwgaXQgYmVmb3JlIHRvIGNsb3NlICovCi0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgIT0gMCkKLSAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rLS07Ci0gICAgICAgIH0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjLS07Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19VTkJVRkZFUkVEX1ZJREVPKi8KLQotICAgICAgICAvKiBMYXN0IHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAvKiBJZiB3ZSBoYXZlIHRoZSBmaWxlIGR1cmF0aW9uIHdlIHVzZSBpdCwgZWxzZSB3ZSBkdXBsaWNhdGUgdGhlIGxhc3QgQVUgKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24gPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB1c2UgbWF4IGZpbGUgZHVyYXRpb24gdG8gY2FsY3VsYXRlIGRlbHRhIG9mIGxhc3QgQVUgKi8KLSAgICAgICAgICAgIGRlbHRhID0gbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24KLSAgICAgICAgICAgICAgICAtIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTOwotICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gPSBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbjsKLQotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaWYgbW9yZSB0aGFuIDEgZnJhbWUsIGNyZWF0ZSBhIG5ldyBzdHRzIGVudHJ5IChlbHNlIGFscmVhZHkgY3JlYXRlZCkgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYisrOwotICAgICAgICAgICAgfQotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0xvKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSwgMSk7Ci0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdLCBkZWx0YSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgIC0gMSldID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgIC0gMSkgKyAxXSA9IGRlbHRhOwotCi0jZW5kaWYKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogZHVwbGljYXRlIHRoZSBkZWx0YSBvZiB0aGUgcHJldmlvdXMgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGlmIG1vcmUgdGhhbiAxIGZyYW1lLCBkdXBsaWNhdGUgdGhlIHN0dHMgZW50cnkgKGVsc2UgYWxyZWFkeSBleGlzdHMpICovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIHZfdHJha0R1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgICAgIE00TVA0V19nZXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSArPSAxOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgKyAxXTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKV0gKz0gMTsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX2Nsb3NlV3JpdGUgOiAhIHZpZGVvVHJhY2tQdHIsXAotICAgICAgICAgICAgICAgICAgICAgY2Fubm90IGtub3cgdGhlIGR1cmF0aW9uIG9mIHRoZSB1bmlxdWUgQVUgISIpOwotICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIGF1ZGlvIHRyYWNrLCB3ZSB1c2UgaXQgYXMgYSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgKGFuZCBzbywgYXMgQVUgZHVyYXRpb24uLi4pICovCi0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGUgOiAhIExldCdzIHVzZSB0aGUgYXVkaW8gdHJhY2sgZHVyYXRpb24gISIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgICAgICAgICAgICAgKiAoMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEudGltZXNjYWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZfdHJha0R1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRWxzZSwgd2UgdXNlIGEgTUFHSUNBTCB2YWx1ZSAoNjYgbXMpICovCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGUgOiAhIE5vIGF1ZGlvIHRyYWNrIC0+IHVzZSBtYWdpY2FsIHZhbHVlICg2NikgISIpOyAvKiAgICAqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gPSA2NjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDYWxjdWxhdGUgdGFibGUgc2l6ZXMgKi8KLSAgICAgICAgQSA9IHZfc3R0c1NpemUgPSAxNiArIDggKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iOyAvKiBBICh2aWRlbz0xNis4SikqLwotICAgICAgICBCID0gdl9zdHN6U2l6ZSA9IDIwICsgNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZU5iOyAvKiBCICh2aWRlbz0yMCs0SykqLwotICAgICAgICBOID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iOwotICAgICAgICBBQjROID0gQSArIEIgKyA0ICogTjsKLQotICAgICAgICBzY2FsZV92aWRlbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotICAgICAgICB2X21zVHJha0R1cmF0aW9uID0gKE00T1NBX1VJbnQzMikodl90cmFrRHVyYXRpb24gKiBzY2FsZV92aWRlbyk7Ci0KLSAgICAgICAgLypDb252ZXJ0IGludGVnZXJzIGluIHRoZSB0YWJsZSBmcm9tIExFIGludG8gQkUqLwotI2lmbmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIpOwotICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgMiAqIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYikpOwotCi0jZW5kaWYKLQotICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iKTsKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJIMjYzID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHZfdHJha1NpemUgPSBBQjROICsgNDI2OyAvKiAoaDI2Mz1BK0IrNE4rNDI2KSovCi0gICAgICAgICAgICB2X21kaWFTaXplID0gQUI0TiArIDMyNjsgLyogKGgyNjM9QStCKzROKzMyNikqLwotICAgICAgICAgICAgdl9taW5mU2l6ZSA9IEFCNE4gKyAyNTM7IC8qIChoMjYzPUErQis0TisyNTMpKi8KLSAgICAgICAgICAgIHZfc3RibFNpemUgPSBBQjROICsgMTg5OyAvKiAoaDI2Mz1BK0IrNE4rMTg5KSovCi0gICAgICAgICAgICB2X3N0c2RTaXplID0gMTE3OyAgICAgICAgLyogKGgyNjM9MTE3KSovCi0gICAgICAgICAgICB2X2VzZFNpemUgPSAxMDE7ICAgICAgICAgLyogKGgyNjM9MTAxKSovCi0KLSAgICAgICAgICAgIG1vb3ZTaXplICs9IEFCNE4gKyA0MjY7Ci0KLSAgICAgICAgICAgIGlmICgoKE00T1NBX0ludDMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyp0aGUgb3B0aW9uYWwgJ2JpdHInIGF0b20gaXMgYXBwZW5kZWQgdG8gdGhlIGRzaSxzbyBmaWxlc2l6ZSBpcyAxNiBieXRlcyBiaWdnZXIqLwotICAgICAgICAgICAgICAgIHZfdHJha1NpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9tZGlhU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X21pbmZTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfc3RibFNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9zdHNkU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X2VzZFNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgbW9vdlNpemUgKz0gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJIMjY0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIEZvciBIMjY0IHRoZXJlIGlzIG5vIGRlZmF1bHQgRFNJLCBhbmQgaXRzIHByZXNlbmNlIGlzIG1hbmRhdG9yeSwKLSAgICAgICAgICAgIHNvIGNoZWNrIHRoZSBEU0kgaGFzIGJlZW4gc2V0Ki8KLSAgICAgICAgICAgIGlmICgwID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZQotICAgICAgICAgICAgICAgIHx8IE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZTogZXJyb3IsIG5vIEgyNjQgRFNJIGhhcyBiZWVuIHNldCEiKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qSDI2NCBzaXplcyBvZiB0aGUgYXRvbSovCi0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgaGFyZGNvZGVkIERTSSB2YWx1ZXMgb2YgSDI2NEJsb2NrMgotICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgYk1VTFBQU1NQUyBjYXNlCi0gICAgICAgICAgICB2X2F2Y0NTaXplID0gc2l6ZW9mKE00T1NBX1VJbnQzMikgKyBzaXplb2YoSDI2NEJsb2NrMikgKwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZTsKLQotICAgICAgICAgICAgdl90cmFrU2l6ZSA9IEFCNE4gKyB2X2F2Y0NTaXplICsgNDExOwotICAgICAgICAgICAgdl9tZGlhU2l6ZSA9IEFCNE4gKyB2X2F2Y0NTaXplICsgMzExOwotICAgICAgICAgICAgdl9taW5mU2l6ZSA9IEFCNE4gKyB2X2F2Y0NTaXplICsgMjM4OwotICAgICAgICAgICAgdl9zdGJsU2l6ZSA9IEFCNE4gKyB2X2F2Y0NTaXplICsgMTc0OwotICAgICAgICAgICAgdl9zdHNkU2l6ZSA9ICAgICAgICB2X2F2Y0NTaXplICsgMTAyOwotICAgICAgICAgICAgdl9lc2RTaXplICA9ICAgICAgICB2X2F2Y0NTaXplICsgODY7Ci0KLSAgICAgICAgICAgIG1vb3ZTaXplICAgKz0gQUI0TiArIHZfYXZjQ1NpemUgKyA0MTE7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rTVBFR180KQotICAgICAgICB7Ci0gICAgICAgICAgICBiTVA0ViA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAvKiBGb3IgTVBFRzQgdGhlcmUgaXMgbm8gZGVmYXVsdCBEU0ksIGFuZCBpdHMgcHJlc2VuY2UgaXMgbWFuZGF0b3J5LAotICAgICAgICAgICAgc28gY2hlY2sgdGhlIERTSSBoYXMgYmVlbiBzZXQqLwotICAgICAgICAgICAgaWYgKDAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplCi0gICAgICAgICAgICAgICAgfHwgTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlOiBlcnJvciwgbm8gTVBFRzQgRFNJIGhhcyBiZWVuIHNldCEiKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qTVA0ViB2YXJpYWJsZXMqLwotICAgICAgICAgICAgZHNpID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplOwotICAgICAgICAgICAgdl9lc2RzU2l6ZSA9IDM3ICsgZHNpOyAgICAgICAgIC8qIGRzaSszNyovCi0gICAgICAgICAgICB2X0VTRGVzY3JpcHRvclNpemUgPQotICAgICAgICAgICAgICAgIDIzCi0gICAgICAgICAgICAgICAgKyBkc2k7IC8qIGRzaSsyMyAod2FybmluZzogY2hlY2sgZHNpPDEwNSBmb3IgY29kaW5nIHNpemUgb24gMSBieXRlKSovCi0gICAgICAgICAgICB2X0RDRGVzY3JpcHRvclNpemUgPSAxNSArIGRzaTsgLyogZHNpKzE1Ki8KLQotICAgICAgICAgICAgdl90cmFrU2l6ZSA9IEFCNE4gKyBkc2kgKyA0NDg7IC8qIChtcDR2PUErQitkc2krNE4rNDQ4KSAgICAqLwotICAgICAgICAgICAgdl9tZGlhU2l6ZSA9IEFCNE4gKyBkc2kgKyAzNDg7IC8qIChtcDR2PUErQitkc2krNE4rMzQ4KSAgICAqLwotICAgICAgICAgICAgdl9taW5mU2l6ZSA9IEFCNE4gKyBkc2kgKyAyNzU7IC8qIChtcDR2PUErQitkc2krNE4rMjc1KSAgICAqLwotICAgICAgICAgICAgdl9zdGJsU2l6ZSA9IEFCNE4gKyBkc2kgKyAyMTE7IC8qIChtcDR2PUErQitkc2krNE4rMjExKSAgICAqLwotICAgICAgICAgICAgdl9zdHNkU2l6ZSA9IGRzaSArIDEzOTsgICAgICAgIC8qIChtcDR2PTEzOStkc2kpKi8KLSAgICAgICAgICAgIHZfZXNkU2l6ZSA9IGRzaSArIDEyMzsgICAgICAgICAvKiAobXA0dj0xMjMrZHNpKSovCi0KLSAgICAgICAgICAgIG1vb3ZTaXplICs9IEFCNE4gKyBkc2kgKyA0NDg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKnZpZGVvIHZhcmlhYmxlcyovCi0gICAgICAgIHZfc3Rzc1NpemUgPSAxNiArIDQgKiBOOyAvKiA0Kk4rMTYgICAgIFNUU1MqLwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAgICAgLyogc3RzYyB1cGRhdGUgKi8KLQotICAgICAgICB2X3N0c2NTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgdl9zdGJsU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIHZfbWluZlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X21kaWFTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgdl90cmFrU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIG1vb3ZTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLQotICAgICAgICAvKiBzdGNvIHVwZGF0ZSAqLwotICAgICAgICB2X3N0Y29TaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9zdGJsU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfbWluZlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X21kaWFTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl90cmFrU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIG1vb3ZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2Vsc2UKLSAgICAgICAgLypzdHNjL3N0Y28gdXBkYXRlKi8KLQotICAgICAgICB2X3N0c2NTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3N0YmxTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfbWluZlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9tZGlhU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3RyYWtTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIG1vb3ZTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0KLSNlbmRpZgotCi0gICAgICAgIC8qdXBkYXRlIGxhc3QgY2h1bmsgdGltZSovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIHZfbXNUcmFrRHVyYXRpb247Ci0gICAgfQotCi0gICAgaWYgKGJBdWRpbykKLSAgICB7Ci0gICAgICAgIGlmICgoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSgKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLSAgICAgICAgICAgIE00TVA0V19mcmVlQ29udGV4dChjb250ZXh0KTsgLyoqPCBGcmVlIHRoZSBjb250ZXh0IGNvbnRlbnQgKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qYXVkaW8gbWljcm9zdGF0ZSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V19jbG9zZWQ7Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPT0gTTRTWVNfa0FBQykKLSAgICAgICAgewotICAgICAgICAgICAgYkFBQyA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyplbHNlLCBhdWRpbyBpcyBpbXBsaWNpdGVseSBhbXIgaW4gdGhlIGZvbGxvd2luZyovCi0gICAgICAgICAgICBkc2kgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemU7IC8qdmFyaWFibGUgc2l6ZSovCi0KLSAgICAgICAgICAgIGFfZXNkc1NpemUgPSAzNyArIGRzaTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHNpKzM3Ki8KLSAgICAgICAgICAgIGFfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgICAgICAgICAgMjMKLSAgICAgICAgICAgICAgICArIGRzaTsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICAgICAgICAgIGFfRENEZXNjcmlwdG9yU2l6ZSA9IDE1ICsgZHNpOyAgICAgICAgICAgICAgICAgLyogZHNpKzE1Ki8KLQotICAgICAgICAgICAgYV9lc2RTaXplID0gZHNpICsgNzM7IC8qb3ZlcndyaXRlIGFfZXNkU2l6ZSB3aXRoIGFhYyB2YWx1ZSovCi0gICAgICAgICAgICAvKmFkZCBkaWYuIGJldHdlZW4gYW1yICYgYWFjIHNpemVzOiAoLSA1MyArIGRzaSArIDM3KSovCi0gICAgICAgICAgICBhX3N0c2RTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgYV9zdGJsU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIGFfbWluZlNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX21kaWFTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgYV90cmFrU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIG1vb3ZTaXplICs9IGRzaSArIDIwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tFVlJDKQotICAgICAgICB7Ci0gICAgICAgICAgICBiRVZSQyA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyplbHNlLCBhdWRpbyBpcyBpbXBsaWNpdGVseSBhbXIgaW4gdGhlIGZvbGxvd2luZyovCi0KLSAgICAgICAgICAgIC8qIGV2cmMgZHNpIGlzIG9ubHkgNiBieXRlcyB3aGlsZSBhbXIgZHNpIGlzIDkgYnl0ZXMsYWxsIG90aGVyIGJsb2NrcyBhcmUgdW5jaGFuZ2VkICovCi0gICAgICAgICAgICBhX2VzZFNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfc3RzZFNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfc3RibFNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfbWluZlNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfbWRpYVNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfdHJha1NpemUgLT0gMzsKLSAgICAgICAgICAgIG1vb3ZTaXplIC09IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSgKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpOyAvKio8IGNsb3NlIHRoZSBzdHJlYW0gYW55d2F5ICovCi0gICAgICAgICAgICAgICAgTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOyAvKio8IEZyZWUgdGhlIGNvbnRleHQgY29udGVudCAqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qQ29udmVydCBpbnRlZ2VycyBpbiB0aGUgdGFibGUgZnJvbSBMRSBpbnRvIEJFKi8KLSAgICAgICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iKTsKLSAgICAgICAgICAgIGFfc3RzelNpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgYV9zdGJsU2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX21pbmZTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGFfbWRpYVNpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgYV90cmFrU2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBtb292U2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9vdlNpemUgKz0gNDAyOwotCi0gICAgICAgIC8qY3VycmVudCBjaHVuayBpcyB0aGUgbGFzdCBvbmUgYW5kIGdpdmVzIHRoZSB0b3RhbCBudW1iZXIgb2YgYXVkaW8gY2h1bmtzICgtMSkqLwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhX2RhdGFTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgIH0KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAgICAgLypmbHVzaCBjaHVuayovCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiZmx1c2ggYXVkaW8gfCBDTE9TRSIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMigiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MpOwotCi0gICAgICAgIC8qdXBkYXRlIGNodW5rIG9mZnNldCovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua09mZnNldFRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLQotICAgICAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zICs9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayBzaXplLCBhbmQgYWRkIHRoaXMgdmFsdWUgdG8gYV9kYXRhU2l6ZSovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgICAgIGFfZGF0YVNpemUgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsgLyphZGQgbGFzdCBjaHVuayBzaXplKi8KLQotICAgICAgICAvKiBidWdmaXg6IGlmIGEgbmV3IGNodW5rIHdhcyBqdXN0IGNyZWF0ZWQsIGNhbmNlbCBpdCBiZWZvcmUgdG8gY2xvc2UgKi8KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayAhPSAwKQotICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmstLTsKLSAgICAgICAgfQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MtLTsKLSAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX1VOQlVGRkVSRURfVklERU8qLwotCi0gICAgICAgIGFfdHJha0R1cmF0aW9uID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEubGFzdENUUzsgLyogZXF1YWxzIGxhc3RDVFMqLwotICAgICAgICAvKiBhZGQgbGFzdCBzYW1wbGUgZHVyICovCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICE9IDEpCi0gICAgICAgIHsKLSNpZmRlZiBEVVBMSUNBVEVfU1RUU19JTl9MQVNUX0FVCi0gICAgICAgICAgICAvKmluY3JlYXNlIG9mIDEgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBBVXMgd2l0aCBzYW1lIGR1cmF0aW9uKi8KLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgLSAxKSAtIDJdICs9IDE7Ci0KLSNlbmRpZiAvKkRVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUqLwotCi0gICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiArPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICogKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgLSAxXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgICAgID09IE00U1lTX2tBTVIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKDEyMjAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDMyCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDEwMjAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDI3Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDc5NTAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMjEKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNzQwMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAyMAotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg2NzAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDE4Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDU5MDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTYKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNTE1MCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAxNAotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg0NzUwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDEzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2NhbGVfYXVkaW8gPQotICAgICAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLSAgICAgICAgYV9tc1RyYWtEdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKGFfdHJha0R1cmF0aW9uICogc2NhbGVfYXVkaW8pOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAgICAgLyogc3RzYyB1cGRhdGUgKi8KLQotICAgICAgICBhX3N0c2NTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgYV9zdGJsU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIGFfbWluZlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX21kaWFTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgYV90cmFrU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIG1vb3ZTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLQotICAgICAgICAvKiBzdHNvIHVwZGF0ZSAqLwotICAgICAgICBhX3N0Y29TaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9zdGJsU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfbWluZlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX21kaWFTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV90cmFrU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIG1vb3ZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2Vsc2UKLSAgICAgICAgLypzdHNjL3N0Y28gdXBkYXRlKi8KLQotICAgICAgICBhX3N0c2NTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3N0YmxTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfbWluZlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9tZGlhU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3RyYWtTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIG1vb3ZTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0KLSNlbmRpZgotCi0gICAgICAgIC8qIGNvbXB1dGUgdGhlIG5ldyBzaXplIG9mIHN0dHMqLwotCi0gICAgICAgIGFfc3R0c1NpemUgPSAxNiArIDggKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpOwotCi0gICAgICAgIG1vb3ZTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLSAgICAgICAgYV9tZGlhU2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0gICAgICAgIGFfbWluZlNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX3N0YmxTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLSAgICAgICAgYV90cmFrU2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayB0aW1lKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIGFfbXNUcmFrRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyogY2hhbmdpbmcgdGhlIHdheSB0aGUgbWRhdCBzaXplIGlzIGNvbXB1dGVkLgotICAgIFRoZSByZWFsIHB1cnBvc2Ugb2YgdGhlIG1kYXQgc2l6ZSBpcyB0byBrbm93IHRoZSBhbW91bnQgdG8gc2tpcCB0byBnZXQgdG8gdGhlIG5leHQKLSAgICBhdG9tLCB3aGljaCBpcyB0aGUgbW9vdjsgdGhlIHNpemUgb2YgbWVkaWEgaW4gdGhlIG1kYXQgaXMgYWxtb3N0IHNlY29uZGFyeS4gVGhlcmVmb3JlLAotICAgIGl0IGlzIG9mIHV0bW9zdCBpbXBvcnRhbmNlIHRoYXQgdGhlIG1kYXQgc2l6ZSAicG9pbnRzIiB0byB3aGVyZSB0aGUgbW9vdiBhY3R1YWxseQotICAgIGJlZ2lucy4gTm93LCB0aGUgbW9vdiBiZWdpbnMgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgZGF0YSB3ZSB3cm90ZSwgc28gaG93IGNvdWxkIHRoZSBzdW0KLSAgICBvZiBhbGwgY2h1bmsgc2l6ZXMgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRvdGFsIHNpemUgb2Ygd2hhdCBoYXMgYmVlbiB3cml0dGVuPyBXZWxsLCBpdAotICAgIGNhbiBoYXBwZW4gd2hlbiB0aGUgd3JpdGluZyB3YXMgdW5leHBlY3RlZGx5IHN0b3BwZWQgKGJlY2F1c2Ugb2YgbGFjayBvZiBkaXNrIHNwYWNlLAotICAgIGZvciBpbnN0YW5jZSksIGluIHRoaXMgY2FzZSBhIGNodW5rIG1heSBiZSBwYXJ0aWFsbHkgd3JpdHRlbiAodGhlIHBhcnRpYWwgd3JpdGUgaXMgbm90Ci0gICAgbmVjZXNzYXJpbHkgZXJhc2VkKSBidXQgaXQgbWF5IG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIGNodW5rIHNpemUgbGlzdCAod2hpY2ggbWF5Ci0gICAgYmVsaWV2ZSBpdCBoYXNuJ3QgYmVlbiB3cml0dGVuIG9yIG9uIHRoZSBjb250cmFyeSB0aGF0IGl0IGhhcyBiZWVuIGZ1bGx5IHdyaXR0ZW4pLiBJbgotICAgIHRoZSBjYXNlIG9mIHN1Y2ggYSBtaXNtYXRjaCwgdGhlcmUgaXMgZWl0aGVyIHVudXNlZCBkYXRhIGluIHRoZSBtZGF0IChub3QgdmVyeSBnb29kLAotICAgIGJ1dCB0b2xlcmFibGUpIG9yIHdoZW4gcmVhZGluZyB0aGUgbGFzdCBjaHVuayBpdCB3aWxsIHJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbW9vdgotICAgIGFzIHBhcnQgb2YgdGhlIGNodW5rICh3aGljaCBtZWFucyB0aGUgbGFzdCBjaHVuayB3b24ndCBiZSBjb3JyZWN0bHkgZGVjb2RlZCksIGJvdGggb2YKLSAgICB3aGljaCBhcmUgc3RpbGwgYmV0dGVyIHRoYW4gbG9zaW5nIHRoZSB3aG9sZSByZWNvcmRpbmcuIEluIHRoZSBsb25nIHJ1biBpdCdsbCBwcm9iYWJseQotICAgIGJlIGF0dGVtcHRlZCB0byBhbHdheXMgY2xlYW4gdXAgYmFjayB0byBhIGNvbnNpc3RlbnQgc3RhdGUsIGJ1dCBhdCBhbnkgcmF0ZSBpdCBpcwotICAgIGFsd2F5cyBzYWZlciB0byBoYXZlIHRoZSBtZGF0IHNpemUgYmUgY29tcHV0ZWQgdXNpbmcgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBtb292Ci0gICAgYWN0dWFsbHkgYmVnaW5zLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgc2l6ZSBpdCBpcyB0aG91Z2h0IHRoZSBtZGF0IGhhcy4KLQotICAgIFRoZXJlZm9yZSwgSSB3aWxsIHJlY29yZCB3aGVyZSB3ZSBhcmUganVzdCBiZWZvcmUgd3JpdGluZyB0aGUgbW9vdiwgdG8gc2VydmUgd2hlbgotICAgIHVwZGF0aW5nIHRoZSBtZGF0IHNpemUuICovCi0KLSAgICAvKiBtZGF0U2l6ZSArPSBhX2RhdGFTaXplICsgdl9kYXRhU2l6ZTsgKi8vKlRPRE8gYWxsb3cgZm9yIG11bHRpcGxlIGNodW5rcyovCi0KLSAgICAvKiBFbmQgb2YgUGllcnJlIExlYmVhdXBpbiAxOS8xMi8yMDA3OiBjaGFuZ2luZyB0aGUgd2F5IHRoZSBtZGF0IHNpemUgaXMgY29tcHV0ZWQuICovCi0KLSAgICAvKiBmaXJzdCB0cmFrIG9mZnNldCBpcyAzMittb292U2l6ZSwgc2Vjb25kIGVxdWFscyAzMittb292U2l6ZSsxc3RfdHJhY2tfc2l6ZSovCi0gICAgYV90cmFrT2Zmc2V0ICs9IG1vb3ZTaXplOwotICAgIHZfdHJha09mZnNldCArPSBtb292U2l6ZS8qKyBhX2RhdGFTaXplKi87Ci0KLSAgICBpZiAoYkludGVybGVhdmVBViA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgdl90cmFrT2Zmc2V0ICs9IGFfZGF0YVNpemU7Ci0KLSAgICAvKnN5c3RlbSB0aW1lIHNpbmNlIDE5NzAgKi8KLSNpZm5kZWYgX000TVA0V19ET05UX1VTRV9USU1FX0gKLQotICAgIHRpbWUoKHRpbWVfdCAqKSZjcmVhdGlvblRpbWUpOwotICAgIC8qY29udmVydCBpbnRvIHRpbWUgc2luY2UgMS8xLzE5MDQgMDBoMDAgKG5vcm1hdGl2ZSkqLwotICAgIGNyZWF0aW9uVGltZSArPSAyMDgyODQxNzYxOyAvKm5iIG9mIHNlYyBiZXR3ZWVuIDE5MDQgYW5kIDE5NzAqLwotCi0jZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSCovCi0KLSAgICBjcmVhdGlvblRpbWUgPQotICAgICAgICAweEJCRDA5MTAwOyAvKiA9IDcvMTEvMjAwMyAwMGgwMCA7IGluIGhleGEgYmVjYXVzZSBvZiBjb2RlIHNjcmFtYmxlciBsaW1pdGF0aW9uIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSBpbnRlZ2VycyAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmR1cmF0aW9uID0KLSAgICAgICAgbWF4KGFfbXNUcmFrRHVyYXRpb24sIHZfbXNUcmFrRHVyYXRpb24pOyAvKm1heCBhdWRpby92aWRlbyovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAvKm9wZW4gZmlsZSBpbiB3cml0ZSBiaW5hcnkgbW9kZSovCi0KLSAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgmZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dXJsLCAweDIyKTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0KLSAgICAvKmZ0eXAgYXRvbSovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCAhPSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAgICAgLyogUHV0IGN1c3RvbWl6ZWQgZnR5cCBib3ggKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKDE2Ci0gICAgICAgICAgICArIChtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogNCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihNNE1QQUNfRlRZUF9UQUcsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAubWlub3JfdmVyc2lvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAuY29tcGF0aWJsZV9icmFuZHNbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBQdXQgZGVmYXVsdCBmdHlwIGJveCAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKERlZmF1bHRfZnR5cCwgc2l6ZW9mKERlZmF1bHRfZnR5cCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qIHNlZWsgaXMgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotICAgIC8qIC4uLiBvciByYXRoZXIsIHNlZWsgdXNlZCB0byBiZSB1c2VkIGZvciB0aGF0LCBidXQgaXQgaGFzIGJlZW4gZm91bmQgdGhpcyBmdW5jdGlvbmFsaXR5Ci0gICAgaXMgbm90IHJlbGlhYmx5LCBvciBzb21ldGltZXMgbm90IGF0IGFsbCwgaW1wbGVtZW50ZWQgaW4gdGhlIHZhcmlvdXMgT1NBTHMsIHNvIHdlIG5vdyBhdm9pZAotICAgIHVzaW5nIGl0LiAqLwotICAgIC8qIE5vdGljZSB0aGlzIG5ldyBtZXRob2QgYXNzdW1lcyB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCB0aGlzIHdpbGwgYnJlYWsgaWYgZXZlciB3ZQotICAgIGFyZSBvdmVyd3JpdGluZyBhIGxhcmdlciBmaWxlLiAqLwotCi0gICAgQ0xFQU5VUG9uRVJSKG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Z2V0T3B0aW9uKAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemUsIChNNE9TQV9EYXRhT3B0aW9uICopICZtb292UG9zKSk7Ci0gICAgLyogbW9vdlBvcyB3aWxsIGJlIHVzZWQgYWZ0ZXIgd3JpdGluZyB0aGUgbW9vdi4gKi8KLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtb292U2l6ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2szLCBzaXplb2YoQ29tbW9uQmxvY2szKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazQsIHNpemVvZihDb21tb25CbG9jazQpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZHVyYXRpb24sCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNSwgc2l6ZW9mKENvbW1vbkJsb2NrNSksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIGlmIChiQXVkaW8pCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazYsIHNpemVvZihDb21tb25CbG9jazYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrSWQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3LCBzaXplb2YoQ29tbW9uQmxvY2s3KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfbXNUcmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3YmlzLCBzaXplb2YoQ29tbW9uQmxvY2s3YmlzKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJCbG9jazEsIHNpemVvZihBTVJCbG9jazEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfbWRpYVNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s4LCBzaXplb2YoQ29tbW9uQmxvY2s4KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfdHJha0R1cmF0aW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrOSwgc2l6ZW9mKENvbW1vbkJsb2NrOSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQU1SQmxvY2sxXzEsIHNpemVvZihBTVJCbG9jazFfMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9taW5mU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEwLCBzaXplb2YoQ29tbW9uQmxvY2sxMCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0YmxTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTEsIHNpemVvZihDb21tb25CbG9jazExKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3R0c1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMiwgc2l6ZW9mKENvbW1vbkJsb2NrMTIpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgLyppbnZlcnQgdGhlIHRhYmxlIGRhdGEgdG8gYmlnZW5kaWFuKi8KLSAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUywKLSAgICAgICAgICAgIDIgKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgIC0gMSkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMsCi0gICAgICAgICAgICAoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkKLSAgICAgICAgICAgICogOCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0KLSAgICAgICAgLyogc3RzZCAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX2VzZFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyogc2FtcGxlIGRlc2MgZW50cnkgaW5zaWRlIHN0c2QgKi8KLSAgICAgICAgaWYgKGJBQUMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQUFDQmxvY2sxLCBzaXplb2YoQUFDQmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJFVlJDKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEVWUkM4QmxvY2sxLCBzaXplb2YoRVZSQzhCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmV2cmMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLypBTVI4Ki8KLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVI4QmxvY2sxLCBzaXplb2YoQU1SOEJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYW1yOCovCi0gICAgICAgIH0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBdWRpb1NhbXBsZURlc2NFbnRyeUJvaWxlcnBsYXRlLAotICAgICAgICAgICAgc2l6ZW9mKEF1ZGlvU2FtcGxlRGVzY0VudHJ5Qm9pbGVycGxhdGUpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZQotICAgICAgICAgICAgPDwgMTYsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyogRFNJIGluc2lkZSBzYW1wbGUgZGVzYyBlbnRyeSAqLwotICAgICAgICBpZiAoYkFBQykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfZXNkc1NpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMCksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoYV9FU0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazEsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazEpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKGFfRENEZXNjcmlwdG9yU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBQUNCbG9jazIsIHNpemVvZihBQUNCbG9jazIpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMjQobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlICogNSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWF4Qml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2syLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2syKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazMsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazMpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJFVlJDKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50OCBsb2NhbERzaVs2XTsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2NhbEk7Ci0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soRVZSQ0Jsb2NrM18xLCBzaXplb2YoRVZSQ0Jsb2NrM18xKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0KLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIGRlZmF1bHQgYmxvY2sgaW4gYSBsb2NhbCB2YXJpYWJsZSovCi0gICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA2OyBsb2NhbEkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IEVWUkNCbG9jazNfMltsb2NhbEldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogY29tcHV0ZXMgdGhlIG51bWJlciBvZiBzYW1wbGUgcGVyIGF1ICovCi0gICAgICAgICAgICAvKiBhbmQgc3RvcmVzIGl0IGluIHRoZSBEU0kqLwotICAgICAgICAgICAgLyogYXNzdW1lcyBhIGNoYXIgaXMgZW5vdWdoIHRvIHN0b3JlIHRoZSBkYXRhKi8KLSAgICAgICAgICAgIGxvY2FsRHNpWzVdID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24KLSAgICAgICAgICAgICAgICAvIDE2MCkvKkVWUkMgMSBmcmFtZSBkdXJhdGlvbiovOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb3B5IHZlbmRvciBuYW1lICovCi0gICAgICAgICAgICAgICAgZm9yICggbG9jYWxJID0gMDsgbG9jYWxJIDwgNDsgbG9jYWxJKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IChNNE9TQV9VSW50OCkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSVtsb2NhbEldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKGxvY2FsRHNpLCA2LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qQU1SOCovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IGxvY2FsRHNpWzldOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIGxvY2FsSTsKLQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJEU0lIZWFkZXIsIHNpemVvZihBTVJEU0lIZWFkZXIpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAgICAgLyogY29weSB0aGUgZGVmYXVsdCBibG9jayBpbiBhIGxvY2FsIHZhcmlhYmxlKi8KLSAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDA7IGxvY2FsSSA8IDk7IGxvY2FsSSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gQU1SRGVmYXVsdERTSVtsb2NhbEldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogY29tcHV0ZXMgdGhlIG51bWJlciBvZiBzYW1wbGUgcGVyIGF1ICovCi0gICAgICAgICAgICAvKiBhbmQgc3RvcmVzIGl0IGluIHRoZSBEU0kqLwotICAgICAgICAgICAgLyogYXNzdW1lcyBhIGNoYXIgaXMgZW5vdWdoIHRvIHN0b3JlIHRoZSBkYXRhKi8KLSAgICAgICAgICAgIC8qIEFMRVJUISBUaGUgcG90ZW50aWFsIG9mIHRoZSBmb2xsb3dpbmcgbGluZSBvZiBjb2RlIHRvIGV4cGxvZGUgaW4gb3VyIGZhY2UKLSAgICAgICAgICAgIGlzIGVub3Jtb3VzIHdoZW4gYW55dGhpbmcgKHNhbXBsZSByYXRlIG9yIHdoYXRldmVyKSB3aWxsIGNoYW5nZS4gVGhpcwotICAgICAgICAgICAgY2FsY3VsYXRpb24gd291bGQgYmUgTVVDSCBiZXR0ZXIgaGFuZGxlZCBieSB0aGUgVkVTIG9yIHdoYXRldmVyIGRlYWxzIHdpdGgKLSAgICAgICAgICAgIHRoZSBlbmNvZGVyIG1vcmUgZGlyZWN0bHkuICovCi0gICAgICAgICAgICBsb2NhbERzaVs4XSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgLyAxNjApLypBTVIgTkIgMSBmcmFtZSBkdXJhdGlvbiovOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb3B5IHZlbmRvciBuYW1lICovCi0gICAgICAgICAgICAgICAgZm9yICggbG9jYWxJID0gMDsgbG9jYWxJIDwgNDsgbG9jYWxJKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IChNNE9TQV9VSW50OCkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSVtsb2NhbEldKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBNb2RlIFNldCAqLwotICAgICAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDU7IGxvY2FsSSA8IDc7IGxvY2FsSSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsRHNpW2xvY2FsSV0gPSAoTTRPU0FfVUludDgpKAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0lbbG9jYWxJXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhsb2NhbERzaSwgOSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgICAgIH0KLQotICAgICAgICAvKmVuZCB0cmFrKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3RzelNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNSwgc2l6ZW9mKENvbW1vbkJsb2NrMTUpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIC8qMCB2YWx1ZSBmb3Igc2FtcGxlc2l6ZSBtZWFucyBub3QgY29uc3RhbnQgQVUgc2l6ZSovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiAqIDQsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3RzY1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNiwgc2l6ZW9mKENvbW1vbkJsb2NrMTYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0KLSAgICAgICAgICAgID4+IDEyKSArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVtpXSAmIDB4RkZGKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoaSArIDEsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0Y29TaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTcsIHNpemVvZihDb21tb25CbG9jazE3KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrT2Zmc2V0LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIGFfdHJha09mZnNldCArPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotCi0gICAgICAgICAgICBpZiAoKCBiSW50ZXJsZWF2ZUFWID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rID49IGkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFfdHJha09mZnNldCArPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJCbG9jazQsIHNpemVvZihBTVJCbG9jazQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICB9Ci0KLSAgICBpZiAoYlZpZGVvKQotICAgIHsKLSAgICAgICAgLyp0cmFrKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfdHJha1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s2LCBzaXplb2YoQ29tbW9uQmxvY2s2KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfdHJha0lkLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNywgc2l6ZW9mKENvbW1vbkJsb2NrNyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X21zVHJha0R1cmF0aW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrN2Jpcywgc2l6ZW9mKENvbW1vbkJsb2NrN2JpcyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyogSW4gdGhlIHRyYWNrIGhlYWRlciB3aWR0aCBhbmQgaGVpZ2h0IGFyZSAxNi4xNiBmaXhlZCBwb2ludCB2YWx1ZXMsCi0gICAgICAgIHNvIHNoaWZ0IGxlZnQgdGhlIHJlZ3VsYXIgaW50ZWdlciB2YWx1ZSBieSAxNi4gKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGggPDwgMTYsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5oZWlnaHQKLSAgICAgICAgICAgIDw8IDE2LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9tZGlhU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazgsIHNpemVvZihDb21tb25CbG9jazgpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s5LCBzaXplb2YoQ29tbW9uQmxvY2s5KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb0Jsb2NrMV8xLCBzaXplb2YoVmlkZW9CbG9jazFfMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9taW5mU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEwLCBzaXplb2YoQ29tbW9uQmxvY2sxMCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0YmxTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTEsIHNpemVvZihDb21tb25CbG9jazExKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3R0c1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMiwgc2l6ZW9mKENvbW1vbkJsb2NrMTIpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGZvciAoIGkgPSAwOwotICAgICAgICAgICAgaSA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKE00TVA0V19nZXQzMl9MbygKLSAgICAgICAgICAgICAgICAmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTW2ldKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoTTRNUDRXX2dldDMyX0hpKAotICAgICAgICAgICAgICAgICZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbaV0pLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUywKLSAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpICogOCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0KLSNlbmRpZgotCi0gICAgICAgIC8qIHN0c2QgKi8KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X2VzZFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyogc2FtcGxlIGRlc2MgZW50cnkgaW5zaWRlIHN0c2QgKi8KLSAgICAgICAgaWYgKGJNUDRWKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1wNHZCbG9jazEsIHNpemVvZihNcDR2QmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiSDI2MykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2sxLCBzaXplb2YoSDI2M0Jsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYkgyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2NEJsb2NrMSwgc2l6ZW9mKEgyNjRCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjQqLwotICAgICAgICB9Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0LAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uRW50cnlTdGFydCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUxLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMTYobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUxNihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soVmlkZW9SZXNvbHV0aW9ucywgc2l6ZW9mKFZpZGVvUmVzb2x1dGlvbnMpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMiwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTIpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotICAgICAgICAvKiBEU0kgaW5zaWRlIHNhbXBsZSBkZXNjIGVudHJ5ICovCi0gICAgICAgIGlmIChiSDI2MykKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlIGgyNjMgZHNpIGdpdmVuIHRocm91Z2ggdGhlIGFwaSBtdXN0IGJlIDcgYnl0ZXMsIHRoYXQgaXMsIGl0IHNoYWxsIG5vdCBpbmNsdWRlCi0gICAgICAgICAgICAgdGhlIG9wdGlvbmFsIGJpdHJhdGUgYm94LiBIb3dldmVyLCBpZiB0aGUgYml0cmF0ZSBpbmZvcm1hdGlvbiBpcyBzZXQgaW4gdGhlIHN0cmVhbQotICAgICAgICAgICAgIGhhbmRsZXIsIGEgYml0cmF0ZSBib3ggaXMgYXBwZW5kZWQgaGVyZSB0byB0aGUgZHNpICovCi0gICAgICAgICAgICBpZiAoKChNNE9TQV9JbnQzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUpICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMl9iaXRyLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoSDI2M0Jsb2NrMl9iaXRyKSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKiBkMjYzIGJveCB3aXRoIGJpdHIgYXRvbSAqLwotCi0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazMsIHNpemVvZihIMjYzQmxvY2szKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2s0LCBzaXplb2YoSDI2M0Jsb2NrNCksCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICAvKiBQaWVycmUgTGViZWF1cGluIDIwMDgvMDQvMjk6IHRoZSB0d28gZm9sbG93aW5nIGxpbmVzIHVzZWQgdG8gYmUgc3dhcHBlZDsKLSAgICAgICAgICAgICAgICBJIGNoYW5nZWQgdG8gdGhpcyBvcmRlciBpbiBvcmRlciB0byBjb25mb3JtIHRvIDNHUFAuICovCi0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMiwgc2l6ZW9mKEgyNjNCbG9jazIpLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qIGQyNjMgYm94ICovCi0KLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMywgc2l6ZW9mKEgyNjNCbG9jazMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYk1QNFYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBidWZmZXJTaXplREIgPSA1ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBhdmdCaXRyYXRlOyAvKmJ1ZmZlclNpemVEQiBzZXQgdG8gNSB0aW1lcyB0aGUgYml0cmF0ZSovCi0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X2VzZHNTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2swLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2swKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUodl9FU0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2sxLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2sxKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUodl9EQ0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNcDR2QmxvY2szLCBzaXplb2YoTXA0dkJsb2NrMyksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMjQoYnVmZmVyU2l6ZURCLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazIpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMywKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMyksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJIMjY0KQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MTYgcHBzTGVudGdoID0gMDsgLyogUFBTIGxlbmd0aCAqLwotICAgICAgICAgICAgTTRPU0FfVUludDE2IHNwc0xlbnRnaCA9IDA7IC8qIFNQUyBsZW5ndGggKi8KLSAgICAgICAgICAgIE00T1NBX1VDaGFyICp0bXBEU0kgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSTsgLyogRFNJICovCi0gICAgICAgICAgICBNNE9TQV9VSW50MTYgTnVtYmVyT2ZQUFM7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MTYgbENudFBQUzsKLQotICAgICAgICAgICAgLyogUHV0IHRoZSBhdmNDIChoZWFkZXIgKyBEU0kpIHNpemUgKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X2F2Y0NTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjQqLwotICAgICAgICAgICAgLyogUHV0IHRoZSBhdmNDIGhlYWRlciAqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjY0QmxvY2syLCBzaXplb2YoSDI2NEJsb2NrMiksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2NCovCi0gICAgICAgICAgICAvKiBQdXQgdGhlIERTSSAoU1BTICsgUFBTKSBpbnQgdGhlIDNncCBmb3JtYXQqLwotICAgICAgICAgICAgLyogU1BTIGxlbmd0aCBpbiBCRSAqLwotCi0gICAgICAgICAgICBpZiAoKDB4MDEgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMF0pIHx8Ci0gICAgICAgICAgICAgICAgICgweDQyICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJWzFdKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiISEhIE00TVA0V19jbG9zZVdyaXRlIEVSUk9SIDogaW52YWxpZCBBVkNDIDB4JVggMHglWCIsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJWzBdLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSVsxXSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIERvIG5vdCBzdHJpcCB0aGUgRFNJCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSApOy8qaDI2NCovCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qZW5kIHRyYWsqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHN6U2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE1LCBzaXplb2YoQ29tbW9uQmxvY2sxNSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1pbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICogNCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0KLSNlbmRpZgotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c2NTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTYsIHNpemVvZihDb21tb25CbG9jazE2KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlW2ldCi0gICAgICAgICAgICA+PiAxMikgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbaV0gJiAweEZGRiksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihpICsgMSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3Rjb1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNywgc2l6ZW9mKENvbW1vbkJsb2NrMTcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKCBiSW50ZXJsZWF2ZUFWID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rID49IGkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZfdHJha09mZnNldCArPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfdHJha09mZnNldCwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICB2X3RyYWtPZmZzZXQgKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c3NTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb0Jsb2NrNCwgc2l6ZW9mKFZpZGVvQmxvY2s0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgKiA0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb0Jsb2NrNSwgc2l6ZW9mKFZpZGVvQmxvY2s1KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgfQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qbWRhdCovCi0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobWRhdFNpemUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMiwgc2l6ZW9mKENvbW1vbkJsb2NrMiksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIC8qd3JpdGUgZGF0YSwgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcmxlYXZlIG1vZGUgKGRlZmF1bHQgaXMgbm90IGludGVybGVhdmVkKSovCi0gICAgaWYgKGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBpZiAoYkF1ZGlvKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgICAgICAgICBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyAocHJldmlvdXNseSBhX2RhdGFTaXplKSovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYlZpZGVvKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgICAgICAgICBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyAocHJldmlvdXNseSBhX2RhdGFTaXplKSovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKmluIHRoaXMgbW9kZSwgd2UgaGF2ZSBhdWRpbyBhbmQgdmlkZW8gdG8gaW50ZXJsZWF2ZSovCi0gICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtYXgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyAocHJldmlvdXNseSBhX2RhdGFTaXplKSovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyAocHJldmlvdXNseSBhX2RhdGFTaXplKSovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAvKnNraXAqLwotCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhCbG9ja1NpZ25hdHVyZVNraXBIZWFkZXIsCi0gICAgICAgIHNpemVvZihCbG9ja1NpZ25hdHVyZVNraXBIZWFkZXIpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAvKiBXcml0ZSBlbWJlZGRlZCBzdHJpbmcgKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcsCi0gICAgICAgICAgICBzaXplb2YoQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nLCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0KLSAgICAvKiBXcml0ZSB2ZXMgY29yZSB2ZXJzaW9uICovCi0gICAgY2FtY29kZXJfbWFqID0gKE00T1NBX1VDaGFyKShtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbiAvIDEwMCk7Ci0gICAgY2FtY29kZXJfbWluID0KLSAgICAgICAgKE00T1NBX1VDaGFyKSgoIG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uIC0gMTAwICogY2FtY29kZXJfbWFqKQotICAgICAgICAvIDEwKTsKLSAgICBjYW1jb2Rlcl9yZXYgPQotICAgICAgICAoTTRPU0FfVUNoYXIpKG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uIC0gMTAwICogY2FtY29kZXJfbWFqIC0gMTAKLSAgICAgICAgKiBjYW1jb2Rlcl9taW4pOwotCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKCcgJywgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKGNhbWNvZGVyX21haiArICcwJyksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoJy4nLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikoY2FtY29kZXJfbWluICsgJzAnKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgnLicsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKShjYW1jb2Rlcl9yZXYgKyAnMCcpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAvKiBXcml0ZSBpbnRlZ3JhdGlvbiB0YWcgKi8KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhciAqKSIgLS0gIiwgNCwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgc2l6ZW9mKEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywgNjAsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgfQotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qb3ZlcndyaXRlIG1kYXQgc2l6ZSovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kICE9IDApCi0gICAgICAgIG1kYXRQb3M9IDE2ICsgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIDQ7Ci0gICAgZWxzZQotICAgICAgICBtZGF0UG9zID0gMjQ7Ci0KLSAgICBtb292UG9zID0gbW9vdlBvcyAtIG1kYXRQb3M7Ci0gICAgbWRhdFNpemUgPSBtb292UG9zOwotCi0gICAgQ0xFQU5VUG9uRVJSKG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlayhmaWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmbWRhdFBvcykpOyAvKnNlZWsgYWZ0ZXIgZnR5cC4uLiovCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1kYXRTaXplLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLWNsZWFudXA6Ci0KLSAgICAvKioKLSAgICAqIENsb3NlIHRoZSBmaWxlIGV2ZW4gaWYgYW4gZXJyb3Igb2NjdXJlZCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpCi0gICAgewotICAgICAgICBlcnIyID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZShtTXA0RmlsZURhdGFQdHItPgotICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpOyAvKio8IGNsb3NlIHRoZSBzdHJlYW0gYW55d2F5ICovCi0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyMikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlOiBmaWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyMik7Ci0gICAgICAgIH0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAvKiBSZW1vdmUgc2FmZXR5IGZpbGUgaWYgc3RpbGwgcHJlc2VudCAoaGVyZSBpdCBpcyBjbGVhbnVwIGluIGNhc2Ugb2YgZXJyb3IgYW5kIE5PVCB0aGUgbm9ybWFsCi0gICAgcmVtb3ZhbCBvZiB0aGUgc2FmZXR5IGZpbGUgdG8gZnJlZSBlbWVyZ2VuY3kgc3BhY2UgZm9yIHRoZSBtb292KS4gKi8KLQotICAgIGlmIChNNE9TQV9UUlVFID09IG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlKQotICAgIHsKLSAgICAgICAgTTRPU0FfQ29udGV4dCB0ZW1wQ29udGV4dDsKLSAgICAgICAgZXJyMyA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKCZ0ZW1wQ29udGV4dCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlV3JpdGUgfCBNNE9TQV9rRmlsZUNyZWF0ZSk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyMikKLSAgICAgICAgICAgIGVycjIgPSBlcnIzOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SCi0gICAgICAgICAgICAhPSBlcnIzKSAvKiBObyBzZW5zZSBjbG9zaW5nIGlmIHdlIGNvdWxkbid0IG9wZW4gaW4gdGhlIGZpcnN0IHBsYWNlLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIzID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUodGVtcENvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgICAgICAgICAgICAgIGVycjIgPSBlcnIzOwotICAgICAgICB9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCA9IE00T1NBX05VTEw7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0jZW5kaWYgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLQotICAgIC8qIERlbGV0ZSBlbWJlZGRlZCBzdHJpbmcgKi8KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcpCi0gICAgewotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBEZWxldGUgaW50ZWdyYXRpb24gdGFnICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZykKLSAgICB7Ci0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogTTRNUDRXX2ZyZWVDb250ZXh0KCkgaXMgbm93IGEgcHJpdmF0ZSBtZXRob2QsIGNhbGxlZCBvbmx5IGZyb20gaGVyZSovCi0gICAgZXJyMyA9IE00TVA0V19mcmVlQ29udGV4dChjb250ZXh0KTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycjMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IE00TVA0V19mcmVlQ29udGV4dCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaG9vc2Ugd2hpY2ggZXJyb3IgY29kZSB0byByZXR1cm4gKi8KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBnaXZlIHByaW9yaXR5IHRvIG1haW4gZXJyb3IgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19jbG9zZVdyaXRlOiByZXR1cm5pbmcgZXJyPTB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycjIpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBFcnJvciBmcm9tIGNsb3NlV3JpdGUgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gbWFpbiBlcnJvciAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IHJldHVybmluZyBlcnIyPTB4JXgiLCBlcnIyKTsKLSAgICAgICAgcmV0dXJuIGVycjI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEVycm9yIGZyb20gTTRNUDRXX2ZyZWVDb250ZXh0IGlzIHJldHVybmVkIG9ubHkgaWYgdGhlcmUgaXMgbm8gbWFpbiBlcnJvciBhbmQKLSAgICAgICAgICBubyBjbG9zZSBlcnJvciAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IHJldHVybmluZyBlcnIzPTB4JXgiLCBlcnIzKTsKLSAgICAgICAgcmV0dXJuIGVycjM7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKnZhbHVlUHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSAqc3RyZWFtSUR2YWx1ZVB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRNUDRXX1N0cmVhbUlEc2l6ZSAqc3RyZWFtSURzaXplUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfbWVtQWRkciAqbWVtQWRkclB0ciA9IE00T1NBX05VTEw7Ci0gICAgLyogICAgTTRNUDRXX1dyaXRlQ2FsbEJhY2sqICAgIGNhbGxCYWNrUHRyID0gTTRPU0FfTlVMTDsqLwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgRVJSX0NIRUNLKCggbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfb3BlbmVkKQotICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbiApCi0gICAgewotICAgICAgICBjYXNlIChNNE1QNFdfbWF4QVVwZXJDaHVuayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhDaHVua1NpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19tYXhDaHVua0ludGVyKToKLQotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gKE00T1NBX1VJbnQzMiltTXA0RmlsZURhdGFQdHItPgotICAgICAgICAgICAgICAgICAgICBJbnRlcmxlYXZlRHVyOyAvKnRpbWUgY29udmVyc2lvbiAhKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19lbWJlZGRlZFN0cmluZyk6Ci0gICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKikoKnZhbHVlUHRyKTsKLSAgICAgICAgLyptZW1BZGRyUHRyIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIKLSAgICAgICAgYW5kIG1lbUFkZHJQdHItPnNpemUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbWF4IHBvc3NpYmxlIGxlbmd0aCBpbiBieXRlcyovCi0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5zaXplID49IDE2LCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBFUlJfQ0hFQ0sobWVtQWRkclB0ci0+YWRkciAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAvKm1lbUFkZHJQdHItPnNpemUgaXMgdXBkYXRlZCB3aXRoIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc3RyaW5nKi8KLSAgICAgICAgbWVtQWRkclB0ci0+c2l6ZSA9IDE2OwotICAgICAgICAvKmlmIG5vIHZhbHVlIHdhcyBzZXQsIHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcsIDE2KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICh2b2lkICopQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nLAotICAgICAgICAgICAgMTYpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19pbnRlZ3JhdGlvblRhZyk6Ci0gICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKikoKnZhbHVlUHRyKTsKLSAgICAgICAgLyptZW1BZGRyUHRyIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIKLSAgICAgICAgYW5kIG1lbUFkZHJQdHItPnNpemUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbWF4IHBvc3NpYmxlIGxlbmd0aCBpbiBieXRlcyovCi0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5zaXplID49IDYwLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBFUlJfQ0hFQ0sobWVtQWRkclB0ci0+YWRkciAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAvKm1lbUFkZHJQdHItPnNpemUgaXMgdXBkYXRlZCB3aXRoIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc3RyaW5nKi8KLSAgICAgICAgbWVtQWRkclB0ci0+c2l6ZSA9IDYwOwotICAgICAgICAvKmlmIG5vIHZhbHVlIHdhcyBzZXQsIHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgMCAqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywgNjApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKilCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICA2MCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX0NhbWNvZGVyVmVyc2lvbik6Ci0KLSAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopKCp2YWx1ZVB0cik7Ci0KLSAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9IG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX3ByZVdyaXRlQ2FsbEJhY2spOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAvKmNhbGxCYWNrUHRyID0gKE00TVA0V19Xcml0ZUNhbGxCYWNrKikoKnZhbHVlUHRyKTsKLSAgICAgICAgKmNhbGxCYWNrUHRyID0gbU1wNEZpbGVEYXRhUHRyLT5QcmVXcml0ZUNhbGxCYWNrOwotICAgICAgICBicmVhazsqLwotCi0gICAgY2FzZSAoTTRNUDRXX3Bvc3RXcml0ZUNhbGxCYWNrKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgLypjYWxsQmFja1B0ciA9IChNNE1QNFdfV3JpdGVDYWxsQmFjayopKCp2YWx1ZVB0cik7Ci0gICAgICAgICpjYWxsQmFja1B0ciA9IG1NcDRGaWxlRGF0YVB0ci0+UG9zdFdyaXRlQ2FsbEJhY2s7Ci0gICAgICAgIGJyZWFrOyovCi0KLSAgICBjYXNlIChNNE1QNFdfbWF4QVVzaXplKToKLQotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19JT0QpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX0VTRCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfU0RQKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGNhc2UgKE00TVA0V190cmFja1NpemUpOgotICAgICAgICBzdHJlYW1JRHNpemVQdHIgPSAoTTRNUDRXX1N0cmVhbUlEc2l6ZSAqKSgqdmFsdWVQdHIpOwotICAgICAgICBzdHJlYW1JRHNpemVQdHItPndpZHRoID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aDsKLSAgICAgICAgc3RyZWFtSURzaXplUHRyLT5oZWlnaHQgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfZXN0aW1hdGVBdWRpb1NpemUpOgotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLSAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMiltTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19NT09WZmlyc3QpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX1YyX01PT0YpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX1YyX3RibENvbXByZXMpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3NldE9wdGlvbiggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHZhbHVlICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSAqc3RyZWFtSUR2YWx1ZVB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRNUDRXX1N0cmVhbUlEc2l6ZSAqc3RyZWFtSURzaXplUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfbWVtQWRkciAqbWVtQWRkclB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRTWVNfU3RyZWFtSURtZW1BZGRyICpzdHJlYW1JRG1lbUFkZHJQdHI7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKiBWZXJpZnkgc3RhdGUgKi8KLSAgICBzd2l0Y2goIG9wdGlvbiApCi0gICAgewotICAgICAgICBjYXNlIE00TVA0V19tYXhGaWxlRHVyYXRpb246Ci0gICAgICAgIGNhc2UgTTRNUDRXX0RTSToKLSAgICAgICAgICAgIC8qIHRoaXMgcGFyYW0gY2FuIGJlIHNldCBhdCB0aGUgZW5kIG9mIGEgcmVjb3JkaW5nICovCi0gICAgICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgIT0gTTRNUDRXX2Nsb3NlZCksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRNUDRXX3NldEZ0eXBCb3g6Ci0gICAgICAgICAgICAvKiB0aGlzIHBhcmFtIGNhbiBvbmx5IGJlIHNldCBiZWZvcmUgc3RhcnRpbmcgYW55IHdyaXRlICovCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfb3BlbmVkLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogaW4gZ2VuZXJhbCBwYXJhbXMgY2FuIGJlIHNldCBhdCBvcGVuIG9yIHJlYWR5IHN0YWdlICovCi0gICAgICAgICAgICBFUlJfQ0hFQ0soKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQpCi0gICAgICAgICAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3JlYWR5KSwgTTRFUlJfU1RBVEUpOwotICAgIH0KLQotICAgIC8qIFNldCBvcHRpb24gKi8KLSAgICBzd2l0Y2goIG9wdGlvbiApCi0gICAgewotICAgICAgICBjYXNlIChNNE1QNFdfbWF4QVVwZXJDaHVuayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhDaHVua1NpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfU1RSRUFNX0lEOyAvKm1heWJlIHRoZSBzdHJlYW0gaGFzIG5vdCBiZWVuIGFkZGVkIHlldCovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ7IC8qbWF5YmUgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gYWRkZWQgeWV0Ki8KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0KLSAgICAgICAgICAgICAgICAgICAgLypJbiBNNE1QNFdfb3BlbmVkIHN0YXRlLCBubyBzdHJlYW0gaXMgcHJlc2VudCB5ZXQsIHNvIG9ubHkgZ2xvYmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIG5lZWRzIHRvIGJlIHVwZGF0ZWQuKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemUgPSBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhDaHVua0ludGVyKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopdmFsdWU7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpc3RyZWFtSUR2YWx1ZVB0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsgLyp0aW1lIGNvbnZlcnNpb24hKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgLypub3QgbWVhbmluZ2Z1bGwgdG8gc2V0IHRoaXMgcGFyYW1ldGVyIG9uIGEgc3RyZWFtSUQgYmFzaXMqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEZpbGVTaXplKToKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUgPSAqKE00T1NBX1VJbnQzMiAqKXZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX2VtYmVkZGVkU3RyaW5nKToKLSAgICAgICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKil2YWx1ZTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPiAxNiBieXRlcywgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICAgICAgKiBJZiBtZW1BZGRyUHRyLT5zaXplIDwgMTYgYnl0ZXMsIHRoZW4gcmV0dXJuIE00RVJSX1BBUkFNRVRFUgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5zaXplID49IDE2LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMTYsIE00TVA0X1dSSVRFUiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiZW1iZWRkZWRTdHJpbmciKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmVsc2UsIGp1c3Qgb3ZlcndyaXRlIHRoZSBwcmV2aW91c2x5IHNldCBzdHJpbmcqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZywKLSAgICAgICAgICAgICAgICAodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsIDE2KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19pbnRlZ3JhdGlvblRhZyk6Ci0gICAgICAgICAgICBtZW1BZGRyUHRyID0gKE00TVA0V19tZW1BZGRyICopdmFsdWU7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBJZiBtZW1BZGRyUHRyLT5zaXplID4gNjAgYnl0ZXMsIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgICAgICogSWYgbWVtQWRkclB0ci0+c2l6ZSA8IDYwIGJ5dGVzLCB0aGVuIHBhZCB3aXRoIDAKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoNjAsIE00TVA0X1dSSVRFUiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiaW50ZWdyYXRpb25UYWciKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmVsc2UsIGp1c3Qgb3ZlcndyaXRlIHRoZSBwcmV2aW91c2x5IHNldCBzdHJpbmcqLwotICAgICAgICAgICAgaWYgKG1lbUFkZHJQdHItPnNpemUgPCA2MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKUJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgNjApOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopbWVtQWRkclB0ci0+YWRkciwgbWVtQWRkclB0ci0+c2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLCA2MCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfQ2FtY29kZXJWZXJzaW9uKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopdmFsdWU7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gPSBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgLypub3QgbWVhbmluZ2Z1bGwgdG8gc2V0IHRoaXMgcGFyYW1ldGVyIG9uIGEgc3RyZWFtSUQgYmFzaXMqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3ByZVdyaXRlQ2FsbEJhY2spOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIC8qbU1wNEZpbGVEYXRhUHRyLT5QcmVXcml0ZUNhbGxCYWNrID0gKihNNE1QNFdfV3JpdGVDYWxsQmFjayopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsqLwotCi0gICAgICAgIGNhc2UgKE00TVA0V19wb3N0V3JpdGVDYWxsQmFjayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgLyptTXA0RmlsZURhdGFQdHItPlBvc3RXcml0ZUNhbGxCYWNrID0gKihNNE1QNFdfV3JpdGVDYWxsQmFjayopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsqLwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhBVXNpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0KLSAgICAgICAgICAgICAgICAgICAgLyppZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID09IE00T1NBX05VTEwpKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0KLSAgICAgICAgICAgICAgICAgICAgLyppZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyID09IE00T1NBX05VTEwpKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4QVVTaXplID0gc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX0lPRCk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19FU0QpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfU0RQKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3RyYWNrU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEc2l6ZVB0ciA9IChNNE1QNFdfU3RyZWFtSURzaXplICopdmFsdWU7Ci0KLSAgICAgICAgICAgIGlmICgoc3RyZWFtSURzaXplUHRyLT5zdHJlYW1JRCAhPSBWaWRlb1N0cmVhbUlEKQotICAgICAgICAgICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoID0gc3RyZWFtSURzaXplUHRyLT53aWR0aDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEc2l6ZVB0ci0+aGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX2VzdGltYXRlQXVkaW9TaXplKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopdmFsdWU7Ci0KLSAgICAgICAgICAgIC8qc2hhbGwgbm90IHNldCB0aGlzIG9wdGlvbiBiZWZvcmUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgd2VyZSBhZGRlZCovCi0gICAgICAgICAgICAvKm5vbnNlbnNlIHRvIHNldCB0aGlzIG9wdGlvbiBpZiBub3QgaW4gY2FzZSBhdWRpbyt2aWRlbyovCi0gICAgICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpKQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0Jvb2wpc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfTU9PVmZpcnN0KToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX1YyX01PT0YpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfVjJfdGJsQ29tcHJlcyk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhGaWxlRHVyYXRpb24pOgotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24gPSAqKE00T1NBX1VJbnQzMiAqKXZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3NldEZ0eXBCb3gpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplOwotCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKCggKE00TVA0Q19GdHlwQm94ICopdmFsdWUpLT5tYWpvcl9icmFuZCAhPSAwLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAgICAgLyogQ29weSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZ0eXAgPSAqKE00TVA0Q19GdHlwQm94ICopdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgZ2xvYmFsIHBvc2l0aW9uIHZhcmlhYmxlcyB3aXRoIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY29tbW9uIGFuZAotICAgICAgICAgICAgICAgICB1c2VyIGJsb2NrICovCi0gICAgICAgICAgICAgICAgc2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHMgKiBzaXplb2YoTTRPU0FfVUludDMyKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zID0gOC8qbWRhdCovICsgMTYgKyBzaXplOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgPSAyMTgvKm1kYXQrbW9vditza2lwKi8gKyAxNiArIHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfRFNJKToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHIgPSAoTTRTWVNfU3RyZWFtSURtZW1BZGRyICopdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBOZXN0ZWQgc3dpdGNoISBXaGVlISAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSURtZW1BZGRyUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb3RlY3QgRFNJIHNldHRpbmcgOiBvbmx5IG9uY2UgYWxsb3dlZCBvbiBhIGdpdmVuIHN0cmVhbSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS50cmFja1R5cGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogZHNpIGFscmVhZHkgc2V0ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogQmFkIEgyNjMgZHNpISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZGVjb2RlciBzcGVjaWZpYyBpbmZvIHNpemUgaXMgc3VwcG9zZWQgdG8gYmUgYWx3YXlzIDcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIGxvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSA9PSA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IGRzaSBhbHJlYWR5IHNldCAhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IEJhZCBNUEVHNCBkc2khIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNUDRWIHNwZWNpZmljKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSA8IDEwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICsgSC4yNjQgdHJpbW1pbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9UUlVFID09IG1NcDRGaWxlRGF0YVB0ci0+Yk1VTFBQU1NQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzdHJpcCB0aGUgRFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uOiBpbiBzZXQgb3B0aW9uIERTSSBzaXplID0lZCJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLSBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogZHNpIGFscmVhZHkgc2V0ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCAwID09IHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IHN0cmVhbUlEbWVtQWRkclB0ci0+YWRkcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBCYWQgSDI2NCBkc2khIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIEguMjY0IFRyaW1taW5nICAqLwotICAgICAgICBjYXNlIE00TVA0V19NVUxfUFBTX1NQUzoKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+Yk1VTFBQU1NQUyA9ICooTTRPU0FfSW50OCAqKXZhbHVlOwotICAgICAgICAgICAgLyogSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFN0YXRlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00TVA0V19TdGF0ZSAqc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlEICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgc3dpdGNoKCBzdHJlYW1JRCApCi0gICAgewotICAgICAgICBjYXNlICgwKToKLSAgICAgICAgICAgICpzdGF0ZSA9IG1NcDRGaWxlRGF0YVB0ci0+c3RhdGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnN0YXRlID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpzdGF0ZSA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdXJyZW50RmlsZVNpemUgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0socEN1cnJlbnRGaWxlU2l6ZSAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICpwQ3VycmVudEZpbGVTaXplID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDRlYzdmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvRnJvbTJpVG9Nb25vXzE2LmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Gcm9tMmlUb01vbm9fMTYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzZmZmIzZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Gcm9tMmlUb01vbm9fMTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9GUk9NMklUT01PTk9fMTZfSF8KLSNkZWZpbmUgX0ZST00ySVRPTU9OT18xNl9IXwotCi0KLXZvaWQgRnJvbTJpVG9Nb25vXzE2KCAgY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZW5kaWYgIC8qIF9GUk9NMklUT01PTk9fMTZfSF8gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0xWTV9UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTFZNX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyODk3NGQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTFZNX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSBuYW1lOiAgICAgICAgICBMVk1fVHlwZXMuaAotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBIZWFkZXIgZmlsZSBkZWZpbmluZyB0aGUgc3RhbmRhcmQgTGlmZVZpYmVzIHR5cGVzIGZvciB1c2UgaW4gdGhlIGFwcGxpY2F0aW9uIGxheWVyICAqLwotLyogIGludGVyZmFjZSBvZiBhbGwgTGlmZVZpYmVzIG1vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIExWTV9UWVBFU19ICi0jZGVmaW5lIExWTV9UWVBFU19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExWTV9OVUxMICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBwb2ludGVyICovCi0KLSNkZWZpbmUgTFZNX1RSVUUgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAvKiBCb29sZWFucyAqLwotI2RlZmluZSBMVk1fRkFMU0UgICAgICAgICAgICAgICAwCi0KLSNkZWZpbmUgTFZNX01BWElOVF84ICAgICAgICAgICAgMTI3ICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLwotI2RlZmluZSBMVk1fTUFYSU5UXzE2ICAgICAgICAgICAzMjc2NwotI2RlZmluZSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAyMTQ3NDgzNjQ3Ci0jZGVmaW5lIExWTV9NQVhFTlVNICAgICAgICAgICAgIDIxNDc0ODM2NDcKLQotI2RlZmluZSBMVk1fTU9EVUxFSURfTUFTSyAgICAgICAweEZGMDAgICAgICAgICAgICAgIC8qIE1hc2sgdG8gZXh0cmFjdCB0aGUgY2FsbGluZyBtb2R1bGUgSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBjYWxsYmFja0lkICovCi0jZGVmaW5lIExWTV9FVkVOVElEX01BU0sgICAgICAgIDB4MDBGRiAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsYmFjayBldmVudCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0lkICovCi0KLS8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgICAgICAwICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgICAxICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiAqLwotI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGICAgICAgMiAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBjb2VmZmljaWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgICAgICAzICAgLyogT2Zmc2V0IHRvIHRlbXBvcmFyeSBtZW1vcnkgcmVnaW9uICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCYXNpYyB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fQ0hBUjsgICAgICAgICAgIC8qIEFTQ0lJIGNoYXJhY3RlciAqLwotCi10eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9JTlQ4OyAgICAgICAgICAgLyogU2lnbmVkIDgtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgTFZNX1VJTlQ4OyAgICAgICAgICAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCi0KLXR5cGVkZWYgICAgIHNob3J0ICAgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLwotCi10eXBlZGVmICAgICBsb25nICAgICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBsb25nICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFN0YW5kYXJkIEVudW1lcmF0ZWQgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBPcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX01PREVfT0ZGICAgID0gMCwKLSAgICBMVk1fTU9ERV9PTiAgICAgPSAxLAotICAgIExWTV9NT0RFX0RVTU1ZICA9IExWTV9NQVhFTlVNCi19IExWTV9Nb2RlX2VuOwotCi0KLS8qIEZvcm1hdCAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1NURVJFTyAgICAgICAgICA9IDAsCi0gICAgTFZNX01PTk9JTlNURVJFTyAgICA9IDEsCi0gICAgTFZNX01PTk8gICAgICAgICAgICA9IDIsCi0gICAgTFZNX1NPVVJDRV9EVU1NWSAgICA9IExWTV9NQVhFTlVNCi19IExWTV9Gb3JtYXRfZW47Ci0KLQotLyogV29yZCBsZW5ndGggKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV8xNl9CSVQgICAgICA9IDAsCi0gICAgTFZNXzMyX0JJVCAgICAgID0gMSwKLSAgICBMVk1fV09SRExFTkdUSF9EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9Xb3JkTGVuZ3RoX2VuOwotCi0KLS8qIExWTSBzYW1wbGluZyByYXRlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX0ZTXzgwMDAgID0gMCwKLSAgICBMVk1fRlNfMTEwMjUgPSAxLAotICAgIExWTV9GU18xMjAwMCA9IDIsCi0gICAgTFZNX0ZTXzE2MDAwID0gMywKLSAgICBMVk1fRlNfMjIwNTAgPSA0LAotICAgIExWTV9GU18yNDAwMCA9IDUsCi0gICAgTFZNX0ZTXzMyMDAwID0gNiwKLSAgICBMVk1fRlNfNDQxMDAgPSA3LAotICAgIExWTV9GU180ODAwMCA9IDgsCi0gICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAotICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9Gc19lbjsKLQotCi0vKiBNZW1vcnkgVHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9QRVJTSVNURU5UX1NMT1dfREFUQSAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEsCi0gICAgTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSwKLSAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGLAotICAgIExWTV9URU1QT1JBUllfRkFTVCAgICAgICAgICA9IExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QsCi0gICAgTFZNX01FTU9SWVRZUEVfRFVNTVkgICAgICAgID0gTFZNX01BWEVOVU0KLX0gTFZNX01lbW9yeVR5cGVzX2VuOwotCi0KLS8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KLSAgICBMVk1fTWVtb3J5VHlwZXNfZW4gICAgICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLwotfSBMVk1fTWVtb3J5UmVnaW9uX3N0OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU3RhbmRhcmQgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIExWTV9JTlQzMiAoKkxWTV9DYWxsYmFjaykodm9pZCAgICAgICAgICAqcENhbGxiYWNrRGF0YSwgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwgICAvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB0byBhIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBpbiB0aGUgY2FsbGJhY2spICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBHZW5lcmFsUHVycG9zZSApOyAgIC8qIEdlbmVyYWwgcHVycG9zZSB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRvIGJlIHVzZWQgYXMgY2FsbGJhY2sgSUQpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBFbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmICAvKiBMVk1fVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9Db21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2ZTU5NmQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbCAgICAgICAgTTRBRF9Db21tb24uaAotICogQGJyaWVmICAgIEF1ZGlvIFNoZWxsIERlY29kZXIgY29tbW9uIGludGVyZmFjZSBkZWNsYXJhdGlvbgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB0aGF0IGF1ZGlvIGRlY29kZXIgc2hlbGxzIG11c3QgaW1wbGVtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000QURfQ09NTU9OX0hfXwotI2RlZmluZSBfX000QURfQ09NTU9OX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNEFEX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRBRF9PcHRpb25JRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBBdWRpbyBkZWNvZGVyIG9wdGlvbnMuCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBhIGRlY29kZXIgdmlhCi0gKiAgICAgICAgICAgIE00QURfZ2V0T3B0aW9uX2ZjdC9NNEFEX3NldE9wdGlvbl9mY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZsYWcgb2YgcHJlc2VuY2Ugb2YgcHJvdGVjdGlvbiAqLwotICAgIE00QURfa09wdGlvbklEX1Byb3RlY3Rpb25BYnNlbnQgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNERFQ09ERVJfQVVESU8sIDB4MDEpLAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBibG9jICovCi0gICAgTTRBRF9rT3B0aW9uSURfTmJGcmFtZVBlckJsb2MgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNERFQ09ERVJfQVVESU8sIDB4MDIpLAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBBQUMgZGVjb2RlciB1c2VyIHBhcmFtZXRlcnMgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9Vc2VyUGFyYW0gICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRERUNPREVSX0FVRElPLCAweDAzKSwKLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBBQUMgc3RlYW0gdHlwZSAqLwotICAgIE00QURfa09wdGlvbklEX1N0cmVhbVR5cGUgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEICwgTTRERUNPREVSX0FVRElPLCAweDEwKSwKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHVzZWQgYnl0ZXMgaW4gdGhlIGxhdGVzdCBkZWNvZGUKLSAgICAgKHVzZWQgb25seSB3aGVuIGRlY29kaW5nIEFBQyBmcm9tIEFESUYgZmlsZSkgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9Vc2VkQnl0ZXMgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEICwgTTRERUNPREVSX0FVRElPLCAweDExKSwKLQotICAgIC8qIFJlYWRlciBJbnRlcmZhY2UgKi8KLSAgICBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgwMTIpLAotCi0gICAgLyogQXVkaW8gQWNjZXNzIFVuaXQgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9BdWRpb0FVID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTMpLAotCi0gICAgLyogUmVhZGVyIGVycm9yIGNvZGUgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9HZXRBdWRpb0FVRXJyQ29kZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDE0KSwKLQotICAgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVscyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDE1KSwKLQotICAgIC8qIFNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDE2KSwKLQotICAgIC8qIEF1ZGlvIEFVIENUUyAqLwotICAgIE00QURfa09wdGlvbklEX0F1Q1RTID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTcpCi0KLX0gTTRBRF9PcHRpb25JRDsKLQotCi0KLXR5cGVkZWYgZW51bQotewotICAgIE00X2tVbmtub3duID0gMCwgICAgLyogVW5rbm93biBzdHJlYW0gdHlwZSAqLwotICAgIE00X2tBQUMsICAgICAgICAgICAgLyogTTRfa0FBQ19NQUlOIG9yIE00X2tBQUNfTEMgb3IgTTRfa0FBQ19TU1Igb3IgTTRfa0FBQ19MVFAgICAgKi8KLSAgICBNNF9rQUFDcGx1cywgICAgICAgIC8qIERlY29kZXIgdHlwZSBpcyBBQUMgcGx1cyAqLwotICAgIE00X2tlQUFDcGx1cyAgICAgICAgLyogRGVjb2RlciB0eXBlIGlzIGVuaGFuY2VkIEFBQyBwbHVzICovCi19IE00X0FBQ1R5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRBRF9UeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF1ZGlvIHR5cGVzIHVzZWQgdG8gY3JlYXRlIGRlY29kZXJzCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWUFMgdG8gaWRlbnRpZnkgYSBjdXJyZW50bHkgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgIGF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLiBFYWNoIGRlY29kZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIG9uZSBvZiB0aGlzIHR5cGUgYXNzb2NpYXRlZC4KLSAqICAgICAgICAgICAgV2hlbiBhIGRlY29kZXIgaW5zdGFuY2UgaXMgbmVlZGVkLCB0aGlzIHR5cGUgaXMgdXNlZCB0byBpZGVudGlmeQotICogICAgICAgICAgICBhbmQgcmV0cmlldmUgaXRzIGludGVyZmFjZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFEX2tUeXBlQU1STkIgPSAwLAotICAgIE00QURfa1R5cGVBTVJXQiwKLSAgICBNNEFEX2tUeXBlQUFDLAotICAgIE00QURfa1R5cGVNUDMsCi0gICAgTTRBRF9rVHlwZVBDTSwKLSAgICBNNEFEX2tUeXBlQkJNdXNpY0VuZ2luZSwKLSAgICBNNEFEX2tUeXBlV01BLAotICAgIE00QURfa1R5cGVSTUEsCi0gICAgTTRBRF9rVHlwZUFEUENNLAotICAgIE00QURfa1R5cGVfTkIgIC8qIG51bWJlciBvZiBkZWNvZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLQotfSBNNEFEX1R5cGUgOwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRBRF9CdWZmZXIKLSAqIEBicmllZiAgICAgICAgU3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgYnVmZmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBtX2RhdGFBZGRyZXNzOwotICAgIE00T1NBX1VJbnQzMiAgICBtX2J1ZmZlclNpemU7Ci0gICAgaW50NjRfdCAgICAgICAgIG1fdGltZVN0YW1wVXM7Ci19IE00QURfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICBBbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhdWRpbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEBwYXJhbSAgICBwVXNlckRhdGE6ICAgICAgICAoSU4pICAgIFBvaW50ZXIgdG8gVXNlciBkYXRhCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfY3JlYXRlX2ZjdCkoTTRBRF9Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX2Rlc3Ryb3lfZmN0KSAgICAoTTRBRF9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIERlY29kZXMgdGhlIGdpdmVuIGF1ZGlvIGRhdGEKLSAqIEBub3RlICAgIFBhcnNlcyBhbmQgZGVjb2RlcyB0aGUgbmV4dCBhdWRpbyBmcmFtZSwgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLgotICogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgcElucHV0QnVmZmVyU2l6ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudAotICogICAgICAgICAgICBvZiBkYXRhIGFjdHVhbGx5IHJlYWQuCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgaW5wdXRCdWZmZXI6ICAgICAgICAoSU4vT1VUKUlucHV0IERhdGEgYnVmZmVyLiBJdCBjb250YWlucyBhdCBsZWFzdCBvbmUgYXVkaW8gZnJhbWUuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgbXVzdCBiZSB1cGRhdGVkIGluc2lkZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gcmVmbGVjdCB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsbHkgZGVjb2RlZCBkYXRhLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB0aGUgZmlyc3QgZnJhbWUgaW4gcElucHV0QnVmZmVyKQotICogQHBhcmFtICAgZGVjb2RlZFBDTUJ1ZmZlcjogICAgKE9VVCkgICBPdXRwdXQgUENNIGJ1ZmZlciAoZGVjb2RlZCBkYXRhKS4KLSAqIEBwYXJhbSAgIGp1bXBpbmc6ICAgICAgICAgICAgKElOKSAgICBNNE9TQV9UUlVFIGlmIGEganVtcCB3YXMganVzdCBkb25lLCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9zdGVwX2ZjdCkgICAgKE00QURfQ29udGV4dCBjb250ZXh0LCBNNEFEX0J1ZmZlciAqcElucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfQnVmZmVyICpwRGVjb2RlZFBDTUJ1ZmZlciwgTTRPU0FfQm9vbCBqdW1waW5nKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0cyB0aGUgZGVjb2RlciB2ZXJzaW9uCi0gKiBAbm90ZSAgICBUaGUgdmVyc2lvbiBpcyBnaXZlbiBpbiBhIE00X1ZlcnNpb25JbmZvIHN0cnVjdHVyZQotICoKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAoT1VUKSAgICAgICAgUG9pbnRlciB0byB0aGUgdmVyc2lvbiBzdHJ1Y3R1cmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgZ2l2ZW4gcG9pbnRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9nZXRWZXJzaW9uX2ZjdCkoTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBBQUMgY29yZSBkZWNvZGVyIGFjY29yZGluZyB0bwotICogICAgICAgICAgICB0aGUgc3RyZWFtIHByb3BlcnRpZXMgYW5kIHRvIHRoZSBvcHRpb25zIHRoYXQgbWF5Ci0gKiAgICAgICAgICAgIGhhdmUgYmVlbiBzZXQgdXNpbmcgTTRBRF9zZXRPcHRpb25fZmN0Ci0gKiBAbm90ZSAgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBBQUMgZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGVzcGVjaWFsbHkgYnkgdGhlIEFBQyBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKElOL09VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX3N0YXJ0X2ZjdCkgICAgKE00QURfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFJlc2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfcmVzZXRfZmN0KSAgICAoTTRBRF9Db250ZXh0IGNvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgYXVkaW8gZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QURfc2V0T3B0aW9uX2ZjdCkgKE00QURfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCBlbiBvcHRpb24gdmFsdWUgb2YgdGhlIGF1ZGlvIGRlY29kZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRBRF9nZXRPcHRpb25fZmN0KSAoTTRBRF9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEFEX0ludGVyZmFjZQotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBnZW5lcmljIGF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgb2Ygb25lIGF1ZGlvIGRlY29kZXIgdHlwZS4KLSAqICAgICAgICAgICAgICAgIFRoZSBkZWNvZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNEFEX1R5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRBRF9JbnRlcmZhY2UKLXsKLQotICAgIE00QURfY3JlYXRlX2ZjdCogICAgICAgIG1fcEZjdENyZWF0ZUF1ZGlvRGVjOwotICAgIE00QURfc3RhcnRfZmN0KiAgICAgICAgICAgIG1fcEZjdFN0YXJ0QXVkaW9EZWM7Ci0gICAgTTRBRF9zdGVwX2ZjdCogICAgICAgICAgICBtX3BGY3RTdGVwQXVkaW9EZWM7Ci0gICAgTTRBRF9nZXRWZXJzaW9uX2ZjdCogICAgbV9wRmN0R2V0VmVyc2lvbkF1ZGlvRGVjOwotICAgIE00QURfZGVzdHJveV9mY3QqICAgICAgICBtX3BGY3REZXN0cm95QXVkaW9EZWM7Ci0gICAgTTRBRF9yZXNldF9mY3QqICAgICAgICAgICAgbV9wRmN0UmVzZXRBdWRpb0RlYzsKLSAgICBNNEFEX3NldE9wdGlvbl9mY3QqICAgICAgICBtX3BGY3RTZXRPcHRpb25BdWRpb0RlYzsKLSAgICBNNEFEX2dldE9wdGlvbl9mY3QqICAgICAgICBtX3BGY3RHZXRPcHRpb25BdWRpb0RlYzsKLQotfSBNNEFEX0ludGVyZmFjZTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qX19NNEFEX0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX051bGwuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfTnVsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODE0MGNkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfTnVsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRBRF9OdWxsLmgKLSAqIEBicmllZiAgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGVjb2RlciBwdWJsaWMgaW50ZXJmYWNlIHRoYXQgZG8gbm90aGluZwotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGdldEludGVyZmFjZSBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRBRF9OVUxMX0hfXwotI2RlZmluZSBfX000QURfTlVMTF9IX18KLQotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVyVHlwZSAgICAgICAgOiBwb2ludGVyIG9uIGFuIE00QURfVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogYWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgZGVjb2Rlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIEByZXR1cm4gOiBNNE5PX0VSUk9SICBpZiBPSwotICogICAgICAgICAgIE00RVJSX0FMTE9DIGlmIGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QURfTlVMTF9nZXRJbnRlcmZhY2UoIE00QURfVHlwZSAqcERlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNEFEX05VTExfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBSVJfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFJUl9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU0MTM2Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFJUl9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNEFJUl9BUEkuaAotICogQGJyaWVmICBBcmVhIG9mIEludGVyZXN0IFJlc2l6ZXIgIEFQSQotICogQG5vdGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIE00QUlSX0FQSV9ICi0jZGVmaW5lIE00QUlSX0FQSV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLSNpbmNsdWRlICJNNENvbW1vbl90eXBlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIFRZUEVTIERFRklOSVRJT05TICoqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00QUlSX0lucHV0Rm9ybWF0VHlwZQotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGxpc3RzIHRoZSBkaWZmZXJlbnQgYWNjZXB0ZWQgZm9ybWF0IGZvciB0aGUgQUlSLgotICogVG8gYmUgYXZhaWxhYmxlLCB0aGUgYXNzb2NpYXRlZCBjb21waWxhdGlvbiBmbGFnIG11c3QgYmUgZGVmaW5lZCwgZWxzZSwKLSAqIHRoZSBBSVIgd2lsbCByZXR1cm4gYW4gZXJyb3IgKGNvbXBpbGF0aW9uIGZsYWcgOiBNNEFJUl9YWFhYWFhfRk9STUFUX1NVUFBPUlRFRCkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBSVJfa1lVVjQyMFAsCi0gICAgTTRBSVJfa1lVVjQyMEFQLAotICAgIE00QUlSX2tKUEcKLX1NNEFJUl9JbnB1dEZvcm1hdFR5cGUgOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfQ29vcmRpbmF0ZXMKLSAqIEBicmllZiAgICAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSBYIGFuZCBZIGNvb3JkaW5hdGVzIGluIGEgZ2l2ZW4gcGljdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICBtX3g7ICAgIC8qKjwgWCBjb29yZGluYXRlICovCi0gICAgTTRPU0FfVUludDMyICAgIG1feTsgICAgLyoqPCBZIGNvb3JkaW5hdGUgKi8KLX1NNEFJUl9Db29yZGluYXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICAgIE00QUlSX1NpemUKLSAqIEBicmllZiAgICAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGltZW5zaW9uIG9mIGEgZ2l2ZW4gcGljdHVyZSBhcmVhLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIG1fd2lkdGg7ICAgIC8qKjwgV2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9oZWlnaHQ7ICAgIC8qKjwgSGVpZ2h0ICovCi19TTRBSVJfU2l6ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICAgIE00QUlSX1BhcmFtcwotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCB0byBnZXQgYSByZXNpemVkIFJPSSAoUmVnaW9uIG9mIGludGVyZXN0KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00QUlSX0Nvb3JkaW5hdGVzICAgICAgICBtX2lucHV0Q29vcmQ7ICAgICAgICAgICAgLyoqPCBYIGFuZCBZIHBvc2l0aW9ubmluZyBpbiB0aGUgaW5wdXQgb2YgdGhlIGZpcnN0IGludGVyZXN0aW5nIHBpeGVsICh0b3AtbGVmdCkgKi8KLSAgICBNNEFJUl9TaXplICAgICAgICAgICAgICAgIG1faW5wdXRTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgaW50ZXJlc3RpbmcgYXJlYSBpbnNpZGUgaW5wdXQgKHdpZHRoIGFuZCBoZWlnaHQpKi8KLSAgICBNNEFJUl9TaXplICAgICAgICAgICAgICAgIG1fb3V0cHV0U2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIG91dHB1dCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iT3V0cHV0U3RyaXBlOyAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIHdpbGwgaGF2ZSB0byBwcm92aWRlIG91dHB1dCBwZXIgc3RyaXBlIG9yIG5vdCAqLwotICAgIE00Q09NTU9OX09yaWVudGF0aW9uICAgICAgICBtX291dHB1dE9yaWVudGF0aW9uOyAgICAvKio8IERlc2lyZWQgb3JpZW50YXRpb24gb2YgdGhlIEFJUiBvdXRwdXQgKi8KLX1NNEFJUl9QYXJhbXM7Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBFUlJPUlMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBlcnJvciBtZWFucyB0aGF0IHRoZSByZXF1ZXN0ZWQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCi0jZGVmaW5lIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNEFJUiwweDAwMDAwMSkKLQotLyogVGhpcyBlcnJvciBtZWFucyB0aGF0IHRoZSBpbnB1dCBvciBvdXRwdXQgc2l6ZSBpcyBpbmNvcnJlY3QgKi8KLSNkZWZpbmUgTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNEFJUiwweDAwMDAwMikKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIE00QUlSIFBVQkxJQyBBUEkgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KTsKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTi9PVVQpIEFkZHJlc3Mgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICAgaW5wdXRGb3JtYXQ6ICAgIChJTikgaW5wdXQgZm9ybWF0IHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuIEludmFsaWQgZm9ybWF0VHlwZQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgaXMgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBkZXN0cm95cyBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSIGNvbXBvbmVudAotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlIHRvIGRlc3Ryb3kKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6IEludGVybmFsIHN0YXRlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZnVuY3Rpb24gY2FsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jb25maWd1cmUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRBSVJfUGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25maWd1cmUgdGhlIEFJUi4KLSAqIEBub3RlICAgIEl0IHdpbGwgc2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGNvb3JkaW5hdGVzIGFuZCBzaXplcywKLSAqICAgICAgICAgICAgYW5kIGluZGljYXRlcyBpZiB3ZSB3aWxsIHByb2NlZWQgaW4gc3RyaXBlIG9yIG5vdC4KLSAqICAgICAgICAgICAgSW4gY2FzZSBhIE00QUlSX2dldCBpbiBzdHJpcGUgbW9kZSB3YXMgb24gZ29pbmcsIGl0IHdpbGwgY2FuY2VsIHRoaXMgcHJldmlvdXMKLSAqICAgICAgICAgICAgcHJvY2Vzc2luZyBhbmQgcmVzZXQgdGhlIGdldCBwcm9jZXNzLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9iT3V0cHV0U3RyaXBlOihJTikgU3RyaXBlIG1vZGUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dENvb3JkOiAgICAoSU4pIFgsWSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dFNpemU6ICAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9vdXRwdXRTaXplOiAgICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOiB0aGUgcmVxdWVzdGVkIGlucHV0IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jb25maWd1cmUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRBSVJfUGFyYW1zKiBwUGFyYW1zKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCByZXNpemVkIGFyZWEgb2YgaW50ZXJlc3QgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgIHNldHRpbmdzIHByb3ZpZGVkIGluIE00QUlSX2NvbmZpZ3VyZS4KLSAqIEBub3RlICAgIEluIGNhc2UgdGhlIGlucHV0IGZvcm1hdCB0eXBlIGlzIEpQRUcsIGlucHV0IHBsYW5lKHMpCi0gKiAgICAgICAgICAgIGluIHBJbiBpcyBub3QgdXNlZC4gSW4gbm9ybWFsIG1vZGUsIGRpbWVuc2lvbiBzcGVjaWZpZWQgaW4gb3V0cHV0IHBsYW5lKHMpIHN0cnVjdHVyZQotICogICAgICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIHRoYW4gdGhlIG9uZSBzcGVjaWZpZWQgaW4gTTRBSVJfY29uZmlndXJlLiBJbiBzdHJpcGUgbW9kZSwgb25seQotICogICAgICAgICAgICB0aGUgd2lkdGggd2lsbCBiZSB0aGUgc2FtZSwgaGVpZ2h0IHdpbGwgYmUgdGFrZW4gYXMgdGhlIHN0cmlwZSBoZWlnaHQgKHR5cGljYWxseSAxNikuCi0gKiAgICAgICAgICAgIEluIG5vcm1hbCBtb2RlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGwgb25jZSB0byBnZXQgdGhlIGZ1bGwgb3V0cHV0IHBpY3R1cmUuIEluIHN0cmlwZQotICogICAgICAgICAgICBtb2RlLCBpdCBpcyBjYWxsZWQgZm9yIGVhY2ggc3RyaXBlIHRpbGwgdGhlIHdob2xlIHBpY3R1cmUgaGFzIGJlZW4gcmV0cmlldmVkLGFuZAotICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlIGlzIGludGVybmFsbHkgaW5jcmVtZW50ZWQKLSAqICAgICAgICAgICAgYXQgZWFjaCBzdGVwLgotICogICAgICAgICAgICBBbnkgY2FsbCB0byBNNEFJUl9jb25maWd1cmUgZHVyaW5nIHN0cmlwZSBwcm9jZXNzIHdpbGwgcmVzZXQgdGhpcyBvbmUgdG8gdGhlCi0gKiAgICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgIHBPdXQ6ICAgICAgICAoSU4vT1VUKSAgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgb3V0cHV0IFBsYW5lKHMpLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KTsKLQotCi0KLSNlbmRpZiAvKiBNNEFJUl9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBTVJSX0NvcmVSZWFkZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QU1SUl9Db3JlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNzEwZjMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBTVJSX0NvcmVSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRBTVJSX0NvcmVSZWFkZXIuaAotICogQGJyaWVmICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBBTVIgcGFyc2VyCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUEkgZGVmLiBmb3IgQU1SIFBhcnNlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRBTVJfQ09SRVJFQURFUl9IX18KLSNkZWZpbmUgX19NNEFNUl9DT1JFUkVBREVSX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFNUiByZWFkZXIgRXJyb3JzICYgV2FybmluZ3MgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNEFNUl9SRUFERVIsIDB4MDAwMDAxKQotI2RlZmluZSBNNEVSUl9BTVJfTk9UX0NPTVBMSUFOVCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNEFNUl9SRUFERVIsIDB4MDAwMDAyKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00QU1SUl9TdGF0ZQotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQU1SIHJlYWRlciBzdGF0ZXMKLSAqIEBub3RlICAgICAgICBUaGVzZSBzdGF0ZXMgYXJlIHVzZWQgaW50ZXJuYWx5LCBidXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIG91dHNpZGUgdGhlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW17Ci0gICAgTTRBTVJSX2tPcGVuaW5nICAgID0gMHgwMTAwLAotICAgIE00QU1SUl9rT3BlbmVkICAgID0gMHgwMTAxLAotICAgIE00QU1SUl9rUmVhZGluZyA9IDB4MDIwMCwKLSAgICBNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID0gMHgwMjAxLAotICAgIE00QU1SUl9rQ2xvc2VkID0gMHgzMDAKLX1NNEFNUlJfU3RhdGU7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX29wZW5SZWFkIChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyUG9pbnRlciogcEZpbGVGdW5jdGlvbik7Ci0qIEBicmllZiAgICBNNEFNUlJfT3BlblJlYWQgcGFyc2VzIHRoZSBtZXRhIGRhdGEgb2YgdGhlIEFNUiBhbmQgYWxsb2NhdGVzIGRhdGEgc3RydWN0dXJlCi0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBmaWxlIGFuZCBjcmVhdGVzIGEgY29udGV4dCBmb3IgQU1SICBQYXJzZXIuCi0qICAgICAgICAgICAgLSBzZXRzIGNvbnRleHQgdG8gbnVsbCBpZiBlcnJvciBvY2N1cmVkLgotKiBAcGFyYW0gICAgcENvbnRleHQoT1VUKSAgICAgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQgYWxsb2NhdGVkIGluIHRoZSBmdW5jdGlvbgotKiBAcGFyYW0gICAgcEZpbGVEZXNzY3JpcHRvcihJTik6IEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgcEZpbGVGdW5jdGlvbihJTikgICAgOiBwb2ludGVyIHRvIGZpbGUgZnVuY3Rpb24gZm9yIGZpbGUgYWNjZXNzCi0qCi0qIEByZXR1cm5zICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogcENvbnRleHQgYW5kL29yIHBGaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm5zICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICBNNEVSUl9GSUxFX05PVF9GT1VORCA6IGZpbGUgY2Fubm90IGJlIGZvdW5kCi0qIEByZXR1cm5zICAgIE00QU1SUl9FUlJfQU1SX05PVF9DT01QTElBTlQgOiBUdGhlIGlucHV0IGlzIG5vdCBhIEFNUiBmaWxlCi0qIEByZXR1cm5zICAgIE00T1NBX0ZJTEUgICAgICAgIDogU2VlIE9TQUwgZmlsZSBTcGVjLiBmb3IgZGV0YWlscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX29wZW5SZWFkIChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVGdW5jdGlvbik7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYyApOwotKiBAYnJpZWYgICAgUmVhZHMgdGhlIG5leHQgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgZmlsZQotKiBAbm90ZSAgICAgICAgR2V0IHRoZSBzdHJlYW0gZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbS4KLSogICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHN0cmVhbSBpbiBBTVIgZmlsZS4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgcFN0cmVhbURlc2MoT1VUKTogRGVzY3JpcHRpb24gb2YgdGhlIG5leHQgcmVhZCBzdHJlYW0KLSoKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKiBAcmV0dXJucyAgICAgTTRBTVJSX1dBUl9OT19NT1JFX1NUUkVBTSA6IFRoZXJlIGFyZSBubyBtb3JlIHN0cmVhbXMgaW4gdGhlIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNEFNUlJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYyApOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzICk7Ci0qIEBicmllZiAgICBQcmVwYXJlcyB0aGUgQU1SIHJlYWRpbmcgb2YgdGhlIHNwZWNpZmllZCBzdHJlYW0gSWRzCi0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSByZWFkZXIgcmVhZGluZy4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgcFN0cmVhbUlEcyhJTikgICAgOiBBcnJheSBvZiBzdHJlYW0gSWRzIHRvIGJlIHByZXBhcmVkLgotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzICk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfbmV4dEFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0qIEBicmllZiAgICBSZWFkcyB0aGUgYWNjZXNzIHVuaXQgaW50byB0aGUgcHJvdmlkaW5nIHN0cmVhbQotKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIG1lbW9yeSB0byBkYXRhQWRkcmVzcyBmaWxlZCBhbmQgY29waWVkIHRoZSBkYXRhLgotKiAgICAgICAgICAgIC1UaGUgQXBwbGljYXRpb24gc2hvdWxkIG5vdCBmcmVlIHRoZSBkYXRhQWRkcmVzcyBwb2ludGVyLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBTdHJlYW1JRChJTikgICAgOiBTZWxlY3RzIHRoZSBzdHJlYW0KLSogQHBhcmFtICAgIHBBdShJTi9PVVQpICAgICAgICA6IEFjY2VzcyBVbml0Ci0qCi0qIEByZXR1cm5zICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6IEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKiBAcmV0dXJucyAgICAgTTRXQVJfTk9fREFUQV9ZRVQgICAgOiB0aGVyZSAgICBpcyBubyBlbm91Z2ggZGF0YSBvbiB0aGUgc3RyZWFtIGZvciBuZXcgYWNjZXNzIHVuaXQKLSogQHJldHVybnMgICAgIE00V0FSX0VORF9PRl9TVFJFQU0gICAgOiBUaGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtCi0qIEByZXR1cm5zICAgICBNNEFNUlJfRVJSX0lOVkFMSURfRlJBTUVfVFlQRSA6IGN1cnJlbnQgZnJhbWUgaGFzIG5vIHZhbGlkIGZyYW1lIHR5cGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX25leHRBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX2ZyZWVBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpOwotKiBAYnJpZWYgICAgTm90aWZ5IHRoZSBBUk0gUmVhZGVyIHRoYXQgYXBwbGljYXRpb24gd2lsbCBubyBsb25nZXIgdXNlICJBVSIKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBwb2ludGVkIGJ5IHBBdS0+ZGF0YUFkZHJlc3MgcG9pbnRlcgotKiAgICAgICAgICAgIC1DaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZGVyIGJhY2sgdG8gcmVhZGluZy4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgU3RyZWFtSUQoSU4pICAgIDogU2VsZWN0cyB0aGUgc3RyZWFtCi0qIEBwYXJhbSAgICBwQXUoSU4pICAgICAgICAgICAgOiBBY2Nlc3MgVW5pdAotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX2ZyZWVBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX3NlZWsoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0qICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfc2Vla0FjY2Vzc01vZGUgICAgc2Vla01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpOwotKiBAYnJpZWYgICAgVGhlIGZ1bmN0aW9uIHNlZWtzIHRoZSB0YXJnZXRlZCB0aW1lIGluIHRoZSBnaXZlIHN0cmVhbSBieSBzdHJlYW1JZC4KLSogQG5vdGUgICAgICAgIEVhY2ggZnJhbWUgaXMgb2YgMjAgbXMgZHVyYXRpb24sLCBidWlsZHMgdGhlIHNlZWsgdGFibGUgYW5kIHBvaW50cwotKiAgICAgICAgICAgIHRoZSBmaWxlIHBvaW50ZXIgdG8gc3RhcnRpbmcgZm9yIHRoZSByZXF1aXJlZCBBVS4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgU3RyZWFtSUQoSU4pICAgIDogQXJyYXkgb2Ygc3RyZWFtIElEcy4KLSogQHBhcmFtICAgIHRpbWUoSU4pICAgICAgICA6IHRhcmdldGVkIHRpbWUKLSogQHBhcmFtICAgIHNlZWtNb2RlKElOKSAgICA6IFNlbGVjdHMgdGhlIHNlZWsgbW9kZQotKiBAcGFyYW0gICAgcE9idGFpbkNUUyhPVVQpICAgIDogUmV0dXJuZWQgdGltZSBuZWFyZXN0IHRvIHRhcmdldC4KLSoKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6IEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKiBAcmV0dXJucyAgICAgTTRXQVJfSU5WQUxJRF9USU1FICAgIDogdGltZSBjYW5ub3QgYmUgcmVhY2hlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfc2VlayhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TZWVrQWNjZXNzTW9kZSAgICBzZWVrTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUyk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgQ29udGV4dCk7Ci0qIEBicmllZiAgICBBTVIgcmVhZGVyIGNsb3NlcyB0aGUgZmlsZQotKiBAcGFyYW0gICAgQ29udGV4dChJTj9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgQ29udGV4dCk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfZ2V0U3RhdGUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNEFNUlJfU3RhdGUqIHBTdGF0ZSwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWQpOwotKiBAYnJpZWYgICAgR2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQU1SIHJlYWRlcgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBwU3RhdGUoT1VUKSAgICAgICAgOiBDb3JlIEFNUiByZWFkZXIgc3RhdGUKLSogQHBhcmFtICAgIHN0cmVhbUlkKElOKSAgICA6IFNlbGVjdHMgdGhlIHN0cmVhbSAwIGZvciBhbGwKLSoKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgICAgICA6ICAgIFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIDogICAgYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiAgICBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0U3RhdGUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNEFNUlJfU3RhdGUqIHBTdGF0ZSwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QU1SUl9nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgR2V0cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBBTVIgcmVhZGVyCi0gKiBAcGFyYW0gICAgdmVyc2lvbihPVVQpICAgIDogdGhlIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyB0aGUgdmVyc2lvbiBudW1iZXJzCi0gKgotICogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgICAgICA6ICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICA6ICAgIHZlcnNpb24gaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0VmVyc2lvbiAgICAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBTVJSX2dldG1heEFVc2l6ZSAgICAoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNE9TQV9VSW50MzIgKnBNYXhBdVNpemUpCi0gKiBAYnJpZWYgICAgQ29tcHV0ZXMgdGhlIG1heGltdW0gYWNjZXNzIHVuaXQgc2l6ZSBvZiBhIHN0cmVhbQotICoKLSAqIEBwYXJhbSAgICBDb250ZXh0ICAgICAgICAoSU4pICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWF4QXVTaXplICAgIChPVVQpIE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSBpbiB0aGUgc3RyZWFtCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IE9uZSBvZiB0aGUgaW5wdXQgcG9pbnRlciBpcyBNNE9TQV9OVUxMIChEZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0bWF4QVVzaXplKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRPU0FfVUludDMyICpwTWF4QXVTaXplKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyovCi0jZW5kaWYgLypfX000QU1SX0NPUkVSRUFERVJfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRDb21tb25fdHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000Q29tbW9uX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNmEwZmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRDb21tb25fdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNENvbW1vbl9UeXBlcy5oCi0gKiBAYnJpZWYgIGRlZmluZXMgY29tbW9uIHN0cnVjdHVyZXMKLSAqIEBub3RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgTTRDT01NT05fVFlQRVNfSAotI2RlZmluZSBNNENPTU1PTl9UWVBFU19ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBNNENPTU1PTl9NZXRhZGF0YVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rVW5rbm93bk1ldGFEYXRhVHlwZSwKLSAgICAvKiBMb2NhbCBmaWxlcyAqLwotICAgIE00Q09NTU9OX2tUYWdJRDN2MSwgICAgICAgICAgICAgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBUQUcgSUQzIFYxICovCi0gICAgTTRDT01NT05fa1RhZ0lEM3YyLCAgICAgICAgICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIFRBRyBJRDMgVjIgKi8KLSAgICBNNENPTU1PTl9rQVNGQ29udGVudERlc2MsICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIEFTRiBjb250ZW50IGRlc2NyaXB0aW9uICAqLwotCi0gICAgTTRDT01NT05fazNHcHBBc3NldE1vdmllQm94LCAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGEgM2dwcCBmaWxlIChtb3ZpZSBib3gpICovCi0gICAgTTRDT01NT05fazNHcHBBc3NldFRyYWNrQm94LCAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGEgM2dwcCBmaWxlICh0cmFjayBib3gpICovCi0KLSAgICAvKiBTdHJlYW1pbmcgKi8KLSAgICBNNENPTU1PTl9rTWV0YURhdGFTZHBTZXNzaW9uLCAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGFuIFNEUCBmaWxlIChTZXNzaW9uIGxldmVsKSAqLwotICAgIE00Q09NTU9OX2tNZXRhRGF0YVNkcEF1ZGlvLCAgICAgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBhbiBTRFAgZmlsZSAobWVkaWEgYXVkaW8gbGV2ZWwpICovCi0gICAgTTRDT01NT05fa01ldGFEYXRhU2RwVmlkZW8sICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGFuIFNEUCBmaWxlIChtZWRpYSB2aWRlbyBsZXZlbCkgKi8KLQotICAgIE00Q09NTU9OX2tKcGVnRXhpZiAgICAgICAgICAgICAgICAvKio8IEVYSUYgaW4gSlBFRyAqLwotfSBNNENPTU1PTl9NZXRhZGF0YVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRWUFNfRW5jb2RpbmdGb3JtYXQKLSAqIEBicmllZiAgICAgICAgVGV4dCBlbmNvZGluZyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rRW5jRm9ybWF0VW5rbm93biAgICA9IDAsICAgICAgLyoqPCBVbmtub3duIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTTRDT01NT05fa0VuY0Zvcm1hdEFTQ0lJICAgID0gMSwgICAgICAgIC8qKjwgSVNPLTg4NTktMS4gVGVybWluYXRlZCB3aXRoICQwMCAgICAgICAgICAgICAgICAqLwotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRVVEY4ICAgICAgICA9IDIsICAgICAvKio8IFVURi04IGVuY29kZWQgVW5pY29kZSAuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgICAgKi8KLSAgICBNNENPTU1PTl9rRW5jRm9ybWF0VVRGMTYgICAgPSAzICAgICAgICAgLyoqPCBVVEYtMTYgZW5jb2RlZCBVbmljb2RlLiBUZXJtaW5hdGVkIHdpdGggJDAwIDAwICovCi19ICBNNENPTU1PTl9FbmNvZGluZ0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWUFNfU3RyaW5nCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3RyaW5nIGF0dHJpYnV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICBtX3BTdHJpbmc7ICAgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0ZXh0ICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV91aVNpemU7ICAgICAgICAgICAgICAgIC8qKjwgVGV4dCBzaXplIGluIGJ5dGVzICAgICAgICAqLwotICAgIE00Q09NTU9OX0VuY29kaW5nRm9ybWF0ICAgIG1fRW5jb2RpbmdGb3JtYXQ7ICAgIC8qKjwgVGV4dCBlbmNvZGluZyBmb3JtYXQgICAgKi8KLQotfSBNNENPTU1PTl9TdHJpbmc7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00Q09NTU9OX0J1ZmZlcgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGdlbmVyaWMgYnVmZmVyIGF0dHJpYnV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBtX3BCdWZmZXI7ICAgICAgICAvKio8IFBvaW50ZXIgdG8gYnVmZmVyICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiBidWZmZXIgaW4gYnl0ZXMgICAgKi8KLX0gTTRDT01NT05fQnVmZmVyOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfTk9ORSwKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfSlBHLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9QTkcsCi0gICAgTTRDT01NT05fa01pbWVUeXBlX0JNUCwgICAvKiBiaXRtYXAsIHdpdGggaGVhZGVyICovCi0gICAgTTRDT01NT05fa01pbWVUeXBlX1JHQjI0LCAvKiByYXcgUkdCIDI0IGJpdHMgKi8KLSAgICBNNENPTU1PTl9rTWltZVR5cGVfUkdCNTY1LCAvKiByYXcsIFJHQiAxNiBiaXRzICovCi0gICAgTTRDT01NT05fa01pbWVUeXBlX1lVVjQyMCwKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfTVBFRzRfSUZyYW1lIC8qIFJDOiB0byBzdXBwb3J0IFBWIGFydCAqLwotCi19IE00Q09NTU9OX01pbWVUeXBlOwotCi0vKiBwaWN0dXJlIHR5cGUgZGVmaW5pdGlvbiBmcm9tIGlkM3YyIHRhZyovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rUGljVHlwZV9PdGhlciAgICAgICAgICAgICAgICA9IDB4MDAsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfMzJfMzJfSWNvbiAgICAgICAgICAgID0gMHgwMSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9PdGhlcl9JY29uICAgICAgICAgICAgPSAweDAyLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0Zyb250Q292ZXIgICAgICAgICAgICA9IDB4MDMsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQmFja0NvdmVyICAgICAgICAgICAgPSAweDA0LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0xlYWZsZXRQYWdlICAgICAgICAgICAgPSAweDA1LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX01lZGlhICAgICAgICAgICAgICAgID0gMHgwNiwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9MZWFkQXJ0aXN0ICAgICAgICAgICAgPSAweDA3LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0FydGlzdCAgICAgICAgICAgICAgICA9IDB4MDgsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQ29uZHVjdG9yICAgICAgICAgICAgPSAweDA5LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX09yY2hlc3RyYSAgICAgICAgICAgID0gMHgwQSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9Db21wb3NlciAgICAgICAgICAgID0gMHgwQiwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9MeXJpY2lzdCAgICAgICAgICAgID0gMHgwQywKLSAgICBNNENPTU1PTl9rUGljVHlwZV9SZWNvcmRpbmdMb2NhdGlvbiAgICA9IDB4MEQsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfRHVyaW5nUmVjb3JkaW5nICAgICAgICA9IDB4MEUsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfRHVyaW5nUGVyZm9ybWFuY2UgICAgPSAweDBGLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX01vdmllU2NyZWVuQ2FwdHVyZSAgICA9IDB4MTAsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQnJpZ2h0Q29sb3VyZWRGaXNoICAgID0gMHgxMSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9JbGx1c3RyYXRpb24gICAgICAgID0gMHgxMiwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9BcnRpc3RMb2dvICAgICAgICAgICAgPSAweDEzLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX1N0dWRpb0xvZ28gICAgICAgICAgICA9IDB4MTQKLX0gTTRDT01NT05fUGljdHVyZVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRDT01NT05fT3JpZW50YXRpb24KLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIHBvc3NpYmxlIG9yaWVudGF0aW9uIG9mIGEgZnJhbWUgYXMgZGVzY3JpYmVkCi0gKiAgICAgICAgICAgIGluIHRoZSBFWElGIHN0YW5kYXJkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblVua25vd24gPSAwLAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0VG9wLAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wLAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tLAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b20KLX1NNENPTU1PTl9PcmllbnRhdGlvbiA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00RVhJRkNfTG9jYXRpb24KLSAqIEBicmllZiAgICAgICAgVGhlIEltYWdlIEdQUyBsb2NhdGlvbiAoZXhhbXBsZSA6IDQ4sDUyLjIxJyApCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9GbG9hdCAgICBkZWdyZWVzOwotICAgIE00T1NBX0Zsb2F0ICAgIG1pbnNlYzsKLX0gTTRDT01NT05fTG9jYXRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00Q09NTU9OX01ldGFEYXRhQWxidW1BcnQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBmaWVsZHMgb2YgYSBhbGJ1bSBhcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00Q09NTU9OX01pbWVUeXBlICAgIG1fbWltZVR5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3VpU2l6ZTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcERhdGE7Ci0KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgICAgIG1fcERlc2NyaXB0aW9uOwotCi19IE00Q09NTU9OX01ldGFEYXRhQWxidW1BcnQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00Q09NTU9OX01ldGFEYXRhRmllbGRzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZmllbGRzIG9mIG1ldGFkYXRhIGluZm9ybWF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNENPTU1PTl9NZXRhZGF0YVR5cGUgICAgbV9NZXRhZGF0YVR5cGU7Ci0KLSAgICAvKiBNZXRhIGRhdGEgZmllbGRzICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFRpdGxlOyAgICAgICAgICAgIC8qKjwgVGl0bGUgZm9yIHRoZSBtZWRpYSAgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQXJ0aXN0OyAgICAgICAgICAgIC8qKjwgUGVyZm9ybWVyIG9yIGFydGlzdCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BBbGJ1bTsgICAgICAgICAgICAvKio8IEFsYnVtIHRpdGxlIGZvciB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQXV0aG9yOyAgICAgICAgICAgIC8qKjwgQXV0aG9yIG9mIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BHZW5yZTsgICAgICAgICAgICAvKio8IEdlbnJlIChjYXRlZ29yeSBhbmQgc3R5bGUpIG9mIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BEZXNjcmlwdGlvbjsgICAgICAgIC8qKjwgQ2FwdGlvbiBvciBkZXNjcmlwdGlvbiBmb3IgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcENvcHlSaWdodHM7ICAgICAgICAvKio8IE5vdGljZSBhYm91dCBvcmdhbml6YXRpb24gaG9sZGluZyBjb3B5cmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtZWRpYSBmaWxlICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFJlY29yZGluZ1llYXI7ICAgIC8qKjwgUmVjb3JkaW5nIHllYXIgZm9yIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BSYXRpbmc7ICAgICAgICAgICAgLyoqPCBNZWRpYSByYXRpbmcgKi8KLQotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BDbGFzc2lmaWNhdGlvbjsgICAgLyoqPCBDbGFzc2lmaWNhdGlvbiBvZiB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wS2V5V29yZHM7ICAgICAgICAvKio8IE1lZGlhIGtleXdvcmRzICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcExvY2F0aW9uOyAgICAgICAgLyoqPCBMb2NhdGlvbiBpbmZvcm1hdGlvbiAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BVcmw7ICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIG9mIHRoZSByZXNvdXJjZSAqLwotCi0gICAgTTRPU0FfVUludDggICAgICAgIG1fdWlUcmFja051bWJlcjsgICAgLyoqPCBUcmFjayBudW1iZXIgZm9yIHRoZSBtZWRpYSovCi0gICAgTTRPU0FfVUludDMyICAgIG1fdWlEdXJhdGlvbjsgICAgICAgIC8qKjwgVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqLwotCi0gICAgTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydCAgICBtX2FsYnVtQXJ0OyAgICAvKio8IEFsYnVtQXJ0IGRlc2NyaXB0aW9uICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgICAgICAgICAgICAgIG1fcE1vb2Q7ICAgIC8qKjwgTW9vZCBvZiB0aGUgbWVkaWEgKi8KLQotICAgIC8qKjwgTW9kaWZzIEFDTyA0LzEyLzA3IDogYWRkIEV4aWYgc3BlY2lmaWMgaW5mb3MgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQ3JlYXRpb25EYXRlVGltZTsgICAgLyoqPCBkYXRlIGFuZCB0aW1lIG9yaWdpbmFsIGltYWdlIHdhcyBnZW5lcmF0ZWQgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTGFzdENoYW5nZURhdGVUaW1lOyAgICAvKio8IGZpbGUgY2hhbmdlIGRhdGUgYW5kIHRpbWUgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTWFudWZhY3R1cmVyOyAgICAgICAgLyoqPCBtYW51ZmFjdHVyZXIgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcE1vZGVsOyAgICAgICAgICAgICAgICAvKio8IG1vZGVsIG9mIGltYWdlIGlucHV0IGVxdWlwbWVudCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BTb2Z0d2FyZTsgICAgICAgICAgICAvKio8IHNvZnR3YXJlIHVzZWQgKi8KLSAgICBNNENPTU1PTl9PcmllbnRhdGlvbiBtX09yaWVudGF0aW9uOyAgICAgICAgLyoqPCBPcmllbnRhdGlvbiBvZiB0aGUgcGljdHVyZSAqLwotCi0gICAgLyoqPCBNb2RpZnMgRlMgMjkvMDgvMDggOiBhZGRpdGlvbm5hbCBFeGlmIGluZm9zICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fd2lkdGg7ICAgICAgICAgICAgLyoqPCBpbWFnZSB3aWR0aCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9oZWlnaHQ7ICAgICAgICAgICAgLyoqPCBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fdGh1bWJuYWlsU2l6ZTsgICAgLyoqPCBzaXplIG9mIHRoZSB0aHVtYm5haWwgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTGF0aXR1ZGVSZWY7ICAgICAgICAvKio8IExhdGl0dWRlIHJlZmVyZW5jZSAqLwotICAgIE00Q09NTU9OX0xvY2F0aW9uIG1fbGF0aXR1ZGU7ICAgICAgICAvKio8IExhdGl0dWRlICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcExvbmdpdHVkZVJlZjsgICAgLyoqPCBMb25naXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbV9sb25naXR1ZGU7ICAgICAgICAvKio8IExvbmdpdHVkZSAgKi8KLQotfSBNNENPTU1PTl9NZXRhRGF0YUZpZWxkczsKLQotCi0jZW5kaWYgLypNNENPTU1PTl9UWVBFU19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OGNhYjdlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REFfVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTREQV9UeXBlcy5oCi0gKiBAYnJpZWYgICAgRGF0YSBhY2Nlc3MgdHlwZSBkZWZpbml0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBtZWRpYSBzcGVjaWZpYyB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000REFfVFlQRVNfSF9fCi0jZGVmaW5lIF9fTTREQV9UWVBFU19IX18KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRfU3RyZWFtVHlwZQotICogQGJyaWVmICAgICAgICBUeXBlIHVzZWQgdG8gZGVzY3JpYmUgYSBzdHJlYW0gKGF1ZGlvIG9yIHZpZGVvIGRhdGEgZmxvdykuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTREQV9TdHJlYW1UeXBlVW5rbm93biAgICAgICAgICAgICAgICA9IC0xLCAgICAvKio8IFVua25vdyB0eXBlICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNCAgICAgICAgICAgID0gMCwgICAgLyoqPCBNUEVHLTQgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgICAgICAgICAgICA9IDEsICAgIC8qKjwgSDI2MyB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCAgICA9IDIsICAgIC8qKjwgQW1yIG5hcnJvdyBiYW5kIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJXaWRlQmFuZCAgICAgICAgPSAzLCAgICAvKio8IEFtciB3aWRlIGJhbmQgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQUFDIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1QMyBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvTUpwZWcgICAgICAgICAgICA9IDYsICAgIC8qKjwgTUpQRUcgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1BjbSAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgV2F2IGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9NaWRpICAgICAgICAgICAgPSA4LCAgICAvKio8IE1pZGkgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjICAgICAgICA9IDksICAgIC8qKjwgTVBFRy00IEFWQyB2aWRlbyAoaDI2NCkgKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FEVFMgICAgICAgICAgICA9IDEwLCAgICAvKio8IEFBQyBBRFRTIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRElGICAgICAgICAgICAgPSAxMSwgICAgLyoqPCBBQUMgQURJRiBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvV21hICAgICAgICAgICAgICAgID0gMTIsICAgIC8qKjwgV01BIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9XbXYgICAgICAgICAgICAgICAgPSAxMywgICAgLyoqPCBXTVYgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1JlYWwgICAgICAgICAgICA9IDE0LCAgIC8qKjwgUkVBTCBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvUmVhbCAgICAgICAgICAgID0gMTUsICAgLyoqPCBSRUFMIHZpZGVvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjICAgICAgICAgICAgPSAxNiwgICAvKio8IEV2cmMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVUaW1lZFRleHQgICAgICAgICAgICA9IDIwLCAgICAvKio8IFRpbWVkIFRleHQgKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0JiYSAgICAgICAgICAgICAgICA9IDIxLCAgICAvKio8IEJlYXQgQnJldyBhdWRpbyBmb21hdCAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvU21hZiAgICAgICAgICAgID0gMjIsICAgIC8qKjwgU01BRiBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvSW1lbG9keSAgICAgICAgICAgID0gMjMsICAgIC8qKjwgSU1FTE9EWSBhdWRpbyovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9YbWYgICAgICAgICAgICAgICAgPSAyNCwgICAgLyoqPCBYTUYgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0JwYyAgICAgICAgICAgICAgICA9IDI1LCAgICAvKio8IEJQQyBhdWRpbyAqLwotCi0gICAgLyogQURQQ00gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FEUGNtICAgICAgICAgICAgPSAyNiwgICAgLyoqPCBBRFBDTSAqLwotCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4OCAgICAgICAgPSAyNwotfSBNNF9TdHJlYW1UeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9TdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEJhc2Ugc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgc3RyZWFtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfU3RyZWFtVHlwZSAgICBtX3N0cmVhbVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgU3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9zdHJlYW1JZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RyZWFtIElkICh1bmlxdWUgbnVtYmVyIGRlZmlubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtKSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICBtX2R1cmF0aW9uOyAgICAgICAgICAgICAgICAgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgc3RyZWFtIGluIG1pbGxpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fYXZlcmFnZUJpdFJhdGU7ICAgICAgICAgICAgLyoqPCBBdmVyYWdlIGJpdHJhdGUgaW4ga2IvcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX21heEFVU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIHNpemUgb2YgYW4gQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbzsgICAgICAgIC8qKjwgUG9pbnRlciBvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjcmVhdGUgYSBkZWNvZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgYWJvdmUgKi8KLSAgICB2b2lkKiAgICAgICAgICAgIG1fcFVzZXJEYXRhOyAgICAgICAgICAgICAgICAvKio8IFBvaW50ZXIgb24gVXNlciBEYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluaXRpYWxpemVkIGJ5IHRoZSB1c2VyKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3N0cnVjdFNpemU7ICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgTTRPU0FfQm9vbCAgICAgIG1fYlN0cmVhbUlzT0s7ICAgICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiBzdHJlYW0gaGFzIG5vIGVycm9ycyBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nIGlzIGZpbmlzaGVkICovCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvOyAgICAgICAgLyoqPCBQb2ludGVyIG9uIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCB0byBjcmVhdGUgYSBkZWNvZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplOyAgICAvKio8IFNpemUgb2YgdGhlIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBwb2ludGVyIGFib3ZlICovCi0gICAgLy8gTVBFRzQgJiBBQUMgZGVjb2RlcnMgcmVxdWlyZSBFU0RTIGluZm8KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRVNEU0luZm87ICAgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciBvbiBNUEVHNCBvciBBQUMgRVNEUyBib3ggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9FU0RTSW5mb1NpemU7ICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgTVBFRzQgb3IgQUFDIEVTRFMgYm94ICovCi19IE00X1N0cmVhbUhhbmRsZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlcgotICogQGJyaWVmICAgICAgICBFeHRlbmRlZCBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSB2aWRlbyBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICAgIG1fYmFzaWNQcm9wZXJ0aWVzOyAgICAgICAgLyoqPCBBdWRpby1WaWRlbyBzdHJlYW0gY29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdmlkZW9XaWR0aDsgICAgICAgICAgICAvKio8IFdpZHRoIG9mIHRoZSB2aWRlbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3ZpZGVvSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgSGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICBtX2F2ZXJhZ2VGcmFtZVJhdGU7ICAgICAgICAvKio8IEF2ZXJhZ2UgZnJhbWUgcmF0ZSBvZiB0aGUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgIHZpZGVvUm90YXRpb25EZWdyZWVzOyAgICAgICAgLyoqPCBWaWRlbyByb3RhdGlvbiBkZWdyZWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotfSBNNF9WaWRlb1N0cmVhbUhhbmRsZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlcgotICogQGJyaWVmICAgICAgICBFeHRlbmRlZCBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYW4gYXVkaW8gc3RyZWFtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgICBtX2Jhc2ljUHJvcGVydGllczsgICAgICAgIC8qKjwgQXVkaW8tVmlkZW8gc3RyZWFtIGNvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX25iQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGF1ZGlvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS1tb25vLCAyLXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fYnl0ZUZyYW1lTGVuZ3RoOyAgICAgICAgLyoqPCBTaXplIG9mIGZyYW1lIHNhbXBsZXMgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fYnl0ZVNhbXBsZVNpemU7ICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5OyAgICAvKio8IFNhbXBsZSBmcmVxdWVuY3kgaW4ga0h6ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLX0gTTRfQXVkaW9TdHJlYW1IYW5kbGVyOwotCi0jaWZkZWYgTTRWUFNfU1VQUE9SVF9UVEVYVAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9UZXh0U3RyZWFtSGFuZGxlcgotICogQGJyaWVmICAgICAgICBFeHRlbmRlZCBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSB0ZXh0IHN0cmVhbS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X1N0cmVhbUhhbmRsZXIgICAgbV9iYXNpY1Byb3BlcnRpZXM7ICAgIC8qKjwgQXVkaW8tVmlkZW8gc3RyZWFtIGNvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3RyYWNrV2lkdGg7ICAgICAgICAvKio8IFdpZHRoIG9mIHRoZSB2aWRlbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3RyYWNrSGVpZ2h0OyAgICAgICAgLyoqPCBIZWlnaHQgb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tYcG9zOyAgICAgICAgLyoqPCBYIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHRyYWNrIGluIHZpZGVvIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tZcG9zOyAgICAgICAgLyoqPCBZIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHRyYWNrIGluIHZpZGVvIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGJhY2tfY29sX3JnYmFbNF07ICAgIC8qKjwgdGhlIGJhY2tncm91bmQgY29sb3IgaW4gUkdCQSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgdWlMZW5naHQ7ICAgICAgICAgICAgLyoqPCB0aGUgc3RyaW5nIGxlbmdodCBpbiBieXRlcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgZGlzcF9mbGFnOyAgICAgICAgICAgIC8qKjwgdGhlIHdheSB0ZXh0IHdpbGwgYmUgZGlzcGxheWVkICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICBob3Jpel9qdXN0aWY7ICAgICAgICAvKio8IHRoZSBob3Jpem9udGFsIGp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIHZlcnRpX2p1c3RpZjsgICAgICAgIC8qKjwgdGhlIHZlcnRpY2FsIGp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQgKi8KLSAgICAvKiBzdHlsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgc3R5bF9zdGFydF9jaGFyOyAgICAvKio8IHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW1wYWN0ZWQgYnkgc3R5bGUgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIHN0eWxfZW5kX2NoYXI7ICAgICAgICAvKio8IHRoZSBsYXN0IGNoYXJhY3RlciBpbXBhY3RlZCBieSBzdHlsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgZm9udElEOyAgICAgICAgICAgICAgICAvKio8IElEIG9mIHRoZSBmb250ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICBmYWNlX3N0eWxlOyAgICAgICAgICAgIC8qKjwgdGhlIHRleHQgZmFjZS1zdHlsZTogYm9sZCwgaXRhbGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lZCwgcGxhaW4oZGVmYXVsdCkgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGZvbnRfc2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgaW4gcGl4ZWwgb2YgZm9udCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgdGV4dF9jb2xfcmdiYVs0XTsgICAgLyoqPCB0aGUgdGV4dCBjb2xvciBpbiBSR0JBICovCi0gICAgLyogYm94ICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfdG9wOyAgICAgICAgIC8qKjwgdGhlIHRvcCBwb3NpdGlvbiBvZiB0ZXh0IGJveCBpbiB0aGUgdHJhY2sgYXJlYSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgYm94X2xlZnQ7ICAgICAgICAvKio8IHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfYm90dG9tOyAgICAgIC8qKjwgdGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0ZXh0IGJveCBpbiB0aGUgdHJhY2sgYXJlYSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgYm94X3JpZ2h0OyAgICAgICAvKio8IHRoZSByaWdodCBwb3NpdGlvbiBvZiB0ZXh0IGJveCBpbiB0aGUgdHJhY2sgYXJlYSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotfSBNNF9UZXh0U3RyZWFtSGFuZGxlcjsKLQotI2VuZGlmIC8qTTRWUFNfU1VQUE9SVF9UVEVYVCovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X0FjY2Vzc1VuaXQKLSAqIEBicmllZiAgICAgICAgU3RydWN0dXJlIHRvIGRlc2NyaWJlIGFuIGFjY2VzcyB1bml0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fc3RyZWFtSUQ7ICAgICAgIC8qKjwgSWQgb2YgdGhlIHN0cmVhbSB0byBnZXQgYW4gQVUgZnJvbSAqLwotICBNNE9TQV9NZW1BZGRyOCAgICAgICAgbV9kYXRhQWRkcmVzczsgICAgICAvKio8IFBvaW50ZXIgdG8gYSBtZW1vcnkgYXJlYSB3aXRoIHRoZSBlbmNvZGVkIGRhdGEgKi8KLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9zaXplOyAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBkYXRhQWRyZXNzIGFyZWEgKi8KLSAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbV9DVFM7ICAgICAgICAgICAgLyoqPCBDb21wb3NpdGlvbiBUaW1lIFN0YW1wIGZvciB0aGUgQWNjZXNzIFVuaXQgKi8KLSAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbV9EVFMgOyAgICAgICAgICAgLyoqPCBEZWNvZGVkIFRpbWUgU3RhbXAgZm9yIHRoZSBBY2Nlc3MgVW5pdCAqLwotICBNNE9TQV9VSW50OCAgICAgICAgICAgIG1fYXR0cmlidXRlOyAgICAgICAvKio8IFJBUCBpbmZvcm1hdGlvbiAmIEFVIGNvcnJ1cHRlZCAqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX21heHNpemU7ICAgICAgICAvKio8IE1heGltdW0gc2l6ZSBvZiB0aGUgQVUgKi8KLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgLyoqPCBTdHJ1Y3R1cmUgc2l6ZSAqLwotfSBNNF9BY2Nlc3NVbml0OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KLQotI2VuZGlmIC8qIF9fTTREQV9UWVBFU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX0NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2UzMDYyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNERFQ09ERVJfQ29tbW9uLmgKLSAqIEBicmllZiAgU2hlbGwgRGVjb2RlciBjb21tb24gaW50ZXJmYWNlIGRlY2xhcmF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgY29tbW9uIGludGVyZmFjZXMgdGhhdCBkZWNvZGVyIHNoZWxscyBtdXN0IGltcGxlbWVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRERUNPREVSX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNERFQ09ERVJfQ09NTU9OX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0jaW5jbHVkZSAiTTRfVXRpbHMuaCIKLQotLyogLS0tLS0gRXJyb3JzIGFuZCBXYXJuaW5ncyAtLS0tLSAqLwotCi0vKioKLSAqIFdhcm5pbmc6IHRoZXJlIGlzIG5vIG5ldyBkZWNvZGVkIGZyYW1lIHRvIHJlbmRlciBzaW5jZSB0aGUgbGFzdCByZW5kZXJpbmcKLSAqLwotI2RlZmluZSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRERUNPREVSX0NPTU1PTiwgMHgwMDAxKQotLyoqCi0gKiBXYXJuaW5nOiB0aGUgZGVibG9ja2luZyBmaWx0ZXIgaXMgbm90IGltcGxlbWVudGVkCi0gKi8KLSNkZWZpbmUgTTRXQVJfREVCTE9DS0lOR19GSUxURVJfTk9UX0lNUExFTUVOVEVEIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNERFQ09ERVJfQ09NTU9OLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyKQotCi0KLS8qIEVycm9yOiBTdHJlYW0gSDI2MyBwcm9maWxlcyAob3RoZXIgdGhhbiAgMCkgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTTRFUlJfREVDT0RFUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0LCAweDAwMDEpCi0vKiBFcnJvcjogU3RyZWFtIEgyNjMgbm90IGJhc2VsaW5lIG5vdCBzdXBwb3J0ZWQgKFN1cHBvcnRlZCBzaXplcyBhcmUgQ0lGLCBRQ0lGIG9yIFNRQ0lGKSAqLwotI2RlZmluZSBNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzQsIDB4MDAwMikKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNERFQ09ERVJfQVZDUHJvZmlsZUxldmVsCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEFWQyBkZWNvZGVyIHByb2ZpbGUgYW5kIGxldmVsIGZvciB0aGUgY3VycmVudCBpbnN0YW5jZQotICogQG5vdGUgICAgVGhpcyBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gZGVjb2RlciB2aWEgTTRERUNPREVSX2dldE9wdGlvbl9mY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMSA9IDAsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzFiLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xXzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzFfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMV8zLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8yXzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzJfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMywKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfM18xLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8zXzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzQsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzRfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNF8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF81LAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF81XzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV9hbmRfTGV2ZWxfT3V0X09mX1JhbmdlID0gMjU1Ci19IE00REVDT0RFUl9BVkNQcm9maWxlTGV2ZWw7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRERUNPREVSX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGRlY29kZXIgb3B0aW9ucwotICogQG5vdGUgICAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYSBkZWNvZGVyIHZpYSBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgY29yZSBkZWNvZGVyCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1ZlcnNpb24gICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDAxKSwKLSAgICAvKioKLSAgICBHZXQgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnRseSBkZWNvZGVkIHZpZGVvCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1ZpZGVvU2l6ZSAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwMiksCi0gICAgLyoqCi0gICAgU2V0IHRoZSBjb252ZXJzaW9uIGZpbHRlciB0byB1c2UgYXQgcmVuZGVyaW5nCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwMyksCi0gICAgLyoqCi0gICAgQWN0aXZhdGUgdGhlIERlYmxvY2tpbmcgZmlsdGVyCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX0RlYmxvY2tpbmdGaWx0ZXIgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDQpLAotICAgIC8qKgotICAgIEdldCBuZXggcmVuZGVyZWQgZnJhbWUgQ1RTCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX05leHRSZW5kZXJlZEZyYW1lQ1RTID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1KSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgWVVWIGRhdGEgdG8gdGhlIGR1bW15IHZpZGVvIGRlY29kZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfRGVjWXV2RGF0YSA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwNiksCi0gICAgLyoqCi0gICAgU2V0IHRoZSBZVVYgZGF0YSB3aXRoIGNvbG9yIGVmZmVjdCBhcHBsaWVkIHRvIHRoZSBkdW1teSB2aWRlbyBkZWNvZGVyCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA3KSwKLQotICAgIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdENvbnRpZ3VvdXMgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDgpLAotCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0ID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA5KSwKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3VwcG9ydGVkIHZpZGVvIGRlY29kZXJzIGFuZCBjYXBhYmlsaXRpZXMgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1ZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MTApLAotCi0gICAgLyogY29tbW9uIHRvIE1QRUc0IGRlY29kZXJzICovCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBEZWNvZGVyQ29uZmlnSW5mbyAqLwotICAgIE00REVDT0RFUl9NUEVHNF9rT3B0aW9uSURfRGVjb2RlckNvbmZpZ0luZm8gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0LCAweDAxKSwKLQotICAgIC8qIGxhc3QgZGVjb2RlZCBjdHMgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX0FWQ0xhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVkMsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxKQotLyogTGFzdCBkZWNvZGVkIGN0cyAqLwotCi19IE00REVDT0RFUl9PcHRpb25JRDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8KLSAqIEBicmllZiAgICBDb250YWlucyBpbmZvIHJlYWQgZnJvbSB0aGUgTVBFRy00IFZpZGVvT2JqZWN0TGF5ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgdWlQcm9maWxlOyAgICAgICAgICAgICAgICAvKio8IHByb2ZpbGUgYW5kIGxldmVsIGFzIGRlZmluZWQgaW4gdGhlIFZpc3VhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFNlcXVlbmNlIGhlYWRlciwgaWYgcHJlc2VudCAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVRpbWVTY2FsZTsgICAgICAgICAgICAvKio8IHRpbWUgc2NhbGUgYXMgcGFyc2VkIGluIFZPTCBoZWFkZXIgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgdWlVc2VPZlJlc3luY2hNYXJrZXI7ICAgIC8qKjwgVXNhZ2Ugb2YgcmVzeW5jaHJvbml6YXRpb24gbWFya2VyICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgYkRhdGFQYXJ0aXRpb247ICAgICAgICAgICAgLyoqPCBJZiAxIGRhdGEgcGFydGl0aW9uaW5nIGlzIHVzZWQuICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgYlVzZU9mUlZMQzsgICAgICAgICAgICAgICAgLyoqPCBVc2FnZSBvZiBSVkxDIGZvciB0aGUgc3RyZWFtICovCi0KLX0gTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRERUNPREVSX1ZpZGVvU2l6ZQotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB2aWRlbyBzaXplICh3aWR0aCBhbmQgaGVpZ2h0KQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgdmlhIHRoZSBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdAotICogICAgICAgICAgICAgICAgZnVuY3Rpb24gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZGVjb2RlZCB2aWRlbwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNERFQ09ERVJfVmlkZW9TaXplCi17Ci0gICAgTTRPU0FfVUludDMyICAgbV91aVdpZHRoOyAgICAvKio8IHZpZGVvIHdpZHRoICBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICBtX3VpSGVpZ2h0OyAgICAvKio8IHZpZGVvIGhlaWdodCBpbiBwaXhlbHMgKi8KLQotfSBNNERFQ09ERVJfVmlkZW9TaXplOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnZlcnNpb24gZmlsdGVyCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICBwb2ludGVyIGFuZCBpdHMgdXNlciBkYXRhIHZpYSB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgIE00REVDT0RFUl9nZXRPcHRpb25fZmN0ICAgIHdpdGggdGhlIG9wdGlvbgotICogICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRERUNPREVSX091dHB1dEZpbHRlcgotewotICAgIE00T1NBX1ZvaWQgICAqbV9wRmlsdGVyRnVuY3Rpb247ICAgIC8qKjwgcG9pbnRlciB0byB0aGUgZmlsdGVyIGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICptX3BGaWx0ZXJVc2VyRGF0YTsgICAgLyoqPCB1c2VyIGRhdGEgb2YgdGhlIGZpbHRlciAgICAgICAgKi8KLQotfSBNNERFQ09ERVJfT3V0cHV0RmlsdGVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00REVDT0RFUl9WaWRlb1R5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgdmlkZW8gdHlwZXMgdXNlZCB0byBjcmVhdGUgZGVjb2RlcnMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSBhIGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgdmlkZW8gZGVjb2RlciBpbnRlcmZhY2UuIEVhY2ggZGVjb2RlciBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgICBXaGVuIGEgZGVjb2RlciBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZAotICogICAgICAgICAgICBhbmQgcmV0cmlldmUgaXRzIGludGVyZmFjZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0ID0gMCwKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZU1KUEVHLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlQVZDLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlV01WLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlUkVBTCwKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZVlVVjQyMFAsCi0KLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQiAgLyogbnVtYmVyIG9mIGRlY29kZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00REVDT0RFUl9WaWRlb1R5cGUgOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyIG1Qcm9maWxlOwotICAgIE00T1NBX1VJbnQzMiBtTGV2ZWw7Ci19IFZpZGVvUHJvZmlsZUxldmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVmlkZW9Qcm9maWxlTGV2ZWwgKnByb2ZpbGVMZXZlbDsKLSAgICBNNE9TQV9VSW50MzIgcHJvZmlsZU51bWJlcjsKLX0gVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNF9TdHJlYW1UeXBlIGNvZGVjOwotICAgIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzICpjb21wb25lbnQ7Ci0gICAgTTRPU0FfVUludDMyIGNvbXBvbmVudE51bWJlcjsKLX0gVmlkZW9EZWNvZGVyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVmlkZW9EZWNvZGVyICpkZWNvZGVyOwotICAgIE00T1NBX1VJbnQzMiBkZWNvZGVyTnVtYmVyOwotfSBNNERFQ09ERVJfVmlkZW9EZWNvZGVyczsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIGFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKElOKSAgICBQb2ludGVyIHRvIGEgdmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcGFyYW0gICAgcEdsb2JhbEludGVyZmFjZTogIChJTikgICAgUG9pbnRlciB0byB0aGUgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZSB0aGF0IG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBieSB0aGUgZGVjb2RlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtCi0gKiBAcGFyYW0gICAgcERhdGFJbnRlcmZhY2U6ICAgIChJTikgICAgUG9pbnRlciB0byB0aGUgTTRSRUFERVJfRGF0YUludGVyZmFjZSBzdHJ1Y3R1cmUgdGhhdCBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYnkgdGhlIGRlY29kZXIgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbQotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHRoZSBkZWNvZGVkIGRhdGEgYXJlIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX2NyZWF0ZV9mY3QpICAgIChNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcERhdGFJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX2Rlc3Ryb3lfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkZWNvZGVyCi0gKiAgICAgICAgICAtdGhlIHNpemUgKHdpZHRoeGhlaWdodCkgb2YgdGhlIGltYWdlCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgKElOKSAgICAgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgKElOL09VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKSB3aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBzdG9yZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX2dldE9wdGlvbl9mY3QpKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGFuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC10aGUgY29udmVyc2lvbiBmaWx0ZXIgdG8gdXNlIGF0IHJlbmRlcmluZwotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOKSAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9zZXRPcHRpb25fZmN0KShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZWNvZGUgQWNjZXNzIFVuaXRzIHVwIHRvIGEgdGFyZ2V0IHRpbWUKLSAqIEBub3RlICAgIFBhcnNlIGFuZCBkZWNvZGUgdGhlIHN0cmVhbSB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byBvdXRwdXQgYSBkZWNvZGVkIGltYWdlIGZvciB3aGljaAotICogICAgICAgICAgICB0aGUgY29tcG9zaXRpb24gdGltZSBpcyBlcXVhbCBvciBncmVhdGVyIHRvIHRoZSBwYXNzZWQgdGFyZ2V0ZWQgdGltZQotICogICAgICAgICAgVGhlIGRhdGEgYXJlIHJlYWQgZnJvbSB0aGUgcmVhZGVyIGRhdGEgaW50ZXJmYWNlCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwVGltZTogICAgICAgIChJTi9PVVQpICAgIElOOiBUaW1lIHRvIGRlY29kZSB1cCB0byAoaW4gbWlsbGkgc2Vjb25kZXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgKGluIG1zKQotICogQHBhcmFtICAgYkp1bXA6ICAgICAgKElOKSAgICAgICAgMCBpZiBubyBqdW1wIG9jY3VyZWQganVzdCBiZWZvcmUgdGhpcyBjYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIGEgYSBqdW1wIGhhcyBqdXN0IGJlZW4gbWFkZQotICogQHBhcmFtICAgdG9sZXJhbmNlOiAgICAgIChJTikgICAgICAgIFdlIG1heSBkZWNvZGUgYW4gZWFybGllciBmcmFtZSB3aXRoaW4gdGhlIHRvbGVyYW5jZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdGltZSBkaWZmZXJlbmNlIGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCB0byBkZWNvZGUgKGVuZCBvZiBzdHJlYW0pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfZGVjb2RlX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfTWVkaWFUaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJKdW1wLCBNNE9TQV9VSW50MzIgdG9sZXJhbmNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVuZGVycyB0aGUgdmlkZW8gYXQgdGhlIHNwZWNpZmllZCB0aW1lLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgcFRpbWU6ICAgICAgIChJTi9PVVQpICAgSU46IFRpbWUgdG8gcmVuZGVyIHRvIChpbiBtaWxsaSBzZWNvbmRlcykKLSAqICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSBhY3R1YWxseSByZW5kZXJlZCBmcmFtZSAoaW4gbXMpCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lOihPVVQpICAgICAgICBPdXRwdXQgcGxhbmUgZmlsbGVkIHdpdGggZGVjb2RlZCBkYXRhIChjb252ZXJ0ZWQpCi0gKiBAcGFyYW0gICBiRm9yY2VSZW5kZXI6KElOKSAgICAgICAxIGlmIHRoZSBpbWFnZSBtdXN0IGJlIHJlbmRlcmVkIGV2ZW4gaXQgaGFzIGFscmVhZHkgYmVlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBub3QgKGluIHdoaWNoIGNhc2UgdGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgICAgSWYgdGhlIGZyYW1lIHRvIHJlbmRlciBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfcmVuZGVyX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfTWVkaWFUaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHB1dFBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgdmlkZW8gZGVjb2RlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvZiBvbmUgdmlkZW8gZGVjb2RlciB0eXBlLgotICogICAgICAgICAgICAgICAgVGhlIGRlY29kZXIgdHlwZSBpcyBvbmUgb2YgdGhlIE00REVDT0RFUl9WaWRlb1R5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlCi17Ci0gICAgTTRERUNPREVSX2NyZWF0ZV9mY3QqICAgICAgICBtX3BGY3RDcmVhdGU7Ci0gICAgTTRERUNPREVSX2Rlc3Ryb3lfZmN0KiAgICAgICAgbV9wRmN0RGVzdHJveTsKLSAgICBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdCogICAgbV9wRmN0R2V0T3B0aW9uOwotICAgIE00REVDT0RFUl9zZXRPcHRpb25fZmN0KiAgICBtX3BGY3RTZXRPcHRpb247Ci0gICAgTTRERUNPREVSX2RlY29kZV9mY3QqICAgICAgICBtX3BGY3REZWNvZGU7Ci0gICAgTTRERUNPREVSX3JlbmRlcl9mY3QqICAgICAgICBtX3BGY3RSZW5kZXI7Ci19IE00REVDT0RFUl9WaWRlb0ludGVyZmFjZTsKLQotI2VuZGlmIC8qX19NNERFQ09ERVJfQ09NTU9OX0hfXyovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfTnVsbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX051bGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3ZDg1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfTnVsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VkRfTnVsbC5oCi0gKiBAYnJpZWYgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYSAibnVsbCIgdmlkZW8gZGVjb2RlcixpLmUuIGEgZGVjb2RlcgotICogICAgICAgICAgdGhhdCBkb2VzIG5vdCBkbyBhY3R1YWwgZGVjb2RpbmcuCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZ2V0SW50ZXJmYWNlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNERFQ09ERVJfTlVMTF9IX18KLSNkZWZpbmUgX19NNERFQ09ERVJfTlVMTF9IX18KLQotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJUeXBlICAgICAgICA6IFBvaW50ZXIgdG8gYSBNNERFQ09ERVJfVmlkZW9UeXBlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gcERlY29kZXJJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGRlY29kZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gYW5kIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAqCi0gKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgIGlmIE9LCi0gKiAgICAgICAgICAgIE00RVJSX0FMTE9DIGlmIGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2dldEludGVyZmFjZSggTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000REVDT0RFUl9OVUxMX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9BdWRpb0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiYTAyYTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00RU5DT0RFUl9BdWRpb0NvbW1vbi5oCi0gKiBAYnJpZWYgICAgVkVTIGF1ZGlvIGVuY29kZXJzIHNoZWxsIGludGVyZmFjZS4KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0eXBlcyBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIFZFUyB0byBhYnN0cmFjdCBhdWRpbyBlbmNvZGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEVOQ09ERVJfQVVESU9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRFTkNPREVSX0FVRElPQ09NTU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIiAgICAgLyogZm9yIE00T1NBX09QVElPTl9JRF9DUkVBVEUoKSAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jZGVmaW5lIE00RU5DT0RFUl9BVURJT19OQl9DSEFOTkVMU19NQVggMgotLyogV0FSTklORzogdGhpcyB2YWx1ZSBtdXN0IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBncmFiYmVkICovCi0vLyNkZWZpbmUgTTRFTkNPREVSX0FVRElPX1BDTV9TQU1QTEVfTlVNQkVSIDk2MCAgICAvKiBpbXBvc2VkIGJ5IHRoZSBBQUMgZW5jb2Rlci4gKi8KLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPX1BDTV9TQU1QTEVfTlVNQkVSIDEwMjQgICAgLyogaW1wb3NlZCBieSB0aGUgQUFDIGVuY29kZXIuICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNEVOQ09ERVJfQXVkaW9fT3B0aW9uSUQKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvcmUgQUFDIHNoZWxsIGVuY29kZXIgb3B0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotIC8qIE1heGltdW0gZ2VuZXJhdGVkIEFVIHNpemUgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9fbWF4QVVzaXplICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxNNEVOQ09ERVJfQVVESU8sIDB4MDEpCi0KLX0gTTRFTkNPREVSX0F1ZGlvX09wdGlvbklEOwotCi0KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9TYW1wbGluZ0ZyZXF1ZW5jeQotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2s4MDAwSHogPSA4MDAwLAotICAgIE00RU5DT0RFUl9rMTEwMjVIeiA9IDExMDI1LAotICAgIE00RU5DT0RFUl9rMTIwMDBIeiA9IDEyMDAwLAotICAgIE00RU5DT0RFUl9rMTYwMDBIeiA9IDE2MDAwLAotICAgIE00RU5DT0RFUl9rMjIwNTBIeiA9IDIyMDUwLAotICAgIE00RU5DT0RFUl9rMjQwMDBIeiA9IDI0MDAwLAotICAgIE00RU5DT0RFUl9rMzIwMDBIeiA9IDMyMDAwLAotICAgIE00RU5DT0RFUl9rNDQxMDBIeiA9IDQ0MTAwLAotICAgIE00RU5DT0RFUl9rNDgwMDBIeiA9IDQ4MDAwCi19IE00RU5DT0RFUl9TYW1wbGluZ0ZyZXF1ZW5jeTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdWRpbyBjb21wcmVzc2lvbiBmb3JtYXRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rQU1STkIgPSAwLAotICAgIE00RU5DT0RFUl9rQUFDLAotICAgIE00RU5DT0RFUl9rQXVkaW9OVUxMLCAgICAvKio8IE5vIGNvbXByZXNzaW9uICovCi0gICAgTTRFTkNPREVSX2tNUDMsCi0gICAgTTRFTkNPREVSX2tBdWRpb19OQiAgICAgICAgLyogbnVtYmVyIG9mIGVuY29kZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00RU5DT0RFUl9BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQ2hhbm5lbE51bWJlcgotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tNb25vICA9IDAsCi0gICAgTTRFTkNPREVSX2tTdGVyZW8sCi0gICAgTTRFTkNPREVSX2tTdGVyZW9Ob0ludGVybGVhdmUKLX0gTTRFTkNPREVSX0NoYW5uZWxOdW1iZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQml0cmF0ZQotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgYml0cmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBdWRpb180Xzc1X0tCUFMgICAgPSA0NzUwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNV8xNV9LQlBTICAgID0gNTE1MCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzVfOV9LQlBTICAgID0gNTkwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzZfN19LQlBTICAgID0gNjcwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzdfNF9LQlBTICAgID0gNzQwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzdfOTVfS0JQUyAgICA9IDc5NTAsCi0gICAgTTRFTkNPREVSX2tBdWRpb184X0tCUFMgICAgICAgID0gODAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzEwXzJfS0JQUyAgICA9IDEwMjAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTJfMl9LQlBTICAgID0gMTIyMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xNl9LQlBTICAgID0gMTYwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18yNF9LQlBTICAgID0gMjQwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18zMl9LQlBTICAgID0gMzIwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb180MF9LQlBTICAgID0gNDAwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb180OF9LQlBTICAgID0gNDgwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb181Nl9LQlBTICAgID0gNTYwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb182NF9LQlBTICAgID0gNjQwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb184MF9LQlBTICAgID0gODAwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb185Nl9LQlBTICAgID0gOTYwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xMTJfS0JQUyAgICA9IDExMjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzEyOF9LQlBTICAgID0gMTI4MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTQ0X0tCUFMgICAgPSAxNDQwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xNjBfS0JQUyAgICA9IDE2MDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE5Ml9LQlBTICAgID0gMTkyMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMjI0X0tCUFMgICAgPSAyMjQwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18yNTZfS0JQUyAgICA9IDI1NjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzMyMF9LQlBTICAgID0gMzIwMDAwCi19IE00RU5DT0RFUl9BdWRpb0JpdHJhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRFTkNPREVSX0FhY1JlZ3VsYXRpb24KLSAqIEBicmllZiAgICAgICAgVGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgYml0cmF0ZSByZWd1bGF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rQWFjUmVndWxOb25lID0gMCwgICAgLyoqPCBubyBiaXRyYXRlIHJlZ3VsYXRpb24gKi8KLSAgICBNNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pciAgICAgICAgLyoqPCBiZXR0ZXIgcXVhbGl0eSwgYnV0IG1vcmUgQ1BVIGNvbnN1bWVkICovCi19IE00RU5DT0RFUl9BYWNSZWd1bGF0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9BbXJTSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgU0lEIG9mIHRoZSBBTVIgZW5jb2Rlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0Ftck5vU0lEID0gMCAgICAgLyoqPCBubyBTSUQgKi8KLX0gTTRFTkNPREVSX0FtclNJRDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0FhY1BhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBzZXR0aW5ncyBzcGVjaWZpYyB0byB0aGUgQUFDIGVuY29kZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEVOQ09ERVJfQWFjUmVndWxhdGlvbiAgICBSZWd1bGF0aW9uOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkhpZ2hTcGVlZDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJUTlM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiUE5TOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYklTOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYk1TOwotfSBNNEVOQ09ERVJfQWFjUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgc2V0dGluZ3MgYXZhbGFpYmxlIHdoZW4gZW5jb2RpbmcgYXVkaW8uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgc19NNEVOQ09ERVJfQXVkaW9QYXJhbXMKLXsKLSAgICBNNEVOQ09ERVJfU2FtcGxpbmdGcmVxdWVuY3kgICAgRnJlcXVlbmN5OyAgICAvKio8IHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICBNNEVOQ09ERVJfQ2hhbm5lbE51bWJlciAgICAgICAgQ2hhbm5lbE51bTsgICAgLyoqPCB0aGUgbnVtYmUgb2YgY2hhbm5lbHMgKG1vbm8sIHN0ZXJlbywgLi4pICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQml0cmF0ZSAgICAgICAgQml0cmF0ZTsgICAgLyoqPCAgYml0cmF0ZSwgc2VlIGVudW0gICovCi0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0ICAgICAgICBGb3JtYXQ7ICAgICAgICAvKio8ICBhdWRpbyBjb21wcmVzc2lvbiBmb3JtYXQsIEFNUiwgQUFDIC4uLiAgKi8KLSAgICB1bmlvbiB7Ci0gICAgICAgIE00RU5DT0RFUl9BYWNQYXJhbXMgICAgICAgIEFhY1BhcmFtOwotICAgICAgICBNNEVOQ09ERVJfQW1yU0lEICAgICAgICBBbXJTSUQ7Ci0gICAgfSBTcGVjaWZQYXJhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aGUgYXVkaW8gZW5jb2RlciBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCi19IE00RU5DT0RFUl9BdWRpb1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBkZWNvZGVyIHNwZWNpZmljIGluZm8gYnVmZmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgcEluZm87ICAgICAgICAvKio8IHRoZSBidWZmZXIgYWRyZXNzICovCi0gICAgTTRPU0FfVUludDMyICAgIGluZm9TaXplOyAgICAvKio8IHRoZSBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLwotfSBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm87Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlcgotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGRhdGEgYnVmZmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCB0aGUgdGFibGUgb2YgYnVmZmVycyAodW51c2VkIGJ1ZmZlcnMgYXJlIHNldCB0byBOVUxMKSAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgIHBUYWJsZUJ1ZmZlcltNNEVOQ09ERVJfQVVESU9fTkJfQ0hBTk5FTFNfTUFYXTsKLSAgICAvKio8IHRoZSB0YWJsZSBvZiB0aGUgc2l6ZSBvZiBjb3JyZXNwb25kaW5nIGJ1ZmZlciBhdCBzYW1lIGluZGV4ICovCi0gICAgTTRPU0FfVUludDMyICAgIHBUYWJsZUJ1ZmZlclNpemVbTTRFTkNPREVSX0FVRElPX05CX0NIQU5ORUxTX01BWF07Ci19IE00RU5DT0RFUl9BdWRpb0J1ZmZlcjsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfaW5pdCkgICAgICAgIChNNE9TQV9Db250ZXh0KiBoQ29udGV4dCwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX2NsZWFuVXApICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX29wZW4pICAgICAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRFTkNPREVSX0F1ZGlvUGFyYW1zICpwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvICpkZWNTcGVjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGdyYWJiZXJDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX2Nsb3NlKSAgICAgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfc3RlcCkgICAgICAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRFTkNPREVSX0F1ZGlvQnVmZmVyICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgKm91dEJ1ZmZlcik7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9nZXRPcHRpb24pICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9PcHRpb25JRCAgICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqdmFsdWVQdHIpOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgYW4gYXVkaW8gZW5jb2RlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlCi17Ci0gICAgTTRBRV9pbml0KiAgICAgICAgcEZjdEluaXQ7Ci0gICAgTTRBRV9jbGVhblVwKiAgICBwRmN0Q2xlYW5VcDsKLSAgICBNNEFFX29wZW4qICAgICAgICBwRmN0T3BlbjsKLSAgICBNNEFFX2Nsb3NlKiAgICAgICAgcEZjdENsb3NlOwotICAgIE00QUVfc3RlcCogICAgICAgIHBGY3RTdGVwOwotICAgIE00QUVfZ2V0T3B0aW9uKiAgICBwRmN0R2V0T3B0aW9uOwotfSBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2U7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNEVOQ09ERVJfQVVESU9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX2NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDY0NjAyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRFTkNPREVSX2NvbW1vbi5oCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdHlwZXMgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBWRVMgdG8gYWJzdHJhY3QgZW5jb2RlcnMKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEVOQ09ERVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000RU5DT0RFUl9DT01NT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKioKLSAqIFZpZGVvIHByZXByb2Nlc3NpbmcgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00VlBQX0FQSS5oIgotCi0vKioKLSAqIFdyaXRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiCi0KLS8qIElNQUdFIFNUQUIgKi8KLS8qIHBlcmNlbnRhZ2Ugb2YgaW1hZ2Ugc3VwcHJlc3NlZCAoY29tcHV0ZWQgZnJvbSB0aGUgc3RhbmRhcmQgZGltZW5zaW9uKS4qLwotI2RlZmluZSBNNEVOQ09ERVJfU1RBQl9GSUxURVJfQ1JPUF9QRVJDRU5UQUdFIDEwCi0gICAgICAgIC8qIFdBUk5JTkc6IHRha2UgdGhlIGluZmVyaW9yIGV2ZW4gZGltZW5zaW9uLCBleDogMTAlIGZvciBRQ0lGIG91dHB1dCA9PiAxOTJ4MTU4ICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX09wZW5Nb2RlCi0gKiBAYnJpZWYgICAgRGVmaW5pdGlvbiBvZiBvcGVuIG1vZGUgZm9yIHRoZSBlbmNvZGVyLgotICogQG5vdGUgICAgREVGQVVMVCAgOiBwb2ludGVyIHRvIE00RU5DT0RFUl9vcGVuKCkgd2hpY2ggdXNlIGRlZmF1bHQgcGFyYW1ldGVycwotICogICAgICAgICAgQURWQU5DRUQgOiBwb2ludGVyIHRvIE00RU5DT0RFUl9vcGVuX2FkdmFuY2VkKCkgd2hpY2ggYWxsb3cgdG8gY3VzdG9taXplCi0gKiAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgZW5jb2RpbmcgcGFyYW1ldGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9PUEVOX0RFRkFVTFQsCi0gICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQKLX0gTTRFTkNPREVSX09wZW5Nb2RlOwotCi0gLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRnJhbWVSYXRlCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGVuY29kZWQgdmlkZW8gZnJhbWVyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfazVfRlBTLAotICAgIE00RU5DT0RFUl9rN181X0ZQUywKLSAgICBNNEVOQ09ERVJfazEwX0ZQUywKLSAgICBNNEVOQ09ERVJfazEyXzVfRlBTLAotICAgIE00RU5DT0RFUl9rMTVfRlBTLAotICAgIE00RU5DT0RFUl9rMjBfRlBTLAotICAgIE00RU5DT0RFUl9rMjVfRlBTLAotICAgIE00RU5DT0RFUl9rMzBfRlBTLAotICAgIE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTLCAgICAgICAgICAgIC8qKjwgVmFyaWFibGUgdmlkZW8gYml0cmF0ZSAqLwotICAgIE00RU5DT0RFUl9rVVNFX1RJTUVTQ0FMRSAgICAgICAgICAgIC8qKjwgQWR2YW5jZWQgZW5jb2RpbmcsIHVzZSB0aW1lc2NhbGUgaW5kaWNhdGlvbiByYXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gZnJhbWVyYXRlICovCi19IE00RU5DT0RFUl9GcmFtZVJhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0lucHV0Rm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIHZpZGVvIGZvcm1hdCBvZiB0aGUgZ3JhYmJpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tJWVVWNDIwPTAsIC8qKjwgWVVWIDQ6MjowIHBsYW5hciAoc3RhbmRhcmQgaW5wdXQgZm9yIG1wZWctNCB2aWRlbykgKi8KLSAgICBNNEVOQ09ERVJfa0lZVVY0MjIsICAgLyoqPCBZVVY0MjIgcGxhbmFyICovCi0gICAgTTRFTkNPREVSX2tJWVVZViwgICAgIC8qKjwgWVVWNDIyIGludGVybGFjZWQsIGx1bWEgZmlyc3QgKi8KLSAgICBNNEVOQ09ERVJfa0lVWVZZLCAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgY2hyb21hIGZpcnN0ICovCi0gICAgTTRFTkNPREVSX2tJSlBFRywgICAgIC8qKjwgSlBFRyBjb21wcmVzc2VkIGZyYW1lcyAqLwotICAgIE00RU5DT0RFUl9rSVJHQjQ0NCwgICAvKio8IFJHQiAxMiBiaXRzIDQ6NDo0ICovCi0gICAgTTRFTkNPREVSX2tJUkdCNTU1LCAgIC8qKjwgUkdCIDE1IGJpdHMgNTo1OjUgKi8KLSAgICBNNEVOQ09ERVJfa0lSR0I1NjUsICAgLyoqPCBSR0IgMTYgYml0cyA1OjY6NSAqLwotICAgIE00RU5DT0RFUl9rSVJHQjI0LCAgICAvKio8IFJHQiAyNCBiaXRzIDg6ODo4ICovCi0gICAgTTRFTkNPREVSX2tJUkdCMzIsICAgIC8qKjwgUkdCIDMyIGJpdHMgICovCi0gICAgTTRFTkNPREVSX2tJQkdSNDQ0LCAgIC8qKjwgQkdSIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1I1NTUsICAgLyoqPCBCR1IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00RU5DT0RFUl9rSUJHUjU2NSwgICAvKio8IEJHUiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRFTkNPREVSX2tJQkdSMjQsICAgIC8qKjwgQkdSIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNEVOQ09ERVJfa0lCR1IzMiAgICAgLyoqPCBCR1IgMzIgYml0cyAgKi8KLX0gTTRFTkNPREVSX0lucHV0Rm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9Gb3JtYXQKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa01QRUc0ID0gMCwKLSAgICBNNEVOQ09ERVJfa0gyNjMsCi0gICAgTTRFTkNPREVSX2tIMjY0LAotICAgIE00RU5DT0RFUl9rSlBFRywKLSAgICBNNEVOQ09ERVJfa01KUEVHLAotICAgIE00RU5DT0RFUl9rTlVMTCwKLSAgICBNNEVOQ09ERVJfa1lVVjQyMCwgICAgICAgICAgICAvKio8IE5vIGNvbXByZXNzaW9uICovCi0gICAgTTRFTkNPREVSX2tZVVY0MjIsICAgICAgICAgICAgLyoqPCBObyBjb21wcmVzc2lvbiAqLwotCi0gICAgTTRFTkNPREVSX2tWaWRlb19OQiAvKiBudW1iZXIgb2YgZGVjb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi19IE00RU5DT0RFUl9Gb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0ZyYW1lV2lkdGgKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIGZyYW1lIFdpZHRoLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9TUUNJRl9XaWR0aCA9IDEyOCwgLyoqPCBTUUNJRiAxMjh4OTYgKi8KLSAgICBNNEVOQ09ERVJfUVFWR0FfV2lkdGggPSAxNjAsIC8qKjwgUVFWR0EgMTYweDEyMCAqLwotICAgIE00RU5DT0RFUl9RQ0lGX1dpZHRoICA9IDE3NiwgLyoqPCBRQ0lGIDE3NngxNDQgKi8KLSAgICBNNEVOQ09ERVJfUVZHQV9XaWR0aCAgPSAzMjAsIC8qKjwgUVZHQSAzMjB4MjQwICovCi0gICAgTTRFTkNPREVSX0NJRl9XaWR0aCAgID0gMzUyLCAvKio8IENJRiAzNTJ4Mjg4ICovCi0gICAgTTRFTkNPREVSX1ZHQV9XaWR0aCAgID0gNjQwLCAvKio8IFZHQSA2NDB4NDgwICovCi0gICAgTTRFTkNPREVSX1NWR0FfV2lkdGggID0gODAwLCAvKio8IFNWR0EgODAweDYwMCAqLwotICAgIE00RU5DT0RFUl9YR0FfV2lkdGggICA9IDEwMjQsIC8qKjwgWEdBIDEwMjR4NzY4ICovCi0gICAgTTRFTkNPREVSX1hWR0FfV2lkdGggID0gMTI4MCwgLyoqPCBYVkdBIDEyODB4MTAyNCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00RU5DT0RFUl9XVkdBX1dpZHRoICA9IDgwMCwgLyoqPCBXVkdBIDgwMCB4IDQ4MCAqLwotICAgIE00RU5DT0RFUl9OVFNDX1dpZHRoICA9IDcyMCwgLyoqPCBOVFNDIDcyMCB4IDQ4MCAqLwotLyogLVBSIExWNTgwNyAqLwotCi0vKiArQ1IgR29vZ2xlICovCi0gICAgTTRFTkNPREVSXzY0MF8zNjBfV2lkdGggICA9IDY0MCwgIC8qKjwgNjQweDM2MCAqLwotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aCAgID0gODQ4LCAgLyoqPCA4NDh4NDgwICovCi0gICAgTTRFTkNPREVSXzEyODBfNzIwX1dpZHRoICA9IDEyODAsIC8qKjwgNzIwcCAxMjgweDcyMCAqLwotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICBNNEVOQ09ERVJfMTA4MF83MjBfV2lkdGggID0gMTA4OCwgLyoqPCA3MjBwIDEwODh4NzIwICovCi0gICAgTTRFTkNPREVSXzk2MF83MjBfV2lkdGggICA9IDk2MCwgIC8qKjwgNzIwcCA5NjB4NzIwICovCi0gICAgTTRFTkNPREVSXzE5MjBfMTA4MF9XaWR0aCA9IDE5MjAgIC8qKjwgMTA4MHAgMTkyMHgxMDgwICovCi0vKiAtQ1IgR29vZ2xlICovCi0KLX0gTTRFTkNPREVSX0ZyYW1lV2lkdGg7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0Ci0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBmcmFtZSBIZWlnaHQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX1NRQ0lGX0hlaWdodCA9IDk2LCAgLyoqPCBTUUNJRiAxMjh4OTYgKi8KLSAgICBNNEVOQ09ERVJfUVFWR0FfSGVpZ2h0ID0gMTIwLCAvKio8IFFRVkdBIDE2MHgxMjAgKi8KLSAgICBNNEVOQ09ERVJfUUNJRl9IZWlnaHQgID0gMTQ0LCAvKio8IFFDSUYgMTc2eDE0NCAqLwotICAgIE00RU5DT0RFUl9RVkdBX0hlaWdodCAgPSAyNDAsIC8qKjwgUVZHQSAzMjB4MjQwICovCi0gICAgTTRFTkNPREVSX0NJRl9IZWlnaHQgICA9IDI4OCwgLyoqPCBDSUYgMzUyeDI4OCAqLwotICAgIE00RU5DT0RFUl9WR0FfSGVpZ2h0ICAgPSA0ODAsIC8qKjwgVkdBIDM0MHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfU1ZHQV9IZWlnaHQgID0gNjAwLCAvKio8IFNWR0EgODAweDYwMCAqLwotICAgIE00RU5DT0RFUl9YR0FfSGVpZ2h0ICAgPSA3NjgsIC8qKjwgWEdBIDEwMjR4NzY4ICovCi0gICAgTTRFTkNPREVSX1hWR0FfSGVpZ2h0ICA9IDEwMjQsIC8qKjwgWFZHQSAxMjgweDEwMjQgKi8KLS8qICtQUiBMVjU4MDcgKi8KLSAgICBNNEVOQ09ERVJfV1ZHQV9IZWlnaHQgID0gNDgwLCAvKio8IFdWR0EgODAwIHggNDgwICovCi0gICAgTTRFTkNPREVSX05UU0NfSGVpZ2h0ICA9IDQ4MCwgLyoqPCBOVFNDIDcyMCB4IDQ4MCAqLwotLyogLVBSIExWNTgwNyAqLwotCi0vKiArQ1IgR29vZ2xlICovCi0gICAgTTRFTkNPREVSXzY0MF8zNjBfSGVpZ2h0ICA9IDM2MCwgLyoqPCA2NDB4MzYwICovCi0gICAgTTRFTkNPREVSXzg1NF80ODBfSGVpZ2h0ICA9IDQ4MCwgLyoqPCA4NTR4NDgwICovCi0gICAgTTRFTkNPREVSXzEyODBfNzIwX0hlaWdodCA9IDcyMCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgTTRFTkNPREVSXzEwODBfNzIwX0hlaWdodCA9IDcyMCwgLyoqPCA3MjBwIDEwODB4NzIwICovCi0gICAgTTRFTkNPREVSXzk2MF83MjBfSGVpZ2h0ICA9IDcyMCwgLyoqPCA3MjBwIDk2MHg3MjAgKi8KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQgPSAxMDg4IC8qKjwgMTA4MHAgMTkyMHgxMDgwICovCi0vKiAtQ1IgR29vZ2xlICovCi19IE00RU5DT0RFUl9GcmFtZUhlaWdodDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQml0cmF0ZQotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgYml0cmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2syOF9LQlBTICA9IDI4MDAwLAotICAgIE00RU5DT0RFUl9rNDBfS0JQUyAgPSA0MDAwMCwKLSAgICBNNEVOQ09ERVJfazY0X0tCUFMgID0gNjQwMDAsCi0gICAgTTRFTkNPREVSX2s5Nl9LQlBTICA9IDk2MDAwLAotICAgIE00RU5DT0RFUl9rMTI4X0tCUFMgPSAxMjgwMDAsCi0gICAgTTRFTkNPREVSX2sxOTJfS0JQUyA9IDE5MjAwMCwKLSAgICBNNEVOQ09ERVJfazI1Nl9LQlBTID0gMjU2MDAwLAotICAgIE00RU5DT0RFUl9rMzg0X0tCUFMgPSAzODQwMDAsCi0gICAgTTRFTkNPREVSX2s1MTJfS0JQUyA9IDUxMjAwMCwKLSAgICBNNEVOQ09ERVJfazgwMF9LQlBTID0gODAwMDAwCi0KLX0gTTRFTkNPREVSX0JpdHJhdGU7Ci0KLS8qIElNQUdFIFNUQUIgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRFTkNPREVSX1N0YWJNb2RlCi0gKiBAYnJpZWYgICAgICAgIFRoZSBjdXJyZW50IG1vZGUgb2YgdGhlIHN0YWJpbGl6YXRpb24gZmlsdGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rU3RhYk9mZiA9IDAsICAgICAgICAvKio8IHN0YWJpbGl6YXRpb24gZmlsdGVyIGlzIGRpc2FibGVkICovCi0gICAgTTRFTkNPREVSX2tTdGFiQ2VudGVyZWQsICAgIC8qKjwgc3RhYmlsaXphdGlvbiBmaWx0ZXIgaXMgZW5hYmxlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBpbnB1dCBhbmQgb3V0cHV0IG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25zLiBPdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpbGwgaGF2ZSBibGFjayBib3JkZXJzICovCi0gICAgTTRFTkNPREVSX2tTdGFiR3JhYk1vcmUgICAgICAgIC8qKjwgc3RhYmlsaXphdGlvbiBmaWx0ZXIgaXMgZW5hYmxlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBpbnB1dCBkaW1lbnNpb25zIG11c3QgYmUgYmlnZ2VyIHRoYW4gb3V0cHV0LiBUaGUgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbmRpY2F0ZWQgYnkgTTRFTkNPREVSX1NUQUJfRklMVEVSX0NST1BfUEVSQ0VOVEFHRSAqLwotCi19IE00RU5DT0RFUl9TdGFiTW9kZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRFTkNPREVSX0ZyYW1lTW9kZQotICogQGJyaWVmICAgICAgICBWYWx1ZXMgdG8gZHJpdmUgdGhlIGVuY29kZXIgYmVoYXZpb3VyICh0eXBlIG9mIGZyYW1lcyBwcm9kdWNlZCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa05vcm1hbEZyYW1lID0gMCwgICAvKio8IGxldCB0aGUgZW5jb2RlciBkZWNpZGUgd2hpY2ggdHlwZSBvZiBmcmFtZSB0byBlbmNvZGUgKi8KLSAgICBNNEVOQ09ERVJfa0xhc3RGcmFtZSAgID0gMSwgICAvKio8IGZvcmNlIGVuY29kZXIgdGhlIGZsdXNoIGFsbCBpdHMgYnVmZmVycyBiZWNhdXNlIGl0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgZnJhbWUgICovCi0gICAgTTRFTkNPREVSX2tJRnJhbWUgICAgICA9IDIgICAgLyoqPCBmb3JjZSBlbmNvZGVyIHRvIGdlbmVyYXRlIGFuIEkgZnJhbWUgKi8KLQotfSBNNEVOQ09ERVJfRnJhbWVNb2RlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIGF2YWxhaWJsZSB3aGVuIGVuY29kaW5nLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogSW5wdXQgKi8KLSAgICBNNEVOQ09ERVJfSW5wdXRGb3JtYXQgICAgSW5wdXRGb3JtYXQ7ICAgICAgICAvKio8IElucHV0IHZpZGVvIGZvcm1hdCAoZ3JhYmJpbmcpICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgSW5wdXRGcmFtZVdpZHRoOyAgICAvKio8IElucHV0IEZyYW1lIHdpZHRoIChncmFiYmluZykgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICAgSW5wdXRGcmFtZUhlaWdodDsgICAgLyoqPCBJbnB1dCBGcmFtZSBoZWlnaHQgKGdyYWJiaW5nKSAqLwotCi0gICAgLyogT3V0cHV0ICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRnJhbWVXaWR0aDsgICAgICAgICAgICAvKio8IEZyYW1lIHdpZHRoICAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBGcmFtZUhlaWdodDsgICAgICAgIC8qKjwgRnJhbWUgaGVpZ2h0ICAqLwotICAgIE00RU5DT0RFUl9CaXRyYXRlICAgICAgICBCaXRyYXRlOyAgICAgICAgICAgIC8qKjwgQml0cmF0ZSwgc2VlIGVudW0gICovCi0gICAgTTRFTkNPREVSX0ZyYW1lUmF0ZSAgICAgICAgRnJhbWVSYXRlOyAgICAgICAgICAgIC8qKjwgRnJhbWVyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qKjwgVmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBIMjYzLCBNUEVHNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1KUEVHIC4uLiAgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIHZpZGVvUHJvZmlsZTsgLyoqIHZpZGVvIHByb2ZpbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIHZpZGVvTGV2ZWw7ICAgLyoqIHZpZGVvIGxldmVsICovCi19IE00RU5DT0RFUl9QYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGFkdmFuY2VkIHNldHRpbmdzIGF2YWlsYWJsZSBmb3IgTVBFRy00IGVuY29kaW5nLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogSW5wdXQgcGFyYW1ldGVycyAoZ3JhYmJlciBjb3VwbGVkIHdpdGggZW5jb2Rlcik6ICovCi0gICAgTTRFTkNPREVSX0lucHV0Rm9ybWF0ICAgIElucHV0Rm9ybWF0OyAgICAgICAgICAgICAgICAvKio8IElucHV0IHZpZGVvIGZvcm1hdCAqLwotICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoICAgIElucHV0RnJhbWVXaWR0aDsgICAgICAgICAgICAvKio8IElucHV0IEZyYW1lIHdpZHRoICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIElucHV0RnJhbWVIZWlnaHQ7ICAgICAgICAgICAgLyoqPCBJbnB1dCBGcmFtZSBoZWlnaHQgKi8KLQotICAgIC8qKgotICAgICAqIENvbW1vbiBzZXR0aW5ncyBmb3IgSDI2MyBhbmQgTVBFRy00OiAqLwotICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoICAgIEZyYW1lV2lkdGg7ICAgICAgICAgICAgICAgICAgICAvKio8IEZyYW1lIHdpZHRoICAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBGcmFtZUhlaWdodDsgICAgICAgICAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgQml0cmF0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgRnJlZSB2YWx1ZSBmb3IgdGhlIGJpdHJhdGUgKi8KLSAgICAvKio8IEZyYW1lcmF0ZSAoaWYgc2V0IHRvIE00RU5DT0RFUl9rVVNFX1RJTUVTQ0FMRSB1c2UgdWlSYXRlRmFjdG9yICYgdWlUaW1lU2NhbGUgaW5zdGVhZCkgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVSYXRlICAgICAgICBGcmFtZVJhdGU7Ci0gICAgLyoqPCBWaWRlbyBjb21wcmVzc2lvbiBmb3JtYXQ6IEgyNjMgb3IgTVBFRzQgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBGb3JtYXQ7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICB2aWRlb1Byb2ZpbGU7IC8qKiBvdXRwdXQgdmlkZW8gcHJvZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9MZXZlbDsgICAvKiogb3V0cHV0IHZpZGVvIGxldmVsICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlIb3Jpem9udGFsU2VhcmNoUmFuZ2U7IC8qKjwgU2V0IHRvIDAgd2lsbCB1c2UgZGVmYXVsdCB2YWx1ZSAoMTUpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlWZXJ0aWNhbFNlYXJjaFJhbmdlOyAgIC8qKjwgU2V0IHRvIDAgd2lsbCB1c2UgZGVmYXVsdCB2YWx1ZSAoMTUpICovCi0gICAgLyoqPCBTZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICgweDdGRkYgaS5lLiBsZXQgZW5naW5lIGRlY2lkZSB3aGVuIHRvIHB1dCBhbiBJKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZTsKLSAgICAvKio8IEVuYWJsZSBpZiBwcmlvcml0eSBpcyBxdWFsaXR5LCBEaXNhYmxlIGlmIHByaW9yaXR5IGlzIGZyYW1lcmF0ZSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkludGVybmFsUmVndWxhdGlvbjsKLSAgICAvKio8IFJhdGlvIGJldHdlZW4gdGhlIGVuY29kZXIgZnJhbWUgcmF0ZSBhbmQgdGhlIGFjdHVhbCBmcmFtZSByYXRlICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlSYXRlRmFjdG9yOwotICAgIC8qKjwgSSBmcmFtZXMgcGVyaW9kaWNpdHksIHNldCB0byAwIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUlWb3BQZXJpb2Q7Ci0gICAgLyoqPCBNb3Rpb24gZXN0aW1hdGlvbiBbZGVmYXVsdD0wIChhbGwgdG9vbHMpLCBkaXNhYmxlPTggKG5vIHRvb2wpXSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIHVpTW90aW9uRXN0aW1hdGlvblRvb2xzOwotCi0gICAgLyoqCi0gICAgICogU2V0dGluZ3MgZm9yIE1QRUctNCBvbmx5OiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpVGltZVNjYWxlOyAgICAgICAgICAgICAgICAvKio8IEZyZWUgdmFsdWUgZm9yIHRoZSB0aW1lc2NhbGUgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJFcnJvclJlc2lsaWVuY2U7ICAgICAgICAgICAvKio8IERpc2FibGVkIGJ5IGRlZmF1bHQgKi8KLSAgICAvKio8IERpc2FibGVkIGJ5IGRlZmF1bHQgKGlmIGVuYWJsZWQsIGJFcnJvclJlc2lsaWVuY2Ugc2hvdWxkIGJlIGVuYWJsZWQgdG9vISkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJEYXRhUGFydGl0aW9uaW5nOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJBY1ByZWRpY3Rpb247ICAgICAgICAgICAvKio8IEFDIHByZWRpY3Rpb24gW2RlZmF1bHQ9MSwgZGlzYWJsZT0wXSAqLwotCi19IE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX1N0aWxsUGljdHVyZVBhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBzZXR0aW5ncyBhdmFsYWlibGUgd2hlbiBlbmNvZGluZyBzdGlsbAotICogICAgICAgICAgICBwaWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRnJhbWVXaWR0aDsgICAgICAgICAgICAvKio8IEZyYW1lIHdpZHRoICAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBGcmFtZUhlaWdodDsgICAgICAgIC8qKjwgRnJhbWUgaGVpZ2h0ICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIFF1YWxpdHk7ICAgICAgICAgICAgLyoqPCBCaXRyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBJbnB1dEZvcm1hdDsgICAgICAgIC8qKjwgWVVWIDQyMCBvciA0MjIgICovCi0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgRm9ybWF0OyAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdCwgSDI2MywgTVBFRzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSlBFRyAuLi4gICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBQcmVQcm9jZXNzTmVlZGVkOyAgICAvKio8IElzIHRoZSBjYWxsIHRvIHRoZSBWUFAgaXMgbmVjZXNzYXJ5ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBFbmNvZGluZ1BlclN0cmlwZXM7ICAgIC8qKjwgSXMgZW5jb2RpbmcgcGVyIHN0cmlwZXMgKi8KLQotfSBNNEVOQ09ERVJfU3RpbGxQaWN0dXJlUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfSGVhZGVyCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYnVmZmVyIHdoZXJlIHRoZSBzZXF1ZW5jZSBoZWFkZXIgaXMgcHV0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgcEJ1ZjsgICAgICAgIC8qKjwgQnVmZmVyIGZvciB0aGUgaGVhZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgIFNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGRhdGEgKi8KLQotfSBNNEVOQ09ERVJfSGVhZGVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgTTRFTkNPREVSX09wdGlvbklECi0gKiBAYnJpZWYgVGhpcyBlbnVtcyBkZWZpbmVzIGFsbCBhdmFsYWlibGUgb3B0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKio8IHNldCB0aGUgZnJhZ21lbnQgc2l6ZSwgb3B0aW9uIHZhbHVlIGlzIE00T1NBX1VJbnQzMiB0eXBlICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9WaWRlb0ZyYWdtZW50U2l6ZSAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwMSksCi0KLSAgICAvKio8IHNldCB0aGUgc3RhYmlsaXphdGlvbiBmaWx0ZXJpbmcsIG9wdGlvbiB2YWx1ZSBpcyBNNEVOQ09ERVJfU3RhYk1vZGUgdHlwZSAqLwotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSW1hZ2VTdGFiaWxpemF0aW9uICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDIpLAotCi0gICAgLyoqPCBwcmV2ZW50IHdyaXR0aW5nIG9mIGFueSBBVSwgb3B0aW9uIHZhbHVlIGlzIE00T1NBX0Jvb2wgdHlwZSAqLwotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSW5zdGFudFN0b3AgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDMpLAotCi0gICAgLyoqPCBnZXQgdGhlIERTSSAoZW5jb2RlciBoZWFkZXIpIGdlbmVyYXRlZCBieSB0aGUgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwNCksCi0vKisgQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLQotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfU2V0SDI2NFByb2Nlc3NOQUxVZmN0c1B0cj0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRCAsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDUpLAotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSDI2NFByb2Nlc3NOQUxVQ29udGV4dCAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwNikKLS8qLUNSIExWNjc3NSAtSC4yNjQgVHJpbW1pbmcgICovCi19IE00RU5DT0RFUl9PcHRpb25JRDsKLQotLyorIENSIExWNjc3NSAtSC4yNjQgVHJpbW1pbmcgICovCi10eXBlZGVmIE00T1NBX0VSUiAoSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFVfZmN0KShNNE9TQV9Wb2lkKmFpbnN0YW5jZSxNNE9TQV9VSW50OCogaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICBpbmJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpvdXRidWZmLCBNNE9TQV9JbnQzMiAqb3V0YnVmX3NpemUpOwotLy8qLSBDUiBMVjY3NzUgLUguMjY0IFRyaW1taW5nICAqLwotCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00RU5DT0RFUl9Db250ZXh0OwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2luaXQpICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwKLSAgICAgICAgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LAotICAgICAgICBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksCi0gICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YQotKTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9vcGVuKSAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBQYXJhbXMgICAgIC8qIENhbiBiZSBNNEVOQ09ERVJfUGFyYW1zLCBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9TdGlsbFBpY3R1cmVQYXJhbXMgKi8KLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfc3RhcnQpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3N0b3ApIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3BhdXNlKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9yZXN1bWUpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2Nsb3NlKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9jbGVhbnVwKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9yZWd1bEJpdFJhdGUpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfZW5jb2RlKSAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEluUGxhbmUsCi0gICAgICAgIE00T1NBX0RvdWJsZSBDdHMsCi0gICAgICAgIE00RU5DT0RFUl9GcmFtZU1vZGUgRnJhbWVNb2RlCi0pOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3NldE9wdGlvbikgICAgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELAotICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlCi0pOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2dldE9wdGlvbikgICAgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELAotICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlCi0pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgYW4gZW5jb2RlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgc3RydWN0IF9NNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlCi17Ci0gICAgTTRFTkNPREVSX2luaXQqICAgICAgICAgICAgICAgIHBGY3RJbml0OwotICAgIE00RU5DT0RFUl9vcGVuKiAgICAgICAgICAgICAgICBwRmN0T3BlbjsKLQotICAgIE00RU5DT0RFUl9zdGFydCogICAgICAgICAgICBwRmN0U3RhcnQ7ICAgICAgICAgIC8qIEdyYWJiZXIgbW9kZSAqLwotICAgIE00RU5DT0RFUl9zdG9wKiAgICAgICAgICAgICAgICBwRmN0U3RvcDsgICAgICAgICAgIC8qIEdyYWJiZXIgbW9kZSAqLwotCi0gICAgTTRFTkNPREVSX3BhdXNlKiAgICAgICAgICAgIHBGY3RQYXVzZTsgICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0gICAgTTRFTkNPREVSX3Jlc3VtZSogICAgICAgICAgICBwRmN0UmVzdW1lOyAgICAgICAgIC8qIEdyYWJiZXIgbW9kZSAqLwotCi0gICAgTTRFTkNPREVSX2Nsb3NlKiAgICAgICAgICAgIHBGY3RDbG9zZTsKLSAgICBNNEVOQ09ERVJfY2xlYW51cCogICAgICAgICAgICBwRmN0Q2xlYW51cDsKLQotICAgIE00RU5DT0RFUl9yZWd1bEJpdFJhdGUqICAgICBwRmN0UmVndWxCaXRSYXRlOwotICAgIE00RU5DT0RFUl9lbmNvZGUqICAgICAgICAgICAgcEZjdEVuY29kZTsgICAgICAgICAvKiBTdGFuZGFsb25lIG1vZGUgKi8KLQotICAgIE00RU5DT0RFUl9zZXRPcHRpb24qICAgICAgICBwRmN0U2V0T3B0aW9uOwotICAgIE00RU5DT0RFUl9nZXRPcHRpb24qICAgICAgICBwRmN0R2V0T3B0aW9uOwotfSBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRFTkNPREVSX0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNE9TQV9Db3JlSUQuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000T1NBX0NvcmVJRC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDA4ZmM4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000T1NBX0NvcmVJRC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00T1NBX0NvcmVJRC5oCi0gKiBAYnJpZWYgIGRlZmluZXMgdGhlIHVuaXF1ZXMgY29tcG9uZW50IGlkZW50aWZpZXJzIHVzZWQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50Ci0gKiAgICAgICAgIGFuZCBvcHRpb25JRCBtZWNoYW5pc20KLSAqIEBub3RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNE9TQV9DT1JFSURfSF9fCi0jZGVmaW5lIF9fTTRPU0FfQ09SRUlEX0hfXwotCi0vKiBDb3JlSWQgYXJlIGRlZmluZWQgb24gMTQgYml0cyAqLwotLyogd2Ugc3RhcnQgZnJvbSAweDAxMDAsIGxvd2VyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIG9zYWwgY29yZSBjb21wb25lbnRzICovCi0KLS8qIHJlYWRlciBzaGVsbHMqLwotI2RlZmluZSBNNFJFQURFUl9DT01NT04gICAgIDB4MDEwMAotI2RlZmluZSBNNFJFQURFUl9BVkkgICAgICAgIDB4MDEwMQotI2RlZmluZSBNNFJFQURFUl9BTVIgICAgICAgIDB4MDEwMgotI2RlZmluZSBNNFJFQURFUl8zR1AgICAgICAgIDB4MDEwMwotI2RlZmluZSBNNFJFQURFUl9ORVQgICAgICAgIDB4MDEwNAotI2RlZmluZSBNNFJFQURFUl8zR1BfSFRUUCAgIDB4MDEwNQotI2RlZmluZSBNNFJFQURFUl9NUDMgICAgICAgIDB4MDEwNgotI2RlZmluZSBNNFJFQURFUl9XQVYgICAgICAgIDB4MDEwNwotI2RlZmluZSBNNFJFQURFUl9NSURJICAgICAgIDB4MDEwOAotI2RlZmluZSBNNFJFQURFUl9BU0YgICAgICAgIDB4MDEwOQotI2RlZmluZSBNNFJFQURFUl9SRUFMICAgICAgICAweDAxMEEKLSNkZWZpbmUgTTRSRUFERVJfQUFDICAgICAgICAweDAxMEIKLSNkZWZpbmUgTTRSRUFERVJfRkxFWCAgICAgICAgMHgwMTBDCi0jZGVmaW5lIE00UkVBREVSX0JCQSAgICAgICAgMHgwMTBECi0jZGVmaW5lIE00UkVBREVSX1NZTlRIRVNJU19BVURJTyAgICAweDAxMEUKLSNkZWZpbmUgTTRSRUFERVJfSlBFRyAgICAgICAgMHgwMTBGCi0KLQotLyogd3JpdGVyIHNoZWxscyovCi0jZGVmaW5lIE00V1JJVEVSX0NPTU1PTiAgICAgMHgwMTEwCi0jZGVmaW5lIE00V1JJVEVSX0FWSSAgICAgICAgMHgwMTExCi0jZGVmaW5lIE00V1JJVEVSX0FNUiAgICAgICAgMHgwMTEyCi0jZGVmaW5lIE00V1JJVEVSXzNHUCAgICAgICAgMHgwMTEzCi0jZGVmaW5lIE00V1JJVEVSX0pQRUcgICAgICAgIDB4MDExNgotI2RlZmluZSBNNFdSSVRFUl9NUDMgICAgICAgIDB4MDExNwotCi0vKiBkZWNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNERFQ09ERVJfQ09NTU9OICAgIDB4MDEyMAotI2RlZmluZSBNNERFQ09ERVJfSlBFRyAgICAgIDB4MDEyMQotI2RlZmluZSBNNERFQ09ERVJfTVBFRzQgICAgIDB4MDEyMgotI2RlZmluZSBNNERFQ09ERVJfQVVESU8gICAgIDB4MDEyMwotI2RlZmluZSBNNERFQ09ERVJfQVZDICAgICAgIDB4MDEyNAotI2RlZmluZSBNNERFQ09ERVJfTUlESSAgICAgIDB4MDEyNQotI2RlZmluZSBNNERFQ09ERVJfV01BICAgICAgICAweDAxMjYKLSNkZWZpbmUgTTRERUNPREVSX1dNViAgICAgICAgMHgwMTI3Ci0jZGVmaW5lIE00REVDT0RFUl9STVYgICAgICAgIDB4MDEyOAotI2RlZmluZSBNNERFQ09ERVJfUk1BICAgICAgICAweDAxMjkKLSNkZWZpbmUgTTRERUNPREVSX0FBQyAgICAgICAweDAxMkEKLSNkZWZpbmUgTTRERUNPREVSX0JFQVRCUkVXICAweDAxMkIKLSNkZWZpbmUgTTRERUNPREVSX0VYVEVSTkFMICAweDAxMkMKLQotLyogZW5jb2RlciBzaGVsbHMgKi8KLSNkZWZpbmUgTTRFTkNPREVSX0NPTU1PTiAgICAweDAxMzAKLSNkZWZpbmUgTTRFTkNPREVSX0pQRUcgICAgICAweDAxMzEKLSNkZWZpbmUgTTRFTkNPREVSX01QRUc0ICAgICAweDAxMzIKLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPICAgICAweDAxMzMKLSNkZWZpbmUgTTRFTkNPREVSX1ZJRF9OVUxMICAweDAxMzQKLSNkZWZpbmUgTTRFTkNPREVSX01KUEVHICAgICAgICAweDAxMzUKLSNkZWZpbmUgTTRFTkNPREVSX01QMyAgICAgICAgMHgwMTM2Ci0jZGVmaW5lIE00RU5DT0RFUl9IMjY0ICAgICAgICAweDAxMzcKLSNkZWZpbmUgTTRFTkNPREVSX0FBQyAgICAgICAgMHgwMTM4Ci0jZGVmaW5lIE00RU5DT0RFUl9BTVJOQiAgICAgICAgMHgwMTM5Ci0jZGVmaW5lIE00RU5DT0RFUl9BVURfTlVMTCAgMHgwMTNBCi0jZGVmaW5lIE00RU5DT0RFUl9FWFRFUk5BTCAgMHgwMTNCCi0KLS8qIGNvcmVzICovCi0jZGVmaW5lIE00SlBHX0RFQ09ERVIgICAgICAgMHgwMTQwCi0jZGVmaW5lIE00SlBHX0VOQ09ERVIgICAgICAgMHgwMTQxCi0KLSNkZWZpbmUgTTRNUDRfREVDT0RFUiAgICAgICAweDAxNDIKLSNkZWZpbmUgTTRNUDRfRU5DT0RFUiAgICAgICAweDAxNDMKLQotI2RlZmluZSBNNEFWSV9DT01NT04gICAgICAgIDB4MDE0NAotI2RlZmluZSBNNEFWSV9SRUFERVIgICAgICAgIDB4MDE0NQotI2RlZmluZSBNNEFWSV9XUklURVIgICAgICAgIDB4MDE0NgotCi0jZGVmaW5lIE00SFRUUF9FTkdJTkUgICAgICAgMHgwMTQ3Ci0KLSNkZWZpbmUgTTRPU0FfVE1QRklMRSAgICAgICAweDAxNDgKLSNkZWZpbmUgTTRUT09MX1RJTUVSICAgICAgICAweDAxNDkKLQotI2RlZmluZSBNNEFNUl9SRUFERVIgICAgICAgIDB4MDE0QQotCi0jZGVmaW5lIE00TVAzX1JFQURFUiAgICAgICAgMHgwMTRCCi0KLSNkZWZpbmUgTTRXQVZfUkVBREVSICAgICAgICAweDAxNEMKLSNkZWZpbmUgTTRXQVZfV1JJVEVSICAgICAgICAweDAxNEQKLSNkZWZpbmUgTTRXQVZfQ09NTU9OICAgICAgICAweDAxNEUKLQotI2RlZmluZSBNNEFEVFNfUkVBREVSICAgICAgICAweDAxNEYKLSNkZWZpbmUgTTRBRElGX1JFQURFUiAgICAgICAgMHgwMTZBCi0KLSNkZWZpbmUgTTRTUFMgICAgICAgICAgICAgICAweDAxNTAKLSNkZWZpbmUgTTRFWElGX0RFQ09ERVIgICAgICAweDAxNTEKLSNkZWZpbmUgTTRFWElGX0VOQ09ERVIgICAgICAweDAxNTIKLSNkZWZpbmUgTTRHSUZfREVDT0RFUiAgICAgICAweDAxNTMKLSNkZWZpbmUgTTRHSUZfRU5DT0RFUiAgICAgICAweDAxNTQKLSNkZWZpbmUgTTRQTkdfREVDT0RFUiAgICAgICAweDAxNTUKLSNkZWZpbmUgTTRQTkdfRU5DT0RFUiAgICAgICAweDAxNTYKLSNkZWZpbmUgTTRXQk1QX0RFQ09ERVIgICAgICAweDAxNTcKLSNkZWZpbmUgTTRXQk1QX0VOQ09ERVIgICAgICAweDAxNTgKLQotI2RlZmluZSBNNEFNUl9XUklURVIgICAgICAgIDB4MDE1OSAgICAvKio8IG5vIHJvb20gdG8gcHV0IGl0IGFsb25nIE00QU1SX1JFQURFUiAqLwotCi0KLSNkZWZpbmUgTTRBVkNfREVDT0RFUiAgICAgICAweDAxNUEKLSNkZWZpbmUgTTRBVkNfRU5DT0RFUiAgICAgICAweDAxNUIKLQotI2RlZmluZSBNNEFTRl9SRUFERVIgICAgICAgIDB4MDE1QwotI2RlZmluZSBNNFdNRFJNX0FHRU5UICAgICAgICAweDAxNUQKLSNkZWZpbmUgTTRNSURJX1JFQURFUiAgICAgICAgMHgwMTYyICAgIC8qKjwgbm8gcm9vbSBiZWZvcmUgdGhlIHByZXNlbnRlcnMgKi8KLSNkZWZpbmUgTTRSTV9SRUFERVIgICAgICAgICAweDE2MwotI2RlZmluZSBNNFJNVl9ERUNPREVSICAgICAgICAweDE2NAotI2RlZmluZSBNNFJNQV9ERUNPREVSICAgICAgICAweDE2NQotCi0jZGVmaW5lIE00VE9PTF9YTUwgICAgICAgICAgICAweDAxNjYKLSNkZWZpbmUgTTRUT09MX0VGUiAgICAgICAgICAgIDB4MDE2NyAgICAvKio8IERlY3J5cHRpb24gbW9kdWxlIGZvciBWaWRlbyBBcnRpc3QgKi8KLSNkZWZpbmUgTTRJQUxfRlROICAgICAgICAgICAgMHgwMTY4ICAgIC8qIEZUTiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUFMICovCi0jZGVmaW5lIE00RlROICAgICAgICAgICAgICAgIDB4MDE2OSAgICAvKiBGVE4gbGlicmFyeSAqLwotCi0vKiBwcmVzZW50ZXIgKi8KLSNkZWZpbmUgTTRQUkVTRU5URVJfQVVESU8gICAweDAxNjAKLSNkZWZpbmUgTTRQUkVTRU5URVJfVklERU8gICAweDAxNjEKLQotLyogaGlnaCBsZXZlbCBpbnRlcmZhY2VzICh2cHMsIGV0Yy4uKSovCi0jZGVmaW5lIE00VlBTICAgICAgICAgICAgICAgMHgwMTcwCi0jZGVmaW5lIE00VlRTICAgICAgICAgICAgICAgMHgwMTcxCi0jZGVmaW5lIE00VlhTICAgICAgICAgICAgICAgMHgwMTcyCi0jZGVmaW5lIE00Q0FMTEJBQ0sgICAgICAgICAgMHgwMTczCi0jZGVmaW5lIE00VkVTICAgICAgICAgICAgICAgMHgwMTc0Ci0jZGVmaW5lIE00UFJFUFJPQ0VTU19WSURFTyAgMHgwMTc1Ci0jZGVmaW5lIE00R1JBQl9BVURJTyAgICAgICAgMHgwMTc2Ci0jZGVmaW5lIE00R1JBQl9WSURFTyAgICAgICAgMHgwMTc3Ci0jZGVmaW5lIE00VlNTQVZJICAgICAgICAgICAgMHgwMTc4Ci0jZGVmaW5lIE00VlNTM0dQUCAgICAgICAgICAgMHgwMTc5Ci0jZGVmaW5lIE00UFRPM0dQUCAgICAgICAgICAgMHgwMTdBCi0jZGVmaW5lIE00UFZYX1BBUlNFUiAgICAgICAgMHgwMTdCCi0jZGVmaW5lIE00VkNTICAgICAgICAgICAgICAgIDB4MDE3QwotI2RlZmluZSBNNE1DUyAgICAgICAgICAgICAgICAweDAxN0QKLSNkZWZpbmUgTTRNTk1DICAgICAgICAgICAgICAgIDB4MDE4MCAgICAvKio8IG1ubSBjb250cm9sbGVyICovCi0jZGVmaW5lIE00VFRFWFRfUEFSU0VSICAgICAgMHgwMTgxICAgIC8qKjwgdGltZWQgdGV4dCAqLwotI2RlZmluZSBNNE1NICAgICAgICAgICAgICAgIDB4MDE4MiAgICAvKio8IE11c2ljIG1hbmFnZXIgKi8KLSNkZWZpbmUgTTRNRFAgICAgICAgICAgICAgICAgMHgwMTgzICAgIC8qKjwgTWV0YWRhdGEgcGFyc2VyICovCi0jZGVmaW5lIE00TU1TUUxDT1JFICAgICAgICAgICAgMHgwMTg0Ci0jZGVmaW5lIE00VlBTSUwgICAgICAgICAgICAgICAgMHgwMTg1Ci0jZGVmaW5lIE00RklMRUlMICAgICAgICAgICAgMHgwMTg2IC8qIElMIGZpbGUgSW50ZXJmYWNlICovCi0jZGVmaW5lIE00TVUgICAgICAgICAgICAgICAgMHgwMTg3Ci0jZGVmaW5lIE00VkVFICAgICAgICAgICAgICAgIDB4MDE4OCAgLyoqPCBWaWRlbyBlZmZlY3QgZW5naW5lICovCi0jZGVmaW5lIE00VkEgICAgICAgICAgICAgICAgMHgwMTg5IC8qIFZpZGVvQXJ0aXN0ICovCi0jZGVmaW5lIE00SlRTICAgICAgICAgICAgICAgIDB4MDE4QQotI2RlZmluZSBNNEpUU0lMICAgICAgICAgICAgICAgIDB4MDE4QgotI2RlZmluZSBNNEFJUiAgICAgICAgICAgICAgICAweDAxOEMgIC8qKjwgQUlSICovCi0jZGVmaW5lIE00U1BFICAgICAgICAgICAgICAgIDB4MDE4RCAgLyoqPCBTdGlsbCBwaWN0dXJlIGVkaXRvciAqLwotI2RlZmluZSBNNFZTICAgICAgICAgICAgICAgIDB4MDE4RSAgICAvKio8IFZpZGVvIFN0dWRpbyAoeFZTUykgKi8KLSNkZWZpbmUgTTRWRVNJTCAgICAgICAgICAgICAgICAweDAxOEYgICAgLyoqPCBWRVMgaWwgKi8KLSNkZWZpbmUgTTRJRDMgICAgICAgICAgICAgICAgMHgwMTkwICAgIC8qKjwgSUQzIFRhZyBNb2R1bGUgKi8KLSNkZWZpbmUgTTRTQyAgICAgICAgICAgICAgICAweDAxOTEgICAgLyoqPCBNZWRpYSBTY2FubmVyICovCi0jZGVmaW5lIE00VEcgICAgICAgICAgICAgICAgMHgwMTkyICAvKio8IFRodW1ibmFpbCBHZW5lcmF0b3IqLwotI2RlZmluZSBNNFRTICAgICAgICAgICAgICAgIDB4MDE5MyAgICAvKio8IFRodW1ibmFpbCBzdG9yYWdlICovCi0jZGVmaW5lIE00TUIgICAgICAgICAgICAgICAgMHgwMTk0ICAgIC8qKjwgTWVkaWEgYnJvd3NlciAqLwotCi0vKiBoaWdoIGxldmVsIGFwcGxpY2F0aW9uICh0ZXN0IG9yIGNsaWVudCBhcHApICovCi0jZGVmaW5lIE00QVBQTEkgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIE00VkFfQVBQTEkgICAgICAgICAgICAweDAyMDEgICAgLyoqPCBWaWRlbyBBcnRpc3QgdGVzdCBhcHBsaWNhdGlvbiAqLwotCi0vKiBleHRlcm5hbCBjb21wb25lbnRzIChIVyB2aWRlbyBjb2RlY3MsIGV0Yy4pICovCi0jZGVmaW5lIE00VkRfRVhURVJOQUwgICAgICAgIDB4MDMwMAotI2RlZmluZSBNNFZFX0VYVEVSTkFMICAgICAgICAweDAzMDEKLQotCi0vKiBwcmlvcml0eSB0byBjb21iaW5lIHdpdGggbW9kdWxlIGlkcyAqLwotI2RlZmluZSBNNEhJR0hfUFJJT1JJVFkgICAgIDB4QzAwMAotI2RlZmluZSBNNE1FRElVTV9QUklPUklUWSAgIDB4ODAwMAotI2RlZmluZSBNNExPV19QUklPUklUWSAgICAgIDB4NDAwMAotI2RlZmluZSBNNERFRkFVTFRfUFJJT1JJVFkgIDB4MDAwMAotCi0KLSNlbmRpZiAvKl9fTTRPU0FfQ09SRUlEX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UENNUl9Db3JlUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFBDTVJfQ29yZVJlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YWZjNTBjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UENNUl9Db3JlUmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00V0FWX1dhdlJlYWRlci5oCi0gKiBAYnJpZWYgICBXQVYgUmVhZGVyIGRlY2xhcmF0aW9ucwotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIG9mIHRoZSBXQVYgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0KLSNkZWZpbmUgTTRQQ01DX0VSUl9QQ01fTk9UX0NPTVBMSUFOVCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRXQVZfQ09NTU9OLDB4MDAwMDAxKQotI2RlZmluZSBNNFBDTUNfRVJSX1BDTV9OT19TUEFDRV9BVkFJTCAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdBVl9DT01NT04sMHgwMDAwMDIpCi0jZGVmaW5lIE00UENNQ19FUlJfUENNX05PVF9TVVBQT1JURUQgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00V0FWX0NPTU1PTiwweDAwMDAwMykKLQotI2RlZmluZSBNNFBDTUNfV0FSX0VORF9PRl9TVFJFQU0gICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFdBVl9DT01NT04gLDB4MDAwMDAxKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFdBVkNfRGVjb2RlclNwZWNpZmljSW5mbwotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGRlY29kZXIgU3BlY2lmaWMgaW5mb3JtYXRpb25zCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgV0FWIHJlYWRlciB0byBzdG9yZSBhbGwKLSAqICAgICAgICAgICAgICBkZWNvZGVyIHNwZWNpZmljIGluZm9ybWF0aW9uczoKLSAqICAgICAgICAgICAgICAtIFNhbXBsZSBGcmVxdWVuY3kKLSAqICAgICAgICAgICAgICAtIEF2ZXJhZ2UgQnl0ZXMgcGVyIHNlY29uZAotICogICAgICAgICAgICAgIC0gTnVtYmVyIG9mIGNoYW5uZWxzICgxIG9yIDIpCi0gKiAgICAgICAgICAgICAgLSBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlICg4IG9yIDE2KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MzIgICAgU2FtcGxlRnJlcXVlbmN5OwotICAgIE00T1NBX1VJbnQzMiAgICBBdmdCeXRlc1BlclNlYzsKLSAgICBNNE9TQV9VSW50MzIgICAgRGF0YUxlbmd0aDsKLSAgICBNNE9TQV9VSW50MTYgICAgbmJDaGFubmVsczsKLSAgICBNNE9TQV9VSW50MTYgICAgQml0c1BlclNhbXBsZTsKLX0gTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm87Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRXQVZSX1N0YXRlCi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgV0FWIFJlYWRlciBTdGF0ZXMKLSAqIEBub3RlICAgIFRoZSBzdGF0ZSBhdXRvbWF0b24gaXMgZG9jdW1lbnRlZCBzZXBhcmF0ZWx5Ci0gKiAgICAgICAgICBjb25zdWx0IHRoZSBkZXNpZ24gc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRQQ01SX2tJbml0ICAgID0gMHgwMDAwLAotICAgIE00UENNUl9rT3BlbmluZyA9IDB4MDEwMCwKLSAgICBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkID0gMHgwMTAxLAotICAgIE00UENNUl9rUmVhZGluZyA9IDB4MDIwMCwKLSAgICBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVICA9IDB4MDIwMSwKLSAgICBNNFBDTVJfa0Nsb3NlZCAgPSAweDAzMDAKLX0gTTRQQ01SX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00V0FWUl9PcHRpb25JRAotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIFdBViBSZWFkZXIgb3B0aW9ucwotICogQG5vdGUgICAgT25seSBvbmUgb3B0aW9uIGlzIGF2YWlsYWJsZToKLSAqICAgICAgICAgIC0gTTRXQVZSX2tQQ01ibG9ja1NpemU6IHNldHMgdGhlIHNpemUgb2YgdGhlIFBDTSBibG9jayB0byByZWFkCi0gKiAgICAgICAgICAgIGZyb20gV0FWIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00UENNUl9rUENNYmxvY2tTaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFdBVl9SRUFERVIsIDB4MDEpCi19IE00UENNUl9PcHRpb25JRDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRXQVZSX0NvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBXQVYgUmVhZGVyIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgV0FWIFJlYWRlciBjYWxscyB0byBzdG9yZQotICogICAgICAgICAgICAgIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX01lbUFkZHIzMiAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY0luZm87LyoqPCBQb2ludGVyIHRvIHRoZSBkZWNvZGVyIHNwZWNpZmljIGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGNvbnRhaW5lZCBpbiBwU3RyZWFtRGVzYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB1c2VkIHRvIGZyZWUuLi4pICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgIG1fcEZpbGVSZWFkRnVuYzsvKio8IFRoZSBPU0FMIHNldCBvZiBwb2ludGVyIHRvIGZ1bmN0aW9uIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBtYW5hZ2VtZW50ICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgIG1fZmlsZUNvbnRleHQ7ICAvKio8IFRoZSBjb250ZXh0IG5lZWRlZCBieSBPU0FMIHRvIG1hbmFnZSBGaWxlICovCi0gICAgTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8gIG1fZGVjb2RlckNvbmZpZzsvKio8IFNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIGRlY29kZXIgKi8KLSAgICBNNFBDTVJfU3RhdGUgICAgICAgICAgICAgICAgbV9zdGF0ZTsgICAgICAgIC8qKjwgc3RhdGUgb2YgdGhlIHdhdiByZWFkZXIgKi8KLSAgICBNNFBDTVJfU3RhdGUgICAgICAgICAgICAgICAgbV9taWNyb1N0YXRlOyAgIC8qKjwgc3RhdGUgb2YgdGhlIHJlYWQgd2F2IHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX2Jsb2NrU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSByZWFkIGJsb2NrICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fb2Zmc2V0OyAgICAgICAvKio8IE9mZnNldCBvZiB0aGUgUENNIHJlYWQgKGkuZSBtX29mZnNldCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB3aXRob3V0IHdhdiBoZWFkZXIpICovCi0gICAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgIG1fcEF1QnVmZmVyOyAgICAvKio8IFJlLXVzZWQgYnVmZmVyIGZvciBBVSBjb250ZW50IHN0b3JhZ2UgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICAgbV9kYXRhU3RhcnRPZmZzZXQ7LyoqPCBvZmZzZXQgb2YgdGhlIHBjbSBkYXRhIGJlZ2lubmluZyBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSAqLwotfSBNNFBDTVJfQ29udGV4dDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUHJvdG90eXBlcyBvZiBhbGwgV0FWIHJlYWRlciBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UENNUl9vcGVuUmVhZChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKTsKLU00T1NBX0VSUiBNNFBDTVJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYyk7Ci1NNE9TQV9FUlIgTTRQQ01SX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzKTsKLU00T1NBX0VSUiBNNFBDTVJfbmV4dEFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci1NNE9TQV9FUlIgTTRQQ01SX2ZyZWVBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotTTRPU0FfRVJSIE00UENNUl9zZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlIHNlZWtBY2Nlc3NNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKTsKLU00T1NBX0VSUiBNNFBDTVJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRQQ01SX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBWYWx1ZSk7Ci1NNE9TQV9FUlIgTTRQQ01SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gVmFsdWUpOwotTTRPU0FfRVJSIE00UENNUl9nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbik7CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl8zZ3BDb20uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSXzNncENvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmE1YTAzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSXzNncENvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFJFQURFUl8zZ3BDb20uaAotICogQGJyaWVmICAgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSAzZ3AgcmVhZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgICAgb2YgdGhlIDNHUCByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNFJFQURFUl8zR1BDT01fSF9fCi0jZGVmaW5lIF9fTTRSRUFERVJfM0dQQ09NX0hfXwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogRXJyb3I6IEZ1bmN0aW9uIE00UkVBREVSX0NvbTNHUF9nZXROZXh0U3RyZWFtSGFuZGxlciBtdXN0IGJlIGNhbGxlZCBiZWZvcmUuCi0gKi8KLSNkZWZpbmUgTTRFUlJfTk9fVklERU9fU1RSRUFNX1JFVFJJRVZFRF9ZRVQgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl8zR1AsIDB4MDAwMDAxKQotCi0vKioKLSAqIEVycm9yOiBObyB2aWRlbyBzdHJlYW0gSDI2MyBpbiBmaWxlLgotICovCi0jZGVmaW5lIE00RVJSX1ZJREVPX05PVF9IMjYzICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRSRUFERVJfM0dQLCAweDAwMDAwMikKLQotLyoqCi0gKiBUaGVyZSBoYXMgYmVlbiBhIHByb2JsZW0gd2l0aCB0aGUgZGVjb2RlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLCBzZWVtcyB0byBiZSBpbnZhbGlkICovCi0jZGVmaW5lIE00RVJSX1JFQURFUjNHUF9ERUNPREVSX0NPTkZJR19FUlJPUiAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRSRUFERVJfM0dQLCAweDAwMDAwMykKLQotI2RlZmluZSBNNFJFQURFUl9DT00zR1BfTUFYVklERU9TVFJFQU0gIDUKLSNkZWZpbmUgTTRSRUFERVJfQ09NM0dQX01BWEFVRElPU1RSRUFNICA1Ci0jZGVmaW5lIE00UkVBREVSX0NPTTNHUF9NQVhURVhUU1RSRUFNICAgNQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgbV9wRkZDb250ZXh0OyAgICAvKio8IGNvcmUgZmlsZSBmb3JtYXQgY29udGV4dCAqLwotCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX0F1ZGlvU3RyZWFtc1tNNFJFQURFUl9DT00zR1BfTUFYQVVESU9TVFJFQU1dOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9wQXVkaW9TdHJlYW07ICAgIC8qKjwgcG9pbnRlciB0byB0aGUgY3VycmVudCBhbGxvY2F0ZWQgYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBoYW5kbGVyICovCi0KLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fVmlkZW9TdHJlYW1zW000UkVBREVSX0NPTTNHUF9NQVhWSURFT1NUUkVBTV07Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX3BWaWRlb1N0cmVhbTsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRlZCB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGhhbmRsZXIgKi8KLQotI2lmZGVmIE00VlBTX1NVUFBPUlRfVFRFWFQKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fVGV4dFN0cmVhbXNbTTRSRUFERVJfQ09NM0dQX01BWFRFWFRTVFJFQU1dOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9wVGV4dFN0cmVhbTsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaGFuZGxlciAqLwotI2VuZGlmIC8qTTRWUFNfU1VQUE9SVF9UVEVYVCovCi0KLX0gTTRSRUFERVJfQ29tM0dQX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIE00UkVBREVSXzNHUF9CdWZmZXIgKGJ1dCBub3RoaW5nIHNwZWNpZmljIHRvIDNHUCwgbm9yIHRvIGEgcmVhZGVyICEpCi0gKiBAYnJpZWYgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBidWZmZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBleGNoYW5nZSBkYXRhIChzaG91bGQgYmUgaW4gT1NBTCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICBzaXplOyAgICAgICAgICAgIC8qKjwgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgIGRhdGFBZGRyZXNzOyAgICAvKio8IHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgKi8KLX0gTTRSRUFERVJfM0dQX0J1ZmZlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFJFQURFUl8zR1BfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcmVhZGVyIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIDNHUCBmb3JtYXQuCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBhIDNHUCByZWFkZXIgdmlhIE00UkVBREVSXzNHUF9nZXRPcHRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBEZWNvZGVyQ29uZmlnSW5mbyBmb3IgSDI2MywKLSAgICAgKiBvcHRpb24gdmFsdWUgbXVzdCBiZSBhIHBvaW50ZXIgdG8gTTRSRUFERVJfM0dQX0gyNjNQcm9wZXJ0aWVzIGFsbG9jYXRlZCBieSBjYWxsZXIgKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0gyNjNQcm9wZXJ0aWVzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl8zR1AsIDB4MDEpLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBQdXJwbGUgTGFicyBkcm0gaW5mb3JtYXRpb24gKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1B1cnBsZUxhYnNEcm0gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSXzNHUCwgMHgwMiksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEZhc3Qgb3BlbiBtb2RlIChPbmx5IHRoZSBmaXJzdCBBVSBvZiBlYWNoIHN0cmVhbSB3aWxsIGJlIHBhcnNlZCAtPiBsZXNzIENQVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgUkFNKS4gKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSXzNHUCwgMHgwMyksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEF1ZGlvIG9ubHkgbW9kZSAodGhlIHZpZGVvIHN0cmVhbSB3b24ndCBiZSBvcGVuZWQpICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9BdWRpb09ubHkgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl8zR1AsIDB4MDQpLAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBWaWRlbyBvbmx5IG1vZGUgKHRoZSBhdWRpbyBzdHJlYW0gd29uJ3QgYmUgb3BlbmVkKSAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfVmlkZW9Pbmx5ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfM0dQLCAweDA1KSwKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmV4dCB2aWRlbyBDVFMgKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX2dldE5leHRWaWRlb0NUUyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfM0dQLCAweDA2KQotCi19IE00UkVBREVSXzNHUF9PcHRpb25JRDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMKLSAqIEBicmllZiAgICBDb250YWlucyBpbmZvIGFib3V0IEgyNjMgc3RyZWFtIHJlYWQgZnJvbSB0aGUgM0dQIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IHRoZSBwcm9maWxlIGFzIGRlZmluZWQgaW4gdGhlIFZpc3VhbCBPYmplY3QgU2VxdWVuY2UgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgTTRPU0FfVUludDggICAgICAgIHVpUHJvZmlsZTsKLSAgICAvKio8IHRoZSBsZXZlbCBhcyBkZWZpbmVkIGluIHRoZSBWaXN1YWwgT2JqZWN0IFNlcXVlbmNlIGhlYWRlciwgaWYgcHJlc2VudCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aUxldmVsOwotCi19IE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgM2dwIGZpbGUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAgKE9VVCkgICAgUG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoT1VUKSAgICBQb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgTm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0NvbTNHUF9nZXROZXh0U3RyZWFtSGFuZGxlcihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSAgYWNjZXNzIHVuaXQgKEFVKQotICogQG5vdGUgICAgQW4gQVUgaXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBkYXRhIHRvIGJlIGRlY29kZWQgYnkgYSBkZWNvZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgICAgIChJTi9PVVQpICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIGF1IHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBjcmVhdGlvbikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm5zICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQ29tM0dQX2ZpbGxBdVN0cnVjdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENsZWFucyB1cCB0aGUgc3RyZWFtIGhhbmRsZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgcmVhZGVyIHNoZWxsCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTi9PVVQpIFN0cmVhbSBoYW5kbGVyCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0NvbTNHUF9jbGVhblVwSGFuZGxlcihNNF9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlcik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000UkVBREVSXzNHUENPTV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQW1yLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9BbXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjZlN2Y5Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9BbXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfQW1yLmgKLSAqIEBicmllZiAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIGFtciByZWFkZXIKLSAqIEBub3RlICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBnZW5lcmljIHNoZWxsIGludGVyZmFjZSByZXRyaWV2aW5nIGZ1bmN0aW9uCi0gKiAgICAgICAgIG9mIHRoZSBBTVIgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000UkVBREVSX0FNUl9IX18KLSNkZWZpbmUgX19NNFJFQURFUl9BTVJfSF9fCi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSoKLSogQHBhcmFtIHBNZWRpYVR5cGUgICAgICAgICAgICAgOiBQb2ludGVyIG9uIGEgTTRSRUFERVJfTWVkaWFUeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0qIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSoKLSogQHJldHVybnMgOiBNNE5PX0VSUk9SICAgICBpZiBPSwotKiAgICAgICAgICAgICBFUlJfQUxMT0MgICAgICBpZiBhbiBhbGxvY2F0aW9uIGZhaWxlZAotKiAgICAgICAgICAgIEVSUl9QQVJBTUVURVIgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000UkVBREVSX0FNUl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9Db21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODYzYTdlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UkVBREVSX0NvbW1vbi5oCi0gKiBAYnJpZWYgIFNoZWxsIFJlYWRlciBjb21tb24gaW50ZXJmYWNlIGRlY2xhcmF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgY29tbW9uIGludGVyZmFjZXMgdGhhdCByZWFkZXIgc2hlbGxzIG11c3QgaW1wbGVtZW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNFJFQURFUl9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRSRUFERVJfQ09NTU9OX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRDb21tb25fdHlwZXMuaCIKLQotLyogRVJST1JTICovCi0jZGVmaW5lIE00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRSRUFERVJfQ09NTU9OLCAweDAwMDEpCi0KLS8qIFdBUk5JTkdTICovCi0jZGVmaW5lIE00V0FSX1JFQURFUl9OT19NRVRBREFUQSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRSRUFERVJfQ09NTU9OLCAweDAwMDEpCi0jZGVmaW5lIE00V0FSX1JFQURFUl9JTkZPUk1BVElPTl9OT1RfUFJFU0VOVCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRSRUFERVJfQ09NTU9OLCAweDAwMDIpCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgTWVkaWEgdHlwZXMgdXNlZCB0byBjcmVhdGUgbWVkaWEgcmVhZGVycwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlBTIHRvIGlkZW50aWZ5IGEgY3VycmVudGx5IHN1cHBvcnRlZAotICogICAgICAgICAgbWVkaWEgcmVhZGVyIGludGVyZmFjZS4gRWFjaCByZWFkZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIG9uZSBvZiB0aGlzIHR5cGUgYXNzb2NpYXRlZC4KLSAqICAgICAgICAgIFdoZW4gYSByZWFkZXIgaW5zdGFuY2UgaXMgbmVlZGVkLCB0aGlzIHR5cGUgaXMgdXNlZCB0byBpZGVudGlmeSBhbmQKLSAqICAgICAgICAgIGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UkVBREVSX2tNZWRpYVR5cGVVbmtub3duICAgICAgICA9IC0xLCAgICAvKio8IFVua25vd24gbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGUzR1BQICAgICAgICAgICAgPSAwLCAgICAvKio8IDNHUFAgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFWSSAgICAgICAgICAgID0gMSwgICAgLyoqPCBBVkkgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFNUiAgICAgICAgICAgID0gMiwgICAgLyoqPCBBTVIgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZU1QMyAgICAgICAgICAgID0gMywgICAgLyoqPCBNUDMgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVJUU1AgICAgICAgICAgICA9IDQsICAgIC8qKjwgUlRTUCBuZXR3b3JrIGFjY2Vzc2VkIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlM0dQUEhUVFAgICAgICAgID0gNSwgICAgLyoqPCBQcm9ncmVzc2l2ZWx5IGRvd25sb2FkZWQgM0dQUCBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUFZIVFRQICAgICAgICA9IDYsICAgIC8qKjwgUGFja2V0IFZpZGVvIEhUVFAgcHJvcHJpZXRhcnkgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVXQVYgICAgICAgICAgICA9IDcsICAgIC8qKjwgV0FWIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGUzR1BFWFRIVFRQICAgID0gOCwgICAgLyoqPCBBbiBleHRlcm5hbCBwcm9ncmVzc2l2ZWx5IGRvd25sb2FkZWQgM0dQUCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQUFDICAgICAgICAgICAgPSA5LCAgICAvKio8IEFEVFMgYW5kIEFESUYgQUFDIHN1cHBvcnQgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUkVBTCAgICAgICAgICAgID0gMTAsICAgIC8qKjwgUkVBTCBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFTRiAgICAgICAgICAgID0gMTEsICAgIC8qKjwgQVNGIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlRkxFWFRJTUUgICAgICAgID0gMTIsICAgIC8qKjwgRmxleFRpbWUgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVCQkEgICAgICAgICAgICA9IDEzLCAgICAvKio8IEJlYXRicmV3IGF1ZGlvIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlU1lOVEhBVURJTyAgICA9IDE0LCAgICAvKio8IFN5bnRoZXNpcyBhdWRpbyBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVBDTSAgICAgICAgICAgID0gMTUsICAgIC8qKjwgUENNIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlSlBFRyAgICAgICAgICAgID0gMTYsICAgIC8qKjwgSlBFRyBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUdJRiAgICAgICAgICAgID0gMTcsICAgIC8qKjwgR0lGIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQURJRiAgICAgICAgICAgID0gMTgsICAgIC8qKjwgQUFDLUFEVFMgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBRFRTICAgICAgICAgICAgPSAxOSwgICAgLyoqPCBBQUMtQURUUyBNZWRpYSB0eXBlICovCi0KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlX05CICAvKiBudW1iZXIgb2YgcmVhZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLQotfSBNNFJFQURFUl9NZWRpYVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgTWVkaWEgZmFtaWx5IG9mIGEgc3RyZWFtCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWUFMgdG8gaWRlbnRpZnkgd2hhdCBraW5kIG9mIHN0cmVhbQotICogICAgICAgICAgaGFzIGJlZW4gcmV0cmlldmVkIHZpYSBnZXROZXh0U3RyZWFtKCkgZnVuY3Rpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRSRUFERVJfa01lZGlhRmFtaWx5VW5rbm93biAgID0gLTEsCi0gICAgTTRSRUFERVJfa01lZGlhRmFtaWx5VmlkZW8gICAgID0gMCwKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyAgICAgPSAxLAotICAgIE00UkVBREVSX2tNZWRpYUZhbWlseVRleHQgICAgICA9IDIKLX0gTTRSRUFERVJfTWVkaWFGYW1pbHk7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00UkVBREVSX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIHJlYWRlciBvcHRpb25zCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gYSByZWFkZXIgdmlhIE00UkVBREVSX2dldE9wdGlvbl9mY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKioKLSAgICBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBtb3ZpZSAoaW4gbXMpCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMCksCi0KLSAgICAvKioKLSAgICBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcmVhZGVyCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbiAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMSksCi0KLSAgICAvKioKLSAgICBHZXQgdGhlIGNvcHlyaWdodCBmcm9tIHRoZSBtZWRpYSAoaWYgcHJlc2VudCkKLSAgICAoY3VycmVudGx5IGltcGxlbWVudGVkIGZvciAzR1BQIG9ubHk6IGNvcHlyaWdodCBnZXQgZnJvbSB0aGUgY3BydCBhdG9tIGluIHRoZSB1ZHRhIGlmIHByZXNlbnQpCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0PSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMiksCi0KLQotICAgIC8qKgotICAgIFNldCB0aGUgT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMgdG8gdGhlIHJlYWRlciAodHlwZSBvZiB2YWx1ZTogTTRPU0FfRmlsZVJlYWRQb2ludGVyKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMyksCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zIHRvIHRoZSByZWFkZXIgKHR5cGUgb2YgdmFsdWU6IE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlV3JpdGVyRmN0c1B0ciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgNCksCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zIHRvIHRoZSByZWFkZXIgKHR5cGUgb2YgdmFsdWU6IE00T1NBX05ldEZ1bmN0aW9uKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FOZXRGY3RzUHRyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDUpLAotCi0gICAgLyoqCi0gICAgQ3JlYXRpb24gdGltZSBpbiBzZWMuIHNpbmNlIG1pZG5pZ2h0LCBKYW4uIDEsIDE5NzAgKHR5cGUgb2YgdmFsdWU6IE00T1NBX1VJbnQzMiopCi0gICAgKGF2YWlsYWJsZSBvbmx5IGZvciAzR1BQIGNvbnRlbnQsIGluY2x1ZGluZyBQR0QpCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfQ3JlYXRpb25UaW1lID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDYpLAotCi0gICAgLyoqCi0gICAgQml0cmF0ZSBpbiBicHMgKHR5cGUgb2YgdmFsdWU6IE00T1NBX0RvdWJsZSopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCA3KSwKLQotICAgIC8qKgotICAgIFRhZyBJRDN2MSBvZiBNUDMgc291cmNlICh0eXBlIG9mIHZhbHVlOiBNNE1QM1JfSUQzVGFnKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCA4KSwKLQotICAgIC8qKgotICAgIFRhZyBJRDN2MiBvZiBNUDMgc291cmNlICh0eXBlIG9mIHZhbHVlOiBNNE1QM1JfSUQzVGFnKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCA5KSwKLQotICAgIC8qKgotICAgIE51bWJlciBvZiBBY2Nlc3MgVW5pdCBpbiB0aGUgQXVkaW8gc3RyZWFtICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9VSW50MzIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweEEpLAotCi0gICAgLyoqCi0gICAgTnVtYmVyIG9mIGZyYW1lcyBwZXIgYmxvYwotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE5iZnJhbWVQZXJCbG9jICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9DT01NT04sIDB4QiksCi0KLSAgICAvKioKLSAgICBGbGFnIGZvciBwcm90ZWN0aW9uIHByZXNlbmNlCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0UHJvdGVjdFByZXNlbmNlICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9DT01NT04sIDB4QyksCi0KLSAgICAvKioKLSAgICBTZXQgRFJNIENvbnRleHQKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXREUk1Db250ZXh0ICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4RCksCi0KLSAgICAvKioKLSAgICBHZXQgQVNGIENvbnRlbnQgRGVzY3JpcHRpb24gT2JqZWN0Ci0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfQ29udGVudERlc2NyaXB0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4RSksCi0KLSAgICAvKioKLSAgICBHZXQgQVNGIENvbnRlbnQgRGVzY3JpcHRpb24gT2JqZWN0Ci0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfRXh0ZW5kZWRDb250ZW50RGVzY3JpcHRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHhGKSwKLQotICAgIC8qKgotICAgIEdldCBBc3NldCAzZ3BwIEZpZWxkcwotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEXzNncEFzc2V0RmllbGRzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTApLAotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBtYXggbWV0YWRhdGEgc2l6ZSBzdXBwb3J0ZWQgaW4gdGhlIHJlYWRlcgotICAgIE9ubHkgcmVsZXZhbnQgaW4gM2dwIHBhcnNlciB0aWxsIG5vdywgYnV0IGNhbiBiZSB1c2VkIGZvciBvdGhlciByZWFkZXJzCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfTWF4TWV0YWRhdGFTaXplID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfQ09NTU9OLCAweDExKSwKLQotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDEyKSwKLSAgICAvKioKLSAgICBHZXQgM2dwcCAnZnR5cCcgYXRvbQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3ggID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTMpLAotCi0KLSAgICAvKiB2YWx1ZSBpcyBNNE9TQV9Cb29sKiAqLwotICAgIC8qIHJldHVybiB0aGUgZHJtIHByb3RlY3Rpb24gc3RhdHVzIG9mIHRoZSBmaWxlKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfaXNQcm90ZWN0ZWQgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxNCksCi0KLSAgICAvKiB2YWx1ZSBpcyBhIHZvaWQqICovCi0gICAgLyogcmV0dXJuIHRoZSBhZ2dyZWdhdGUgcmlnaHRzIG9mIHRoZSBmaWxlKi8KLSAgICAvKiBUaGUgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQgbXVzdCBiZSBiaWcgZW5vdWdoKi8KLSAgICAvKiBCeSBkZWZhdWx0LCB0aGUgc2l6ZSBmb3IgV01EUk0gaXMgNzYgYnl0ZXMgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfZ2V0QWdncmVnYXRlUmlnaHRzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTUpLAotICAgIC8qKgotICAgIEdldCBBU0YgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9FeHRlbmRlZENvbnRlbnRFbmNyeXB0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHgxNiksCi0KLSAgICAvKioKLSAgICBOdW1iZXIgb2YgQWNjZXNzIFVuaXQgaW4gdGhlIFZpZGVvIHN0cmVhbSAodHlwZSBvZiB2YWx1ZTogTTRPU0FfVUludDMyKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXROdW1iZXJPZlZpZGVvQXUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxNyksCi0KLSAgICAvKioKLSAgICBDaHVuayBtb2RlIGFjdGl2YXRpb24gIHNpemUgaW4gY2FzZSBvZiBKUEcgcmVhZGVyICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0pwZWdDaHVuY2tTaXplID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTgpLAotCi0gICAgLyoqCi0gICAgQ2hlY2sgaWYgQVNGIGZpbGUgY29udGFpbnMgdmlkZW8gKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfaGFzVmlkZW8gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxOSksCi0KLSAgICAvKioKLSAgICAgU2V0IHNwZWNpZmljIHJlYWQgbW9kZSBmb3IgUmFuZG9tIEFjY2VzcyBKUEVHICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0pwZWdSQU1vZGUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl9DT01NT04sIDB4MjApLAotCi0gICAgLyoqCi0gICAgR2V0IFRodW1ibmFpbCBidWZmZXIgaW4gY2FzZSBvZiBKUEcgcmVhZGVyICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0pwZWdUaHVtYm5haWwgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgyMSksCi0KLSAgICAvKioKLSAgICBHZXQgRlBEQVRBIGJ1ZmZlciBpbiBjYXNlIG9mIEpQRyByZWFkZXIgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ0ZQRGF0YSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDIyKSwKLQotICAgIC8qKgotICAgIEdldCBKUEVHIGluZm8gKHByb2dyZXNzaXZlLCBzdWJzYW1wbGluZykgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ0luZm89IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDIzKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLX0gTTRSRUFERVJfT3B0aW9uSUQ7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0NvcHlSaWdodAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgY29weVJpZ2h0IGRlc2NyaXB0aW9uCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgY29weVJpZ2h0IG9mIHRoZSBtZWRpYQotICogICAgICAgICAgICAgIChpZiBwcmVzZW50KSB2aWEgdGhlIGdldE9wdGlvbigpIGZ1bmN0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX0NvcHlSaWdodAotewotICAgIC8qKgotICAgIFBvaW50ZXIgdG8gY29weXJpZ2h0IGRhdGEgKGFsbG9jYXRlZCBieSB1c2VyKQotICAgICovCi0gICAgTTRPU0FfVUludDgqICAgbV9wQ29weVJpZ2h0OwotCi0gICAgLyoqCi0gICAgUG9pbnRlciB0byBjb3B5cmlnaHQgc2l6ZS4gVGhlIHBDb3B5UmlnaHRTaXplIG11c3QKLSAgICBiZSBJbml0aWFsaXplZCB3aXRoIHRoZSBzaXplIGF2YWlsYWJsZSBpbiB0aGUgcENvcHlSaWdodCBidWZmZXIKLSAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlDb3B5UmlnaHRTaXplOwotCi19IE00UkVBREVSX0NvcHlSaWdodDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX1N0cmVhbURhdGFPcHRpb24KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGdlbmVyaWMgc3RyZWFtIGRhdGEgb3B0aW9uCi0gKiBAbm90ZSAgICAgICAgSXQgaXMgdXNlZCBpcyB1c2VkIHRvIHNldCBvciBnZXQgYSBzdHJlYW0gc3BlY2lmaWMgZGF0YSBkZWZpbmVkCi0gKiAgICAgICAgICAgICAgYnkgYSByZWxldmFudCByZWFkZXIgb3B0aW9uIElELgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9TdHJlYW1EYXRhT3B0aW9uCi17Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgIG1fcFN0cmVhbUhhbmRsZXI7IC8qKjwgaWRlbnRpZmllciBvZiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgIG1fcE9wdGlvblZhbHVlOyAgIC8qKjwgdmFsdWUgb2YgdGhlIGRhdGEgb3B0aW9uIHRvIGdldCBvciB0byBzZXQgKi8KLQotfSBNNFJFQURFUl9TdHJlYW1EYXRhT3B0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00X0VuY29kaW5nRm9ybWF0Ci0gKiBAYnJpZWYgICAgICAgIFRleHQgZW5jb2RpbmcgZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLy8gdHlwZWRlZiBlbnVtCi0vLyB7Ci0vLyAgICAgTTRfa0VuY0Zvcm1hdFVua25vd24gICAgPSAwLCAgICAvKio8IFVua25vd24gZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8vICAgICBNNF9rRW5jRm9ybWF0QVNDSUkgICAgICAgID0gMSwgIC8qKjwgSVNPLTg4NTktMS4gVGVybWluYXRlZCB3aXRoICQwMCAgICAgICAgICAgICAgICAgICAqLwotLy8gICAgIE00X2tFbmNGb3JtYXRVVEY4ICAgICAgICA9IDIsICAgLyoqPCBVVEYtOCBlbmNvZGVkIFVuaWNvZGUgLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICAgICovCi0vLyAgICAgTTRfa0VuY0Zvcm1hdFVURjE2ICAgICAgICA9IDMgICAvKio8IFVURi0xNiBlbmNvZGVkIFVuaWNvZGUuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgMDAgICAgKi8KLS8qfSAgTTRfRW5jb2RpbmdGb3JtYXQ7Ki8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfU3RyaW5nQXR0cmlidXRlcwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHN0cmluZyBhdHRyaWJ1dGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vLyB0eXBlZGVmIHN0cnVjdAotLy8gewotLy8gICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgbV9wU3RyaW5nOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0ZXh0ICAgICAgICAqLwotLy8gICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV91aVNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRleHQgICAgICAgICAgICAqLwotLy8gICAgIE00X0VuY29kaW5nRm9ybWF0ICAgIG1fRW5jb2RpbmdGb3JtYXQ7ICAgIC8qKjwgVGV4dCBlbmNvZGluZyBmb3JtYXQgICAgKi8KLS8vIH0gTTRfU3RyaW5nQXR0cmlidXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9CdWZmZXIKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGJ1ZmZlciBpbiBhbGwgcmVhZGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDgqICAgbV9wRGF0YTsKLSAgICBNNE9TQV9VSW50MzIgICBtX3VpQnVmZmVyU2l6ZTsKLX0gTTRSRUFERVJfQnVmZmVyOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpU2Vzc2lvbklkOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlNZWRpYUlkOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlOYkluc3RhbmNlOwotICAgIE00T1NBX0NoYXIqKiAgICAgICAgICAgIG1fcEluc3RhbmNlOwotfSBNNF9TZHBBc3NldEluc3RhbmNlOwotLyoKLXR5cGVkZWYgZW51bQotewotICAgICBNNFJFQURFUl9rVW5rbm93bkZvcm1hdCAgICA9IDAsCi0gICAgIE00UkVBREVSX2tUYWdJRDNWMSwKLSAgICAgTTRSRUFERVJfa1RhZ0lEM1YyLAotICAgIE00UkVBREVSX2tBU0ZDb250ZW50RGVzYywKLSAgICBNNFJFQURFUl9rM0dwcEFzc2V0Qm94RnJvbVVEVEEsCi0gICAgTTRSRUFERVJfazNHcHBBc3NldEJveEZyb21TRFAsCi0gICAgTTRSRUFERVJfa0pwZWdFeGlmCi19IE00UkVBREVSX01ldGFEYXRhVHlwZTsqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00XzNncEFzc2V0RmllbGRzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZmllbGRzIG9mIGEgM2dwcCBhc3NldCBpbmZvcm1hdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRDT01NT05fTWV0YURhdGFGaWVsZHMgICAgbV9tZXRhZGF0YTsKLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlTZXNzaW9uSUQ7ICAgIC8qIEZvciBTRFAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpTWVkaWFJRDsgICAgLyogRm9yIFNEUCAqLwotCi0KLSAgICAvKiBOb3RlOiBUaGUgdHdvIGZvbGxvd2luZyBmaWVsZHMgd2VyZSBhZGRlZCBmb3IgaW50ZXJuYWwgdXNlCi0gICAgICAgIChGb3IgTXVzaWMgbWFuYWdlciBwcm9qZWN0Li4pICEhICovCi0gICAgTTRfU3RyZWFtVHlwZSAgICAgICBtX1ZpZGVvU3RyZWFtVHlwZTsgICAgLyoqPCBWaWRlbyBzdHJlYW0gdHlwZSAqLwotICAgIE00X1N0cmVhbVR5cGUgICAgICAgbV9BdWRpb1N0cmVhbVR5cGU7ICAgIC8qKjwgQXVkaW8gc3RyZWFtIHR5cGUgKi8KLQotfSBNNF9NZXRhRGF0YUZpZWxkczsKLQotCi0jZGVmaW5lIE00X01FVEFEQVRBX1NUUl9OQiAgICAyMiAvKiBvbmUgc3RyaW5nIGluIGFsYnVtIGFydCBzdHJ1Y3R1cmUqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlOYkJ1ZmZlcjsKLSAgICBNNF9TZHBBc3NldEluc3RhbmNlKiAgICBtX3BBc3NldEluZm9JbnN0OyAgICAvKiBTZXQgb2YgM2dwcCBhc3NldCBib3hlcyAqLwotICAgIE00Q09NTU9OX01ldGFEYXRhQWxidW1BcnQgICAgICAgIG1fYWxidW1BcnQ7ICAgICAgICAgICAgLyogUkM6IFBWIHNwZWNpZmljIGFsYnVtIGFydDphZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSBiZWNhdXNlIHRoaXMgdHlwZSBpcyB1c2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBiZWxvdyBpbiBzdHJlYW1pbmcgKi8KLQotfSBNNFJFQURFUl9uZXRJbmZvczsKLQotCi10eXBlZGVmIHVuaW9uCi17Ci0gICAgTTRSRUFERVJfQnVmZmVyICAgICAgICBtX3BUYWdJRDNCdWZmZXJbMl07ICAgICAgICAvKiBUYWcgSUQzIFYxLCBWMiAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgICAgTTRSRUFERVJfQnVmZmVyICAgICAgICBtX3BBc2ZEZXNjQ29udGVudDsgICAgLyogQVNGIGRlc2NyaXB0aW9uIGNvbnRlbnQgYnVmZmVyICovCi0gICAgICAgIE00UkVBREVSX0J1ZmZlciAgICAgICAgbV9wQXNmRXh0RGVzY0NvbnRlbnQ7IC8qIEFTRiBleHRlbmRlZCBkZXNjcmlwdGlvbiBjb250ZW50IGJ1ZmZlciAqLwotICAgIH0gbV9hc2Y7Ci0gICAgTTRfTWV0YURhdGFGaWVsZHMgICAgbV9wTWV0YWRhdGFGaWVsZHM7ICAgICAgLyogQWxyZWFkeSBwYXJzZWQgYW5kIGZpbGxlZCAzZ3BwIGFzc2V0IGZpZWxkcyAqLwotICAgIE00UkVBREVSX25ldEluZm9zICAgIG1fcEFzc2V0SW5mb0luc3RhbmNlOyAgIC8qIFNldCBvZiAzZ3BwIGFzc2V0IGJveGVzIGluIHRoZSBzZHAgZmlsZSAqLwotCi19IE00X01ldGFkYXRhQnVmZmVyOwotCi0KLQotCi0vKioqKioqKioqKiogUkVBREVSIEdMT0JBTCBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgY3JlYXRlIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfY3JlYXRlX2ZjdCkgICAgICAgICAgKE00T1NBX0NvbnRleHQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgYWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2Rlc3Ryb3lfZmN0KSAgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIG9wZW4gdGhlIHJlYWRlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNyZWF0ZWQgaW5zdGFuY2UKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24sIGZvciB0aGUgbmV0d29yayByZWFkZXIsIHNlbmRzIHRoZSBERVNDUklCRQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3I6ICAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nIHRoZSBtZWRpYSB0byBvcGVuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX29wZW5fZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfY2xvc2VfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCB0aGUgbmV4dCBzdHJlYW0gZm91bmQgaW4gdGhlIG1lZGlhCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAgKE9VVCkgICAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChPVVQpICAgIHBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2dldE5leHRTdHJlYW1fZmN0KSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlcik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2ggdGhlIGFjY2VzcyB1bml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5pdGlhbGl6ZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBzdGFydHMgdGhlIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIG9ubHkgbmVlZGVkIGZvciBuZXR3b3JrIHVudGlsIG5vdy4uLgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9zdGFydF9mY3QpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHN0b3AgcmVhZGluZwotICogQG5vdGUgICAgb25seSBuZWVkZWQgZm9yIG5ldHdvcmsgdW50aWwgbm93Li4uIChtYWtlcyBhIHBhdXNlKQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9zdG9wX2ZjdCkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLXRoZSBkdXJhdGlvbiBvZiB0aGUgbG9uZ2VzdCBzdHJlYW0gb2YgdGhlIG1lZGlhCi0gKiAgICAgICAgICAtdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZWFkZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9nZXRPcHRpb25fZmN0KSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgcmVhZGRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC0gbm90aGluZyBmb3IgdGhlIG1vbWVudAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKSB3aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfc2V0T3B0aW9uX2ZjdCkgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBqdW1wIGludG8gdGhlIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgIHRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBUaW1lICAgICAgICAgICAgKElOL09VVCkgSU46ICB0aGUgdGltZSB0byBqdW1wIHRvIChpbiBtcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX2p1bXBfZmN0KSAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBUaW1lKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICByZXNldCB0aGUgc3RyZWFtLCB0aGF0IGlzIHNlZWsgaXQgdG8gYmVnaW5uaW5nIGFuZCBtYWtlIGl0IHJlYWR5IHRvIGJlIHJlYWQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9yZXNldF9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IHRoZSB0aW1lIG9mIHRoZSBjbG9zZXN0IFJBUCBhY2Nlc3MgdW5pdCBiZWZvcmUgdGhlIGdpdmVuIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgIHRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHNlYXJjaAotICogQHBhcmFtICAgIHBUaW1lICAgICAgICAgICAgKElOL09VVCkgSU46ICB0aGUgdGltZSB0byBzZWFyY2ggZnJvbSAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHRoZSB0aW1lIChjdHMpIG9mIHRoZSBwcmVjZWRpbmcgUkFQIEFVLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX2dldFByZXZSYXBUaW1lX2ZjdCkgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcFRpbWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZQotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBnZW5lcmljIG1lZGlhIHJlYWRlciBHTE9CQUwgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgY29uY2VybmluZwotICogICAgICAgICAgICAgICAgY3JlYXRpb24gYW5kIGNvbnRyb2wgb2Ygb25lIHJlYWRlciB0eXBlLgotICogICAgICAgICAgICAgICAgVGhlIHJlYWRlciB0eXBlIGlzIG9uZSBvZiB0aGUgTTRSRUFERVJfTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX0dsb2JhbEludGVyZmFjZQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UkVBREVSX2NyZWF0ZV9mY3QqICAgICAgICAgICAgbV9wRmN0Q3JlYXRlOwotICAgIE00UkVBREVSX2Rlc3Ryb3lfZmN0KiAgICAgICAgICAgbV9wRmN0RGVzdHJveTsKLSAgICBNNFJFQURFUl9vcGVuX2ZjdCogICAgICAgICAgICAgIG1fcEZjdE9wZW47Ci0gICAgTTRSRUFERVJfY2xvc2VfZmN0KiAgICAgICAgICAgICBtX3BGY3RDbG9zZTsKLSAgICBNNFJFQURFUl9nZXRPcHRpb25fZmN0KiAgICAgICAgIG1fcEZjdEdldE9wdGlvbjsKLSAgICBNNFJFQURFUl9zZXRPcHRpb25fZmN0KiAgICAgICAgIG1fcEZjdFNldE9wdGlvbjsKLSAgICBNNFJFQURFUl9nZXROZXh0U3RyZWFtX2ZjdCogICAgIG1fcEZjdEdldE5leHRTdHJlYW07Ci0gICAgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCogICAgICBtX3BGY3RGaWxsQXVTdHJ1Y3Q7Ci0gICAgTTRSRUFERVJfc3RhcnRfZmN0KiAgICAgICAgICAgICBtX3BGY3RTdGFydDsKLSAgICBNNFJFQURFUl9zdG9wX2ZjdCogICAgICAgICAgICAgIG1fcEZjdFN0b3A7Ci0gICAgTTRSRUFERVJfanVtcF9mY3QqICAgICAgICAgICAgICBtX3BGY3RKdW1wOwotICAgIE00UkVBREVSX3Jlc2V0X2ZjdCogICAgICAgICAgICAgbV9wRmN0UmVzZXQ7Ci0gICAgTTRSRUFERVJfZ2V0UHJldlJhcFRpbWVfZmN0KiAgICBtX3BGY3RHZXRQcmV2UmFwVGltZTsKLQotfSBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2U7Ci0KLQotLyoqKioqKioqKioqKiogUkVBREVSIERBVEEgSW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIgKGF1ZGlvL3ZpZGVvKS4KLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAgICAoSU4vT1VUKSAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgYXUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlciwgYW5kIG11c3QgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybnMgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSAqIEByZXR1cm5zICAgIE00V0FSX05PX0RBVEFfWUVUICAgICAgICAgICAgdGhlcmUgaXMgbm8gZW5vdWdoIGRhdGEgb24gdGhlIHN0cmVhbSBmb3IgbmV3Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB1bml0Ci0gKiBAcmV0dXJucyAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICAgICAgdGhlcmUgYXJlIG5vIG1vcmUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5kIG9mIHN0cmVhbSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9nZXROZXh0QXVfZmN0KShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgbWVkaWEgcmVhZGVyIERBVEEgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgY29uY2VybmluZwotICogICAgICAgICAgICAgICAgZGF0YSBhY2Nlc3MgZm9yIG9uZSByZWFkZXIgdHlwZS4odGhvc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgY2FsbGVkIGZyb20KLSAqICAgICAgICAgICAgICAgIGEgZGVjb2RlcikgVGhlIHJlYWRlciB0eXBlIGlzIG9uZSBvZiB0aGUgTTRSRUFERVJfTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX0RhdGFJbnRlcmZhY2UKLXsKLSAgICBNNFJFQURFUl9nZXROZXh0QXVfZmN0KiAgIG1fcEZjdEdldE5leHRBdTsKLQotICAgIC8qKgotICAgIHN0b3JlcyB0aGUgY29udGV4dCBjcmVhdGVkIGJ5IHRoZSBNNFJFQURFUl9jcmVhdGVfZmN0KCkgZnVuY3Rpb24KLSAgICBzbyBpdCBpcyBhY2Nlc3NpYmxlIHdpdGhvdXQgIGRlY29kZXIKLSAgICAqLwotICAgIE00T1NBX0NvbnRleHQgbV9yZWFkZXJDb250ZXh0OwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotfSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNlbmRpZiAvKl9fTTRSRUFERVJfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX1BjbS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfUGNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZmM4NTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfUGNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRSRUFERVJfUGNtLmgKLSAqIEBicmllZiAgICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgd2F2IHJlYWRlcgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBnZW5lcmljIHNoZWxsIGludGVyZmFjZSByZXRyaWV2aW5nIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgIG9mIHRoZSB3YXYgcmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000UkVBREVSX1BDTV9IX18KLSNkZWZpbmUgX19NNFJFQURFUl9QQ01fSF9fCi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSoKLSogQHBhcmFtIHBNZWRpYVR5cGUgICAgICAgICAgICAgOiBQb2ludGVyIG9uIGEgTTRSRUFERVJfTWVkaWFUeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0qIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSoKLSogQHJldHVybnMgOiBNNE5PX0VSUk9SICAgICBpZiBPSwotKiAgICAgICAgICAgICBFUlJfQUxMT0MgICAgICBpZiBhbiBhbGxvY2F0aW9uIGZhaWxlZAotKiAgICAgICAgICAgIEVSUl9QQVJBTUVURVIgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNFJFQURFUl9QQ01fSF9fKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX0FjY2Vzc1VuaXQuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX0FjY2Vzc1VuaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjUwMzY3Yy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19BY2Nlc3NVbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNFNZU19BY2Nlc3NVbml0LmgKLSAqIEBicmllZiAgICAgICAgQWNjZXNzIHVuaXQgbWFuaXB1bGF0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUsCi0gKiAgICAgICAgICAgICAgIGFuZCBkZWNsYXJlcyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBpdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRTWVNfQUNDRVNTVU5JVF9ICi0jZGVmaW5lIE00U1lTX0FDQ0VTU1VOSVRfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIKLQotLyoqIFRoZSBhdHRyaWJ1dGUgb2YgYSBmcmFnbWVudCovCi10eXBlZGVmIGVudW0gewotICBNNFNZU19rRnJhZ0F0dHJPayAgICAgICAgPSAwMSwgLyoqPCBUaGUgZnJhZ21lbnQgaXMgY29ycmVjdCwgdGhlcmUgaXMgbm8gZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemUgY2Fubm90IGJlIDApKi8KLSAgTTRTWVNfa0ZyYWdBdHRyQ29ycnVwdGVkID0gMDIsIC8qKjwgVGhlIGZyYWdtZW50IGlzIGNvcnJ1cHRlZCAodGhlcmUgaXMgYXQgbGVhc3QgYSBiaXQgb3IgYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIHNvbWV3aGVyZSBpbiB0aGUgZnJhZ21lbnQgKHNpemUgY2Fubm90IGJlIDApKi8KLSAgTTRTWVNfa0ZyYWdBdHRyTG9zdCAgICAgID0gMDMgIC8qKjwgVGhlIGZyYWdtZW50IGlzIGxvc3QsIHNvIHRoZSBzaXplIG11c3QgYmUgMC4qLwotfSBNNFNZU19GcmFnQXR0cjsKLQotCi0vKiogQSBGcmFnbWVudCBpcyBhIHBpZWNlIG9mIGFjY2VzcyB1bml0LiBJdCBjYW4gYmUgZGVjb2RlZCB3aXRob3V0IGRlY29kaW5nIHRoZSBvdGhlcnMqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNE9TQV9NZW1BZGRyOCAgZnJhZ0FkZHJlc3M7ICAgLyoqPCBUaGUgZGF0YSBwb2ludGVyLiBBbGwgZnJhZ21lbnRzIG9mIHRoZSBzYW1lIGFjY2VzcyB1bml0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBjb250aWd1b3VzIGluIG1lbW9yeSovCi0gIE00T1NBX1VJbnQzMiAgICBzaXplOyAgICAgICAgICAvKio8IFRoZSBzaXplIG9mIHRoZSBmcmFnbWVudC4gSXQgbXVzdCBiZSAwIGlmIGZyYWdtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ2dlZCAnbG9zdCcqLwotICBNNFNZU19GcmFnQXR0ciAgaXNDb3JydXB0ZWQ7ICAgLyoqPCBUaGUgYXR0cmlidXRlIG9mIHRoaXMgZnJhZ21lbnQqLwotfSBNNFNZU19GcmFnOwotCi0vKio8IFRoZSBhdHRyaWJ1dGUgb2YgYW4gYWNjZXNzIHVuaXQqLwotdHlwZWRlZiBNNE9TQV9VSW50OCBNNFNZU19BVV9BdHRyOwotCi0jZGVmaW5lIEFVX0NvcnJ1cHRlZCAgIDB4MDEgLyoqPCBBdCBsZWFzdCBvbmUgZnJhZ21lbnQgb2YgdGhlIGFjY2VzcyB1bml0IGlzIGZsYWdnZWQgY29ycnVwdGVkLiovCi0jZGVmaW5lIEFVX1BfRnJhbWUgICAgIDB4MDIgLyoqPCBUaGUgYWNjZXNzIHVuaXQgaXMgYSBQX2ZyYW1lKi8KLSNkZWZpbmUgQVVfUkFQICAgICAgICAgMHgwNCAvKio8IFRoZSBhY2Nlc3MgdW5pdCBpcyBhIHJhbmRvbSBhY2Nlc3MgcG9pbnQuKi8KLQotCi0vKiogQW4gYWNjZXNzIHVuaXQgaXMgdGhlIHNtYWxsZXN0IHBpZWNlIG9mIGRhdGEgd2l0aCB0aW1pbmcgaW5mb3JtYXRpb24uKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgIHN0cmVhbSA7Ci0gIE00T1NBX01lbUFkZHIzMiAgICAgICAgICAgICBkYXRhQWRkcmVzczsgLyoqPCBUaGUgZGF0YSBwb2ludGVyLiBUaGUgc2l6ZSBvZiB0aGlzIGJsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgc2l6ZSkgbXVzdCBiZSBhIDMyLWJpdHMgaW50ZWdlciBtdWx0aXBsZSovCi0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBzaXplOyAgICAgICAgLyoqPCBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGF0YUFkZHJlc3MuIFRoZSBzaXplIG1heQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRjaCBhIDMyLWJpdHMgd29yZCBib3VuZGFyeS4qLwotICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgQ1RTOyAgICAgICAgIC8qKjwgVGhlIENvbXBvc2l0aW9uIFRpbWUgU3RhbXAqLwotICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgRFRTOyAgICAgICAgIC8qKjwgVGhlIERlY29kZWQgVGltZSBTdGFtcCovCi0gIE00U1lTX0FVX0F0dHIgICAgICAgICAgICAgICBhdHRyaWJ1dGU7ICAgLyoqPCBUaGUgYXR0cmlidXRlIG9mIHRoZSBhY2Nlc3MgdW5pdCovCi0gIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBuYkZyYWc7ICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGZyYWdtZW50cy4gSXQgY2FuIGJlIDAgaWYgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGZyYWdtZW50LiovCi0gIE00U1lTX0ZyYWcqKiAgICAgICAgICAgICAgICBmcmFnOyAgICAgICAgLyoqPCBBbiBhcnJheSBvZiAnbmJGcmFnJyBmcmFnbWVudHMuIEl0IHN0b3JlcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cyBzdHJ1Y3R1cmUuIFRoZSBvcmlnaW5hbCBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBvZiBmcmFnIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSBNNFNZU19GcmFnKiBmcmFnW10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIE00U1lTX0ZyYWcqKiBmcmFnIHNpbmNlIHRoZSBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBvZiBzdWNoIHN5bnRheCBpcyBvbmx5IGEgTWljcm9zb2Z0IGV4dGVuc2lvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEMgY29tcGlsZXIuICovCi19IE00U1lTX0FjY2Vzc1VuaXQ7Ci0KLS8qIEVycm9yIGNvZGVzICovCi0jZGVmaW5lIE00RVJSX0FVX05PX01PUkVfRlJBRyAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00U1lTX0NNQVBJLDB4MDAwMDAxKQotI2RlZmluZSBNNEVSUl9BVV9CVUZGRVJfT1ZFUkZMT1cgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNFNZU19DTUFQSSwweDAwMDAwMikKLSNkZWZpbmUgTTRFUlJfQVVfQkFEX0lOREVYICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDMpCi0jZGVmaW5lIE00RVJSX05PVF9FTk9VR0hfRlJBRyAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00U1lTX0NNQVBJLDB4MDAwMDA0KQotCi0KLQotI2VuZGlmIC8qTTRTWVNfQUNDRVNTVU5JVF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfU3RyZWFtLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19TdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFiMGNlNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19TdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRTWVNfU3RyZWFtLmgKLSAqIEBicmllZiAgICAgICAgU3RyZWFtIG1hbmlwdWxhdGlvbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3RyZWFtIHN0cnVjdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRTWVNfU1RSRUFNX0gKLSNkZWZpbmUgTTRTWVNfU1RSRUFNX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotCi10eXBlZGVmIE00T1NBX1VJbnQzMiBNNFNZU19TdHJlYW1JRDsKLQotLyoqIFRoZSBzdHJlYW1UeXBlIHR5cGUgcHJvdmlkZXMgYSB3YXkgdG8gZGlzdGluZ3Vpc2ggYWxsIHN0cmVhbXMgKEFBQywgQU1SLCBZVVY0MjAsIE1QRUctNCBWaWRlbywKLSAgICAgSDI2MykuIFN0cmVhbSB0eXBlcyBjYW4gYmUgc29ydGVkIGluIDIgd2F5czoKLUBhcmcgICBTb21lIG9mIHRoZW0gYXJlIHJhdyBkYXRhLCBvdGhlcnMgYXJlIGVuY29kZWQKLUBhcmcgICBTb21lIG9mIHRoZW0gYXJlIHJlbGF0ZWQgdG8gYW4gYXVkaW8gbWVkaWEsIGEgdmlkZW8gbWVkaWEuLi4KLUBuIFNvIGEgc3BlY2lmaWMgbmFtaW5nIGNvbnZlbnRpb24gaGFzIGJlZW4gZGVzaWduZWQgdG8gYWxsb3cgYSBxdWljayBwYXJzaW5nIG9mIHRoZSBzdHJlYW1UeXBlCi0gICAgdmFsdWUgdG8gcmV0dXJuIHRoZSBhYm92ZSBjYXRlZ29yaWVzLiBTdHJlYW1UeXBlIGlzIGFuIHVuLXNpZ25lZCBpbnRlZ2VyIG9uIDE2IGJpdHMuCi1AYXJnICAgVGhlIGZpcnN0IGJ5dGUgKE1TQikgZGVmaW5lcyB0aGUgY29kZWMgdHlwZS4gSXQgY2FuIGJlIGVpdGhlciBBdWRpbyxWaWRlbywgUGljdHVyZSwKLSAgICAgICAgIFRleHQgb3IgU2NlbmUuCi1AYXJnICAgVGhlIHNlY29uZCBieXRlIChMU0IpIGRlZmluZXMgdGhlIHN1Yi1jb2RlY3MgdHlwZSAoaWUgWVVWNDIwLCBQQ01fMTYgYml0cywgQU1SLi4uKS4KLSAgICAgICAgTW9yZW92ZXIgaWYgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMHg4MCB0aGUgc3RyZWFtIGlzIGEgcmF3IHN0cmVhbSwgZWxzZSB0aGUgc3RyZWFtCi0gICAgICAgIGlzIGFuIGVuY29kZWQgb25lCi1AbiAgIDB4MDAwMCBpcyBhIGZvcmJpZGRlbiB2YWx1ZSwgaXQgZGVzY3JpYmVzIGFuIHVua25vd24gc3RyZWFtICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICBNNFNZU19rVW5rbm93biAgICAgICA9IDB4MDAwMCwKLSAgIC8qIFN0cmVhbSB0eXBlIGRlZmluaXRpb24KLSAgICAgICAweFlZWlogICA6IFlZIGlzIHRoZSBjb2RlYyB0eXBlIChBdWRpbywgVmlkZW8sIFBpY3R1cmUsIFNjZW5lIC4uLikKLSAgICAgICAgICAgICAgICAgIFpaIGlzIHRoZSBzdWItY29kZWMgdHlwZSAoQUFDLCBBTVIgLCAuLi4pCi0gICAgICAgICAgICAgICAgICAgICBpZiBaWiBpcyBncmVhdGVyIHRoYW4gMHg4MCBpdCBpcyBhIHJhdyBmb3JtYXQqLwotCi0gICAvKiBBdWRpbyBvbmVzICAgOiBSYW5nZSBmcm9tIFsweDAxMDAtMHgwMUZGXSovCi0gICBNNFNZU19rQXVkaW9Vbmtub3duICA9IDB4MDEwMCwKLSAgIE00U1lTX2tBQUMgICAgICAgICAgID0gMHgwMTAxLAotICAgTTRTWVNfa0NFTFAgICAgICAgICAgPSAweDAxMDIsCi0gICBNNFNZU19rQU1SICAgICAgICAgICA9IDB4MDEwMywKLSAgIE00U1lTX2tBTVJfV0IgICAgICAgID0gMHgwMTA0LAotICAgTTRTWVNfa01QMyAgICAgICAgICAgPSAweDAxMDUsCi0gICBNNFNZU19rTUlESSAgICAgICAgICA9IDB4MDEwNiwKLSAgIE00U1lTX2tXTUEgICAgICAgICAgID0gMHgwMTA3LAotICAgTTRTWVNfa1JFQUxBVURJTyAgICAgPSAweDAxMDgsCi0gICBNNFNZU19rRVZSQyAgICAgICAgICAgID0gMHgwMTA5LAotICAgTTRTWVNfa1BDTV8xNmJpdHNTICAgPSAweDAxODEsIC8qIFBDTSAxNiBiaXRzIFNpZ25lZCAqLwotICAgTTRTWVNfa1BDTV8xNmJpdHNVICAgPSAweDAxODIsIC8qIFBDTSAxNiBiaXRzIFVuLXNpZ25lZCAqLwotICAgTTRTWVNfa1BDTV84Yml0c1UgICAgPSAweDAxODMsIC8qIFBDTSAgOCBiaXRzIFVuLXNpZ25lZCAqLwotLyogRml4QUEgMjAwOC8wMy8wMyB0eXBlczogTTRTWVNfa1BDTV8xNmJpdHNTLCBNNFNZU19rUENNXzE2Yml0c1UgYW5kIE00U1lTX2tQQ01fOGJpdHNVCi0gICBhcmUgbm93IG9ubHkgdXNlZCBieSBBdWRpb01peGVyIGFuZCBSZWFkZXJBVkkgPT4gQW4gdXBkYXRlIGlzIG5lY2Vzc2FyeSBpbiB0aGUgZnV0dXJlIGZvciB1c2UKLSAgIHR5cGUgTTRTWVNfa1BDTSAqLwotICAgTTRTWVNfa1hNRiAgICAgICAgICAgID0gMHgwMTg0LAotICAgTTRTWVNfa1NNQUYgICAgICAgICAgPSAweDAxODUsCi0gICBNNFNZU19rSU1FTCAgICAgICAgICA9IDB4MDE4NiwKLSAgIE00U1lTX2tCQkEgICAgICAgICAgICA9IDB4MDE4NywKLSAgIE00U1lTX2tCUEMgICAgICAgICAgICA9IDB4MDE4OCwKLSAgIE00U1lTX2tBRFBDTSAgICAgICAgID0gMHgwMTg5LCAgLyogQURQQ00gYWRkZWQgKi8KLSAgIE00U1lTX2tQQ00gICAgICAgICAgID0gMHgwMTkwLCAgLyogc3RyZWFtIHR5cGUgYWRkZWQ6IFBDTTsgIFBSMjU2OSBmaXhBQSAqLwotICAgTTRTWVNfa0F1ZGlvQWxsICAgICAgICA9IDB4MDFGRiwgIC8qIGFsbCBhdWRpbyBzdHJlYW1zICovCi0KLSAgIC8qIFZpZGVvIG9uZXMgICA6IFJhbmdlIFsweDAyMDAtMHgwMkZGXSovCi0gICBNNFNZU19rVmlkZW9Vbmtub3duICA9IDB4MDIwMCwKLSAgIE00U1lTX2tNUEVHXzQgICAgICAgID0gMHgwMjAxLAotICAgTTRTWVNfa0gyNjMgICAgICAgICAgPSAweDAyMDIsCi0gICBNNFNZU19rSDI2M3BwICAgICAgICA9IDB4MDIwMywKLSAgIE00U1lTX2tIMjY0ICAgICAgICAgID0gMHgwMjA0LAotICAgTTRTWVNfa1JFQUxWSURFTyAgICAgPSAweDAyMDUsCi0gICBNNFNZU19rWVVWNDIwICAgICAgICA9IDB4MDI4MSwKLSAgIE00U1lTX2tSR0IzMiAgICAgICAgID0gMHgwMjgyLAotICAgTTRTWVNfa0JHUjMyICAgICAgICAgPSAweDAyODMsCi0gICBNNFNZU19rUkdCMjQgICAgICAgICA9IDB4MDI4NCwKLSAgIE00U1lTX2tCR1IyNCAgICAgICAgID0gMHgwMjg1LAotICAgTTRTWVNfa1ZpZGVvQWxsICAgICAgICA9IDB4MDJGRiwgIC8qIGFsbCB2aWRlbyBzdHJlYW1zICovCi0KLSAgLyogUGljdHVyZSBvbmVzIDogUmFuZ2UgWzB4MDMwMC0weDAzRkZdKi8KLSAgIE00U1lTX2tQaWN0dXJlVW5rbm93biA9IDB4MDMwMCwKLSAgIE00U1lTX2tKUEVHICAgICAgICAgICA9IDB4MDMwMSwKLSAgIE00U1lTX2tHSUYgICAgICAgICAgICA9IDB4MDMwMiwKLSAgIE00U1lTX2tCTVAgICAgICAgICAgICA9IDB4MDM4MywKLSAgIE00U1lTX2tTdGlsbEFsbCAgICAgICAgID0gMHgwM0ZGLCAgLyogYWxsIHN0aWxsIHBpY3R1cmUgc3RyZWFtcyAqLwotCi0gICAvKiBUZXh0IG9uZXMgICAgOiBSYW5nZSBbMHgwNDAwLTB4MDRGRl0qLwotICAgTTRTWVNfa1RleHRVbmtub3duICA9IDB4MDQwMCwKLSAgIE00U1lTX2tUaW1lZFRleHQgICAgPSAweDA0MDEsCi0gICBNNFNZU19rVVRGOCAgICAgICAgID0gMHgwNDgxLAotICAgTTRTWVNfa1VURjE2ICAgICAgICA9IDB4MDQ4MiwKLSAgIE00U1lTX2tVQ1MyICAgICAgICAgPSAweDA0ODMsCi0gICBNNFNZU19rVGV4dEFsbCAgICAgICA9IDB4MDRGRiwgIC8qIGFsbCB0ZXh0IHN0cmVhbXMgKi8KLQotICAgLyogU2NlbmUgJiBHcmFwaGljcyBvbmVzICAgOiBSYW5nZSBbMHgwNTAwLTB4MDVGRl0qLwotICAgTTRTWVNfa1NjZW5lVW5rbm93biAgPSAweDA1MDAsCi0gICBNNFNZU19rU01JTCAgICAgICAgICA9IDB4MDUwMSwKLSAgIE00U1lTX2tCSUZTICAgICAgICAgID0gMHgwNTAyLAotICAgTTRTWVNfa1NjZW5lQWxsICAgICAgICA9IDB4MDVGRiwgIC8qIGFsbCBzY2VuZSBzdHJlYW1zICovCi0KLSAgIC8qIGhpbnRlZCBvbmVzICAgOiBSYW5nZSBbMHgwNjAwLTB4MDZGRl0qLwotICAgTTRTWVNfa0hpbnRlZFVua25vd24gPSAweDA2MDAsCi0gICBNNFNZU19rUlRQICAgICAgICAgICA9IDB4MDYwMSwKLSAgIE00U1lTX2tNUEVHMl9UUyAgICAgID0gMHgwNjAyLAotICAgTTRTWVNfa0hpbnRlZEFsbCAgICAgICAgPSAweDA2RkYsICAvKiBhbGwgcGFja2V0aXplZCBzdHJlYW1zICovCi0KLSAgIC8qIE1QRUctNCBzeXN0ZW0gb25lcyA6IFJhbmdlIFsweDA3MDAtMHgwN0ZGXSovCi0gICBNNFNZU19rU3lzVW5rbm93biAgICA9IDB4MDcwMCwKLSAgIE00U1lTX2tPRFMgICAgICAgICAgID0gMHgwNzAxLAotICAgTTRTWVNfa0lQTVAgICAgICAgICAgPSAweDA3MDIsCi0gICBNNFNZU19rT0NJICAgICAgICAgICA9IDB4MDcwMywKLSAgIE00U1lTX2tTeXNBbGwgICAgICAgID0gMHgwN0ZGIC8qIGFsbCBzeXN0ZW0gc3RyZWFtcyovCi19IE00U1lTX1N0cmVhbVR5cGUgOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNFNZU19TdHJlYW1JRCAgICAgc3RyZWFtSUQgOwotICAgTTRPU0FfVUludDMyICAgICAgdmFsdWUgOwotfSBNNFNZU19TdHJlYW1JRFZhbHVlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgTTRTWVNfU3RyZWFtSUQgICAgc3RyZWFtSUQgOwotICAgTTRPU0FfVUludDMyICAgICAgc2l6ZSA7Ci0gICBNNE9TQV9NZW1BZGRyMzIgICBhZGRyIDsKLX0gTTRTWVNfU3RyZWFtSURtZW1BZGRyIDsKLQotLyoqIFRoaXMgc3RydWN1cmUgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgdG8gYSBzdHJlYW0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNFNZU19TdHJlYW1JRCAgIHN0cmVhbUlEOyAgICAvKio8IFRoZSBJRCBvZiB0aGUgc3RyZWFtLiBJdCBtdXN0IGJlIHVuaXF1ZSBmb3IgYSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWUgaW4gYSBNUDQgZmlsZSwgdHdvIHRyYWNrcyBjYW4gbm90IGhhdmUgdHdvIHRpbWVzIHRoZSBzYW1lIElEKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaXMgZm9yYmlkZGVuLiovCi0gIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZTsgICAgLyoqPCBUaGUgc3RyZWFtIHR5cGUgb2YgdGhlIHN0cmVhbSovCi0gIE00T1NBX1VJbnQ4ICAgICAgcHJvZmlsZUxldmVsOyAgLyoqPCBUaGUgcHJvZmlsZSAmIGxldmVsIG9mIGEgc3RyZWFtLiBJdCBpcyByZWxhdGVkIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHR5cGUgJiB0aGUgZGVmaW5pdGlvbiBjb21lcyBmcm9tIHRoZSBzdGFuZGFyZCBib2RpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIE1QRUctNCBWaWRlbyAmIE1QRUctNCBBdWRpbykuIFNvbWUgdmFsdWVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWRlZmluZWQ6IDB4RkU9dXNlclByaXZhdGUgMHhGRj1ubyBQcm9maWxlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsIHNwZWNpZmllZCovCi0gIE00T1NBX1VJbnQzMiAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemU7ICAvKio8IFRoZSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24uIFRoZXNlIGJ5dGVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIGluaXRpYWxpc2UgYSBkZWNvZGVyLiovCi0gIE00T1NBX01lbUFkZHIzMiAgZGVjb2RlclNwZWNpZmljSW5mbzsgLyoqPCBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBkZWNvZGVyIHNwZWNpZmljIGluZm8uKi8KLSAgTTRPU0FfVUludDMyICAgICB0aW1lU2NhbGU7ICAgICAvKio8IFRoZSB0aW1lIHNjYWxlIG9mIHRoZSBzdHJlYW0uIEl0IG1lYW5zIHRoYXQgYWxsIHRpbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIG9mIHRoaXMgc3RyZWFtIGFyZSBjb21wdXRlZCBpbiB0aGlzIHRpbWVzY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZSB0aW1lU2NhbGUgPSA4MDAwLCBtZWFucyB0aGVyZSBhcmUgODAwMCB0aWNrcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBzZWNvbmQpKi8KLSAgTTRPU0FfVGltZSAgICAgICBkdXJhdGlvbjsgICAgICAgIC8qKjwgVGhlIHN0cmVhbSBkdXJhdGlvbiBvZiB0aGlzIHN0cmVhbS4gVGhlIHRpbWUgdW5pdCBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHNjYWxlLiBUaGUgdmFsdWUgY2FuIGJlIHNldCB0byBNNFNZU19Vbmtub3duVGltZSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBpcyBub3Qga25vd24uKi8KLSAgTTRPU0FfSW50MzIgICAgICBhdmVyYWdlQml0cmF0ZTsgIC8qKjwgVGhlIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYml0IHBlciBzZWNvbmQpIG9mIHRoaXMgc3RyZWFtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXZlcmFnZSBiaXRyYXRlIGlzIGNvbXB1dGVkIG9uIHRoZSBzdHJlYW0gZHVyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIHZhbHVlIG1lYW5zIGVpdGhlciB0aGVyZSBpcyBubyBhdmVyYWdlIGJpdHJhdGUgb3Igbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSBiaXRyYXRlIGlzIHByb3ZpZGVkLiovCi0gIE00T1NBX0ludDMyICAgICAgbWF4Qml0cmF0ZTsgICAgICAvKio8IFRoZSBtYXhpbXVtIGJpdHJhdGUgKGluIGJpdCBwZXIgc2Vjb25kKSBvZiB0aGlzIHN0cmVhbS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gYml0cmF0ZSBpcyBjb21wdXRlZCBvbiBhIHNsaWRpbmcgd2luZG93IG9mIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kLiAtMSB2YWx1ZSBtZWFucyBlaXRoZXIgdGhlcmUgaXMgbm8gbWF4LiBiaXRyYXRlIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIG1heC4gYml0cmF0ZSBpcyBwcm92aWRlZC4qLwotfSBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbjsKLQotdHlwZWRlZiBlbnVtIHsKLSAgIE00U1lTX2tQcmV2aW91c1JBUCAgICAgID0gMHgwMSAsCi0gICBNNFNZU19rTmV4dFJBUCAgICAgICAgICA9IDB4MDIgLAotICAgTTRTWVNfa0Nsb3Nlc3RSQVAgICAgICAgPSAweDAzICwKLSAgIE00U1lTX2tOb1JBUHByZXZpb3VzICAgID0gMHgxMSAsCi0gICBNNFNZU19rTm9SQVBuZXh0ICAgICAgICA9IDB4MTIgLAotICAgTTRTWVNfa05vUkFQY2xvc2VzdCAgICAgPSAweDEzICwKLSAgIE00U1lTX2tCZWdpbm5pbmcgICAgICAgID0gMHgyMAotfSBNNFNZU19TZWVrQWNjZXNzTW9kZSA7Ci0KLSNlbmRpZiAvKk00U1lTX1NUUkVBTV9IKi8KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VE9PTF9WZXJzaW9uSW5mby5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRUT09MX1ZlcnNpb25JbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwMTZiOGQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRUT09MX1ZlcnNpb25JbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFRPT0xfVmVyc2lvbkluZm8uaAotICogQGJyaWVmICBkZWZpbmVzIGEgY29tbW9uIHZlcnNpb24gaW5mb3JtYXRpb24gc3RydWN0dXJlCi0gKiBAbm90ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRUT09MX1ZFUlNJT05JTkZPX0hfXwotI2RlZmluZSBfX000VE9PTF9WRVJTSU9OSU5GT19IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLS8qKgotICogc3RydWN0dXJlICAgIE00X1ZlcnNpb25JbmZvCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB2ZXJzaW9uIG9mIGNvcmUgY29tcG9uZW50Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdHlwaWNhbGx5IHVzZWQgdG8gcmV0cmlldmUgdmVyc2lvbiBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgb2YgYSBjb21wb25lbnQgdmlhIGdldE9wdGlvbiBmdW5jdGlvbgotICovCi10eXBlZGVmIHN0cnVjdCBfTTRfVmVyc2lvbkluZm8KLXsKLSAgICBNNE9TQV9VSW50MzIgbV9tYWpvcjsgICAgICAgIC8qbWFqb3IgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50Ki8KLSAgICBNNE9TQV9VSW50MzIgbV9taW5vcjsgICAgICAgIC8qbWlub3IgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50Ki8KLSAgICBNNE9TQV9VSW50MzIgbV9yZXZpc2lvbjsgICAgLypyZXZpc2lvbiB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotCi0gICAgLyogU3RydWN0dXJlIHNpemUgKi8KLSAgICBNNE9TQV9VSW50MzIgbV9zdHJ1Y3RTaXplOwotCi19IE00X1ZlcnNpb25JbmZvOwotCi0KLSNlbmRpZiAvKl9fTTRUT09MX1ZFUlNJT05JTkZPX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGJmY2I2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VkRfRVhURVJOQUxfSU5URVJGQUNFX0hfXwotI2RlZmluZSBfX000VkRfRVhURVJOQUxfSU5URVJGQUNFX0hfXwotCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIC0tLS0tIERTSSBiaXRzdHJlYW0gcGFyc2VyIC0tLS0tICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHRvIGNsaWVudHMgb2YgdGhlIHNoZWxsIHRvIGFsbG93IHRoZW0gdG8gYW5hbHlzZSBjbGlwcwotKHVzZWZ1bCBmb3IgdmlkZW8gZWRpdGluZykgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFuY2lhdGUgYSBkZWNvZGVyLCB3aGljaCBjYW4gYmUgdXNlZnVsIHByZWNpc2VseQotaWYgSFcgZGVjb2RlcnMgYXJlIGEgcG9zc2liaWxpdHkuICovCi0KLU00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSSgKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcFZvbCwgTTRPU0FfSW50MzIgYVZvbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKiBwRGNpLAotICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemUpOwotCi1NNE9TQV9FUlIgZ2V0QVZDUHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4KiBwRFNJLCBNNE9TQV9JbnQzMiBEU0lTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCk7Ci0KLU00T1NBX0VSUiBnZXRIMjYzUHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4KiBwRFNJLCBNNE9TQV9JbnQzMiBEU0lTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCk7Ci0KLU00T1NBX0VSUiBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCBwcm9maWxlQW5kTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWRF9FWFRFUk5BTF9JTlRFUkZBQ0VfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjYTM2YWMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9Ub29scy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZEX1RPT0xTX0hfXwotI2RlZmluZSBfX000VkRfVE9PTFNfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotLyogLS0tLS0gYml0c3RyZWFtIHBhcnNlciAtLS0tLSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1fYnl0ZTsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2luZGV4OwotICAgIE00T1NBX01lbUFkZHI4IGluOwotCi19IE00VlNfQml0c3RyZWFtX2N0eHQ7Ci0KLU00T1NBX1VJbnQzMiBNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KE00VlNfQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbmJfYml0cyk7Ci1NNE9TQV9FUlIgTTRWRF9Ub29sc19Xcml0ZUJpdHNUb01lbW9yeShNNE9TQV9VSW50MzIgYml0c1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG9mZnNldCwgTTRPU0FfVUludDggbmJfYml0cyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000VkRfVE9PTFNfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZGTF90cmFuc2l0aW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZGTF90cmFuc2l0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3Zjc2Y2IuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRkxfdHJhbnNpdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VFJBTl90cmFuc2l0aW9uLmgKLSAqIEBicmllZgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNFZGTF9UUkFOU0lUSU9OX0hfXwotI2RlZmluZSBfX000VkZMX1RSQU5TSVRJT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVSW50ODsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBVSW50MzI7Ci0KLXR5cGVkZWYgICAgc3RydWN0IFNfTTRWaUNvbUltYWdlUGxhbmUKLXsKLSAgICBVSW50MzIgICAgICAgIHVfd2lkdGg7ICAgICAgICAgICAgLyogYWN0aXZlIHdpZHRoLCBpbiBwaXhlbHMgKi8KLSAgICBVSW50MzIgICAgICAgIHVfaGVpZ2h0OyAgICAgICAgICAgIC8qIGFjdGl2ZSBoZWlnaHQsIGluIGxpbmVzICovCi0gICAgVUludDMyICAgICAgICB1X3RvcGxlZnQ7ICAgICAgICAgICAgLyogaW5kZXggb2YgMXN0IGFjdGl2ZSBwaXhlbCAqLwotICAgIFVJbnQzMiAgICAgICAgdV9zdHJpZGU7ICAgICAgICAgICAgLyogbGluZSBzdHJpZGUsIGluIGJ5dGVzICovCi0gICAgVUludDggICAgICAgICpwYWNfZGF0YTsgICAgICAgICAgICAvKiBidWZmZXIgYWRkcmVzcyAqLwotfSAgICBNNFZpQ29tSW1hZ2VQbGFuZTsKLQotdHlwZWRlZiBzdHJ1Y3QgU19NNFZGTF9tb2RpZkx1bVBhcmFtCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgbHVtX2ZhY3RvcjsKLSAgICB1bnNpZ25lZCBzaG9ydCBjb3B5X2Nocm9tYTsKLX0gTTRWRkxfTW9kaWZMdW1QYXJhbTsKLQotI2RlZmluZSAgICAgTTRWSUZJX09LICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lICAgICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQgICAgIDgKLSNkZWZpbmUgICAgIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIICAgICAgOQotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFCeVN0ZXAoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZGTF9Nb2RpZkx1bVBhcmFtICpsdW1fcGFyYW0sIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZShNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbHVtX2ZhY3Rvciwgdm9pZCAqdXNlcl9kYXRhKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VklGSV9JbWFnZUJsZW5kaW5nb25ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4xLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfVUludDMyIFByb2dyZXNzKQotICogQGJyaWVmICAgQmxlbmRzIHR3byBZVVYgNDoyOjAgUGxhbmFyIGltYWdlcy4KLSAqIEBub3RlICAgIEJsZW5kcyBZVVY0MjAgcGxhbmFyIGltYWdlcywKLSAqICAgICAgICAgIE1hcCB0aGUgdmFsdWUgb2YgcHJvZ3Jlc3MgZnJvbSAoMCAtIDEwMDApIHRvICgwIC0gMTAyNCkKLSAqICAgICAgICAgIFNldCB0aGUgcmFuZ2Ugb2YgYmxlbmRpbmdmYWN0b3IsCi0gKiAgICAgICAgICAgICAgICAgIDEuIGZyb20gMCB0byAoUHJvZ3Jlc3MgPDwgMSkgICAgICAgICAgICA7Zm9yIFByb2dyZXNzIDw9IDUxMgotICogICAgICAgICAgICAgICAgICAyLiBmcm9tICgoIFByb2dyZXNzIC0gNTEyKTw8IDEpIHRvIDEwMjQgO290aGVyd2lzZQotICogICAgICAgICAgU2V0IHRoZSBpbmNyZW1lbnQgb2YgYmxlbmRpbmdmYWN0b3IgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgaW1hZ2Ugcm93IGJ5IHRoZSBmYWN0b3IsCi0gKiAgICAgICAgICAgICAgICAgID0gIChSYW5nZS0xKSAvIChpbWFnZSB3aWR0aC0xKSAgO2ZvciB3aWR0aCA+PSByYW5nZQotICogICAgICAgICAgICAgICAgICA9ICAoUmFuZ2UpIC8gKGltYWdlIHdpZHRoKSAgICAgIDtvdGhlcndpc2UKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCg9IGkpIHJvdyBvZiBvdXRwdXQgWSBwbGFuZSAoc3RlcHMgb2YgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2goPSBqKSBjb2x1bW4gb2Ygb3V0cHV0IFkgcGxhbmUgKHN0ZXBzIG9mIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgb25lIFUgJiBWIHNhbXBsZSBmcm9tIHR3byBpbnB1dCBZVVY0OjI6MCBpbWFnZXMgYW5kCi0gKiAgICAgICAgICAgICAgICAgIENvbXB1dGUgZm91ciBZIHNhbXBsZSBhbmQgb25lIFUgJiBWIHNhbXBsZSBmb3Igb3V0cHV0IFlVVjQ6MjowIGltYWdlCi0gKiAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgZm9sbG93aW5nLAotICogICAgICAgICAgICAgICAgICBPdXQoaSxqKSA9IGJsZW5kaW5nZmFjdG9yKGksaikgKiBJbjEoaSxqKSsgKGwgLSBibGVuZGluZ2ZhY3RvcihpLGopKSAqIEluMihpLGopCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgIFVzZXIgU3BlY2lmaWMgUGFyYW1ldGVyCi0gKiBAcGFyYW0gICBwUGxhbmVJbjE6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkIGZvciBZLCBVCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBwUGxhbmVJbjI6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkIGZvciBZLCBVCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkIGZvciBZLCBVCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBQcm9ncmVzczogIChJTikgIFByb2dyZXNzIHZhbHVlICh2YXJpZXMgYmV0d2VlbiAwIGFuZCAxMDAwKQotICogQHJldHVybiAgTTRWSUZJX09LOiBObyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuc2lnbmVkIGNoYXIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lSW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVPdXQsIFVJbnQzMiBQcm9ncmVzcyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvLyBfX000VkZMX1RSQU5TSVRJT05fSF9fCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfQ2xpcC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0NsaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWYwNzYxNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfQ2xpcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFZJRklfQ2xpcC5oCi0gKiBAYnJpZWYgICAgICAgIEdsb2JhbCBUYWJsZSBkZWZpbml0aW9uCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIENsaXBwaW5nIGFuZCBEaXZpc2lvbiB0YWJsZSBhZGRyZXNzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmICAgIF9NNFZJRklfQ0xJUF9IXwotI2RlZmluZSAgICBfTTRWSUZJX0NMSVBfSF8KLQotLyogQ2xpcHBpbmcgbWF0cml4IGZvciBSR0IgdmFsdWVzICovCi1FWFRFUk4gQ05TVCBNNFZJRklfVUludDggICAgKk00VklGSV9DbGlwVGFibGVfemVybzsKLS8qIERpdmlzaW9uIHRhYmxlIGZvciAoNjU1MzUveCk7IHggPSAwIHRvIDUxMiAqLwotRVhURVJOIENOU1QgTTRWSUZJX1VJbnQxNiAgICAqTTRWSUZJX0RpdlRhYmxlX3plcm87Ci0KLSNlbmRpZiAvKiBfTTRWSUZJX0NMSVBfSF8gKi8KLQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0NsaXAuaCAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRGVmaW5lcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0RlZmluZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ1OTFlNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRGVmaW5lcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRWSUZJX0RlZmluZXMuaAotICogQGJyaWVmICAgICAgICBNYWNybyBEZWZpbml0aW9uCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYWxsIHRoZSBtYWNybyB1c2VkIGluIHRoZSBmaWx0ZXIgbGlicmFyeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfTTRWSUZJX0RFRklORVNfSF8KLSNkZWZpbmUgX000VklGSV9ERUZJTkVTX0hfCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgTWFjcm9zIHVzZWQgZm9yIGNvbG9yIHRyYW5zZm9ybSBSR0I1NjUgdG8gWVVWCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIENTVF9SR0JfMTZfU0laRSAyCi0jZGVmaW5lIFkxNihyLCBnLCBiKSBDTElQKCAgKCAoICg4MDU5MyAqIHIpKyg3Nzg1NSAqIGcpKygzMDcyOCAqIGIpKSA+PiAxNSkpCi0jZGVmaW5lIFUxNihyLCBnLCBiKSBDTElQKDEyOCsgKCAoIC0oNDU0ODMgKiByKS0oNDM5MzYgKiBnKSsoMTM0NzcxICogYikpID4+IDE1ICkpCi0jZGVmaW5lIFYxNihyLCBnLCBiKSBDTElQKDEyOCsgKCAoICgxMzQ3NzEgKiByKS0oNTU1MzIgKiBnKS0oMjE5MTcgKiBiKSkgPj4gMTUgICkpCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgIE1hY3JvcyB1c2VkIGZvciBjb2xvciB0cmFuc2Zvcm0gWVVWIHRvIFJHQgotICogICAgQiA9IDEuMTY0KFkgLSAxNikgICAgICAgICAgICAgICAgICArIDIuMDE4KFUgLSAxMjgpCi0gKiAgRyA9IDEuMTY0KFkgLSAxNikgLSAwLjgxMyhWIC0gMTI4KSAtIDAuMzkxKFUgLSAxMjgpCi0gKiAgUiA9IDEuMTY0KFkgLSAxNikgKyAxLjU5NihWIC0gMTI4KQotICogIEFib3ZlIENvbnZlcnNpb24gRm9ybXVsYSBpcyBpbXBsZW1lbnRlZCBmb3IgZml4ZWQgcG9pbnQgb3BlcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgQ1NUX1JHQl8yNF9TSVpFIDMKLQotI2lmZGVmIF9fUkdCX1YxX18KLSNkZWZpbmUgREVNQVRSSVgoUngsR3gsQngsWXgzNyxVeCxWeCkgXAotICAgIFJ4ID0gQ0xJUCgoKFl4MzcgKyAoVnggKiA1MSkgKyAxNikgPj4gNSkgLSAyMjMpOyBcCi0gICAgR3ggPSBDTElQKCgoWXgzNyAtICgoVXgrKFZ4PDwxKSkgKiAxMykgKzE2KSA+PiA1KSArIDEzNSk7IFwKLSAgICBCeCA9IENMSVAoKChZeDM3ICsgKFV4ICogNjUpICsgMTYpID4+IDUpIC0gMjc3KQotI2Vsc2UKLSNkZWZpbmUgREVNQVRSSVgoUngsR3gsQngsWXgyNTY4LFV4LFZ4KSBcCi0gICAgUnggPSBDTElQKCgoWXgyNTY4ICsgICAgICAgICAgICAgICAgIChWeCAqIDB4MzM0MykgKyAoTTRWSUZJX0ludDMyKTB4ZmZlNDA4MDApID4+IDEzKSk7IFwKLSAgICBHeCA9IENMSVAoKChZeDI1NjggLSAoVXggKiAweDBjOTIpIC0gKFZ4ICogMHgxYTFlKSArIChNNFZJRklfSW50MzIpMHgwMDExMDE4MCkgPj4gMTMpKTsgXAotICAgIEJ4ID0gQ0xJUCgoKFl4MjU2OCArIChVeCAqIDB4NDBjZikgICAgICAgICAgICAgICAgICAgICsgKE00VklGSV9JbnQzMikweGZmZGQ0MjAwKSA+PiAxMykpOwotI2VuZGlmIC8qIF9fUkdCX1YxX18gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgIFBhY2tpbmcgYW5kIFVucGFja2luZyBpcyBkaWZmZXJlbnQgZm9yIGxpdHRsZSBhbmQgYmlnIGVuZGlhbgotICogIHIsIGcsIGIsIFJ4LCBHeCwgQnggYXJlIDggYml0IGNvbG9yIHZhbHVlCi0gKiAgICBhLCBkYXRhIGFyZSAxNiBiaXQgcGl4ZWwgdmFsdWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qIFBhY2sgY29tcHV0YXRpb25zIGNvbW1vbiBmb3IgbGl0dGxlIGVuZGlhbiBhbmQgYmlnIGVuZGlhbiBtb2RlcyAqLwotI2RlZmluZSAgICBQQUNLX0JHUjI0KHJnYl9wdHIsUngsR3gsQngpIHtyZ2JfcHRyWzBdID0gKE00VklGSV9VSW50OClCeDsgcmdiX3B0clsxXSA9XAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpR3g7IHJnYl9wdHJbMl0gPSAoTTRWSUZJX1VJbnQ4KVJ4O30KLSNkZWZpbmUgICAgUEFDS19SR0IyNChyZ2JfcHRyLFJ4LEd4LEJ4KSB7cmdiX3B0clswXSA9IChNNFZJRklfVUludDgpUng7IHJnYl9wdHJbMV0gPVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KUd4OyByZ2JfcHRyWzJdID0gKE00VklGSV9VSW50OClCeDt9Ci0KLSNpZmRlZiBCSUdfRU5ESUFOCi0jZGVmaW5lICAgIFBBQ0tfUkdCNTY1KGEsIFJ4LCBHeCwgQngpICgoKFJ4ID4+IDMpIDw8ICgxMSArIChhKSkpXAotICAgICAgICAgICAgICAgICB8ICgoR3ggPj4gMikgPDwgKDUgKyAoYSkpKSB8ICgoQnggPj4gMykgPDwgKGEpKSkKLSNkZWZpbmUgICAgUEFDS19CR1I1NjUoYSwgUngsIEd4LCBCeCkgKCgoQnggPj4gMykgPDwgKDExICsgKGEpKSlcCi0gICAgICAgICAgICAgICAgIHwgKChHeCA+PiAyKSA8PCAoNSArIChhKSkpIHwgKChSeCA+PiAzKSA8PCAoYSkpKQotI2RlZmluZSBHRVRfUkdCNTY1KHIsIGcsIGIsIGRhdGEpIHtiID0gKChkYXRhKSAmIDMxKTsgZyA9XAotICAgICAgICAgICAgICAgICAgICAgKChkYXRhID4+IDUpICYgNjMpOyByID0gKChkYXRhID4+IDExKSAmIDMxKTt9Ci0jZGVmaW5lIEdFVF9CR1I1NjUoYiwgZywgciwgZGF0YSkgXAotICAgIHIgPSAoKGRhdGEpICYgMzEpOyBcCi0gICAgZyA9ICgoZGF0YSA+PiA1KSAmIDYzKTsgXAotICAgIGIgPSAoKGRhdGEgPj4gMTEpICYgMzEgKTsKLSNlbHNlIC8qIExJVFRMRSBlbmRpYW46IDB4MTIzNDU2NzggLT4gNzggNTYgMzQgMTIgKi8KLSNkZWZpbmUgICAgUEFDS19SR0I1NjUoYSwgUngsIEd4LCBCeCkgKCgoQnggPj4gMykgPDwgKDggKyAoYSkpKSBcCi0gICAgICAgICAgICAgICAgICB8ICgoKEd4ID4+IDIpJjB4NykgPDwgKDEzICsgKGEpKSkgfCAoKEd4ID4+IDUpIDw8IChhKSkgfCAoKFJ4ID4+IDMpIDw8ICgzICsgYSkpKQotI2RlZmluZSAgICBQQUNLX0JHUjU2NShhLCBSeCwgR3gsIEJ4KSAoKChSeCA+PiAzKSA8PCAoMTEgKyAoYSkpKSBcCi0gICAgICAgICAgICAgICAgICB8ICgoR3ggPj4gMikgPDwgKDUgKyAoYSkpKSB8ICgoQnggPj4gMykgPDwgKGEpKSkKLSNkZWZpbmUgR0VUX1JHQjU2NShyLCBnLCBiLCBkYXRhKSB7IGIgPSAoTTRWSUZJX1VJbnQ4KSgoKGRhdGEpICYgMHgxRjAwKSA+PiA4KTsgZyA9XAotICAgICAgICAgICAgIChNNFZJRklfVUludDgpKCgoKGRhdGEpICYgMHg3KSA8PCAzKSB8ICgoKGRhdGEpICYgMHhFMDAwKSA+PiAxMykpOyByID1cCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCkoKChkYXRhKSAmIDB4RjgpID4+IDMpO30KLSNkZWZpbmUgR0VUX0JHUjU2NShiLCBnLCByLCBkYXRhKSBcCi0gICAgYiA9ICgoZGF0YSkgJiAzMSk7IFwKLSAgICBnID0gKChkYXRhID4+IDUpICYgNjMpOyBcCi0gICAgciA9ICgoZGF0YSA+PiAxMSkgJiAzMSApOwotI2VuZGlmIC8qIEJJR19FTkRJQU4gKi8KLQotCi0jZGVmaW5lIENTVF9SR0JfMjRfU0laRSAzCi0jZGVmaW5lIFkyNChyLGcsYikgQ0xJUCgoICggKDE5NTk1ICogcikgKyAoMzg0NzAgKiBnKSArICg5NDM3ICogYikgKSA+PjE2KSkKLSNkZWZpbmUgVTI0KHIsZyxiKSBDTElQKDEyOCArICggKCAtKDExMDU5ICogcikgLSAoMjE3MDkgKiBnKSArICgzMjc2OCAqIGIpKSA+PjE2KSkKLSNkZWZpbmUgVjI0KHIsZyxiKSBDTElQKDEyOCArICggKCAoMzI3NjggKiByKSAtICgyNzQyNiAqIGcpIC0gKDUzMjkgKiBiKSkgID4+MTYpKQotI2RlZmluZSBHRVRfUkdCMjQocixnLGIscyxvKSByID0gc1tvXTsgZyA9IHNbbyArIDFdOyBiID0gc1tvICsgMl07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgTWFjcm8gZm9yIGNsaXBwaW5nIHVzaW5nIHRoZSBjbGlwcGluZyBtYXRyaXggZm9yIFJHQiB2YWx1ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKiBDbGlwIGZ1bmN0aW9uIGVuc3VyZXMgdmFsdWVzIHdpdGggcmFuZ2Ugb2YgMCBhbmQgMjU1ICovCi0jZGVmaW5lICAgICAgICBDTElQKHgpICAgICooTTRWSUZJX0NsaXBUYWJsZV96ZXJvICsgKHgpKQotI2RlZmluZSAgICAgICAgQ0xJUF9PVkYgICAgICAgIDUwMAotI2RlZmluZSAgICAgQ0xJUF9MVVRfU0laRSAgICAgKDI1NiArIDIgKiBDTElQX09WRikKLS8qKiBEaXZpc2lvbiB0YWJsZSBmb3IgUkdCNTY1IHRvIEhMUyBjb252ZXJzaW9uICovCi0jZGVmaW5lICAgICAgICBESVZDTElQKHgpICAgICooTTRWSUZJX0RpdlRhYmxlX3plcm8gKyAoeCkpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgRW5kaWFubmVzcyAoZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIExpdHRsZSBFbmRpYW4pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWYgKCFkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmICFkZWZpbmVkKEJJR19FTkRJQU4pKQotLyoqIERlZmF1bHQgZW5kaWFuIHNldHRpbmcgKi8KLSNkZWZpbmUgTElUVExFX0VORElBTgotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgT3RoZXIgbWFjcm9zIGFuZCBkZWZpbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKiBZVVYgcGxhbmUgaW5kZXggKi8KLSNkZWZpbmUgUExBTkVTICAgIDMKLSNkZWZpbmUgWVBsYW5lICAgIDAKLSNkZWZpbmUgVVBsYW5lICAgIDEKLSNkZWZpbmUgVlBsYW5lICAgIDIKLQotLyoqIENoZWNrIGZvciB2YWx1ZSBpcyBFVkVOICovCi0jaWZuZGVmIElTX0VWRU4KLSNkZWZpbmUgSVNfRVZFTihhKSAgICAoIShhICYgMHgwMSkpCi0jZW5kaWYKLQotLyogVXNlZCBmb3IgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gKi8KLSNpZm5kZWYgTUFYX1NIT1JUCi0jZGVmaW5lIE1BWF9TSE9SVCAgICAweDEwMDAwCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNFZJRklfREVGSU5FU19IXyAqLwotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfRGVmaW5lcy5oICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9GaWx0ZXJzQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRmlsdGVyc0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDJmYzlkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9GaWx0ZXJzQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFZJRklfRmlsdGVyc0FQSS5oCi0gKiBAYnJpZWYgICAgICAgIEV4dGVybmFsIEFQSSBhbmQgRGF0YSBkZWZpbml0aW9ucyBmb3IgdGhlIHZpZGVvIGZpbHRlciBsaWJyYXJ5Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYW5kIGRlY2xhcmVzIGRhdGEgY29tbW9uIHRvIHRoZSB2aWRlbyBmaWx0ZXIgbGlicmFyeToKLSAqICAgICAgICAgICAgICAgICAgICAtIyBkYXRhIHR5cGVzCi0gKiAgICAgICAgICAgICAgICAgICAgLSMgZXJyb3IgY29kZXMKLSAqICAgICAgICAgICAgICAgICAgICAtIyBleHRlcm5hbCBBUEkncwotICogICAgICAgICAgICAgICAgICAgIC0jIEFQSSBsZXZlbCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfTTRWSUZJX0ZJTFRFUlNBUElfSF8KLQotI2RlZmluZSBfTTRWSUZJX0ZJTFRFUlNBUElfSF8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLWV4dGVybiAiQyIgewotCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotICAgIC8qKgotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAqICAgICAgICAgICAgICAgICAgICBEYXRhIHR5cGVzIGRlZmluaXRpb24KLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqLwotCi0gICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE00VklGSV9VSW50ODsKLSAgICB0eXBlZGVmIGNoYXIgTTRWSUZJX0ludDg7Ci0gICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBNNFZJRklfVUludDE2OwotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBNNFZJRklfVUludDMyOwotICAgIHR5cGVkZWYgc2hvcnQgTTRWSUZJX0ludDE2OwotICAgIHR5cGVkZWYgbG9uZyBNNFZJRklfSW50MzI7Ci0gICAgdHlwZWRlZiBmbG9hdCBNNFZJRklfRmxvYXQ7Ci0gICAgdHlwZWRlZiBkb3VibGUgTTRWSUZJX0RvdWJsZTsKLSAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTTRWSUZJX0Vycm9yQ29kZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBFcnJvciBjb2RlcyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00VklGSV9PSyAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRWSUZJX0lOVkFMSURfUEFSQU0gICAgICAgICAgICA3Ci0jZGVmaW5lIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVCAgICAgICAgOAotI2RlZmluZSBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSCAgICAgICAgOQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIE90aGVyIGJhc2ljIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIENOU1QgICAgY29uc3QKLSNkZWZpbmUgRVhURVJOICAgIGV4dGVybgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgICAwCi0KLSNlbmRpZgotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgICAwCi0jZGVmaW5lIFRSVUUgICAgIUZBTFNFCi0KLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZXMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfSW1hZ2VQbGFuZQotICogQGJyaWVmICAgICAgICBUZXh0dXJlIChZVVYpIHBsYW5lcyBzdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZXRhaWxzIHRoZSBpbWFnZSBwbGFuZXMgZm9yIHRoZSBvdXRwdXQgdGV4dHVyZXM6Ci0gKiAgICAgICAgICAgICAgICBzaXplcyAoaW4gcGl4ZWxzKSBhcmUgbHVtYSBwbGFuZSBzaXplcywgdGhlIDMgcG9pbnRlcnMgcG9pbnQKLSAqICAgICAgICAgICAgICAgIHRvIHRoZSBZLCBVIGFuZCBWIGJ1ZmZlcnMgd2hpY2ggc3RvcmUgZGF0YSBpbiBwbGFuYXIgZm9ybWF0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQzMiB1X3dpZHRoOyAgIC8qKjwgV2lkdGggb2YgbHVtYSBpbiBwaXhlbCB1bml0ICovCi0gICAgICAgIE00VklGSV9VSW50MzIgdV9oZWlnaHQ7ICAvKio8IEhlaWdodCBvZiBsdW1hIGluIHBpeGVsIHVuaXQgKi8KLSAgICAgICAgTTRWSUZJX1VJbnQzMiB1X3RvcGxlZnQ7IC8qKjwgUG9pbnRlciB0byBmaXJzdCB0ZXh0dXJlIGFjdGl2ZSBwaXhlbCAqLwotICAgICAgICBNNFZJRklfVUludDMyIHVfc3RyaWRlOyAgLyoqPCBTdHJpZGUgdmFsdWUgKi8KLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwYWNfZGF0YTsgIC8qKjwgUG9pbnRlciB0byB0aGUgZGF0YSAqLwotICAgICAgICB9IE00VklGSV9JbWFnZVBsYW5lOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfRnJhbWluZ0RhdGEKLSAqIEBicmllZiAgICAgICAgRGF0YSBuZWNlc3NhcnkgdG8gYWRkIGFuIG92ZXJsYXkgb24gYW4gaW1hZ2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZXRhaWxzIHRoZSBwb3NpdGlvbiBhbmQgdGhlIGRhdGEgb2YgdGhlIG92ZXJsYXkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfVUludDMyCi0gICAgICAgICAgICBtX3hQb3NTdGVwOyAvKio8IFggcG9zaXRpb25pbmcgb2YgdGhlIG92ZXJsYXkgdnMgbWFpbiBwaWN0dXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFggcG9zaXRpb25pbmcgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2UgdnMgdGhlIG1haW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3hQb3NTdGVwIG11c3QgYmUgZXhwcmVzc2VkIGJ5IHN0ZXAgb2YgMSUgYW5kIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTAvKzUwJS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwJSBtZWFucyBvdmVybGF5IGlzIGNlbnRlcmVkIHZzIG1haW4gcGljdHVyZSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYIGFic2Npc3NhLiAqLwotICAgICAgICBNNFZJRklfVUludDMyCi0gICAgICAgICAgICBtX3lQb3NTdGVwOyAvKio8IFkgcG9zaXRpb25pbmcgb2YgdGhlIG92ZXJsYXkgdnMgbWFpbiBwaWN0dXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgcG9zaXRpb25pbmcgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2UgdnMgdGhlIG1haW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3hQb3NTdGVwIG11c3QgYmUgZXhwcmVzc2VkIGJ5IHN0ZXAgb2YgMSUgYW5kIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwLys1MCUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgbWVhbnMgb3ZlcmxheSBpcyBjZW50ZXJlZCB2cyBtYWluIHBpY3R1cmUgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSBhYnNjaXNzYS4gKi8KLQotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZQotICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgIG1faW1hZ2VQbGFuZTsgLyoqPCBQb2ludGVyIHRvIHRoZSBmcmFtaW5nIGltYWdlIHdpdGggYWxwaGEgY2hhbm5lbCAqLwotICAgICAgICB9IE00VklGSV9GcmFtaW5nRGF0YTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWSUZJX0hMU29mZnNldAotICogQGJyaWVmICAgICAgICBITFMgb2Zmc2V0IHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGhhdmUgdGhlIGh1ZSwgc2F0dXJhdGlvbiBhbmQgbGlnaHRuZXNzIHZhbHVlCi0gKiAgICAgICAgICAgICAgICBmb3IgcXVhbGl0eSBlbmhhbmNlbWVudC4gUmFuZ2Ugb2YgdmFsdWVzIG5lY2Nlc3NhcmlseSBiZQotICogICAgICAgICAgICAgICAgaHVlID0gLTM2MCB0byAzNjAsIHNhdCA9IDAgdG8gMTAwIGFuZCBsaWdodCA9IDAgdDAgMTAwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX0ludDE2IGh1ZTsgICAvKio8IEh1ZSBvZmZzZXQgKi8KLSAgICAgICAgTTRWSUZJX0ludDE2IHNhdDsgICAvKio8IFNhdHVyYXRpb24gb2Zmc2V0ICovCi0gICAgICAgIE00VklGSV9JbnQxNiBsaWdodDsgLyoqPCBMaWdodCBvZmZzZXQgKi8KLSAgICAgICAgfSBNNFZJRklfSExTb2Zmc2V0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfVHJhbmZvcm1hdGlvbgotICogQGJyaWVmICAgICAgICBJbWFnZSBUcmFuZm9ybWF0aW9uIFN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIEltYWdlIFRyYW5mb3JtYXRpb24gUmVxdWVzdAotICogICAgICAgICAgICAgICAgcm90YXRpb24gOiAxIC0+ICs5MGRlZyBSb3RhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIC0xIC0+IC05MGRlZyBSb3RhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0+ICBObyBSb3RhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9JbnQzMiBpMzJfcm90YXRpb247IC8qKjwgUm90YXRpb24gRmxhZyAgICAgICAgKi8KLSAgICAgICAgfSBNNFZJRklfVHJhbmZvcm1hdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWSUZJX3BDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIE5ldyBTdHJ1Y3R1cmVzCi0gKiBAbm90ZSAgICAgICAgLSMgU3RydWN0dXJlIG9mIE00VklGSV9ITFNvZmZzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfSExTb2Zmc2V0IGhsc09mZnNldDsgLyoqPCBITFMgb2Zmc2V0IHN0cnVjdHVyZSAqLwotICAgICAgICB9IE00VklGSV9wQ29udGV4dDsKLQotICAgIC8qCi0gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIEFQSSBmdW5jdGlvbnMKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqLwotCi0gICAgLyoqPCBFZmZlY3QgZmlsdGVycyAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2VwaWFZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db250cmFzdFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX05lZ2F0aXZlWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfRmxpcFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX01pcnJvcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTE4MFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db2xvclJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db2xvckdZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db2xvckJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9GcmFtaW5nUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfRnJhbWluZ1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRIdWVJbllVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db2xkWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfV2FybVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotLyogICAgICAgICAgICAgICAgQURTIENvbXBpbGVyICAgICAgICAgICAgICAgICovCi0KLS8qICAgICAgICBHZW5lcmljIEFSTSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0jaWYgZGVmaW5lZCBBRFNfQVJNCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFJHQjg4OHRvUkdCODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgUkdCNTY1dG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUkdCNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjBBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJHUjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwQWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMiB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0QWRzQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRBZHNBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5CR1I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSNkZWZpbmUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjBBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1VZVll0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9VWVZZdG9ZVVY0MjBBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9SR0I1NjVBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybQotCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luUkdCNTY1QWRzQXJtCi0jZGVmaW5lIE00VklGSV9TZXRITFNpbkJHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtCi0KLS8qICAgICAgICBBUk05RSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0jZWxpZiBkZWZpbmVkIEFEU19BUk05RQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCR1I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMiB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0QWRzQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEFkc0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0QWRzQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBZVVY0MjB0b1lVVjQyMCBmcm9tIFFDSUYgdG8gUVZHQSovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBIHdpdGggcm90YXRpb24gKzkwKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlJBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBIHdpdGggcm90YXRpb24gLTkwKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkxBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0vKiogUmVzaXplcyBZVVY0MjAgUGxhbmFyIEltYWdlIGFuZCBzdG9yZXMgaW4gWVVWNDIwIExpbmVhciBmb3JtYXQgd2l0aC93aXRob3V0ICtvci05MCByb3RhdGlvbiovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhckFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9CR1I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1VZVll0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9VWVZZdG9ZVVY0MjBBZHNBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvQkdSNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luUkdCNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpbkJHUjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUkFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhciAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUGxhbmFydG9ZVVY0MjBMaW5lYXJBZHNBcm05RQotLyogICAgICAgICAgICAgICAgR0NDIENvbXBpbGVyICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgR2VuZXJpYyBBUk0gYXNzZW1ibHkgZnVuY3Rpb25zICAgICAgICAqLwotCi0jZWxpZiBkZWZpbmVkIEdDQ19BUk0KLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMEdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEdjY0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEdjY0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMEdjY0FybQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b0JHUjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luUkdCNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9TZXRITFNpbkJHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtCi0KLS8qICAgICAgICBBUk05RSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0jZWxpZiBkZWZpbmVkIEdDQ19BUk05RQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJHUjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwR2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0R2NjQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjBHY2NBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvQkdSNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpbkJHUjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luUkdCNTY1R2NjQXJtOUUKLQotLyogVEkgQ0NTIGFzc2VtYmx5IGZpbGVzICovCi0jZWxpZiBkZWZpbmVkIFRJNDExX0FSTTlFCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIChQbGFuYXIpIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCAoUGxhbmFyKSB0byBSZXNpemVkIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIChQbGFuYXIpIHRvIFJlc2l6ZWQgUkdCODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAoUGxhbmFyKSB0byBSZXNpemVkIGFuZCBSb3RhdGVkICgtOTApIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMChQbGFuYXIpIHRvIFJlc2l6ZWQgYW5kIFJvdGF0ZWQgKCs5MCkgUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0KAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwKFBsYW5hcikgdG8gUmVzaXplZCBZVVY0MjAoUGxhbmFyKSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgWVVWNDIwKFBsYW5hcikgb2YgUUNJRiB0byBSR0I1NjUgb2YgUVZHQSByZXNvbHV0aW9uICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0vKiogUmVzaXplIFlVVjQyMChQbGFuYXIpIG9mIFFDSUYgdG8gUkdCNTY1IG9mIFFWR0EgcmVzb2x1dGlvbiB3aXRoIHJvdGF0aW9uKC05MCkgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkwodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLS8qKiBSZXNpemUgWVVWNDIwKFBsYW5hcikgb2YgUUNJRiB0byBSR0I1NjUgb2YgUVZHQSByZXNvbHV0aW9uIHdpdGggcm90YXRpb24oKzkwKSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUih2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NVRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdFRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0VGk0MTFBcm05RQotCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBVGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQSAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQVRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkwgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMVGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUiAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlJUaTQxMUFybTlFCi0KLS8qICAgICAgICBBTlNJIEMgRnVuY3Rpb25zICAgICAgICAqLwotI2Vsc2UKLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQlJHNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJSRzg4OCB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLSAgICAvKiogUkdCODg4IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pOwotCi0gICAgLyoqIFlVVjQyMiB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1VZVll0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSMjQgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSMjQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gUkdCMjQgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCMjQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9ZVVY0MjAgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0Eodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSB3aXRoIHJvdGF0aW9uICs5MCovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiAtOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0vKiogUmVzaXplcyBZVVY0MjAgUGxhbmFyIEltYWdlIGFuZCBzdG9yZXMgaW4gWVVWNDIwIExpbmVhciBmb3JtYXQgd2l0aC93aXRob3V0ICtvci05MCByb3RhdGlvbiovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhcih2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLS8qKiBSZXNpemVzIFlVVjQyMCBQbGFuYXIgSW1hZ2UgYW5kIHN0b3JlcyBpbiBZVVY0MjIgSW50ZXJsZWF2ZWQgZm9ybWF0Ci0gICAgIHdpdGgvd2l0aG91dCArb3ItOTAgcm90YXRpb24qLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFydG9ZVVY0MjJJbnRlcmxlYXZlZCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0jZW5kaWYKLQotICAgIC8qKiBkZWZpbml0aW9uIG9mIHRoZSBjb252ZXJ0ZXIgZnVuY3Rpb24gdHlwZXMgKi8KLQotICAgIHR5cGVkZWYgTTRWSUZJX1VJbnQ4IE00VklGSV9QbGFuQ29udmVydGVyRnVuY3Rpb25UeXBlKHZvaWQKLSAgICAgICAgKnBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogaW4sIE00VklGSV9JbWFnZVBsYW5lKiBvdXQpOwotCi0gICAgLyoqIGRlZmluaXRpb24gb2YgdGhlIHByZXByb2Nlc3NpbmcgZnVuY3Rpb24gdHlwZXMgKi8KLSAgICB0eXBlZGVmIE00VklGSV9VSW50OCBNNFZJRklfUHJlcHJvY2Vzc0Z1bmN0aW9uVHlwZSh2b2lkCi0gICAgICAgICpwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIGluLCBNNFZJRklfSW1hZ2VQbGFuZSogb3V0KTsKLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hclRvWVVWNDIwU2VtaXBsYW5hcih2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2VtaXBsYW5hcllVVjQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLQotfQotCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9NNFZJRklfRklMVEVSU0FQSV9IXyAqLwotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfRmlsdGVyc0FQSS5oICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZQUF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VlBQX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjVjYTIyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VlBQX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZQUF9BUEkuaAotICogQGJyaWVmICAgIFZpZGVvIHByZXByb2Nlc3NpbmcgQVBJIHB1YmxpYyBmdW5jdGlvbnMgcHJvdG90eXBlcy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00VlBQX0FQSV9ICi0jZGVmaW5lIE00VlBQX0FQSV9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIiAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgY29tbW9uIE9TQUwgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIiAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgY29tbW9uIE9TQUwgZXJyb3JzICovCi0KLS8qKgotICogICAgSW5jbHVkZSBWaWRlbyBmaWx0ZXJzIGludGVyZmFjZSBkZWZpbml0aW9uIChmb3IgdGhlIE00VklGSV9JbWFnZVBsYW5lIHR5cGUpICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUHVibGljIHR5cGUgb2YgdGhlIFZpZGVvIFByZXByb2Nlc3NpbmcgZXhlY3V0aW9uIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX1ZvaWQqICAgIE00VlBQX0NvbnRleHQ7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE00VlBQX2tJWVVWNDIwPTAsICAgIC8qKjwgWVVWIDQ6MjowIHBsYW5hciAoc3RhbmRhcmQgaW5wdXQgZm9yIG1wZWctNCB2aWRlbykgKi8KLSAgICBNNFZQUF9rSVlVVjQyMiwgICAgICAgIC8qKjwgWVVWNDIyIHBsYW5hciAqLwotICAgIE00VlBQX2tJWVVZViwgICAgICAgIC8qKjwgWVVWNDIyIGludGVybGFjZWQsIGx1bWEgZmlyc3QgKi8KLSAgICBNNFZQUF9rSVVZVlksICAgICAgICAvKio8IFlVVjQyMiBpbnRlcmxhY2VkLCBjaHJvbWEgZmlyc3QgKi8KLSAgICBNNFZQUF9rSUpQRUcsICAgICAgICAvKio8IEpQRUcgY29tcHJlc3NlZCBmcmFtZXMgKi8KLSAgICBNNFZQUF9rSVJHQjQ0NCwgICAgICAgIC8qKjwgUkdCIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNFZQUF9rSVJHQjU1NSwgICAgICAgIC8qKjwgUkdCIDE1IGJpdHMgNTo1OjUgKi8KLSAgICBNNFZQUF9rSVJHQjU2NSwgICAgICAgIC8qKjwgUkdCIDE2IGJpdHMgNTo2OjUgKi8KLSAgICBNNFZQUF9rSVJHQjI0LCAgICAgICAgLyoqPCBSR0IgMjQgYml0cyA4Ojg6OCAqLwotICAgIE00VlBQX2tJUkdCMzIsICAgICAgICAvKio8IFJHQiAzMiBiaXRzICAqLwotICAgIE00VlBQX2tJQkdSNDQ0LCAgICAgICAgLyoqPCBCR1IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00VlBQX2tJQkdSNTU1LCAgICAgICAgLyoqPCBCR1IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00VlBQX2tJQkdSNTY1LCAgICAgICAgLyoqPCBCR1IgMTYgYml0cyA1OjY6NSAqLwotICAgIE00VlBQX2tJQkdSMjQsICAgICAgICAvKio8IEJHUiAyNCBiaXRzIDg6ODo4ICovCi0gICAgTTRWUFBfa0lCR1IzMiAgICAgICAgLyoqPCBCR1IgMzIgYml0cyAgKi8KLX0gTTRWUFBfSW5wdXRWaWRlb0Zvcm1hdDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBQcm90b3R5cGUgb2YgdGhlIG1haW4gdmlkZW8gcHJlcHJvY2Vzc2luZyBmdW5jdGlvbgotICogQG5vdGUgICAgUHJlcHJvY2VzcyBvbmUgZnJhbWUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgVlBQLgotICogQHBhcmFtICAgIHBQbGFuZUluOiAgICAoSU5PVVQpICAgIElucHV0IEltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0OiAgICAoSU5PVVQpICAgIE91dHB1dCBJbWFnZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZQUF9hcHBseV9mY3QpIChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9pbml0VmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQqIHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbmV3IGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgVmlkZW8gUHJlcHJvY2Vzc2luZyBjb21wb25lbnQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoT1VUKSBFeGVjdXRpb24gY29udGV4dCBhbGxvY2F0ZWQgYnkgdGhlIGZ1bmN0aW9uLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeS4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBOVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfaW5pdFZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0KiBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlBQX2FwcGx5VmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICAgUHJlcHJvY2VzcyBvbmUgZnJhbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIHBQbGFuZUluOiAgICAoSU5PVVQpICAgIElucHV0IEltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0OiAgICAoSU5PVVQpICAgIE91dHB1dCBJbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwUGxhbmVJbiBvciBwUGxhbmVPdXQgaXMgTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiBWaWRlbyBQcmVwcm9jZXNzaW5nIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfYXBwbHlWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWUFBfY2xlYW5VcFZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGZyZWVzIHRoZSBleGVjdXRpb24gY29udGV4dCBmb3IgdGhlIFZpZGVvIFByZXByb2Nlc3NpbmcgY29tcG9uZW50LgotICogICAgICAgICAgICBBbnkgZnVydGhlciB1c2FnZSBvZiB0aGUgY29udGV4dCB3aWxsIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSByZXN1bHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBOVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfY2xlYW5VcFZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWUFBfc2V0VmlkZW9QcmVwcm9jZXNzaW5nTW9kZShNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZFU19JbnB1dFZpZGVvRm9ybWF0IGZvcm1hdCkKLSAqIEBicmllZiAgICBUaGlzIG1ldGhvZCBhcHBseSB0aGUgdmlkZW8gcHJlcHJvY2Vzc2luZyB0byB0aGUgaW5wdXQgcGxhbmUuIFJlc3VsdCBpcyBwdXQgaW50byB0aGUKLSAqICAgICAgICAgICBvdXRwdXQgcGxhbi4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgICBmb3JtYXQgIDogICAgKElOKSBGb3JtYXQgb2YgaW5wdXQgcGxhbmUgKHJnYiwgeXV2LCAuLi4pCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlBQX3NldFZpZGVvUHJlcHJvY2Vzc2luZ01vZGUoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWUFBfSW5wdXRWaWRlb0Zvcm1hdCBmb3JtYXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBEZWZpbml0aW9uIG9mIHRoZSBlcnJvcnMgc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKio8IElucHV0IGFuZCBvdXRwdXQgcGxhbmVzIGhhdmUgaW5jb21wYXRpYmxlIHByb3BlcnRpZXMgKi8KLSNkZWZpbmUgTTRWUFBfRVJSX0lNQ09NUEFUSUJMRV9JTl9BTkRfT1VUX1BMQU5FUyAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICBNNFBSRVBST0NFU1NfVklERU8sIDB4MDAwMDAxKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIE00VlBQX0FQSV9IICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000V1JJVEVSX2NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRXUklURVJfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiYjdiODYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRXUklURVJfY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFdSSVRFUl9jb21tb24uaAotICogQGJyaWVmICAgIFZFUyB3cml0ZXJzIHNoZWxsIGludGVyZmFjZS4KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0eXBlcyBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIFZFUyB0byBhYnN0cmFjdCB3cml0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000V1JJVEVSX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNFdSSVRFUl9DT01NT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIiAgIC8qIGZvciBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIgICAvKiBmb3IgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKi8KLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIiAgICAgLyogZm9yIE00T1NBX09QVElPTl9JRF9DUkVBVEUoKSAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIiAgICAgICAvKiBmb3IgTTRXUklURVJfQ09NTU9OICovCi0KLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIgICAgICAgLyogZm9yIE00U1lTX1N0cmVhbUlEICovCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIiAgIC8qIGZvciBNNFNZU19BY2Nlc3NVbml0ICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTVA0VyBFcnJvcnMgJiBXYXJuaW5ncyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNFdBUl9XUklURVJfU1RPUF9SRVEgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFdSSVRFUl9DT01NT04gLDB4MDAwMDAxKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBvdXRwdXQgZmlsZSBmb3JtYXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRXUklURVJfa1Vua25vd249LTEsCi0gICAgTTRXUklURVJfazNHUFA9MCwgICAgICAgICAgICAvKio8IDNHUFAgY29tcGxpYW50IGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rQVZJPTEsICAgICAgICAgICAgLyoqPCBBVkkgZmlsZSAqLwotICAgIE00V1JJVEVSX2tBTVI9MiwgICAgICAgICAgICAvKio8IEFNUiBmaWxlICovCi0gICAgTTRXUklURVJfa05FVFdPUkszR1BQPTMsICAgIC8qKjwgM0dQUCB2aWEgVENQICovCi0gICAgTTRXUklURVJfa1BDTT00LCAgICAgICAgICAgIC8qKjwgUENNIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rSlBFRz01LCAgICAgICAgICAgIC8qKjwgSlBFRyBFWElGIHdyaXRlciAqLwotICAgIE00V1JJVEVSX2tNUDM9NiwgICAgICAgICAgICAvKio8IE1QMyB3cml0ZXIgKi8KLQotICAgIE00V1JJVEVSX2tUeXBlX05CICAvKiBudW1iZXIgb2Ygd3JpdGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLQotfSBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgIE00V1JJVEVSX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtcyBkZWZpbmVzIGFsbCBhdmFsYWlibGUgb3B0aW9ucy4gQWxsIHRoZSByZXV0dXJuZWQgdmFsdWVzIGFyZSBpbgotICogICAgICAgICAgIE00T1NBX1VJbnQzMiB0eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRXUklURVJfa01heEFVU2l6ZSAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEfE00X1dSSVRFLCBNNFdSSVRFUl9DT01NT04sIDB4MDEpLAotICAgIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRHxNNF9XUklURSwgTTRXUklURVJfQ09NTU9OLCAweDAyKSwKLSAgICBNNFdSSVRFUl9rRmlsZVNpemUgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICAgICAgICAgICAgLCBcCi0gICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwMyksICAvKio8IEZpbGUgc2l6ZSBpZiB0aGUgcHJvY2VzcyB3YXMgZW5kZWQgd2hlbiB3ZSBjYWxsIHRoZSBtZXRob2QgKi8KLSAgICBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZD0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRCAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA0KSwgICAgLyoqPCBGaWxlIHNpemUgaWYgdGhlIHByb2Nlc3Mgd2FzIGVuZGVkIHdoZW4gd2UgY2FsbCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGVzdGltYXRlZCBzaXplIGZvciBhdWRpbyAqLwotICAgIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZyAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwNSksICAgIC8qKjwgU3RyaW5nIGVtYmVkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUoU1cgLSBWRVMpICovCi0gICAgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA2KSwgICAgLyoqPCBWZXJzaW9uIGVtYmVkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rSW50ZWdyYXRpb25UYWcgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDcpLCAgICAvKio8IFN0cmluZyBlbWJlZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIChjaGFyWzYwXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW50ZWdyYXRpb24gcHVycG9zZSkgKi8KLSAgICBNNFdSSVRFUl9rTWF4RmlsZVNpemUgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA4KSwgICAgLyoqPCBNYXhpbXVtIGZpbGUgc2l6ZSBsaW1pdGF0aW9uICovCi0gICAgTTRXUklURVJfa01heEZpbGVEdXJhdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA5KSwgICAgLyoqPCBNYXhpbXVtIGZpbGUgZHVyYXRpb24gbGltaXRhdGlvbiAqLwotICAgIE00V1JJVEVSX2tTZXRGdHlwQm94ICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwQSksICAgIC8qKjwgU2V0ICdmdHlwJyBhdG9tICovCi0gICAgTTRXUklURVJfa01ldGFEYXRhICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEIpLCAgICAvKio8IEFkZGl0aW9ubmFsIGluZm9ybWF0aW9uIHRvIHNldCBpbiB0aGUgZmlsZSAqLwotICAgIE00V1JJVEVSX2tEU0kgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLCBcCi0gICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwQyksICAgIC8qKjwgVG8gc2V0IERTSSBvZiB0aGUgZmlsZSAoRGVjb2RlciBzcGVjaWZjIGluZm8pICovCi0gICAgTTRXUklURVJfa0pwZWdSZXNlcnZlRlBEYXRhICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBEKSwgICAgLyoqPCBSZXNlcnZlIHNvbWUgc3BhY2UgaW4gdGhlIGZpbGUgZm9yIEpQRUcgZmFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgZGF0YSAqLwotICAgIE00V1JJVEVSX2tKcGVnU2V0RlBEYXRhICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBFKSwgICAgLyoqPCBXcml0ZSBGYXN0IFByb2Nlc3NpbmcgRGF0YSBpbiB0aGUgZmlsZSovCi0gICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLSAgICBNNFdSSVRFUl9rTVVMX1BQU19TUFMgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLCBNNFdSSVRFUl9DT01NT04sIDB4MEYpCi0gICAgLyogLSBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLX0gTTRXUklURVJfT3B0aW9uSUQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfSGVhZGVyCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYnVmZmVyIHdoZXJlIGFuIGhlYWRlciBpcyBwdXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwQnVmOyAgICAgICAgLyoqPCBCdWZmZXIgZm9yIHRoZSBoZWFkZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZGF0YSAqLwotfSBNNFdSSVRFUl9IZWFkZXI7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNwZWNpZmljIHZpZGVvIHN0cmVhbSBpbmZvcywgZXh0ZW5zaW9uIHRvCi0gKiAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgIHdpZHRoOyAgICAgICAgICAgICAgICAvKio8IEZyYW1lIFdpZHRoICovCi0gICAgTTRPU0FfRG91YmxlICAgIGZwczsgICAgICAgICAgICAgICAgLyoqPCBUYXJnZXR0ZWQgZnJhbWVyYXRlIG9mIHRoZSB2aWRlbyAqLwotICAgIE00V1JJVEVSX0hlYWRlciAgICBIZWFkZXI7ICAgICAgICAgICAgICAgIC8qKjwgU2VxdWVuY2UgaGVhZGVyIG9mIHRoZSB2aWRlbyBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyIHNldCB0byBOVUxMIGlmIG5vIGhlYWRlciBwcmVzZW50ICovCi19IE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNwZWNpZmljIGF1ZGlvIHN0cmVhbSBpbmZvcywgZXh0ZW5zaW9uIHRvCi0gICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiAgICBuYlNhbXBsZXNQZXJTZWM7ICAgIC8qKjwgTnVtYmVyIG9mIFNhbXBsZXMgcGVyIHNlY29uZCAqLwotICAgIE00T1NBX1VJbnQxNiAgICBuYkJpdHNQZXJTYW1wbGU7ICAgIC8qKjwgTnVtYmVyIG9mIEJpdHMgaW4gMSBzYW1wbGUgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgbmJDaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE00V1JJVEVSX0hlYWRlciAgICBIZWFkZXI7ICAgICAgICAgICAgICAgIC8qKjwgRGVjb2RlciBTcGVjaWZpYyBJbmZvIG9mIHRoZSBhdWRpb3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlciBzZXQgdG8gTlVMTCBpZiBubyBEU0kgcHJlc2VudCAqLwotfSBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRXUklURVJfT3JpZW50YXRpb24KLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgb3JpZW50YXRpb24gb2YgYSBmcmFtZSBhcyBkZXNjcmliZWQKLSAqICAgICAgICAgICAgaW4gdGhlIEVYSUYgc3RhbmRhcmQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRXUklURVJfT3JpZW50YXRpb25Vbmtub3duID0gMCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblRvcExlZnQsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25Ub3BSaWdodCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvbkJvdHRvbVJpZ2h0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uQm90dG9tTGVmdCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvbkxlZnRUb3AsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25SaWdodFRvcCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblJpZ2h0Qm90dG9tLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uTGVmdEJvdHRvbQotfU00V1JJVEVSX09yaWVudGF0aW9uIDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfTWV0YURhdGEKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgbWV0YSBkYXRhIHRvIHN0b3JlIGluIHRoZSBlbmNvZGVkIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgUGhvbmVNYW51ZmFjdHVyZXIgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIFBob25lTW9kZWwgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIEFydGlzdCA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgQ29weXJpZ2h0IDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBTb2Z0d2FyZSA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgQ3JlYXRpb25EYXRlOwotICAgIE00V1JJVEVSX09yaWVudGF0aW9uICAgIE9yaWVudGF0aW9uIDsKLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIFdpZHRoIDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBIZWlnaHQgOwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgVGh1bWJuYWlsV2lkdGggOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIFRodW1ibmFpbEhlaWdodCA7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBUaHVtYm5haWxQcmVzZW5jZSA7Ci19TTRXUklURVJfTWV0YURhdGE7Ci0KLQotdHlwZWRlZiB2b2lkKiBNNFdSSVRFUl9Db250ZXh0OwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfb3BlbldyaXRlKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQqIGhDb250ZXh0LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dHB1dEZpbGVEZXNjcmlwdG9yLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlclBvaW50ZXIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdGVtcEZpbGVEZXNjcmlwdG9yLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZGVyUG9pbnRlcik7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfYWRkU3RyZWFtKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qc3RyZWFtRGVzY3JpcHRpb24pOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX3N0YXJ0V3JpdGluZykgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9jbG9zZVdyaXRlKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9zZXRPcHRpb24pICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX2dldE9wdGlvbikgICAgICAgIChNNFdSSVRFUl9Db250ZXh0ICBwQ29udGV4dCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgYSB3cml0ZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000V1JJVEVSX0dsb2JhbEludGVyZmFjZQotewotICAgIE00V1JJVEVSX29wZW5Xcml0ZSogICAgICAgICAgICAgcEZjdE9wZW47Ci0gICAgTTRXUklURVJfYWRkU3RyZWFtKiAgICAgICAgICAgICAgICBwRmN0QWRkU3RyZWFtOwotICAgIE00V1JJVEVSX3N0YXJ0V3JpdGluZyogICAgICAgICAgcEZjdFN0YXJ0V3JpdGluZzsKLSAgICBNNFdSSVRFUl9jbG9zZVdyaXRlKiAgICAgICAgICAgIHBGY3RDbG9zZVdyaXRlOwotICAgIE00V1JJVEVSX3NldE9wdGlvbiogICAgICAgICAgICAgICAgcEZjdFNldE9wdGlvbjsKLSAgICBNNFdSSVRFUl9nZXRPcHRpb24qICAgICAgICAgICAgICAgIHBGY3RHZXRPcHRpb247Ci19IE00V1JJVEVSX0dsb2JhbEludGVyZmFjZTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgIE00V1JJVEVSX3N0YXJ0QVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci10eXBlZGVmIE00T1NBX0VSUiAgTTRXUklURVJfcHJvY2Vzc0FVKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCB0byB3cml0ZSBkYXRhIHdpdGggYSB3cml0ZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000V1JJVEVSX0RhdGFJbnRlcmZhY2UKLXsKLSAgICBNNFdSSVRFUl9zdGFydEFVKiAgICBwU3RhcnRBVTsKLSAgICBNNFdSSVRFUl9wcm9jZXNzQVUqIHBQcm9jZXNzQVU7Ci0KLSAgICBNNFdSSVRFUl9Db250ZXh0ICAgIHBXcml0ZXJDb250ZXh0OwotCi19IE00V1JJVEVSX0RhdGFJbnRlcmZhY2U7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRXUklURVJfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0JpdFN0cmVhbVBhcnNlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQml0U3RyZWFtUGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NzU0NTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQml0U3RyZWFtUGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRfQml0U3RyZWFtUGFyc2VyLmgKLSAqIEBicmllZiAgTVBFRy00IEZpbGUgRm9ybWF0IGJpdCBzdHJlYW0gdXRpbGl0eQotICogQG5vdGUgICBUaGlzIGZpbGUgY29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZCB0byBwYXJzZSBNUEVHIHNwZWNpZmljCi0gKiAgICAgICAgIGRhdGEgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRfQklUU1RSRUFNUEFSU0VSX0hfXwotI2RlZmluZSBfX000X0JJVFNUUkVBTVBBUlNFUl9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLS8qKgotKiBNNF9CaXRTdHJlYW1QYXJzZXJfSW5pdC4KLSoKLSogQWxsb2NhdGVzIHRoZSBjb250ZXh0IGFuZCBpbml0aWFsaXplcyBpbnRlcm5hbCBkYXRhCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZSAtIEFMTE9DQVRFRCBCWSBUSEUKLSogICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIChNNE9TQV9OVUxMIGlmIGFsbG9jYXRpb24gZmFpbHMpCi0qIEBwYXJhbSBiaXRTdHJlYW0gIDogQSBwb2ludGVyIHRvIHRoZSBiaXRzdHJlYW0gLSBtdXN0IGJlIDMyIGJpdHMgYXMgYWNjZXNzIGFyZSAzMiBiaXRzCi0qIEBwYXJhbSBzaXplICAgICAgICA6IFRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSoKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9Jbml0KHZvaWQqKiBwQ29udGV4dCwgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENsZWFuIHVwIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSAgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdm9pZCBNNF9CaXRTdHJlYW1QYXJzZXJfQ2xlYW5VcCh2b2lkKiBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFJlYWQgdGhlIG5leHQgPGxlbmd0aD4gYml0cyBpbiB0aGUgYml0c3RyZWFtLgotICogQG5vdGUgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbGVuZ3RoICAgICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0cyB0byBleHRyYWN0IGZyb20gdGhlIGJpdHN0cmVhbQotICogQHJldHVybiAgICB0aGUgcmVhZCBiaXRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyIE00X0JpdFN0cmVhbVBhcnNlcl9TaG93Qml0cyh2b2lkKiBwQ29udGV4dCwgTTRPU0FfSW50MzIgbGVuZ3RoKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5jcmVtZW50IHRoZSBiaXRzdHJlYW0gcG9pbnRlciBvZiA8bGVuZ3RoPiBiaXRzLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHBhcmFtICAgIGxlbmd0aCAgICAgICAgKElOKSBUaGUgbnVtYmVyIG9mIGJpdCB0byBzaGlmdCB0aGUgYml0c3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdm9pZCBNNF9CaXRTdHJlYW1QYXJzZXJfRmx1c2hCaXRzKHZvaWQqIHBDb250ZXh0LCBNNE9TQV9JbnQzMiBsZW5ndGgpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgcG9pbnRlZCBieSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBJdCBkb2VzIG5vdCB1cGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0gKiBAcGFyYW0gbGVuZ3RoICAgICAgICA6IFRoZSBudW1iZXIgb2YgYml0IHRvIGV4dHJhY3QgZnJvbSB0aGUgYml0c3RyZWFtCi0gKgotICogQHJldHVybnMgdGhlIHJlYWQgYml0cwotKi8KLU00T1NBX1VJbnQzMiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0Qml0cyh2b2lkKiBwQ29udGV4dCxNNE9TQV9JbnQzMiBiaXRQb3MsIE00T1NBX0ludDMyIGxlbmd0aCk7Ci0KLS8qKgotKiBNNF9CaXRTdHJlYW1QYXJzZXJfUmVzdGFydCByZXNldHMgdGhlIGJpdHN0cmVhbSBpbmRleGVzLgotKgotKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSoKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9SZXN0YXJ0KHZvaWQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIHBvaW50ZWQgYnkgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogQHJldHVybnMgcG9pbnRlciB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgYml0c3RyZWFtCi0gKiBAbm90ZSAgICBJdCBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIGJpdHN0cmVhbSBpdHNlbGYKLSAqICAgICAgICAgICAgYW5kIG5vIGNvcHkgaXMgbWFkZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSAgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0qLwotTTRPU0FfVUludDgqICBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0Q3VycmVudGJpdFN0cmVhbVBvaW50ZXIodm9pZCogcENvbnRleHQpOwotCi0vKioKLSogTTRfQml0U3RyZWFtUGFyc2VyX0dldFNpemUgZ2V0cyB0aGUgc2l6ZSBvZiB0aGUgYml0c3RyZWFtIGluIGJ5dGVzCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZQotKgotKiBAcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYml0c3RyZWFtIGluIGJ5dGVzCi0qLwotTTRPU0FfSW50MzIgTTRfQml0U3RyZWFtUGFyc2VyX0dldFNpemUodm9pZCogcENvbnRleHQpOwotCi12b2lkIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0luaXQodm9pZCoqIHBDb250ZXh0LCB2b2lkKiBwQml0U3RyZWFtLCBNNE9TQV9JbnQzMiBzaXplKTsKLQotLyoqCi0qIGdldE1wZWdMZW5ndGhGcm9tSW50ZWdlciByZXR1cm5zIGEgZGVjb2RlZCBzaXplIHZhbHVlIGZyb20gYW4gZW5jb2RlZCBvbmUgKFNETCkKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0qIEBwYXJhbSB2YWwgOiBlbmNvZGVkIHZhbHVlCi0qCi0qIEByZXR1cm5zIHNpemUgaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtCi0qLwotCi1NNE9TQV9JbnQzMiBNNF9NUEVHNEJpdFN0cmVhbVBhcnNlcl9HZXRNcGVnTGVuZ3RoRnJvbUludGVnZXIodm9pZCogcENvbnRleHQsIE00T1NBX1VJbnQzMiB2YWwpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIERlY29kZSBhbiBNUEVHNCBTeXN0ZW1zIGRlc2NyaXB0b3Igc2l6ZSBmcm9tIGFuIGVuY29kZWQgU0RMIHNpemUgZGF0YS4KLSAqIEBub3RlICAgIFRoZSB2YWx1ZSBpcyByZWFkIGZyb20gdGhlIGN1cnJlbnQgYml0c3RyZWFtIGxvY2F0aW9uLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICAgU2l6ZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9JbnQzMiBNNF9NUEVHNEJpdFN0cmVhbVBhcnNlcl9HZXRNcGVnTGVuZ3RoRnJvbVN0cmVhbSh2b2lkKiBwQ29udGV4dCk7Ci0KLSNlbmRpZiAvKl9fTTRfQklUU1RSRUFNUEFSU0VSX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2MGE3ZGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRfQ29tbW9uLmgKLSAqIEBicmllZiAgQ29tbW9uIGRhdGEgc3RydWN0dXJlIGJldHdlZW4gc2hlbGxzCi0gKiBAbm90ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRfQ09NTU9OX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgX3BhcmFtZXRlclNldAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGF2YwotICogICAgICAgICAgICAgICBkZWNvZGVyIHNwZWNpZmljIGluZm8KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX3BhcmFtZXRlclNldAotewotICAgIE00T1NBX1VJbnQxNiBtX2xlbmd0aDsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGl0ZW1zKi8KLSAgICBNNE9TQV9VSW50OCogbV9wUGFyYW1ldGVyU2V0VW5pdDsgICAvKiBBcnJheSBvZiBpdGVtcyovCi19IFBhcmFtZXRlclNldCA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIF9hdmNTcGVjaWZpY0luZm8KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHNwZWNpZmljIGluZm8gZm9yIHRoZSBhdmMgZGVjb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvCi17Ci0gICAgTTRPU0FfVUludDggICAgICAgIG1fbmFsVW5pdExlbmd0aDsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBOQUxVbml0TGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiBhIEFWQyBzYW1wbGUgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV9udW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsgICAvKiBOdW1iZXIgb2Ygc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICBtX251bU9mUGljdHVyZVBhcmFtZXRlclNldHM7ICAgIC8qIE51bWJlciBvZiBwaWN0dXJlIHBhcmFtZXRlciBzZXRzKi8KLSAgICBQYXJhbWV0ZXJTZXQgICAgKm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0OyAgICAgICAgLyogU2VxdWVuY2UgcGFyYW1ldGVyIHNldHMgYXJyYXkqLwotICAgIFBhcmFtZXRlclNldCAgICAqbV9wUGljdHVyZVBhcmFtZXRlclNldDsgICAgICAgIC8qIFBpY3R1cmUgcGFyYW1ldGVyIHNldHMgYXJyYXkqLwotfSBBdmNTcGVjaWZpY0luZm8gOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9TeW50aGVzaXNBdWRpb0luZm8KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgc3BlY2lmaWMgcG9pbnRlcnMgdXNlZCBmb3Igc3ludGhlc2lzIGF1ZGlvIGZvcm1hdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9zeW50aGVzaXNBdWRpb0luZm8KLXsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgbV9wSW5wdXRCdWY7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgIG1fcElucHV0SW5mbzsKLSAgICBNNE9TQV9VSW50MTYgICAgbV91aU5iU3ViRnJhbWVQZXJTdGVwOwotICAgIE00T1NBX1VJbnQzMiAgICBtX3VpVXNlZEJ5dGVzOwotfSBNNF9TeW50aGVzaXNBdWRpb0luZm87Ci0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00X0FBQ0Rvd25zYW1wbGluZ01vZGUKLSAqIEBicmllZiAgIFRoaXMgZW51bSBzdGF0ZXMgbW9kZXMgZm9yIERvd24gc2FtcGxpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa0RTX09GRiAgICA9IDAsICAgICAgICAvKio8IE5vIERvd24gc2FtcGxpbmcgKi8KLSAgICBBQUNfa0RTX0JZXzIgICA9IDEsICAgICAgICAvKio8IERvd24gc2FtcGxpbmcgYnkgMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSA9IEFBQyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzYW1wbGluZyByYXRlID0gYWFjX3NhbXBfZnJlcS8yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gSEVfQUFDIGFuZCBpbnB1dCBpcyBBQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBzYW1wbGluZyByYXRlID0gYWFjX3NhbXBfZnJlcS4oTm8gZG93bnNhbXBpbmcpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSA9IEhFX0FBQyBhbmQgaW5wdXQgaXMgSEVfQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgc2FtcGxpbmcgcmF0ZSA9IGFhY19zYW1wX2ZyZXEgKERvd25zYW1wbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnMgaW4gU0JSIHRvb2wpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwcm9maWxlID0gSEVfQUFDX3YyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IFN1cHBvcnRlZCAqLwotICAgIEFBQ19rRFNfQllfMyAgID0gMiwgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSAzICAtIG9ubHkgZm9yIEFBQyBwcm9maWxlICovCi0gICAgQUFDX2tEU19CWV80ICAgPSAzLCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDQgIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLSAgICBBQUNfa0RTX0JZXzggICA9IDQgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSA4ICAtIG9ubHkgZm9yIEFBQyBwcm9maWxlICovCi0KLX0gTTRfQUFDRG93bnNhbXBsaW5nTW9kZTsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDT3V0cHV0TW9kZQotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIG91dHB1dCBtb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgQUFDX2tNb25vICAgICAgPSAwLCAgICAvKio8IE91dHB1dCBpcyBNb25vICAqLwotICAgIEFBQ19rU3RlcmVvICAgID0gMSAgICAgLyoqPCBPdXRwdXQgaXMgU3RlcmVvICovCi19IE00X0FBQ091dHB1dE1vZGU7Ci0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00X0FBQ0RlY1Byb2ZpbGUKLSAqIEBicmllZiAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBBQUMgZGVjb2RlciBwcm9maWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgQUFDX2tBQUMgICAgICAgPSAwLCAgICAgICAgLyoqPCBBQUMgcHJvZmlsZSAob25seSBBQUMgTEMgb2JqZWN0IGFyZSBzdXBwb3J0ZWQpICovCi0gICAgQUFDX2tIRV9BQUMgICAgPSAxLCAgICAgICAgLyoqPCBIRSBBQUMgb3IgQUFDKyBwcm9maWxlIChTQlIgaW4gTFAgTW9kZSkgICovCi0gICAgQUFDX2tIRV9BQUNfdjIgPSAyICAgICAgICAvKio8IEhFIEFBQyB2MiBvciBFbmhhbmNlZCBBQUMrIHByb2ZpbGUgKFNCUiBUb29sIGluIEhRIE1vZGUpICovCi19IE00X0FBQ0RlY1Byb2ZpbGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQWFjRGVjb2RlckNvbmZpZwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHNwZWNpZmljIHNldHRpbmdzIGFjY29yZGluZyB0bwotICogICAgICAgICAgICAgICAgdGhlIHVzZXIgcmVxdWlyZW1lbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9BQUNEZWNQcm9maWxlICAgICAgICBtX0FBQ0RlY29kZXJQcm9maWxlOwotICAgIE00X0FBQ0Rvd25zYW1wbGluZ01vZGUgICAgbV9Eb3duU2FtcGxpbmdNb2RlOwotICAgIE00X0FBQ091dHB1dE1vZGUgICAgICAgIG1fT3V0cHV0TW9kZTsKLQotfSBNNF9BYWNEZWNvZGVyQ29uZmlnOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB1c2VyJ3MgZGF0YSBuZWVkZWQgdG8gZGVjb2RlIHRoZQotICogICAgICAgICAgICBBQUNwbHVzIHN0cmVhbQotICogQG5vdGUgICAgVGhlIGZpZWxkIG1fcEZpcnN0QVUgaXMgdXNlZCBpbiBjYXNlIG9mIGxvY2FsIGZpbGVzICAgIGFuZAotICogICAgICAgICAgICB0aGUgZmllbGQgbV9iSXNTYnJFbmFibGVkIGlzIHVzZWQgaW4gc3RyZWFtaW5nIGNhc2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfVm9pZCogICAgICAgICAgICBtX3BGaXJzdEFVOyAgICAgICAgICAgICAgICAvKio8IFRoZSBmaXJzdCBBVSBmcm9tIHdoZXJlIFNCUiBkYXRhIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkIChsb2NhbCBmaWxlIGNhc2UpKi8KLSAgTTRPU0FfQm9vbCAgICAgICAgICAgIG1fYklzU2JyRW5hYmxlZDsgICAgICAgIC8qKjwgQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBzdHJlYW0gaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNwbHVzIChzdHJlYW1pbmcgY2FzZSkqLwotICBNNF9BYWNEZWNvZGVyQ29uZmlnKiAgICBtX3BBYWNEZWNvZGVyVXNlckNvbmZpZzsvKio8IERlY29kZXIgc3BlY2lmaWMgdXNlciBzZXR0aW5nICovCi0KLX0gTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YTsKLQotI2VuZGlmIC8qIF9fTTRfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1V0aWxzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9VdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMWUwODI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRfVXRpbHMuaAotICogQGJyaWVmICAgIFV0aWxpdGllcwotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdXRpbGl0eSBtYWNyb3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRfVVRJTFNfSF9fCi0jZGVmaW5lIF9fTTRfVVRJTFNfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogICAgTTRfTWVkaWFUaW1lIGRlZmluaXRpb24KLSAgICBUaGlzIHR5cGUgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHNvbWUgc2hlbGwgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi10eXBlZGVmIE00T1NBX0RvdWJsZSAgICBNNF9NZWRpYVRpbWU7Ci0KLS8qICAgIEdFVF9NRU1PUlkzMiBtYWNybyBkZWZpbml0aW9uCi0gICAgVGhpcyBtYWNybyBpcyB1c2VkIGJ5IHRoZSAzR1AgcmVhZGVyKi8KLSNpZmRlZiBfX0JJR19FTkRJQU4KLSNkZWZpbmUgR0VUX01FTU9SWTMyKHgpICh4KQotI2Vsc2UKLSNkZWZpbmUgR0VUX01FTU9SWTMyKHgpICggKCgoeCkmMHhmZik8PDI0KSB8ICgoKHgpJjB4ZmYwMCk8PDgpIHxcCi0gICAgICgoKHgpJjB4ZmYwMDAwKT4+OCkgfCAoKCh4KSYweGZmMDAwMDAwKT4+MjQpICkKLSNlbmRpZiAvKl9fQklHX0VORElBTiovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000X1VUSUxTX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllN2QwM2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oCi0gKiBAYnJpZWYgICAgVmlkZW8gRWRpdGluZyAoVlNTM0dQUCwgTUNTLCBQVE8zR1BQKSBjb21tb24gZGVmaW5pdGlvbnMKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fTTRfVklERU9FRElUSU5HQ09NTU9OX0hfXwotI2RlZmluZSBfX000X1ZJREVPRURJVElOR0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqICAgIFZlcnNpb24gKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUiAgICAzCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IgICAgMQotI2RlZmluZSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OICAgIDAKLQotI2RlZmluZSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEUgMHg3ZmZmZmZmZgotI2RlZmluZSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMIDB4N2ZmZmZmZmYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBmaWxlIGZvcm1hdCB0eXBlIHRvIGJlIHVzZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICAgICAgICA9IDAsICAgICAgLyoqPCAzR1BQIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICYgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNCAgICAgICAgID0gMSwgICAgICAvKio8IE1QNCAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgICAgICAgICAgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SICAgICAgICAgPSAyLCAgICAgIC8qKjwgQU1SICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAmIG91dHB1dCAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgICAgICAgICA9IDMsICAgICAgLyoqPCBNUDMgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICAgICAgICAgICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTSAgICAgICAgID0gNCwgICAgICAvKio8IFBDTSBSQVcgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgICAgUkMgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHICAgICAgICAgPSA1LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBKUEcgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgQU5EIE9VVFBVVCAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9CTVAgICAgICAgICA9IDYsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEJNUCBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0dJRiAgICAgICAgID0gNywgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogR0lGIGZpbGUgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUE5HICAgICAgICAgPSA4LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBQTkcgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCAgICA9IDksICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEFSR0I4ODg4IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWICAgICAgICAgPSAxMCwgICAgIC8qKjwgTTRWICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCBvbmx5ICAgICAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9VbnN1cHBvcnRlZCA9IDI1NSAgICAgLyoqPCBVbnN1cHBvcnRlZCBmaWxlIG1lZGlhIHR5cGUgICAgICAgICAgICovCi19IE00VklERU9FRElUSU5HX0ZpbGVUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIHZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbyA9IDAsIC8qKjwgVmlkZW8gbm90IHByZXNlbnQgKi8KLSAgICBNNFZJREVPRURJVElOR19rSDI2MyA9IDEsIC8qKjwgSDI2MyB2aWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX2tIMjY0ID0gMiwgICAgLyoqPCBIMjY0IHZpZGVvICovCi0gICAgTTRWSURFT0VESVRJTkdfa01QRUc0ID0gMywgLyoqPCBNUEVHLTQgdmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvID0gMjU0LCAgLyoqPCBEbyBub3QgY2FyZSB2aWRlbyB0eXBlLCB1c2UgTlVMTCBlbmNvZGVyICovCi0gICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkVmlkZW8gPSAyNTUgICAgLyoqPCBVbnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gdHlwZSAqLwotfSBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgYXVkaW8gZm9ybWF0LgotICogQG5vdGUgICAgSEVfQUFDLCBIRV9BQUNfdjIgYW5kIE1QMyBjYW4gbm90IGJlIHVzZWQgZm9yIHRoZSBvdXRwdXQgYXVkaW8gZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICAgICAgICAgICAgPSAwLCAgICAvKio8IEF1ZGlvIG5vdCBwcmVzZW50ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0FNUl9OQiAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFNUiBOYXJyb3cgQmFuZCBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tBQUMgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBBQUMgYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rQUFDcGx1cyAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQUFDKyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tlQUFDcGx1cyAgICAgICAgICAgICA9IDQsICAgIC8qKjwgRW5oYW5jZWQgQUFDKyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tNUDMgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBNUDMgYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rRVZSQyAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgRVZSQyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tQQ00gICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBQQ00gYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvICAgICAgICAgICA9IDI1NCwgIC8qKjwgRG8gbm90IGNhcmUgYXVkaW8gdHlwZSwgdXNlIE5VTEwgZW5jb2RlciAqLwotICAgIE00VklERU9FRElUSU5HX2tVbnN1cHBvcnRlZEF1ZGlvICAgID0gMjU1ICAgIC8qKjwgVW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtIHR5cGUgKi8KLX0gTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIG91dHB1dCBmcmFtZSBzaXplcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rU1FDSUY9MCwgLyoqPCBTUUNJRiAxMjh4OTYgICovCi0gICAgTTRWSURFT0VESVRJTkdfa1FRVkdBLCAgIC8qKjwgUVFWR0EgMTYweDEyMCAqLwotICAgIE00VklERU9FRElUSU5HX2tRQ0lGLCAgICAvKio8IFFDSUYgIDE3NngxNDQgKi8KLSAgICBNNFZJREVPRURJVElOR19rUVZHQSwgICAgLyoqPCBRVkdBICAzMjB4MjQwICovCi0gICAgTTRWSURFT0VESVRJTkdfa0NJRiwgICAgIC8qKjwgQ0lGICAgMzUyeDI4OCAqLwotICAgIE00VklERU9FRElUSU5HX2tWR0EsICAgICAvKio8IFZHQSAgIDY0MHg0ODAgKi8KLS8qICtQUiBMVjU4MDcgKi8KLSAgICBNNFZJREVPRURJVElOR19rV1ZHQSwgICAgLyoqPCBXVkdBIDgwMHg0ODAgKi8KLSAgICBNNFZJREVPRURJVElOR19rTlRTQywgICAgLyoqPCBOVFNDIDcyMHg0ODAgKi8KLS8qIC1QUiBMVjU4MDcgKi8KLQotLyogK0NSIEdvb2dsZSAqLwotICAgIE00VklERU9FRElUSU5HX2s2NDBfMzYwLCAgLyoqPCA2NDB4MzYwICovCi0gICAgTTRWSURFT0VESVRJTkdfazg1NF80ODAsICAvKio8IDg1NHg0ODAgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTI4MF83MjAsIC8qKjwgNzIwcCAxMjgweDcyMCAqLwotICAgIE00VklERU9FRElUSU5HX2sxMDgwXzcyMCwgLyoqPCA3MjBwIDEwODB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazk2MF83MjAsICAvKio8IDcyMHAgOTYweDcyMCAqLwotICAgIE00VklERU9FRElUSU5HX2sxOTIwXzEwODAgLyoqPDEwODBwIDE5MjB4MTA4MCovCi0vKiAtQ1IgR29vZ2xlICovCi0KLX0gTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb2ZyYW1lcmF0ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgdmlkZW8gZnJhbWVyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rNV9GUFMgPSAwLAotICAgIE00VklERU9FRElUSU5HX2s3XzVfRlBTLAotICAgIE00VklERU9FRElUSU5HX2sxMF9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTLAotICAgIE00VklERU9FRElUSU5HX2sxNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazIwX0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMjVfRlBTLAotICAgIE00VklERU9FRElUSU5HX2szMF9GUFMKLX0gTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWlsYWJsZSBvdXRwdXQgYXVkaW8gc2FtcGxpbmcgZnJlcXVlbmNpZXMKLSAqIEBub3RlICAgIDgga0h6IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBmcmVxdWVuY3kgZm9yIEFNUi1OQiBvdXRwdXQKLSAqIEBub3RlICAgIDE2IGtIeiBpcyB0aGUgb25seSBzdXBwb3J0ZWQgZnJlcXVlbmN5IGZvciBBQUMgb3V0cHV0Ci0gKiBAbm90ZSAgICBUaGUgcmVjb21tZW5kZWQgcHJhY3RpY2UgaXMgdG8gdXNlIHRoZSBEZWZhdWx0IHZhbHVlIHdoZW4gc2V0dGluZyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGICAgID0gMCwgICAgLyoqPCBEZWZhdWx0IEF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeSBmb3Igc2VsZWN0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBvdXRwdXQgZm9ybWF0ICovCi0gICAgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGICAgID0gODAwMCwgICAgLyoqPCBOb3RlOiBEZWZhdWx0IGF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVItTkIgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfazExMDI1X0FTRiAgICA9IDExMDI1LAotICAgIE00VklERU9FRElUSU5HX2sxMjAwMF9BU0YgICAgPSAxMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGICAgID0gMTYwMDAsICAgIC8qKjwgTm90ZTogRGVmYXVsdCBhdWRpbyBTYW1wbGluZyBGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEFBQyBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGICAgID0gMjIwNTAsCi0gICAgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRiAgICA9IDI0MDAwLAotICAgIE00VklERU9FRElUSU5HX2szMjAwMF9BU0YgICAgPSAzMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGICAgID0gNDQxMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRiAgICA9IDQ4MDAwCi0KLX0gTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIGF1ZGlvIG9yIHZpZGVvIGJpdHJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTID0gLTEsICAgICAvKiBubyByZWd1bGF0aW9uICovCi0gICAgTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgPSAwLCAgIC8qIHVuZGVmaW5lZCAqLwotICAgIE00VklERU9FRElUSU5HX2s4X0tCUFMgPSA4MDAwLAotICAgIE00VklERU9FRElUSU5HX2s5XzJfS0JQUyA9IDkyMDAsICAgICAgICAvKiBldnJjIG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTID0gMTIyMDAsICAgICAgLyogYW1yIG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTZfS0JQUyA9IDE2MDAwLAotICAgIE00VklERU9FRElUSU5HX2syNF9LQlBTID0gMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFMgPSAzMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDBfS0JQUyA9IDQwMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0OF9LQlBTID0gNDgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazU2X0tCUFMgPSA1NjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUyA9IDY0MDAwLAotICAgIE00VklERU9FRElUSU5HX2s4MF9LQlBTID0gODAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazk2X0tCUFMgPSA5NjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTEyX0tCUFMgPSAxMTIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazEyOF9LQlBTID0gMTI4MDAwLAotICAgIE00VklERU9FRElUSU5HX2sxNjBfS0JQUyA9IDE2MDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTkyX0tCUFMgPSAxOTIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazIyNF9LQlBTID0gMjI0MDAwLAotICAgIE00VklERU9FRElUSU5HX2syNTZfS0JQUyA9IDI1NjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMjg4X0tCUFMgPSAyODgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazMyMF9LQlBTID0gMzIwMDAwLAotICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUyA9IDM4NDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNTEyX0tCUFMgPSA1MTIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazgwMF9LQlBTID0gODAwMDAwLAotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgTTRWSURFT0VESVRJTkdfazJfTUJQUyA9IDIwMDAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazVfTUJQUyA9IDUwMDAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazhfTUJQUyA9IDgwMDAwMDAsCi0vKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLX0gTTRWSURFT0VESVRJTkdfQml0cmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJREVPRURJVElOR19GdHlwQm94Ci0gKiBAYnJpZWYgICAgICAgIEluZm9ybWF0aW9uIHRvIGJ1aWxkIHRoZSAnZnR5cCcgYXRvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfTUFYX0NPTVBBVElCTEVfQlJBTkRTIDEwCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIEFsbCBicmFuZCBmaWVsZHMgYXJlIGFjdHVhbGx5IGNoYXJbNF0gc3RvcmVkIGluIGJpZy1lbmRpYW4gaW50ZWdlciBmb3JtYXQgKi8KLQotICAgIE00T1NBX1VJbnQzMiAgICBtYWpvcl9icmFuZDsgICAgICAgICAgIC8qIGdlbmVyYWxseSAnM2dwNCcgICAgICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtaW5vcl92ZXJzaW9uOyAgICAgICAgIC8qIGdlbmVyYWxseSAnMDAwMCcgb3IgJ3gueCAnICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBuYkNvbXBhdGlibGVCcmFuZHM7ICAgIC8qIG51bWJlciBvZiBjb21wYXRpYmxlIGJyYW5kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBjb21wYXRpYmxlX2JyYW5kc1tNNFZJREVPRURJVElOR19NQVhfQ09NUEFUSUJMRV9CUkFORFNdOyAvKiBhcnJheSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBjb21wYXRpYmxlIGJyYW5kcyAqLwotCi19IE00VklERU9FRElUSU5HX0Z0eXBCb3g7Ci0KLS8qIFNvbWUgdXNlZnVsIGJyYW5kcyAqLwotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8wMDAwICAweDAwMDAwMDAwCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHMkEgIDB4MzM2NzMyNjEKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0dQNCAgMHgzMzY3NzAzNAotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8zR1A1ICAweDMzNjc3MDM1Ci0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHUDYgIDB4MzM2NzcwMzYKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfQVZDMSAgMHg2MTc2NjMzMQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9FTVAgICAweDY1NkQ3MDIwCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX0lTT00gIDB4Njk3MzZGNkQKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfTVA0MSAgMHg2RDcwMzQzMQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9NUDQyICAweDZENzAzNDMyCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX1ZGSjEgIDB4NzY2NjZBMzEKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyB0aGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhbiBpbnB1dCBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgLyoqCi0gICAgICogQ29tbW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYkFuYWx5c2VkOyAgICAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgdGhlIGZpbGUgaGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGFscmVhZHkgYW5hbHlzZWQgb3Igbm90ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvblszXTsgICAgICAgICAgLyoqPCBWZXJzaW9uIG9mIHRoZSBsaWJyYXJpZXMgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSB0aGUgY2xpcCBhbmFseXNpcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcER1cmF0aW9uOyAgICAgIC8qKjwgQ2xpcCBkdXJhdGlvbiAoaW4gbXMpICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgRmlsZVR5cGU7ICAgICAgICAgICAgLyoqPCAuM2dwLCAuYW1yLCAubXAzICovCi0gICAgTTRWSURFT0VESVRJTkdfRnR5cEJveCAgICAgICAgICAgICAgZnR5cDsgICAgICAgICAgICAgICAgLyoqPCAzZ3AgJ2Z0eXAnIGF0b20sIG1ham9yX2JyYW5kID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBub3QgdXNlZCAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICBWaWRlb1N0cmVhbVR5cGU7ICAgICAvKio8IEZvcm1hdCBvZiB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwVmlkZW9EdXJhdGlvbjsgLyoqPCBWaWRlbyB0cmFjayBkdXJhdGlvbiAoaW4gbXMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGU7ICAgICAgLyoqPCBWaWRlbyBhdmVyYWdlIGJpdHJhdGUgKGluIGJwcykqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpVmlkZW9NYXhBdVNpemU7ICAgIC8qKjwgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb1dpZHRoOyAgICAgICAgLyoqPCBWaWRlbyBmcmFtZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpVmlkZW9IZWlnaHQ7ICAgICAgIC8qKjwgVmlkZW8gZnJhbWUgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb1RpbWVTY2FsZTsgICAgLyoqPCBWaWRlbyB0aW1lIHNjYWxlICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgZkF2ZXJhZ2VGcmFtZVJhdGU7ICAgLyoqPCBBdmVyYWdlIGZyYW1lIHJhdGUgb2YgdGhlIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gKi8KLSAgICBNNE9TQV9JbnQzMiB1aVZpZGVvTGV2ZWw7ICAgLyoqPCB2aWRlbyBsZXZlbCovCi0gICAgTTRPU0FfSW50MzIgdWlWaWRlb1Byb2ZpbGU7IC8qKjwgdmlkZW8gcHJvZmlsZSAqLwotCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYk1QRUc0ZGF0YVBhcnRpdGlvbjsgLyoqPCBNUEVHLTQgdXNlcyBkYXRhIHBhcnRpdGlvbmluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIGJNUEVHNHJ2bGM7ICAgICAgICAgIC8qKjwgTVBFRy00IHVzZXMgUlZMQyB0b29sICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYk1QRUc0cmVzeW5jaE1hcmtlcjsgLyoqPCBNUEVHLTQgc3RyZWFtIHVzZXMgUmVzeW5jaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlciAqLwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICBBdWRpb1N0cmVhbVR5cGU7ICAgICAvKio8IEZvcm1hdCBvZiB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwQXVkaW9EdXJhdGlvbjsgLyoqPCBBdWRpbyB0cmFjayBkdXJhdGlvbiAoaW4gbXMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGU7ICAgICAgLyoqPCBBdWRpbyBhdmVyYWdlIGJpdHJhdGUgKGluIGJwcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUF1ZGlvTWF4QXVTaXplOyAgICAvKio8IE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlOYkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE9bW9ubywgMj1zdGVyZW8pICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqPCBTYW1wbGluZyBhdWRpbyBmcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgwMDAgZm9yIGFtciwgMTYwMDAgb3IgbW9yZSBmb3IgYWFjKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqPCBFeHRlbmRlZCBmcmVxdWVuY3kgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDKywgZUFBQysgc3RyZWFtcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpRGVjb2RlZFBjbVNpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgZGVjb2RlZCBQQ00gZGF0YSAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZWRpdGluZyBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgIGJWaWRlb0lzRWRpdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBzdHJlYW0gY2FuIGJlIGRlY29kZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLWVuY29kZWQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYkF1ZGlvSXNFZGl0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEF1ZGlvIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLWVuY29kZWQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYlZpZGVvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXA7ICAgICAgICAvKio8IFZpZGVvIHByb3BlcnRpZXMgbWF0Y2ggcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXA7ICAgICAgICAvKio8IEF1ZGlvIHByb3BlcnRpZXMgbWF0Y2ggcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCBwcm9wZXJ0aWVzICovCi0KLSAgICAvKioKLSAgICAgKiBTdGlsbCBQaWN0dXJlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlTdGlsbFBpY1dpZHRoOyAgICAgICAgLyoqPCBJbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpU3RpbGxQaWNIZWlnaHQ7ICAgICAgIC8qKjwgSW1hZ2UgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwQXVkaW9Wb2x1bWVQZXJjZW50YWdlOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXRJbWFnZURhdGE7Ci0KLSAgICBNNE9TQV9JbnQzMiAgICAgdmlkZW9Sb3RhdGlvbkRlZ3JlZXM7ICAgICAgICAvKio8IFZpZGVvIHJvdGF0aW9uIGRlZ3JlZSAqLwotCi19IE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICAgIH0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNF9WSURFT0VESVRJTkdDT01NT05fSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL01vbm9UbzJJXzE2LmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Nb25vVG8ySV8xNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGIxYzhhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL01vbm9UbzJJXzE2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTU9OT1RPMklfMTZfSF8KLSNkZWZpbmUgX01PTk9UTzJJXzE2X0hfCi0KLQotdm9pZCBNb25vVG8ySV8xNiggIGNvbnN0IHNob3J0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAgLyogX01PTk9UTzJJXzE2X0hfICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTFiNjJlMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX01DU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0gKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRUFERVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotCi0vKiAtLS0tLSAgQU1SIHJlYWRlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCAuYW1yIGZpbGVzICovCi0KLS8qIC0tLS0tIDNHUFAgIHJlYWRlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCAubXA0LCAuM2dwIGZpbGVzICovCi0KLQotLyogLS0tLS0gTVAzIHJlYWRlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCAubXAzIGZpbGVzICovCi0KLS8qIC0tLS0tIFJBVyByZWFkZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00gICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgLnBjbSBmaWxlcyAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERFQ09ERVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLQotLyogLS0tLS0gIEFNUiBOQiBkZWNvZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQiAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IEFNUiBOQiBzdHJlYW1zICovCi0KLS8qIC0tLS0tIEFBQyBkZWNvZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMgICAgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IEFBQywgQUFDKyBhbmQgZUFBQysgc3RyZWFtcyAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1ZJREVDX05VTEwKLQotLyogLS0tLS0gTVA0L0gyNjMgdmlkZW8gZGVjb2RlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBtcGVnNCBhbmQgSDI2MyBkZWNvZGVycyAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AKLSNkZWZpbmUgR0VUX0RFQ09ERVJfQ09ORklHX0lORk8KLSNlbmRpZgotCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfVklERU9fQVZDICAgICAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBIMjY0IGRlY29kZXJzICovCi0KLS8qIC0tLS0tIE1QMyBkZWNvZGVyIHN1cHBvcnQtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgTVAzIGRlY29kZXJzICovCi0KLQotLyogLS0tLS0gTlVMTCBkZWNvZGVyIHN1cHBvcnQtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwgICAgICAgIC8qKiBbZGVmYXVsdF0gU3VwcG9ydCBQQ00gcmVhZGluZyAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV1JJVEVSUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKi8KLQotLyogLS0tLS0gM2dwIHdyaXRlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jYXBzdWxhdGluZyBpbiAzZ3AgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YW1yLGFhY30geCB7bXBlZzQsaDI2M30gKi8KLQotCi0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFTkNPREVSUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0KLS8qIC0tLS0tIG1wZWc0ICYgaDI2MyBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNvZGluZyBpbiBtcGVnNCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjMgZm9ybWF0IHt5dXYscmdifSAqLwotCi0vKiAtLS0tLSBoMjY0IGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotCi0vKiAtLS0tLSBhbXIgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY29kaW5nIGluIGFtciAxMi4yIGZvcm1hdCB7YW1yLHdhdn0gKi8KLQotLyogLS0tLS0gYWFjIGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAgICAgICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY29kaW5nIGluIGFhYyBmb3JtYXQge2Ftcix3YXZ9ICovCi0KLQotLyogLS0tLS0gbXAzIGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QMyAgICAgICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY29kaW5nIGluIG1wMyBmb3JtYXQge21wM30gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkVBVFVSRVMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotCi0vKiAtLS0tLSBWU1MzR1BQICYgeFZTUyAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTIC8qKjwgW2RlZmF1bHRdIGlmIGRlZmluZWQsIGltcGxlbWVudGF0aW9uIGlzIHhWU1MgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBWU1MzR1BQICovCi0KLS8qIC0tLS0tIFNQUyAtLS0tLSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLQotLy8jZGVmaW5lIE00U1BTX0dJRl9OT1RfU1VQUE9SVEVEICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IEdJRiBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19KUEVHX05PVF9TVVBQT1JURUQgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBKUEVHIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotLy8jZGVmaW5lIE00U1BTX1BOR19OT1RfU1VQUE9SVEVEICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IFBORyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfV0JNUF9OT1RfU1VQUE9SVEVEICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBXQk1QIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotI2RlZmluZSBNNFNQU19CR1I1NjVfQ09MT1JfT1VUUFVUICAvKio8IFtvcHRpb25dIG91dHB1dCBpbiBzdGlsbCBwaWN0dXJlIGFwaSBpcyBCR1I1NjUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA9IEJHUjI0KSAqLwotCi0jZWxzZQotCi0jZGVmaW5lIE00U1BTX0dJRl9OT1RfU1VQUE9SVEVEICAgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgR0lGIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotLy8jZGVmaW5lIE00U1BTX0pQRUdfTk9UX1NVUFBPUlRFRCAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IEpQRUcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX1BOR19OT1RfU1VQUE9SVEVEICAgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgUE5HIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotI2RlZmluZSBNNFNQU19XQk1QX05PVF9TVVBQT1JURUQgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IFdCTVAgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfQkdSNTY1X0NPTE9SX09VVFBVVCAvKio8IFtvcHRpb25dIG91dHB1dCBpbiBzdGlsbCBwaWN0dXJlIGFwaSBpcyBCR1I1NjUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgPSBCR1IyNCkgKi8KLQotI2VuZGlmCi0KLSNkZWZpbmUgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX01DU19IICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1NTUkMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1NTUkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIxY2ZjZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9TU1JDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgUHJvamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAlbmFtZTogICAgICAgICAgU1NSQy5oICUgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gICAgVGhlIGlucHV0IGFuZCBvdXRwdXQgYmxvY2tzIG9mIHRoZSBTUkMgYXJlIGJ5IGRlZmF1bHQgYmxvY2tzIG9mIDQwIG1zLiAgVGhpcyBtZWFucyB0aGF0Ci0gICAgdGhlIGZvbGxvd2luZyBkZWZhdWx0IGJsb2NrIHNpemVzIGFyZSB1c2VkOgotCi0gICAgICAgICAgRnMgICAgIERlZmF1bHQgQmxvY2sgc2l6ZQotICAgICAgICAtLS0tLSAgICAgICAgLS0tLS0tLS0tLQotICAgICAgICAgODAwMCAgICAgICAgICAgMzIwCi0gICAgICAgIDExMDI1ICAgICAgICAgICA0NDEKLSAgICAgICAgMTIwMDAgICAgICAgICAgIDQ4MAotICAgICAgICAxNjAwMCAgICAgICAgICAgNjQwCi0gICAgICAgIDIyMDUwICAgICAgICAgICA4ODIKLSAgICAgICAgMjQwMDAgICAgICAgICAgIDk2MAotICAgICAgICAzMjAwMCAgICAgICAgICAxMjgwCi0gICAgICAgIDQ0MTAwICAgICAgICAgIDE3NjQKLSAgICAgICAgNDgwMDAgICAgICAgICAgMTkyMAotCi0gICAgQW4gQVBJIGlzIHByb3ZpZGVkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBibG9jayBzaXplIGludG8gYW55IG11bHRpcGxlIG9mIHRoZSBtaW5pbWFsCi0gICAgYmxvY2sgc2l6ZS4KLQotICAgIEFsbCB0aGUgc2FtcGxpbmcgcmF0ZXMgYWJvdmUgYXJlIHN1cHBvcnRlZCBhcyBpbnB1dCBhbmQgYXMgb3V0cHV0IHNhbXBsaW5nIHJhdGUKLSovCi0KLSNpZm5kZWYgX19TU1JDX0hfXwotI2RlZmluZSBfX1NTUkNfSF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIERFRklOSVRJT05TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBTU1JDX0lOU1RBTkNFX1NJWkUgICAgICAgICAgNTQ4Ci0jZGVmaW5lIFNTUkNfSU5TVEFOQ0VfQUxJR05NRU5UICAgICA0Ci0jZGVmaW5lIFNTUkNfU0NSQVRDSF9BTElHTk1FTlQgICAgICA0Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBUWVBFIERFRklOSVRJT05TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogU3RhdHVzIHJldHVybiB2YWx1ZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIFNTUkNfT0sgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCi0gICAgU1NSQ19JTlZBTElEX0ZTICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgLyogVGhlIGlucHV0IG9yIHRoZSBvdXRwdXQgc2FtcGxpbmcgcmF0ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkICovCi0gICAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTICAgID0gMiwgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBjaGFubmVscyBpcyBub3QgZXF1YWwgdG8gbW9ubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc3RlcmVvICovCi0gICAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgICAgID0gMywgICAgICAgICAgICAgICAgLyogT25lIG9mIHRoZSBpbnB1dCBwb2ludGVycyBpcyBOVUxMICovCi0gICAgU1NSQ19XUk9OR19OUl9TQU1QTEVTICAgICAgID0gNCwgICAgICAgICAgICAgICAgLyogSW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyAqLwotICAgIFNTUkNfQUxMSU5HTUVOVF9FUlJPUiAgICAgICA9IDUsICAgICAgICAgICAgICAgIC8qIFRoZSBpbnN0YW5jZSBtZW1vcnkgb3IgdGhlIHNjcmF0Y2ggbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhbGxpZ25lZCAqLwotICAgIFNTUkNfSU5WQUxJRF9NT0RFICAgICAgICAgICA9IDYsICAgICAgICAgICAgICAgIC8qIEEgd3JvbmcgdmFsdWUgaGFzIGJlZW4gdXNlZCBmb3IgdGhlIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyICovCi0gICAgU1NSQ19JTlZBTElEX1ZBTFVFICAgICAgICAgID0gNywgICAgICAgICAgICAgICAgLyogQW4gaW52YWxpZCAob3V0IG9mIHJhbmdlKSB2YWx1ZSBoYXMgYmVlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgKi8KLSAgICBMVlhYWF9SRVRVUk5TVEFUVVNfRFVNTVkgPSBMVk1fTUFYRU5VTQotfSBTU1JDX1JldHVyblN0YXR1c19lbjsKLQotLyogSW5zdGFuY2UgbWVtb3J5ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JTlQzMiBTdG9yYWdlIFsgU1NSQ19JTlNUQU5DRV9TSVpFLzQgXTsKLX0gU1NSQ19JbnN0YW5jZV90OwotCi0vKiBTY3JhdGNoIG1lbW9yeSAqLwotdHlwZWRlZiBMVk1fSU5UMzIgU1NSQ19TY3JhdGNoX3Q7Ci0KLS8qIE51YmVyIG9mIHNhbXBsZXMgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgU1NSQ19OUl9TQU1QTEVTX0RFRkFVTFQgICAgID0gMCwKLSAgICBTU1JDX05SX1NBTVBMRVNfTUlOICAgICAgICAgPSAxLAotICAgIFNTUkNfTlJfU0FNUExFU19EVU1NWSAgICAgICA9IExWTV9NQVhFTlVNCi19IFNTUkNfTlJfU0FNUExFU19NT0RFX2VuOwotCi0vKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9Gc19lbiAgICAgICAgICAgU1NSQ19Gc19JbjsKLSAgICBMVk1fRnNfZW4gICAgICAgICAgIFNTUkNfRnNfT3V0OwotICAgIExWTV9Gb3JtYXRfZW4gICAgICAgU1NSQ19Ock9mQ2hhbm5lbHM7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOclNhbXBsZXNJbjsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE5yU2FtcGxlc091dDsKLX0gU1NSQ19QYXJhbXNfdDsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gUFJPVE9UWVBFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBTU1JDX0dldE5yU2FtcGxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgKG9yIHNhbXBsZSBwYWlycyBmb3Igc3RlcmVvKSB0byBiZSAgICAqLwotLyogIHVzZWQgYXMgaW5wdXQgYW5kIGFzIG91dHB1dCBvZiB0aGUgU1NSQyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGUgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSB0d28gbW9kZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NSQ19OUl9TQU1QRUxTX0RFRkFVTFQuICBJbiB0aGlzIG1vZGUsIHRoZSBmdW5jdGlvbiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIDQwIG1zIGJsb2NrcyAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUkNfTlJfU0FNUEVMU19NSU4gd2lsbCByZXR1cm4gdGhlIG1pbmltYWwgbnVtYmVyICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygc2FtcGxlcyB0aGF0IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjb252ZXJzaW9uICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpby4gIEVhY2ggaW50ZWdlciBtdWx0aXBsZSBvZiB0aGlzIHJhdGlvIHdpbGwgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFjY2VwdGVkIGJ5IHRoZSBTU1JDX0luaXQgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19QYXJhbXMgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX09LICAgICAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9GUyAgICAgICAgIFdoZW4gdGhlIHJlcXVlc3RlZCBpbnB1dCBvciBvdXRwdXQgc2FtcGxpbmcgcmF0ZXMgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgV2hlbiB0aGUgY2hhbm5lbCBmb3JtYXQgaXMgbm90IGVxdWFsIHRvIExWTV9NT05PICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIExWTV9TVEVSRU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgV2hlbiBwU1NSQ19QYXJhbXMgaXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTU9ERSAgICAgICBXaGVuIE1vZGUgaXMgbm90IGEgdmFsaWQgc2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19HZXROclNhbXBsZXMoIFNTUkNfTlJfU0FNUExFU19NT0RFX2VuICBNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTUkNfUGFyYW1zX3QqICAgICAgICAgICBwU1NSQ19QYXJhbXMgKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfR2V0U2NyYXRjaFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBzY3JhdGNoIHNpemUgZm9yIGEgZ2l2ZW4gY29udmVyc2lvbiByYXRpbyBhbmQgICAgICAgICAgICovCi0vKiAgZm9yIGdpdmVuIGJ1ZmZlciBzaXplcyBhdCB0aGUgaW5wdXQgYW5kIGF0IHRoZSBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfUGFyYW1zICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU2NyYXRjaFNpemUgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzY3JhdGNoIHNpemUuICBUaGUgU1NSQ19HZXRTY3JhdGNoU2l6ZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgZmlsbCBpbiB0aGUgY29ycmVjdCB2YWx1ZSAoaW4gYnl0ZXMpLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIHdoZW4gdGhlIGZ1bmN0aW9uIGNhbGwgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX0ZTICAgICAgICAgV2hlbiB0aGUgcmVxdWVzdGVkIGlucHV0IG9yIG91dHB1dCBzYW1wbGluZyByYXRlcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9OUl9DSEFOTkVMUyBXaGVuIHRoZSBjaGFubmVsIGZvcm1hdCBpcyBub3QgZXF1YWwgdG8gTFZNX01PTk8gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTFZNX1NURVJFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIGFueSBvZiB0aGUgaW5wdXQgcG9pbnRlcnMgaXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLwotLyogIFNTUkNfV1JPTkdfTlJfU0FNUExFUyAgIFdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBpbnB1dCBvciBvbiB0aGUgb3V0cHV0ICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGluY29ycmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX0dldFNjcmF0Y2hTaXplKCAgIFNTUkNfUGFyYW1zX3QqICAgIHBTU1JDX1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyKiAgICAgICAgcFNjcmF0Y2hTaXplICk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBTU1JDX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgU1NSQyBtb2R1bGUgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19JbnN0YW5jZSAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfU2NyYXRjaCAgICAgICAgICAgcG9pbnRlciB0byB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19QYXJhbXMgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnB1dEluU2NyYXRjaCwgICAgICAgIHBvaW50ZXIgdG8gYSBsb2NhdGlvbiBpbiB0aGUgc2NyYXRjaCBtZW1vcnkgdGhhdCBjYW4gYmUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgaW5wdXQgc2FtcGxlcyAoZS5nLiB0byBzYXZlIG1lbW9yeSkgICAgICAgKi8KLS8qICBwT3V0cHV0SW5TY3JhdGNoICAgICAgICBwb2ludGVyIHRvIGEgbG9jYXRpb24gaW4gdGhlIHNjcmF0Y2ggbWVtb3J5IHRoYXQgY2FuIGJlICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gc3RvcmUgdGhlIG91dHB1dCBzYW1wbGVzIChlLmcuIHRvIHNhdmUgbWVtb3J5KSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX0ZTICAgICAgICAgV2hlbiB0aGUgcmVxdWVzdGVkIGlucHV0IG9yIG91dHB1dCBzYW1wbGluZyByYXRlcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9OUl9DSEFOTkVMUyBXaGVuIHRoZSBjaGFubmVsIGZvcm1hdCBpcyBub3QgZXF1YWwgdG8gTFZNX01PTk8gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTFZNX1NURVJFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX1dST05HX05SX1NBTVBMRVMgICBXaGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dCAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbmNvcnJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgV2hlbiBhbnkgb2YgdGhlIGlucHV0IHBvaW50ZXJzIGlzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgKi8KLS8qICBTU1JDX0FMTElOR01FTlRfRVJST1IgICBXaGVuIHRoZSBpbnN0YW5jZSBtZW1vcnkgb3IgdGhlIHNjcmF0Y2ggbWVtb3J5IGlzIG5vdCAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgYWxsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRoZSBpbml0IGZ1bmN0aW9uIHdpbGwgY2xlYXIgdGhlIGludGVybmFsIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX0luaXQoIFNTUkNfSW5zdGFuY2VfdCogcFNTUkNfSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTUkNfU2NyYXRjaF90KiAgcFNTUkNfU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19QYXJhbXNfdCogICBwU1NSQ19QYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNioqICAgICAgcHBJbnB1dEluU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiogICAgICBwcE91dHB1dEluU2NyYXRjaCk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBTU1JDX1NldEdhaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIHNldHMgaGVhZHJvb20gZ2FpbiBhbmQgdGhlIHBvc3QgZ2FpbiBvZiB0aGUgU1NSQyAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBiSGVhZHJvb21HYWluRW5hYmxlZCAgICBwYXJhbWV0ZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGhlYWRyb29tIGdhaW4gb2YgdGhlICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIFNTUkMuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBMVk1fTU9ERV9PTi4gIExWTV9NT0RFX09GRiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gY2FzZSBpdCBjYW4gYmUgZ3VhcmFudGVlZCB0aGF0IHRoZSBpbnB1dCAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBpcyBiZWxvdyAtNmRCIGluIGFsbCBjYXNlcyAodGhlIGRlZmF1bHQgaGVhZHJvb20gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIC02IGRCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBiT3V0cHV0R2FpbkVuYWJsZWQgICAgICBwYXJhbWV0ZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIG91dHB1dCBnYWluLiAgVGhlICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgaXMgTFZNX01PREVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPdXRwdXRHYWluICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIG91dHB1dCBnYWluLiAgVGhlIG91dHB1dCBnYWluIGlzIGEgbGluZWFyICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW4gdmFsdWUuIDB4N0ZGRiBpcyBlcXVhbCB0byArNiBkQiBhbmQgMHgwMDAwIGNvcnJlc3BvbmRzICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gLWluZiBkQi4gIEJ5IGRlZmF1bHQsIGEgM2RCIGdhaW4gaXMgYXBwbGllZCwgcmVzdWx0aW5nICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhbiBvdmVyYWxsIGdhaW4gb2YgLTNkQiAoLTZkQiBoZWFkcm9vbSArIDNkQiBvdXRwdXQgZ2FpbikqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX09LICAgICAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gcFNTUkNfSW5zdGFuY2UgaXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX01PREUgICAgICAgV3JvbmcgdmFsdWUgdXNlZCBmb3IgdGhlIGJIZWFkcm9vbUdhaW5FbmFibGVkIG9yIHRoZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBiT3V0cHV0R2FpbkVuYWJsZWQgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9WQUxVRSAgICAgIFdoZW4gT3V0cHV0R2FpbiBpcyBvdXQgdG8gdGhlIHJhbmdlIFswOzMyNzY3XSAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRoZSBTU1JDX1NldEdhaW5zIGZ1bmN0aW9uIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCAgICAgICovCi0vKiAgICAgaW4gcmFyZSBjYXNlcy4gIFByZWZlcmFibHksIHVzZSB0aGUgZGVmYXVsdCBzZXR0aW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfU2V0R2FpbnMoIFNTUkNfSW5zdGFuY2VfdCogcFNTUkNfSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTW9kZV9lbiAgICAgIGJIZWFkcm9vbUdhaW5FbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01vZGVfZW4gICAgICBiT3V0cHV0R2FpbkVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgIE91dHB1dEdhaW4gKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBTU1JDIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0luc3RhbmNlICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfQXVkaW9JbiAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19BdWRpb091dCAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFNTUkNfT0sgICAgICAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU1NSQ19OVUxMX1BPSU5URVIgICAgICAgIFdoZW4gb25lIG9mIHBTU1JDX0luc3RhbmNlLCBwU1NSQ19BdWRpb0luIG9yIHBTU1JDX0F1ZGlvT3V0ICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX1Byb2Nlc3MoICBTU1JDX0luc3RhbmNlX3QqIHBTU1JDX0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiAgICAgICBwU1NSQ19BdWRpb0luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiAgICAgICBwU1NSQ19BdWRpb091dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZW5kaWYgLyogX19TU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4NDk3ZDMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFZJREVPRURJVE9SUkVTQU1QTEVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JSRVNBTVBMRVJfSAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotTTRPU0FfQ29udGV4dCBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKE00T1NBX0ludDMyIGJpdERlcHRoLCBNNE9TQV9JbnQzMiBpbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzYW1wbGVSYXRlLCBNNE9TQV9JbnQzMiBxdWFsaXR5KTsKLXZvaWQgTFZBdWRpb3NldFNhbXBsZVJhdGUoTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0LE00T1NBX0ludDMyIGluU2FtcGxlUmF0ZSk7Ci12b2lkIExWQXVkaW9zZXRWb2x1bWUoTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0LCBNNE9TQV9JbnQxNiBsZWZ0LCBNNE9TQV9JbnQxNiByaWdodCkgOwotdm9pZCBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eShNNE9TQV9JbnQxNiogb3V0LCBNNE9TQV9JbnQxNiogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgb3V0RnJhbWVDb3VudCwgTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KTsKLXZvaWQgTFZEZXN0cm95KE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCk7Ci0KLXZvaWQgTW9ub1RvMklfMTYoIGNvbnN0IE00T1NBX0ludDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgbik7Ci0KLXZvaWQgRnJvbTJpVG9Nb25vXzE2KCBjb25zdCBNNE9TQV9JbnQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgbik7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotI2VuZGlmIC8qIFZJREVPRURJVE9SUkVTQU1QTEVSX0ggKi8KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9tYXJrZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL21hcmtlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2NhZGUwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL21hcmtlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIE1BUktFUl9ICi0jZGVmaW5lIE1BUktFUl9ICi0KLSNkZWZpbmUgQUREX0NPREVfTUFSS0VSX0ZVTihtX2NvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoICEobV9jb25kaXRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHgyMTYxNDA2MlxuXHQiICAgICAgLyogJyFhQGInICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg0NzcxMjU0M1xuXHQiICAgICAgLyogJ0dxJUMnICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY0M1xuXHQiICAgICAgLyogJ19fX0MnICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHgyNDVGNUY1RiIgICAgICAgICAgLyogJyRfX18nICovICAgIFwKLSAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLSNkZWZpbmUgQUREX1RFWFRfTUFSS0VSX0ZVTihtX2NvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoICEobV9jb25kaXRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHgyMTYxNDA2MlxuXHQiICAgICAgLyogJyFhQGInICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg0NzcxMjU0M1xuXHQiICAgICAgLyogJ0dxJUMnICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1NFxuXHQiICAgICAgLyogJ19fX1QnICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHg1RjVGNUY1RlxuXHQiICAgICAgLyogJ19fX18nICovICAgIFwKLSAgICAgICAgICAgICIud29yZCAgICAgMHgyNDVGNUY1RiIgICAgICAgICAgLyogJyRfX18nICovICAgIFwKLSAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjNjMDJhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRFWElGQ19Db21tb25BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRFWElGQ19Db21tb25BUEkuaAotICogQGJyaWVmICAgIEVYSUYgY29tbW9uIGRhdGEgaGVhZGVyCi0gKiBAbm90ZSAgICBUaGUgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhbGxvdyByZWFkaW5nCi0gKiAgICAgICAgICAgIGFuZCB3cml0aW5nIEVYSUYgSlBFRyBpbWFnZXMgY29tcGxpYW50IHNwZWMgRVhJRiAyLjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfX000X0VYSUZfQ09NTU9OX0FQSV9IX18KLSNkZWZpbmUgX19NNF9FWElGX0NPTU1PTl9BUElfSF9fCi0KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLSNpbmNsdWRlICJNNENvbW1vbl90eXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdHlwZSBNNEVYSUZDX0NvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX1ZvaWQqICAgIE00RVhJRkNfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFcnJvcnMgJiBXYXJuaW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBNNEVYSUZDX05PX0VSUiAgICAgICAgICAgICAgMHgwMDAwMDAwMCAgICAvKio8IGludmFsaWQgcGFyYW1ldGVyICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX1BBUkFNRVRFUiAgICAgICAweDAwMDAwMDAxICAgIC8qKjwgaW52YWxpZCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQUxMT0MgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyoqPCBhbGxvY2F0aW9uIGVycm9yICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX0JBRF9DT05URVhUICAgICAweDAwMDAwMDAzICAgIC8qKjwgaW52YWxpZCBjb250ZXh0ICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX05PVF9DT01QTElBTlQgICAweDAwMDAwMDA0ICAgIC8qKjwgdGhlIGltYWdlIGluIGJ1ZmZlciBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHIGNvbXBsaWFudCAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9OT19BUFBfRk9VTkQgICAgMHgwMDAwMDAwNSAgICAvKio8IHRoZSBKUEVHIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gYW55IEFQUDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpZiAyLjIgY29tcGxpYW50ICovCi0jZGVmaW5lIE00RVhJRkNfV0FSX05PX1RIVU1CTkFJTCAgICAweDAwMDAwMDA2ICAgIC8qKjwgdGhlIEV4aWYgcGFydCBkb2VzIG5vdCBjb250YWluIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWwgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQVBQX1RSVU5DQVRFRCAgIDB4MDAwMDAwMDcgICAgLyoqPCBUaGUgQVBQMSBzZWN0aW9uIGluIGlucHV0IGJ1ZmZlciBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgY29tcGxldGUgKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEVYSUZDX0Jhc2ljVGFncwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIGJhc2ljIHRhZ3MgdmFsdWVzLgotICogQG5vdGUgICAgICAgIFRoaXMgRXhpZiByZWFkZXIgZm9jdXNlcyBvbiBhIHNldCBvZiAiRW50cnkgVGFncyIuCi0gKiAgICAgICAgICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyAiRW50cnkgVmFsdWVzIiBvZiB0aGVzZSB0YWdzLgotICogICAgICAgICAgICAgICAgTTRFWElGQ19DaGFyKiBmaWVsZHMgb2Ygc3RydWN0dXJlIGFyZSBOdWxsIHRlcm1pbmF0ZWQgU3RyaW5ncy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0ludDMyICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgLyoqPCBpbWFnZSB3aWR0aCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgIC8qKjwgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpjcmVhdGlvbkRhdGVUaW1lOyAgICAgLyoqPCBkYXRlIGFuZCB0aW1lIG9yaWdpbmFsIGltYWdlIHdhcyBnZW5lcmF0ZWQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbGFzdENoYW5nZURhdGVUaW1lOyAgIC8qKjwgZmlsZSBjaGFuZ2UgZGF0ZSBhbmQgdGltZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpkZXNjcmlwdGlvbjsgICAgICAgICAgLyoqPCBpbWFnZSB0aXRsZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICptYWtlOyAgICAgICAgICAgICAgICAgLyoqPCBtYW51ZmFjdHVyZXIgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKm1vZGVsOyAgICAgICAgICAgICAgICAvKio8IG1vZGVsIG9mIGltYWdlIGlucHV0IGVxdWlwbWVudCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpzb2Z0d2FyZTsgICAgICAgICAgICAgLyoqPCBzb2Z0d2FyZSB1c2VkICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmFydGlzdDsgICAgICAgICAgICAgICAvKio8IHBlcnNvbiB3aG8gY3JlYXRlZCB0aGUgaW1hZ2UgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqY29weXJpZ2h0OyAgICAgICAgICAgIC8qKjwgY29weXJpZ2h0IGhvbGRlciAqLwotICAgIE00Q09NTU9OX09yaWVudGF0aW9uIG9yaWVudGF0aW9uOyAgICAgICAgLyoqPCBvcmllbnRhdGlvbiBvZiBpbWFnZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICB0aHVtYm5haWxTaXplOyAgICAgICAgLyoqPCBzaXplIG9mIHRoZSB0aHVtYm5haWwgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgKnRodW1ibmFpbEltZzsgICAgICAgIC8qKjwgcG9pbnRlciB0byB0aGUgdGh1bWJuYWlsIGluIG1haW4gaW1hZ2UgYnVmZmVyKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbGF0aXR1ZGVSZWY7ICAgICAgICAgIC8qKjwgbGF0aXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbGF0aXR1ZGU7ICAgICAgICAgICAgICAvKio8IGxhdGl0dWRlICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmxvbmdpdHVkZVJlZjsgICAgICAgICAvKio8IGxvbmdpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBsb25naXR1ZGU7ICAgICAgICAgICAgIC8qKjwgbG9uZ2l0dWRlICovCi0KLX0gTTRFWElGQ19CYXNpY1RhZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRFWElGQ19nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgZ2V0IHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIGV4aWYgbGlicmFyeS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSB2ZXJzaW9uIG51bWJlcnMgaW4gYSBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgcFZlcnNpb246ICAgIChPVVQpICAgICAgICB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdmVyc2lvbiBudW1iZXJzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVhJRkNfRVJSX1BBUkFNRVRFUjogICAgICAgIChEZWJ1ZyBvbmx5KSB0aGUgcGFyYW1ldGVyIGlzIE00RVhJRkNfTlVMTC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRFWElGQ19nZXRWZXJzaW9uIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMqLwotI2VuZGlmIC8qIF9fTTRfRVhJRl9DT01NT05fQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YWEyMGQyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfQVBJLmgKLSAqIEBicmllZiAgICBUaGUgUGljdHVyZXMgdG8gM0dQUCBDb252ZXJ0ZXIuCi0gKiBAbm90ZSAgICBNNFBUTzNHUFAgcHJvZHVjZXMgM0dQUCBjb21wbGlhbnQgYXVkaW8vdmlkZW8gIGZpbGVzCi0gKiAgICAgICAgICAgIGZyb20gYW4gQU1SIE5CIGF1ZGlvIGZpbGUgYW5kIHJhdyBwaWN0dXJlcyBpbnRvIGEgTVBFRy00L2gyNjMgM0dQUCBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfQVBJX0hfXwotI2RlZmluZSBfX000UFRPM0dQUF9BUElfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgdHlwZXMgZm9yIGZpbGUgYWNjZXNzICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIE00X1ZlcnNpb25JbmZvICovCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICogRGVmaW5pdGlvbnMgb2YgTTRWSUZJX0ltYWdlUGxhbmUgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgUHVibGljIHR5cGUgb2YgdGhlIE00UFRPM0dQUCBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00UFRPM0dQUF9Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRQVE8zR1BQX1JlcGxhY2VBdWRpb01vZGUKLSAqIEBicmllZiAgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHdheSB0aGUgYXVkaW8gaXMgbWFuYWdlZCBpZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHZpZGVvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Ob25lID0gMCwgIC8qKjwgQXVkaW8gdHJhY2sgaXMga2VwdCBzaG9ydGVyIHRoYW4gdGhlIHZpZGVvIHRyYWNrKi8KLSAgICBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfU2lsZW5jZSwgICAvKio8IElmIGF1ZGlvIGlzIHNob3J0ZXIsIHNpbGVuY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCovCi0gICAgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX0xvb3AgICAgICAgLyoqPCBJZiBhdWRpbyBpcyBzaG9ydGVyLCBsb29wIGJhY2sgdG8gdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgd2hvbGUgdHJhY2sgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi19IE00UFRPM0dQUF9BdWRpb1BhZGRpbmdNb2RlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZQotICogQGJyaWVmICAgIERlZmluZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgM0dQUCBmaWxlIHByb2R1Y2VkIGJ5IHRoZSBQVE8zR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rNTBfS0IsICAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byA1MCBLYnl0ZXMgICovCi0gICAgTTRQVE8zR1BQX2s3NV9LQiwgICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDc1IEtieXRlcyAgKi8KLSAgICBNNFBUTzNHUFBfazEwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMTAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rMTUwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAxNTAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2syMDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDIwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazMwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMzAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rNDAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byA0MDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2s1MDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDUwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfa1VOTElNSVRFRD0tMSAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIG5vdCBsaW1pdGVkICAgICAgICAgICAqLwotfSBNNFBUTzNHUFBfT3V0cHV0RmlsZU1heFNpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIChNNFBUTzNHUFBfUGljdHVyZUNhbGxiYWNrRmN0KSAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICogTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKTsKLSAqIEBicmllZiAgICBUaGUgaW50ZWdyYXRvciBtdXN0IGltcGxlbWVudCBhIGZ1bmN0aW9uIGZvbGxvd2luZyB0aGlzIHByb3RvdHlwZS4KLSAqICAgICAgICAgICAgSXRzIGdvYWwgaXMgdG8gZmVlZCB0aGUgUFRPM0dQUCB3aXRoIFlVVjQyMCBwaWN0dXJlcy4KLSAqCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIHRvIHRoZSBQVE8zR1BQIGluIHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcwotICogQHBhcmFtICAgIHBQaWN0dXJlRHVyYXRpb24oT1VUKSBEdXJhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcGljdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbCAoYmVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QpIChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RvdWJsZSogcFBpY3R1cmVEdXJhdGlvbik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRQVE8zR1BQX1BhcmFtcwotICogQGJyaWVmICAgIE00UFRPM0dQUCBwYXJhbWV0ZXJzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXQsIEgyNjMgb3IgTVBFRzQgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgIE91dHB1dFZpZGVvRm9ybWF0OwotICAgIC8qKjwgT3V0cHV0IGZyYW1lIHNpemUgOiBTUUNJRiB0byBWR0EqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgT3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgLyoqPCBUYXJnZXRlZCBPdXRwdXQgYml0LXJhdGUsIHNlZSBlbnVtKi8KLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgICAgICAgIE91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAvKio8IE1heGltdW0gc2l6ZSBvZiB0aGUgb3V0cHV0IDNHUFAgZmlsZSwgc2VlIGVudW0gKi8KLSAgICBNNFBUTzNHUFBfT3V0cHV0RmlsZU1heFNpemUgICAgIE91dHB1dEZpbGVNYXhTaXplOwotICAgIC8qKjwgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSBQVE8zR1BQIHRvIGdldCB0aGUgaW5wdXQgcGljdHVyZXMqLwotICAgIE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QqICAgcFBpY3R1cmVDYWxsYmFja0ZjdDsKLSAgICAvKio8IENvbnRleHQgdG8gYmUgZ2l2ZW4gYXMgdGhpcmQgYXJndW1lbnQgb2YgdGhlIHBpY3R1cmUgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbCovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwUGljdHVyZUNhbGxiYWNrQ3R4dDsKLSAgICAvKio8IEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgYXVkaW8gdHJhY2sgZmlsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgcElucHV0QXVkaW9UcmFja0ZpbGU7Ci0gICAgLyoqPCBGb3JtYXQgb2YgdGhlIGF1ZGlvIGZpbGUgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgIEF1ZGlvRmlsZUZvcm1hdDsKLSAgICAvKio8IFR5cGUgb2YgcHJvY2Vzc2luZyB0byBhcHBseSB3aGVuIGF1ZGlvIGlzIHNob3J0ZXIgdGhhbiB2aWRlbyovCi0gICAgTTRQVE8zR1BQX0F1ZGlvUGFkZGluZ01vZGUgICAgICBBdWRpb1BhZGRpbmdNb2RlOwotICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgM0dQUCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwT3V0cHV0M2dwcEZpbGU7Ci0gICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBtZXRhZGF0YSAoIm1vb3YuYmluIikgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOwotICAgIC8qKjwgTnVtYmVyIG9mIGlucHV0IFlVViBmcmFtZXMgdG8gZW5jb2RlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBOYlZpZGVvRnJhbWVzOwotICAgIE00T1NBX0ludDMyICAgdmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyICAgdmlkZW9MZXZlbDsKLX0gTTRQVE8zR1BQX1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNNFBUTzNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgTTRQVE8zR1BQIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE00UFRPM0dQUCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGUgY29udGV4dCBzdHJ1Y3R1cmUgY291bGQgbm90IGJlIGFsbG9jYXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgICBTZXQgdGhlIE00UFRPM0dQUCBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUGFyYW1zICAgICAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgcG9pbnRlZCBzdHJ1Y3R1cmUgY2FuIGJlIGRlLWFsbG9jYXRlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYmVjYXVzZQotICogICAgICAgICAgICBpdCBpcyBpbnRlcm5hbGx5IGNvcGllZCBieSB0aGUgUFRPM0dQUAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgVGhlIG91dHB1dCB2aWRlbyBmcmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCB2aWRlbyBiaXQtcmF0ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRQotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRQotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBwYWRkaW5nIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdHJhbmNvZGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HOiAgICBFbmNvZGluZyBjb21wbGV0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9TdGVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0Nsb3NlKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE00UFRPM0dQUCB0cmFuc2NvZGluZy4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE00UFRPM0dQUC4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRQVE8zR1BQX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2JkNTRmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0Vycm9yQ29kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0Vycm9yQ29kZXMuaAotICogQGJyaWVmICAgIFBpY3R1cmUgdG8gM2dwcCBTZXJ2aWNlIGVycm9yIGRlZmluaXRpb25zLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRQVE8zR1BQX0Vycm9yQ29kZXNfSF9fCi0jZGVmaW5lIF9fTTRQVE8zR1BQX0Vycm9yQ29kZXNfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgY29yZSBJRCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0KLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAxICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFICAgICAgICBcCi0gICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwMiApCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0LXJhdGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUgICAgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAzICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDQgKQotLyoqCi0gKiAgICBUaGUgZmlsZSBzaXplIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9JTlZBTElEX0ZJTEVfU0laRSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA1ICkKLS8qKgotICogVGhlIGlucHV0IGF1ZGlvIGZpbGUgY29udGFpbnMgYSB0cmFjayBmb3JtYXQgbm90IGhhbmRsZWQgYnkgUFRPM0dQUCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkhBTkRMRURfQVVESU9fVFJBQ0tfSU5QVVRfRklMRSAgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA2ICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA3ICkKLQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0FNUl9ERUNPREVSX0lOSVRfRVJST1IgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjAgKQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0FNUl9ERUNPREVfRVJST1IgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjEgKQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgY2xlYW51cCBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERVJfREVTVFJPWV9FUlJPUiAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMiApCi0KLS8qKgotICogICAgVGhlIHZpZGVvIGVuY29kZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1ZJREVPX0VOQ09ERVJfSU5JVF9FUlJPUiAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjMgKQotLyoqCi0gKiAgICBUaGUgdmlkZW8gZW5jb2RlciBkZWNvZGluZyBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFX0VSUk9SICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNCApCi0vKioKLSAqICAgIFRoZSB2aWRlbyBlbmNvZGVyIGNsZWFudXAgZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1ZJREVPX0VOQ09ERVJfREVTVFJPWV9FUlJPUiAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjUgKQotCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9GSUxFX1NJWkUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNiApCi0KLS8qKgotICogICAgVGhlIEVuY29kaW5nIGlzIGNvbXBsZXRlZCAqLwotI2RlZmluZSBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI3ICkKLQotLyoqCi0gKiAgICBUaGUgRW5jb2RpbmcgaXMgY29tcGxldGVkICovCi0jZGVmaW5lIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjggKQotCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgYXVkaW8gcGFkZGluZyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9BVURJT19QQURESU5HICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjkgKQotCi0vKioKLSAqIFRoZSB2aWRlbyBlbmNvZGVyIGVuY291bnRlcmVkIGFuIEFjY2VzIFVuaXQgZXJyb3I6IHZlcnkgcHJvYmFibHkgYSBmaWxlIHdyaXRlIGVycm9yICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMkEgKQotCi0jZW5kaWYgLyogX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTJlNTY2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaAotICogQGJyaWVmICAgIFBpY3R1cmUgdG8gM2dwcCBTZXJ2aWNlIGludGVybmFsIGRlZmluaXRpb25zCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGVudW0gYW5kIHR5cGVzIG5vdCB2aXNpYmxlIHRvIHRoZSBleHRlcm5hbCB3b3JsZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfSU5URVJOQUxUWVBFU19IX18KLSNkZWZpbmUgX19NNFBUTzNHUFBfSU5URVJOQUxUWVBFU19IX18KLQotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9NQUpPUiAgICAgICAgMwotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9NSU5PUiAgICAgICAgMAotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9SRVZJU0lPTiAgICA2Ci0KLS8qKgotICogICAgTTRQVE8zR1BQIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLS8qKgotICogICAgSW50ZXJuYWxseSB1c2VkIG1vZHVsZXMgKi8KLQotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAvKiBXcml0ZSAzR1BQIGZpbGUgICAgKi8KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIgICAgLyogUmVhZCBBTVIgZmlsZSAgICAqLwotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00UFRPM0dQUF9TdGF0ZXMKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBNNFBUTzNHUFAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rU3RhdGVfQ1JFQVRFRCAgICAgICAgID0gMCwgICAgLyoqPCBNNFBUTzNHUFBfSW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCAgICAgICAgICA9IDEsICAgIC8qKjwgTTRQVE8zR1BQX09wZW4gaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSAgICAgICAgICAgPSAyLCAgICAvKio8IFN0ZXAgY2FuIGJlIGNhbGxlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQgICAgICAgID0gMywgICAgLyoqPCBUcmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfQ0xPU0VEICAgICAgICAgID0gNCAgICAgLyoqPCBPdXRwdXQgZmlsZSBoYXMgYmVlbiBjcmVhdGVkICovCi19Ci1NNFBUTzNHUFBfU3RhdGVzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFBUTzNHUFBfU3RyZWFtU3RhdGUKLSAqIEBicmllZiAgICAgICAgU3RhdGUgb2YgYSBtZWRpYSBzdHJlYW0gZW5jb2RpbmcgKGF1ZGlvIG9yIHZpZGVvKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSAgPSAwLCAgICAvKio8IE5vIHN0cmVhbSBwcmVzZW50ICovCi0gICAgTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEICAgPSAxLCAgICAvKio8IFRoZSBzdHJlYW0gZW5jb2RpbmcgaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEICA9IDIgICAgLyoqPCBUaGUgc3RyZWFtIGhhcyBmaW5pc2hlZCBlbmNvZGluZyAqLwotfQotTTRQVE8zR1BQX1N0cmVhbVN0YXRlOwotCi0vKgotICogRGVmaW5pdGlvbiBvZiBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNFBUTzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPICAgICAwLjhGICAgIC8qKjwgTWF4IEFVIHNpemUgd2lsbCBiZSAwLjggdGltZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0OjI6MCBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPICAgIDEuMkYgLyoqPCBNYXggY2h1bmsgc2l6ZSB3aWxsIGJlIDEuMiB0aW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9BVURJT19NQVhfQVVfU0laRSAgICAgICAgICAgICAgMTAwMCAgICAvKio8IEFBQyBtYXggQVUgc2l6ZSBzZWVtcyB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCA4NTAgYnl0ZXMgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FVRElPX01BWF9DSFVOS19TSVpFICAgICAgICAgICA1MDAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIGFub255bW91cyBlbnVtCi0gKiBAYnJpZWYgICAgICAgIGVudW0gdG8ga2VlcCB0cmFjayBvZiB0aGUgZW5jb2RlciBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1lbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tOb0VuY29kZXIsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyQ2xvc2VkLAotICAgIE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyUnVubmluZwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNNFBUTzNHUFAgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgTTRQVE8zR1BQIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogICAgTTRQVE8zR1BQIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRQVE8zR1BQX1N0YXRlcyAgICAgICAgICAgICBtX1N0YXRlOyAgICAgICAgICAgIC8qKjwgTTRQVE8zR1BQIGludGVybmFsIHN0YXRlICovCi0gICAgTTRQVE8zR1BQX1BhcmFtcyAgICAgICAgICAgICBtX1BhcmFtczsgICAgICAgICAgIC8qKjwgTTRQVE8zR1BQIHBhcmFtZXRlcnMsIHNldCBieSB0aGUgdXNlciAqLwotICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZSAgICAgICAgbV9WaWRlb1N0YXRlOyAgICAgICAvKio8IFN0YXRlIG9mIHRoZSB2aWRlbyBlbmNvZGluZyAqLwotICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZSAgICAgICAgbV9BdWRpb1N0YXRlOyAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBhdWRpbyBlbmNvZGluZyAqLwotCi0gICAgLyoqCi0gICAgICogICAgT1NBTCBmaWxlIHJlYWQvd3JpdGUgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgcE9zYWxGaWxlUmVhZDsgICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgcE9zYWxGaWxlV3JpdGU7ICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0KLSAgICAvKioKLSAgICAgKiAgICBSZWFkZXIgc3R1ZmYgKi8KLSAgICBNNF9BY2Nlc3NVbml0KiAgICAgICAgICAgICAgICBtX3BSZWFkZXJBdWRpb0FVOyAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgICBtX3BSZWFkZXJBdWRpb1N0cmVhbTsvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotCi0gICAgLyoqCi0gICAgICogICAgV3JpdGVyIHN0dWZmICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1fV3JpdGVyVmlkZW9BVTsgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1fV3JpdGVyQXVkaW9BVTsgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRFTkNPREVSX0hlYWRlciogICAgICAgICAgIG1fcEVuY29kZXJIZWFkZXI7ICAgICAgLyoqPCBTZXF1ZW5jZSBoZWFkZXIgcmV0dXJuZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGF0IGVuY29kZXIgY3JlYXRlIChpZiBhbnkpICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgIG1fcFdyaXRlclZpZGVvU3RyZWFtOyAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiAgICBtX3BXcml0ZXJBdWRpb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKiAgbV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvOyAgICAvKio8IFZpZGVvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MqICAgIG1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbzsgICAvKio8IEF1ZGlvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotCi0gICAgLyoqCi0gICAgICogICAgQ29udGV4dHMgb2YgdGhlIHVzZWQgbW9kdWxlcyAgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9SZWFkZXJDb250ZXh0OyAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIHJlYWRlciBtb2R1bGUqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3AzZ3BXcml0ZXJDb250ZXh0OyAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciBtb2R1bGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wTXA0RW5jb2RlckNvbnRleHQ7ICAvKio8IE1wNCBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgbV9lRW5jb2RlclN0YXRlOwotCi0gICAgLyoqCi0gICAgICogUmVhZGVyIEludGVyZmFjZXMgKi8KLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgIG1fcFJlYWRlckdsb2JJbnQ7ICAgIC8qKjwgUmVhZGVyIGNvbW1vbiBpbnRlcmZhY2UsIGdsb2JhbCBwYXJ0ICovCi0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICBtX3BSZWFkZXJEYXRhSW50OyAgICAgLyoqPCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSwgZGF0YSBwYXJ0ICovCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXIgSW50ZXJmYWNlcyAqLwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICBtX3BXcml0ZXJHbG9iSW50OyAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSwgZ2xvYmFsIHBhcnQgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgbV9wV3JpdGVyRGF0YUludDsgICAgIC8qKjwgV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UsIGRhdGEgcGFydCAqLwotCi0gICAgLyoqCi0gICAgICogRW5jb2RlciBJbnRlcmZhY2VzICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogIG1fcEVuY29kZXJJbnQ7ICAgICAgICAgICAgICAgIC8qKjwgRW5jb2RlciBjb21tb24gaW50ZXJmYWNlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgIG1fcEVuY29kZXJFeHRlcm5hbEFQSTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgbV9wRW5jb2RlclVzZXJEYXRhOwotCi0gICAgLyoqCi0gICAgICogKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgICBwU2F2ZWRQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICB1aVNhdmVkRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgICBWaWRlbyByYXRlIGNvbnRyb2wgc3R1ZmYgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9kTGFzdFZpZGVvUmVndWxDdHM7IC8qKjwgTGFzdCB0aW1lIChDVFMpIHRoZSB2aWRlbyBiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRpb24gaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXRDdHM7ICAgICAgICAgLyoqPCBDdXJyZW50IHZpZGVvIGN0cyAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX210TmV4dEN0czsgICAgIC8qKjwgTmV4dCB2aWRlbyBDVFMgdG8gdHJhbnNjb2RlICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXRBdWRpb0N0czsgICAgLyoqPCBDdXJyZW50IGF1ZGlvIGN0cyAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX0F1ZGlvT2ZmU2V0OyAgIC8qKjwgQXVkaW8gT2Zmc2V0IHRvIGFkZCB0byB0aGUgY3RzIGluIGxvb3AgbW9kZSovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fUHJldkF1ZGlvQ3RzOyAgLyoqPCBQcmV2aW91cyBhdWRpbyBjdHMgZm9yIEFBQyBsb29waW5nICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fRGVsdGFBdWRpb0N0czsgLyoqPCBEZWx0YSBhdWRpbyBjdHMgZm9yIEFBQyBsb29waW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fQ3VycmVudEZpbGVTaXplOyAvKio8IEN1cnJlbnQgT3V0cHV0IGZpbGUgc2l6ZSAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9NYXhGaWxlU2l6ZTsgICAgIC8qKjwgTWF4IE91dHB1dCBmaWxlIHNpemUgICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1fSXNMYXN0UGljdHVyZTsgICAvKio8IEEgYm9vbGVhbiB0aGF0IHNpZ25hbHMgdG8gdGhlIGVuY29kZXIgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgdG8gYmUgZW5jb2RlZCovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1fYkxhc3RJbnRlcm5hbENhbGxCYWNrOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX05iQ3VycmVudEZyYW1lOyAgLyoqPCBJbmRleCBvZiB0aGUgY3VycmVudCBZVVYgZnJhbWUgZW5jb2RlZCAqLwotCi0gICAgLyoqCi0gICAgICogICAgQXVkaW8gcGFkZGluZyBtb2RlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgbV9iQXVkaW9QYWRkaW5nU2lsZW5jZTsgIC8qKjwgQSBib29sZWFuIHRoYXQgc2lnbmFscyB0aGF0IGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVUgd2lsbCBiZSBwYWRkZWQgYnkgc2lsZW5jZSAqLwotfSBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX2FwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICAgQ2FsbCBhbiBleHRlcm5hbCBjYWxsYmFjayB0byBnZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTTRQVE8zR1BQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKSBDb250YWlucyB0aGUgaW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwgY29udGFpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IFlVVjQyMCBpbWFnZSByZWFkIHdpdGggdGhlIG1fcFBpY3R1cmVDYWxsYmFja0ZjdAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYmI3MTQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsODE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0FQSV9IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfQVBJX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9BUEkuaAotICogQGJyaWVmICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBwdWJsaWMgQVBJLgotICogQG5vdGUgICAgVlNTIGFsbG93cyBlZGl0aW5nIDNHUFAgZmlsZXMuCi0gKiAgICAgICAgICBJdCBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZnVsbHkgc3luY2hyb25vdXMgQVBJLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICogIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgT1NBTCB0eXBlcyBmb3IgZmlsZSBhY2Nlc3MgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKioKLSAqICBEZWZpbml0aW9uIG9mIE00X1ZlcnNpb25JbmZvICovCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICogSW1hZ2UgcGxhbmVzIGRlZmluaXRpb24gKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLQotLyoqCi0gKiBFeHRlbmRlZCBBUEkgKHhWU1MpICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotI2luY2x1ZGUgIk00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCIKLSNlbmRpZgotCi0vLyNpbmNsdWRlICJNNFZEX0hXX0FQSS5oIgotLy8jaW5jbHVkZSAiTTRWRV9BUEkuaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEVkaXRpb24gRmVhdHVyZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGVkaXQgY29udGV4dCAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNFZTUzNHUFBfRWRpdENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lICAgICAgICAgICA9IDAsICAvKio8IE5vIHZpZGVvIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2sgID0gOCwgIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrICAgID0gMTYsIC8qKjwgSW50ZW5kZWQgZm9yIGVuZCBlZmZlY3QgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCAgICAgICA9IDI1NiAvKio8IEV4dGVybmFsIGVmZmVjdCBmdW5jdGlvbiBpcyB1c2VkICovCi0gICAgLyogcmVzZXJ2ZWQgMjU2ICsgbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFeHRlcm5hbCBlZmZlY3QgbnVtYmVyIG4gKi8KLQotfSBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX0F1ZGlvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBhdWRpbyBlZmZlY3QgdHlwZXMgb2YgdGhlIFZTUzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfTm9uZSAgICA9IDAsCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZUluICA9IDgsIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX0ZhZGVPdXQgPSAxNiAvKio8IEludGVuZGVkIGZvciBlbmQgZWZmZWN0ICovCi0KLX0gTTRWU1MzR1BQX0F1ZGlvRWZmZWN0VHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0aGF0IGNhbiBiZSBhcHBsaWVkIGR1cmluZyBhIHRyYW5zaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lICAgICAgPSAwLAotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGUgPSAxLAotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCAgPSAyNTYKLSAgICAvKiByZXNlcnZlZCAyNTYgKyBuICovICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVybmFsIHRyYW5zaXRpb24gbnVtYmVyIG4gKi8KLQotfSBNNFZTUzNHUFBfVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9BdWRpb1RyYW5zaXRpb25UeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGF1ZGlvIGVmZmVjdCB0aGF0IGNhbiBiZSBhcHBsaWVkIGR1cmluZyBhIHRyYW5zaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lID0gMCwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfQ3Jvc3NGYWRlCi0KLX0gTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIEVmZmVjdAotICogICAgICAgICAgYW5kIFRyYW5zaXRpb24gZnVuY3Rpb25zCi0gKiBAbm90ZSAgICBUaGUgdWlQcm9ncmVzcyB2YWx1ZSBzaG91bGQgYmUgZW5vdWdoIGZvciBtb3N0IGNhc2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBQcm9ncmVzcyBvZiB0aGUgRWZmZWN0IG9yIHRoZSBUcmFuc2l0aW9uLCBmcm9tIDAgdG8gMTAwMCAob25lIHRob3VzYW5kKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVByb2dyZXNzOwotICAgIC8qKjwgSW5kZXggb2YgdGhlIGN1cnJlbnQgY2xpcCAoZmlyc3QgY2xpcCBpbiBjYXNlIG9mIGEgVHJhbnNpdGlvbiksIGZyb20gMCB0byBOICovCi0gICAgLy9NNE9TQV9VSW50OCAgICAgdWlDdXJyZW50Q2xpcDsKLSAgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBpbiB0aGUgY3VycmVudCBjbGlwIHRpbWUtbGluZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aUNsaXBUaW1lOwotICAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGluIHRoZSBvdXRwdXQgY2xpcCB0aW1lLWxpbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlPdXRwdXRUaW1lOwotICAgIE00T1NBX0Jvb2wgICAgICAgIGJJc0xhc3Q7Ci0KLX0gTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfY29kZWNUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvZGVjIHR5cGVzIHVzZWQgdG8gY3JlYXRlIGludGVyZmFjZXMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZTUzNHUFAgc2VydmljZXMgdG8gaWRlbnRpZnkKLSAqICAgICAgICAgICAgIGEgY3VycmVudGx5IHN1cHBvcnRlZCBjb2RlYyBpbnRlcmZhY2UuIEVhY2ggY29kZWMgaXMKLSAqICAgICAgICAgICAgcmVnaXN0ZXJlZCB3aXRoIG9uZSBvZiB0aGlzIHR5cGUgYXNzb2NpYXRlZC4KLSAqICAgICAgICAgICAgV2hlbiBhIGNvZGVjIGluc3RhbmNlIGlzIG5lZWRlZCwgdGhpcyB0eXBlIGlzIHVzZWQgdG8KLSAqICAgICAgICAgICAgaWRlbnRpZnkgYW5kIHJldHJpZXZlIGl0cyBpbnRlcmZhY2UuCi0gKiAgICAgICAgICAgIFRoaXMgY2FuIGJlIGV4dGVuZGVkIGZvciBvdGhlciBjb2RlY3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qIFZpZGVvIERlY29kZXIgVHlwZXMgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRGVjTVBFRzQgPSAwLAotICAgIE00VlNTM0dQUF9rVmlkZW9EZWNIMjY0LAotCi0gICAgLyogVmlkZW8gRW5jb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNNUEVHNCwKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2MywKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2NCwKLQotICAgIC8qIEF1ZGlvIERlY29kZXIgVHlwZXMgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjQU1STkIsCi0gICAgTTRWU1MzR1BQX2tBdWRpb0RlY0FBQywKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjTVAzLAotCi0gICAgLyogQXVkaW8gRW5jb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9FbmNBTVJOQiwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRW5jQUFDLAotCi0gICAgLyogbnVtYmVyIG9mIGNvZGVjcywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnksIGJlZm9yZSBpbnZsYWlkIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa0NvZGVjVHlwZV9OQiwKLSAgICAvKiBpbnZhbGlkIGNvZGVjIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa0NvZGVjVHlwZUludmFsaWQgPSAyNTUKLQotfSBNNFZTUzNHUFBfY29kZWNUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9lZGl0VmlkZW9FZmZlY3RGY3QKLSAqIEBicmllZiAgICAgICBCZWdpbiBhbmQgRW5kIHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSBvcmlnaW5hbCBpbWFnZSBvZiB0aGUgY2xpcC4KLSAqICAgICAgICAgICAgICBJdCBtdXN0IGFwcGx5IHRoZSB2aWRlbyBlZmZlY3QgdG8gYnVpbGQgdGhlIG91dHB1dCBpbWFnZS4KLSAqICAgICAgICAgICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIGVmZmVjdCBpcyBnaXZlbiwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMTAwMC4KLSAqICAgICAgICAgICAgICBXaGVuIHRoZSBlZmZlY3QgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMKLSAqICAgICAgICAgICAgICBhbmQgYnVmZmVycyBhcmUgdmFsaWQgYW5kIG93bmVkIGJ5IHRoZSBWU1MgM0dQUC4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwSW5wdXRQbGFuZXMgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcE91dHB1dFBsYW5lcyAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhyZWUgdmFsaWQgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gdHJhbnNpdGlvbiBwcm9ncmVzcy4KLSAqIEBwYXJhbSAgIHVpRXh0ZXJuYWxFZmZlY3RJZCAgKElOKSBXaGljaCBlZmZlY3QgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgKGZvciBleHRlcm5hbCBlZmZlY3RzKQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VlNTM0dQUF9lZGl0VmlkZW9FZmZlY3RGY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRXh0ZXJuYWxFZmZlY3RJZAotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvVHJhbnNpdGlvbkZjdAotICogQGJyaWVmICAgICAgIEV4dGVybmFsIHRyYW5zaXRpb24gZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgbXVzdCBtYXRjaCB0aGlzIHByb3RvdHlwZS4KLSAqIEBub3RlICAgICAgICBUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW1hZ2Ugb2YgdGhlIGZpcnN0IGNsaXAgYW5kCi0gKiAgICAgICAgICAgICAgdGhlIGltYWdlIG9mIHRoZSBzZWNvbmQgY2xpcC4gSXQgbXVzdCBidWlsZCB0aGUgb3V0cHV0IGltYWdlCi0gKiAgICAgICAgICAgICAgZnJvbSB0aGUgdHdvIGlucHV0IGltYWdlcy4KLSAqICAgICAgICAgICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIHRyYW5zaXRpb24gaXMgZ2l2ZW4sIG9uIGEgc2NhbGUgZnJvbSAwIHRvIDEwMDAuCi0gKiAgICAgICAgICAgICAgV2hlbiB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIGltYWdlIHBsYW5lCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgdmFsaWQgYW5kIG93bmVkIGJ5IHRoZSBWU1MgM0dQUC4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwQ2xpcDFJbnB1dFBsYW5lcyAgIChJTikgRmlyc3QgaW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcENsaXAySW5wdXRQbGFuZXMgICAoSU4pIFNlY29uZCBpbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwT3V0cHV0UGxhbmVzICAgICAgIChJTi9PVVQpIE91dHB1dCAoZmlsdGVyZWQpIFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyBlZmZlY3QgcHJvZ3Jlc3MuCi0gKiBAcGFyYW0gICB1aUV4dGVybmFsVHJhbnNpdGlvbklkICAgIChJTikgV2hpY2ggdHJhbnNpdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIGV4dGVybmFsIHRyYW5zaXRpb25zKQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VlNTM0dQUF9lZGl0VmlkZW9UcmFuc2l0aW9uRmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBDbGlwMUlucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwQ2xpcDJJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUV4dGVybmFsVHJhbnNpdGlvbklkCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGF1ZGlvL3ZpZGVvIGVmZmVjdCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBFZmZlY3Qgc3RhcnQgdGltZSBpcyByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpU3RhcnRUaW1lOyAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSAgICBWaWRlb0VmZmVjdFR5cGU7ICAgICAgIC8qKjwgTm9uZSwgRmFkZUluLCBGYWRlT3V0LCBldGMuICovCi0gICAgTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdCBFeHRWaWRlb0VmZmVjdEZjdDsgICAgIC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICpwRXh0VmlkZW9FZmZlY3RGY3RDdHh0Oy8qKjwgQ29udGV4dCBnaXZlbiB0byB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlICAgIEF1ZGlvRWZmZWN0VHlwZTsgICAgICAgLyoqPCBOb25lLCBGYWRlSW4sIEZhZGVPdXQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfRWZmZWN0U2V0dGluZ3MgICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXIKLSAqIEBicmllZiAgICBUcmFuc2l0aW9uIGJlaGF2aW9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1NwZWVkVXAgPSAwLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0xpbmVhciwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZERvd24sCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU2xvd01pZGRsZSwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9GYXN0TWlkZGxlCi19IE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdHJhbnNpdGlvbiB0byBiZSBhcHBsaWVkIHdoZW4gYXNzZW1ibGluZyB0d28gY2xpcHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiwgaW4gbWlsbGlzZWNvbmRzIChzZXQgdG8gMCB0byBnZXQgbm8gdHJhbnNpdGlvbikgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgIC8qKjwgVHlwZSBvZiB0aGUgdmlkZW8gdHJhbnNpdGlvbiAqLwotICAgIE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlICAgIFZpZGVvVHJhbnNpdGlvblR5cGU7Ci0KLSAgICAvKio8IEV4dGVybmFsIHRyYW5zaXRpb24gdmlkZW8gZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRWU1MzR1BQX2VkaXRWaWRlb1RyYW5zaXRpb25GY3QgRXh0VmlkZW9UcmFuc2l0aW9uRmN0OwotCi0gICAgLyoqPCBDb250ZXh0IG9mIHRoZSBleHRlcm5hbCB0cmFuc2l0aW9uIHZpZGVvIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0OwotICAgIE00VlNTM0dQUF9BdWRpb1RyYW5zaXRpb25UeXBlICAgIEF1ZGlvVHJhbnNpdGlvblR5cGU7ICAgLyoqPCBUeXBlIG9mIHRoZSBhdWRpbyB0cmFuc2l0aW9uICovCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXIgICAgIFRyYW5zaXRpb25CZWhhdmlvdXI7ICAgIC8qKjxUcmFuc2l0aW9uIGJlaGF2aW91ciovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX1RyYW5zaXRpb25TZXR0aW5ncyAgICAgICAgeFZTUzsKLSNlbmRpZgotCi19IE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGlucHV0IGNsaXAgZm9yIHRoZSBlZGl0aW9uLgotICogQG5vdGUgICAgSXQgYWxzbyBjb250YWlucyB0aGUgc2V0dGluZ3MgZm9yIHRoZSBjdXQgYW5kIGJlZ2luL2VuZCBlZmZlY3RzIGFwcGxpZWQgdG8gdGhlIGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICpwRmlsZTsgICAgICAgICAgICAvKio8IENsaXAgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICBGaWxlVHlwZTsgICAgICAgICAvKio8IC4zZ3AsIC5hbXIsIC5tcDMgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aFNpemU7ICAgICAgLyoqPCBDbGlwIHBhdGggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbikqLwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAgQ2xpcFByb3BlcnRpZXM7ICAgLyoqPCBDbGlwIGFuYWx5c2lzIHByZXZpb3VzbHkgY29tcHV0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRUaW1lOyAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRUaW1lOyAgICAgLyoqPCBFbmQgY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgYlRyYW5zY29kaW5nUmVxdWlyZWQ7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX0NsaXBTZXR0aW5ncyAgICAgICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX0NsaXBTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVmaW5lIGEgY29tcGxldGUKLSAqICAgICAgICAgIGVkaXRpb24gb3BlcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50IG9mIHRoZSBjbGlwIGxpc3QgcENsaXBMaXN0ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgdWlDbGlwTnVtYmVyOwotICAgIC8qKjwgVGhlIHByb3BlcnRpZXMgb2YgdGhpcyBjbGlwIHdpbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgY29tcGF0aWJpbGl0eSBjaGVja2luZyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgIHVpTWFzdGVyQ2xpcDsKLSAgICAvKio8IExpc3Qgb2YgdGhlIGlucHV0IGNsaXBzIHNldHRpbmdzLiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpQ2xpcE51bWJlcgotICAgICBjbGlwIHNldHRpbmdzIHBvaW50ZXJzICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgICAgKipwQ2xpcExpc3Q7Ci0gICAgLyoqPCBMaXN0IG9mIHRoZSB0cmFuc2l0aW9uIHNldHRpbmdzLiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpQ2xpcE51bWJlci0xCi0gICAgIHRyYW5zaXRpb24gc2V0dGluZ3MgcG9pbnRlcnMgKi8KLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICAgICAqKnBUcmFuc2l0aW9uTGlzdDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgICAgICAgICAqRWZmZWN0czsgICAgICAgICAvKio8IExpc3Qgb2YgZWZmZWN0cyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsgICAgIC8qKjwgTnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhlIGFib3ZlIGxpc3QgKi8KLSAgICAvKio8IEZyYW1lIHJhdGUgYXQgd2hpY2ggdGhlIG1vZGlmaWVkIHZpZGVvIHNlY3Rpb25zIHdpbGwgYmUgZW5jb2RlZCAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgIHZpZGVvRnJhbWVSYXRlOwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0RmlsZTsgICAgICAvKio8IE91dHB1dCAzR1BQIGNsaXAgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgdWlPdXRwdXRQYXRoU2l6ZTsgICAgLyoqPCBPdXRwdXQgZmlsZSBwYXRoIHNpemUqLwotICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgbWV0YWRhdGEgKCJtb292LmJpbiIpICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBUZW1wb3JhcnlGaWxlOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotICAgIE00eFZTU19FZGl0U2V0dGluZ3MgICAgICAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgUFRWb2xMZXZlbDsKLX0gTTRWU1MzR1BQX0VkaXRTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIGEgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIDNHUFAgZWRpdGluZwotICogQG5vdGUgICAgSXQgYWxzbyBmaWxscyBhIENsaXBBbmFseXNpcyBzdHJ1Y3R1cmUsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHR3bwotICogICAgICAgICAgY2xpcHMgYXJlIGNvbXBhdGlibGUKLSAqIEBwYXJhbSAgIHBDbGlwICAgICAgICAgICAgICAgKElOKSBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGlucHV0IDNHUFAvTVAzIGNsaXAgZmlsZS4KLSAqIEBwYXJhbSAgIHBDbGlwUHJvcGVydGllcyAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHBhcmFtICAgRmlsZVR5cGUgICAgICAgICAgICAoSU4pIFR5cGUgb2YgdGhlIGlucHV0IGZpbGUgKC4zZ3AsIC5hbXIsIC5tcDMpCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfSDI2M19QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQwotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKE00T1NBX1ZvaWQgKnBDbGlwLCBNNFZJREVPRURJVElOR19GaWxlVHlwZSBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAqcENsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgdHdvIGNsaXBzIGFyZSBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlcgotICogICAgICAgICAgZm9yIFZTUyAzR1BQIGVkaXRpbmcgYXNzZW1ibHkgZmVhdHVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcDFQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgIHBDbGlwMlByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfUExBVEZPUk0KLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkcKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAqcENsaXAxUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcDJQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRJbml0KCkKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgVlNTIDNHUFAgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIDNHUFAgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQqIHBDb250ZXh0LAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBTaXplIG9mIHRoZSBjbGlwIHBhdGggKG5lZWRlZCBmb3IgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlLCBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzIChkZXByZWNhdGVkKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiQ29weUVmZmVjdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbigpCi0gKiBAYnJpZWYgICBTZXQgdGhlIFZTUyAzR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMsIGFuZCBzZXQgdGhlIHNldHRpbmdzLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgIHBTZXR0aW5ncyAgICAgICAgICAgKElOKSBFZGl0IHNldHRpbmdzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdE9wZW4oTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBlZGl0aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGVkaXRpbmcgb3BlcmF0aW9uCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTpFZGl0aW9uIGlzIGRvbmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICogQGJyaWVmICAgRmluaXNoIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgVlNTIDNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZShNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoKQotICogQGJyaWVmICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEF1ZGlvIE1peGluZyBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGF1ZGlvIG1peGluZyBvcGVyYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9yaWdpbmFsQ2xpcEZpbGU7ICAgICAgLyoqPCBJbnB1dCAzR1BQIGNsaXAgZmlsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkZWRBdWRpb1RyYWNrRmlsZTsgICAvKio8IE5ldyBhdWRpbyB0cmFjayAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICBBZGRlZEF1ZGlvRmlsZVR5cGU7ICAgICAvKio8IEZpbGUgRm9ybWF0IG9mIHRoZSBuZXcgYXVkaW8gZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUFkZEN0czsgICAgICAgICAgICAgICAvKio8IFRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggdGhlIGFkZGVkIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQWRkVm9sdW1lOyAgICAgICAgICAgIC8qKjwgVm9sdW1lLCBpbiBwZXJjZW50YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5Mb29wOyAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRpbWUgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlFbmRMb29wOyAgICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBvZiB0aGUgbG9vcCAoMCBtZWFucyBubyBsb29wKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVtb3ZlT3JpZ2luYWw7ICAgICAgLyoqPCBJZiB0cnVlLCB0aGUgb3JpZ2luYWwgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dENsaXBGaWxlOyAgICAgIC8qKjwgT3V0cHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOyAgICAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIG1ldGFkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibW9vdi5iaW4iKSAqLwotICAgIC8qKjwgVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBvcHRpb25uYWwuIFRoZXkgYXJlIGp1c3QgdXNlZCBpbiBjYXNlIG9mIE1QMyByZXBsYWNlbWVudC4gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICAgb3V0cHV0QVNGOyAgICAgICAgIC8qKjwgT3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICBvdXRwdXRBdWRpb0Zvcm1hdDsgLyoqPCBPdXRwdXQgYXVkaW8gY29kZWMoQUFDL0FNUikqLwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0JpdHJhdGU7IC8qKjwgT3V0cHV0IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TkJDaGFubmVsczsgLyoqPCBPdXRwdXQgYXVkaW8gbmIgb2YgY2hhbm5lbHMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTG9vcDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOdW1DaGFubmVsczsKLX0gTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCogcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogcFNldHRpbmdzKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIHZhbGlkIGF1ZGlvIG1peGluZyBzZXR0aW5ncwotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCgKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogcFNldHRpbmdzLAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpbyBtaXhpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZmluYWxpemF0aW9uIG9wZXJhdGlvbgotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOiBBdWRpbyBtaXhpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93IGNhbGwgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKQotICogQGJyaWVmICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEV4dHJhY3QgUGljdHVyZSBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGV4dHJhY3QgcGljdHVyZSBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNldHRpbmdzIG9mIHRoZSBleHRyYWN0IHBpY3R1cmUgYXVkaW8gb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0Q2xpcEZpbGU7ICAvKio8IElucHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgaUV4dHJhY3Rpb25UaW1lOyAvKio8IGZyYW1lIHRpbWUgKGluIG1zKSB0byBiZSBleHRyYWN0ZWQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0WXV2UGljOyAgIC8qKjwgT3V0cHV0IFlVViBwaWN0dXJlIG5hbWUgKi8KLX0gTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU2V0dGluZ3M7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUluaXQoKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgZXh0cmFjdCBwaWN0dXJlIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcFdpZHRoICAgICAgICAgICAgICAgIChPVVQpIHZpZGVvIHN0cmVhbSB3aWR0aAotICogQHBhcmFtICAgIHBIZWlnaHQgICAgICAgICAgICAgICAgKE9VVCkgdmlkZW8gc3RyZWFtIGhlaWdodAotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQMTogICAgVGhlIGlucHV0IGNsaXAgaXMgZW1wdHkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUluaXQoCi0gICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5ncyogcFNldHRpbmdzLAotICAgICAgICBNNE9TQV9VSW50MzIgKnBXaWR0aCwKLSAgICAgICAgTTRPU0FfVUludDMyICpwSGVpZ2h0LAotICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVTdGVwKCkKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgcGljdHVyZSBleHRyYWN0aW9uLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEBwYXJhbSAgIHBEZWNQbGFuZXMgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUGxhbmUgaW4gd2ljaCB0aGUgZXh0cmFjdGVkIHBpY3R1cmUgaXMgY29waWVkCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwaWN0dXJlIGV4dHJhY3Rpb24KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIFZTU19XQVJfRU5EX09GX0VYVFJBQ1RfUElDVFVSRTogUGljdHVyZSBleHRyYWN0aW9uICBpcyBvdmVyLCB1c2VyIHNob3VsZCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZVN0ZXAoTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwRGVjUGxhbmVzLCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlQ2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIHBpY3R1cmUgZXh0cmFjdGlvbi4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGV4dHJhY3QgcGljdHVyZSBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIENvbW1vbiBmZWF0dXJlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbigpCi0gKiBAYnJpZWYgICBHZXQgdGhlIFZTUyB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotCi0KLSNpZmRlZiBXSU4zMgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSgpCi0gKiBAYnJpZWYgICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZXJyb3IgY29kZQotICogQG5vdGUgICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGFscmVhZHkgYWxsb2NhdGVkIChhbmQgbG9uZyBlbm91Z2ghKQotICogQHBhcmFtICAgZXJyICAgICAgICAgICAgIChJTikgRXJyb3IgY29kZSB0byBnZXQgdGhlIGRlc2NyaXB0aW9uIGZyb20KLSAqIEBwYXJhbSAgIHNNZXNzYWdlICAgICAgICAoSU4vT1VUKSBBbGxvY2F0ZWQgc3RyaW5nIGluIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGJlIGNvcGllZAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgIElucHV0IGVycm9yIGlzIGZyb20gdGhlIFZTUzNHUFAgbW9kdWxlCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6SW5wdXQgZXJyb3IgaXMgbm90IGZyb20gdGhlIFZTUzNHUFAgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKE00T1NBX0VSUiBlcnIsIE00T1NBX0NoYXIqIHNNZXNzYWdlKTsKLSNlbmRpZiAvKio8IFdJTjMyICovCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzUwMGRhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0Vycm9yQ29kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0Vycm9yQ29kZXMuaAotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZXJyb3IgZGVmaW5pdGlvbnMuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICAgIEVuZCBvZiBlZGl0aW9uLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfZWRpdENsb3NlKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAwMSkKLQotLyoqCi0gKiAgICBFbmQgb2YgYXVkaW8gbWl4aW5nLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAxMCkKLQotLyoqCi0gKiAgICBFbmQgb2YgZXh0cmFjdCBwaWN0dXJlLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAyMCkKLS8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDMwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3IgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSW52YWxpZCBmaWxlIHR5cGUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDEpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IGtpbmQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDIpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IHR5cGUgZm9yIHZpZGVvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDAzKQotLyoqCi0gKiBJbnZhbGlkIGVmZmVjdCB0eXBlIGZvciBhdWRpbyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwNCkKLS8qKgotICogSW52YWxpZCB0cmFuc2l0aW9uIHR5cGUgZm9yIHZpZGVvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA1KQotLyoqCi0gKiBJbnZhbGlkIHRyYW5zaXRpb24gdHlwZSBmb3IgYXVkaW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX1RSQU5TSVRJT05fVFlQRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDYpCi0vKioKLSAqIEludmFsaWQgdmlkZW8gZW5jb2RpbmcgZnJhbWUgcmF0ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA3KQotIC8qKgotICogRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uIGlzIHVzZWQgd2l0aG91dCBiZWluZyBzZXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDgpCi0vKioKLSAqIEV4dGVybmFsIHRyYW5zaXRpb24gZnVuY3Rpb24gaXMgdXNlZCB3aXRob3V0IGJlaW5nIHNldCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTCAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwOSkKLQotLyoqCi0gKiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbiB0aGUgY2xpcCBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTiAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMCkKLS8qKgotICogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIG9yIGVxdWFsIHRoYW4gZW5kIGN1dCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9FTkRfQ1VUICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMSkKLS8qKgotICogVHdvIGNvbnNlY3V0aXZlIHRyYW5zaXRpb25zIGFyZSBvdmVybGFwcGluZyBvbiBvbmUgY2xpcCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMikKLQotLyoqCi0gKiBBbiBpbnB1dCAzR1BQIGZpbGUgaXMgaW52YWxpZC9jb3JydXB0ZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRSAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTYpCi0vKioKLSAqIEEgZmlsZSBjb250YWlucyBhbiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTcpCi0vKioKLSAqIEEgZmlsZSBjb250YWlucyBhbiB1bnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTgpCi0KLS8qKgotICogQSBmaWxlIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBWU1MgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTkpCi0gLyoqCi0gKiAgICBBbiBpbnB1dCBjbGlwIGhhcyBhbiB1bmV4cGVjdGVkbHkgbGFyZ2UgVmlkZW8gQVUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUEpCi0vKioKLSAqICAgIEFuIGlucHV0IGNsaXAgaGFzIGFuIHVuZXhwZWN0ZWRseSBsYXJnZSBBdWRpbyBBVSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQikKLS8qKgotICogICAgQW4gaW5wdXQgY2xpcCBoYXMgYSBjb3JydXB0ZWQgQXVkaW8gQU1SIEFVICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUMpCi0vKioKLSAqIFRoZSB2aWRlbyBlbmNvZGVyIGVuY291bnRlcmVkIGFuIEFjY2VzIFVuaXQgZXJyb3I6IHZlcnkgcHJvYmFibHkgYSBmaWxlIHdyaXRlIGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUQpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVycm9ycyByZXR1cm5lZCBieSBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIGZvcm1hdCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFUIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjApCi0vKioKLSAqIFVuc3VwcG9ydGVkIEgyNjMgcHJvZmlsZSBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfSDI2M19QUk9GSUxFIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjEpCi0vKioKLSAqIFVuc3VwcG9ydGVkIE1QRUctNCBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjIpCi0vKioKLSAqIFVuc3VwcG9ydGVkIE1QRUctNCBSVkxDIHRvb2wgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDIzKQotLyoqCi0gKiBVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI0KQotIC8qKgotICogRmlsZSBjb250YWlucyBubyBzdXBwb3J0ZWQgc3RyZWFtICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAyNSkKLS8qKgotICogRmlsZSBjb250YWlucyBubyB2aWRlbyBzdHJlYW0gb3IgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMjYpCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX1BST0ZJTEUgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyNykKLQotLyoqCi0gKiBVbnN1cHBvcnRlZCB2aWRlbyBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19MRVZFTCBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI4KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3JzIHJldHVybmVkIGJ5IE00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eSgpICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogQXQgbGVhc3Qgb25lIG9mIHRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBhbm90aGVyIHZlcnNpb24gb2YgdGhlIFZTUyAzR1BQICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04gICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMwKQotLyoqCi0gKiBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHZpZGVvIGZvcm1hdCAoSDI2MyBvciBNUEVHNCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzEpCi0vKioKLSAqICAgIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgZnJhbWUgc2l6ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMikKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBNUEVHLTQgdGltZSBzY2FsZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19USU1FX1NDQUxFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMykKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB1c2Ugb2YgTVBFRy00IGRhdGEgcGFydGl0aW9uaW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAzNCkKLS8qKgotICogICAgTVAzIGNsaXBzIGNhbid0IGJlIGFzc2VtYmxlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzNSkKLS8qKgotICogIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgYXVkaW8gc3RyZWFtIHR5cGUgKGV4OiBBTVIgIT0gQUFDKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRSAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAzNikKLS8qKgotICogIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgYXVkaW8gbnVtYmVyIG9mIGNoYW5uZWxzIChleDogc3RlcmVvICE9IG1vbm8pICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDM3KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBzYW1wbGluZyBmcmVxdWVuY3kgKGV4OiA0NDEwMEh6ICE9IDE2MDAwSHopICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMzgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBdWRpbyBtaXhpbmcgZXJyb3IgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFRoZSBpbnB1dCAzR1BQIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHRyYWNrICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDUwKQotLyoqCi0gKiBUaGUgVm9sdW1lIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAoQWRkVm9sdW1lKSBtdXN0IGJlIHN0cmljdGx5IHN1cGVyaW9yIHRoYW4gemVybyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDA1MSkKLS8qKgotICogVGhlIHRpbWUgYXQgd2hpY2ggdGhlIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIChBZGRDdHMpIGNhbid0IGJlIHN1cGVyaW9yIHRoYW4gdGhlCi0gICBpbnB1dCB2aWRlbyB0cmFjayBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1MikKLS8qKgotICogVGhlIGF1ZGlvIHRyYWNrIGZpbGUgZm9ybWF0IHNldHRpbmcgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDUzKQotLyoqCi0gKiBUaGUgYWRkZWQgYXVkaW8gdHJhY2sgc3RyZWFtIGhhcyBhbiB1bnN1cHBvcnRlZCBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0gICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDU0KQotLyoqCi0gKiBUaGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgZG9lc24ndCBzdXBwb3J0IEVWUkMsIE1QMyBhdWRpbyB0cmFja3MgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19NSVhJTkdfVU5TVVBQT1JURUQgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDU1KQotLyoqCi0gKiBBbiBhZGRlZCBhdWRpbyB0cmFjayBsaW1pdCB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzOiB1aUFkZEN0cyBtdXN0IGJlIDAKLSAgIGFuZCBiUmVtb3ZlT3JpZ2luYWwgbXVzdCBiZSBNNE9TQV9UUlVFICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTYpCi0vKioKLSAqIElucHV0IGF1ZGlvIHRyYWNrIGlzIG5vdCBBTVItTkIgbm9yIEFBQyBzbyBpdCBjYW4ndCBiZSBtaXhlZCB3aXRoIG91dHB1dCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRCAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU3KQotLyoqCi0gKiBJbnB1dCBjbGlwIG11c3QgYmUgYSAzZ3BwIGZpbGUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1OCkKLS8qKgotICogQmVnaW4gbG9vcCB0aW1lIGlzIGhpZ2hlciB0aGFuIGVuZCBsb29wIHRpbWUgb3IgaGlnaGVyIHRoYW4gYWRkZWQgY2xpcCBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUCAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU5KQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBdWRpbyBtaXhpbmcgYW5kIGV4dHJhY3QgcGljdHVyZSBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBIMjYzIFByb2ZpbGUgMyBsZXZlbCAxMCBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDYwKQotLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHZpZGVvIHN0cmVhbSBvciBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNjEpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEludGVybmFsIGVycm9yIGFuZCB3YXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEludGVybmFsIHN0YXRlIGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEUgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDApCi0vKioKLSAqIEx1bWluYW5jZSBmaWx0ZXIgZWZmZWN0IGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDQpCi0vKioKLSAqIFRyYW5zaXRpb24gZmlsdGVyIGVmZmVjdCBlcnJvciAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1RSQU5TSVRJT05fRklMVEVSX0VSUk9SICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTA2KQotLyoqCi0gKiBUaGUgYXVkaW8gZGVjb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExMCkKLS8qKgotICogVGhlIGRlY29kZXIgcHJvZHVjZWQgYW4gdW5hdHRlbmRlZCBhbW91bnQgb2YgUENNICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMTUpCi0vKioKLSAqIE91dHB1dCBmaWxlIG11c3QgYmUgM0dQUCBvciBNUDMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9PVVRQVVRfRklMRV9UWVBFX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExNykKLS8qKgotICogQ2FuIG5vdCBmaW5kIGEgdmFsaWQgdmlkZW8gZnJhbWUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTE4KQotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY2OGI2Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VlNTM0dQUF9FWFRFTkRFRF9BUElfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0VYVEVOREVEX0FQSV9IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgKLSAqIEBicmllZiAgICBBUEkgb2YgeFZTUwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotI2Vycm9yICIqKiogdGhlIGZsYWcgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUyBzaG91bGQgYmUgYWN0aXZhdGVkIGluIENvbXBpbGVyU3dpdGNoZXNcCi0gICAgICAgICAgICAgZm9yIFZpZGVvU3R1ZGlvICoqKiIKLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfZ2V0VGV4dFJnYkJ1ZmZlckZjdAotICogQGJyaWVmICAgICAgICBFeHRlcm5hbCB0ZXh0IHRvIFJHQiBidWZmZXIgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSByZW5kZXJpbmdEYXRhLCB0aGUgdGV4dCBidWZmZXIgYW5kCi0gKiAgICAgICAgICAgICAgICBpdHMgc2l6ZS4gSXQgbXVzdCBidWlsZCB0aGUgb3V0cHV0IFJHQiBpbWFnZSBwbGFuZSBjb250YWluaW5nIHRoZSB0ZXh0LgotICoKLSAqIEBwYXJhbSAgIHBSZW5kZXJpbmdEYXRhICAgIChJTikgVGhlIGRhdGEgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgcFRleHRCdWZmZXIgICAgICAgIChJTikgVGV4dCBidWZmZXIgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgdGV4dEJ1ZmZlclNpemUgICAgKElOKSBUZXh0IGJ1ZmZlciBzaXplIGdpdmVuIGJ5IHRoZSB1c2VyIGluIE00eFZTU19FZmZlY3RTZXR0aW5ncwotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZSAgICAoSU4vT1VUKSBPdXRwdXQgUkdCNTY1IGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNHhWU1NfZ2V0VGV4dFJnYkJ1ZmZlckZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwUmVuZGVyaW5nRGF0YSwKLSAgICBNNE9TQV9Wb2lkICpwVGV4dEJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgdGV4dEJ1ZmZlclNpemUsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKipwT3V0cHV0UGxhbmUKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19CR01TZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYWRkIEJhY2tncm91bmQgbXVzaWMgdG8gM2dwIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAqcEZpbGU7ICAgICAgICAgLyoqPCBJbnB1dCBmaWxlIHBhdGggKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgRmlsZVR5cGU7ICAgICAgIC8qKjwgLjNncCwgLmFtciwgLm1wMyAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBZGRDdHM7ICAgICAgIC8qKjwgVGltZSwgaW4gbWlsbGlzZWNvbmRzLCBhdCB3aGljaCB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQWRkVm9sdW1lOyAgICAgLyoqPCBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUJlZ2luTG9vcDsgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZSBzdGFydCB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsb29wICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpRW5kTG9vcDsgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIGVuZCB0aW1lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJfRHVja2luZ05lZWRlZWQ7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIEluRHVja2luZ190aHJlc2hvbGQ7ICAvKio8IFRocmVzaG9sZCB2YWx1ZSBhdCB3aGljaCBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpYyBzaGFsbCBkdWNrICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGxvd1ZvbHVtZTsgICAgICAgLyoqPCBsb3dlciB0aGUgYmFja2dyb3VuZCB0cmFjayB0byB0aGlzIGZhY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbmNyZWFzZSB0aGUgcHJpbWFyeSB0cmFjayB0byBpbnZlcnNlIG9mIHRoaXMgZmFjdG9yICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aU51bUNoYW5uZWxzOwotfSBNNHhWU1NfQkdNU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rUkdCODg4ICAgICAgICAgICA9IDAsICAvKio8IFJHQjg4OCBkYXRhIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa1JHQjU2NSAgICAgICAgICAgPSAxICAvKio8IFJHQjU2NSBkYXRhIHR5cGUgKi8KLQotfSBNNFZTUzNHUFBfUkdCVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8vdmlkZW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgSW4gcGVyY2VudCBvZiB0aGUgY3V0IGNsaXAgZHVyYXRpb24gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVN0YXJ0UGVyY2VudDsKLSAgICAvKio8IEluIHBlcmNlbnQgb2YgdGhlICgoY2xpcCBkdXJhdGlvbikgLSAoZWZmZWN0IHN0YXJ0dGltZSkpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlEdXJhdGlvblBlcmNlbnQ7Ci0gICAgLyoqPCBGcmFtaW5nIGZpbGUgcGF0aCAoR0lGL1BORyBmaWxlKSwgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgKnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgLyoqPCBGcmFtaW5nIFJHQjU2NSBidWZmZXIsICB1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAqcEZyYW1pbmdCdWZmZXI7Ci0gICAgLyoqPFJHQiBCdWZmZXIgdHlwZSx1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNFZTUzNHUFBfUkdCVHlwZSAgICAgICAgICByZ2JUeXBlOwotICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFggY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUgd2hlcmUgdGhlIGFkZGVkIGZyYW1lIHdpbGwgYmUgZGlzcGxheWVkLgotICAgICBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgfHwgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB0b3BsZWZ0X3g7Ci0gICAgLyoqPCBUaGUgdG9wLWxlZnQgWSBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQgcGljdHVyZSB3aGVyZSB0aGUgYWRkZWQgZnJhbWUgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyB8fCBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRvcGxlZnRfeTsKLSAgICAvKio8IERvZXMgZnJhbWluZyBpbWFnZSBpcyByZXNpemVkIHRvIG91dHB1dCB2aWRlbyBzaXplLgotICAgICBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICBiUmVzaXplOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIGZyYW1pbmdTY2FsZWRTaXplOwotLyoqPCBTaXplIHRvIHdoaWNoIHRoZSB0aGUgZnJhbWluZyBmaWxlIG5lZWRzIHRvIGJlIHJlc2l6ZWQgKi8KLSAgICAvKio8IFRleHQgYnVmZmVyLiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwVGV4dEJ1ZmZlcjsKLSAgICAvKio8IFRleHQgYnVmZmVyIHNpemUuIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRleHRCdWZmZXJTaXplOwotICAgIC8qKjwgUG9pbnRlciBjb250YWluaW5nIHNwZWNpZmljIGRhdGEgdXNlZCBieSB0aGUgZm9udCBlbmdpbmUgKHNpemUsIGNvbG9yLi4uKSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBSZW5kZXJpbmdEYXRhOwotICAgIC8qKjwgVGV4dCBwbGFuZSB3aWR0aC4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlUZXh0QnVmZmVyV2lkdGg7Ci0gICAgLyoqPCBUZXh0IHBsYW5lIGhlaWdodC4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlUZXh0QnVmZmVySGVpZ2h0OwotICAgIC8qKjwgUHJvY2Vzc2luZyByYXRlIG9mIHRoZSBlZmZlY3QgYWRkZWQgd2hlbiB1c2luZyB0aGUgRmlmdGllcyBlZmZlY3QgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUZpZnRpZXNPdXRGcmFtZVJhdGU7Ci0gICAgLyoqPCBSR0IxNiBpbnB1dCBjb2xvciBvZiB0aGUgZWZmZWN0IGFkZGVkIHdoZW4gdXNpbmcgdGhlIHJnYjE2IGNvbG9yIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgIHVpUmdiMTZJbnB1dENvbG9yOwotCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nU3RhcnQ7ICAgICAgIC8qU3RhcnQgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nTWlkZGxlOyAgICAgIC8qTWlkZGxlIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0VuZDsgICAgICAgICAvKkVuZCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOyAgLypEdXJhdGlvbiwgaW4gcGVyY2VudGFnZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0IGR1cmF0aW9uLCBvZiB0aGUgRmFkZUluIHBoYXNlKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsgICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLCBvZiB0aGUgRmFkZU91dCBwaGFzZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHdpZHRoOyAgIC8qd2lkdGggb2YgdGhlIEFSR0I4ODg4IGNsaXAgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIGhlaWdodDsgLypoZWlnaHQgb2YgdGhlIEFSR0I4ODg4IGNsaXAgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi19IE00eFZTU19FZmZlY3RTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGFscGhhIG1hZ2ljIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgcEFscGhhRmlsZVBhdGg7ICAgICAgICAvKio8IEFscGhhIGZpbGUgcGF0aCAoSlBHIGZpbGUpICAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50OyAgICAvKio8IEJsZW5kaW5nIFBlcmNlbnRhZ2UgYmV0d2VlbiAwIGFuZCAxMDAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgIGlzcmV2ZXJzZTsgICAgICAgICAgICAvKio8IGRpcmVjdCBlZmZlY3Qgb3IgcmV2ZXJzZSAqLwotICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4OCA6IGdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHdpZHRoOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGhlaWdodDsKLX0gTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbgotICogQGJyaWVmICAgIERlZmluZXMgZGlyZWN0aW9ucyBmb3IgdGhlIHNsaWRlIHRyYW5zaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9SaWdodE91dExlZnRJbiwKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0xlZnRPdXRSaWdodEluLAotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fVG9wT3V0Qm90dG9tSW4sCi0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9Cb3R0b21PdXRUb3BJbgotfSBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNsaWRlIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9EaXJlY3Rpb24gZGlyZWN0aW9uOyAvKiBkaXJlY3Rpb24gb2YgdGhlIHNsaWRlICovCi19IE00eFZTU19TbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFkZGl0aW9uYWwgdHJhbnNpdGlvbiBzZXR0aW5ncyBzcGVjaWZpYyB0bwotICogICAgICAgICAgICB4VlNTLCB3aGljaCBhcmUgYXBwZW5kZWQgdG8gdGhlIFZTUzNHUFAgdHJhbnNpdGlvbiBzZXR0aW5ncwotICogICAgICAgICAgICBzdHJ1Y3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBBbnl0aGluZyB4VlNTLXNwZWNpZmljLCBidXQgY29tbW9uIHRvIGFsbCB0cmFuc2l0aW9ucywgd291bGQgZ28gaGVyZSwKLSAgICBiZWZvcmUgdGhlIHVuaW9uLiAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgLyoqPCBBbHBoYU1hZ2ljIHNldHRpbmdzLCB1c2VkIG9ubHkgaWYgVmlkZW9UcmFuc2l0aW9uVHlwZSA9PQotICAgICAgICAgICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWMgKi8KLSAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncyAgICAgICAgKnBBbHBoYU1hZ2ljU2V0dGluZ3M7Ci0gICAgICAgIC8qIG9ubHkgaW4gY2FzZSBvZiBzbGlkZSB0cmFuc2l0aW9uLiAqLwotICAgICAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgICAgKnBTbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLSAgICB9IHRyYW5zaXRpb25TcGVjaWZpYzsKLX0gTTR4VlNTX1RyYW5zaXRpb25TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZwotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIGRpZmZlcmVudCBtZWRpYSByZW5kZXJpbmcgdXNpbmcgZXhpZiBvcmllbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rUmVzaXppbmcgPSAwLCAgICAgICAgLypUaGUgcGljdHVyZSBpcyByZXNpemVkLCB0aGUgYXNwZWN0IHJhdGlvIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIG9yaWdpbmFsIG9uZS4gQWxsIG9mIHRoZSBwaWN0dXJlIGlzIHJlbmRlcmVkKi8KLSAgICBNNHhWU1Nfa0Nyb3BwaW5nLCAgICAgICAgICAgIC8qVGhlIHBpY3R1cmUgaXMgY3JvcHBlZCwgdGhlIGFzcGVjdCByYXRpbyBpcyB0aGUgc2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9uZS4gVGhlIHBpY3R1cmUgaXMgbm90IHJlbmRlcmVkIGVudGlyZWx5Ki8KLSAgICBNNHhWU1Nfa0JsYWNrQm9yZGVycyAgICAgICAgLypCbGFjayBib3JkZXJzIGFyZSByZW5kZXJlZCBpbiBvcmRlciB0byBrZWVwIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0IHJhdGlvLiBBbGwgdGhlIHBpY3R1cmUgaXMgcmVuZGVyZWQqLwotCi19IE00eFZTU19NZWRpYVJlbmRlcmluZzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19DbGlwU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gaW5wdXQgY2xpcCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBJdCBhbHNvIGNvbnRhaW5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGN1dCBhbmQgYmVnaW4vZW5kIGVmZmVjdHMgYXBwbGllZCB0byB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFBlcmNlbnQ7ICAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIHBlcmNlbnQgb2YgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIChvbmx5IGZvciAzR1BQIGNsaXAgISkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudDsgICAgLyoqPCBFbmQgY3V0IHRpbWUsIGluIHBlcmNlbnQgb2YgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIChvbmx5IGZvciAzR1BQIGNsaXAgISkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpRHVyYXRpb247ICAgICAgICAgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgY2xpcCwgaWYgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAwLCBoYXMgcHJpb3JpdHkgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFRpbWUgb3IgdWlFbmRDdXRQZXJjZW50ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFuWm9vbTsgICAgICAgICAgICAvKio8IFJDOiBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuIGFuZCB6b29tIG1vZGUgaXMgZW5hYmxlZCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhhOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21YYjsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhiOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFliOyAgICAvKio8IFJDICovCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7ICAgICAgICAvKio8IEZCIG9ubHkgdXNlZCB3aXRoIEpQRUc6IHRvIGNyb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZSwgb3IgcmVuZGVyIGJsYWNrIGJvcmRlcnMqLwotCi19IE00eFZTU19DbGlwU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTR4VlNTX0VkaXRTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZWZpbmUgYSBjb21wbGV0ZQotICogICAgICAgICAgZWRpdGlvbiBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgT3V0cHV0IHZpZGVvIHNpemUgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgICBvdXRwdXRWaWRlb1NpemU7Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gZm9ybWF0IChNUEVHNCAvIEgyNjMpICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgYXVkaW8gZm9ybWF0IChBQUMsIEFNUk5CIC4uLikgKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBzYW1wbGluZyBmcmVxICg4MDAwSHosLi4uKSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICAgIG91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgIC8qKjwgTWF4aW11bSBvdXRwdXQgZmlsZSBzaXplIGluIEJZVEVTIChpZiBzZXQgdG8gMCwgbm8gbGltaXQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlU2l6ZTsKLSAgICAvKio8IElzIG91dHB1dCBhdWRpbyBtdXN0IGJlIE1vbm8gPyBWYWxpZCBvbmx5IGZvciBBQUMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGJpdHJhdGUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBiaXRyYXRlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgLyoqPCBCYWNrZ3JvdW5kIG11c2ljIHRyYWNrIHNldHRpbmdzICovCi0gICAgTTR4VlNTX0JHTVNldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgKnBCR010cmFjazsKLSAgICAvKio8IEZ1bmN0aW9uIHBvaW50ZXIgb24gdGV4dCByZW5kZXJpbmcgZW5naW5lLCBpZiBub3QgdXNlZCwgbXVzdCBiZSBzZXQgdG8gTlVMTCAhISAqLwotICAgIE00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0ICAgICAgICAgICAgICAgIHBUZXh0UmVuZGVyaW5nRmN0OwotICAgIC8qKiBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwqLwotICAgIE00T1NBX0ludDMyICAgb3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyICAgb3V0cHV0VmlkZW9MZXZlbDsKLQotfSBNNHhWU1NfRWRpdFNldHRpbmdzOwotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfRVhURU5ERURfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjY2OWZlYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0lOVEVSTkFMQ09ORklHX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9JTlRFUk5BTENPTkZJR19IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaAotICogQGJyaWVmICAgIFRoaXMgZmlsZSBjb250YWlucyBzb21lIG1hZ2ljYWwgYW5kIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFZpZGVvRWRpdGlvbiBjb25maWcgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfTUlOSU1BTF9UUkFOU0lUSU9OX0RVUkFUSU9OICAgICAgICAgICAgMTAwICAgIC8qKjwgMTAwIG1pbGxpc2Vjb25kcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0ggICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAvKio8IHByZWZlY3QgNCBBVXMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX05PX1NUU1NfSlVNUF9QT0lOVCAgICAgICAgICAgICAgICAgICAgNDAwMDAgLyoqPCBJZiAzZ3AgZmlsZSBkb2VzIG5vdCBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gU1RTUyB0YWJsZSAobm8gcmFwIGZyYW1lcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcCBiYWNrd2FyZCA0MCBzIG1heGltdW0gKi8KLQotLyoqKioqKioqKioqKioqKioqLwotLyogV3JpdGVyIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMgotCi0vKio8IE1heCBBVSBzaXplIHdpbGwgYmUgMC44IHRpbWVzIHRoZSBZVVY0OjI6MCBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAgICAgICAgICAwLjlGCi0vKio8IE1heCBjaHVuayBzaXplIHdpbGwgYmUgMS4yIHRpbWVzIHRoZSBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfVklERU9fQVVfU0laRV9UT19DSFVOQ0tfU0laRV9SQVRJTyAgICAxLjJGCi0KLS8qKiBSRUFEIENBUkVGVUxMWSBJTiBDQVNFIE9GIFJFUE9SVEVEIFJVTk5JTkcgVFJPVUJMRVMKLVRoZSBtYXggQVUgc2l6ZSBpcyB1c2VkIHRvIHByZS1zZXQgbWF4IHNpemUgb2YgQVUgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbiB0aGUgM0dQIHdyaXRlcgotRm9yIGF1ZGlvIHN0YW5kYXJkIHdpdGggdmFyaWFibGUgQVUgc2l6ZSwgdGhlcmUgY291bGQgYmUgc29tZSBlbmNvZGluZyBzZXR0aW5ncyBsZWFkaW5nIHRvIEFVIHNpemUKLWV4Y2VlZGluZyB0aGlzIGxpbWl0LgotRm9yIEFBQyBzdHJlYW1zIGZvciBpbnN0YW5jZSB0aGUgYXZlcmFnZSBBVSBzaXplIGlzIGdpdmVuIGJ5OgotYXYgQVUgc2l6ZSA9IChhdiBiaXRyYXRlICogMTAyNCkvKHNhbXBsaW5nIGZyZXEpCi1JZiBWU1MgcmV0dXJucyB0aGUgbWVzc2FnZToKLT4+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+bGFzdERlY29kZWRQbGFuZSA9IHBQbGFuZU91dDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAqIHBQbGFuZU91dFswXS51X3dpZHRoKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwUGxhbmVPdXRbMV0udV9oZWlnaHQgKiBwUGxhbmVPdXRbMV0udV93aWR0aCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0ICogcFBsYW5lT3V0WzJdLnVfd2lkdGgpKTsKLSAgICAgICAgcEMtPmxhc3REZWNvZGVkUGxhbmUgPSBwUGxhbmVPdXQ7Ci0gICAgfQotCi0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEFwcGx5VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2FhMTViLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZzcwotIwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX2NvcmUKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRQVE8zR1BQX0FQSS5jIFwKLSAgICAgIE00UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYyBcCi0gICAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00eFZTU19BUEkuYyBcCi0gICAgICBNNHhWU1NfaW50ZXJuYWwuYyBcCi0gICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmcuYyBcCi0gICAgICBNNFZTUzNHUFBfQ2xpcC5jIFwKLSAgICAgIE00VlNTM0dQUF9DbGlwQW5hbHlzaXMuYyBcCi0gICAgICBNNFZTUzNHUFBfQ29kZWNzLmMgXAotICAgICAgTTRWU1MzR1BQX0VkaXQuYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMgXAotICAgICAgTTRWU1MzR1BQX0VkaXRWaWRlby5jIFwKLSAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAotICAgICAgTTRDaGFubmVsQ29udmVydGVyLmMgXAotICAgICAgTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYyBcCi0gICAgICBNNEFJUl9BUEkuYyBcCi0gICAgICBNNFJFQURFUl9QY20uYyBcCi0gICAgICBNNFBDTVJfQ29yZVJlYWRlci5jIFwKLSAgICAgIE00QURfTnVsbC5jIFwKLSAgICAgIE00QU1SUl9Db3JlUmVhZGVyLmMgXAotICAgICAgTTRSRUFERVJfQW1yLmMgXAotICAgICAgTTRWRF9Ub29scy5jIFwKLSAgICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcCBcCi0gICAgICBNNERFQ09ERVJfTnVsbC5jCi0KLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCi0gICAgbGliYXVkaW9mbGluZ2VyICAgICAgICAgICAgIFwKLSAgICBsaWJhdWRpb3V0aWxzICAgICAgICAgICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJsb2cgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX3ZpZGVvZmlsdGVycyBcCi0gICAgbGlidmlkZW9lZGl0b3JwbGF5ZXIgICAgICAgIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiBcCi0gICAgbGlidmlkZW9lZGl0b3JfbWNzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9zdGFnZWZyaWdodHNoZWxscyBcCi0gICAgbGlidmlkZW9lZGl0b3JfM2dwd3JpdGVyIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKFRPUCkvc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0gICAgJChUT1ApL3N5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFbm8gXAotICAgIC1EREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBRF9OdWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkMWVjNzMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRBRF9OdWxsLmMKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBNUDMgZGVjb2RlciBwdWJsaWMgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBhICJudWxsIiBhdWRpbyBkZWNvZGVyLCB0aGF0IGlzIGEgZGVjb2RlcgotICogICAgICAgICAgdGhhdCBkbyBub3RoaW5nIGV4Y2VwdCBnZXR0aW5nIEFVIGZyb20gdGhlIHJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00QURfTnVsbC5oIgotCi0jZGVmaW5lIE00QURfRk9SQ0VfMTZCSVRTCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTlVMTCBBdWRpbyBEZWNvZGVyIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00QURfTlVMTF9NQUpPUiAgICAxCi0jZGVmaW5lIE00QURfTlVMTF9NSU5PUiAgICAxCi0jZGVmaW5lIE00QURfTlVMTF9SRVZJU0lPTiA0Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00QURfTnVsbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgSW50ZXJuYWwgbnVsbCBkZWNvZGVyIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgUG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgIG1fcEF1ZGlvU3RyZWFtaGFuZGxlcjsKLX0gTTRBRF9OdWxsQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5YUCBNUDMgZGVjb2RlciBmdW5jdGlvbnMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBudWxsIGRlY29kZXIKLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICBQb2ludGVyIHRvIGFuIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHBhcmFtICAgIHBVc2VyRGF0YTogICAgICAgIChJTikgICAgUG9pbnRlciB0byBVc2VyIGRhdGEKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfY3JlYXRlKCAgTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKQotewotICAgIE00QURfTnVsbENvbnRleHQqIHBDOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFEX05VTExfY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRBRF9OVUxMX2NyZWF0ZTogaW52YWxpZCBwb2ludGVyIHBTdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBwQyA9IChNNEFEX051bGxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QURfTnVsbENvbnRleHQpLAotICAgICAgICAgICAgICAgICBNNERFQ09ERVJfQVVESU8sIChNNE9TQV9DaGFyICopIk00QURfTnVsbENvbnRleHQiKTsKLSAgICBpZiAocEMgPT0gKE00QURfTnVsbENvbnRleHQqKTApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQ2FuIG5vdCBhbGxvY2F0ZSBudWxsIGRlY29kZXIgY29udGV4dCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBDb250ZXh0ID0gcEM7Ci0KLSAgICBwQy0+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+PjEpOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGRhZDMwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRERUNPREVSX051bGwuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLS8qKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBNNERFQ09ERVJfTnVsbC5jDQotICogQGJyaWVmICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE51bGwgZGVjb2RlciBwdWJsaWMgaW50ZXJmYWNlDQotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSAibnVsbCIgdmlkZW8gZGVjb2RlciwgaS5lLiBhIGRlY29kZXINCi0gKiAgICAgICAgICB0aGF0IGRvZXMgbm90aGluZw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiDQotDQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiDQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiDQotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIg0KLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiDQotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCINCi0jaW5jbHVkZSAiTTRERUNPREVSX051bGwuaCINCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogTlVMTCBWaWRlbyBEZWNvZGVyIHZlcnNpb24gaW5mb3JtYXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9NQUpPUiAgICAxDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9NSU5PUiAgICAwDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9SRVZJU0lPTiAwDQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIHN0cnVjdHVyZSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dA0KLSAqIEBicmllZiAgICAgICBEZWZpbmVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIGEgdmlkZW8gZGVjb2RlciBpbnN0YW5jZQ0KLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGZyZWVkIGJ5IHRoZSB2aWRlbyBkZWNvZGVyDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgbV9wTGlicmFyeTsgICAgICAgICAgICAvLyBDb3JlIGxpYnJhcnkgaWRlbnRpZmllcg0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9EZWNvZGVySWQ7ICAgICAgICAgICAvLyBDb3JlIGRlY29kZXIgaWRlbnRpZmllcg0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9SZW5kZXJlcklkOyAgICAgICAgICAvLyBDb3JlIHJlbmRlcmVyIGlkZW50aWZpZXINCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgIG1fcFZpZGVvU3RyZWFtaGFuZGxlcjsgLy8gVmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uDQotICAgIE00X0FjY2Vzc1VuaXQqICAgICAgICAgICBtX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOyAvLyBBY2Nlc3MgdW5pdCB1c2VkIHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGFuZCBkZWNvZGUgb25lIGZyYW1lDQotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BVc2VyRGF0YTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYW55IHVzZXIgZGF0YQ0KLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgbV9wUmVhZGVyOyAgICAgICAgICAgICAvLyBSZWFkZXIgZGF0YSBpbnRlcmZhY2UNCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIG1fYkRvUmVuZGVyaW5nOyAgICAgICAgLy8gRGVjaWRlcyBpZiByZW5kZXIgcmVxdWlyZWQNCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc3RydWN0dXJlDQotDQotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqIG1fcFZpZGVvRmlsdGVyOyAgICAgICAgIC8vIENvbG9yIGNvbnZlcnNpb24gZmlsdGVyDQotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICpwRGVjWXV2RGF0YTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gWXV2IGRhdGEgcGxhbmUNCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgKnBEZWNZdXZXaXRoRWZmZWN0OyAgICAgLy8gUG9pbnRlciB0byBZdXYgcGxhbmUgd2l0aCBjb2xvciBlZmZlY3QNCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJZdXZXaXRoRWZmZWN0U2V0OyAgICAgLy8gT3JpZ2luYWwgWXV2IGRhdGEgT1IgWXV2IHdpdGggY29sb3IgZWZmZWN0DQotDQotfSBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dDsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dA0KLSAqDQotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgIChPVVQpICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgIFBvaW50ZXIgdG8gYSB2aWRlbyBzdHJlYW0gZGVzY3JpcHRpb24NCi0gKiBAcGFyYW0gICBwU3JjSW50ZXJmYWNlOiAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHRoYXQgbXVzdCBiZSB1c2VkIGJ5IHRoZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbQ0KLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0ICAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpIHdoZXJlIGRlY29kZWQgZGF0YQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkDQotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgQSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgQXQgbGVhc3Qgb25lIGlucHV0IHBhcmFtZXRlciBpcyBub3QgcHJvcGVyDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmVhZGVyRGF0YUludGVyZmFjZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQqIHBBY2Nlc3NVbml0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IE00T1NBX05VTEw7DQotDQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0ID0gKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCksIE00REVDT0RFUl9NUEVHNCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCIpOw0KLSAgICBpZiAocFN0cmVhbUNvbnRleHQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOw0KLSAgICB9DQotDQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQpOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZSA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BMaWJyYXJ5ICAgICAgICAgICAgICA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIgICA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX0RlY29kZXJJZCAgICAgICAgICAgICA9IC0xOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9SZW5kZXJlcklkICAgICAgICAgICAgPSAtMTsNCi0NCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFVzZXJEYXRhID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fYkRvUmVuZGVyaW5nID0gTTRPU0FfVFJVRTsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFZpZGVvRmlsdGVyID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPmJZdXZXaXRoRWZmZWN0U2V0ID0gTTRPU0FfRkFMU0U7DQotDQotICAgICpwQ29udGV4dD1wU3RyZWFtQ29udGV4dDsNCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkDQotICoNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IChNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCopcENvbnRleHQ7DQotDQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCksDQotICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNERFQ09ERVJfTlVMTF9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOw0KLQ0KLSAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsNCi0NCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBHZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIGRlY29kZXINCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6DQotICoNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0DQotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgd2hlcmUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaXMgc3RvcmVkDQotICoNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpDQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgV2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQ0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgIEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICBwVmFsdWUpIHsNCi0NCi0gICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIFNldCBhbiBvcHRpb24gdmFsdWUgb2YgdGhlIGRlY29kZXINCi0gKiBAbm90ZSAgICBBbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIG9wdGlvbiB0byBzZXQNCi0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUNCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7DQotDQotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIgKnBGaWx0ZXJPcHRpb247DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0ICpwU3RyZWFtQ29udGV4dCA9DQotICAgICAgICAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKWNvbnRleHQ7DQotDQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOw0KLSAgICBNNE9TQV9VSW50MzIgaGVpZ2h0ID0gMDsNCi0gICAgTTRPU0FfVUludDggKnBfc3JjLCpwX2RlczsNCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBUZW1wRGVjWXV2RGF0YSA9IE00T1NBX05VTEw7DQotDQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsNCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9EZWNZdXZEYXRhOg0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YSA9IChNNFZJRklfSW1hZ2VQbGFuZSAqKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91czoNCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3QgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilwVmFsdWU7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdDoNCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+Yll1dldpdGhFZmZlY3RTZXQgPSAoTTRPU0FfQm9vbClwVmFsdWU7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdE5vbkNvbnRpZ3VvdXM6DQotICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhID0gIChNNFZJRklfSW1hZ2VQbGFuZSAqKXBWYWx1ZTsNCi0NCi0gICAgICAgICAgICBwX2RlcyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzBdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgICAgIHBUZW1wRGVjWXV2RGF0YVswXS51X3RvcGxlZnQ7DQotDQotICAgICAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfaGVpZ2h0Ow0KLSAgICAgICAgICAgICBoZWlnaHQrKykgew0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2RlcywgKHZvaWQgKilwX3NyYywNCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3dpZHRoKTsNCi0NCi0gICAgICAgICAgICAgICAgcF9kZXMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgICAgICBwX3NyYyArPSBwVGVtcERlY1l1dkRhdGFbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHBfZGVzID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfdG9wbGVmdDsNCi0gICAgICAgICAgICBwX3NyYyA9IHBUZW1wRGVjWXV2RGF0YVsxXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgIHBUZW1wRGVjWXV2RGF0YVsxXS51X3RvcGxlZnQ7DQotDQotICAgICAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfaGVpZ2h0Ow0KLSAgICAgICAgICAgICBoZWlnaHQrKykgew0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2RlcywgKHZvaWQgKilwX3NyYywNCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoKTsNCi0NCi0gICAgICAgICAgICAgICAgcF9kZXMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgICAgICBwX3NyYyArPSBwVGVtcERlY1l1dkRhdGFbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHBfZGVzID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfdG9wbGVmdDsNCi0gICAgICAgICAgICBwX3NyYyA9IHBUZW1wRGVjWXV2RGF0YVsyXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgIHBUZW1wRGVjWXV2RGF0YVsyXS51X3RvcGxlZnQ7DQotDQotICAgICAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfaGVpZ2h0Ow0KLSAgICAgICAgICAgICBoZWlnaHQrKykgew0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2RlcywgKHZvaWQgKilwX3NyYywNCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3dpZHRoKTsNCi0NCi0gICAgICAgICAgICAgICAgcF9kZXMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgICAgICBwX3NyYyArPSBwVGVtcERlY1l1dkRhdGFbMl0udV9zdHJpZGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlcjoNCi0gICAgICAgICAgICBwRmlsdGVyT3B0aW9uID0gKE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9EZWJsb2NraW5nRmlsdGVyOg0KLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIGVycjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIERlY29kZSB2aWRlbyBBY2Nlc3MgVW5pdHMgdXAgdG8gYSB0YXJnZXQgdGltZQ0KLSAqIEBub3RlICAgIFBhcnNlIGFuZCBkZWNvZGUgdGhlIHZpZGVvIHVudGlsIGl0IGNhbiBvdXRwdXQgYSBkZWNvZGVkIGltYWdlDQotICogICAgICAgICAgZm9yIHdoaWNoIHRoZSBjb21wb3NpdGlvbiB0aW1lIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdG8gdGhlDQotICogICAgICAgICAgcGFzc2VkIHRhcmdldGVkIHRpbWUuDQotICogICAgICAgICAgVGhlIGRhdGEgYXJlIHJlYWQgZnJvbSB0aGUgcmVhZGVyIGRhdGEgaW50ZXJmYWNlIHBhc3NlZCB0bw0KLSAqICAgICAgICAgIE00REVDT0RFUl9NUEVHNF9jcmVhdGUuDQotICoNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgcFRpbWU6ICAgICAgKElOL09VVCkgICAgSU46IFRpbWUgdG8gZGVjb2RlIHVwIHRvIChpbiBtc2VjKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgKGluIG1zZWMpDQotICogQHBhcmFtICAgYkp1bXA6ICAgICAgKElOKSAgICAgICAgMCBpZiBubyBqdW1wIG9jY3VyZWQganVzdCBiZWZvcmUgdGhpcyBjYWxsDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBpZiBhIGEganVtcCBoYXMganVzdCBiZWVuIG1hZGUNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldA0KLSAqIEByZXR1cm4gIE00V0FSX05PX01PUkVfQVUgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgYWNjZXNzIHVuaXQgdG8gZGVjb2RlIChFT1MpDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2RlY29kZShNNE9TQV9Db250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9NZWRpYVRpbWUqIHBUaW1lLCBNNE9TQV9Cb29sIGJKdW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdG9sZXJhbmNlKSB7Ci0NCi0gICAgLy8gRG8gbm90aGluZzsgaW5wdXQgdGltZSBzdGFtcCBpdHNlbGYgcmV0dXJuZWQNCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBSZW5kZXJzIHRoZSB2aWRlbyBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuDQotICogQG5vdGUNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgKElOKSAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgcFRpbWU6ICAgICAgIChJTi9PVVQpICAgSU46IFRpbWUgdG8gcmVuZGVyIHRvIChpbiBtc2VjcykNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6VGltZSBvZiB0aGUgcmVuZGVyZWQgZnJhbWUgKGluIG1zKQ0KLSAqIEBwYXJhbSAgIHBPdXRwdXRQbGFuZTooT1VUKSAgICAgIE91dHB1dCBwbGFuZSBmaWxsZWQgd2l0aCBkZWNvZGVkIGRhdGENCi0gKiBAcGFyYW0gICBiRm9yY2VSZW5kZXI6KElOKSAgICAgICAxIGlmIHRoZSBpbWFnZSBtdXN0IGJlIHJlbmRlcmVkIGV2ZW4gaXQNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiByZW5kZXJlZCBhbHJlYWR5DQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBub3QNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0DQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkDQotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5DQotICogQHJldHVybiAgTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgICAgSWYgdGhlIGZyYW1lIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfcmVuZGVyKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfTWVkaWFUaW1lKiBwVGltZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cHV0UGxhbmUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJGb3JjZVJlbmRlcikgew0KLQ0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsNCi0gICAgTTRPU0FfVUludDMyIGhlaWdodDsNCi0gICAgTTRPU0FfVUludDggKnBfc3JjLCpwX2RlczsNCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqICAgIHBTdHJlYW1Db250ZXh0ID0NCi0gICAgICAgIChNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCopY29udGV4dDsNCi0NCi0gICAgaWYgKHBTdHJlYW1Db250ZXh0LT5iWXV2V2l0aEVmZmVjdFNldCA9PSBNNE9TQV9UUlVFKSB7DQotDQotICAgICAgICBwX2RlcyA9IHBPdXRwdXRQbGFuZVswXS5wYWNfZGF0YSArIHBPdXRwdXRQbGFuZVswXS51X3RvcGxlZnQ7DQotICAgICAgICBwX3NyYyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSArDQotICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBPdXRwdXRQbGFuZVswXS51X2hlaWdodDsgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2RlcywgKHZvaWQgKilwX3NyYywgcE91dHB1dFBsYW5lWzBdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVswXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9zdHJpZGU7DQotICAgICAgICB9DQotDQotICAgICAgICBwX2RlcyA9IHBPdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSArIHBPdXRwdXRQbGFuZVsxXS51X3RvcGxlZnQ7DQotICAgICAgICBwX3NyYyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSArDQotICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBPdXRwdXRQbGFuZVsxXS51X2hlaWdodDsgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2RlcywgKHZvaWQgKilwX3NyYywgcE91dHB1dFBsYW5lWzFdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVsxXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9zdHJpZGU7DQotICAgICAgICB9DQotDQotICAgICAgICBwX2RlcyA9IHBPdXRwdXRQbGFuZVsyXS5wYWNfZGF0YSArIHBPdXRwdXRQbGFuZVsyXS51X3RvcGxlZnQ7DQotICAgICAgICBwX3NyYyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS5wYWNfZGF0YSArDQotICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBPdXRwdXRQbGFuZVsyXS51X2hlaWdodDsgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2RlcywgKHZvaWQgKilwX3NyYywgcE91dHB1dFBsYW5lWzJdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9zdHJpZGU7DQotICAgICAgICB9DQotICAgIH0gZWxzZSB7DQotDQotICAgICAgICBwX2RlcyA9IHBPdXRwdXRQbGFuZVswXS5wYWNfZGF0YSArIHBPdXRwdXRQbGFuZVswXS51X3RvcGxlZnQ7DQotICAgICAgICBwX3NyYyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVswXS5wYWNfZGF0YSArDQotICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzBdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBPdXRwdXRQbGFuZVswXS51X2hlaWdodDsgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2RlcywgKHZvaWQgKilwX3NyYywgcE91dHB1dFBsYW5lWzBdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVswXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMF0udV9zdHJpZGU7DQotICAgICAgICB9DQotDQotICAgICAgICBwX2RlcyA9IHBPdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSArIHBPdXRwdXRQbGFuZVsxXS51X3RvcGxlZnQ7DQotICAgICAgICBwX3NyYyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsxXS5wYWNfZGF0YSArDQotICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzFdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBPdXRwdXRQbGFuZVsxXS51X2hlaWdodDsgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2RlcywgKHZvaWQgKilwX3NyYywgcE91dHB1dFBsYW5lWzFdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVsxXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMV0udV9zdHJpZGU7DQotICAgICAgICB9DQotDQotICAgICAgICBwX2RlcyA9IHBPdXRwdXRQbGFuZVsyXS5wYWNfZGF0YSArIHBPdXRwdXRQbGFuZVsyXS51X3RvcGxlZnQ7DQotICAgICAgICBwX3NyYyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsyXS5wYWNfZGF0YSArDQotICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzJdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBPdXRwdXRQbGFuZVsyXS51X2hlaWdodDsgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2Rlcywodm9pZCAqKXBfc3JjLHBPdXRwdXRQbGFuZVsyXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMl0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBlcnI7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gcERlY29kZXJUeXBlICAgICAgICA6IFBvaW50ZXIgdG8gYSBNNERFQ09ERVJfVmlkZW9UeXBlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVyIHR5cGUNCi0gKiBAcGFyYW0gcERlY29kZXJJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8NCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBkZWNvZGVyLg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gYW5kIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4NCi0gKg0KLSAqIEByZXR1cm5zIDogTTROT19FUlJPUiAgaWYgT0sNCi0gKiAgICAgICAgICAgIE00RVJSX0FMTE9DIGlmIGFsbG9jYXRpb24gZmFpbGVkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2dldEludGVyZmFjZSAoTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKipwRGVjb2RlckludGVyZmFjZSkgew0KLQ0KLSAgICAqcERlY29kZXJJbnRlcmZhY2UgPQ0KLSAgICAgICAgKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKA0KLSAgICAgICAgIHNpemVvZihNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UpLA0KLSAgICAgICAgIE00REVDT0RFUl9NUEVHNCwgKE00T1NBX0NoYXIgKikiTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlIik7DQotDQotICAgIGlmIChNNE9TQV9OVUxMID09ICpwRGVjb2RlckludGVyZmFjZSkgew0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOw0KLSAgICB9DQotDQotICAgICpwRGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZVlVVjQyMFA7DQotDQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGUgICAgPSBNNERFQ09ERVJfTlVMTF9jcmVhdGU7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgPSBNNERFQ09ERVJfTlVMTF9kZXN0cm95Ow0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uID0gTTRERUNPREVSX05VTExfZ2V0T3B0aW9uOw0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uID0gTTRERUNPREVSX05VTExfc2V0T3B0aW9uOw0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0RGVjb2RlICAgID0gTTRERUNPREVSX05VTExfZGVjb2RlOw0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVuZGVyICAgID0gTTRERUNPREVSX05VTExfcmVuZGVyOw0KLQ0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBDTVJfQ29yZVJlYWRlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBDTVJfQ29yZVJlYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzQzMjU0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQQ01SX0NvcmVSZWFkZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDcxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQQ01fUENNUmVhZGVyLmMKLSAqIEBicmllZiAgIFBDTSByZWFkZXIgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyBvZiB0aGUgUENNIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLSNpbmNsdWRlICJNNFBDTVJfQ29yZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUENNIHJlYWRlciB2ZXJzaW9uIG51bWJlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNFBDTVJfVkVSU0lPTl9NQUpPUiAxCi0jZGVmaW5lIE00UENNUl9WRVJTSU9OX01JTk9SIDAKLSNkZWZpbmUgTTRQQ01SX1ZFUlNJT05fUkVWSVNJT04gMAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfb3BlblJlYWQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVcmwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlclBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIGEgUENNIGZpbGUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBvcGVucyBhIFBDTSBmaWxlCi0gKiAgICAgICAgICAtIGluaXRpYWxpemVzIFBDTSBjb250ZXh0LAotICogICAgICAgICAgLSB2ZXJpZmllcyBQQ00gZmlsZSBmb3JtYXQKLSAqICAgICAgICAgIC0gRmlsbCBkZWNvZGVyIGNvbmZpZyBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gQ2hhbmdlcyBzdGF0ZSBvZiB0aGUgcmVhZGVyIGluICdPcGVuaW5nJwotICogQHBhcmFtICAgcENvbnRleHQ6IChPVVQpIFBvaW50ZXIgb24gdGhlIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgcFVybDogKElOKSBOYW1lIG9mIHRoZSBQQ00gZmlsZQotICogQHBhcmFtICAgcEZpbGVGdW5jdGlvbnM6IChJTikgUG9pbnRlciBvbiB0aGUgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yIGR1cmluZyB0aGUgb3BlbmluZwotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgICBwQ29udGV4dCBhbmQvb3IgcFVybCBhbmQvb3IgcEZpbGVGdW5jdGlvbiBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgTTRFUlJfRklMRV9OT1RfRk9VTkQgICAgICAgICAgICB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKLSAqIEByZXR1cm4gIE00UENNQ19FUlJfUENNX05PVF9DT01QTElBTlQgICAgdGhlIGZpbGUgZG9lcyBub3Qgc2VlbSB0byBiZSBjb21wbGlhbnQsIG5vIFJJRkYsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxhY2sgb2YgYW55IG1hbmRhdG9yeSBjaHVuay4KLSAqIEByZXR1cm4gIE00UENNQ19FUlJfUENNX05PVF9TVVBQT1JURUQgICAgdGhlIFBDTSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIKLSAqIEByZXR1cm4gIEFueSBNNE9TQV9GSUxFIGVycm9ycyAgICAgICAgICAgc2VlIE9TQUwgRmlsZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxlZCBlcnJvcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9vcGVuUmVhZChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKQotewotICAgIE00T1NBX0VSUiAgICAgICBlcnI7Ci0gICAgTTRQQ01SX0NvbnRleHQgKmNvbnRleHQ7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgIHBUZW1wVVJMOwotICAgIE00T1NBX0NoYXIgICAgICAgIHZhbHVlWzZdOwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IHBDb250ZXh0KXx8IChNNE9TQV9OVUxMID09IHBVcmwpIHx8KE00T1NBX05VTEwgPT0gcEZpbGVGdW5jdGlvbikpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlcyB0aGUgY29udGV4dCAqLwotICAgIGNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIGNvbnRleHQgPSAoTTRQQ01SX0NvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UENNUl9Db250ZXh0KSwgTTRXQVZfUkVBREVSLAotICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRQQ01SX29wZW5SZWFkIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpY29udGV4dDsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnRleHQgKi8KLSAgICBjb250ZXh0LT5tX29mZnNldCA9IDA7Ci0KLSAgICBjb250ZXh0LT5tX3N0YXRlICAgICAgICAgICAgPSBNNFBDTVJfa0luaXQ7Ci0gICAgY29udGV4dC0+bV9taWNyb1N0YXRlICAgICAgID0gTTRQQ01SX2tJbml0OwotICAgIGNvbnRleHQtPm1fcEZpbGVSZWFkRnVuYyAgICA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dC0+bV9maWxlQ29udGV4dCAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBjb250ZXh0LT5tX3BBdUJ1ZmZlciAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIGNvbnRleHQtPm1fcERlY29kZXJTcGVjSW5mbyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBTZXQgc2FtcGxlIGZyZXF1ZW5jeSAqLwotICAgIHBUZW1wVVJMID0gKE00T1NBX0NoYXIqKXBVcmwgKyAoc3RybGVuKChjb25zdCBjaGFyICopcFVybCktMTEpOwotICAgIE00T1NBX2Nock5Db3B5KHZhbHVlLCBwVGVtcFVSTCwgNSk7Ci0gICAgTTRPU0FfY2hyR2V0VUludDMyKHBUZW1wVVJMLCAmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kpLAotICAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0Ffa2NockRlYyk7Ci0KLSAgICAvKiBTZXQgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgcFRlbXBVUkwgKz0gNjsKLSAgICBNNE9TQV9jaHJOQ29weSh2YWx1ZSwgcFRlbXBVUkwsIDEpOwotICAgIE00T1NBX2NockdldFVJbnQxNihwVGVtcFVSTCwgJihjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVscyksCi0gICAgICAgICBNNE9TQV9OVUxMLCBNNE9TQV9rY2hyRGVjKTsKLQotICAgIE00T1NBX2Nock5Db3B5KHBVcmwscFVybCwgKHN0cmxlbigoY29uc3QgY2hhciAqKXBVcmwpLTEyKSk7Ci0gICAgLyogT3BlbiB0aGUgZmlsZSAqLwotICAgIGNvbnRleHQtPm1fZmlsZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIGVyciA9IHBGaWxlRnVuY3Rpb24tPm9wZW5SZWFkKCYoY29udGV4dC0+bV9maWxlQ29udGV4dCksIHBVcmwsIE00T1NBX2tGaWxlUmVhZCk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBjb250ZXh0LT5tX2RlY29kZXJDb25maWcuQml0c1BlclNhbXBsZSA9IDE2OwotICAgIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5BdmdCeXRlc1BlclNlYyA9IGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgKiAyIFwKLSAgICAgICAgKiBjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVsczsKLSAgICBlcnIgPSBwRmlsZUZ1bmN0aW9uLT5nZXRPcHRpb24oY29udGV4dC0+bV9maWxlQ29udGV4dCwgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUsCi0gICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopJihjb250ZXh0LT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgY29udGV4dC0+bV9ibG9ja1NpemUgPSAyMDQ4ICogY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHM7ICAvLyBSYXcgUENNLiAgSGVuY2UsIGdldCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaHVuayBvZiBkYXRhCi0KLSAgICBpZihjb250ZXh0LT5tX2RlY29kZXJDb25maWcuU2FtcGxlRnJlcXVlbmN5ID09IDgwMDApCi0gICAgewotICAgICAgICAvKiBBTVIgY2FzZSwgbm8gcGIgKi8KLSAgICAgICAgY29udGV4dC0+bV9ibG9ja1NpemUgPSBjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVscyAqXAotICAgICAgICAgICAgIChjb250ZXh0LT5tX2RlY29kZXJDb25maWcuU2FtcGxlRnJlcXVlbmN5IC8gNTApICogXAotICAgICAgICAgICAgICAgIChjb250ZXh0LT5tX2RlY29kZXJDb25maWcuQml0c1BlclNhbXBsZSAvIDgpOwotICAgIH0KLSAgICBpZihjb250ZXh0LT5tX2RlY29kZXJDb25maWcuU2FtcGxlRnJlcXVlbmN5ID09IDE2MDAwKQotICAgIHsKLSAgICAgICAgLyogQUFDIGNhc2UsIHdlIGNhbid0IHJlYWQgb25seSAyMCBtcyBibG9ja3MgKi8KLSAgICAgICAgY29udGV4dC0+bV9ibG9ja1NpemUgPSAyMDQ4ICogY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHM7Ci0gICAgfQotICAgIGNvbnRleHQtPm1fZGF0YVN0YXJ0T2Zmc2V0ID0gMDsKLSAgICBjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMgPSBwRmlsZUZ1bmN0aW9uOwotCi0gICAgY29udGV4dC0+bV9wQXVCdWZmZXIgPSAoTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhjb250ZXh0LT5tX2Jsb2NrU2l6ZSwgTTRXQVZfUkVBREVSLAotICAgICAgICAgKE00T1NBX0NoYXIgKikiQ29yZSBQQ00gcmVhZGVyIEFjY2VzcyBVbml0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gY29udGV4dC0+bV9wQXVCdWZmZXIpCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgIGNvbnRleHQtPm1fc3RhdGUgPSBNNFBDTVJfa09wZW5pbmc7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotY2xlYW51cDoKLQotICAgIC8qIENsb3NlIHRoZSBmaWxlICovCi0gICAgaWYoY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jICE9IE00T1NBX05VTEwpCi0gICAgICAgIGNvbnRleHQtPm1fcEZpbGVSZWFkRnVuYy0+Y2xvc2VSZWFkKGNvbnRleHQtPm1fZmlsZUNvbnRleHQpOwotCi0gICAgLyogRnJlZSBpbnRlcm5hbCBjb250ZXh0ICovCi0gICAgZnJlZShjb250ZXh0KTsKLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2MpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGdldCB0aGUgKHVuaXF1ZSkgc3RyZWFtIG9mIGEgUENNIGZpbGUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBBbGxvY2F0ZXMgYW5kIGZpbGxzIHRoZSBkZWNvZGVyIHNwZWNpZmljIGluZm8gc3RydWN0dXJlCi0gKiAgICAgICAgICAtIEZpbGxzIGRlY29kZXIgc3BlY2lmaWMgaW5mb3Mgc3RydWN0dXJlCi0gKiAgICAgICAgICAtIEZpbGxzIHBTdHJlYW1EZXNjIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcgotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBwU3RyZWFtRGVzYzogKElOKSBTdHJlYW0gRGVzY3JpcHRpb24gY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIEFueSBNNE9TQV9GSUxFICAgICAgZXJyb3JzIHNlZSBPU0FMIEZpbGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlsZWQgZXJyb3JzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYykKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCl8fCAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtRGVzYykpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChjLT5tX3N0YXRlID09IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgfQotICAgIC8qIENoZWNrIFJlYWRlcidzIG1fc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBPbmx5IG9uZSBzdHJlYW0gaXMgY29udGFpbmVkIGluIFBDTSBmaWxlICovCi0gICAgcFN0cmVhbURlc2MtPnN0cmVhbUlEID0gMTsKLSAgICAvKiBOb3QgdXNlZCAqLwotICAgIHBTdHJlYW1EZXNjLT5wcm9maWxlTGV2ZWwgPSAwOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHNpemVvZihNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0KLSAgICAvKiBBbGxvY2F0ZXMgZGVjb2RlciBzcGVjaWZpYyBpbmZvIHN0cnVjdHVyZSAqLwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8pLCBNNFdBVl9SRUFERVIsCi0gICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRQQ01SX2dldE5leHRTdHJlYW0iKTsKLSAgICBpZihwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAvKiBGaWxsIGRlY29kZXJTcGVjaWZpY0luZm8gc3RydWN0dXJlLCB3aXRoIGRlY29kZXIgY29uZmlnIHN0cnVjdHVyZSBmaWxsZWQgaW4gJ29wZW5yZWFkJwotICAgICAgICAgZnVuY3Rpb24gKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICh2b2lkICopJmMtPm1fZGVjb2RlckNvbmZpZywgc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKSk7Ci0KLSAgICAvKiBGaWxsIG90aGVyIGZpZWxkcyBvZiBwU3RyZWFtRGVzYyBzdHJ1Y3R1cmUgKi8KLSAgICBwU3RyZWFtRGVzYy0+dGltZVNjYWxlID0gMTAwMDsKLSAgICBwU3RyZWFtRGVzYy0+ZHVyYXRpb24gPSAoTTRPU0FfVGltZSkoKChNNE9TQV9Eb3VibGUpKGMtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKVwKLSAgICAgICAgIC8gKE00T1NBX0RvdWJsZSkoYy0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjKSkqcFN0cmVhbURlc2MtPnRpbWVTY2FsZSk7Ci0gICAgcFN0cmVhbURlc2MtPmF2ZXJhZ2VCaXRyYXRlID0gYy0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjICogODsvKiBpbiBiaXRzLCBtdWx0aXBseSBieSA4Ki8KLSAgICBwU3RyZWFtRGVzYy0+bWF4Qml0cmF0ZSA9IHBTdHJlYW1EZXNjLT5hdmVyYWdlQml0cmF0ZTsgLyogUENNIHN0cmVhbSBoYXMgY29uc3RhbnQgYml0cmF0ZSAqLwotCi0gICAgLyogRGV0ZXJtaW5lcyBTdHJlYW0gdHlwZSAqLwotICAgIHN3aXRjaChjLT5tX2RlY29kZXJDb25maWcuQml0c1BlclNhbXBsZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHN3aXRjaChjLT5tX2RlY29kZXJDb25maWcubmJDaGFubmVscykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa1BDTV84Yml0c1U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgICAgICAgICAgY2FzZSAyOgotLy8gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa1BDTV84Yml0c1M7IC8qID8/PyA4Yml0cyBzdGVyZW8gbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGRlZmluZWQgPyAqLwotLy8gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICBzd2l0Y2goYy0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tQQ01fMTZiaXRzVTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tQQ01fMTZiaXRzUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICB9Ci0KLSAgICBjLT5tX3BEZWNvZGVyU3BlY0luZm8gPSBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbzsKLQotICAgIGMtPm1fc3RhdGUgPSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcykKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHJlYWRpbmcgdGhlIHVuaXF1ZSBzdHJlYW0gb2YgYSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIHN0YXJ0IHJlYWRpbmcgYSBzdHJlYW0KLSAqICAgICAgICAgIC0gQ2hlY2sgdGhhdCBwcm92aWRlZCBTdHJlYW1JZCBpcyBjb3JyZWN0IChhbHdheXMgdHJ1ZSwgb25seSBvbmUgc3RyZWFtLi4uKQotICogICAgICAgICAgICBJbiB0aGUgcGxheWVyIGFwcGxpY2F0aW9uLCBhIFN0cmVhbUlkIHRhYmxlIGlzIGluaXRpYWxpemVkIGFzIGZvbGxvdzoKLSAqICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCBwU3RyZWFtSURbMl09ezEsMH07Ci0gKiAgICAgICAgICAtIENoYW5nZSBzdGF0ZSBvZiB0aGUgcmVhZGVyIGluICdSZWFkaW5nJwotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBzdHJlYW1JRDogKElOKSBTdHJlYW0gc2VsZWN0aW9uCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICBNNEVSUl9CQURfU1RSRUFNX0lEIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqICAgICAgICAgIChzaG91bGQgbmV2ZXIgaGFwcGVuIGlmIHRhYmxlIHBTdHJlYW1JRCBpcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgYXMgYWJvdmUpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IGNvbnRleHQpIHx8IChNNE9TQV9OVUxMID09IHBTdHJlYW1JRHMpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwU3RyZWFtSUQgYW5kIGlmIHRoZXkncmUgT0ssIGNoYW5nZSByZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKHBTdHJlYW1JRHNbMF0gPT0gMSB8fCBwU3RyZWFtSURzWzBdID09IDApCi0gICAgLyogRmlyc3QgYW5kIHVuaXF1ZSBzdHJlYW0gY29udGFpbmVkIGluIFBDTSBmaWxlICovCi0gICAgewotICAgICAgICBjLT5tX3N0YXRlID0gTTRQQ01SX2tSZWFkaW5nOwotICAgICAgICBjLT5tX21pY3JvU3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfbmV4dEFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIG5leHQgQVUgY29udGFpbmVkIGluIHRoZSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIHJlYWQgYW4gQVUKLSAqICAgICAgICAgIC0gQWxsb2NhdGVzIG1lbW9yeSB0byBzdG9yZSByZWFkIEFVCi0gKiAgICAgICAgICAtIFJlYWQgZGF0YSBmcm9tIGZpbGUgYW5kIHN0b3JlIHRoZW0gaW50byBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkKLSAqICAgICAgICAgIC0gRmlsbCBBVSBzdHJ1Y3R1cmUgZmlsZWRzIChDVFMuLi4pCi0gKiAgICAgICAgICAtIENoYW5nZSBzdGF0ZSBvZiB0aGUgcmVhZGVyIGluICdSZWFkaW5nJyAobm90IHVzZWZ1bC4uLikKLSAqICAgICAgICAgIC0gQ2hhbmdlIE1pY3JvIHN0YXRlICdSZWFkaW5nJyBpbiBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVCi0gKiAgICAgICAgICAgIChBVSBpcyByZWFkIGFuZCBjYW4gYmUgZGVsZXRlZCkKLSAqICAgICAgICAgIC0gQ2hlY2sgaWYgdGhlIGxhc3QgQVUgaGFzIGJlZW4gcmVhZCBvciBpZiB3ZSdyZSBhYm91dCB0byByZWFkIGl0Ci0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHN0cmVhbUlEOiAoSU4pIFN0cmVhbSBzZWxlY3Rpb24KLSAqIEBwYXJhbSAgIHBBVTogKElOL09VVCkgQWNjZXMgVW5pdCBTdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICBNNE00V0FSX05PX0RBVEFfWUVUIHRoZXJlIGlzIG5vIGVub3VnaCBkYXRhIGluIHRoZSBmaWxlIHRvIHByb3ZpZGUgYSBuZXcgYWNjZXNzIHVuaXQuCi0gKiBAcmV0dXJuICBNNFdBUl9FTkRfT0ZfU1RSRUFNIFRoZXJlIGlzIG5vIG1vcmUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIHNhbXBsZSBudW1iZXIgaXMgYmlnZ2VyIHRoZSBtYXhpbXVtIG9uZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZV9yZWFkOwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IGNvbnRleHQpIHx8IChNNE9TQV9OVUxMID09IHBBVSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcgJiYgYy0+bV9taWNyb1N0YXRlICE9IE00UENNUl9rUmVhZGluZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZXMgQVUgZGF0YUFkcmVzcyAqLwotICAgIHBBVS0+ZGF0YUFkZHJlc3MgPSBjLT5tX3BBdUJ1ZmZlcjsKLSAgICBzaXplX3JlYWQgICAgICAgID0gYy0+bV9ibG9ja1NpemU7Ci0KLSAgICBpZigoYy0+bV9vZmZzZXQgKyBzaXplX3JlYWQpID49IGMtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKQotICAgIHsKLSAgICAgICAgc2l6ZV9yZWFkID0gYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGggLSBjLT5tX29mZnNldDsKLSAgICB9Ci0KLSAgICAvKiBSZWFkIGRhdGEgaW4gZmlsZSwgYW5kIGNvcHkgaXQgdG8gQVUgU3RydWN0dXJlICovCi0gICAgZXJyID0gYy0+bV9wRmlsZVJlYWRGdW5jLT5yZWFkRGF0YShjLT5tX2ZpbGVDb250ZXh0LCAoTTRPU0FfTWVtQWRkcjgpcEFVLT5kYXRhQWRkcmVzcywKLSAgICAgICAgIChNNE9TQV9VSW50MzIgKikmc2l6ZV9yZWFkKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogQ2FsY3VsYXRlcyB0aGUgbmV3IG1fb2Zmc2V0LCB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHdlJ3JlIGF0IGVuZCBvZiByZWFkaW5nIG9yIG5vdCAqLwotICAgIGMtPm1fb2Zmc2V0ID0gYy0+bV9vZmZzZXQgKyBzaXplX3JlYWQ7Ci0KLSAgICAvKiBGaWxsIG90aGVycyBwYXJhbWV0ZXJzIG9mIEFVIHN0cnVjdHVyZSAqLwotICAgIHBBVS0+Q1RTID0KLSAgICAgICAgIChNNE9TQV9UaW1lKSgoKE00T1NBX0RvdWJsZSljLT5tX29mZnNldC8oTTRPU0FfRG91YmxlKWMtPm1fZGVjb2RlckNvbmZpZy5BdmdCeXRlc1BlclNlYylcCi0gICAgICAgICAgICAqMTAwMCk7Ci0gICAgcEFVLT5EVFMgPSBwQVUtPkNUUzsKLQotICAgIHBBVS0+YXR0cmlidXRlICA9IDA7Ci0gICAgcEFVLT5mcmFnICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQVUtPm5iRnJhZyAgICAgPSAwOwotICAgIHBBVS0+c3RyZWFtICAgICA9IE00T1NBX05VTEw7Ci0gICAgcEFVLT5zaXplICAgICAgID0gc2l6ZV9yZWFkOwotCi0gICAgLyogQ2hhbmdlIHN0YXRlcyAqLwotICAgIGMtPm1fc3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7IC8qIE5vdCBjaGFuZ2VkIC4uLiAqLwotICAgIGMtPm1fbWljcm9TdGF0ZSA9IE00UENNUl9rUmVhZGluZ19uZXh0QVU7IC8qIEFVIGlzIHJlYWQgYW5kIGNhbiBiZSBkZWxldGVkICovCi0KLSAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIEFVIHRvIHJlYWQgKi8KLSAgICAvKiBpZTogaWYgZGVjb2RlZCBuYiBvZiBieXRlcyA9IG5iIG9mIGJ5dGVzIHRvIGRlY29kZSwKLSAgICAgICAgIGl0IG1lYW5zIHRoZXJlIGlzIG5vIG1vcmUgQVUgdG8gZGVjb2RlICovCi0gICAgaWYoYy0+bV9vZmZzZXQgPj0gYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX2ZyZWVBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBBVSBwcm92aWRlZCBpbiBwYXJhbWV0ZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBmcmVlIGFuIEFVCi0gKiAgICAgICAgICAtIEZyZWUgZGF0YUFkZHJlc3MgZmllbGQgb2YgQVUgc3RydWN0dXJlCi0gKiAgICAgICAgICAtIENoYW5nZSBzdGF0ZSBvZiB0aGUgcmVhZGVyIGluICdSZWFkaW5nJyAobm90IHVzZWZ1bC4uLikKLSAqICAgICAgICAgIC0gQ2hhbmdlIE1pY3JvIHN0YXRlICdSZWFkaW5nJyBpbiBNNFBDTVJfa1JlYWRpbmcgKGFub3RoZXIgQVUgY2FuIGJlIHJlYWQpCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHN0cmVhbUlEOiAoSU4pIFN0cmVhbSBzZWxlY3Rpb24KLSAqIEBwYXJhbSAgIHBBVTogKElOKSBBY2NlcyBVbml0IFN0cnVjdHVyZQotICogQHJldHVybiAgTTROT19FUlJPUiAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9mcmVlQVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0ICkgfHwgKE00T1NBX05VTEwgPT0gcEFVKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZyAmJiBjLT5tX21pY3JvU3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nX25leHRBVSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBwQVUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIENoYW5nZSBzdGF0ZXMgKi8KLSAgICBjLT5tX3N0YXRlID0gTTRQQ01SX2tSZWFkaW5nOyAvKiBOb3QgY2hhbmdlZCAuLi4gKi8KLSAgICBjLT5tX21pY3JvU3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7IC8qIEFVIGlzIGRlbGV0ZWQsIGFub3RoZXIgQVUgY2FuIGJlIHJlYWQgKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfc2VlayhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSB0aW1lLCBNNFNZU19zZWVrQWNjZXNzTW9kZSBzZWVrQWNjZXNzTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTW10pCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGludG8gdGhlIFBDTSBmaWxlIGF0IHRoZSBwcm92aWRlZCB0aW1lCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gc2VlawotICogICAgICAgICAgLSBEZXRlcm1pbmVzIGZyb20gcHJvdmlkZWQgdGltZSBtX29mZnNldCB0byBzZWVrIGluIGZpbGUKLSAqICAgICAgICAgIC0gSWYgbV9vZmZzZXQgaXMgY29ycmVjdCwgc2VlayBpbiBmaWxlCi0gKiAgICAgICAgICAtIFVwZGF0ZSBuZXcgbV9vZmZzZXQgaW4gUENNIHJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBTdHJlYW1JRDogKElOKSBTdHJlYW0gc2VsZWN0aW9uIChub3QgdXNlZCwgb25seSAxIHN0cmVhbSkKLSAqIEBwYXJhbSAgIHRpbWU6IChJTikgVGFyZ2V0ZWQgdGltZQotICogQHBhcmFtICAgc2Vla01vZGU6IChJTikgU2VsZWN0cyB0aGUgc2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgcE9idGFpbkNUU1tdOiAoT1VUKSBSZXR1cm5lZCBUaW1lIChub3QgdXNlZCkKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgU3BlY2lmaWVkIHRpbWUgaXMgbm90IHJlYWNoYWJsZQotICogQHBhcmFtICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgVGhpcyBzZWVrIG1vZGUgaXMgbm90IGltcGxlbWVudGVkIHlldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX3NlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU2Vla0FjY2Vzc01vZGUgc2Vla0FjY2Vzc01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQ7Ci0gICAgTTRPU0FfVUludDMyIGFsaWdubWVudDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZV9yZWFkOwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IGNvbnRleHQpIHx8IChNNE9TQV9OVUxMID09IHBTdHJlYW1JRCkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkICYmIGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIHN3aXRjaChzZWVrQWNjZXNzTW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0JlZ2lubmluZzoKLSAgICAgICAgICAgIC8qIERldGVybWluZSBtX29mZnNldCBmcm9tIHRpbWUqLwotICAgICAgICAgICAgb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSh0aW1lICogKChNNE9TQV9Eb3VibGUpKGMtPm1fZGVjb2RlckNvbmZpZy5BdmdCeXRlc1BlclNlYykgLyAxMDAwKSk7Ci0gICAgICAgICAgICAvKiogY2hlY2sgdGhlIGFsaWdubWVudCBvbiBzYW1wbGUgYm91bmRhcnkgKi8KLSAgICAgICAgICAgIGFsaWdubWVudCA9IGMtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKmMtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlLzg7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0JWFsaWdubWVudCAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9mZnNldCAtPSBvZmZzZXQlYWxpZ25tZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyphZGQgdGhlIGhlYWRlciBvZmZzZXQqLwotICAgICAgICAgICAgb2Zmc2V0ICs9IGMtPm1fZGF0YVN0YXJ0T2Zmc2V0OwotICAgICAgICAgICAgLyogSWYgbV9vZmZzZXQgaXMgb3ZlciBmaWxlIHNpemUgLT4gSW52YWxpZCB0aW1lICovCi0gICAgICAgICAgICBpZiAob2Zmc2V0ID4gKGMtPm1fZGF0YVN0YXJ0T2Zmc2V0ICsgYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2VlayBmaWxlICovCi0gICAgICAgICAgICAgICAgc2l6ZV9yZWFkID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIGVyciA9IGMtPm1fcEZpbGVSZWFkRnVuYy0+c2VlayhjLT5tX2ZpbGVDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlUG9zaXRpb24gKikgJnNpemVfcmVhZCk7Ci0gICAgICAgICAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgbV9vZmZzZXQgaW4gTTRQQ01SX2NvbnRleHQgKi8KLSAgICAgICAgICAgICAgICBjLT5tX29mZnNldCA9IG9mZnNldCAtIGMtPm1fZGF0YVN0YXJ0T2Zmc2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBjbG9zZXMgUENNIGZpbGUsIGFuZCBmcmVlcyBjb250ZXh0Ci0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgY2xvc2UgdGhlIFBDTSBmaWxlCi0gKiAgICAgICAgICAtIENsb3NlcyB0aGUgZmlsZQotICogICAgICAgICAgLSBGcmVlIHN0cnVjdHVyZXMKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX2Nsb3NlUmVhZChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKE00T1NBX05VTEwgPT0gY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoYy0+bV9wRGVjb2RlclNwZWNJbmZvICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKGMtPm1fcERlY29kZXJTcGVjSW5mbyk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0gICAgZWxzZSBpZihjLT5tX21pY3JvU3RhdGUgPT0gTTRQQ01SX2tSZWFkaW5nX25leHRBVSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBjLT5tX3BBdUJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGZyZWUoYy0+bV9wQXVCdWZmZXIpOwotICAgIH0KLQotICAgIC8qIENsb3NlIHRoZSBmaWxlICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gYy0+bV9wRmlsZVJlYWRGdW5jKQotICAgIHsKLSAgICAgICAgZXJyID0gYy0+bV9wRmlsZVJlYWRGdW5jLT5jbG9zZVJlYWQoYy0+bV9maWxlQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyogRnJlZSBpbnRlcm5hbCBjb250ZXh0ICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gYykKLSAgICB7Ci0gICAgICAgIGZyZWUoYyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwVmFsdWUpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGdldCBvcHRpb24gb2YgdGhlIFBDTSBSZWFkZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBnZXQgYW4gb3B0aW9uCi0gKiAgICAgICAgICAtIFJldHVybiBjb3JyZXNwb25kaW5nIG9wdGlvbiB2YWx1ZQotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgcFZhbHVlOiAoT1VUKSBWYXJpYWJsZSB3aGVyZSB0aGUgb3B0aW9uIHZhbHVlIGlzIHJldHVybmVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTC4KLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUuCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICB0aGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIG5vdy4KLSAqIEByZXR1cm4gIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgIHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcFZhbHVlKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0oTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKE00T1NBX05VTEwgPT0gY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZigoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmcpICYmIChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQpXAotICAgICAgICAgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBEZXBlbmQgb2YgdGhlIE9wdGlvbklELCB0aGUgdmFsdWUgdG8gcmV0dXJuIGlzIGRpZmZlcmVudCAqLwotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRQQ01SX2tQQ01ibG9ja1NpemU6Ci0gICAgICAgICAgICAqcFZhbHVlID0gJmMtPm1fYmxvY2tTaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIFZhbHVlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBzZXQgb3B0aW9uIG9mIHRoZSBQQ00gUmVhZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gc2V0IGFuIG9wdGlvbgotICogICAgICAgICAgLSBTZXQgY29ycmVzcG9uZGluZyBvcHRpb24gdmFsdWUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgIFZhbHVlOiAoSU4pIFZhcmlhYmxlIHdoZXJlIHRoZSBvcHRpb24gdmFsdWUgaXMgc3RvcmVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTC4KLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUuCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICB0aGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIG5vdy4KLSAqIEByZXR1cm4gIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgIHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBWYWx1ZSkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9KE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIHJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nKSAmJiAoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkKVwKLSAgICAgICAgICYmIChjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZykpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRGVwZW5kIG9mIHRoZSBPcHRpb25JRCwgdGhlIHZhbHVlIHRvIHNldCBpcyBkaWZmZXJlbnQgKi8KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotICAgICAgICBjYXNlIE00UENNUl9rUENNYmxvY2tTaXplOgotICAgICAgICAgICAgYy0+bV9ibG9ja1NpemUgPSAoTTRPU0FfVUludDMyKVZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UENNUl9nZXRWZXJzaW9uIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1RSQUNFMV8xKCJNNFBDTVJfZ2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbjogMHgleCIsIHBWZXJzaW9uKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKChNNE9TQV9VSW50MzIpIHBWZXJzaW9uID09IDApLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwVmVyc2lvbiBpcyBOVUxMIGluIE00UENNUl9nZXRWZXJzaW9uIik7Ci0KLSAgICBwVmVyc2lvbi0+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+cFNhdmVkUGxhbmVbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbaV0udV9zdHJpZGUgKiBwUGxhbmVPdXRbaV0udV9oZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGltZUluY3JlbWVudCBzaG91bGQgYmUgMzAgZnBzIG1heGltdW0gKi8KLSAgICBpZihtdER1cmF0aW9uIDwgTTRQVE8zR1BQX01JTl9USU1FX0lOQ1JFTUVOVCkKLSAgICB7Ci0gICAgICAgIG10RHVyYXRpb24gPSBNNFBUTzNHUFBfTUlOX1RJTUVfSU5DUkVNRU5UOwotICAgIH0KLQotICAgIHBDLT5tX210TmV4dEN0cyArPSBtdER1cmF0aW9uOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9hcHBseVZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfQW1yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4NTkxNTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYworKysgL2Rldi9udWxsCkBAIC0xLDc5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UkVBREVSX0Ftci5jCi0gKiBAYnJpZWYgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSBhbXIgcmVhZGVyCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBnZW5lcmljIE00UkVBREVSIGludGVyZmFjZQotICogICAgICAgICBvbiB0b3Agb2YgdGhlIEFNUiByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0jaW5jbHVkZSAiTTRBTVJSX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9BbXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfQU1SX0NvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIGEgYW1yIHJlYWRlciBpbnN0YW5jZQotICogQG5vdGUgICAgICAgIFRoZSBjb250ZXh0IGlzIGFsbG9jYXRlZCBhbmQgZGUtYWxsb2NhdGVkIGJ5IHRoZSByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfQU1SX0NvbnRleHQKLXsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICBtX3BDb3JlQ29udGV4dDsgICAgIC8qKjwgY29yZSBhbXIgcmVhZGVyIGNvbnRleHQgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBtX3BBdWRpb1N0cmVhbTsgICAgIC8qKjwgcG9pbnRlciBvbiB0aGUgYXVkaW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gcmV0dXJuZWQgYnkgdGhlIGNvcmUgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICBtX2F1ZGlvQXU7ICAgICAgICAgIC8qKjwgYXVkaW8gYWNjZXNzIHVuaXQgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgbV9tYXhEdXJhdGlvbjsgICAgICAvKio8IGR1cmF0aW9uIG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgIG1fcE9zYUZpbGVSZWFkZXJGY3RzOyAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucyAqLwotCi19IE00UkVBREVSX0FNUl9Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogcFJlYWRlckNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9jcmVhdGU6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBwUmVhZGVyQ29udGV4dCA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFJFQURFUl9BTVJfQ29udGV4dCksCi0gICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0FNUl9Db250ZXh0Iik7Ci0gICAgaWYgKHBSZWFkZXJDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1fcEF1ZGlvU3RyZWFtICA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fYXVkaW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fbWF4RHVyYXRpb24gPSAwOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BDb3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZGVzdHJveShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEM9KE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Rlc3Ryb3koKTogTTRSRUFERVJfQU1SX2Rlc3Ryb3k6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGZyZWUocEMpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotICogQG5vdGUgICAgIHRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIEFNUiBmaWxlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBGaWxlRGVzY3JpcHRvcjogICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX29wZW4oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICBlcnI7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX29wZW46IGludmFsaWQgcG9pbnRlciBwRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIGVyciA9IE00QU1SUl9vcGVuUmVhZCggJnBDLT5tX3BDb3JlQ29udGV4dCwgcEZpbGVEZXNjcmlwdG9yLCBwQy0+bV9wT3NhRmlsZVJlYWRlckZjdHMpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRSRUFERVJfQU1SX2Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgIGVycjsKLSAgICBNNEFNUlJfU3RhdGUgU3RhdGU7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Nsb3NlKCk6IE00UkVBREVSX0FNUl9jbG9zZTogY29udGV4dCBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLAotICAgICAgICAgICAgICAgICgoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKS0+bV9zdHJlYW1JZCk7Ci0gICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Nsb3NlOiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX2dldFN0YXRlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTTRBTVJSX2tSZWFkaW5nX25leHRBVSA9PSBTdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pLT5tX3N0cmVhbUlkLCAgJnBDLT5tX2F1ZGlvQXUpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2U6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlbGV0ZSB0aGUgRFNJIGlmIG5lZWRlZCAqLwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShcCi0gICAgICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQ29yZUNvbnRleHQpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfY2xvc2VSZWFkKHBDLT5tX3BDb3JlQ29udGV4dCk7Ci0gICAgICAgIHBDLT5tX3BDb3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEKLSAqIEBub3RlICAgIGN1cnJlbnQgdmVyc2lvbiBuZWVkcyB0byB0cmFuc2xhdGUgTTRTWVNfU3RyZWFtIHRvIE00X1N0cmVhbUhhbmRsZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWVkaWFGYW1pbHk6ICAgKE9VVCkgIHBvaW50ZXIgdG8gYSB1c2VyIGFsbG9jYXRlZCBNNFJFQURFUl9NZWRpYUZhbWlseQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoT1VUKSAgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGFuZCBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEgKGFsbCBzdHJlYW1zIGZvdW5kKQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBtb2RlIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXJQYXJhbSkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQz0oTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gc3RyZWFtRGVzYzsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgIHBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSA9PSAwKSwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXJQYXJhbSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIGVyciA9IE00QU1SUl9nZXROZXh0U3RyZWFtKCBwQy0+bV9wQ29yZUNvbnRleHQsICZzdHJlYW1EZXNjKTsKLSAgICBpZiAoZXJyID09IE00V0FSX05PX01PUkVfU1RSRUFNKQotICAgIHsKLSAgICAgICAgc3RyZWFtSWRBcnJheVswXSA9IDA7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotICAgICAgICBlcnIgPSBNNEFNUlJfc3RhcnRSZWFkaW5nKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSk7Ci0gICAgICAgIGlmICgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DID09IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBNNEFNUlJfc3RhcnRSZWFkaW5nIHJldHVybnMgTTRFUlJfQUxMT0MhIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbzsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXIgPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00X0F1ZGlvU3RyZWFtSGFuZGxlciIpOwotICAgIGlmIChwQXVkaW9TdHJlYW1IYW5kbGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyID0oTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICpwU3RyZWFtSGFuZGxlclBhcmFtID0gcFN0cmVhbUhhbmRsZXI7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgLyoKLSAgICAgKiBBdWRpbyBzdHJlYW0gaGFuZGxlciBmaWVsZHMgYXJlIGluaXRpYWxpc2VkIHdpdGggMCB2YWx1ZS4KLSAgICAgKiBUaGV5IHdpbGwgYmUgcHJvcGVybHkgc2V0IGJ5IHRoZSBBTVIgZGVjb2RlcgotICAgICAqLwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICAgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgICAgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyAgICAgICAgPSAwOwotCi0gICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gICAgPSAoTTRPU0FfVUludDgqKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCAgICAgICAgICAgICAgICA9IHN0cmVhbURlc2Muc3RyZWFtSUQ7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSAgICAgICAgICAgICAgID0gKHZvaWQqKXN0cmVhbURlc2MudGltZVNjYWxlOyAvKnRyaWNrIHRvIGNoYW5nZSovCi0KLSAgICBpZiAoc3RyZWFtRGVzYy5kdXJhdGlvbiA+IHBDLT5tX21heER1cmF0aW9uKQotICAgIHsKLSAgICAgICAgcEMtPm1fbWF4RHVyYXRpb24gPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwotICAgIH0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlQml0UmF0ZSAgICAgICAgICA9IHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGU7Ci0KLSAgICBNNEFNUlJfZ2V0bWF4QVVzaXplKHBDLT5tX3BDb3JlQ29udGV4dCwgJnBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSk7Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbURlc2Muc3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00U1lTX2tBTVJfV0I6Ci0gICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBmaWxsIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUgd2l0aCBpbml0aWFsaXphdGlvbiB2YWx1ZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgICBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgYWNjZXNzIHVuaXQgd2lsbCBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQ6ICAgIChJTi9PVVQpIHBvaW50ZXIgdG8gdGhlIGFjY2VzcyB1bml0IChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbml0aWFsaXplCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2ZpbGxBdVN0cnVjdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBBdS0+c2l6ZSAgICAgICAgPSAwOwotICAgIC8qIEpDOiBidWcgZml4IDExOTcgKHNldCBDVFMgdG8gLTIwIGluIG9yZGVyIHRoZSBmaXJzdCBBVSBDVFMgaXMgMCkgKi8KLSAgICBwQXUtPkNUUyAgICAgICAgID0gLTIwOwotICAgIHBBdS0+RFRTICAgICAgICAgPSAtMjA7Ci0gICAgcEF1LT5hdHRyaWJ1dGUgICA9IDA7Ci0gICAgcEF1LT5uYkZyYWcgICAgICA9IDA7Ci0KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIC8qIEpDOiBidWcgZml4IDExOTcgKHNldCBDVFMgdG8gLTIwIGluIG9yZGVyIHRoZSBmaXJzdCBBVSBDVFMgaXMgMCkgKi8KLSAgICBwQWNjZXNzVW5pdC0+bV9DVFMgICAgICAgICAgPSAtMjA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gLTIwOwotICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgID0gTTRPU0FfTlVMTDsvKnBCdWZmZXI7Ki8KLSAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplICAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemU7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RyZWFtSUQgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RydWN0U2l6ZSAgID0gc2l6ZW9mKE00X0FjY2Vzc1VuaXQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9uZ2VzdCBzdHJlYW0gb2YgdGhlIG1lZGlhCi0gKiAgICAgICAgICAtIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcmVhZGVyIChub3QgaW1wbGVtZW50ZWQgeWV0KQotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChPVVQpICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpCi0KLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKQotICAgIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICooTTRPU0FfVGltZSopcFZhbHVlID0gcEMtPm1fbWF4RHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBCaXRyYXRlID0gKE00T1NBX1VJbnQzMiopcFZhbHVlOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwQml0cmF0ZSA9IHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQml0cmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbjoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBTVJSX2dldFZlcnNpb24oKE00X1ZlcnNpb25JbmZvKilwVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgcmVhZGRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC0gdGhlIE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucwotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOKSAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgICAgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyIDoKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopcFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICByZXNldCB0aGUgc3RyZWFtLCB0aGF0IGlzIHNlZWsgaXQgdG8gYmVnaW5uaW5nIGFuZCBtYWtlIGl0IHJlYWR5IHRvIGJlIHJlYWQKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgZGVwcmVjYXRlZCBpbiBuZXh0IHZlcnNpb25zCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gcmVzZXQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00V0FSX0lOVkFMSURfVElNRSAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0gY2FuIG5vdCBiZSByZWFjaGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9yZXNldChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICB0aW1lNjQgPSAwOwotICAgIE00QU1SUl9TdGF0ZSAgICAgICAgICAgIFN0YXRlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfQU1SX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9yZXNldDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNEFNUlJfZ2V0U3RhdGUocEMtPm1fcENvcmVDb250ZXh0LCAmU3RhdGUsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKTsKLSAgICBpZiAoTTRBTVJSX2tSZWFkaW5nX25leHRBVSA9PSBTdGF0ZSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00QU1SUl9mcmVlQVUocEMtPm1fcENvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogZm9yIHJlc2V0IGR1cmluZyBwbGF5YmFjayAqLwotICAgIC8qIChzZXQgQ1RTIHRvIC0yMCBpbiBvcmRlciB0aGUgZmlyc3QgQVUgQ1RTIGlzIDApICovCi0gICAgcEF1LT5DVFMgPSAtMjA7Ci0gICAgcEF1LT5EVFMgPSAtMjA7Ci0KLSAgICBlcnIgPSBNNEFNUlJfc2VlayhwQy0+bV9wQ29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa0JlZ2lubmluZywgJnRpbWU2NCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9yZXNldDogZXJyb3Igd2hlbiBjYWxsaW5nIE00QU1SUl9zZWVrKClcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgdGhlIHN0cmVhbSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBUaW1lICAgICAgICAgICAgKElOL09VVCkgSU46ICB0aGUgdGltZSB0byBqdW1wIHRvIChpbiBtcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00V0FSX0lOVkFMSURfVElNRSAgICAgICAgdGhlIHRpbWUgY2FuIG5vdCBiZSByZWFjaGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9qdW1wKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwVGltZSkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgdGltZTY0ID0gKE00T1NBX1RpbWUpKnBUaW1lOwotICAgIE00QU1SUl9TdGF0ZSAgICAgICAgICAgIFN0YXRlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfQU1SX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFRpbWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSXzNHUF9qdW1wOiBpbnZhbGlkIHRpbWUgcG9pbnRlciIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9qdW1wOiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfanVtcDogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0XG4iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0gICAgZXJyID0gTTRBTVJSX3NlZWsocEMtPm1fcENvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5LCB0aW1lNjQsIE00U1lTX2tOb1JBUHByZXZpb3VzLCAmdGltZTY0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2p1bXA6IGVycm9yIHdoZW4gY2FsbGluZyBNNEFNUlJfc2VlaygpXG4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXRzIGFuIGFjY2VzcyB1bml0IChBVSkgZnJvbSB0aGUgc3RyZWFtIGhhbmRsZXIgc291cmNlLgotICogQG5vdGUgICAgQW4gQVUgaXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBkYXRhIHRvIGJlIGRlY29kZWQgYnkgYSBkZWNvZGVyIChhdWRpby92aWRlbykuCi0gKiAgICAgICAgICBJbiB0aGUgY3VycmVudCB2ZXJzaW9uLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSBNNE9TQV9BY2Nlc3NVbml0IHRvIE00X0FjY2Vzc1VuaXQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgICAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdCAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhICh0aGUgYXUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlciwgYW5kIG11c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgdGhlcmUgYXJlIG5vIG1vcmUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbSAoZW5kIG9mIHN0cmVhbSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICB0aW1lU2NhbGU7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICAvKiBrZWVwIHRyYWNlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBBVSB0byBiZSBhYmxlIHRvIGZyZWUgdGhlbSBhdCBkZXN0cm95KCkKLSAgICAgICBidXQgYmUgYXdhcmUgdGhhdCBzeXN0ZW0gaXMgcmlza3kgYW5kIHdvdWxkIG5lZWQgdXBncmFkZSBpZiBtb3JlIHRoYW4KLSAgICAgICBvbmUgdmlkZW8gYW5kIG9uZSBhdWRpbyBBVSBpcyBuZWVkZWQgKi8KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2dldE5leHRBdTogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNEFNUlJfZ2V0U3RhdGUocEMtPm1fcENvcmVDb250ZXh0LCAmU3RhdGUsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKTsKLSAgICBpZiAoTTRBTVJSX2tSZWFkaW5nX25leHRBVSA9PSBTdGF0ZSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00QU1SUl9mcmVlQVUocEMtPm1fcENvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQVZJX2dldE5leHRBdTogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0XG4iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEF1LT5uYkZyYWcgPSAwOwotICAgIGVyciA9IE00QU1SUl9uZXh0QVUocEMtPm1fcENvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLQotICAgIGlmIChlcnIgPT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHRpbWVTY2FsZSA9IChNNE9TQV9GbG9hdCkoTTRPU0FfSW50MzIpKHBTdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSkvMTAwMDsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjgpcEF1LT5kYXRhQWRkcmVzczsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSA9IHBBdS0+c2l6ZTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICA9IChNNF9NZWRpYVRpbWUpcEF1LT5DVFMvKi90aW1lU2NhbGUqLzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTICA9IChNNF9NZWRpYVRpbWUpcEF1LT5EVFMvKi90aW1lU2NhbGUqLzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gcEF1LT5hdHRyaWJ1dGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemU9MDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSoKLSogQHBhcmFtIHBNZWRpYVR5cGUgICAgICAgICAgOiBQb2ludGVyIG9uIGEgTTRSRUFERVJfTWVkaWFUeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0qIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZSBpbXBsZW1lbnRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZSBpbXBsZW1lbnRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSoKLSogQHJldHVybnMgOiBNNE5PX0VSUk9SICAgICBpZiBPSwotKiAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0qICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKQotewotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhVHlwZSA9PSAwKSwgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFUeXBlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmRyR2xvYmFsSW50ZXJmYWNlID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJEYXRhSW50ZXJmYWNlID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0RhdGFJbnRlcmZhY2UiKTsKLQotICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0KLSAgICAgICAgIChNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSksCi0gICAgICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UiICk7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJHbG9iYWxJbnRlcmZhY2UpCi0gICAgewotICAgICAgICAqcFJkckRhdGFJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgICpwUmRyRGF0YUludGVyZmFjZSA9IChNNFJFQURFUl9EYXRhSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFJFQURFUl9EYXRhSW50ZXJmYWNlKSwKLSAgICAgICAgIE00UkVBREVSX0FNUiwgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwUmRyRGF0YUludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIGZyZWUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICAqcFJkckdsb2JhbEludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcE1lZGlhVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVBTVI7Ci0KLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGUgICAgICAgICAgID0gTTRSRUFERVJfQU1SX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgICAgID0gTTRSRUFERVJfQU1SX2Rlc3Ryb3k7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0T3BlbiAgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9vcGVuOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENsb3NlICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgICAgICA9IE00UkVBREVSX0FNUl9nZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uICAgICAgICA9IE00UkVBREVSX0FNUl9zZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dFN0cmVhbSAgICA9IE00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEZpbGxBdVN0cnVjdCAgICAgPSBNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEp1bXAgICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfanVtcDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RSZXNldCAgICAgICAgICAgID0gTTRSRUFERVJfQU1SX3Jlc2V0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldFByZXZSYXBUaW1lICAgPSBNNE9TQV9OVUxMOyAvKmFsbCBBVXMgYXJlIFJBUCovCi0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dEF1ICAgICAgICAgID0gTTRSRUFERVJfQU1SX2dldE5leHRBdTsKLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX1BjbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzM5MzBiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfV2F2LmMKLSAqIEBicmllZiAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIHBjbSByZWFkZXIKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGdlbmVyaWMgTTRSRUFERVIgaW50ZXJmYWNlCi0gKiAgICAgICAgIG9uIHRvcCBvZiB0aGUgUENNIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00UENNUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRSRUFERVJfUGNtLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9XQVZfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgYSB3YXYgcmVhZGVyIGluc3RhbmNlCi0gKiBAbm90ZSAgICAgICAgVGhlIGNvbnRleHQgaXMgYWxsb2NhdGVkIGFuZCBkZS1hbGxvY2F0ZWQgYnkgdGhlIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfUENNX0NvbnRleHQKLXsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICBtX2NvcmVDb250ZXh0OyAgICAgICAgLyoqPCBjb3JlIHdhdiByZWFkZXIgY29udGV4dCAqLwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgIG1fcEF1ZGlvU3RyZWFtOyAgICAgICAvKio8IHBvaW50ZXIgb24gdGhlIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBieSB0aGUgY29yZSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgIG1fYXVkaW9BdTsgICAgICAgICAgICAvKio8IGF1ZGlvIGFjY2VzcyB1bml0IHRvIGJlIGZpbGxlZCBieSB0aGUgY29yZSAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogIG1fcE9zYUZpbGVSZWFkZXJGY3RzOyAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucyAqLwotCi19IE00UkVBREVSX1BDTV9Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQ3JlYXRlcyBhIHdhdiByZWFkZXIgaW5zdGFuY2UKLSAqIEBub3RlICAgIGFsbG9jYXRlcyB0aGUgY29udGV4dAotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgICAgICAgKE9VVCkgIFBvaW50ZXIgdG8gYSB3YXYgcmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcFJlYWRlckNvbnRleHQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2NyZWF0ZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHBSZWFkZXJDb250ZXh0ID0gKE00UkVBREVSX1BDTV9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UkVBREVSX1BDTV9Db250ZXh0KSwKLSAgICAgICAgIE00UkVBREVSX1dBViwgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfUENNX0NvbnRleHQiKTsKLSAgICBpZiAocFJlYWRlckNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bV9jb3JlQ29udGV4dCAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0gICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wT3NhRmlsZVJlYWRlckZjdHMgID0gTTRPU0FfTlVMTDsKLQotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgRGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgdGhlIGNvbnRleHQgaXMgdW4tYWxsb2NhdGVkCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgIChJTikgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9kZXN0cm95KE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZnJlZShwQyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBJbml0aWFsaXplcyB0aGUgcmVhZGVyIGluc3RhbmNlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgICAgKElOKSAgICBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHBhcmFtICAgcEZpbGVEZXNjcmlwdG9yOiAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nIHRoZSBtZWRpYSB0byBvcGVuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX29wZW4oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX29wZW46IGludmFsaWQgcG9pbnRlciBwRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIGVyciA9IE00UENNUl9vcGVuUmVhZCgmKHBDLT5tX2NvcmVDb250ZXh0KSwgKE00T1NBX0NoYXIqKXBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fY2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogRnJlZSBhdWRpbyBBVSBhbmQgYXVkaW8gc3RyZWFtICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fYXVkaW9BdS5kYXRhQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX3N0cmVhbUlkLAotICAgICAgICAgICAgICAgICAmcEMtPm1fYXVkaW9BdSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9jbG9zZTogRXJyb3Igd2hlbiBmcmVlaW5nIGF1ZGlvIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9jb3JlQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8qIENsb3NlIHRoYSBQQ00gZmlsZSAqLwotICAgICAgIGVyciA9IE00UENNUl9jbG9zZVJlYWQocEMtPm1fY29yZUNvbnRleHQpOwotICAgICAgIHBDLT5tX2NvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCB2b2lkKiBwVmFsdWUpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3NldE9wdGlvbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9zZXRPcHRpb246IGludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKQotICAgIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKXBWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBSZXRyaWV2ZXMgdGhlIGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIsIGdpdmVuIGFuIG9wdGlvbiBJRC4KLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6IChJTikgb3B0aW9uIGlkZW50aWZpY2F0b3Igd2hvc2Ugb3B0aW9uIHZhbHVlIGlzIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSAgIHBWYWx1ZTogIChPVVQpIG9wdGlvbiB2YWx1ZSByZXRyaWV2ZWQuCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSByZXF1aXJlZCBvcHRpb24gaWRlbnRpZmljYXRvciBpcyB1bmtub3duCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIHZvaWQqIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQ29udGV4dCA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnIgICAgICA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBubyBjaGVjayBvZiBjb250ZXh0IGF0IHRoaXMgbGV2ZWwgYmVjYXVzZSBzb21lIG9wdGlvbiBkb2VzIG5vdCBuZWVkIGl0ICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChwVmFsdWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0T3B0aW9uOiBpbnZhbGlkIHBvaW50ZXIgb24gdmFsdWUiKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgotICAgICAgICAqKChNNE9TQV9VSW50MzIqKXBWYWx1ZSkgPSBwQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb247Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbjoKLSAgICAgICAgZXJyID0gTTRQQ01SX2dldFZlcnNpb24oKE00X1ZlcnNpb25JbmZvKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0NvcHlyaWdodDoKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBCaXRyYXRlID0gKE00T1NBX1VJbnQzMiopcFZhbHVlOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcENvbnRleHQtPm1fcEF1ZGlvU3RyZWFtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwQml0cmF0ZSA9IHBDb250ZXh0LT5tX3BBdWRpb1N0cmVhbS0+bV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQml0cmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9nZXRPcHRpb246IHVuc3VwcG9ydGVkIG9wdGlvbklkIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwTWVkaWFGYW1pbHk6ICAgKE9VVCkgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZAotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChPVVQpIHBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkIGFuZCBmaWxsZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gIE00V0FSX05PX01PUkVfU1RSRUFNICAgIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEgKGFsbCBzdHJlYW1zIGZvdW5kKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQz0oTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotLyogICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgcFN0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOyovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gc3RyZWFtRGVzYzsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIGZEdXJhdGlvbjsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKiBwRHNpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSA9PSAwKSwgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIGVyciA9IE00UENNUl9nZXROZXh0U3RyZWFtKCBwQy0+bV9jb3JlQ29udGV4dCwgJnN0cmVhbURlc2MpOwotICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fTU9SRV9TVFJFQU0pCi0gICAgewotICAgICAgICBzdHJlYW1JZEFycmF5WzBdID0gMDsKLSAgICAgICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0gICAgICAgIGVyciA9IE00UENNUl9zdGFydFJlYWRpbmcocEMtPm1fY29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXkpOyAvKnRvIHB1dCBpbiBvcGVuIGZ1bmN0aW9uKi8KLQotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgfQotICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsgLyphbHNvIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTSovCi0gICAgfQotCi0gICAgc3dpdGNoIChzdHJlYW1EZXNjLnN0cmVhbVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tBdWRpb1Vua25vd246Ci0gICAgICAgIGNhc2UgTTRTWVNfa1BDTV8xNmJpdHNTOgotICAgICAgICBjYXNlIE00U1lTX2tQQ01fMTZiaXRzVToKLSAgICAgICAgY2FzZSBNNFNZU19rUENNXzhiaXRzVToKLSAgICAgICAgICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbzsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogZm91bmQgYXVkaW8gc3RyZWFtIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlVbmtub3duOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBmb3VuZCBVTktOT1dOIHN0cmVhbSIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgIE00UkVBREVSX1dBViwgKE00T1NBX0NoYXIgKikiTTRfQXVkaW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgaWYgKHBBdWRpb1N0cmVhbUhhbmRsZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gKE00X1N0cmVhbUhhbmRsZXIqKShwQXVkaW9TdHJlYW1IYW5kbGVyKTsKLQotICAgIHBEc2kgPSAoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8qKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIE00T1NBX0RFQlVHX0lGMSgocERzaSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBpbiBzdHJlYW0iKTsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBwRHNpLT5TYW1wbGVGcmVxdWVuY3k7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSAgICA9IChNNE9TQV9VSW50MzIpKHBEc2ktPkJpdHNQZXJTYW1wbGUvOCk7Ci0gICAgLyogbV9ieXRlRnJhbWVMZW5ndGggaXMgYmFkbHkgbmFtZWQ6IGl0IGlzIG5vdCBpbiBieXRlcyBidXQgaW4gc2FtcGxlcyBudW1iZXIgKi8KLSAgICBpZihwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID09IDgwMDApCi0gICAgewotICAgICAgICAvKiBBTVIgY2FzZSAqLwotICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCAgID0KLSAgICAgICAgICAgICAoKChzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlLzgpLzUwKS9wRHNpLT5uYkNoYW5uZWxzKVwKLSAgICAgICAgICAgICAgICAvcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZTsvKi81MCB0byBnZXQgYXJvdW5kIDIwIG1zIG9mIGF1ZGlvKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQUFDIENhc2UgKi8KLSAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPQotICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZS84KS8xNS42MjUpL3BEc2ktPm5iQ2hhbm5lbHMpXAotICAgICAgICAgICAgICAgIC9wQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplOwotICAgIH0KLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyAgICAgICAgPSBwRHNpLT5uYkNoYW5uZWxzOwotCi0gICAgTTRPU0FfVElNRV9UT19NUyggZkR1cmF0aW9uLCBzdHJlYW1EZXNjLmR1cmF0aW9uLCBzdHJlYW1EZXNjLnRpbWVTY2FsZSk7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2R1cmF0aW9uICAgICAgICAgICAgICAgID0gKE00T1NBX0ludDMyKWZEdXJhdGlvbjsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fcERlY29kZXJTcGVjaWZpY0luZm8gICAgPSAoTTRPU0FfVUludDgqKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX3N0cmVhbUlkICAgICAgICAgICAgICAgID0gc3RyZWFtRGVzYy5zdHJlYW1JRDsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fcFVzZXJEYXRhICAgICAgICAgICAgICAgPQotICAgICAgICAodm9pZCopc3RyZWFtRGVzYy50aW1lU2NhbGU7IC8qdHJpY2sgdG8gY2hhbmdlKi8KLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYXZlcmFnZUJpdFJhdGUgICAgICAgICAgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9tYXhBVVNpemUgICAgICAgICAgICAgICA9Ci0gICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCpwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplXAotICAgICAgICAgICAgKnBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVsczsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtVHlwZSAgICAgICAgICAgICAgPSBNNERBX1N0cmVhbVR5cGVBdWRpb1BjbTsKLQotICAgICpwU3RyZWFtSGFuZGxlciA9IHBDLT5tX3BBdWRpb1N0cmVhbTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChJTikgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2ggdGhlIGFjY2VzcyB1bml0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQ6ICAgIChJTikgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQXUtPnNpemUgICAgICAgID0gMDsKLSAgICBwQXUtPkNUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPkRUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgID0gTTRPU0FfTlVMTDsvKnBCdWZmZXI7Ki8KLSAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplICAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemU7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RyZWFtSUQgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RydWN0U2l6ZSAgID0gc2l6ZW9mKE00X0FjY2Vzc1VuaXQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpczogc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICB0aW1lNjQgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9yZXNldDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fcmVzZXQ6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBwQXUtPkNUUyA9IDA7Ci0gICAgcEF1LT5EVFMgPSAwOwotCi0gICAgLyogVGhpcyBjYWxsIGlzIG5lZWRlZCBvbmx5IHdoZW4gcmVwbGF5IGR1cmluZyBwbGF5YmFjayAqLwotICAgIGVyciA9IE00UENNUl9zZWVrKHBDLT5tX2NvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5LCB0aW1lNjQsIE00U1lTX2tCZWdpbm5pbmcsICZ0aW1lNjQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgYWNjZXNzIHVuaXQgb2YgdGhlIHNwZWNpZmllZCBzdHJlYW0KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdCAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBhdSBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIgY3JlYXRpb24pCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybnMgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSAqIEByZXR1cm5zIE00V0FSX05PX0RBVEFfWUVUICAgICAgICAgICB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSBvbiB0aGUgc3RyZWFtIGZvciBuZXcgYWNjZXNzIHVuaXQKLSAqIEByZXR1cm5zIE00V0FSX05PX01PUkVfQVUgICAgICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICAvKiBrZWVwIHRyYWNlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBBVSB0byBiZSBhYmxlIHRvIGZyZWUgdGhlbSBhdCBkZXN0cm95KCkKLSAgICAgICBidXQgYmUgYXdhcmUgdGhhdCBzeXN0ZW0gaXMgcmlza3kgYW5kIHdvdWxkIG5lZWQgdXBncmFkZSBpZiBtb3JlIHRoYW4KLSAgICAgICBvbmUgdmlkZW8gYW5kIG9uZSBhdWRpbyBBVSBpcyBuZWVkZWQgKi8KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE5leHRBdTogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgZXJyID0gTTRQQ01SX25leHRBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0KLSAgICBpZiAoZXJyID09IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgID0gKE00T1NBX0RvdWJsZSlwQXUtPkNUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTICA9IChNNE9TQV9Eb3VibGUpcEF1LT5EVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9IHBBdS0+YXR0cmlidXRlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplPTA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgICB0aGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgIHBUaW1lICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXQgaW4gdGhpcyByZWFkZXIsIHdlIGRvIG5vdCBtb2RpZnkgdGhlIHRpbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgIHRpbWU2NDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX1BDTV9qdW1wOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fanVtcDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fanVtcDogRXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgZXJyID0gTTRQQ01SX3NlZWsocEMtPm1fY29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa0JlZ2lubmluZywgJnRpbWU2NCk7Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSAqCi0gKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0gKiBAcGFyYW0gcFJkckdsb2JhbEludGVyZmFjZSA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGdsb2JhbCBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSAqIEBwYXJhbSBwUmRyRGF0YUludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZGF0YSBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSAqCi0gKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0gKiAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0gKiAgICAgICAgICAgIEVSUl9QQVJBTUVURVIgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhVHlwZSA9PSAwKSwgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFUeXBlIHBhc3NlZCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckdsb2JhbEludGVyZmFjZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmRyRGF0YUludGVyZmFjZSA9PSAwKSwgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNNFJFQURFUl9EYXRhSW50ZXJmYWNlIik7Ci0KLSAgICAqcFJkckdsb2JhbEludGVyZmFjZSA9Ci0gICAgICAgICAoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UpLCBNNFJFQURFUl9XQVYsCi0gICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfUENNIEdsb2JhbEludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwUmRyR2xvYmFsSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAqcFJkckRhdGFJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLCBNNFJFQURFUl9XQVYsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSAiTTRSRUFERVJfUENNIERhdGFJbnRlcmZhY2UiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckRhdGFJbnRlcmZhY2UpCi0gICAgewotICAgICAgICBmcmVlKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZVBDTTsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICAgICAgPSBNNFJFQURFUl9QQ01fZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgICAgID0gTTRSRUFERVJfUENNX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdGFydCAgICAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdG9wICAgICAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfUENNX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfUENNX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtICAgID0gTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ICAgICA9IE00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgICA9IE00T1NBX05VTEw7IC8qYWxsIEFVcyBhcmUgUkFQKi8KLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICAgICAgPSBNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjNjdlNzIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTTRWRF9Ub29scy5oIgotI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotI2luY2x1ZGUgIk9NWF9WaWRlby5oIgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMKLSAqIEBicmllZgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBleHRlcm5hbCBCaXRzdHJlYW0gcGFyc2VyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQ4IGNvZGU7Ci0gICAgTTRPU0FfSW50MzIgcHJvZmlsZTsKLSAgICBNNE9TQV9JbnQzMiBsZXZlbDsKLX0gY29kZVByb2ZpbGVMZXZlbDsKLQotc3RhdGljIGNvZGVQcm9maWxlTGV2ZWwgbXBlZzRQcm9maWxlTGV2ZWxUYWJsZVtdID0gewotICAgIHsweDAxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDAyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDAzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDA0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDRhfSwKLSAgICB7MHgwNSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw1fSwKLSAgICB7MHgwOCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwfSwKLSAgICB7MHgxMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4MTIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSxPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDIxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHgyMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MzIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDMzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHgzNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sIE9NWF9WSURFT19NUEVHNExldmVsNH0sCi0gICAgezB4NDIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVOYml0LCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDUxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2NhbGFibGVUZXh0dXJlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDYxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg2MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4NzEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDcyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg4MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg4MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg5MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4OTIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDkzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHg5NCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsIE9NWF9WSURFT19NUEVHNExldmVsNH0sCi0gICAgezB4YTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4YTIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4YTMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4YjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhiMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGIzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4YjQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhjMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhjMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhkMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4ZDIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGQzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhmMCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDB9LAotICAgIHsweGYxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4ZjIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhmMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGY0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNH0sCi0gICAgezB4ZjUsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw1fQotfTsKLQotTTRPU0FfVUludDMyIE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKQotewotICAgICAgICByZXR1cm4oTTRWRF9Ub29sc19HZXRCaXRzRnJvbU1lbW9yeShwYXJzaW5nQ3R4dCxuYl9iaXRzKSk7Ci19Ci0KLU00T1NBX0VSUiBNNFZEX0VYVEVSTkFMX1dyaXRlQml0c1RvTWVtb3J5KE00T1NBX1VJbnQzMiBiaXRzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyMzIgZGVzdF9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG9mZnNldCwgTTRPU0FfVUludDggbmJfYml0cykKLXsKLSAgICAgICAgcmV0dXJuIChNNFZEX1Rvb2xzX1dyaXRlQml0c1RvTWVtb3J5KCBiaXRzVG9Xcml0ZSxkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsICBuYl9iaXRzKSk7Ci19Ci0KLU00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShNNE9TQV9VSW50OCogcFZvbCwgTTRPU0FfSW50MzIgYVZvbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8qIHBEY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9TaXplKiBwVmlkZW9TaXplKQotewotICAgIE00VlNfQml0c3RyZWFtX2N0eHQgcGFyc2luZ0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGNvZGUsIGo7Ci0gICAgTTRPU0FfTWVtQWRkcjggc3RhcnQ7Ci0gICAgTTRPU0FfVUludDggaTsKLSAgICBNNE9TQV9VSW50MzIgdGltZV9pbmNyX2xlbmd0aDsKLSAgICBNNE9TQV9VSW50OCB2b2xfdmVyaWQ9MCwgYl9oaWVyYXJjaHlfdHlwZTsKLQotICAgIC8qIFBhcnNpbmcgdmFyaWFibGVzICovCi0gICAgTTRPU0FfVUludDggdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggc2NhbGFiaWxpdHkgPSAwOwotICAgIE00T1NBX1VJbnQ4IGVuaGFuY2VtZW50X3R5cGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBpbnRlcmxhY2VkID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfd2FycGluZ19wb2ludHMgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSA9IDA7Ci0gICAgTTRPU0FfVUludDggcXVhbnRfcHJlY2lzaW9uID0gMDsKLQotICAgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCAgICAgICAgICAgICAgPSAwOwotICAgIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQgICAgICAgICAgICAgPSAwOwotCi0gICAgcERjaS0+dWlUaW1lU2NhbGUgICAgICAgICAgPSAwOwotICAgIHBEY2ktPnVpUHJvZmlsZSAgICAgICAgICAgID0gMDsKLSAgICBwRGNpLT51aVVzZU9mUmVzeW5jaE1hcmtlciA9IDA7Ci0gICAgcERjaS0+YkRhdGFQYXJ0aXRpb24gICAgICAgPSBNNE9TQV9GQUxTRTsKLSAgICBwRGNpLT5iVXNlT2ZSVkxDICAgICAgICAgICA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyogUmVzZXQgdGhlIGJpdHN0cmVhbSBjb250ZXh0ICovCi0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2J5dGUgPSAwOwotICAgIHBhcnNpbmdDdHh0LnN0cmVhbV9pbmRleCA9IDg7Ci0gICAgcGFyc2luZ0N0eHQuaW4gPSAoTTRPU0FfSW50OCAqKXBWb2w7Ci0KLSAgICBzdGFydCA9IChNNE9TQV9JbnQ4ICopcFZvbDsKLQotICAgIC8qIFN0YXJ0IHBhcnNpbmcgKi8KLSAgICB3aGlsZSAocGFyc2luZ0N0eHQuaW4gLSBzdGFydCA8IGFWb2xTaXplKQotICAgIHsKLSAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgY29kZSBmb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4MjAuLjB4MkYgOiB2aWRlb19vYmplY3RfbGF5ZXJfc3RhcnRfY29kZSAtLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoY29kZSA+IDB4MUYpICYmIChjb2RlIDwgMHgzMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHJhbmRvbSBhY2Nlc3NpYmxlIHZvbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7LyogdmlkZW8gb2JqZWN0IHR5cGUgaW5kaWNhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogaXMgb2JqZWN0IGxheWVyIGlkZW50aWZpZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOyAvKiB2aWRlbyBvYmplY3QgbGF5ZXIgdmVyaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7IC8qIHZpZGVvIG9iamVjdCBsYXllciBwcmlvcml0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCk7LyogYXNwZWN0IHJhdGlvICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxNSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOyAvKiBwYXJfd2lkdGggYW5kIHBhcl9oZWlnaHQgKDgrOCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHZvbCBjb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOy8qIGNocm9tYSBmb3JtYXQgKyBsb3cgZGVsYXkgKDMrMSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogdmJ2IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMik7LyogZmlyc3QgYW5kIGxhdHRlciBoYWxmIGJpdHJhdGUgKyAyIG1hcmtlciBiaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNSArIDEgKyAxNSArIDEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEpOy8qIGZpcnN0IGFuZCBsYXR0ZXIgaGFsZiB2YnYgYnVmZmVyIHNpemUgKyBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsZiB2YnYgb2NjdXBhbmN5ICsgbWFya2VyIGJpdHMgKDE1KzErMysxMSsxKSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOy8qIGZpcnN0IGhhbGYgdmJ2IG9jY3VwYW5jeSArIG1hcmtlciBiaXRzICgxNSsxKSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7IC8qIHZpZGVvIG9iamVjdCBsYXllciBzaGFwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZCB0byBzYXZlIGl0IGZvciB2b3AgcGFyc2luZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDApIHJldHVybiAwOyAvKiBvbmx5IHJlY3Rhbmd1bGFyIGNhc2Ugc3VwcG9ydGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7IC8qIFZPUCB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVRpbWVTY2FsZSA9IGNvZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXB1dGVzIHRpbWUgaW5jcmVtZW50IGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaiAgICA9IGNvZGUgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCAzMikgJiYgKGogIT0gMCk7IGogPj49MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2luY3JfbGVuZ3RoID0gKGkgPT0gMCkgPyAxIDogaTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogRml4ZWQgVk9QIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfaW5jcl9sZW5ndGgpOy8qIEZpeGVkIFZPUCB0aW1lIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMSkgLyogMSA9IEJpbmFyeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAwKSAvKiAwID0gcmVjdGFuZ3VsYXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBXaWR0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpV2lkdGggPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7LyogSGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQgPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGludGVybGFjZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE9CTUMgZGlzYWJsZSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2b2xfdmVyaWQgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Lyogc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7Lyogc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3ByaXRlX2VuYWJsZSA9PSAxKSB8fCAoc3ByaXRlX2VuYWJsZSA9PSAyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNwcml0ZSBzdGF0aWMgPSAxIGFuZCBTcHJpdGUgR01DID0gMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHJpdGVfZW5hYmxlICE9IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIHNwcml0ZSB3aWR0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7Lyogc3ByaXRlIGhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7Lyogc3ByaXRlIGwgY29vcmRpbmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7Lyogc3ByaXRlIHRvcCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2KTsvKiBzcHJpdGUgd2FycGluZyBwb2ludHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfd2FycGluZ19wb2ludHMgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7Lyogc3ByaXRlIHdhcnBpbmcgYWNjdXJhY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Lyogc3ByaXRlIGJyaWdodG5lc3MgY2hhbmdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGxvdyBsYXRlbmN5IHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZvbF92ZXJpZCAhPSAxKSAmJiAodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlICE9IDApKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Lyogc2FkY3QgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOyAvKiBub3QgOCBiaXRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCk7LyogcXVhbnQgcHJlY2lzaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfcHJlY2lzaW9uID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBiaXRzIHBlciBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBncmV5c2NhbGUgbm90IHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOyAvKiBub2dyYXkgcXVhbnQgdXBkYXRlICsgY29tcG9zaXRpb24gbWV0aG9kICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWFyIGNvbXBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBxdWFudCB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGxvYWQgaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGxvYWQgbm9uIGludHJhIHF1YW50IG1hdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsvKiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHF1YXJ0ZXIgc2FtcGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBjb21wbGV4aXR5IGVzdGltYXRpb24gZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiByZXN5bmMgbWFya2VyIGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gKGNvZGUpID8gMCA6IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBkYXRhIHBhcnRpdGlvbm5lZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+YkRhdGFQYXJ0aXRpb24gPSAoY29kZSkgPyBNNE9TQV9UUlVFIDogTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXZlcnNpYmxlIFZMQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+YlVzZU9mUlZMQyA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbF92ZXJpZCAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7LyogbmV3cHJlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWR1Y2VkIHJlc29sdXRpb24gdm9wIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlZF9yZXNvbHV0aW9uX3ZvcF9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsvKiBzY2FsYWJpbGl0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFiaWxpdHkgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhpZXJhcmNoeSB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX2hpZXJhcmNoeV90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVmIGxheWVyIGlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWYgc2FtcGxpbmcgZGlyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBob3Igc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvciBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmVydCBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmVydCBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5oYW5jZW1lbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5oYW5jZW1lbnRfdHlwZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWJfaGllcmFyY2h5X3R5cGUpICYmICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgcmVmIHNoYXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSByZWYgdGV4dHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSBob3Igc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgaG9yIHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgdmVydCBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHhCMCA6IHZpc3VhbF9vYmplY3Rfc2VxdWVuY2Vfc3RhcnRfY29kZSAtLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoY29kZSA9PSAweEIwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlQcm9maWxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEI1IDogdmlzdWFsX29iamVjdF9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIG9iamVjdCBsYXllciBpZGVudGlmaWVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlzdWFsIG9iamVjdCB2ZXJpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpc3VhbCBvYmplY3QgbGF5ZXIgcHJpb3JpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFsaWduIG9uIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSBlbmQgLS0tLS0gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4+IDIpID09IDB4MjApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEgyNjMgLi4uLT4gd3JvbmcqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCogcERTSSwgTTRPU0FfSW50MzIgRFNJU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpIHsKLQotICAgIE00T1NBX1VJbnQxNiBpbmRleCA9IDI4OyAvKiB0aGUgMjl0aCBieXRlIGlzIFNQUyBzdGFydCAqLwotICAgIE00T1NBX0Jvb2wgY29uc3RyYWludFNldDM7Ci0KLSAgICBpZiAoKHBQcm9maWxlID09IE00T1NBX05VTEwpIHx8IChwTGV2ZWwgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoKERTSVNpemUgPD0gaW5kZXgpIHx8IChwRFNJID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRBVkNQcm9maWxlQW5kTGV2ZWw6IERTSSBpcyBpbnZhbGlkIik7Ci0gICAgICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAgICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgY29uc3RyYWludFNldDMgPSAocERTSVtpbmRleCsyXSAmIDB4MTApOwotICAgIEFMT0dWKCJnZXRBVkNQcm9maWxlQW5kTGV2ZWwgcHJvZmlsZV9ieXRlICVkLCBsZXZlbF9ieXRlOiAlZCBjb25zdHJhaW4zZmxhZyIsCi0gICAgICAgICAgcERTSVtpbmRleCsxXSwgcERTSVtpbmRleCszXSwgY29uc3RyYWludFNldDMpOwotCi0gICAgc3dpdGNoIChwRFNJW2luZGV4KzFdKSB7Ci0gICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZU1haW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gxMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyMjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQyMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI0NDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQ0NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIH0KLQotICAgIHN3aXRjaCAocERTSVtpbmRleCszXSkgewotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgIGlmIChjb25zdHJhaW50U2V0MykKLSAgICAgICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMWI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDExOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwyMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDIyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDMxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw1MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRBVkNQcm9maWxlQW5kTGV2ZWwgcHJvZmlsZSAlbGQgbGV2ZWwgJWxkIiwgKnBQcm9maWxlLCAqcExldmVsKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIGdldEgyNjNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MTYgaW5kZXggPSA3OyAvKiB0aGUgNXRoIGFuZCA2dGggYnl0ZXMgY29udGFpbiB0aGUgbGV2ZWwgYW5kIHByb2ZpbGUgKi8KLQotICAgIGlmICgocFByb2ZpbGUgPT0gTTRPU0FfTlVMTCkgfHwgKHBMZXZlbCA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICBBTE9HRSgiZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCBpbnZhbGlkIHBvaW50ZXIgZm9yIHBQcm9maWxlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKChEU0lTaXplIDwgaW5kZXgpIHx8IChwRFNJID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsOiBEU0kgaXMgaW52YWxpZCIpOwotICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBBTE9HVigiZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlX2J5dGUgJWQsIGxldmVsX2J5dGUiLAotICAgICAgICAgIHBEU0lbNl0sIHBEU0lbNV0pOwotICAgIC8qIGdldCB0aGUgSDI2MyBsZXZlbCAqLwotICAgIHN3aXRjaCAocERTSVs1XSkgewotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWwxMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWwyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWwzMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw0NTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw1MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw3MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICB9Ci0KLSAgICAvKiBnZXQgSDI2MyBwcm9maWxlICovCi0gICAgc3dpdGNoIChwRFNJWzZdKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2Rpbmc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcm5ldDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcmxhY2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaExhdGVuY3k7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgKnBQcm9maWxlID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIH0KLSAgICBBTE9HVigiZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlICVsZCBsZXZlbCAlbGQiLCAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDggcHJvZmlsZUFuZExldmVsLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCkgewotCi0gICAgTTRPU0FfVUludDMyIGkgPSAwOwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgIGlmICgocFByb2ZpbGUgPT0gTTRPU0FfTlVMTCkgfHwgKHBMZXZlbCA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBBTE9HVigiZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwgcHJvZmlsZUFuZExldmVsICVkIiwgcHJvZmlsZUFuZExldmVsKTsKLSAgICBsZW5ndGggPSBzaXplb2YobXBlZzRQcm9maWxlTGV2ZWxUYWJsZSkgL3NpemVvZihtcGVnNFByb2ZpbGVMZXZlbFRhYmxlWzBdKTsKLSAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLmNvZGUgPT0gcHJvZmlsZUFuZExldmVsKSB7Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLnByb2ZpbGU7Ci0gICAgICAgICAgICAqcExldmVsID0gbXBlZzRQcm9maWxlTGV2ZWxUYWJsZVtpXS5sZXZlbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCBwcm9maWxlICVsZCBsZXZlbCAlbGQiLCAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX1Rvb2xzLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRiNGI0MS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTTRWRF9Ub29scy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRWRF9Ub29scy5jCi0gKiBAYnJpZWYKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgQml0c3RyZWFtIHBhcnNlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX1VJbnQzMiBNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KE00VlNfQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LAotICAgICBNNE9TQV9VSW50MzIgbmJfYml0cykKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgY29kZTsKLSAgICBNNE9TQV9VSW50MzIgICAgaTsKLSAgICBjb2RlID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfYml0czsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXggPT0gOCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9NNE9TQV9tZW1jcHkoIChNNE9TQV9NZW1BZGRyOCkmKHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSksIHBhcnNpbmdDdHh0LT5pbiwKLSAgICAgICAgICAgIC8vICAgICBzaXplb2YodW5zaWduZWQgY2hhcikpOwotICAgICAgICAgICAgcGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlID0gKHVuc2lnbmVkIGNoYXIpKHBhcnNpbmdDdHh0LT5pbilbMF07Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+aW4rKzsKLSAgICAgICAgICAgIC8vZnJlYWQoJnN0cmVhbV9ieXRlLCBzaXplb2YodW5zaWduZWQgY2hhciksMSxpbik7Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBjb2RlID0gKGNvZGUgPDwgMSk7Ci0gICAgICAgIGNvZGUgfD0gKChwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgJiAweDgwKSA+PiA3KTsKLQotICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPSAocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlIDw8IDEpOwotICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2luZGV4Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvZGU7Ci19Ci0KLU00T1NBX0VSUiBNNFZEX1Rvb2xzX1dyaXRlQml0c1RvTWVtb3J5KE00T1NBX1VJbnQzMiBiaXRzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyMzIgZGVzdF9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG9mZnNldCwgTTRPU0FfVUludDggbmJfYml0cykKLXsKLSAgICBNNE9TQV9VSW50OCBpLGo7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBfZGVzdCA9IDAsIG1hc2sgPSAwLCB0ZW1wID0gMTsKLSAgICBNNE9TQV9VSW50MzIgaW5wdXQgPSBiaXRzVG9Xcml0ZTsKLSAgICBpbnB1dCA9IChpbnB1dCA8PCAoMzIgLSBuYl9iaXRzIC0gb2Zmc2V0KSk7Ci0KLSAgICAvKiBQdXQgZGVzdGluYXRpb24gYnVmZmVyIHRvIDAgKi8KLSAgICBmb3Ioaj0wO2o8MztqKyspCi0gICAgewotICAgICAgICBmb3IoaT0wO2k8ODtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChqKjgpK2kgPj0gb2Zmc2V0ICYmIChqKjgpK2kgPCBuYl9iaXRzICsgb2Zmc2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hc2sgfD0gKHRlbXAgPDwgKCg3KihqKzEpKS1pK2opKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBtYXNrID0gfm1hc2s7Ci0gICAgKmRlc3RfYml0cyAmPSBtYXNrOwotCi0gICAgLyogUGFyc2UgaW5wdXQgYml0cywgYW5kIGZpbGwgb3V0cHV0IGJ1ZmZlciAqLwotICAgIGZvcihqPTA7ajwzO2orKykKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKGoqOCkraSA+PSBvZmZzZXQgJiYgKGoqOCkraSA8IG5iX2JpdHMgKyBvZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICgoaW5wdXQgJiAoMHg4MDAwMDAwMCA+PiBvZmZzZXQpKSA+PiAoMzEtb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgLy8qZGVzdF9iaXRzIHw9ICh0ZW1wIDw8ICgzMSAtIGkpKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9iaXRzIHw9ICh0ZW1wIDw8ICgoNyooaisxKSktaStqKSk7Ci0gICAgICAgICAgICAgICAgaW5wdXQgPSAoaW5wdXQgPDwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODZiYjQ2Yi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIENvbG9yIENvbnZlcnNpb24gRmlsdGVyCi0gKiAgICAgICAgICAgLSMgQ29udGFpbnMgdGhlIGZvcm1hdCBjb252ZXJzaW9uIGZpbHRlcnMgZnJvbSBSR0I1NjUgdG8gWVVWNDIwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIHRyYW5zZm9ybSBSR0I1NjUgaW1hZ2UgdG8gYSBZVVY0MjAgaW1hZ2UuCi0gKiBAbm90ZSAgICBDb252ZXJ0IFJHQjU2NSB0byBZVVY0MjAsCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93ICggMiByb3dzIGJ5IDIgcm93cyApCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoIDIgY29sIGJ5IDIgY29sICkKLSAqICAgICAgICAgICAgICAgICAgR2V0IDQgUkdCIHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhIGFuZCBidWlsZCA0IG91dHB1dCBZIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgYW5kIGVhY2ggc2luZ2xlIFUgJiBWIGRhdGEKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBvbiBjb2wKLSAqICAgICAgICAgIGVuZCBsb29wIG9uIHJvdwotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgU3BlY2lmaWMgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBSR0I1NjUgUGxhbmUKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byAgWVVWNDIwIGJ1ZmZlciBQbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBZVVYgUGxhbmUgaGVpZ2h0IGlzIE9ERAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBZVVYgUGxhbmUgd2lkdGggaXMgT0RECi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX3JnYiwgdTMyX3N0cmlkZV8ycmdiOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3JnYm5fZGF0YSwgKnB1OF9yZ2JuOwotICAgIE00VklGSV9VSW50MTYgICB1MTZfcGl4MSwgdTE2X3BpeDIsIHUxNl9waXgzLCB1MTZfcGl4NDsKLSAgICBNNFZJRklfVUludDggY291bnRfbnVsbD0wOwotCi0gICAgLyogQ2hlY2sgcGxhbmVzIGhlaWdodCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgd2lkdGggYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV93aWR0aCAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gcFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWSA9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotCi0gICAgLyogTG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiBUd28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBDdXJyZW50IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biA9IHB1OF95X2RhdGE7Ci0gICAgICAgIC8qIE5leHQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3lzID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotICAgICAgICAvKiBDdXJyZW50IFUgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3UgPSBwdThfdV9kYXRhOwotICAgICAgICAvKiBDdXJyZW50IFYgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3YgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuID0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0IGZvdXIgUkdCIDU2NSBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgdTE2X3BpeDEgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSBwdThfcmdibik7Ci0gICAgICAgICAgICB1MTZfcGl4MiA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgdTE2X3BpeDMgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYikpOwotICAgICAgICAgICAgdTE2X3BpeDQgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMTZfU0laRSkpOwotCi0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAsdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjEwLGkzMl9nMTAsaTMyX3IxMCx1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjExLGkzMl9nMTEsaTMyX3IxMSx1MTZfcGl4NCk7Ci0gICAgICAgICAgICAvKiBJZiBSR0IgaXMgdHJhbnNwYXJlbnQgY29sb3IgKDAsIDYzLCAwKSwgd2UgdHJhbnNmb3JtIGl0IHRvIHdoaXRlICgzMSw2MywzMSkgKi8KLSAgICAgICAgICAgIGlmKGkzMl9iMDAgPT0gMCAmJiBpMzJfZzAwID09IDYzICYmIGkzMl9yMDAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMCA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMCA9PSAwICYmIGkzMl9nMTAgPT0gNjMgJiYgaTMyX3IxMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjEwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjAxID09IDAgJiYgaTMyX2cwMSA9PSA2MyAmJiBpMzJfcjAxID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMSA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDEgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMTEgPT0gMCAmJiBpMzJfZzExID09IDYzICYmIGkzMl9yMTEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjExID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IxMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogQ29udmVydCBSR0IgdmFsdWUgdG8gWVVWICovCi0gICAgICAgICAgICBpMzJfdTAwID0gVTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMCA9IFkxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLQotICAgICAgICAgICAgaTMyX3UxMCA9IFUxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgPSBWMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTAgPSBZMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgPSBVMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxID0gVjE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAxID0gWTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotCi0gICAgICAgICAgICBpMzJfdTExID0gVTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSA9IFYxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMSA9IFkxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLQotICAgICAgICAgICAgLyogU3RvcmUgbHVtaW5hbmNlIGRhdGEgKi8KLSAgICAgICAgICAgIHB1OF95blswXSA9IChNNFZJRklfVUludDgpaTMyX3kwMDsKLSAgICAgICAgICAgIHB1OF95blsxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMDsKLSAgICAgICAgICAgIHB1OF95c1swXSA9IChNNFZJRklfVUludDgpaTMyX3kwMTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLSAgICAgICAgICAgICpwdThfdSA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9yZ2JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmMGJjMDYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9BdWRpb01peGluZy5jCi0gKiBAYnJpZWYgICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBhdWRpbyBtaXhpbmcgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vKiBQdXQgdGhlIGRlZmluaXRpb24gb2Ygc2lsZW5jZSBmcmFtZXMgaGVyZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLQotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUmVzYW1wbGVyLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTdGF0aWMgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0Jvb2wgTTRWU1MzR1BQX2lzVGhyZXNob2xkQnJlYWNoZWQoIE00T1NBX0ludDMyICphdmVyYWdlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzdG9yZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUgKTsKLS8qKgotICogICAgSW50ZXJuYWwgd2FybmluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDMwKQotCi0vKiBBIGRlZmluZSB1c2VkIHdpdGggU1NSQyAxLjA0IGFuZCBhYm92ZSB0byBhdm9pZCB0YWtpbmcKLWJsb2NrcyBzbWFsbGVyIHRoYXQgdGhlIG1pbmltYWwgYmxvY2sgc2l6ZSAqLwotI2RlZmluZSBNNFZTU19TU1JDX01JTkJMT0NLU0laRSAgICAgICAgNjAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCogcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogcFNldHRpbmdzKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIHZhbGlkIGF1ZGlvIG1peGluZyBzZXR0aW5ncwotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KCBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICpwRmlsZVdyaXRlUHRyRmN0ICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFNldHRpbmdzPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcFNldHRpbmdzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVSZWFkUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcEZpbGVSZWFkUHRyRmN0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVXcml0ZVB0ckZjdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IHBGaWxlV3JpdGVQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoIHBTZXR0aW5ncy0+dWlCZWdpbkxvb3AgPiBwU2V0dGluZ3MtPnVpRW5kTG9vcCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBCZWdpbiBsb29wIHRpbWUgaXMgaGlnaGVyIHRoYW4gZW5kIGxvb3AgdGltZSEiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5MT09QX0hJR0hFUl9FTkRMT09QOwotICAgIH0KLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCBhbmQgcmV0dXJuIGl0IHRvIHRoZSB1c2VyICovCi0gICAgcEMgPSAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Ci0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpLAotICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Iik7Ci0gICAgKnBDb250ZXh0ID0gcEM7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBcCi0gICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQscmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXphdGlvbiBvZiBjb250ZXh0IFZhcmlhYmxlcyAqLwotICAgIG1lbXNldCgodm9pZCAqKXBDICwwLAotICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0KSk7Ci0gICAgLyoqCi0gICAgKiBDb3B5IHRoaXMgc2V0dGluZyBpbiBjb250ZXh0ICovCi0gICAgcEMtPmlBZGRDdHMgPSBwU2V0dGluZ3MtPnVpQWRkQ3RzOwotICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBwU2V0dGluZ3MtPmJSZW1vdmVPcmlnaW5hbDsKLSAgICBwQy0+Yl9EdWNraW5nTmVlZGVlZCA9IHBTZXR0aW5ncy0+Yl9EdWNraW5nTmVlZGVlZDsKLSAgICBwQy0+SW5EdWNraW5nX3RocmVzaG9sZCA9IHBTZXR0aW5ncy0+SW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBwQy0+ZkJUVm9sTGV2ZWwgPSBwU2V0dGluZ3MtPmZCVFZvbExldmVsOwotICAgIHBDLT5mUFRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+ZlBUVm9sTGV2ZWw7Ci0gICAgcEMtPkluRHVja2luZ19sb3dWb2x1bWUgPSBwU2V0dGluZ3MtPkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgcEMtPmJEb0R1Y2tpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ykxvb3AgPSBwU2V0dGluZ3MtPmJMb29wOwotICAgIHBDLT5iTm9Mb29waW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJqdW1wZmxhZyA9IE00T1NBX1RSVUU7Ci0gICAgLyoqCi0gICAgKiBJbml0IHNvbWUgY29udGV4dCB2YXJpYWJsZXMgKi8KLQotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBZGRlZENsaXBDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+Zk9yaWdGYWN0b3IgPSAxLjBGOwotICAgIHBDLT5mQWRkZWRGYWN0b3IgPSAwLjBGOwotICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ykhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBJbml0IFBDLT5ld2MgbWVtYmVycyAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgIHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPSAxOwotICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jRFNJLnBJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBFbmNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBEdW1teUF1QnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogU2V0IHRoZSBPU0FMIGZpbGVzeXN0ZW0gZnVuY3Rpb24gc2V0ICovCi0gICAgcEMtPnBPc2FGaWxlUmVhZFB0ciA9IHBGaWxlUmVhZFB0ckZjdDsKLSAgICBwQy0+cE9zYUZpbGVXcml0UHRyID0gcEZpbGVXcml0ZVB0ckZjdDsKLQotICAgIC8qKgotICAgICogU3NyYyBzdHVmZiAqLwotICAgIHBDLT5iX1NTUkNuZWVkZWQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+cFNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+dWlCZWdpbkxvb3AgPSBwU2V0dGluZ3MtPnVpQmVnaW5Mb29wOwotICAgIHBDLT51aUVuZExvb3AgPSBwU2V0dGluZ3MtPnVpRW5kTG9vcDsKLQotICAgIC8qCi0gICAgKiBSZXNldCBwb2ludGVycyBmb3IgbWVkaWEgYW5kIGNvZGVjcyBpbnRlcmZhY2VzICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyogIENhbGwgdGhlIG1lZGlhIGFuZCBjb2RlY3Mgc3Vic2NyaXB0aW9uIG1vZHVsZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBPcGVuIGlucHV0IGNsaXAsIGFkZGVkIGNsaXAgYW5kIG91dHB1dCBjbGlwIGFuZCBwcm9jZWVkIHdpdGggdGhlIHNldHRpbmdzICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbihwQywgcFNldHRpbmdzKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIG1haW4gc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfVklERU87Ci0gICAgZWxzZQotICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDsKLQotICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uID0gKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgLypnSW5wdXRQYXJhbXMubHZCVENoYW5uZWxDb3VudCovCi0gICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZSgxNiwKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscywKLSAgICAgICAgLyogZ0lucHV0UGFyYW1zLmx2T3V0U2FtcGxlUmF0ZSovKE00T1NBX0ludDMyKXBTZXR0aW5ncy0+b3V0cHV0QVNGLCAxKTsKLSAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBMVkF1ZGlvUmVzYW1wbGVyICkKLSAgICAgewotICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICB9Ci0gICAgICAgIExWQXVkaW9zZXRTYW1wbGVSYXRlKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciwKLSAgICAgICAgLypnSW5wdXRQYXJhbXMubHZJblNhbXBsZVJhdGUqLwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0KLSAgICBMVkF1ZGlvc2V0Vm9sdW1lKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDE2KSgweDEwMDAgKSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDE2KSgweDEwMDAgKSk7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8gbWl4aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEBwYXJhbSAgICAgcFByb2dyZXNzICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApIG9mIHRoZSBmaW5hbGl6YXRpb24gb3BlcmF0aW9uCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzogQXVkaW8gbWl4aW5nIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdyBjYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKCBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogU3RhdGUgYXV0b21hdG9uICovCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfVklERU86Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8ocEMpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29tcHV0ZSB0aGUgcHJvZ3Jlc3MgcGVyY2VudGFnZQotICAgICAgICAgICAgKiBOb3RlOiBhdWRpbyBhbmQgdmlkZW8gQ1RTIGFyZSBub3QgaW5pdGlhbGl6ZWQgYmVmb3JlCi0gICAgICAgICAgICAqIHRoZSBjYWxsIG9mIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyAqLwotCi0gICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IEZpcnN0IDAtNTAlIHNlZ21lbnQgaXMgZGVkaWNhdGVkIHRvIHN0YXRlIDoKLSAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTyAqLwotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoNTAgKiAocEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUykKLSAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFRoZXJlIG1heSBiZSBubyBhdWRpbyB0cmFjayAoUmVtb3ZlIGF1ZGlvIHRyYWNrIGZlYXR1cmUpLgotICAgICAgICAgICAgKiBJbiB0aGF0IGNhc2Ugd2UgZG91YmxlIHRoZSBjdXJyZW50IHBlcmNlbnRhZ2UgKi8KLSAgICAgICAgICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duID09IHBDLT5ld2MuV3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCAqcFByb2dyZXNzKSA8PD0gMTsgLyoqPCB4MiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggKnBQcm9ncmVzcyA+PSA1MCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9Ci0gICAgICAgICAgICAgICAgICAgIDQ5OyAvKio8IFZpZGVvIHByb2Nlc3NpbmcgaXMgbm90IGdyZWF0ZXIgdGhhbiA1MCUgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBWaWRlbyBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGF1ZGlvIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5pQWRkQ3RzID4gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX0ZJUlNUX1NFR01FTlQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIE5vIGF1ZGlvLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIEZJTklTSEVEICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDoKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ6Ci0gICAgICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICE9IC1wQy0+cEFkZGVkQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbgotICAgICAgICAgICAgICAgICYmIChwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzIC0gMC41KQotICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbyA+IHBDLT51aUVuZExvb3AKLSAgICAgICAgICAgICAgICAmJiBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZihwQy0+Ykxvb3AgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmJOb0xvb3BpbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGp1bXBDVFMgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPgotICAgICAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW0sICZqdW1wQ1RTKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwOiBlcnJvciB3aGVuIGp1bXBpbmcgaW4gYWRkZWQgYXVkaW8gY2xpcDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVzZSBvZmZzZXQgdG8gZ2l2ZSBhIGNvcnJlY3QgQ1RTIC4uLiAqLwotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YlJlbW92ZU9yaWdpbmFsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgocEMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UocEMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29tcHV0ZSB0aGUgcHJvZ3Jlc3MgcGVyY2VudGFnZQotICAgICAgICAgICAgKiBOb3RlOiBhdWRpbyBhbmQgdmlkZW8gQ1RTIGFyZSBub3QgaW5pdGlhbGl6ZWQgYmVmb3JlCi0gICAgICAgICAgICAqIHRoZSBjYWxsIG9mIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpbyAqLwotICAgICAgICAgICAgaWYoIDAgIT0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogU2Vjb25kIDUwLTEwMCUgc2VnbWVudCBpcyBkZWRpY2F0ZWQgdG8gc3RhdGVzIDoKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU8uLi4gKi8KLSAgICAgICAgICAgICAgICAvKiBGb3IgQXVkaW8gdGhlIHByb2dyZXNzIGNvbXB1dGF0aW9uIGlzIGJhc2VkIG9uIGRBdG8gYW5kIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICBpdCBpcyBtb3JlIGFjY3VyYXRlICovCi0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoNTAKLSAgICAgICAgICAgICAgICAgICAgKyAoNTAgKiBwQy0+ZXdjLmRBVG8gLSBwQy0+cElucHV0Q2xpcEN0eHQtPmlWb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAvIChwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbikpOyAvKio8IDUwIGZvciAxMDAvMiAqKi8KLQotICAgICAgICAgICAgICAgIGlmKCAqcFByb2dyZXNzID49IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDk5OyAvKio8IEl0J3Mgbm90IHJlYWxseSBmaW5pc2hlZCwgSSBwcmVmZXIgdG8gcmV0dXJuIGxlc3MgdGhhbiAxMDAlICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSA5OTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEF1ZGlvIGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gRklOSVNIRUQgKi8KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwOiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW8gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEOgotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUHJvZ3Jlc3MgcGVyY2VudGFnZTogZmluYWxpemUgZmluaXNoZWQgLT4gMTAwJSAqLwotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEF1ZGlvIG1peGluZyBpcyBmaW5pc2hlZCwgcmV0dXJuIGNvcnJlY3Qgd2FybmluZyAqLwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IFN0YXRlIGVycm9yICgweCV4KSEgUmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgbGFzdENUUzsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKTogTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcDogcENvbnRleHQgaXNcCi0gICAgICAgICAgICAgTTRPU0FfTlVMTCwgcmV0dXJuaW5nIE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgSW5wdXQgM0dQUCBmaWxlICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBJbnB1dENsaXBDdHh0ICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQy0+cElucHV0Q2xpcEN0eHQpOwotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgQWRkZWQgM0dQUCBmaWxlICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBZGRlZENsaXBDdHh0ICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQy0+cEFkZGVkQ2xpcEN0eHQpOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgdGhlIDNHUCB3cml0ZXIuIEluIG5vcm1hbCB1c2UgY2FzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCwKLSAgICAgIGJ1dCBub3QgaW4gYWJvcnQgdXNlIGNhc2UgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qIFVwZGF0ZSBsYXN0IFZpZGVvIENUUyAqLwotICAgICAgICBsYXN0Q1RTID0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb247Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEZpbGVEdXJhdGlvbiwgJmxhc3RDVFMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBTZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSgKLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlV3JpdGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuIHRoZSBlcnJvciBiZWNhdXNlIHdlIGhhdmUgb3RoZXIgdGhpbmdzIHRvIGZyZWUhICovCi0gICAgICAgIH0KLSAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBBdWRpbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNzcmMgc3R1ZmYgKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5Tc3JjU2NyYXRjaCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5Tc3JjU2NyYXRjaCk7Ci0gICAgICAgIHBDLT5Tc3JjU2NyYXRjaCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFNzcmNCdWZmZXJJbik7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgJiYgKE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwKSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlck91dCk7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBUZW1wQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBUZW1wQnVmZmVyKTsKLSAgICAgICAgcEMtPnBUZW1wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAocEMtPnBMVkF1ZGlvUmVzYW1wbGVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBMVkRlc3Ryb3kocEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoJnBDLT5TaGVsbEFQSSk7Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBmcmVlKHBDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqICAgICAgICAgICAgICAgICAgU1RBVElDIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIHZhbGlkIGF1ZGlvIG1peGluZyBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyAqcFNldHRpbmdzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRBU0YgPSAwOwotICAgIE00RU5DT0RFUl9IZWFkZXIgKmVuY0hlYWRlcjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbiBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwU2V0dGluZ3M9MHgleCIsCi0gICAgICAgIHBDLCBwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiBUaGUgQWRkIFZvbHVtZSBtdXN0IGJlIChzdHJpY3RseSkgc3VwZXJpb3IgdGhhbiB6ZXJvICovCi0gICAgaWYoIHBTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IEFkZFZvbHVtZSBpcyB6ZXJvLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk87Ci0gICAgfQotICAgIC8qCi0gICAgZWxzZSBpZihwU2V0dGluZ3MtPnVpQWRkVm9sdW1lID49IDEwMCkgLy8gSWYgdm9sdW1lIGlzIHNldCB0byAxMDAsIG5vIG1vcmUgb3JpZ2luYWwgYXVkaW8gLi4uCi0gICAgewotICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICAqLwotICAgIC8qKgotICAgICogQnVpbGQgdGhlIGlucHV0IGNsaXAgc2V0dGluZ3MgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MucEZpbGUgPQotICAgICAgICBwU2V0dGluZ3MtPnBPcmlnaW5hbENsaXBGaWxlOyAvKio8IElucHV0IDNHUFAgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgcEMtPklucHV0Q2xpcFNldHRpbmdzLkZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0gICAgcEMtPklucHV0Q2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgb3JpZ2luYWwgQXVkaW8vVmlkZW8gM0dQUCBjbGlwICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQy0+cElucHV0Q2xpcEN0eHQsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBJbml0KG9yaWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQy0+cElucHV0Q2xpcEN0eHQsICZwQy0+SW5wdXRDbGlwU2V0dGluZ3MsCi0gICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgLyoqCi0gICAgKiBJZiB0aGVyZSBpcyBubyB2aWRlbywgaXQncyBhbiBlcnJvciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogbm8gdmlkZW8gc3RyZWFtIGluIGNsaXAsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgY2xpcCBwcm9wZXJ0aWVzICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMocEMtPnBJbnB1dENsaXBDdHh0LAotICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKG9yaWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQnVpbGQgdGhlIGFkZGVkIGNsaXAgc2V0dGluZ3MgKi8KLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MucEZpbGUgPQotICAgICAgICBwU2V0dGluZ3MtPnBBZGRlZEF1ZGlvVHJhY2tGaWxlOyAvKio8IEFkZGVkIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5GaWxlVHlwZSA9IHBTZXR0aW5ncy0+QWRkZWRBdWRpb0ZpbGVUeXBlOwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy51aUJlZ2luQ3V0VGltZSA9Ci0gICAgICAgIDA7IC8qKjwgTm8gbm90aW9uIG9mIGN1dCBmb3IgdGhlIGF1ZGlvIG1peGluZyBmZWF0dXJlICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnVpRW5kQ3V0VGltZSAgID0gMDsvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM9Ci0gICAgICAgIHBTZXR0aW5ncy0+dWlOdW1DaGFubmVsczsKLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MuQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeT0gICAgcFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnBGaWxlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIE9wZW4gdGhlIGFkZGVkIEF1ZGlvIGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQy0+cEFkZGVkQ2xpcEN0eHQsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwSW5pdChhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQy0+cEFkZGVkQ2xpcEN0eHQsICZwQy0+QWRkZWRDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICBNNE9TQV9GQUxTRSwgTTRPU0FfRkFMU0UsIE00T1NBX1RSVUUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwT3BlbihhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIHRoZXJlIGlzIG5vIGF1ZGlvLCBpdCdzIGFuIGVycm9yICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogbm8gYXVkaW8gbm9yIHZpZGVvIHN0cmVhbSBpbiBjbGlwLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgY2xpcCBwcm9wZXJ0aWVzICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKHBDLT5wQWRkZWRDbGlwQ3R4dCwKLSAgICAgICAgICAgICZwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPm91dHB1dEFTRiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAxNjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gMjQwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMyMDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAzMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gNDgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBwYXJhbWV0ZXIgaW4gb3V0cHV0IEFTRiAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPT0gTTRPU0FfVFJVRQotICAgICAgICAgICAgJiYgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUDMgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSAhPSBvdXRwdXRBU0YKLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzKSApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5vdXRwdXRBU0YgPSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IDMyMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAyMDQ4ICogcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGOwotCi0gICAgICAgICAgICBpZiggb3V0cHV0QVNGICE9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGNhbGwgU1NSQyBpbiBvcmRlciB0byBhbGlnbiBBU0YgYW5kL29yIG5iIG9mIGNoYW5uZWxzICovCi0gICAgICAgICAgICAgICAgLyogTW9yZW92ZXIsIGF1ZGlvIGVuY29kZXIgbWF5IGJlIG5lZWRlZCBpbiBjYXNlIG9mIGF1ZGlvIHJlcGxhY2luZy4uLiAqLwotICAgICAgICAgICAgICAgIHBDLT5iX1NTUkNuZWVkZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgPCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTdGVyZW8gdG8gTW9ubyAqLwotICAgICAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICA+IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE1vbm8gdG8gU3RlcmVvICovCi0gICAgICAgICAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgY29tcGF0aWJpbGl0eSBjaGFydCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KHBDLAotICAgICAgICAgICAgJnBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICZwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGxvb3AgcGFyYW1ldGVycyAqLwotICAgICAgICBpZiggcEMtPnVpQmVnaW5Mb29wID4gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgIGJlZ2luIGxvb3AgdGltZSBpcyBoaWdoZXIgdGhhbiBhZGRlZCBjbGlwIGF1ZGlvIGR1cmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPaywgbGV0J3MgZ28gd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICovCi0gICAgICAgIHBDLT5iSGFzQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBObyBhZGRlZCBmaWxlLCBmb3JjZSByZW1vdmUgb3JpZ2luYWwgKi8KLSAgICAgICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOwotICAgICAgICBwQy0+YlJlbW92ZU9yaWdpbmFsID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcEMtPmJIYXNBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgdmlkZW8gcHJvcGVydGllcyBvZiB0aGUgaW5wdXQgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBwQy0+ZXdjLnVpVmlkZW9CaXRyYXRlID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aDsKLSAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0hlaWdodDsKLSAgICBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZTsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0ZGF0YVBhcnRpdGlvbjsKLSAgICBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZTsKLSAgICBwQy0+ZXdjLm91dHB1dFZpZGVvTGV2ZWwgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0xldmVsOwotICAgIHN3aXRjaCggcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rTVBFR180OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa0gyNjQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogQWRkIGEgbGluayB0byB2aWRlbyBkc2kgKi8KLSAgICBpZiggTTRTWVNfa0gyNjQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLQotICAgICAgICAvKiBGb3IgSC4yNjQgZW5jb2RlciBjYXNlCi0gICAgICAgICogRmV0Y2ggdGhlIERTSSBmcm9tIHRoZSBzaGVsbCB2aWRlbyBlbmNvZGVyLCBhbmQgZmVlZCBpdCB0byB0aGUgd3JpdGVyICovCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGdldCBEU0kgZm9yIEgyNjQgc3RyZWFtIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwiKTsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybmVkIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGVuY0hlYWRlci0+cEJ1Zj0weCV4LCBzaXplPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlbmNIZWFkZXItPnBCdWYsIGVuY0hlYWRlci0+U2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBzZW5kIERTSSBmb3IgSDI2NCBzdHJlYW0gdG8gM0dQIHdyaXRlciIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhlbmNIZWFkZXItPlNpemUsIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKEgyNjQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSAoSDI2NCksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSAoTTRPU0FfVUludDE2KWVuY0hlYWRlci0+U2l6ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBWaWRlb091dHB1dERzaSwgKHZvaWQgKillbmNIZWFkZXItPnBCdWYsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+U2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMLCBjYW5ub3QgZ2V0IHRoZSBEU0kiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBpbnB1dCBjbGlwIHZpZGVvIHN0cmVhbSB0eXBlID0gMHgleCIsCi0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9IChNNE9TQV9NZW1BZGRyOClwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgYXVkaW8gcHJvcGVydGllcyBvZiB0aGUgYWRkZWQgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgewotICAgICAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgICAgICAgICAvKiBpZiBvdXRwdXQgc2V0dGluZ3MgYXJlIGRpZmZlcmVudHMgZnJvbSBhZGRlZCBjbGlwIHNldHRpbmdzLAotICAgICAgICAgICAgd2UgbmVlZCB0byByZWVuY29kZSBCR00gKi8KLSAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUDMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNldCByZWFkZXIgRFNJIHRvIE5VTEwgKHVua25vd24pLCB3ZSB3aWxsIHVzZSBlbmNvZGVyIERTSSBsYXRlciAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5cCi0gICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gMTIyMDA7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9IDMyMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5zY2FsZV9hdWRpbyA9IHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSAvIDEwMDAuMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazI0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazQ4X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPT0gMiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJpdHJhdGUgaGF2ZSB0byBiZSBkb3VibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSArPSBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQ7IC8qIEFBQyBpcyBhbHdheXMgMTAyNC9GcmVxIHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMTYwOyAvKiBFVlJDIGZyYW1lcyBhcmUgMjAgbXMgYXQgODAwMCBIegotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZXMgaXQgZWFzaWVyIHRvIGZhY3Rvcml6ZSBhbXIgYW5kIGV2cmMgY29kZSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1BDTToKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCByZWFkZXIgRFNJIHRvIE5VTEwgKHVua25vd24pLCB3ZSB3aWxsIHVzZSBlbmNvZGVyIERTSSBsYXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSA4MDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IChNNE9TQV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPT0gMTYwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IChNNE9TQV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IChNNE9TQV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQ7IC8qIEFBQyBpcyBhbHdheXMgMTAyNC9GcmVxIHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgYSBsaW5rIHRvIGF1ZGlvIGRzaSAqLwotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDg7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk87Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQ7IC8qIEFBQyBpcyBhbHdheXMgMTAyNC9GcmVxIHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogTm8gYXVkaW8gdHJhY2sgaW4gaW5wdXQgZmlsZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQWRkIGEgbGluayB0byBhdWRpbyBkc2kgKi8KLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IChNNE9TQV9NZW1BZGRyOClwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSBjb21tb24gJ3NpbGVuY2UgZnJhbWUgc3R1ZmYnIHRvIENsaXBDb250ZXh0ICovCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLQotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAtcEMtPnBJbnB1dENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLQotICAgIC8qKgotICAgICogQ29weSBjb21tb24gJ3NpbGVuY2UgZnJhbWUgc3R1ZmYnIHRvIENsaXBDb250ZXh0ICovCi0gICAgaWYoIHBDLT5iSGFzQXVkaW8gKQotICAgIHsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhID0gcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgLXBDLT5wQWRkZWRDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOyAvKiBSZXNldCB0aW1lICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBBZGRDdHMgaXMgbG93ZXIgdGhhbiBvcmlnaW5hbCBjbGlwIGR1cmF0aW9uICovCi0gICAgaWYoICggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbSkKLSAgICAgICAgJiYgKHBDLT5pQWRkQ3RzID4gKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiB1aUFkZEN0cyBpcyBsYXJnZXIgdGhhbiB2aWRlbyBkdXJhdGlvbixcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlIGF1ZGlvIHRyYWNrcyBhcmUgbm90IGNvbXBhdGlibGUsIHJlcGxhY2UgaW5wdXQgdHJhY2sgYnkgc2lsZW5jZSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgIENsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhwQy0+cElucHV0Q2xpcEN0eHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgYXVkaW8gbWl4aW5nIGlzIHJlcXVpcmVkICovCi0gICAgaWYoICggKCBwQy0+Ykhhc0F1ZGlvKSAmJiAoTTRPU0FfRkFMU0UKLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzRWRpdGFibGUpKQotICAgICAgICB8fCAoTTRPU0FfVFJVRSA9PSBwQy0+YlJlbW92ZU9yaWdpbmFsKSApIC8qfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFNldHRpbmdzLT51aUFkZFZvbHVtZSA+PSAxMDApKSAqLwotICAgIHsKLSAgICAgICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5iQXVkaW9NaXhpbmdJc05lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBvdXRwdXQgYXVkaW8gY2FuIHN1cHBvcnQgc2lsZW5jZSBmcmFtZXMKLSAgICBUcmljayBpIHVzZSBiQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCBmaWxlZCB0byBzdG9yZSB0aGF0ICAqLwotICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICB7Ci0gICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsKLQotICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+aUFkZEN0cyA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgaUFkZEN0cyBzaG91bGQgYmUgc2V0IHRvIDAgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAwIDwgcEMtPnVpRW5kTG9vcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICB1aUVuZExvb3Agc2hvdWxkIGJlIHNldCB0byAwIHdpdGggdGhpcyBhdWRpbyB0cmFjayAhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKCBwQy0+Yl9EdWNraW5nTmVlZGVlZCA9PSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIGZhY3RvciB0byBhcHBseSB0byBzYW1wbGUgdG8gZG8gdGhlIG1peGluZyAqLwotICAgICAgICBwQy0+ZkFkZGVkRmFjdG9yID0gMC41MEY7Ci0gICAgICAgIHBDLT5mT3JpZ0ZhY3RvciA9IDAuNTBGOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBTU1JDIGlzIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iX1NTUkNuZWVkZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIG51bWVyYXRvciwgZGVub21pbmF0b3IsIHJhdGlvLCByYXRpb0J1ZmZlcjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJbml0IHRoZSBTU1JDIG1vZHVsZSAqLwotICAgICAgICBTU1JDX1JldHVyblN0YXR1c19lbgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzOyAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYgTnJTYW1wbGVzTWluID0KLSAgICAgICAgICAgIDA7IC8qIE1pbmltYWwgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgKi8KLSAgICAgICAgTFZNX0lOVDMyCi0gICAgICAgICAgICBTY3JhdGNoU2l6ZTsgLyogVGhlIHNpemUgb2YgdGhlIHNjcmF0Y2ggbWVtb3J5ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgTFZNX0lOVDE2Ci0gICAgICAgICAgICAqcElucHV0SW5TY3JhdGNoOyAvKiBQb2ludGVyIHRvIGlucHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYKLSAgICAgICAgICAgICoKLSAgICAgICAgICAgIHBPdXRwdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBpbiB0aGUgc2NyYXRjaCBidWZmZXIgICovCi0gICAgICAgIFNTUkNfUGFyYW1zX3Qgc3NyY1BhcmFtczsgICAgICAgICAgLyogTWVtb3J5IGZvciBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgc3dpdGNoKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDExMDI1OgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMTAyNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMjQwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBpbnZhbGlkIGFkZGVkIGNsaXAgc2FtcGxpbmcgZnJlcXVlbmN5ICglZCBIeiksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAxID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzID0gTFZNX01PTk87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzID0gTFZNX1NURVJFTzsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCggcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGludmFsaWQgb3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAoJWQgSHopLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgUmV0dXJuU3RhdHVzID0gMDsKLQotICAgICAgICBzd2l0Y2ggKHNzcmNQYXJhbXMuU1NSQ19Gc19Jbil7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzExMDI1OgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9NDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAgICA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDk2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxMjgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzQ0MTAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDE3NjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTkyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc3NyY1BhcmFtcy5TU1JDX0ZzX091dCl7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzExMDI1OgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPTQ0MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTYwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gICAgNjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzIyMDUwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDg4MjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18yNDAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMzIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTkyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiggUmV0dXJuU3RhdHVzICE9IFNTUkNfT0sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjpcCi0gICAgICAgICAgICAgICAgRXJyb3IgY29kZSAlZCByZXR1cm5lZCBieSB0aGUgU1NSQ19HZXROclNhbXBsZXMgZnVuY3Rpb24iLAotICAgICAgICAgICAgICAgIFJldHVyblN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBOclNhbXBsZXNNaW4gPQotICAgICAgICAgICAgKExWTV9JTlQxNikoKHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPiBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCkKLSAgICAgICAgICAgID8gc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgOiBzc3JjUGFyYW1zLk5yU2FtcGxlc0luKTsKLQotICAgICAgICB3aGlsZSggTnJTYW1wbGVzTWluIDwgTTRWU1NfU1NSQ19NSU5CTE9DS1NJWkUgKQotICAgICAgICB7IC8qIERvbid0IHRha2UgYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA8PCAxKTsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPDwgMSk7Ci0gICAgICAgICAgICBOclNhbXBsZXNNaW4gPSAoTFZNX0lOVDE2KShOclNhbXBsZXNNaW4gPDwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPmlTc3JjTmJTYW1wbEluID0gKExWTV9JTlQxNikoCi0gICAgICAgICAgICBzc3JjUGFyYW1zLgotICAgICAgICAgICAgTnJTYW1wbGVzSW4pOyAvKiBtdWx0aXBsaWNhdGlvbiBieSBOck9mQ2hhbm5lbHMgaXMgZG9uZSBiZWxvdyAqLwotICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQpOwotCi0gICAgICAgIG51bWVyYXRvciA9Ci0gICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICBkZW5vbWluYXRvciA9Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgKiBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotCi0gICAgICAgIGlmKCBudW1lcmF0b3IgJSBkZW5vbWluYXRvciA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmF0aW9CdWZmZXIgPSAoTTRPU0FfVUludDMyKShudW1lcmF0b3IgLyBkZW5vbWluYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpb0J1ZmZlciA9IChNNE9TQV9VSW50MzIpKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKSArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICByYXRpbyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgICAgICAqIHJhdGlvQnVmZmVyKSAvIChwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgIGlmKCByYXRpbyA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSXQgbWVhbnMgdGhhdCB0aGUgaW5wdXQgc2l6ZSBvZiBTU1JDIGJ1ZmZlckluIGlzIGJpZ2dlciB0aGFuIHRoZSBhc2tlZCBidWZmZXIgKi8KLSAgICAgICAgICAgIHBDLT5taW5pbXVtQnVmZmVySW4gPSBwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmF0aW8rKzsgLyogV2UgdXNlIHRoZSBpbW1lZGlhdGUgc3VwZXJpb3IgaW50ZWdlciAqLwotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IHJhdGlvICogKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCi0gICAgICAgICAgICArIHBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC4KLSAgICAgICAgICAgIG1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVySW4sIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBTU1JDICovCi0gICAgICAgIC8qIFRoZSAiMyIgdmFsdWUgYmVsb3cgc2hvdWxkIGJlIG9wdGltaXplZCAuLi4gb25lIGRheSAuLi4gKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMyAqIHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAqIHBDLT5ld2MudWlOYkNoYW5uZWxzLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVyT3V0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVyT3V0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlck91dDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgYnVmZmVyIG5lZWRlZCBpbiBjYXNlIG9mIGNoYW5uZWwgY29udmVyc2lvbiAqLwotICAgICAgICBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoZSAiMyIgdmFsdWUgYmVsb3cgc2hvdWxkIGJlIG9wdGltaXplZCAuLi4gb25lIGRheSAuLi4gKi8KLSAgICAgICAgICAgIHBDLT5wVGVtcEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dAotICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBUZW1wQnVmZmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwVGVtcEJ1ZmZlciwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGlucHV0IG9mIHRoZSBTU1JDICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm1pbmltdW1CdWZmZXJJbgotICAgICAgICAgICAgKyBwQy0+cEFkZGVkQ2xpcEN0eHQtPgotICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQuCi0gICAgICAgICAgICBtX2J1ZmZlclNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVySW4iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IFwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVyT3V0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVyT3V0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlck91dDsKLSAgICB9Ci0gICAgZWxzZSBpZiggKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyl8fAotICAgICAgICAgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa1BDTSkpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgbWluYnVmZmVyID0gMDsKLQotICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IDIwNDggKiBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IDMyMDsKLQotICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID4gMzIwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW5idWZmZXIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW5idWZmZXIgPSBwQy0+bWluaW11bUJ1ZmZlckluOyAvKiBOb3QgcmVhbGx5IHBvc3NpYmxlIC4uLiovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIG91dHB1dCBhdWRpbyBmb3JtYXQsIGluIGNhc2Ugb2YgTVAzIHJlcGxhY2luZyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGlucHV0IG9mIHRoZSBTU1JDICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMiAqIG1pbmJ1ZmZlciwgTTRWU1MzR1BQLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVySW4sXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgPSBwQy0+cFBvc0luU3NyY0J1ZmZlckluOwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBwQy0+cFNzcmNCdWZmZXJJbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIGF1ZGlvIGVuY29kZXIgaXMgbmVlZGVkIHRvIGRvIGF1ZGlvIG1peGluZyBvciBhdWRpbyByZXNhbXBsaW5nICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkIHx8IE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICB8fCBNNFZJREVPRURJVElOR19rTVAzCi0gICAgICAgID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICE9IG91dHB1dEFTRgotICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBJbml0IHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoJnBDLT5ld2MsICZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluIGNhc2Ugb2YgUENNLCBNUDMgb3IgYXVkaW8gcmVwbGFjZSB3aXRoIHJlZW5jb2RpbmcsIHVzZSBlbmNvZGVyIERTSSAqLwotICAgICAgICBpZiggcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9PSAwICYmIChNNFZJREVPRURJVElOR19rUENNCi0gICAgICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICB8fCBNNFZJREVPRURJVElOR19rTVAzID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMpICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+ZXdjLnBBdWRpb0VuY0RTSS5pbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIG91dHB1dCAzR1BQIGZpbGUgKi8KLSAgICAvKjExLzEyLzIwMDggQ1IzMjgzIGFkZCB0aGUgbWF4IG91dHB1dCBmaWxlIHNpemUgZm9yIHRoZSBNTVMgdXNlIGNhc2UgaW4gVmlkZW9BcnRpc3QqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ciwgcFNldHRpbmdzLT5wT3V0cHV0Q2xpcEZpbGUsCi0gICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIsIHBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUsIDApOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSgpCi0gKiBAYnJpZWYgICAgV3JpdGUgYW4gYXVkaW8gc2lsZW5jZSBmcmFtZSBpbnRvIHRoZSB3cml0ZXIKLSAqIEBub3RlICAgIE1haW5seSB1c2VkIHdoZW4gcGFkZGluZyB3aXRoIHNpbGVuY2UKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZTpcCi0gICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiQSAjIyMjIHNpbGVuY2UgQVUiKTsKLQotICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKilwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhLCBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSk7Ci0KLSAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAoTTRPU0FfVGltZSkocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiQiAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvKSwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlOlwKLSAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShzaWxlbmNlKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHZpZGVvLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDE2IG9mZnNldDsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIFZJREVPIHN0ZXAgOiBkVlRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZE91dHB1dFZpZEN0cywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlWb2Zmc2V0KTsKLQotICAgIC8qKgotICAgICogUmVhZCB0aGUgaW5wdXQgdmlkZW8gQVUgKi8KLSAgICBlcnIgPSBwQy0+cElucHV0Q2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLAotICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oKTogbV9wRmN0R2V0TmV4dEF1KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiQyAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9DVFMsIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUpOwotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlclZpZGVvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbzogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG9mZnNldCA9IDA7Ci0gICAgLyogZm9yIGguMjY0IHN0cmVhbSBkbyBub3QgcmVhZCB0aGUgMXN0IDQgYnl0ZXMgYXMgdGhleSBhcmUgaGVhZGVyIGluZGljYXRvcnMgKi8KLSAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICA9PSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiBpbnB1dCBzdHJlYW0gdHlwZSBIMjY0Iik7Ci0gICAgICAgIG9mZnNldCA9IDQ7Ci0gICAgfQotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUgIC09ICBvZmZzZXQ7Ci0gICAgLyoqCi0gICAgKiBDaGVjayB0aGF0IHRoZSB2aWRlbyBBVSBpcyBub3QgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQgKi8KLSAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSA+IHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW86IEFVIHNpemUgZ3JlYXRlciB0aGFuIE1heEF1U2l6ZSAoJWQ+JWQpIVwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRSIsCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplLCBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwYXlsb2FkIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKLSAgICAgICAgKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUpKTsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgcGFyYW1ldGVycyB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplOwotICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5DVFMgPQotICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9DVFMgKyAwLjUpOwotICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9hdHRyaWJ1dGU7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgIE00T1NBX1RSQUNFMl8yKCJEIC0tLS0gd3JpdGUgOiBjdHMgID0gJWx1IFsgMHgleCBdIiwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUywgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBQZXJmb3JtIG9uZSBzdGVwIG9mIGF1ZGlvLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyBtaXggIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5TdGF0ZSwgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldCk7Ci0KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDEpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIEFkZEN0cyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmlBZGRDdHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRmlyc3Qgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHNlY29uZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIGZyb20gcmVhZGluZyBzdGF0ZSB0byBlbmNvZGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6IHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6IHJldHVybmluZyBNNE5PX0VSUk9SICgxLT4yKSIpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkICkgLyoqPCBNaXggKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIGFkZGVkIGF1ZGlvIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwIHx8IHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfVFJVRQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUDMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIG9mIHNhbXBsaW5nIGZyZXEgY29udmVyc2lvbiBhbmQvb3IgY2hhbm5lbCBjb252ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlYWQgbmV4dCBBVSB3aWxsIGJlICAgIGNhbGxlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJFIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdoYXQgdG8gZG8gd2hlbiBhdWRpbyBpcyBvdmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEp1bXAoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIGZyb20gZW5jb2Rpbmcgc3RhdGUgdG8gcmVhZGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDItPjMpIGEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG9yaWdpbmFsIGF1ZGlvIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkYgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+Yl9TU1JDbmVlZGVkID09IE00T1NBX0ZBTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFBlcmZvcm0gdGhlIGF1ZGlvIG1peGluZyAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vIG1peCwganVzdCBjb3B5IGFkZGVkIGF1ZGlvICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQocEMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEp1bXAoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFkZCBhIHNpbGVuY2UgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIGF1ZGlvIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKGxvb3ApIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiB0byBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUtZW5jb2RlIGZhaWxzIGVyciA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDItPjMpIGIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoMikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB2aWRlbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6IFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcocEMpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygzKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBkdXJhdGlvbiByZWFjaGVkLCByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZShNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyByZXBsIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5TdGF0ZSwgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldCk7Ci0KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlcGxhY2UgdGhlIFNJRCAoc2lsZW5jZSkgcGF5bG9hZCBpbiB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBBZGRDdHMgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5kQVRvID49IHBDLT5pQWRkQ3RzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEZpcnN0IHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byBzZWNvbmQgYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SICgxLT4yKSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdoYXQgdG8gZG8gd2hlbiBhdWRpbyBpcyBvdmVyICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgYXVkaW8gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKGxvb3ApIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDItPjMpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGhpcmQgc2VnbWVudCAoc2lsZW5jZSkgaXMgb25seSBkb25lIGlmIHN1cHBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICogSW4gb3RoZXIgY2FzZSwgd2UgZmluaXNoIGhlcmUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+RikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY2xpcCAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOiBDbGlwIGR1cmF0aW9uIHJlYWNoZWQsXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBTSUQgKHNpbGVuY2UpIHBheWxvYWQgaW4gdGhlIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB2aWRlbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOyAvKio8IFNpbXVsYXRlIGVuZCBvZiBmaWxlIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgUmVhZCBvbmUgQVUgZnJvbSB0aGUgb3JpZ2luYWwgYXVkaW8gZmlsZSBhbmQgd3JpdGUgaXQgdG8gdGhlIG91dHB1dAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIGlucHV0IG9yaWdpbmFsIGF1ZGlvIEFVICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJHIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldCAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoKTogbV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWc6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGlucHV0IEFVIHByb3BlcnRpZXMgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPnBJbnB1dENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldDsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgQVUgaXRzZWxmICovCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIG1peGVkIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkggLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWc6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcm9tIHRoZSBhZGRlZCBhdWRpbyBmaWxlIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBpZihwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUDMgfHwKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rUENNIHx8Ci0gICAgICAgIHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfVFJVRSB8fAotICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwKQotICAgIHsKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgLyoqPCBFbmNvZGVyIGlucHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlcgotICAgICAgICAgICAgcEVuY091dEJ1ZmZlcjsgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgICAgICBNNE9TQV9UaW1lCi0gICAgICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgICAgIE00T1NBX01lbUFkZHI4IHRlbXBQb3NCdWZmZXI7Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydChwQyk7Ci0KLSAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQ6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQgZW5kIG9mIGFkZGVkIGZpbGUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peDpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgZnJhbWVUaW1lRGVsdGEgPSBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAvIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIksgKioqKiBibGVuZCBBVXMiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6XAotICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IEFVIGN0cyBhbmQgc2l6ZSAqLwotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyLgotICAgICAgICAgICAgcFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgLyogVXBkYXRlIGRlY29kZWQgYnVmZmVyIGhlcmUgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVyT3V0LCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC09Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4gKyBwQy0+bWluaW11bUJ1ZmZlckluOwotICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPSBwQy0+bWluaW11bUJ1ZmZlckluOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIG1peGVkIEFVICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJKIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluY3JlbWVudCB0aGUgYXVkaW8gQ1RTIGZvciB0aGUgbmV4dCBzdGVwICovCi0gICAgICAgIHBDLT5ld2MuZEFUbyArPSBmcmFtZVRpbWVEZWx0YSAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlYWQgdGhlIGFkZGVkIGF1ZGlvIEFVICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkkgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZCgpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwcm9wZXJ0aWVzIHRvIHRoZSBvdXRwdXQgQVUgKi8KLQotICAgICAgICAvKiogVEhFIENIRUNLIEJFTE9XIElTIEFEREVEIFRPIFBSRVZFTlQgSVNTVUVTIExJTktFRCBUTyBQUkUtQUxMT0NBVEVEIE1BWCBBVSBTSVpFCi0gICAgICAgIG1heCBBVSBzaXplIGlzIHNldCBiYXNlZCBvbiBNNFZTUzNHUFBfQVVESU9fTUFYX0FVX1NJWkUgZGVmaW5lZCBpbiBmaWxlCi0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oLCBJZiB0aGlzIGVycm9yIG9jY3VycyBpbmNyZWFzZSB0aGUgbGltaXQgc2V0IGluIHRoaXMgZmlsZQotICAgICAgICAqLwotICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID4gcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAiRVJST1I6IGF1ZGlvIEFVIHNpemUgKCVkKSB0byBjb3B5IGxhcmdlciB0aGFuIGFsbG9jYXRlZCBvbmUgKCVkKSA9PiBhYm9ydCIsCi0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplLAotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJQTEVBU0UgQ09OVEFDVCBTVVBQT1JUIFRPIEVYVEVORCBNQVggQVUgU0laRSBJTiBUSEUgUFJPRFVDVCBMSUJSQVJZIik7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBDb3B5IHRoZSBBVSBpdHNlbGYgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIG1peGVkIEFVICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJKIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluY3JlbWVudCB0aGUgYXVkaW8gQ1RTIGZvciB0aGUgbmV4dCBzdGVwICovCi0gICAgICAgIHBDLT5ld2MuZEFUbyArPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBDb252ZXJ0IFBDTSBvZiBhZGRlZCB0cmFjayB0byB0aGUgcmlnaHQgQVNGIC8gbmIgb2YgQ2hhbm5lbHMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgaW50IHNzcmNFcnI7IC8qKjwgRXJyb3Igd2hpbGUgc3NyYyBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyIHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLQotICAgIE00T1NBX1VJbnQzMiBvdXRGcmFtZUNvdW50ID0gdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzOwotICAgIC8qIERvIHdlIG5lZWQgdG8gZmVlZCBTU1JDIGJ1ZmZlciBJbiA/ICovCi0gICAgLyoqCi0gICAgKiBSQzogVGhpcyBpcyBub3QgcmVhbGx5IG9wdGltdW0gKG1lbW1vdmUpLiBXZSBzaG91bGQgaGFuZGxlIHRoaXMgd2l0aCBsaW5rZWQgbGlzdC4gKi8KLSAgICB3aGlsZSggcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHBDLT5wU3NyY0J1ZmZlckluIDwgKE00T1NBX0ludDMyKXBDLT5taW5pbXVtQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgLyogV2UgbmVlZCB0byBnZXQgbW9yZSBQQ00gZGF0YSAqLwotICAgICAgICBpZiAocEMtPmJOb0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLSAgICAgICAgfQotICAgICAgICBpZihwQy0+Ymp1bXBmbGFnKQotICAgICAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXBcCi0gICAgICAgICAgICAgICAgICAgIChwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLCAmdGltZSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEp1bXAoYXVkaW8gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmJqdW1wZmxhZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKCJFIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0gICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBDLT5iTm9Mb29waW5nID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnVpRW5kTG9vcCA9MDsgLyogVmFsdWUgMCBtZWFucyBubyBsb29waW5nIGlzIHJlcXVpcmVkICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRGVjaWRlIHdoYXQgdG8gZG8gd2hlbiBhdWRpbyBpcyBvdmVyICovCi0gICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbSwgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEp1bXAoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSBlbmNvZGluZyBzdGF0ZSB0byByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbihwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6IHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2Vjb25kIHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byB0aGlyZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KCk6XAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU8gKDItPjMpIGEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb3B5IGRlY29kZWQgZGF0YSBpbnRvIFNTUkMgYnVmZmVyIGluICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wUG9zSW5Tc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLSAgICAgICAgLyogVXBkYXRlIHBvc2l0aW9uIHBvaW50ZXIgaW50byBTU1JDIGJ1ZmZlciBJbiAqLwotCi0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gKz0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIH0KLQotICAgIC8qIERvIHRoZSByZXNhbXBsaW5nIC8gY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZCAoPWZlZWQgYnVmZmVyIG91dCkgKi8KLSAgICBpZiggcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFICkKLSAgICB7Ci0gICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDA7Ci0gICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC0gcEMtPnBUZW1wQnVmZmVyCi0gICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpKHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgICAgICAgICAgKnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpCi0gICAgICAgICAgICAgICAgLyBwQy0+Q2hhbm5lbENvbnZlcnNpb24gKQotICAgICAgICAgICAgICAgIC8qIFdlIHVzZSBDaGFubmVsQ29udmVyc2lvbiB2YXJpYWJsZSBiZWNhdXNlIGluIGNhc2UgMiwgd2UgbmVlZCB0d2ljZSBsZXNzIGRhdGEgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3JjRXJyID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFBvc0luVGVtcEJ1ZmZlciwwLAotICAgICAgICAgICAgICAgICAgICAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgICAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0KilwQy0+cFBvc0luVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgKHNob3J0KilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgICAgICAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQ6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIHJldHVybmluZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzc3JjRXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyICs9IHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgU1NSQyBidWZmZXJJbiAqLwotICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiArIChwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPSBwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NyY0VyciA9IDA7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsMCwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMpKTsKLQotICAgICAgICAgICAgICAgIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KChzaG9ydCopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgIChzaG9ydCopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlcik7Ci0gICAgICAgICAgICAgICAgaWYoIDAgIT0gc3NyY0VyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0OiBTU1JDX1Byb2Nlc3MgcmV0dXJucyAweCV4LCByZXR1cm5pbmcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzcmNFcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3NyY0VycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBTU1JDIGJ1ZmZlckluICovCi0gICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wU3NyY0J1ZmZlckluICsgKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbnZlcnQgU3RlcmVvPC0+TW9ubyAqLwotICAgICAgICBzd2l0Y2goIHBDLT5DaGFubmVsQ29udmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDogLyogTm8gY2hhbm5lbCBjb252ZXJzaW9uICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTogLyogc3RlcmVvIHRvIG1vbm8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vXzE2KChzaG9ydCAqKXBDLT5wVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwVGVtcEJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBUZW1wQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgdWlOYkNoYW5uZWxzKTsgLyogQnVmZmVyIGlzIGluIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFRlbXBCdWZmZXIsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6IC8qIG1vbm8gdG8gc3RlcmVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1vbm9UbzJJXzE2KChzaG9ydCAqKXBDLT5wVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCl1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBUZW1wQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFRlbXBCdWZmZXIsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgIHsKLSAgICAgICAgLy9NNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgLy8gcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgLyBzaXplb2Yoc2hvcnQpIC8KLSAgICAgICAgLy8gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgLyogQ29udmVydCBTdGVyZW88LT5Nb25vICovCi0gICAgICAgIHN3aXRjaCggcEMtPkNoYW5uZWxDb252ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdGVyZW8gdG8gbW9ubyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcykpOwotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgcFRlbXBCdWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlckluCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgdWlOYkNoYW5uZWxzKTsgLyogQnVmZmVyIGlzIGluIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6IC8qIG1vbm8gdG8gc3RlcmVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1vbm9UbzJJXzE2KChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbgotICAgICAgICAgICAgICAgICAgICAgICAgKyAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPQotICAgICAgICAgICAgICAgICAgICAgICAgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gbm9yIHNhbXBsLiBmcmVxLiBjb252ZXJzaW9uIG5lZWRlZCwganVzdCBidWZmZXIgbWFuYWdlbWVudCAqLwotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wUG9zSW5Tc3JjQnVmZmVySW47Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIE00VlNTM0dQUF9nZXREZWNpYmVsU291bmQoIE00T1NBX1VJbnQzMiB2YWx1ZSApCi0gICAgewotICAgIGludCBkYlNvdW5kID0gMTsKLQotICAgIGlmKCB2YWx1ZSA9PSAwICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiggdmFsdWUgPiAweDQwMDAgJiYgdmFsdWUgPD0gMHg4MDAwICkgICAgICAvLyAzMjc2OAotICAgICAgICBkYlNvdW5kID0gOTA7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MjAwMCAmJiB2YWx1ZSA8PSAweDQwMDAgKSAvLyAxNjM4NAotICAgICAgICBkYlNvdW5kID0gODQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MTAwMCAmJiB2YWx1ZSA8PSAweDIwMDAgKSAvLyA4MTkyCi0gICAgICAgIGRiU291bmQgPSA3ODsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwODAwICYmIHZhbHVlIDw9IDB4MTAwMCApIC8vIDQwMjgKLSAgICAgICAgZGJTb3VuZCA9IDcyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDA0MDAgJiYgdmFsdWUgPD0gMHgwODAwICkgLy8gMjA0OAotICAgICAgICBkYlNvdW5kID0gNjY7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDIwMCAmJiB2YWx1ZSA8PSAweDA0MDAgKSAvLyAxMDI0Ci0gICAgICAgIGRiU291bmQgPSA2MDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMTAwICYmIHZhbHVlIDw9IDB4MDIwMCApIC8vIDUxMgotICAgICAgICBkYlNvdW5kID0gNTQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDA4MCAmJiB2YWx1ZSA8PSAweDAxMDAgKSAvLyAyNTYKLSAgICAgICAgZGJTb3VuZCA9IDQ4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwNDAgJiYgdmFsdWUgPD0gMHgwMDgwICkgLy8gMTI4Ci0gICAgICAgIGRiU291bmQgPSA0MjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDIwICYmIHZhbHVlIDw9IDB4MDA0MCApIC8vIDY0Ci0gICAgICAgIGRiU291bmQgPSAzNjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDEwICYmIHZhbHVlIDw9IDB4MDAyMCApIC8vIDMyCi0gICAgICAgIGRiU291bmQgPSAzMDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDA4ICYmIHZhbHVlIDw9IDB4MDAxMCApIC8vMTYKLSAgICAgICAgZGJTb3VuZCA9IDI0OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDcgJiYgdmFsdWUgPD0gMHgwMDA4ICkgLy84Ci0gICAgICAgIGRiU291bmQgPSAyNDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDAzICYmIHZhbHVlIDw9IDB4MDAwNyApIC8vIDQKLSAgICAgICAgZGJTb3VuZCA9IDE4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDEgJiYgdmFsdWUgPD0gMHgwMDAzICkgLy8yCi0gICAgICAgIGRiU291bmQgPSAxMjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDAgJiYgdmFsdWUgPD0gMHgwMDAxICkgIC8vIDEKLSAgICAgICAgZGJTb3VuZCA9IDY7Ci0KLSAgICBlbHNlCi0gICAgICAgIGRiU291bmQgPSAwOwotCi0gICAgcmV0dXJuIGRiU291bmQ7Ci0gICAgfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgTWl4IHRoZSBjdXJyZW50IGF1ZGlvIEFVcyAoZGVjb2RlciwgbWl4LCBlbmNvZGUpCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGExOwotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTI7Ci0gICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZTsKLQotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jSW5CdWZmZXI7ICAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY091dEJ1ZmZlcjsgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00T1NBX1RpbWUKLSAgICAgICAgZnJhbWVUaW1lRGVsdGE7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotICAgIE00T1NBX01lbUFkZHI4IHRlbXBQb3NCdWZmZXI7Ci0gICAgLyogZHVja2luZyB2YXJpYWJsZSAqLwotICAgIE00T1NBX1VJbnQxNiBsb29wSW5kZXggPSAwOwotICAgIE00T1NBX0ludDE2ICpwUENNMTZTYW1wbGUgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIHBlYWtEYlZhbHVlID0gMDsKLSAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0RiVmFsdWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgb3JpZ2luYWwgYXVkaW8gdHJhY2sgQVUgKi8KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKG9yaWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwCi0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KHBDKTsKLQotICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzogTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBQQ01kYXRhMiA9IChNNE9TQV9JbnQxNiAqKXBDLT5wU3NyY0J1ZmZlck91dDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlIGFkZGVkIGF1ZGlvIHRyYWNrIEFVICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJvdGggY2xpcHMgZGVjb2RlZCB0aGUgc2FtZSBhbW91bnQgb2YgUENNIHNhbXBsZXMgKi8KLSAgICAgICAgaWYoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgICAgICAhPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICAgICAgYm90aCBjbGlwcyBBVSBtdXN0IGhhdmUgdGhlIHNhbWUgZGVjb2RlZCBQQ00gc2l6ZSEiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERURfUENNX1NJWkVfSVNTVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcFBDTWRhdGEyID0gKE00T1NBX0ludDE2ICopcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICogTWl4IHRoZSB0d28gZGVjb2RlZCBQQ00gYXVkaW9zICovCi0gICAgcFBDTWRhdGExID0KLSAgICAgICAgKE00T1NBX0ludDE2ICopcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgIHVpUENNc2l6ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgIC8gMjsgLypidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KSovCi0KLSAgICBpZiggcEMtPmJfRHVja2luZ05lZWRlZWQgKQotICAgIHsKLSAgICAgICAgbG9vcEluZGV4ID0gMDsKLSAgICAgICAgcGVha0RiVmFsdWUgPSAwOwotICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLQotICAgICAgICBwUENNMTZTYW1wbGUgPSAoTTRPU0FfSW50MTYgKilwQy0+cElucHV0Q2xpcEN0eHQtPgotICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLQotICAgICAgICAvL0NhbGN1bGF0ZSB0aGUgcGVhayB2YWx1ZQotICAgICAgICAgd2hpbGUoIGxvb3BJbmRleAotICAgICAgICAgICAgIDwgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgIC8gc2l6ZW9mKE00T1NBX0ludDE2KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA+PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdCi0gICAgICAgICAgICAgICAgPyBwcmV2aW91c0RiVmFsdWUgOiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XQotICAgICAgICAgICAgICAgID8gcHJldmlvdXNEYlZhbHVlIDogLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9vcEluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+YXVkaW9Wb2x1bWVBcnJheVtwQy0+YXVkVm9sQXJySW5kZXhdID0KLSAgICAgICAgICAgIE00VlNTM0dQUF9nZXREZWNpYmVsU291bmQocGVha0RiVmFsdWUpOwotCi0gICAgICAgIC8qIFdJTkRPV19TSVpFIGlzIDEwIGJ5IGRlZmF1bHQgYW5kIGNoZWNrIGZvciB0aHJlc2hvbGQgaXMgZG9uZSBhZnRlciAxMCBjeWNsZXMgKi8KLSAgICAgICAgaWYoIHBDLT5hdWRWb2xBcnJJbmRleCA+PSBXSU5ET1dfU0laRSAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+YkRvRHVja2luZyA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2lzVGhyZXNob2xkQnJlYWNoZWQoKE00T1NBX0ludDMyICopJihwQy0+YXVkaW9Wb2x1bWVBcnJheSksCi0gICAgICAgICAgICAgICAgcEMtPmF1ZFZvbEFyckluZGV4LCBwQy0+SW5EdWNraW5nX3RocmVzaG9sZCk7Ci0KLSAgICAgICAgICAgIHBDLT5hdWRWb2xBcnJJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+YXVkVm9sQXJySW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICpCZWxvdyBsb2dpYyBjb250cm9scyB0aGUgbWl4aW5nIHdlaWdodGFnZSBmb3IgQmFja2dyb3VuZCBUcmFjayBhbmQgUHJpbWFyeSBUcmFjawotICAgICAgICAqZm9yIHRoZSBkdXJhdGlvbiBvZiB3aW5kb3cgdW5kZXIgYW5hbHlzaXMgdG8gZ2l2ZSBmYWRlLW91dCBmb3IgQmFja2dyb3VuZCBhbmQgZmFkZS1pbgotICAgICAgICAqZm9yIHByaW1hcnkKLSAgICAgICAgKgotICAgICAgICAqQ3VycmVudCBmYWRpbmcgZmFjdG9yIGlzIGRpc3RyaWJ1dGVkIGluIGVxdWFsIHJhbmdlIG92ZXIgdGhlIGRlZmluZWQgd2luZG93IHNpemUuCi0gICAgICAgICoKLSAgICAgICAgKkZvciBhIHdpbmRvdyBzaXplID0gMjUgKDUwMCBtcyAod2luZG93IHVuZGVyIGFuYWx5c2lzKSAvIDIwIG1zIChzYW1wbGUgZHVyYXRpb24pKQotICAgICAgICAqCi0gICAgICAgICovCi0KLSAgICAgICAgaWYoIHBDLT5iRG9EdWNraW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5kdWNraW5nRmFjdG9yCi0gICAgICAgICAgICAgICAgPiBwQy0+SW5EdWNraW5nX2xvd1ZvbHVtZSApIC8vIEZBREUgT1VUIEJHIFRyYWNrCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBpbiBmYWN0b3Igb2YgbG93IHZvbHVtZSBzdGVwcyB0byByZWFjaAotICAgICAgICAgICAgICAgICAgICAvLyBsb3cgdm9sdW1lIGxldmVsCi0gICAgICAgICAgICAgICAgcEMtPmR1Y2tpbmdGYWN0b3IgLT0gKHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciA9IHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5kdWNraW5nRmFjdG9yIDwgMS4wICkgLy8gRkFERSBJTiBCRyBUcmFjawotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBvZiBsb3cgdm9sdW1lIGZhY3RvciB0byByZWFjaAotICAgICAgICAgICAgICAgIC8vIG9yaWcudm9sdW1lIGxldmVsCi0gICAgICAgICAgICAgICAgcEMtPmR1Y2tpbmdGYWN0b3IgKz0gKHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmR1Y2tpbmdGYWN0b3IgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogZW5kaWYgLSBkdWNraW5nX2VuYWJsZSAqLwotCi0gICAgICAgIC8qIE1peGluZyBMb2dpYyAqLwotCi0gICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9JbnQzMiB0ZW1wOwotCi0gICAgICAgICAgIC8qIHNldCB2b2wgZmFjdG9yIGZvciBCVCBhbmQgUFQgKi8KLSAgICAgICAgICAgICpwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTIgKiBwQy0+ZkJUVm9sTGV2ZWwpOwotCi0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGExICogcEMtPmZQVFZvbExldmVsKTsKLQotICAgICAgICAgICAgLyogbWl4IHRoZSB0d28gc2FtcGxlcyAqLwotCi0gICAgICAgICAgICAqcFBDTWRhdGEyID0gKE00T1NBX0ludDE2KSgoICpwUENNZGF0YTIpICogKHBDLT5kdWNraW5nRmFjdG9yKSk7Ci0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGEyIC8gMiArICpwUENNZGF0YTEgLyAyKTsKLQotCi0gICAgICAgICAgICBpZiggKnBQQ01kYXRhMSA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSAtKCAqcFBDTWRhdGExKQotICAgICAgICAgICAgICAgICAgICAqIDI7IC8vIGJyaW5nIHRvIHNhbWUgQW1wbGl0dWRlIGxldmVsIGFzIGl0IHdhcyBvcmlnaW5hbAotCi0gICAgICAgICAgICAgICAgaWYoIHRlbXAgPiAzMjc2NyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gLTMyNzY2OyAvLyBsZXNzIHRoZW4gbWF4IGFsbG93ZWQgdmFsdWUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNikoLXRlbXApOwotICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9ICggKnBQQ01kYXRhMSkKLSAgICAgICAgICAgICAgICAqIDI7IC8vIGJyaW5nIHRvIHNhbWUgQW1wbGl0dWRlIGxldmVsIGFzIGl0IHdhcyBvcmlnaW5hbAotCi0gICAgICAgICAgICBpZiggdGVtcCA+IDMyNzY4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gMzI3Njc7IC8vIGxlc3MgdGhhbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICAgICBwUENNZGF0YTIrKzsKLSAgICAgICAgICAgIHBQQ01kYXRhMSsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKQotICAgICAgIHsKLSAgICAgICAgLyogbWl4IHRoZSB0d28gc2FtcGxlcyAqLwotICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBQQ01kYXRhMSAqIHBDLT5mT3JpZ0ZhY3RvciAqIHBDLT5mUFRWb2xMZXZlbAotICAgICAgICAgICAgICAgKyAqcFBDTWRhdGEyICogcEMtPmZBZGRlZEZhY3RvciAqIHBDLT5mQlRWb2xMZXZlbCApOwotCi0gICAgICAgICAgICBwUENNZGF0YTErKzsKLSAgICAgICAgICAgIHBQQ01kYXRhMisrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIHBDLT5wU3NyY0J1ZmZlck91dCBidWZmZXIgKi8KLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iX1NTUkNuZWVkZWQgfHwgcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICArIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVyT3V0LCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtPQotICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgewotICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4KLSAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICB9Ci0KLSAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KSAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgIE00T1NBX1RSQUNFMl8wKCJLICoqKiogYmxlbmQgQVVzIik7Ci0KLSAgICAvKioKLSAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcChwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygpOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPQotICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgIE00T1NBX1RSQUNFMl8yKCJMIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZXdjLmRBVG8gKz0gZnJhbWVUaW1lRGVsdGEgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIERlY29kZS9lbmNvZGUgYSBmZXcgQVUgYmFja3dhcmQgdG8gaW5pdGlhdGUgdGhlIGVuY29kZXIgZm9yIGxhdGVyIE1peCBzZWdtZW50LgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jSW5CdWZmZXI7ICAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY091dEJ1ZmZlcjsgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00T1NBX1RpbWUKLSAgICAgICAgZnJhbWVUaW1lRGVsdGEgPSAwOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLQotICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgLyoqCi0gICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAqIGFkZCBhIHNpbGVuY2UgZnJhbWUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24oKTpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaUN1cnJlbnRDdHMgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgLyogRG8gbm90IGRvIHByZS1lbmNvZGUgc3RlcCBpZiB0aGVyZSBpcyBubyBtaXhpbmcgKHJlbW92ZSwgMTAwICUsIG9yIG5vdCBlZGl0YWJsZSkgKi8KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEFkdmFuY2UgaW4gdGhlIG9yaWdpbmFsIGF1ZGlvIHN0cmVhbSB0byByZWFjaCB0aGUgY3VycmVudCB0aW1lCi0gICAgICAgICogKFdlIGRvbid0IHdhbnQgaUF1ZGlvQ1RTIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZSBqdW1wIGZ1bmN0aW9uLAotICAgICAgICAqIHNvIHdlIGhhdmUgdG8gdXNlIGEgbG9jYWwgdmFyaWFibGUpLiAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wSW5wdXRDbGlwQ3R4dCwgJmlDdXJyZW50Q3RzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKio8IGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4uLiAqLwotICAgICAgICBpZiggaUN1cnJlbnRDdHMgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgaVRhcmdldEN0cyA9IGlDdXJyZW50Q3RzIC0gTTRWU1MzR1BQX05CX0FVX1BSRUZFVENICi0gICAgICAgICAgICAgICAgKiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgaWYoIGlUYXJnZXRDdHMgPCAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gMDsgLyoqPCBTYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQy0+cElucHV0Q2xpcEN0eHQsICZpVGFyZ2V0Q3RzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNvZGUvZW5jb2RlIHVwIHRvIHRoZSB3YW50ZWQgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIHdoaWxlKCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiTSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUFvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgLyBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYikgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJOICoqKiogcHJlLWVuY29kZSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogU2V0IEFVIGN0cyBhbmQgc2l6ZSAqLwotICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbCi0gICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJPIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEluY3JlbWVudCB0aGUgYXVkaW8gQ1RTIGZvciB0aGUgbmV4dCBzdGVwICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zIEVuY1BhcmFtczsKLQotICAgIC8qKgotICAgICogU2ltdWxhdGUgYSB3cml0ZXIgaW50ZXJmYWNlIHdpdGggb3VyIHNwZWNpZmljIGZ1bmN0aW9uICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBQcm9jZXNzQVUgPQotICAgICAgICBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpdCBmb2xsb3cgdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFN0YXJ0QVUgPQotICAgICAgICBNNFZTUzNHUFBfaW50U3RhcnRBVTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGlzIFZTUyAzR1BQIHNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wV3JpdGVyQ29udGV4dCA9Ci0gICAgICAgIChNNFdSSVRFUl9Db250ZXh0KQotICAgICAgICBwQzsgLyoqPCBXZSBnaXZlIHRoZSBpbnRlcm5hbCBjb250ZXh0IGFzIHdyaXRlciBjb250ZXh0ICovCi0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZW5jb2RlciBpbnRlcmZhY2UsIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBzZXRDdXJyZW50RW5jb2RlciByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBWU1Mgc2V0dGluZ3MgKi8KLQotICAgIC8qIENvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPmV3Yy51aVZpZGVvV2lkdGg7Ci0gICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPmV3Yy51aVZpZGVvSGVpZ2h0OwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgRW5jUGFyYW1zLnZpZGVvTGV2ZWwgPSBwQy0+ZXdjLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAvKiBObyBzdHJpY3QgcmVndWxhdGlvbiBpbiB2aWRlbyBlZGl0b3IgKi8KLSAgICAvKiBCZWNhdXNlIG9mIHRoZSBlZmZlY3RzIGFuZCB0cmFuc2l0aW9ucyB3ZSBzaG91bGQgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSAqLwotICAgIC8qIEFsc28gaXQgcHJldmVudHMgdG8gZHJvcCBpbXBvcnRhbnQgZnJhbWVzCi0gICAgICAod2l0aCBhIGJhZCByZXN1bHQgb24gc2hlZHVsaW5nIGFuZCBibG9jayBlZmZldGNzKSAqLwotICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTOwotCi0gICAgLyoqCi0gICAgKiBPdGhlciBlbmNvZGVyIHNldHRpbmdzIChkZWZhdWx0cykgKi8KLSAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOyAgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9IDA7ICAgICAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiA9IE00T1NBX1RSVUU7ICAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICBFbmNQYXJhbXMudWlTdGFydGluZ1F1YW50aXplclZhbHVlID0gMTA7ICAgLyogaW5pdGlhbCBRUCA9IDEwICovCi0gICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLSAgICBzd2l0Y2goIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjM7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSA4OwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogTTRTWVNfSDI2NCIpOwotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tIMjY0OwotCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlTdGFydGluZ1F1YW50aXplclZhbHVlID0gMTA7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsgLyogZGVmYXVsdCAqLwotCi0gICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogVW5rbm93biB2aWRlb1N0cmVhbVR5cGUgMHgleCIsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgRW5jUGFyYW1zLkJpdHJhdGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RJbml0Iik7Ci0gICAgLyoqCi0gICAgKiBJbml0IHRoZSB2aWRlbyBlbmNvZGVyIChhZHZhbmNlZCBzZXR0aW5ncyB2ZXJzaW9uIG9mIHRoZSBlbmNvZGVyIE9wZW4gZnVuY3Rpb24pICovCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcEMtPmV3Yy5wRW5jQ29udGV4dCwKLSAgICAgICAgJnBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZSwgTTRWU1MzR1BQX2ludFZQUCwgcEMsCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJLAotICAgICAgICBwQy0+U2hlbGxBUEkucEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RPcGVuIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoInZzczogYXVkaW8gbWl4IGVuY29kZXIgb3BlbiBwcm9maWxlIDolZCwgbGV2ZWwgJWQiLAotICAgICAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlLCBFbmNQYXJhbXMudmlkZW9MZXZlbCk7Ci0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RTdGFydCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBEZXN0cm95IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIGlmKCBNNFZTUzNHUFBfa0VuY29kZXJSdW5uaW5nID09IHBDLT5ld2MuZW5jb2RlclN0YXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIYXMgdGhlIGVuY29kZXIgYWN0dWFsbHkgYmVlbiBvcGVuZWQ/IERvbid0IGNsb3NlIGl0IGlmIHRoYXQncyBub3QgdGhlIGNhc2UuICovCi0gICAgICAgIGlmKCBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkID09IHBDLT5ld2MuZW5jb2RlclN0YXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhbnVwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tOb0VuY29kZXI7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlc2V0IHZhcmlhYmxlICovCi0gICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcjogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0Jvb2wgTTRWU1MzR1BQX2lzVGhyZXNob2xkQnJlYWNoZWQoIE00T1NBX0ludDMyICphdmVyYWdlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlICkKLXsKLSAgICBNNE9TQV9Cb29sIHJlc3VsdCA9IDA7Ci0gICAgaW50IGk7Ci0gICAgaW50IGZpbmFsVmFsdWUgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBzdG9yZUNvdW50OyBpKysgKQotICAgICAgICBmaW5hbFZhbHVlICs9IGF2ZXJhZ2VWYWx1ZVtpXTsKLQotICAgIGZpbmFsVmFsdWUgPSBmaW5hbFZhbHVlIC8gc3RvcmVDb3VudDsKLQotCi0gICAgaWYoIGZpbmFsVmFsdWUgPiB0aHJlc2hvbGRWYWx1ZSApCi0gICAgICAgIHJlc3VsdCA9IE00T1NBX1RSVUU7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBNNE9TQV9GQUxTRTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwNjEyZjMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0NsaXAuYwotICogQGJyaWVmICAgIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyByZWxhdGVkIHRvIGlucHV0IGNsaXAgbWFuYWdlbWVudC4KLSAqIEBub3RlICAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBzdGF0aWMsIGkuZS4gbm9uIHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogICAgT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotCi0vKioKLSAqICAgIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0KLS8qKgotICogQ29tbW9uIGhlYWRlcnMgKGZvciBhYWMpICovCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLS8qIE9zYWwgaGVhZGVyIGZpbGVubyAqLwotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZGVmaW5lICAgIFN0YXRpYyBmdW5jdGlvbiBwcm90b3R5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXMoCi0gICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCkKLSAqIEBicmllZiAgICBPcGVuIGEgY2xpcC4gQ3JlYXRlcyBhIGNsaXAgY29udGV4dC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBoQ2xpcEN0eHQgICAgICAgICAgICAoT1VUKSBSZXR1cm4gdGhlIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBFZGl0IHNldHRpbmdzIG9mIHRoaXMgY2xpcC4gVGhlIG1vZHVsZSB3aWxsIGtlZXAgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoaXMgcG9pbnRlcgotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgYlNraXBBdWRpb1RyYWNrICAgICAgICAoSU4pIElmIHRydWUsIGRvIG5vdCBvcGVuIHRoZSBhdWRpbwotICogQHBhcmFtICAgIGJGYXN0T3Blbk1vZGUgICAgICAgIChJTikgSWYgdHJ1ZSwgdXNlIHRoZSBmYXN0IG1vZGUgb2YgdGhlIDNncHAgcmVhZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9ubHkgdGhlIGZpcnN0IEFVIGlzIHJlYWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEluaXQoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKiBoQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0ICkKLXsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGhDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSW5pdDogaENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVSZWFkUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgKmhDbGlwQ3R4dCA9Ci0gICAgICAgIChNNFZTUzNHUFBfQ2xpcENvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9DbGlwQ29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0NsaXBDb250ZXh0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSAqaENsaXBDdHh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSW5pdCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRWU1MzR1BQX0NsaXBDb250ZXh0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcEluaXQoKTogY2xpcEN0eHQ9MHgleCIsICpoQ2xpcEN0eHQpOwotCi0KLSAgICAvKioKLSAgICAqIFVzZSB0aGlzIHNob3J0Y3V0IHRvIHNpbXBsaWZ5IHRoZSBjb2RlICovCi0gICAgcENsaXBDdHh0ID0gKmhDbGlwQ3R4dDsKLQotICAgIC8qIEluaWFsaXphdGlvbiBvZiBjb250ZXh0IFZhcmlhYmxlcyAqLwotICAgIG1lbXNldCgodm9pZCAqKXBDbGlwQ3R4dCwgMCxzaXplb2YoTTRWU1MzR1BQX0NsaXBDb250ZXh0KSk7Ci0KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIGNsaXAgY29udGV4dCAqLwotICAgIHBDbGlwQ3R4dC0+aVZvZmZzZXQgPSAwOwotICAgIHBDbGlwQ3R4dC0+aUFvZmZzZXQgPSAwOwotICAgIHBDbGlwQ3R4dC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIHBDbGlwQ3R4dC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotCi0gICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPlZpZGVvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5pVmlkZW9SZW5kZXJDdHMgPSAwOwotICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5pQWN0dWFsVmlkZW9CZWdpbkN1dCA9IDA7Ci0gICAgcENsaXBDdHh0LT5pQWN0dWFsQXVkaW9CZWdpbkN1dCA9IDA7Ci0gICAgcENsaXBDdHh0LT5iVmlkZW9BdUF2YWlsYWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwQ3R4dC0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IDA7Ci0gICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIHBDbGlwQ3R4dC0+cEZpbGVSZWFkUHRyRmN0ID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2ICAgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLQotICAgIC8qCi0gICAgKiBSZXNldCBwb2ludGVycyBmb3IgbWVkaWEgYW5kIGNvZGVjcyBpbnRlcmZhY2VzICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qCi0gICAgKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIG1hcHMgdGhlIGZyZXF1ZW5jeSB2YWx1ZSB0byBhIHN0cmluZy4KLXN0YXRpYyBjb25zdCBjaGFyKiBmcmVxVG9TdHJpbmcoaW50IGZyZXEpIHsKLSAgICBzd2l0Y2ggKGZyZXEpIHsKLSAgICBjYXNlIDgwMDA6Ci0gICAgICAgIHJldHVybiAiXzgwMDAiOwotICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgIHJldHVybiAiXzExMDI1IjsKLSAgICBjYXNlIDEyMDAwOgotICAgICAgICByZXR1cm4gIl8xMjAwMCI7Ci0gICAgY2FzZSAxNjAwMDoKLSAgICAgICAgcmV0dXJuICJfMTYwMDAiOwotICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIHJldHVybiAiXzIyMDUwIjsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgICByZXR1cm4gIl8yNDAwMCI7Ci0gICAgY2FzZSAzMjAwMDoKLSAgICAgICAgcmV0dXJuICJfMzIwMDAiOwotICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIHJldHVybiAiXzQ0MTAwIjsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgICByZXR1cm4gIl80ODAwMCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIlVuc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGU6ICVkIEh6IiwgZnJlcSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLy8gVGhpcyBtZXRob2QgbWFwcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWwgdmFsdWUgdG8KLS8vIGEgc3RyaW5nIHRoYXQgd2lsbCBiZSBwYXJ0IG9mIGEgZmlsZSBuYW1lIGV4dGVuc2lvbgotc3RhdGljIGNvbnN0IGNoYXIqIGNoYW5uZWxUb1N0cmluZ0FuZEZpbGVFeHQoaW50IGNoYW5uZWxzKSB7Ci0gICAgc3dpdGNoIChjaGFubmVscykgewotICAgIGNhc2UgMToKLSAgICAgICAgcmV0dXJuICJfMS5wY20iOwotICAgIGNhc2UgMjoKLSAgICAgICAgcmV0dXJuICJfMi5wY20iOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJVbnN1cHBvcnRlZCAlZCBjaGFubmVscyIsIGNoYW5uZWxzKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vKiBOb3RlOiBpZiB0aGUgY2xpcCBpcyBvcGVuZWQgaW4gZmFzdCBtb2RlLCBpdCBjYW4gb25seSBiZSB1c2VkIGZvciBhbmFseXNpcyBhbmQgbm90aGluZyBlbHNlLiAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwT3BlbiggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsIE00T1NBX0Jvb2wgYlNraXBBdWRpb1RyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJGYXN0T3Blbk1vZGUsIE00T1NBX0Jvb2wgYkF2b2lkT3BlbmluZ1ZpZGVvRGVjICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00UkVBREVSX01lZGlhRmFtaWx5IG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIgIGR1bW15U3RyZWFtSGFuZGxlcjsKLSAgICBNNE9TQV9JbnQzMiBpRHVyYXRpb247Ci0gICAgTTRPU0FfVm9pZCAqZGVjb2RlclVzZXJEYXRhOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIGR1bW15OwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgdmlkZW9TaXplRnJvbURTSTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIgRmlsdGVyT3B0aW9uOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogY2FsbGVkIHdpdGggcENsaXBDdHh0OiAweCV4LCBiQXZvaWRPcGVuaW5nVmlkZW9EZWM9MHgleCIsCi0gICAgICAgIHBDbGlwQ3R4dCwgYkF2b2lkT3BlbmluZ1ZpZGVvRGVjKTsKLSAgICAvKioKLSAgICAqIEtlZXAgYSBwb2ludGVyIHRvIHRoZSBjbGlwIHNldHRpbmdzLiBSZW1lbWJlciB0aGF0IHdlIGRvbid0IHBvc3Nlc3MgaXQhICovCi0gICAgcENsaXBDdHh0LT5wU2V0dGluZ3MgPSBwQ2xpcFNldHRpbmdzOwotICAgIGlmKE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogSW1hZ2Ugc3RyZWFtOyBzZXQgY3VycmVudCB2aWQgZGVjIik7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+U2hlbGxBUEksIE00REFfU3RyZWFtVHlwZVZpZGVvQVJHQjg4ODgpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICBkZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RDcmVhdGUoCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgJmR1bW15U3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLAotICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQsCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVLAotICAgICAgICAgICAgICAgICAgZGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFwKLSAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBcCi0gICAgICAgICAgICBWaWQgZGVjIHN0YXJ0ZWQ7IHBWaURlY0N0eHQ9MHgleCIsIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCk7Ci0KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGNvcnJlY3QgcmVhZGVyIGludGVyZmFjZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCZwQ2xpcEN0eHQtPlNoZWxsQVBJLAotICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBJbml0IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0Q3JlYXRlKCZwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAodXNlZCBieSB0aGUgZGVjb2RlciB0byBrbm93IHRoZSByZWFkZXIpICovCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgT1NBTCByZWFkIGZ1bmN0aW9uIHNldCAqLwotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pKHBDbGlwQ3R4dC0+cEZpbGVSZWFkUHRyRmN0KSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBmYXN0IG9wZW4gbW9kZSBpZiBhc2tlZCAoM0dQUCBvbmx5KSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gYkZhc3RPcGVuTW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSwgTTRPU0FfTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKEZhc3RPcGVuTW9kZSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSBza2lwIGF1ZGlvIG9wdGlvbiBpZiBhc2tlZCAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBiU2tpcEF1ZGlvVHJhY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9WaWRlb09ubHksIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKFZpZGVvT25seSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTSkgewotICAgICAgICAvLyBDb21wb3NlIHRoZSB0ZW1wIGZpbGVuYW1lIHdpdGggc2FtcGxlIHJhdGUgYW5kIGNoYW5uZWwgaW5mb3JtYXRpb24uCi0gICAgICAgIGNvbnN0IGNoYXIqIGZyZXFTdHIgPSBmcmVxVG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgICAgICBpZiAoZnJlcVN0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgY2hhciogY2hhblN0ciA9IGNoYW5uZWxUb1N0cmluZ0FuZEZpbGVFeHQoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotCi0gICAgICAgIGlmIChjaGFuU3RyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGxvY2F0ZSBvbmUgYnl0ZSBtb3JlIHRvIGhvbGQgdGhlIG51bGwgdGVybWluYXRvcgotICAgICAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0KLSAgICAgICAgICAgIHN0cmxlbihwQ2xpcFNldHRpbmdzLT5wRmlsZSkgKyBzdHJsZW4oZnJlcVN0cikgKyBzdHJsZW4oY2hhblN0cikgKyAxOwotCi0gICAgICAgIGNoYXIqIHBUZW1wRmlsZSA9IChjaGFyICopIG1hbGxvYyhsZW5ndGgpOwotICAgICAgICBpZiAocFRlbXBGaWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbWFsbG9jICVkIGJ5dGVzIGZhaWwiLGxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtc2V0KHBUZW1wRmlsZSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgbWVtY3B5KHBUZW1wRmlsZSwgcENsaXBTZXR0aW5ncy0+cEZpbGUsIHN0cmxlbihwQ2xpcFNldHRpbmdzLT5wRmlsZSkpOwotICAgICAgICBzdHJuY2F0KHBUZW1wRmlsZSwgZnJlcVN0ciwgc3RybGVuKGZyZXFTdHIpKTsKLSAgICAgICAgc3RybmNhdChwVGVtcEZpbGUsIGNoYW5TdHIsIHN0cmxlbihjaGFuU3RyKSk7Ci0KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdE9wZW4oIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsIHBUZW1wRmlsZSk7Ci0gICAgICAgIGlmIChwVGVtcEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZShwVGVtcEZpbGUpOwotICAgICAgICAgICAgcFRlbXBGaWxlID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBvcGVuIHBjbSBmaWxlIHJldHVybnMgZXJyb3IgOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAvKioKLSAgICAgICAgKiBPcGVuIHRoZSAzR1BQL01QMyBjbGlwIGZpbGUgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdE9wZW4oIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUpOwotICAgIH0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpRHVtbXksIHVpQ29yZUlkOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIGVycm9yIGlzIGZyb20gdGhlIGNvcmUgcmVhZGVyLCB3ZSBjaGFuZ2UgaXQgdG8gYSBwdWJsaWMgVlNTM0dQUCBlcnJvciAqLwotICAgICAgICBNNE9TQV9FUlJfU1BMSVQoZXJyLCB1aUR1bW15LCB1aUNvcmVJZCwgdWlEdW1teSk7Ci0KLSAgICAgICAgaWYoIE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfM0dQUF9GSUxFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zICovCi0gICAgd2hpbGUoIGVyciA9PSBNNE5PX0VSUk9SICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0U3RyZWFtKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgJm1lZGlhRmFtaWx5LCAmcFN0cmVhbUhhbmRsZXIpOwotCi0gICAgICAgIC8qaW4gY2FzZSB3ZSBmb3VuZCBhIEJJRlMgc3RyZWFtIG9yIHNvbWV0aGluZyBlbHNlLi4uKi8KLSAgICAgICAgaWYoICggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFKSkKLSAgICAgICAgICAgIHx8IChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRXQVJfVE9PX01VQ0hfU1RSRUFNUykpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCBhIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICAgICAgaWYoICggbWVkaWFGYW1pbHkgPT0gTTRSRUFERVJfa01lZGlhRmFtaWx5VmlkZW8pCi0gICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYSBIMjYzIG9yIE1QRUctNCBvciBIMjY0IHZpZGVvIHN0cmVhbSBpbiBpbnB1dCAzZ3BwIGNsaXA7ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIgKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RSZXNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0UmVzZXQodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLyoqPCBOb3QgSDI2MyBvciBNUEVHLTQgKEgyNjQsIGV0Yy4pICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTU19lZGl0Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAgY2xpcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGVsc2UgaWYoICggbWVkaWFGYW1pbHkgPT0gTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW8pCi0gICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb01wMwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb1BjbQotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYW4gQU1SLU5CIG9yIEFBQyBvciBNUDMgYXVkaW8gc3RyZWFtIGluIGlucHV0IGNsaXA7ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9BdWRpb1N0cmVhbUhhbmRsZXIgKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RSZXNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0UmVzZXQoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLyoqPCBOb3QgQU1SLU5CIG9yIEFBQyAoQU1SLVdCLi4uKSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYW4gdW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtICgweCV4KSBpbiBpbnB1dCAzZ3BwL21wMyBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCBWaWRlbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgLyogSWYgZXh0ZXJuYWwgZGVjb2RlcnMgYXJlIHBvc3NpYmxlLCBpdCdzIGJlc3QgdG8gYXZvaWQgb3BlbmluZyB0aGUgZGVjb2RlciBpZiB0aGUgY2xpcCBpcyBvbmx5Ci0gIGdvaW5nIHRvIGJlIHVzZWQgZm9yIGFuYWx5c2lzLCBhcyB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGZvciB0aGUgYW5hbHlzaXMgaW4gdGhlIGNhc2Ugb2YgYQotICBwb3NzaWJsZSBleHRlcm5hbCBkZWNvZGVyIGFueXdheSwgYW5kIGVpdGhlciB0aGVyZSBjb3VsZCBiZSBubyBkZWNvZGVyIGF0IHRoaXMgcG9pbnQgb3IgdGhlIEhXCi0gIGRlY29kZXIgY291bGQgYmUgcHJlc2VudCwgd2hpY2ggd2Ugd2FudCB0byBhdm9pZCBvcGVuaW5nIGZvciB0aGF0LiBTZWUgY29tbWVudHMgaW4KLSAgaW50QnVpbGRBbmFseXNpcyBmb3IgbW9yZSBkZXRhaWxzLiAqLwotCi0gIC8qIENIQU5HRU1FIFRlbXBvcmFyaWx5IG9ubHkgZG8gdGhpcyBmb3IgTVBFRzQsIHNpbmNlIGZvciBub3cgb25seSBNUEVHNCBleHRlcm5hbCBkZWNvZGVycyBhcmUKLSAgc3VwcG9ydGVkLCBhbmQgdGhlIGZvbGxvd2luZyB3b3VsZG4ndCB3b3JrIGZvciBIMjYzIHNvIGEgcmVsZWFzZSB3aGVyZSBleHRlcm5hbCBkZWNvZGVycyBhcmUKLSAgcG9zc2libGUsIGJ1dCBub3QgdXNlZCwgd291bGRuJ3Qgd29yayB3aXRoIEgyNjMgc3R1ZmYuICovCi0KLSAgICAgICAgaWYoIGJBdm9pZE9wZW5pbmdWaWRlb0RlYyAmJiBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0Ci0gICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogT29wcyEgVGhlIG1lcmUgYWN0IG9mIG9wZW5pbmcgdGhlIGRlY29kZXIgYWxzbyByZXN1bHRzIGluIHRoZSBpbWFnZSBzaXplIGJlaW5nCi0gICAgICAgICAgICBmaWxsZWQgaW4gdGhlIHZpZGVvIHN0cmVhbSEgQ29tcGVuc2F0ZSBmb3IgdGhpcyBieSB1c2luZyBQYXJzZVZpZGVvRFNJIHRvIGZpbGwKLSAgICAgICAgICAgIHRoaXMgaW5mby4gKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IE1wZWc0IHN0cmVhbTsgdmlkIGRlYyBub3Qgc3RhcnRlZCIpOwotICAgICAgICAgICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJmR1bW15LCAmdmlkZW9TaXplRnJvbURTSSk7Ci0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGggPSB2aWRlb1NpemVGcm9tRFNJLm1fdWlXaWR0aDsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICB2aWRlb1NpemVGcm9tRFNJLm1fdWlIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBNcDQvSDI2My9IMjY0IHN0cmVhbTsgc2V0IGN1cnJlbnQgdmlkIGRlYyIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhOwotCi0jZWxzZQotCi0gICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXIsCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQsCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+VmlkZW9BVSwgZGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgaWYoICggKChNNE9TQV9VSW50MzIpTTRFUlJfREVDT0RFUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCkgPT0gZXJyKQotICAgICAgICAgICAgICAgIHx8ICgoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FKSA9PSBlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIE91ciBkZWNvZGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggSDI2MyBwcm9maWxlIG90aGVyIHRoYW4gMC4KLSAgICAgICAgICAgICAgICAqIFNvIGl0IHJldHVybnMgdGhpcyBpbnRlcm5hbCBlcnJvciBjb2RlLgotICAgICAgICAgICAgICAgICogV2UgdHJhbnNsYXRlIGl0IHRvIG91ciBvd24gZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBtX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBWaWQgZGVjIHN0YXJ0ZWQ7IHBWaURlY0N0eHQ9MHgleCIsCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLQotICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyRnVuY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSAmTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjA7Ci0gICAgICAgICAgICAgICAgRmlsdGVyT3B0aW9uLm1fcEZpbHRlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJkZpbHRlck9wdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBtX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBtX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyIE9LIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgQXVkaW8gZGVjb2RlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcihwQ2xpcEN0eHQpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogQXVkaW8gZGVjIHN0YXJ0ZWQ7IGNvbnRleHQ9MHgleCIsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zdHJlYW1JRCA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX0NUUyA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX0RUUyA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2F0dHJpYnV0ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX21heHNpemUgPSAwOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zdHJ1Y3RTaXplID0gc2l6ZW9mKHBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSAqLwotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgKQotICAgIHsKLSAgICAgICAgLyogSWYgYWxyZWFkeSBjYWxjdWxhdGVkIHNldCBpdCB0byBwcmV2aW91cyB2YWx1ZSAqLwotICAgICAgICAvKiBCZWNhdXNlIGZhc3Qgb3BlbiBhbmQgZnVsbCBvcGVuIGNhbiByZXR1cm4gYSBkaWZmZXJlbnQgdmFsdWUsCi0gICAgICAgICAgIGl0IGNhbiBtaXNtYXRjaCB1c2VyIHNldHRpbmdzICovCi0gICAgICAgIC8qIFZpZGVvIHRyYWNrIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gYXVkaW8gdHJhY2sgKGlmIHZpZGVvIHRyYWNrIGlzIHNob3J0ZXIgdGhhbgotICAgICAgICAgICBhdWRpbyB0cmFjaywgaXQgY2FuIGxlZCB0byBjdXQgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQpICovCi0gICAgICAgIGlEdXJhdGlvbiA9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotCi0gICAgICAgIGlmKCBpRHVyYXRpb24gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBFbHNlIGNvbXB1dGUgaXQgZnJvbSBzdHJlYW1zICovCi0gICAgICAgIGlEdXJhdGlvbiA9IDA7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBpRHVyYXRpb24gPSAoTTRPU0FfSW50MzIpKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pICYmICgoTTRPU0FfSW50MzIpKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pCi0gICAgICAgICAgICA+IGlEdXJhdGlvbikgJiYgaUR1cmF0aW9uID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpRHVyYXRpb24gPSAoTTRPU0FfSW50MzIpKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIHRpbWUgaXMgbm90IHVzZWQsIHdlIHNldCBpdCB0byB0aGUgdmlkZW8gdHJhY2sgZHVyYXRpb24gKi8KLSAgICBpZiggMCA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWUgPSAoTTRPU0FfVUludDMyKWlEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPmlFbmRUaW1lID0gKE00T1NBX0ludDMyKXBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCkKLSAqIEBicmllZiAgICBEZWxldGUgdGhlIGF1ZGlvIHRyYWNrLiBDbGlwIHdpbGwgYmUgbGlrZSBpZiBpdCBoYWQgbm8gYXVkaW8gdHJhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIC8qKgotICAgICogQnV0IHdlIGRvbid0IGhhdmUgdG8gZnJlZSB0aGUgYXVkaW8gc3RyZWFtLiBJdCB3aWxsIGJlIGZyZWVkIGJ5IHRoZSByZWFkZXIgd2hlbiBjbG9zaW5nIGl0Ki8KLSAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFdlIHdpbGwgcmV0dXJuIGEgY29uc3RhbnQgc2lsZW5jZSBBTVIgQVUuCi0gICAgKiBXZSBzZXQgaXQgaGVyZSBvbmNlLCBpbnN0ZWFkIG9mIGF0IGVhY2ggcmVhZCBhdWRpbyBzdGVwLiAqLwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSBwQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgZGVjb2RlZCBhdWRpbyBidWZmZXIgKGl0IG5lZWRzIHRvIGJlIHJlLWFsbG9jYXRlZCB0byBzdG9yZSBzaWxlbmNlCi0gICAgICBmcmFtZSBldmVudHVhbGx5KSovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3VycmVudFRpbWUoKQotICogQGJyaWVmICAgIEp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBhbmQgZGVjb2RlIHVwIHRvIHRoZSBjdXJyZW50IHZpZGVvIHRpbWUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgaUN0cyAgICAgICAgKElOKSBUYXJnZXQgQ1RTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaUN0cyApCi17Ci0gICAgTTRPU0FfSW50MzIgaVJhcEN0cywgaUNsaXBDdHM7Ci0gICAgTTRfTWVkaWFUaW1lIGREZWNvZGVUaW1lOwotICAgIE00T1NBX0Jvb2wgYkNsaXBKdW1wID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcCBiYXNlICovCi0gICAgaUNsaXBDdHMgPSBpQ3RzIC0gcENsaXBDdHh0LT5pVm9mZnNldDsKLQotICAgIC8qKgotICAgICogSWYgd2Ugd2VyZSByZWFkaW5nIHRoZSBjbGlwLCB3ZSBtdXN0IGp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUAotICAgICogdG8gZGVjb2RlIGZyb20gdGhhdCBwb2ludC4gKi8KLSAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgPT0gcENsaXBDdHh0LT5Wc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFRoZSBkZWNvZGVyIG11c3QgYmUgdG9sZCB0byBqdW1wICovCi0gICAgICAgIGJDbGlwSnVtcCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVtZW1iZXIgdGhlIGNsaXAgcmVhZGluZyBzdGF0ZSAqLwotICAgICAgICBwQ2xpcEN0eHQtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgd2UgYXJlIGluIGRlY29kZVVwVG8oKSBwcm9jZXNzLCBjaGVjayBpZiB3ZSBuZWVkIHRvIGRvCi0gICAgb25lIG1vcmUgc3RlcCBvciBpZiBkZWNvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDbGlwQ3R4dC0+VnN0YXR1cyApCi0gICAgewotICAgICAgICAvKiBEbyBhIHN0ZXAgb2YgNTAwIG1zIGRlY29kaW5nICovCi0gICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzICs9IDUwMDsKLQotICAgICAgICBpZiggcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPiBpQ2xpcEN0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRhcmdldCB0aW1lIHJlYWNoZWQsIHdlIHN3aXRjaCBiYWNrIHRvIERFQ09ERSBtb2RlICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA9IGlDbGlwQ3RzOwotICAgICAgICAgICAgcENsaXBDdHh0LT5Wc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERTsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJjICwsLCwgZGVjb2RlIHVwIHRvIDogJWxkIiwgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBKdXN0IGRlY29kZSBhdCBjdXJyZW50IGNsaXAgY3RzICovCi0gICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoImQgLCwsLCBkZWNvZGUgdXAgdG8gOiAlbGQiLCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgdXAgdG8gdGhlIHRhcmdldCAqLwotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHM6IERlY29kaW5nIHVwVG8gQ1RTICUuM2YsIHBDbGlwQ3R4dD0weCV4IiwKLSAgICAgICAgZERlY29kZVRpbWUsIHBDbGlwQ3R4dCk7Ci0KLSAgICBkRGVjb2RlVGltZSA9IChNNE9TQV9Eb3VibGUpcENsaXBDdHh0LT5pVmlkZW9EZWNDdHM7Ci0gICAgcENsaXBDdHh0LT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotICAgIGVyciA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAmZERlY29kZVRpbWUsIGJDbGlwSnVtcCwgMCk7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKQotICAgICAgICAmJiAoZXJyICE9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogbV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggZXJyID09IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgUmVhZCBvbmUgQVUgZnJhbWUgaW4gdGhlIGNsaXAKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gTk8gQVVESU8gLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgLyogSWYgdGhlcmUgaXMgbm8gYXVkaW8gdHJhY2ssIHdlIHJldHVybiBzaWxlbmNlIEFVcyAqLwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSBwQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiYiAjIyMjIGJsYW5rIHRyYWNrIik7Ci0gICAgfQotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gQU1SLU5CLCBFVlJDIC0tLS0tLS0tLS0gKi8KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBlbHNlIGlmKCAoIE00VklERU9FRElUSU5HX2tBTVJfTkIKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tFVlJDCi0gICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpICkKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE5vIEFVIGF2YWlsYWJsZSwgc28gd2UgbXVzdCBtdXN0IHJlYWQgb25lIGZyb20gdGhlIG9yaWdpbmFsIHRyYWNrIHJlYWRlciAqLwotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZXQgdGhlIGN1cnJlbnQgQU1SIGZyYW1lIHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlYWQgQVUgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgQU1SIGZyYW1lIENUUyAqLwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICAgICAqIHBDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gKyAwLjUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikgJiYgKE00VklERU9FRElUSU5HX2tBTVJfTkIKLSAgICAgICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJZiB0aGVyZSBpcyBsZXNzIGF1ZGlvIHRoYW4gdGhlIHN0cmVhbSBkdXJhdGlvbiBpbmRpY2F0ZWQsCi0gICAgICAgICAgICAgICAgKiB3ZSByZXR1cm4gc2lsZW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKz0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiYSAjIyMjIHNpbGVuY2UgQVUiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggTTRXQVJfTk9fTU9SRV9BVSAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUgKHNpbGVuY2UpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qKjwgZmF0YWwgZXJyb3IgKG9yIG5vIHNpbGVuY2UgaW4gRVZSQykgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktQU1SOiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBiQXVkaW9GcmFtZUF2YWlsYWJsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogR28gdG8gdGhlIG5leHQgQU1SIGZyYW1lIGluIHRoZSBBVSAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciArPSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBJbmNyZW1lbnQgQ1RTOiBvbmUgQU1SIGZyYW1lIGlzIDIwIG1zIGxvbmcgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKz0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIHBvaW50ZWQgQU1SIGZyYW1lICovCi0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KU00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMCA9PSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IEFVIGZyYW1lIHNpemUgPT0gMCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FNUl9BVSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA+IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IEFVIGZyYW1lIHNpemUgZ3JlYXRlciB0aGFuIEFVIHNpemUhLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQU1SX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBpZiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IEFVIGhhcyBiZWVuIHJlYWNoZWQgb3Igbm90ICovCi0gICAgICAgIGlmKCAoIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgKyBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUpCi0gICAgICAgICAgICA8IChwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyArIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcENsaXBDdHh0LT5iQXVkaW9GcmFtZUF2YWlsYWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsgLyoqPCB3aWxsIGJlIHVzZWQgZm9yIG5leHQgY2FsbCAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gQUFDIC0tLS0tLS0tLS0gKi8KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBlbHNlIGlmKCAoIE00VklERU9FRElUSU5HX2tBQUMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tBQUNwbHVzCi0gICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgIHx8IChNNFZJREVPRURJVElOR19rZUFBQ3BsdXMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemU7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX0NUUyAqIHBDbGlwQ3R4dC0+c2NhbGVfYXVkaW8KLSAgICAgICAgICAgICAgICArIDAuNSk7Ci0KLSAgICAgICAgICAgIC8qIFBhdGNoIGJlY2F1c2UgbV9DVFMgaXMgdW5mb3J0dW5hdGVseSByb3VuZGVkIGluIDNncCByZWFkZXIgc2hlbGwgKi8KLSAgICAgICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9ICggKCBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIDIpCi0gICAgICAgICAgICAgICAgLyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikKLSAgICAgICAgICAgICAgICAqIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIElmIHRoZXJlIGlzIGxlc3MgYXVkaW8gdGhhbiB0aGUgc3RyZWFtIGR1cmF0aW9uIGluZGljYXRlZCwKLSAgICAgICAgICAgICogd2UgcmV0dXJuIHNpbGVuY2UgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSBwQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKz0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJhICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUmV0dXJuIHdpdGggTTRXQVJfTk9fTU9SRV9BVSAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktQUFDOlwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAoc2lsZW5jZSkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyoqPCBmYXRhbCBlcnJvciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BQUM6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAvKiAtLS0tLS0tLS0tIE1QMywgb3RoZXJzIC0tLS0tLS0tLS0gKi8KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLU1QMzogbV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLSAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0gKE00T1NBX1VJbnQxNilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0KLSAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgKyAwLjUpOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBDcmVhdGVzIGFuZCBpbml0aWFsaXplIHRoZSBhdWRpbyBkZWNvZGVyIGZvciB0aGUgY2xpcC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00X1N0cmVhbVR5cGUgYXVkaW90eXBlOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgTTRfQUFDVHlwZSBpQWFjVHlwZSA9IDA7Ci0KLSNlbmRpZgotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHByb3BlciBhdWRpbyBkZWNvZGVyICovCi0KLSAgICBhdWRpb3R5cGUgPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlOwotCi0gICAgLy9FVlJDCi0gICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICAhPSBhdWRpb3R5cGUgKSAvKiBkZWNvZGVyIG5vdCBzdXBwb3J0ZWQgeWV0LCBidXQgYWxsb3cgdG8gZG8gbnVsbCBlbmNvZGluZyAqLwotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyKCZwQ2xpcEN0eHQtPlNoZWxsQVBJLCBhdWRpb3R5cGUpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBDcmVhdGVzIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKCk6IEZhaWxzIHRvIGluaXRpYXRlIHRoZSBhdWRpbyBkZWNvZGVyLiIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDbGlwQ3R4dC0+U2hlbGxBUEkuYkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtICE9IGF1ZGlvdHlwZSkgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWNcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgIENyZWF0aW5nIGV4dGVybmFsIGF1ZGlvIGRlY29kZXIgb2YgdHlwZSAweCV4IiwgYXVkaW90eXBlKTsKLSAgICAgICAgICAgIC8qIEV4dGVybmFsIE9NWCBjb2RlY3MgYXJlIHVzZWQqLwotICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IGF1ZGlvdHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBBQUMgcHJvcGVydGllcyovCi0gICAgICAgICAgICAgICAgICAgIC8qZ2V0IGZyb20gUmVhZGVyOyB0ZW1wb3JhcnksIHRpbGwgQXVkaW8gZGVjb2RlciBzaGVsbCBBUEkKLSAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gZ2V0IHRoZSBBQUMgcHJvcGVydGllcyovCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00QURfa09wdGlvbklEX1N0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmlBYWNUeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjIHJldHVybnMgZXJyIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaUFhY1R5cGUgPSBNNF9rQUFDOyAvL3NldCB0byBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjIHJldHVybnMgc3RyZWFtVHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBpQWFjVHlwZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOiBBQUMgTkJDaGFucz0lZCwgU2FtcGxGcmVxPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNlbHNlCi0gICAgICAgIC8qIFRyaWNrLCBJIHVzZSBwVXNlckRhdGEgdG8gcmV0cmlldmUgYWFjIHByb3BlcnRpZXMsCi0gICAgICAgICAgIHdhaXRpbmcgZm9yIHNvbWUgYmV0dGVyIGltcGxlbWVudGF0aW9uLi4uICovCi0KLSAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IGF1ZGlvdHlwZSApCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICYocENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgTTRPU0FfTlVMTCAvKiB0byBiZSBjaGFuZ2VkIHdpdGggSFcgaW50ZXJmYWNlcyAqLyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgfQotCi0gICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCA9PSBhdWRpb3R5cGUgKSB7Ci0gICAgICAgIC8qIEFNUiBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYyA9PSBhdWRpb3R5cGUgKSB7Ci0gICAgICAgIC8qIEVWUkMgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogbm90aGluZyBzcGVjaWZpYyB0byBkbyAqLwotICAgIH0KLSAgICBlbHNlIGlmKCBNNERBX1N0cmVhbVR5cGVBdWRpb01wMyA9PSBhdWRpb3R5cGUgKSB7Ci0gICAgICAgIC8qIE1QMyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IGF1ZGlvdHlwZSApCi0gICAgewotICAgICAgICAvKiBBQUMgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogRGVjb2RlIGhpZ2ggcXVhbGl0eSBhYWMgYnV0IGRpc2FibGUgUFMgYW5kIFNCUiAqLwotICAgICAgICAvKiBCZWNhdXNlIHdlIGhhdmUgdG8gbWl4IGRpZmZlcmVudCBraW5kIG9mIEFBQyBzbyB3ZSBtdXN0IHRha2UgdGhlIGxvd2VzdCBjYXBhYmlsaXR5ICovCi0gICAgICAgIC8qIEluIE1DUyBpdCB3YXMgbm90IG5lZWRlZCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIHN0cmVhbSAqLwotICAgICAgICBNNF9BYWNEZWNvZGVyQ29uZmlnIEFhY0RlY1BhcmFtOwotCi0gICAgICAgIEFhY0RlY1BhcmFtLm1fQUFDRGVjb2RlclByb2ZpbGUgPSBBQUNfa0FBQzsKLSAgICAgICAgQWFjRGVjUGFyYW0ubV9Eb3duU2FtcGxpbmdNb2RlID0gQUFDX2tEU19PRkY7Ci0KLSAgICAgICAgaWYoIE00RU5DT0RFUl9rTW9ubyA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgQWFjRGVjUGFyYW0ubV9PdXRwdXRNb2RlID0gQUFDX2tNb25vOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQWFjRGVjUGFyYW0ubV9PdXRwdXRNb2RlID0gQUFDX2tTdGVyZW87Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9Vc2VyUGFyYW0sIChNNE9TQV9EYXRhT3B0aW9uKSAmQWFjRGVjUGFyYW0pOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyApIHsKLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UsCi0gICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQpOwotCi0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyApCi0gICAgewotICAgICAgICAvKiBOb3QgaW1wbGVtZW50ZWQgaW4gYWxsIGRlY29kZXJzICovCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVTYW1wbGVTaXplCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgICogc2l6ZW9mKE00T1NBX0ludDE2KSwKLSAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJBdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKTpcCi0gICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgQXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgRGVjb2RlIHRoZSBjdXJyZW50IEFVRElPIGZyYW1lLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogU2lsZW5jZSBtb2RlICovCi0gICAgaWYoIHBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gKE00T1NBX1VJbnQ4ICopcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciApCi0gICAgewotICAgICAgICBpZiggcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9JbnQxNiksCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJBdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoKTpcCi0gICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaWxsIGl0IHdpdGggMCAoPSBwY20gc2lsZW5jZSkgKi8KLSAgICAgICAgbWVtc2V0KHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywwLAotICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICogc2l6ZW9mKE00T1NBX0ludDE2KSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjgpIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHI7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUgID0gcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICh2b2lkICopcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MsIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemU7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotICAgIC8qKgotICAgICogU3RhbmRhcmQgZGVjb2RpbmcgbW9kZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIERlY29kZSBjdXJyZW50IEFNUiBmcmFtZSAqLwotICAgICAgICBpZiAoIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2RhdGFBZGRyZXNzID0KLSAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cjsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX3RpbWVTdGFtcFVzID0KLSAgICAgICAgICAgICAoaW50NjRfdCkgKHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKiAxMDAwTEwpOwotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKAotICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLCAmcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dCwKLSAgICAgICAgICAgICBNNE9TQV9GQUxTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBQYXNzIE51bGwgaW5wdXQgYnVmZmVyCi0gICAgICAgICAgICAvLyBSZWFkZXIgaW52b2tlZCBmcm9tIEF1ZGlvIGRlY29kZXIgc291cmNlCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKAotICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICBNNE9TQV9OVUxMLCAmcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dCwKLSAgICAgICAgICAgICBNNE9TQV9GQUxTRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCkKLSAqIEBicmllZiAgICBKdW1wIGluIHRoZSBhdWRpbyB0cmFjayBvZiB0aGUgY2xpcC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgcEp1bXBDdHMgICAgICAgICAgICAoSU4vT1VUKSBpbjp0YXJnZXQgQ1RTLCBvdXQ6IHJlYWNoZWQgQ1RTCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBKdW1wQ3RzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHM7Ci0gICAgTTRPU0FfSW50MzIgaUp1bXBDdHNNczsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0OiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwSnVtcEN0cyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IHBKdW1wQ3RzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlUYXJnZXRDdHMgPSAqcEp1bXBDdHM7Ci0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIGF1ZGlvIHN0cmVhbSwgd2Ugc2ltdWxhdGUgYSBqdW1wIGF0IHRoZSB0YXJnZXQganVtcCBDVFMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiB0aGUgdGFyZ2V0IENUUyB3aWxsIGJlIHJlYWNoZWQgYXQgbmV4dCBSZWFkRnJhbWUgY2FsbCAodGh1cyB0aGUgLTIwKSAqLwotICAgICAgICAqcEp1bXBDdHMgPSBpVGFyZ2V0Q3RzIC0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAvKiAoY3RzIGlzIG5vdCBhbiBpbnRlZ2VyIHdpdGggZnJlcXVlbmN5IDI0IGtIeiBmb3IgZXhhbXBsZSkgKi8KLSAgICAgICAgKnBKdW1wQ3RzID0gKCAoICpwSnVtcEN0cyArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgIC8gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pCi0gICAgICAgICAgICAqIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0KLSAgICAgICAgICAgICoKLSAgICAgICAgICAgIHBKdW1wQ3RzOyAvKiBzaW11bGF0ZSBhIHJlYWQgYXQganVtcCBwb3NpdGlvbiBmb3IgbGF0ZXIgc2lsZW5jZSBBVXMgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfSW50MzIgY3VycmVudF90aW1lID0gMDsKLSAgICAgICAgTTRPU0FfSW50MzIgbG9vcF9jb3VudGVyID0gMDsKLQotICAgICAgICBpZiggKE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzCi0gICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKCAoIGxvb3BfY291bnRlciA8IE00VlNTM0dQUF9NUDNfSlVNUEVEX0FVX05VTUJFUl9NQVgpCi0gICAgICAgICAgICAgICAgJiYgKGN1cnJlbnRfdGltZSA8IGlUYXJnZXRDdHMpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0OiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjdXJyZW50X3RpbWUgPSAoTTRPU0FfSW50MzIpcENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTOwotICAgICAgICAgICAgICAgIGxvb3BfY291bnRlcisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlIGN1cnJlbnQgQVUgaXMgc3RvcmVkICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgKnBKdW1wQ3RzID0gcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBKdW1wIGluIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGlKdW1wQ3RzTXMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKnBKdW1wQ3RzIC8gcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmaUp1bXBDdHNNcyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCk6IG1fcEZjdEp1bXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpwSnVtcEN0cyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShpSnVtcEN0c01zICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgIC8qIFBhdGNoIGJlY2F1c2UgbV9DVFMgaXMgdW5mb3J0dW5hdGVseSByb3VuZGVkIGluIDNncCByZWFkZXIgc2hlbGwgKi8KLSAgICAgICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAgICAgKnBKdW1wQ3RzID0gKCAoICpwSnVtcEN0cyArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgICAgICAvIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gMDsgLyogTm8gZnJhbWUgcmVhZCB5ZXQgKi8KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFRvIGRldGVjdCBzb21lIG1heS1iZSBidWdzLCBJIHByZWZlciB0byByZXNldCBhbGwgdGhlc2UgYWZ0ZXIgYSBqdW1wICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluIEFNUiwgd2UgaGF2ZSB0byBtYW5hZ2UgbXVsdGktZnJhbWVkIEFVcywKLSAgICAgICAgICAgIGJ1dCBhbHNvIGluIEFBQyB0aGUganVtcCBjYW4gYmUgMSBBVSB0b28gbXVjaCBiYWNrd2FyZCAqLwotICAgICAgICAgICAgaWYoICpwSnVtcEN0cyA8IGlUYXJnZXRDdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSnVtcCBkb2Vzbid0IHJlYWQgYW55IEFVLCB3ZSBtdXN0IHJlYWQgYXQgbGVhc3Qgb25lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZWFkIEFVIGZyYW1lcyBhcyBsb25nIGFzIHdlIHJlYWNoIHRoZSBBVSBiZWZvcmUgdGhlIHRhcmdldCBDVFMKLSAgICAgICAgICAgICAgICAqIChzbyB0aGUgdGFyZ2V0IHdpbGwgYmUgcmVhY2hlZCB3aGVuIHRoZSB1c2VyIGNhbGwgUmVhZE5leHRBdWRpb0ZyYW1lKS4gKi8KLSAgICAgICAgICAgICAgICB3aGlsZSggcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChpVGFyZ2V0Q3RzIC0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHRoZSBDVFMgdGhhdCB3aWxsIGJlIHJlYWNoZWQgYXQgbmV4dCBSZWFkRnJhbWUgKi8KLSAgICAgICAgICAgICAgICAqcEp1bXBDdHMgPSBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZSgpCi0gKiBAYnJpZWYgICAgQ2xvc2UgYSBjbGlwLiBEZXN0cm95IHRoZSBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2U6IHBDbGlwQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHZpZGVvIGRlY29kZXIgY29udGV4dCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCApCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVzdHJveSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBhdWRpbyBkZWNvZGVyIGNvbnRleHQgICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3REZXN0cm95QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgZGVjb2RlZCBhdWRpbyBidWZmZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQXVkaW8gQVUgaXMgYWxsb2NhdGVkIGJ5IHJlYWRlci4KLSAgICAqIElmIG5vIGF1ZGlvIHRyYWNrLCBhdWRpbyBBVSBpcyBzZXQgYXQgJ3NpbGVudCcgKFNJRCkgYnkgVlNTLgotICAgICogQXMgYSBjb25zZXF1ZW5jZSwgaWYgYXVkaW8gQVUgaXMgc2V0IHRvICdzaWxlbnQnIChzdGF0aWMpCi0gICAgaXQgY2FuJ3QgYmUgZnJlZSB1bmxlc3MgaXQgaXMgc2V0IHRvIE5VTEwgKi8KLSAgICBpZiggKCAoTTRPU0FfTWVtQWRkcjgpTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OAotICAgICAgICA9PSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcykKLSAgICAgICAgfHwgKChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhCi0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKSApCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDbG9zZSB0aGUgM0dQUCBvciBNUDMgcmVhZGVyICovCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCk6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgM0dQUCBvciBNUDMgcmVhZGVyIGNvbnRleHQgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbG9zZSgpOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKEN0eHQ9MHgleCk6IHJldHVybmluZyBNNE5PX0VSUk9SIiwKLSAgICAgICAgcENsaXBDdHh0KTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SLCBlcnIyOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcDogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgY29udGV4dCAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3REZXN0cm95QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgZGVjb2RlZCBhdWRpbyBidWZmZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQXVkaW8gQVUgaXMgYWxsb2NhdGVkIGJ5IHJlYWRlci4KLSAgICAqIElmIG5vIGF1ZGlvIHRyYWNrLCBhdWRpbyBBVSBpcyBzZXQgYXQgJ3NpbGVudCcgKFNJRCkgYnkgVlNTLgotICAgICogQXMgYSBjb25zZXF1ZW5jZSwgaWYgYXVkaW8gQVUgaXMgc2V0IHRvICdzaWxlbnQnIChzdGF0aWMpCi0gICAgaXQgY2FuJ3QgYmUgZnJlZSB1bmxlc3MgaXQgaXMgc2V0IHRvIE5VTEwgKi8KLSAgICBpZiggKCAoTTRPU0FfTWVtQWRkcjgpTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OAotICAgICAgICA9PSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcykKLSAgICAgICAgfHwgKChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhCi0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKSApCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDbG9zZSB0aGUgM0dQUCBvciBNUDMgcmVhZGVyICovCi0gICAgICAgIGVycjIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpOiBtX3BSZWFkZXItPm1fcEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICBlcnIgPSBlcnIyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgM0dQUCBvciBNUDMgcmVhZGVyIGNvbnRleHQgKi8KLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoKTogbV9wUmVhZGVyLT5tX3BGY3REZXN0cm95IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICBlcnIgPSBlcnIyOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXYgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBpZihwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXA6IHBDbGlwQ3R4dD0weCV4IiwgcENsaXBDdHh0KTsKLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGNsaXAgY29udGV4dCAqLwotICAgIGZyZWUocENsaXBDdHh0KTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgQU1SIE5hcnJvdy1CYW5kIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEF1ZGlvRnJhbWUgICAoSU4pIEFNUk5CIGZyYW1lCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKCBNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSApCi17Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lVHlwZSA9ICggKCAqcEF1ZGlvRnJhbWUpICYoMHhGIDw8IDMpKSA+PiAzOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gOTU7Ci0gICAgICAgICAgICBicmVhazsgLyogIDQ3NTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTAzOwotICAgICAgICAgICAgYnJlYWs7IC8qICA1MTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDExODsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNTkwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMzQ7Ci0gICAgICAgICAgICBicmVhazsgLyogIDY3MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTQ4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3NDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE1OTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNzk1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyMDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTAyMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMjQ0OwotICAgICAgICAgICAgYnJlYWs7IC8qIDEyMDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDM5OwotICAgICAgICAgICAgYnJlYWs7IC8qIFNJRCAoU2lsZW5jZSkgKi8KLQotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiBObyBkYXRhICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKCk6IENvcnJ1cHRlZCBBTVIgZnJhbWUhIHJldHVybmluZyAwLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuICgxICsgKCggZnJhbWVTaXplICsgNykgLyA4KSk7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBFVlJDIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogICAgIDAgMSAyIDMKLSAqICAgICstKy0rLSstKwotICogICAgfGZyIHR5cGV8ICAgICAgICAgICAgICBSRkMgMzU1OAotICogICAgKy0rLSstKy0rCi0gKgotICogRnJhbWUgVHlwZTogNCBiaXRzCi0gKiAgICBUaGUgZnJhbWUgdHlwZSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgZGF0YQotICogICAgZnJhbWUgaW4gdGhlIFJUUCBwYWNrZXQuCi0gKgotICogRm9yIEVWUkMgYW5kIFNNViBjb2RlY3MsIHRoZSBmcmFtZSB0eXBlIHZhbHVlcyBhbmQgc2l6ZSBvZiB0aGUKLSAqIGFzc29jaWF0ZWQgY29kZWMgZGF0YSBmcmFtZSBhcmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdzoKLSAqCi0gKiBWYWx1ZSAgIFJhdGUgICAgICBUb3RhbCBjb2RlYyBkYXRhIGZyYW1lIHNpemUgKGluIG9jdGV0cykKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAwICAgICBCbGFuayAgICAgIDAgICAgKDAgYml0KQotICogICAxICAgICAxLzggICAgICAgIDIgICAgKDE2IGJpdHMpCi0gKiAgIDIgICAgIDEvNCAgICAgICAgNSAgICAoNDAgYml0czsgbm90IHZhbGlkIGZvciBFVlJDKQotICogICAzICAgICAxLzIgICAgICAgMTAgICAgKDgwIGJpdHMpCi0gKiAgIDQgICAgIDEgICAgICAgICAyMiAgICAoMTcxIGJpdHM7IDUgcGFkZGVkIGF0IGVuZCB3aXRoIHplcm9zKQotICogICA1ICAgICBFcmFzdXJlICAgIDAgICAgKFNIT1VMRCBOT1QgYmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGVyKQotICoKLSAqIEBwYXJhbSAgIHBDcEF1ZGlvRnJhbWUgICAoSU4pIEVWUkMgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAqcEF1ZGlvRnJhbWUpICYweDBGOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgYmxhbmsgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNjsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS84ICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gNDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvNCAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDgwOwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzIgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNzE7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEgKi8KLQotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBlcmFzdXJlICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoKTogQ29ycnVwdGVkIEVWUkMgZnJhbWUhIHJldHVybmluZyAwLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuICgxICsgKCggZnJhbWVTaXplICsgNykgLyA4KSk7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBRF9CdWZmZXIgb3V0cHV0QnVmZmVyOwotICAgIHVpbnQzMl90IG9wdGlvblZhbHVlID0wOwotCi0gICAgLy8gRGVjb2RlIGZpcnN0IGF1ZGlvIGZyYW1lIGZyb20gY2xpcCB0byBnZXQgcHJvcGVydGllcyBmcm9tIGNvZGVjCi0KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLCAmKHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcykpOwotCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSwKLSAgICAgKE00T1NBX0RhdGFPcHRpb24pIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0KTsKLQotICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICBpZiggcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMgIT0gTTRPU0FfTlVMTCApIHsKLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllczogXAotICAgICAgICAgICAgICAgICBtX3BGY3RTdGFydEF1ZGlvRGVjIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgPQotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlRnJhbWVMZW5ndGgKLSAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICBpZiggb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA+IDAgKSB7Ci0KLSAgICAgICAgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplIFwKLSAgICAgICAgICAgICpzaXplb2Yoc2hvcnQpLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIm91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyApIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNE9TQV9OVUxMLCAmb3V0cHV0QnVmZmVyLCBNNE9TQV9GQUxTRSk7Ci0KLSAgICBpZiAoIGVyciA9PSBNNFdBUl9JTkZPX0ZPUk1BVF9DSEFOR0UgKSB7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBwcm9wZXJ0aWVzIGZyb20gY29kZWMgbm9kZQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVscywgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0gb3B0aW9uVmFsdWU7Ci0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID0gb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeSwgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSA9IG9wdGlvblZhbHVlOwotICAgICAgICAvLyBSZXNldCBSZWFkZXIgc3RydWN0dXJlIHZhbHVlIGFsc28KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBvcHRpb25WYWx1ZTsKLQotICAgIH0gZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllczpcCi0gICAgICAgICAgICBtX3BGY3RTdGVwQXVkaW9EZWMgcmV0dXJucyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBmcmVlKG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzKTsKLQotICAgIC8vIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzXAotICAgICAgICAgICAgRXJyb3IgaW4gcmVzZXRpbmcgcmVhZGVyOiAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotCi19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwQW5hbHlzaXMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmM2ZDdhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jCi0gKiBAYnJpZWYgICAgSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYW5hbHlzaXMgb2YgaW5wdXQgY2xpcHMKLSAqIEBub3RlICAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBzdGF0aWMsIGkuZS4gbm9uIHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogICAgT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0KLQotLyoqCi0gKiAgICBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyogT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAvKiBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgYSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgM0dQUCBlZGl0aW5nCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZpbGxzIGEgQ2xpcEFuYWx5c2lzIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdHdvCi0gKiAgICAgICAgY2xpcHMgYXJlIGNvbXBhdGlibGUKLSAqIEBwYXJhbSAgICBwQ2xpcCAgICAgICAgICAgICAgICAoSU4pIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgM0dQUC9NUDMgY2xpcCBmaWxlLgotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHBhcmFtICAgIEZpbGVUeXBlICAgICAgICAgICAgKElOKSBUeXBlIG9mIHRoZSBpbnB1dCBmaWxlICguM2dwLCAuYW1yLCAubXAzKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoIE00T1NBX1ZvaWQgKnBDbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgRmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBDbGlwU2V0dGluZ3M7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAgY2FsbGVkIHdpdGggcENsaXA9MHgleCwgcENsaXBQcm9wZXJ0aWVzPTB4JXgiLAotICAgICAgICBwQ2xpcCwgcENsaXBQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogcENsaXAgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBwQ2xpcFByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBCdWlsZCBkdW1teSBjbGlwIHNldHRpbmdzLCBpbiBvcmRlciB0byB1c2UgdGhlIGVkaXRDbGlwT3BlbiBmdW5jdGlvbiAqLwotICAgIENsaXBTZXR0aW5ncy5wRmlsZSA9IHBDbGlwOwotICAgIENsaXBTZXR0aW5ncy5GaWxlVHlwZSA9IEZpbGVUeXBlOwotICAgIENsaXBTZXR0aW5ncy51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgQ2xpcFNldHRpbmdzLnVpRW5kQ3V0VGltZSA9IDA7Ci0KLSAgICAvKiBDbGlwIHByb3BlcnRpZXMgbm90IGJ1aWxkIHlldCwgc2V0IGF0IGxlYXN0IHRoaXMgZmxhZyAqLwotICAgIENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgY2xpcCBpbiBmYXN0IG9wZW4gbW9kZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdCgmcENsaXBDb250ZXh0LCBwRmlsZVJlYWRQdHJGY3QpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSW5pdCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBGcmVlIHRoZSBjbGlwICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDbGlwQ29udGV4dCwgJkNsaXBTZXR0aW5ncywgTTRPU0FfRkFMU0UsCi0gICAgICAgIE00T1NBX1RSVUUsIE00T1NBX1RSVUUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXBDb250ZXh0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBIZXJlIGl0IGlzIGJldHRlciB0byByZXR1cm4gdGhlIEVkaXRpbmcgc3BlY2lmaWMgZXJyb3IgY29kZSAqLwotICAgICAgICBpZiggKCAoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEKSA9PSBlcnIpCi0gICAgICAgICAgICB8fCAoKChNNE9TQV9VSW50MzIpTTRFUlJfREVDT0RFUl9IMjYzX05PVF9CQVNFTElORSkgPT0gZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbmFseXNlIHRoZSBjbGlwICovCi0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICE9IHBDbGlwQ29udGV4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhwQ2xpcENvbnRleHQsIHBDbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKHBDbGlwQ29udGV4dCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1NfaW50Q2xpcENsb3NlKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXBDb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgdGhlIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyBlZGl0aW5nICovCi0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICE9IENsaXBTZXR0aW5ncy5GaWxlVHlwZSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKHBDbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGZvcgotICogICAgICAgIFZTUyAzR1BQIGVkaXRpbmcgYXNzZW1ibHkgZmVhdHVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENsaXAxUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcENsaXAyUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBzZWNvbmQgY2xpcAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkcKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXAxUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcDJQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgdmlkZW9fZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgYXVkaW9fZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX0Jvb2wgYkNsaXAxSXNBQUMgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJDbGlwMklzQUFDID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5IGNhbGxlZCB3aXRoIHBDbGlwMUFuYWx5c2lzPTB4JXgsXAotICAgICAgICAgICAgICAgICAgIHBDbGlwMkFuYWx5c2lzPTB4JXgiLCBwQ2xpcDFQcm9wZXJ0aWVzLCBwQ2xpcDJQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwMVByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IHBDbGlwMVByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcDJQcm9wZXJ0aWVzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OiBwQ2xpcDJQcm9wZXJ0aWVzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCAoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gcENsaXAxUHJvcGVydGllcy0+RmlsZVR5cGUpCi0gICAgICAgIHx8IChNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SID09IHBDbGlwMVByb3BlcnRpZXMtPkZpbGVUeXBlKSApCi0gICAgewotICAgICAgICBpZiggcENsaXAxUHJvcGVydGllcyAhPSBwQ2xpcDJQcm9wZXJ0aWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogTVAzIENBTiBPTkxZIEJFIENVVCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBXZSBhcmUgaW4gVlNTIFNwbGl0dGVyIG1vZGUgKi8KLSAgICAgICAgICAgIGdvdG8gYXVkaW9fYW5hbHlzaXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKiBBdWRpbyAqKioqKioqKioqKiovCi0KLWF1ZGlvX2FuYWx5c2lzOgotICAgIGlmKCBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICE9IHBDbGlwMVByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBDbGlwMVByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICBiQ2xpcDFJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXAyUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXAyUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIGJDbGlwMklzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIGF1ZGlvLCB0aGUgY2xpcHMgYXJlIGNvbXBhdGlibGVzIC4uLiAqLwotICAgIGlmKCAoIHBDbGlwMVByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICAmJiAocENsaXAyUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICE9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8pICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJvdGggY2xpcHMgaGF2ZSBzYW1lIGF1ZGlvIHN0cmVhbSB0eXBlCi0gICAgICAgICogQW5kIGxldF9zIHNheSBBQUMsIEFBQysgYW5kIGVBQUMrIGFyZSBtaXhhYmxlICovCi0gICAgICAgIGlmKCAoIHBDbGlwMVByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgIT0gcENsaXAyUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlKQotICAgICAgICAgICAgJiYgKCggTTRPU0FfRkFMU0UgPT0gYkNsaXAxSXNBQUMpIHx8IChNNE9TQV9GQUxTRSA9PSBiQ2xpcDJJc0FBQykpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBBdWRpbyBTdHJlYW0gVHlwZSIpOwotCi0gICAgICAgICAgICBhdWRpb19lcnIgPSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgIGdvdG8gYW5hbHlzaXNfZG9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJvdGggY2xpcHMgaGF2ZSBzYW1lIG51bWJlciBvZiBjaGFubmVscyAqLwotICAgICAgICBpZiggcENsaXAxUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICE9IHBDbGlwMlByb3BlcnRpZXMtPnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgTmIgb2YgQ2hhbm5lbHMiKTsKLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBTYW1wbGluZyBGcmVxdWVuY3kiKTsKLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWTsKLSAgICAgICAgICAgIGdvdG8gYW5hbHlzaXNfZG9uZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDbGlwMlByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfVFJVRTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotYW5hbHlzaXNfZG9uZToKLSAgICBpZiggdmlkZW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gdmlkZW9fZXJyOwotCi0gICAgaWYoIGF1ZGlvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIGF1ZGlvX2VycjsKLQotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCkKLSAqIEBicmllZiAgICBHZXQgdmlkZW8gYW5kIGF1ZGlvIHByb3BlcnRpZXMgZnJvbSB0aGUgY2xpcCBzdHJlYW1zCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGZhdGFsIGVycm9ycyBvbmx5IChlcnJvcnMgdGhhdCBzaG91bGQgbm90IGhhcHBlbgotICogICAgICAgIGluIHRoZSBmaW5hbCBpbnRlZ3JhdGVkIHByb2R1Y3QpLgotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ2xpcFByb3BlcnRpZXMgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBEZWNDb25maWdJbmZvOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgZHVtbXlTaXplOwotICAgIE00REVDT0RFUl9BVkNQcm9maWxlTGV2ZWwgQVZDUHJvZmxlOwotCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQW5hbHlzZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9UaW1lU2NhbGUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+ZkF2ZXJhZ2VGcmFtZVJhdGUgPSAwLjA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9MZXZlbCA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRkYXRhUGFydGl0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRyZXN5bmNoTWFya2VyID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKikgJnBDbGlwUHJvcGVydGllcy0+ZnR5cCwwLAotICAgICAgICBzaXplb2YocENsaXBQcm9wZXJ0aWVzLT5mdHlwKSk7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIEFuYWx5c2lzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGggPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV92aWRlb1dpZHRoOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5mQXZlcmFnZUZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9hdmVyYWdlRnJhbWVSYXRlOwotCi0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QRUc0OwotCi0gICAvKiBUaGlzIGlzc3VlIGlzIHNvIGluY3JlZGlibHkgc3R1cGlkIHRoYXQgaXQncyBkZXByZXNzaW5nLiBCYXNpY2FsbHksIGEgZmlsZSBjYW4gYmUgYW5hbHlzZWQKLSAgIG91dHNpZGUgb2YgYW55IGNvbnRleHQgKGJlc2lkZXMgdGhhdCBvZiB0aGUgY2xpcCBpdHNlbGYpLCBzbyB0aGF0IGZvciBpbnN0YW5jZSB0d28gY2xpcHMgY2FuCi0gICBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5IGJlZm9yZSBhbGxvY2F0aW5nIGFuIGVkaXQgY29udGV4dCBmb3IgZWRpdGluZyB0aGVtLiBCdXQgdGhpcwotICAgbWVhbnMgdGhlcmUgaXMgbm8gd2F5IGluIGhlY2sgdG8gcGFzcyBhbiBleHRlcm5hbCB2aWRlbyBkZWNvZGVyICh0byBiZWdpbiB3aXRoKSB0byB0aGlzCi0gICBmdW5jdGlvbiwgYXMgdGhleSB3b3JrIGJ5IGJlaW5nIHJlZ2lzdGVyZWQgaW4gYW4gZXhpc3RpbmcgY29udGV4dDsgZnVydGhlcm1vcmUsIGl0IGlzIGFjdHVhbGx5Ci0gICBwcmV0dHkgb3ZlcmtpbGwgdG8gdXNlIGEgZnVsbCBkZWNvZGVyIGZvciB0aGF0LCBtb3Jlc28gYSBIQVJEV0FSRSBkZWNvZGVyIGp1c3QgdG8gZ2V0IHRoZQotICAgY2xpcCBjb25maWcgaW5mby4gSW4gZmFjdCwgdGhlIGhhcmR3YXJlIGl0c2VsZiBkb2Vzbid0IHByb3ZpZGUgdGhpcyBzZXJ2aWNlLCBpbiB0aGUgY2FzZSBvZiBhCi0gICBIVyBkZWNvZGVyLCB0aGUgc2hlbGwgYnVpbGRzIHRoZSBjb25maWcgaW5mbyBpdHNlbGYsIHNvIHdlIGRvbid0IG5lZWQgdGhlIGFjdHVhbCBkZWNvZGVyLCBvbmx5Ci0gICBhIGRldGFjaGVkIGZ1bmN0aW9uYWxpdHkgb2YgaXQuIFNvIGluIGNhc2UgSFcvZXh0ZXJuYWwgZGVjb2RlcnMgbWF5IGJlIHByZXNlbnQsIHdlIGluc3RlYWQgdXNlCi0gICBkaXJlY3RseSB0aGUgRFNJIHBhcnNpbmcgZnVuY3Rpb24gb2YgdGhlIHNoZWxsIEhXIGRlY29kZXIgKHdoaWNoIHdlIGtub3cgdG8gYmUgcHJlc2VudCwgc2luY2UKLSAgIEhXIGRlY29kZXJzIGFyZSBwb3NzaWJsZSkgdG8gZ2V0IHRoZSBjb25maWcgaW5mby4gTm90aWNlIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBldmVuIGlmIHRoZQotICAgc29mdHdhcmUgZGVjb2RlciBpcyBhY3R1YWxseSBwcmVzZW50IGFuZCBldmVuIGlmIGl0IHdpbGwgZW5kIHVwIGJlaW5nIGFjdHVhbGx5IHVzZWQ6IGZpZ3VyaW5nCi0gICBvdXQgdGhlIGNvbmZpZyBkb2VzIG5vdCBpbnZvbHZlIGFjdHVhbCBkZWNvZGluZyBub3IgdGhlIHBhcnRpY3VsYXJpdGllcyBvZiBhIHNwZWNpZmljIGRlY29kZXIsCi0gICBpdCdzIHRoZSBmYWN0IHRoYXQgaXQncyBNUEVHNCB0aGF0IG1hdHRlcnMsIHNvIGl0IHNob3VsZCBub3QgYmUgZnVuY3Rpb25hbGx5IGFueSBkaWZmZXJlbnQKLSAgIGZyb20gdGhlIHdheSBpdCB3YXMgZG9uZSBiZWZvcmUgKGFuZCBpdCdzIGxpZ2h0IGVub3VnaCBmb3IgcGVyZm9ybWFuY2Ugbm90IHRvIGJlIGFueSBwcm9ibGVtCi0gICAgICAgICB3aGF0c29ldmVyKS4gKi8KLQotICAgICAgICAgICAgICAgIGVyciA9IE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWNDb25maWdJbmZvLCAmZHVtbXlTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9UaW1lU2NhbGUgPQotICAgICAgICAgICAgICAgICAgICBEZWNDb25maWdJbmZvLnVpVGltZVNjYWxlOwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+Yk1QRUc0ZGF0YVBhcnRpdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8uYkRhdGFQYXJ0aXRpb247Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRydmxjID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby5iVXNlT2ZSVkxDOwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+Yk1QRUc0cmVzeW5jaE1hcmtlciA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8udWlVc2VPZlJlc3luY2hNYXJrZXI7Ci0gICAgICAgICAgICAgICAgZXJyID0gZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwoRGVjQ29uZmlnSW5mby51aVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0gyNjM7Ci0gICAgICAgICAgICAgICAgLyogSDI2MyB0aW1lIHNjYWxlIGlzIGFsd2F5cyAzMDAwMCAqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9IDMwMDAwOwotCi0gICAgICAgICAgICAgICAgZXJyID0gZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldEgyNjNQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRBVkNQcm9maWxlQW5kTGV2ZWwocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBVkNQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzOiB1bmtub3duIGlucHV0IHZpZGVvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAvKiogV2UgZG8gbm90IHJldHVybiBlcnJvciBoZXJlLgotICAgICAgICAgICAgICAgICAgICogIFRoZSB2aWRlbyBmb3JtYXQgY29tcGF0aWJpbGl0eSBjaGVjayB3aWxsIGJlIGRvbmUgbGF0dGVyICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcFZpZGVvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbjsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTWF4QXVTaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZTsKLQotICAgICAgICAvKiBpZiB2aWRlbyBiaXRyYXRlIG5vdCBhdmFpbGFibGUgcmV0cmlldmUgYW4gZXN0aW1hdGlvbiBvZiB0aGUgb3ZlcmFsbCBiaXRyYXRlICovCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotCi0gICAgICAgIGlmKCAwID09IHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLAotICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHdlIGdldCB0aGUgb3ZlcmFsbCBiaXRyYXRlLCBzdWJzdHJhY3QgdGhlIGF1ZGlvIGJpdHJhdGUgaWYgYW55ICovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSAtPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmVzZXQgYXVkaW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwQXVkaW9EdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aURlY29kZWRQY21TaXplID0gMDsKLQotICAgIC8qKgotICAgICogQXVkaW8gQW5hbHlzaXMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FNUl9OQjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tFVlJDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rUENNOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpczogdW5rbm93biBpbnB1dCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IhIiwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIE00Tk9fRVJST1I7IC8qKjwgV2UgZG8gbm90IHJldHVybiBlcnJvciBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXVkaW8gZm9ybWF0IGNvbXBhdGliaWxpdHkgY2hlY2sgd2lsbCBiZSBkb25lIGxhdHRlciAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvTWF4QXVTaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZTsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb247Ci0KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlEZWNvZGVkUGNtU2l6ZSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlRnJhbWVMZW5ndGgKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBCdWdmaXggUDRNRTAwMDAxMTI4OiBXaXRoIHNvbWUgSU1UQyBmaWxlcywgdGhlIEFNUiBiaXQgcmF0ZSBpcyAwIGticHMKLSAgICAgICAgYWNjb3JkaW5nIHRoZSBHZXRQcm9wZXJ0aWVzIGZ1bmN0aW9uICovCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotCi0gICAgICAgIGlmKCAwID09IHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0FNUl9OQiA9PSBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKkJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDEyLjIga2JwcyB2YWx1ZSB0aGFuIGEgc3VyZS10by1iZS1mYWxzZSAwIGticHMgdmFsdWUhKi8KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlID0gTTRWU1MzR1BQX0FNUl9ERUZBVUxUX0JJVFJBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRVZSQyA9PSBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKkJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDkuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlIDAga2JwcyB2YWx1ZSEqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVZSQ19ERUZBVUxUX0JJVFJBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdlIGdldCB0aGUgb3ZlcmFsbCBiaXRyYXRlLCBzdWJzdHJhY3QgdGhlIHZpZGVvIGJpdHJhdGUgaWYgYW55ICovCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgLT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBOZXcgYWFjIHByb3BlcnRpZXMgKi8KLSAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjCi0gICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgPSBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW47Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0KLSAgICAgICAgICAgIGlmKCBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogR2V0ICdmdHlwJyBhdG9tICovCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3gsICZwQ2xpcFByb3BlcnRpZXMtPmZ0eXApOwotCi0gICAgLyoqCi0gICAgKiBXZSB3cml0ZSB0aGUgVlNTIDNHUFAgdmVyc2lvbiBpbiB0aGUgY2xpcCBhbmFseXNpcyB0byBiZSBzdXJlIHRoZSBpbnRlZ3JhdG9yIGRvZXNuJ3QKLSAgICAqIG1peCBvbGRlciBhbmFseXNpcyByZXN1bHRzIHdpdGggbmV3ZXIgbGlicmFyaWVzICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzBdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUjsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMV0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SOwotICAgIHBDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXSA9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT047Ci0KLSAgICBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlOwotCi0gICAgaWYoIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbgotICAgICAgICA+IHBDbGlwUHJvcGVydGllcy0+dWlDbGlwQXVkaW9EdXJhdGlvbiApCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwRHVyYXRpb24gPSBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgZWxzZQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcER1cmF0aW9uID0gcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uOwotCi0gICAgLyogUmVzZXQgY29tcGF0aWJpbGl0eSBjaGFydCAqLwotICAgIHBDbGlwUHJvcGVydGllcy0+YlZpZGVvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YlZpZGVvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBBbmFseXNpcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQW5hbHlzZWQgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCkKLSAqIEBicmllZiAgICBDaGVjayBpZiB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWlOYk9mVmFsaWRTdHJlYW1zID0gMDsKLSAgICBNNE9TQV9FUlIgdmlkZW9fZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgYXVkaW9fZXJyID0gTTROT19FUlJPUjsKLSAgICAvKioqKioqKioqIGZpbGUgdHlwZSAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUiA9PSBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmc6XAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gcENsaXBQcm9wZXJ0aWVzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKioqKioqKiogVmlkZW8gKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lVmlkZW8KLSAgICAgICAgIT0gcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGEgdmlkZW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKiBDaGVjayB2aWRlbyBmb3JtYXQgaXMgTVBFRy00LCBIMjYzIG9yIEgyNjQgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgdWlOYk9mVmFsaWRTdHJlYW1zKys7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyo8IEtPLCB3ZSByZXR1cm4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogdW5zdXBwb3J0ZWQgdmlkZW8gZm9ybWF0Iik7Ci0gICAgICAgICAgICAgICAgdmlkZW9fZXJyID0gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQXVkaW8gb25seSBzdHJlYW0gYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBWU1MgZWRpdGluZyBmZWF0dXJlCi0gICAgICAgICh1bmxlc3MgaW4gdGhlIE1QMyBjYXNlKSAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IE5vIHZpZGVvIHN0cmVhbSBpbiBjbGlwIik7Ci0gICAgICAgIHZpZGVvX2VyciA9IE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBBdWRpbyAqKioqKioqKiovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXBQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBTVItTkIsIEVWUkMgb3IgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIHN3aXRjaCggcENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAvKjwgT0ssIHdlIHByb2NlZWQsIG5vIHJldHVybiAqLwotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKjwgS08sIHdlIHJldHVybiBlcnJvciAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiB1bnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKLSAgICAgICAgICAgICAgICBhdWRpb19lcnIgPSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNpbGVuY2UgaXMgYWx3YXlzIGVkaXRhYmxlICovCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdmFsaWQgc3RyZWFtIGluIHRoZSBmaWxlLi4uICovCi0gICAgaWYoIHZpZGVvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIHZpZGVvX2VycjsKLQotICAgIGlmKCBhdWRpb19lcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHJldHVybiBhdWRpb19lcnI7Ci0KLSAgICBpZiggMCA9PSB1aU5iT2ZWYWxpZFN0cmVhbXMgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiBGaWxlIGNvbnRhaW5zIG5vIHN1cHBvcnRlZCBzdHJlYW0sXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGZvcgotICogICAgICAgIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgb2YgdGhlIGF1ZGlvIG1peGVyCi0gKiBAcGFyYW0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgZmlyc3QgY2xpcAotICogQHBhcmFtICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSggTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBJbnB1dENsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEFkZGVkQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0Jvb2wgYkNsaXAxSXNBQUMgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJDbGlwMklzQUFDID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHNldHRpbmdzICovCi0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGF0IGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIFZTUzNHUFAgbGlicmFyeSAqLwotICAgIGlmKCAoIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzBdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IpCi0gICAgICAgIHx8IChwSW5wdXRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSAhPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SKQotICAgICAgICB8fCAocElucHV0Q2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMl0KLSAgICAhPSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OiBUaGUgY2xpcCBhbmFseXNpcyBoYXMgYmVlbiBnZW5lcmF0ZWRcCi0gICAgICAgICAgICBieSBhbm90aGVyIHZlcnNpb24sIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOwotICAgIH0KLQotICAgIGlmKCAoIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzBdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IpCi0gICAgICAgIHx8IChwQWRkZWRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSAhPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SKQotICAgICAgICB8fCAocEFkZGVkQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMl0KLSAgICAhPSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OiBUaGUgY2xpcCBhbmFseXNpcyBoYXMgYmVlbiBnZW5lcmF0ZWRcCi0gICAgICAgICAgICBieSBhbm90aGVyIHZlcnNpb24sIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOwotICAgIH0KLQotICAgIC8qKioqKioqKiogaW5wdXQgZmlsZSB0eXBlICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCAhPSBwSW5wdXRDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQOwotICAgIH0KLQotICAgIC8qKioqKioqKiogaW5wdXQgYXVkaW8gKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcElucHV0Q2xpcFByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFNUi1OQiBvciBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwSW5wdXRDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIHN3aXRjaCggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJDbGlwMUlzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTaWxlbmNlIGlzIGFsd2F5cyBlZGl0YWJsZSAqLwotICAgICAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBhZGRlZCBhdWRpbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQWRkZWRDbGlwUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQU1SLU5CIG9yIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIEkgdXNlIHRoaXMgZmllbGQgdG8ga25vdyBpZiBzaWxlbmNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICBiQ2xpcDJJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1BDTToKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0KLSAgICAgICAgICAgICAgICBpZiggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPT0gMTYwMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkNsaXAySXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOiAvKlJDKi8KLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogVGhlIHdyaXRlciBjYW5ub3Qgd3JpdGUgdGhpcyAgaW50byBhIDNncHAgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6XAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2lsZW5jZSBpcyBhbHdheXMgZWRpdGFibGUgKi8KLSAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgfQotCi0gICAgaWYoIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgaWYoIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAhPSBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gY2FsbCBTU1JDIGluIG9yZGVyIHRvIGFsaWduIEFTRiBhbmQvb3IgbmIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgIC8qIE1vcmVvdmVyLCBhdWRpbyBlbmNvZGVyIG1heSBiZSBuZWVkZWQgaW4gY2FzZSBvZiBhdWRpbyByZXBsYWNpbmcuLi4gKi8KLSAgICAgICAgICAgIHBDLT5iX1NTUkNuZWVkZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgIDwgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFN0ZXJlbyB0byBNb25vICovCi0gICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgID4gcEFkZGVkQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE1vbm8gdG8gU3RlcmVvICovCi0gICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfVFJVRTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NvZGVjcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjZWQ5MzcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZTUzNHUFBfQ29kZWNzLmMKLSAqIEBicmllZiAgVlNTIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYXVkaW8vdmlkZW8KLSAqICAgICAgICAgICAgY29kZWMgbWFuaXB1bGF0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgT1NBTCBkZWJ1ZyBzZXJ2aWNlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIgLyoqPCBJbnRlcm5hbCB0eXBlcyBvZiB0aGUgVlNTICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCkKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMgKQotewotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogSW5pdGlhbGlzYXRpb24gdGhhdCB3aWxsIGFsbG93IHRvIGNoZWNrIGlmIHJlZ2lzdGVyaW5nIHR3aWNlICovCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00V1JJVEVSX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rVmlkZW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckZsYWdbaV0gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXNhdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gY2hlY2sgaWYgcmVnaXN0ZXJpbmcgdHdpY2UgKi8KLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNFJFQURFUl9rTWVkaWFUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgcEMtPm1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjID0gMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRBRF9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0LHBXdHJHbG9iYWxJbnRlcmZhY2Ugb3IgcFd0ckRhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UgKnBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKnBXdHJEYXRhSW50ZXJmYWNlICkKLXsKLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWU1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJXcml0ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBXdHJHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBXdHJHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJXcml0ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBXdHJEYXRhSW50ZXJmYWNlID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwV3RyR2xvYmFsSW50ZXJmYWNlPTB4JXgsXAotICAgICAgICBwV3RyRGF0YUludGVyZmFjZT0weCV4IiwKLSAgICAgICAgcEMsIHBXdHJHbG9iYWxJbnRlcmZhY2UsIHBXdHJEYXRhSW50ZXJmYWNlKTsKLQotICAgIGlmKCAoIE1lZGlhVHlwZSA9PSBNNFdSSVRFUl9rVW5rbm93bikgfHwgKE1lZGlhVHlwZSA+PSBNNFdSSVRFUl9rVHlwZV9OQikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgbWVkaWEgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucEdsb2JhbEZjdHMgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBhIHdyaXRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiVGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBTYXZlIHdyaXRlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyA9IHBXdHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBEYXRhRmN0cyA9IHBXdHJEYXRhSW50ZXJmYWNlOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlICkKLXsKLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWU1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18zKAotICAgICAgICAiVlNTOiBNNFZTUzNHUFBfcmVnaXN0ZXJFbmNvZGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBFbmNHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIE1lZGlhVHlwZT0weCV4IiwKLSAgICAgICAgcEMsIHBFbmNHbG9iYWxJbnRlcmZhY2UsIE1lZGlhVHlwZSk7Ci0KLSAgICBpZiggTWVkaWFUeXBlID49IE00RU5DT0RFUl9rVmlkZW9fTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIHZpZGVvIGVuY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGVuY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBlbmNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBlbmNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICAvKiBUaGUgYWN0dWFsIHVzZXJEYXRhIGFuZCBleHRlcm5hbCBBUEkgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGVuY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0gICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsCi0gKiAgICAgICAgY29udGV4dCB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZTogICAgICAgICAgICAgICAgKElOKSBUaGUgbWVkaWEgdHlwZS4KLSAqIEBwYXJhbSAgICBwRW5jR2xvYmFsSW50ZXJmYWNlOiAgICAoT1VUKSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlICkKLXsKLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWU1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18zKAotICAgICAgICAiVlNTOiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIgY2FsbGVkIHBDb250ZXh0PTB4JXgsIHBFbmNHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIE1lZGlhVHlwZT0weCV4IiwKLSAgICAgICAgcEMsIHBFbmNHbG9iYWxJbnRlcmZhY2UsIE1lZGlhVHlwZSk7Ci0KLSAgICBpZiggTWVkaWFUeXBlID49IE00RU5DT0RFUl9rQXVkaW9fTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIGF1ZGlvIGVuY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qCi0gICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+cEF1ZGlvRW5jb2RlckZsYWdbTWVkaWFUeXBlXSA9IE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBlbmNvZGVyICovCi0gICAgcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXI6IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlWzB4JXhdID0gMHgleCIsCi0gICAgICAgIE1lZGlhVHlwZSwgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmRyRGF0YUludGVyZmFjZSApCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckdsb2JhbEludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGdsb2JhbCBpbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckRhdGFJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXI6IGludmFsaWQgcG9pbnRlciBvbiBkYXRhIGludGVyZmFjZSIpOwotCi0gICAgaWYoIG1lZGlhVHlwZSA9PSBNNFJFQURFUl9rTWVkaWFUeXBlVW5rbm93bgotICAgICAgICB8fCBtZWRpYVR5cGUgPj0gTTRSRUFERVJfa01lZGlhVHlwZV9OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBhIHJlYWRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiVGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVttZWRpYVR5cGVdID0gcFJkckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMrKzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UgKQotewotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGVjb2RlciBpbnRlcmZhY2UiKTsKLQotICAgIGlmKCBkZWNvZGVyVHlwZSA+PSBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgdmlkZW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0jaWZuZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgICAgICAvKiBhIGRlY29kZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotCi0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiRGVjb2RlciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLQotI2Vsc2UgLyogZXh0ZXJuYWwgZGVjb2RlcnMgYXJlIHBvc3NpYmxlICovCi0gICAgICAgIC8qIGNhbiBiZSBsZWdpdGltYXRlLCBpbiBjYXNlcyB3aGVyZSB3ZSBoYXZlIG9uZSB2ZXJzaW9uIHRoYXQgY2FuIHVzZSBleHRlcm5hbCBkZWNvZGVycwotICAgICAgICBidXQgd2hpY2ggc3RpbGwgaGFzIHRoZSBidWlsdC1pbiBvbmUgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgYW4gZXh0ZXJuYWwgZGVjb2RlcjsgaW4KLSAgICAgICAgdGhpcyBjYXNlIHRoZSBuZXcgZGVjb2RlciBzaW1wbHkgcmVwbGFjZXMgdGhlIG9sZCBvbmUgKGkuZS4gd2UgdW5yZWdpc3RlciBpdCBmaXJzdCkuICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIC8qIG9oLCBhbmQgZG9uJ3QgZm9yZ2V0IHRoZSB1c2VyIGRhdGEsIHRvby4gKi8KLSAgICAgICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotI2VuZGlmIC8qIGFyZSBleHRlcm5hbCBkZWNvZGVycyBwb3NzaWJsZT8gKi8KLQotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IHBEZWNvZGVySW50ZXJmYWNlOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAvKiBUaGUgYWN0dWFsIHVzZXJEYXRhIHdpbGwgYmUgc2V0IGJ5IHRoZSByZWdpc3RyYXRpb24gZnVuY3Rpb24gaW4gdGhlIGNhc2UKLSAgICBvZiBhbiBleHRlcm5hbCBkZWNvZGVyIChhZGQgaXQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhpcyBmdW5jdGlvbiBpbiB0aGUgbG9uZyBydW4/KSAqLwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjKys7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIFZTUyB0byByZWdpc3RlciBOWFAgYXVkaW8gZGVjb2RlcnMsCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgQXVkaW8gZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBBdWRpbyBkZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKQotewotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGVjb2RlciBpbnRlcmZhY2UiKTsKLQotICAgIGlmKCBkZWNvZGVyVHlwZSA+PSBNNEFEX2tUeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiSW52YWxpZCBhdWRpbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtkZWNvZGVyVHlwZV0gPQotICAgICAgICBNNE9TQV9GQUxTRTsgLyogaW50ZXJuYWwgZGVjb2RlciAqLwotICAgIHBDLT5wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHdyaXRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBlbmNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnM6IHBDPTB4JXgiLCBwQyk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rVmlkZW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSk7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tBdWRpb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLypEb24ndCBmcmVlIGV4dGVybmFsIGF1ZGlvIGVuY29kZXJzIGludGVyZmFjZXMqLwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00UkVBREVSX2tNZWRpYVR5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0pOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0pOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycyA9IDA7Ci0gICAgcEMtPm1fcFJlYWRlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBkZWNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnM6IHBDPTB4JXgiLCBwQyk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00REVDT0RFUl9rVmlkZW9UeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRBRF9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLypEb24ndCBmcmVlIGV4dGVybmFsIGF1ZGlvIGRlY29kZXJzIGludGVyZmFjZXMqLwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbaV0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjID0gMDsKLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRXcml0ZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHdyaXRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIHdyaXRlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rM0dQUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucEdsb2JhbEZjdHM7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucERhdGFGY3RzOwotCi0gICAgaWYoIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMCi0gICAgICAgIHx8IHBDLT5wV3JpdGVyRGF0YUZjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSwKLSAgICAgICAgICAgICJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEVOQ09ERVJfRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMigiTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXI6IHBDPTB4JXgsIG1lZGlhVHlwZT0weCV4IiwKLSAgICAgICAgcEMsIG1lZGlhVHlwZSk7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0gyNjM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSA9Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVCwKLSAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1UeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMigiTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXI6IHBDPTB4JXgsIG1lZGlhVHlwZT0weCV4IiwKLSAgICAgICAgcEMsIG1lZGlhVHlwZSk7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tBTVI6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXI6IGVuY29kZXIgdHlwZSBBTVIiKTsKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogZW5jb2RlciB0eXBlIEFBQyIpOwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQsCi0gICAgICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbMHgleF09MHgleCxcCi0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IDB4JXgiLAotICAgICAgICBlbmNvZGVyVHlwZSwgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdLAotICAgICAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMpOwotCi0gICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00UkVBREVSX01lZGlhVHlwZSByZWFkZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGUzR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVBTVI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDM6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZU1QMzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTToKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgICAgICJSZWFkZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRTsKLSAgICB9Ci0KLSAgICBwQy0+bV9wUmVhZGVyID0gcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbcmVhZGVyVHlwZV07Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCA9IHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtyZWFkZXJUeXBlXTsKLQotICAgIGlmKCBwQy0+bV9wUmVhZGVyID09IE00T1NBX05VTEwgfHwgcEMtPm1fcFJlYWRlckRhdGFJdCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlQVZDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4ODoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVZVVY0MjBQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgcEMtPm1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFULAotICAgICAgICAgICAgIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlQU1STkI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURUUzoKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FESUY6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBQUM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb1BjbToKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZVBDTTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiQXVkaW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgcEMtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLQotICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQXVkaW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjhiN2Q1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FZGl0LmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAgIC8qKjwgT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIgLyoqPCBPU0FMIHN0cmluZyBtYW5hZ2VtZW50ICovCi0KLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgInN0cmluZy5oIiAgICAgICAgIC8qKjwgZm9yIHN0cmNweSAoRG9uJ3Qgd2FudCB0byBnZXQgZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE00T1NBX1N0cmluZy4uLikgKi8KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyICovCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3RhdGljIGxvY2FsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcCApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFRyYW5zaXRpb24gKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlNYXN0ZXJDbGlwICk7Ci1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRWZXJzaW9uKCkKLSAqIEBicmllZiAgICBHZXQgdGhlIFZTUyAzR1BQIHZlcnNpb24uCi0gKiBAbm90ZSAgICBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oIE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbkluZm8gKQotewotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfR2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbkluZm89MHgleCIsCi0gICAgICAgIHBWZXJzaW9uSW5mbyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFZlcnNpb25JbmZvKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX0dldFZlcnNpb246IHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgPSBNNFZTU19WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciA9IE00VlNTX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uID0gTTRWU1NfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgM0dQUCBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRJbml0KCBNNFZTUzNHUFBfRWRpdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQzsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgXAotICAgICAgICBwRmlsZVJlYWRQdHJGY3Q9MHgleCwgcEZpbGVXcml0ZVB0ckZjdD0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCwgcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVSZWFkUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRJbml0OiBwRmlsZVdyaXRlUHRyRmN0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGhlIFZTUyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpLAotICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIk00VlNTM0dQUF9JbnRlcm5hbENvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLSAgICAgICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcEMsIDAsc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KSk7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIE00VlNTM0dQUF9JbnRlcm5hbENvbnRleHQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLQotICAgIC8qIEluaXQgdGhlIGNvbnRleHQuICovCi0gICAgcEMtPnVpQ2xpcE51bWJlciA9IDA7Ci0gICAgcEMtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+dWlDdXJyZW50Q2xpcCA9IDA7Ci0gICAgcEMtPnBDMSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDMiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnl1djFbMF0ucGFjX2RhdGEgPSBwQy0+eXV2MVsxXS5wYWNfZGF0YSA9IHBDLT4KLSAgICAgICAgeXV2MVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnl1djJbMF0ucGFjX2RhdGEgPSBwQy0+eXV2MlsxXS5wYWNfZGF0YSA9IHBDLT4KLSAgICAgICAgeXV2MlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnl1djNbMF0ucGFjX2RhdGEgPSBwQy0+eXV2M1sxXS5wYWNfZGF0YSA9IHBDLT4KLSAgICAgICAgeXV2M1syXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnl1djRbMF0ucGFjX2RhdGEgPSBwQy0+eXV2NFsxXS5wYWNfZGF0YSA9IHBDLT4KLSAgICAgICAgeXV2NFsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID0gMDsKLSAgICBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID0gMDsKLSAgICBwQy0+YlRyYW5zaXRpb25FZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YlN1cHBvcnRTaWxlbmNlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgUEMtPmV3YyBtZW1iZXJzICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gMC4wOwotICAgIHBDLT5ld2MuZEFUbyA9IDAuMDsKLSAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiA9IDA7Ci0gICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSAwOwotICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9IDE7Ci0gICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5pbmZvU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMDsKLSAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gMC4wOwotICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MuaU1wZWc0R292T2Zmc2V0ID0gMDsKLSAgICBwQy0+ZXdjLlZwcEVycm9yID0gMDsKLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rTm9FbmNvZGVyOwotICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICAvKioKLSAgICAqIEtlZXAgdGhlIE9TQUwgZmlsZSBmdW5jdGlvbnMgcG9pbnRlciBzZXQgaW4gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+cE9zYUZpbGVSZWFkUHRyID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLQotICAgIGVyciA9IE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qCi0gICAgKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBtYWluIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NSRUFURUQ7Ci0gICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICBwQy0+QXN0YXRlID0gTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIC8qIFRoZSBmbGFnIGlzIHNldCB0byBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGNsaXAgKi8KLSAgICBwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgcEMtPmJJc01NUyA9IE00T1NBX0ZBTFNFOwotCi0gICAgcEMtPmlJbk91dFRpbWVPZmZzZXQgPSAwOwotICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSAwOwotICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMxID0gMDsKLSAgICBwQy0+Yklzc2Vjb25kQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0SW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgQWxsb3dzIGZpbGxpbmcgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gKgotICogQG5vdGUgICAgV0FSTklORzogcENsaXBTZXR0aW5ncy0+RWZmZWN0c1sgXSB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgcEZpbGUgICAgICAgICAgICAgICAoSU4pIENsaXAgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICBmaWxlUGF0aFNpemUgICAgICAgIChJTikgQ2xpcCBwYXRoIHNpemUgKG5lZWRlZCBmb3IgVVRGIDE2IGNvbnZlcnNpb24pCi0gKiBAcGFyYW0gICAgbmJFZmZlY3RzICAgICAgICAgICAoSU4pIE5iIG9mIGVmZmVjdCBzZXR0aW5ncyB0byBhbGxvY2F0ZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIKLU00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBuYkVmZmVjdHMgKQotewotICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIHBDbGlwU2V0dGluZ3M9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBjbGlwIHNldHRpbmdzIHRvIGRlZmF1bHQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9IE00T1NBX05VTEw7ICAgICAgICAvKio8IG5vIGZpbGUgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9VbnN1cHBvcnRlZDsgLyoqPCB1bmRlZmluZWQgKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBGaWxlICkKLSAgICB7Ci0gICAgICAgIC8vcENsaXBTZXR0aW5ncy0+cEZpbGUgPSAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4ocEZpbGUpKzEsIE00VlNTM0dQUCwKLSAgICAgICAgLy8gInBDbGlwU2V0dGluZ3MtPnBGaWxlIik7Ci0gICAgICAgIC8qRkI6IGFkZCBjbGlwIHBhdGggc2l6ZSBiZWNhdXNlIG9mIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZmlsZVBhdGhTaXplICsgMSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicENsaXBTZXR0aW5ncy0+cEZpbGUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzLT5wRmlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyA6IEVSUk9SIGFsbG9jYXRpbmcgZmlsZW5hbWUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvL21lbWNweShwQ2xpcFNldHRpbmdzLT5wRmlsZSwgcEZpbGUsIHN0cmxlbihwRmlsZSkrMSk7Ci0gICAgICAgIC8qRkI6IGFkZCBjbGlwIHBhdGggc2l6ZSBiZWNhdXNlIG9mIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5ncy0+cEZpbGUsICh2b2lkICopcEZpbGUsIGZpbGVQYXRoU2l6ZSArIDEpOwotICAgIH0KLQotICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSB0byBzdXBwb3J0IFVURjE2IGNvbnZlcnNpb24qLwotICAgIHBDbGlwU2V0dGluZ3MtPmZpbGVQYXRoU2l6ZSA9IGZpbGVQYXRoU2l6ZSArIDE7Ci0gICAgLyoqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkZpbGVUeXBlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WZXJzaW9uWzBdID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WZXJzaW9uWzFdID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WZXJzaW9uWzJdID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9IDA7Ci0KLSAgICBwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZSA9IDA7IC8qKjwgbm8gYmVnaW4gY3V0ICovCi0gICAgcENsaXBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lID0gMDsgICAvKio8IG5vIGVuZCBjdXQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHZpZGVvIGNoYXJhY3RlcmlzdGljcyAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuZkF2ZXJhZ2VGcmFtZVJhdGUgPSAwLjA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0cnZsYyA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgYXVkaW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb01heEF1U2l6ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfZWRpdFNldERlZmF1bHRTZXR0aW5ncygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3NEZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggZGVzdD0weCVwIHNyYz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QsIHBDbGlwU2V0dGluZ3NPcmlnKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzRGVzdCBpcyBOVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NPcmlnKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NPcmlnIGlzIE5VTEwiKTsKLQotICAgIC8qIENvcHkgcGxhaW4gc3RydWN0dXJlICovCi0gICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICh2b2lkICopcENsaXBTZXR0aW5nc09yaWcsIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSk7Ci0KLSAgICAvKiBEdXBsaWNhdGUgZmlsZW5hbWUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUgKQotICAgIHsKLSAgICAgICAgLy9wQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUgPQotICAgICAgICAvLyAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4ocENsaXBTZXR0aW5nc09yaWctPnBGaWxlKSsxLCBNNFZTUzNHUFAsCi0gICAgICAgIC8vICJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLSAgICAgICAgLypGQjogY2xpcCBwYXRoIHNpemUgaXMgbmVlZGVkIGZvciB1dGYgMTYgY29udmVyc2lvbiovCi0gICAgICAgIC8qRkIgMjAwOC8xMC8xNjogYmFkIGFsbG9jYXRpb24gc2l6ZSB3aGljaCByYWlzZXMgYSBjcmFzaCovCi0gICAgICAgIHBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQ2xpcFNldHRpbmdzT3JpZy0+ZmlsZVBhdGhTaXplICsgMSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8qRkI6IGNsaXAgcGF0aCBzaXplIGlzIG5lZWRlZCBmb3IgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICAvL21lbWNweShwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUsIHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKLSAgICAgICAgLy8gc3RybGVuKHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSkrMSk7Ci0gICAgICAgIC8qRkIgMjAwOC8xMC8xNjogYmFkIGFsbG9jYXRpb24gc2l6ZSB3aGljaCByYWlzZXMgYSBjcmFzaCovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSwgKHZvaWQgKilwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUsCi0gICAgICAgICAgICBwQ2xpcFNldHRpbmdzT3JpZy0+ZmlsZVBhdGhTaXplLyorMSovKTsKLSAgICAgICAgKCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgKilwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUpW3BDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemVdID0gJ1wwJzsKLSAgICB9Ci0KLSAgICAvKiBEdXBsaWNhdGUgZWZmZWN0cyAqLwotICAgIC8qIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMpLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKAotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyogZnJlZSBmaWxlbmFtZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3MtPnBGaWxlICkKLSAgICB7Ci0gICAgICAgIGZyZWUocENsaXBTZXR0aW5ncy0+cEZpbGUpOwotICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogZnJlZSBlZmZlY3RzIHNldHRpbmdzICovCi0gICAgLyogICAgaWYoTTRPU0FfTlVMTCAhPSBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzKQotICAgIHsKLSAgICBmcmVlKHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMpOwotICAgIHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwU2V0dGluZ3MtPm5iRWZmZWN0cyA9IDA7Ci0gICAgfSBSQyAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbigpCi0gKiBAYnJpZWYgICAgIFNldCB0aGUgVlNTIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICAgIEl0IG9wZW5zIHRoZSBpbnB1dCBmaWxlLCBidXQgdGhlIG91dHB1dCBmaWxlIG1heSBub3QgYmUgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICAgcFNldHRpbmdzICAgICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbiggTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG91dHB1dEZpbGVUeXBlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOyAvKio8IDNHUFAgb3IgTVAzICh3ZSBkb24ndCBkbyBBTVIgb3V0cHV0KSAqLwotICAgIE00T1NBX1VJbnQzMiB1aUMxZHVyYXRpb24sIHVpQzJkdXJhdGlvbjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBTZXR0aW5ncz0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MtPnBDbGlwTGlzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcFNldHRpbmdzLT5wQ2xpcExpc3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoIHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID4gMSkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoICggcEMtPlN0YXRlICE9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NSRUFURUQpCi0gICAgICAgICYmIChwQy0+U3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ0xPU0VEKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IFN0YXRlIGVycm9yICgweCV4KSEgUmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgYW55IHByZXZpb3VzbHkgYWxsb2NhdGVkIGludGVybmFsIHNldHRpbmdzIGxpc3QgKi8KLSAgICBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdChwQyk7Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIHVzZXIgc2V0dGluZ3MgaW4gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+dWlDbGlwTnVtYmVyID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGNsaXAgbGlzdCAqLwotICAgIHBDLT5wQ2xpcExpc3QgPQotICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykKLSAgICAgICAgKiBwQy0+dWlDbGlwTnVtYmVyLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQ2xpcExpc3QiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wQ2xpcExpc3QgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiB1bmFibGUgdG8gYWxsb2NhdGUgcEMtPlNldHRpbmdzLnBDbGlwTGlzdCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncygmKHBDLT5wQ2xpcExpc3RbaV0pLAotICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sIE00T1NBX1RSVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSBlZmZlY3RzIGxpc3QgUkMgKi8KLQotICAgIC8qRkIgYnVnIGZpeCAxOS4wMy4yMDA4IGlmIHRoZSBudW1iZXIgb2YgZWZmZWN0cyBpcyAwIC0+IGNyYXNoKi8KLSAgICBpZiggcFNldHRpbmdzLT5uYkVmZmVjdHMgPiAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSBwU2V0dGluZ3MtPm5iRWZmZWN0czsKLSAgICAgICAgcEMtPnBFZmZlY3RzTGlzdCA9IChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpICogcEMtPm5iRWZmZWN0cywKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBFZmZlY3RzTGlzdCIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wRWZmZWN0c0xpc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiB1bmFibGUgdG8gYWxsb2NhdGUgcEMtPnBFZmZlY3RzTGlzdCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT5uYkVmZmVjdHM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHBDLT5wRWZmZWN0c0xpc3RbaV0pLAotICAgICAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2ldKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBhY3RpdmUgZWZmZWN0cyBsaXN0IFJDICovCi0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9VSW50OCkgKiBwQy0+bmJFZmZlY3RzLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogQWxsb2NhdGUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VJbnQ4KSAqIHBDLT5uYkVmZmVjdHMsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQWN0aXZlRWZmZWN0c0xpc3QiKTsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzID0gMDsKLSAgICAgICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSAwOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFRlc3QgdGhlIGNsaXAgYW5hbHlzaXMgZGF0YSwgaWYgaXQgaXMgbm90IHByb3ZpZGVkLCBhbmFseXNlIHRoZSBjbGlwcyBieSBvdXJzZWx2ZXMuICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkFuYWx5c2VkICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBBbmFseXNpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGludGVncmF0b3IgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAocEMtPnBDbGlwTGlzdFtpXS5wRmlsZSwKLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlLCAmcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBwQy0+cE9zYUZpbGVSZWFkUHRyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBjbGlwIGNvbXBhdGliaWxpdHkgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPU00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENoZWNrIGFsbCB0aGUgY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBWU1MgM0dQUCAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygKLSAgICAgICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCVkKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgdGhlIG1hc3RlciBjbGlwIHZlcnN1cyBhbGwgdGhlIG90aGVyIG9uZXMuCi0gICAgICAgIChpbmNsdWRpbmcgbWFzdGVyIGNsaXAgd2l0aCBpdHNlbGYsIGVsc2UgdmFyaWFibGVzIGZvciBtYXN0ZXIgY2xpcAotICAgICAgICBhcmUgbm90IHByb3Blcmx5IHNldHRlZCkgKi8KLSAgICAgICAgaWYocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcyk7Ci0gICAgICAgICAgICAvKiBpbiBjYXNlIG9mIHdhcm5pbmcgcmVnYXJkaW5nIGF1ZGlvIGluY29tcGF0aWJpbGl0eSwKLSAgICAgICAgICAgICAgICBlZGl0aW5nIGNvbnRpbnVlcyAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICglZCkgcmV0dXJucyAweCV4ISIsIGksIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFNlYXJjaCBhdWRpbyB0cmFja3MgdGhhdCBjYW5ub3QgYmUgZWRpdGVkIDoKLSAgICAqICAgLSBkZWxldGUgYWxsIGF1ZGlvIGVmZmVjdHMgZm9yIHRoZSBjbGlwCi0gICAgKiAgIC0gaWYgbWFzdGVyIGNsaXAgaXMgZWRpdGFibGUgbGV0IHRoZSB0cmFuc2l0aW9uCi0gICAgKGJhZCB0cmFjayB3aWxsIGJlIHJlcGxhY2VkIGxhdGVyIHdpdGggc2lsZW5jZSkKLSAgICAqICAgLSBpZiBtYXN0ZXIgY2xpcCBpcyBub3QgZWRpdGFibGUgc3dpdGNoIHRvIGEgZHVtbXkgdHJhbnNpdGlvbiAob25seSBjb3B5L3Bhc3RlKSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzRWRpdGFibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50OCB1aUZ4OwotCi0gICAgICAgICAgICBmb3IgKCB1aUZ4ID0gMDsgdWlGeCA8IHBDLT5uYkVmZmVjdHM7IHVpRngrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzTGlzdFt1aUZ4XS5BdWRpb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICAgICAgPSBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBpIDwgKHBDLT51aUNsaXBOdW1iZXIgLSAxKSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5BdWRpb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICAgID0gTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFdlIGFkZCBhIHRyYW5zaXRpb24gb2YgZHVyYXRpb24gMCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGNsaXAuCi0gICAgKiBJdCB3aWxsIHN1cHByZXNzIGEgd2hvbGUgYnVuY2ggYSB0ZXN0IGxhdHRlciBpbiB0aGUgcHJvY2Vzc2luZy4uLiAqLwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3QgPSAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykKLSAgICAgICAgKiAocEMtPnVpQ2xpcE51bWJlciksIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBUcmFuc2l0aW9uTGlzdCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+U2V0dGluZ3MucFRyYW5zaXRpb25MaXN0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqPCBjb3B5IHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IChwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpOyBpKysgKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBUcmFuc2l0aW9uTGlzdFtpXSksCi0gICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICB9Ci0KLSAgICAvKio8IFdlIGZpbGwgdGhlIGxhc3QgImR1bW15IiB0cmFuc2l0aW9uICovCi0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDbGlwTnVtYmVyIC0gMV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSAwOwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ2xpcE51bWJlcgotICAgICAgICAtIDFdLlZpZGVvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUNsaXBOdW1iZXIKLSAgICAgICAgLSAxXS5BdWRpb1RyYW5zaXRpb25UeXBlID0gTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmU7Ci0KLSAgICAvKioKLSAgICAqIEF2b2lkIHdlaXJkIGNsaXAgc2V0dGluZ3MgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUgIT1NNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygmcEMtPnBDbGlwTGlzdFtpXSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjayByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCAocFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKTsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uICE9IDApIHsKLSAgICAgICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaSsxXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSAtIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2krMV0uRmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaSsxXS51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSAtIHBDLT5wQ2xpcExpc3RbaSsxXS51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE1heGltdW0gdHJhbnNpdGlvbiBkdXJhdGlvbiBiZXR3ZWVuIGNsaXAgbiBhbmQgY2xpcCBuKzEgaXMgdGhlIGR1cmF0aW9uCi0gICAgICAgICogb2YgdGhlIHNob3J0ZXN0IGNsaXAgKi8KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUMxZHVyYXRpb24gPSBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IGR1cmF0aW9uIG9mIGNsaXAgbiBpcyB0aGUgZW5kIGN1dCB0aW1lICovCi0gICAgICAgICAgICB1aUMxZHVyYXRpb24gPSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgU3Vic3RyYWN0IGJlZ2luIGN1dCAqLwotICAgICAgICB1aUMxZHVyYXRpb24gLT0gcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAvKio8IENoZWNrIHRoYXQgdGhlIHRyYW5zaXRpb24gaXMgc2hvcnRlciB0aGFuIGNsaXAgbiAqLwotICAgICAgICBpZiggcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA+IHVpQzFkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSB1aUMxZHVyYXRpb24gLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBDbGlwTGlzdFtpICsgMV0udWlFbmRDdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdWlDMmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2kgKyAxXS5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBkdXJhdGlvbiBvZiBjbGlwIG4rMSBpcyB0aGUgZW5kIGN1dCB0aW1lICovCi0gICAgICAgICAgICB1aUMyZHVyYXRpb24gPSBwQy0+cENsaXBMaXN0W2kgKyAxXS51aUVuZEN1dFRpbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IFN1YnN0cmFjdCBiZWdpbiBjdXQgKi8KLSAgICAgICAgdWlDMmR1cmF0aW9uIC09IHBDLT5wQ2xpcExpc3RbaSArIDFdLnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIC8qKjwgQ2hlY2sgdGhhdCB0aGUgdHJhbnNpdGlvbiBpcyBzaG9ydGVyIHRoYW4gY2xpcCBuKzEgKi8KLSAgICAgICAgaWYoIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPiB1aUMyZHVyYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uID0gdWlDMmR1cmF0aW9uIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEF2b2lkIHdlaXJkIHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygmcEMtPnBUcmFuc2l0aW9uTGlzdFtpXSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgdGhhdCB0d28gdHJhbnNpdGlvbnMgYXJlIG5vdCBvdmVybGFwcGluZwotICAgICAgICAgIChubyBvdmVybGFwcGluZyBwb3NzaWJsZSBmb3IgZmlyc3QgY2xpcCkgKi8KLSAgICAgICAgaWYoIGkgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFRoZXJlIGlzIGEgdHJhbnNpdGlvbiBvdmVybGFwIGlmIHRoZSBzdW0gb2YgdGhlIGR1cmF0aW9uIG9mCi0gICAgICAgICAgICAgIHR3byBjb25zZWN1dGl2ZSB0cmFuc2l0aW9ucwotICAgICAgICAgICAgKiBpcyBoaWdoZXIgdGhhbiB0aGUgZHVyYXRpb24gb2YgdGhlIGNsaXAgaW4tYmV0d2Vlbi4gKi8KLSAgICAgICAgICAgIGlmKCAoIHBDLT5wVHJhbnNpdGlvbkxpc3RbaSAtIDFdLnVpVHJhbnNpdGlvbkR1cmF0aW9uCi0gICAgICAgICAgICAgICAgKyBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uKSA+PSB1aUMxZHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBPdmVybGFwcGluZyB0cmFuc2l0aW9ucyBvbiBjbGlwICVkLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMiLAotICAgICAgICAgICAgICAgICAgICBpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogT3V0cHV0IGNsaXAgZHVyYXRpb24gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSBzdW0gb2YgdGhlIGNsaXAgZHVyYXRpb24gKi8KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiArPQotICAgICAgICAgICAgICAgIHBDLT4KLSAgICAgICAgICAgICAgICBwQ2xpcExpc3RbCi0gICAgICAgICAgICAgICAgICAgIGldLkNsaXBQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwVmlkZW9EdXJhdGlvbjsgLyogT25seSB2aWRlbyB0cmFjayBkdXJhdGlvbiBpcyBpbXBvcnRhbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIGRldmlhdGlvbiBpZiBhdWRpbyB0cmFjayBpcyBsb25nZXIgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWU7IC8qKjwgQWRkIGVuZCBjdXQgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uIC09Ci0gICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lOyAvKio8IFJlbW92ZSBiZWdpbiBjdXQgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1vdmUgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIChpdCBpcyBjb3VudGVkIHR3aWNlKSAqLwotICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiAtPSBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotICAgIH0KLQotICAgIC8qIEdldCB2aWRlbyBwcm9wZXJ0aWVzIGZyb20gb3V0cHV0IHByb3BlcnRpZXMgKi8KLQotICAgIC8qIEdldCBvdXRwdXQgd2lkdGggYW5kIGhlaWdodCAqLwotICAgIHN3aXRjaChwQy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDEyODsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDk2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTc2OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMTQ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDMyMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDI0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDM1MjsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDI4ODsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyogK1BSIExWNTgwNyAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tXVkdBOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSA4MDA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNzIwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiAtUFIgTFY1ODA3ICovCi0gICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDM2MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IE00RU5DT0RFUl84NTRfNDgwX1dpZHRoOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLQotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDk2MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDE5MjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxMDg4OyAvLyBuZWVkIHRvIGJlIG11bHRpcGxlcyBvZiAxNgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3Blbjogbm8gb3V0cHV0IHZpZGVvIHNpemUgZ2l2ZW4sIGRlZmF1bHQgdG8gUUNJRiEiKTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTc2OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMTQ0OwotICAgICAgICAgICAgcEMtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGUgICAgICAgID0gMzA7Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nICA9IDA7Ci0gICAgLyogU2V0IG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9Qcm9maWxlID0gcEMtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbCA9IHBDLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICBzd2l0Y2gocEMtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQpIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa0gyNjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa0gyNjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa1ZpZGVvVW5rbm93bjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgYXVkaW8gcHJvcGVydGllcyBvZiB0aGUgbWFzdGVyIGNsaXAgdG8gdGhlIG91dHB1dCBwcm9wZXJ0aWVzICovCi0gICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPQotICAgICAgICBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT4KLSAgICAgICAgdWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgcEMtPmV3Yy5zY2FsZV9hdWRpbyA9IHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSAvIDEwMDAuMDsKLQotICAgIHN3aXRjaCggcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDg7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICBwQy0+YlN1cHBvcnRTaWxlbmNlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk87Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgIDEwMjQ7IC8qIEFBQyBpcyBhbHdheXMgMTAyNC9GcmVxIHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rTVAzOwotICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UsIG1wMyBjb3JlIHJlYWRlciByZXR1cm4gYSB0aW1lIGluIG1zICovCi0gICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gMS4wOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMTYwOyAvKiBFVlJDIGZyYW1lcyBhcmUgMjAgbXMgYXQgODAwMCBIegotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ha2VzIGl0IGVhc2llciB0byBmYWN0b3JpemUgYW1yIGFuZCBldnJjIGNvZGUpICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8cEMtPnVpQ2xpcE51bWJlcjsgaSsrKSB7Ci0gICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID09IE00T1NBX0ZBTFNFKSB7Ci0gICAgICAgICAgICAvKiogSWYgbm90IHRyYW5zY29kZWQgaW4gQW5hbHlzaXMgcGhhc2UsIGNoZWNrCi0gICAgICAgICAgICAgKiBpZiB0cmFuc2NvZGluZyByZXF1aXJlZCBub3cKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSAhPQotICAgICAgICAgICAgICAgICAgcEMtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQpfHwKLSAgICAgICAgICAgICAgICAgIChwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCAhPQotICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoKSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlWaWRlb0hlaWdodCAhPQotICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCkgfHwKLSAgICAgICAgICAgICAgICAgIChwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PQotICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tIMjY0KSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09Ci0gICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa01QRUc0ICYmCi0gICAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlICE9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkpIHsKLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qKiBJZiBiVHJhbnNjb2RpbmdSZXF1aXJlZCBpcyB0cnVlLCBpdCBtZWFucyB0aGUgY2xpcCBoYXMKLSAgICAgICAgICAgICAqIGJlZW4gdHJhbnNjb2RlZCBpbiBBbmFseXNpcyBwaGFzZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5iVHJhbnNjb2RpbmdSZXF1aXJlZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogV2UgcHJvZHVjZSBhIDNncHAgZmlsZSwgdW5sZXNzIGl0IGlzIG1wMyAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rTVAzID09IHBDLT4KLSAgICAgICAgcENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICBvdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDM7Ci0gICAgZWxzZQotICAgICAgICBvdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgLyoqCi0gICAgKiBCZXdhcmUsIGEgbnVsbCBkdXJhdGlvbiB3b3VsZCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gZXJyb3IgKGJldHRlciBzYWZlIHRoYW4gc29ycnkuLi4pICovCi0gICAgaWYoIDAgPT0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gPSAxOwotICAgIH0KLQotICAgIC8qKgotICAgICogT3BlbiBmaXJzdCBjbGlwICovCi0gICAgcEMtPnVpQ3VycmVudENsaXAgPSAwOwotCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gMC4wOwotICAgIHBDLT5ld2MuZEFUbyA9IDAuMDsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLSAgICAvKiBSQzogdG8ga25vdyB3aGVuIGEgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIERvIHRoZSB2aWRlbyBzdHVmZiBpbiAzR1BQIEF1ZGlvL1ZpZGVvIGNhc2UgKi8KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAgPT0gb3V0cHV0RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgRGVjb2RlciBTcGVjaWZpYyBJbmZvIGZvciB0aGUgb3V0cHV0IHZpZGVvIGFuZCBhdWRpbyBzdHJlYW1zICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaShwQywKLSAgICAgICAgICAgIHBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW5jcmVtZW50IGZvciB0aGUgdHJhbnNpdGlvbiBmaWxlICovCi0gICAgICAgIHN3aXRjaCggcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rN181X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyA3LjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxMi41OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMTUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDIwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAyNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMzAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbigpOiBpbnZhbGlkIHZpZGVvRnJhbWVSYXRlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIsCi0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFNZU19rTVBFR180ID09IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQWxwaGE7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTVBFRy00IGNhc2UuCi0gICAgICAgICAgICAqIFRpbWUgc2NhbGUgb2YgdGhlIHRyYW5zaXRpb24gZW5jb2RlciBtdXN0IGJlIHRoZSBzYW1lIHRoYW4gdGhlCi0gICAgICAgICAgICAqIHRpbWVzY2FsZSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0gICAgICAgICAgICAqIFNvIHRoZSBmcmFtZSBkdXJhdGlvbiBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIHRpbWUgc2NhbGUsCi0gICAgICAgICAgICAqIGJ1dCB3aXRob3V0IGJlZWluZyB0b28gc2hvcnQuCi0gICAgICAgICAgICAqIEZvciB0aGF0LCB3ZSBtdXN0IGNvbXB1dGUgYWxwaGEgKGludGVnZXIpIHNvIHRoYXQ6Ci0gICAgICAgICAgICAqICAgICAgICAgICAgIChhbHBoYSB4IDEwMDApL0VuY29kZXJUaW1lU2NhbGUgPiBNaW5GcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAqKi8KLQotICAgICAgICAgICAgdWlBbHBoYSA9IChNNE9TQV9VSW50MzIpKCggcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgKiBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGUpIC8gMTAwMC4wICsgMC41KTsKLQotICAgICAgICAgICAgaWYoIHVpQWxwaGEgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAoIHVpQWxwaGEgKiAxMDAwLjApIC8gcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00U1lTX2tIMjYzID09IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW4oKTogaW52YWxpZCB2aWRlb0ZyYW1lUmF0ZSBmb3IgSDI2MyxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOwotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIE1QMyBvdXRwdXQgZmlsZSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzID09IG91dHB1dEZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00UkVBREVSX0J1ZmZlciBtcDN0YWdCdWZmZXI7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlKHBDLCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVGhlIElEM3YyIHRhZyBjb3VsZCBiZSBhdCBhbnkgcGxhY2UgaW4gdGhlIG1wMyBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBUaGUgbXAzIHJlYWRlciBvbmx5IGNoZWNrcyBmZXcgYnl0ZXMgaW4gdGhlIGJlZ2lubmluZyBvZgotICAgICAgICAgICBzdHJlYW0gdG8gbG9vayBmb3IgYSBJRDN2MiB0YWcgICovCi0gICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgaWYgdGhlIElEM3YyIHRhZyBpcyBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB0aGUgcmVhZGVyIGRvCi0gICAgICAgIGFzIHRoZXJlIGlzIG5vIHRoZXNlIG1ldGFkYXRhICovCi0KLSAgICAgICAgLyogUmV0cmlldmUgdGhlIGRhdGEgb2YgdGhlIElEM3YyIFRhZyAqLwotICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfTXAzSWQzdjJUYWcsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm1wM3RhZ0J1ZmZlcik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9lZGl0T3BlbjogTTRNUDNSX2dldE9wdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogV3JpdGUgdGhlIGRhdGEgb2YgdGhlIElEM3YyIFRhZyBpbiB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgaWYoIDAgIT0gbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1wM3RhZ0J1ZmZlci5tX3BEYXRhLCBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJlZSBiZWZvcmUgdGhlIGVycm9yIGNoZWNraW5nIGFueXdheSAqLwotICAgICAgICAgICAgZnJlZShtcDN0YWdCdWZmZXIubV9wRGF0YSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFcnJvciBjaGVja2luZyAqLwotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogV3JpdGVEYXRhKElEM3YyVGFnKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtcDN0YWdCdWZmZXIubV9wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIDNHUFAgb3V0cHV0IGZpbGUgKi8KLSAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBvdXRwdXRGaWxlVHlwZSApCi0gICAgewotICAgICAgICBwQy0+ZXdjLnVpVmlkZW9CaXRyYXRlID0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiAxMS8xMi8yMDA4IENSMzI4MyBNTVMgdXNlIGNhc2UgaW4gVmlkZW9BcnRpc3Q6IFNldCBtYXggb3V0cHV0IGZpbGUgc2l6ZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgaWYoIHBDLT5iSXNNTVMgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIsIHBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUsCi0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIsIHBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBEZWZhdWx0IGVycm9yIGNhc2UgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IGludmFsaWQgb3V0cHV0RmlsZVR5cGUgPSAweCV4LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX09VVFBVVF9GSUxFX1RZUEVfRVJST1IiLAotICAgICAgICAgICAgb3V0cHV0RmlsZVR5cGUpOwotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfT1VUUFVUX0ZJTEVfVFlQRV9FUlJPUjsgLyoqPCB0aGlzIGlzIGFuIGludGVybmFsIGVycm9yIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biB0byB0aGUgdXNlciAqLwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZSBzdGF0ZSAqLwotICAgIGlmKCBNNFNZU19rTVAzID09IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluIHRoZSBNUDMgY2FzZSB3ZSB1c2UgYSBzcGVjaWFsIGF1ZGlvIHN0YXRlICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QM19KVU1QOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBzdGFydCB3aXRoIHRoZSB2aWRlbyBwcm9jZXNzaW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZSBzdGF0ZS4KLSAgICAqIFRoZSBmaXJzdCBjbGlwIGlzIGluZGVwZW5kYW50IHRvIHRoZSAidmlydHVhbCBwcmV2aW91cyBjbGlwcyIsCi0gICAgKiBzbyBpdCdzIGxpa2UgaWYgd2Ugd2hlcmUgaW4gUmVhZC9Xcml0ZSBtb2RlIGJlZm9yZSBpdC4gKi8KLSAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0T3BlbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN0ZXAoKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgZWRpdGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgICBwUHJvZ3Jlc3MgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApIG9mIHRoZSBlZGl0aW5nIG9wZXJhdGlvbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICBWU1MgM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTogRWRpdGlvbiBpcyBkb25lLCB1c2VyIHNob3VsZCBub3cgY2FsbAotICogICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCggTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgdWlQcm9ncmVzc0F1ZGlvLCB1aVByb2dyZXNzVmlkZW8sIHVpUHJvZ3Jlc3M7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfZWRpdFN0ZXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQcm9ncmVzcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0U3RlcDogcFByb2dyZXNzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uIGFuZCBzZWxlY3QgY29ycmVjdCBwcm9jZXNzaW5nICovCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9WSURFTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfQVVESU86Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyhwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMyhwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QM19KVU1QOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwKCk6IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcHJvZ3Jlc3MuCi0gICAgKiBXZSBkbyB0aGUgY29tcHV0aW5nIHdpdGggMzJiaXRzIHByZWNpc2lvbiBiZWNhdXNlIGluIHNvbWUgKHZlcnkpIGV4dHJlbWUgY2FzZSwgd2UgbWF5IGdldAotICAgICogdmFsdWVzIGhpZ2hlciB0aGFuIDI1NiAoLi4uKSAqLwotICAgIHVpUHJvZ3Jlc3NBdWRpbyA9Ci0gICAgICAgICggKE00T1NBX1VJbnQzMikocEMtPmV3Yy5kQVRvICogMTAwKSkgLyBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHVpUHJvZ3Jlc3NWaWRlbyA9ICgoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cyAqIDEwMCkpIC8gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb247Ci0KLSAgICB1aVByb2dyZXNzID0gdWlQcm9ncmVzc0F1ZGlvICsgdWlQcm9ncmVzc1ZpZGVvOwotCi0gICAgaWYoICggcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgIT0gTTRTWVNfa0F1ZGlvVW5rbm93bikKLSAgICAgICAgJiYgKHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICE9IE00U1lTX2tWaWRlb1Vua25vd24pICkKLSAgICAgICAgdWlQcm9ncmVzcyAvPSAyOwotCi0gICAgLyoqCi0gICAgKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZiggdWlQcm9ncmVzcyA+IDEwMCApCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KXVpUHJvZ3Jlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gdGhlIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0U3RlcCgpOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZSgpCi0gKiBAYnJpZWYgICAgRmluaXNoIHRoZSBWU1MgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgb3V0cHV0IDNHUFAgZmlsZSBpcyByZWFkeSB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZSggTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0VSUiByZXR1cm5lZEVycm9yID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgbGFzdENUUzsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfZWRpdENsb3NlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uLgotICAgICogSW4gInRoZW9yeSIsIHdlIHNob3VsZCBub3QgYXV0aG9yaXplIGNsb3NpbmcgaWYgd2UgYXJlIGluIENSRUFURUQgc3RhdGUuCi0gICAgKiBCdXQgaW4gcHJhY3RpY2UsIGluIGNhc2UgdGhlIG9wZW5pbmcgZmFpbGVkLCBpdCBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBkb25lLgotICAgICogSW4gdGhhdCBjYXNlIHdlIGhhdmUgdG8gZnJlZSBzb21lIG9wZW5lZCByZXNzb3VyY2VzIGJ5IGNhbGxpbmcgQ2xvc2UuICovCi0gICAgaWYoIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCA9PSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogV3Jvbmcgc3RhdGUgKDB4JXgpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVGhlcmUgbWF5IGJlIGFuIGVuY29kZXIgdG8gZGVzdHJveSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfZWRpdERlc3Ryb3lWaWRlb0VuY29kZXIoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgdGhlIG91dHB1dCBmaWxlICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogTVAzIGNhc2UgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5wT3NhRmlsZVdyaXRQdHItPmNsb3NlV3JpdGUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDbG9zZSB0aGUgb3V0cHV0IDNHUFAgY2xpcCwgaWYgaXQgaGFzIGJlZW4gb3BlbmVkICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbGFzdCBWaWRlbyBDVFMgKi8KLSAgICAgICAgICAgIGxhc3RDVFMgPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBTZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IHBGY3RDbG9zZVdyaXRlKE9VVCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IKLSAgICAgICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBvdXRwdXQgdmlkZW8gRFNJLCBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+ZXdjLnBWaWRlb091dHB1dERzaSk7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIG91dHB1dCBhdWRpbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpKTsKLSAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgY2xpcDEsIGlmIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzEpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoQzEpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWRFcnJvciA9IGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENsb3NlIGNsaXAyLCBpZiBuZWVkZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMyICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQy0+cEMyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKEMyKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUgotICAgICAgICAgICAgICAgID09IHJldHVybmVkRXJyb3IgKSAvKio8IHdlIHJldHVybiB0aGUgZmlyc3QgZXJyb3IgdGhhdCBoYXBwZW5lZCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBDMiA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSB0ZW1wb3JhcnkgWVVWIHBsYW5lcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYxWzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djFbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djFbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYxWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MVsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYxWzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djFbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYyWzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djJbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MlswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djJbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYyWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MlsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYyWzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djJbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIFJDICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djNbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2M1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYzWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2M1sxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYzWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYzWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djNbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2M1syXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUkMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2NFswXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXY0WzBdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djRbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXY0WzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djRbMV0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2NFsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djRbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2NFsyXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXY0WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJDIEZyZWUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYoIHBDLT5wRWZmZWN0c0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wRWZmZWN0c0xpc3QpOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJDIEZyZWUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKCBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0KTsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKgotICAgICAqICBGcmVlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgKi8KLSAgICBpZihwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSk7Ci0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYocEMtPm1fYWlyX2NvbnRleHQgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgcEMtPm1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQ7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xvc2UoKTogcmV0dXJuaW5nIDB4JXgiLCByZXR1cm5lZEVycm9yKTsKLSAgICByZXR1cm4gcmV0dXJuZWRFcnJvcjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKCkKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIGVkaXQgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCggTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ29udGV4dCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXAoKTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCwgcmV0dXJuaW5nIE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UsIGlmIG5lZWRlZC4KLSAgICAqIEluICJ0aGVvcnkiLCB3ZSBzaG91bGQgbm90IGNsb3NlIGlmIHdlIGFyZSBpbiBDUkVBVEVEIHN0YXRlLgotICAgICogQnV0IGluIHByYWN0aWNlLCBpbiBjYXNlIHRoZSBvcGVuaW5nIGZhaWxlZCwgaXQgbWF5IGhhdmUgYmVlbiBwYXJ0aWFsbHkgZG9uZS4KLSAgICAqIEluIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGZyZWUgc29tZSBvcGVuZWQgcmVzc291cmNlcyBieSBjYWxsaW5nIENsb3NlLiAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfZWRpdENsZWFuVXAoKTogY2FsbGluZyBNNFZTUzNHUFBfZWRpdENsb3NlIik7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q2xvc2UocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXAoKTogTTRWU1MzR1BQX2VkaXRDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHZpZGVvIGVuY29kZXIgZHVtbXkgQVUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBEdW1teUF1QnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlcik7Ci0gICAgICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgQXVkaW8gZW5jb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygmcEMtPlNoZWxsQVBJKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2V0dGluZ3MgY29waWVkIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QocEMpOwotCi0gICAgLyoqCi0gICAgKiBGaW5hbGx5LCBGcmVlIGNvbnRleHQgKi8KLSAgICBmcmVlKHBDKTsKLSAgICBwQyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jaWZkZWYgV0lOMzIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRFcnJvck1lc3NhZ2UoKQotICogQGJyaWVmICAgIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnaXZlbiBlcnJvciBjb2RlCi0gKiBAbm90ZSAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQgKGFuZCBsb25nIGVub3VnaCEpCi0gKiBAcGFyYW0gICAgZXJyICAgICAgICAgICAgICAgIChJTikgRXJyb3IgY29kZSB0byBnZXQgdGhlIGRlc2NyaXB0aW9uIGZyb20KLSAqIEBwYXJhbSAgICBzTWVzc2FnZSAgICAgICAgKElOL09VVCkgQWxsb2NhdGVkIHN0cmluZyBpbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gd2lsbCBiZSBjb3BpZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIElucHV0IGVycm9yIGlzIGZyb20gdGhlIFZTUzNHUFAgbW9kdWxlCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjpJbnB1dCBlcnJvciBpcyBub3QgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSggTTRPU0FfRVJSIGVyciwgTTRPU0FfQ2hhciAqc01lc3NhZ2UgKQotewotICAgIHN3aXRjaCggZXJyICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkc6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkciKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9FRkZFQ1RfS0lORDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9FRkZFQ1RfS0lORCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX0VGRkVDVF9UWVBFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX0VGRkVDVF9UWVBFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fVFJBTlNJVElPTl9UWVBFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRVhURVJOQUxfRUZGRUNUX05VTEwiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9UUkFOU0lUSU9OX05VTEw6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9FTkRfQ1VUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlM6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfM0dQUF9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0UiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfSDI2M19QUk9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEM6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19USU1FX1NDQUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU1RSRUFNX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TQU1QTElOR19GUkVRVUVOQ1k6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk8iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT046Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOREVGSU5FRF9BVURJT19UUkFDS19GSUxFX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfQURERURfQVVESU9fU1RSRUFNOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BVURJT19NSVhJTkdfVU5TVVBQT1JURUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0siKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5MT09QX0hJR0hFUl9FTkRMT09QOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1AiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyoqPCBOb3QgYSBWU1MzR1BQIGVycm9yICovCi0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICIiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLyogV0lOMzIgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKiogICBTVEFUSUMgRlVOQ1RJT05TICAgKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2soKQotICogQGJyaWVmICAgIFNpbXBsaWZ5IHRoZSBnaXZlbiBjbGlwIHNldHRpbmdzCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIGdpdmVuIHN0cnVjdHVyZQotICogQHBhcmFtICAgcENsaXAgICAgKElOL09VVCkgQ2xpcCBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfRUZGRUNUX05VTEw6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXAgKQotewotICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpQ2xpcEFjdHVhbER1cmF0aW9uOyAvKio8IHRoZSBjbGlwIGR1cmF0aW9uIG9uY2UgdGhlIGN1dHMgYXJlIGRvbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlEdXJhdGlvbjsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLQotICAgIC8qKgotICAgICogSWYgYmVnaW4gY3V0IGlzIHRvbyBmYXIsIHJldHVybiBhbiBlcnJvciAqLwotICAgIHVpRHVyYXRpb24gPSBwQ2xpcC0+Q2xpcFByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0KLSAgICBpZiggcENsaXAtPnVpQmVnaW5DdXRUaW1lID4gdWlEdXJhdGlvbiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2s6ICVkID4gJWQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OIiwKLSAgICAgICAgICAgIHBDbGlwLT51aUJlZ2luQ3V0VGltZSwgdWlEdXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIGVuZCBjdXQgaXMgdG9vIGZhciwgc2V0IHRvIHplcm8gKGl0IG1lYW5zIG5vIGVuZCBjdXQpICovCi0gICAgaWYoIHBDbGlwLT51aUVuZEN1dFRpbWUgPiB1aUR1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIHBDbGlwLT51aUVuZEN1dFRpbWUgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBhY3R1YWwgY2xpcCBkdXJhdGlvbiAob25jZSBjdXRzIGFyZSBkb25lKSAqLwotICAgIGlmKCAwID09IHBDbGlwLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogTm8gZW5kIGN1dCAqLwotICAgICAgICB1aUNsaXBBY3R1YWxEdXJhdGlvbiA9IHVpRHVyYXRpb24gLSBwQ2xpcC0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUgPj0gcENsaXAtPnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2s6ICVkID4gJWQsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9FTkRfQ1VUIiwKLSAgICAgICAgICAgICAgICBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUsIHBDbGlwLT51aUVuZEN1dFRpbWUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQ7Ci0gICAgICAgIH0KLSAgICAgICAgdWlDbGlwQWN0dWFsRHVyYXRpb24gPSBwQ2xpcC0+dWlFbmRDdXRUaW1lIC0gcENsaXAtPnVpQmVnaW5DdXRUaW1lOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soKQotICogQGJyaWVmICAgIFNpbXBsaWZ5IHRoZSBnaXZlbiB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiBAbm90ZSAgICAgVGhpcyBmdW5jdGlvbiBtYXkgbW9kaWZ5IHRoZSBnaXZlbiBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwVHJhbnNpdGlvbiAgICAoSU4vT1VUKSBUcmFuc2l0aW9uIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9UUkFOU0lUSU9OX05VTEw6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFRyYW5zaXRpb25TZXR0aW5nc1Nhbml0eUNoZWNrKAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKnBUcmFuc2l0aW9uICkKLXsKLSAgICAvKioKLSAgICAqIE5vIHRyYW5zaXRpb24gKi8KLSAgICBpZiggMCA9PSBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcFRyYW5zaXRpb24tPlZpZGVvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICAgICAgcFRyYW5zaXRpb24tPkF1ZGlvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggKCBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZQotICAgICAgICA9PSBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgJiYgKE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lCi0gICAgICAgID09IHBUcmFuc2l0aW9uLT5BdWRpb1RyYW5zaXRpb25UeXBlKSApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgZXh0ZXJuYWwgdHJhbnNpdGlvbiBmdW5jdGlvbiBpcyBzZXQgKi8KLSAgICBpZiggKCBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICA+PSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICYmIChNNE9TQV9OVUxMID09IHBUcmFuc2l0aW9uLT5FeHRWaWRlb1RyYW5zaXRpb25GY3QpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBtaW5pbWFsIHRyYW5zaXRpb24gZHVyYXRpb24gKi8KLSAgICBpZiggKCBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPiAwKQotICAgICAgICAmJiAocFRyYW5zaXRpb24tPnVpVHJhbnNpdGlvbkR1cmF0aW9uCi0gICAgICAgIDwgTTRWU1MzR1BQX01JTklNQUxfVFJBTlNJVElPTl9EVVJBVElPTikgKQotICAgIHsKLSAgICAgICAgcFRyYW5zaXRpb24tPnVpVHJhbnNpdGlvbkR1cmF0aW9uID0KLSAgICAgICAgICAgIE00VlNTM0dQUF9NSU5JTUFMX1RSQU5TSVRJT05fRFVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdCgpCi0gKiBAYnJpZWYgICAgRnJlZSB0aGUgc2V0dGluZ3MgY29waWVkIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2V0dGluZ3MgbGlzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQ2xpcExpc3QgKQotICAgIHsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoJihwQy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKHBDLT5wQ2xpcExpc3QpOwotICAgICAgICBwQy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHRyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVHJhbnNpdGlvbkxpc3QgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFRyYW5zaXRpb25MaXN0KTsKLSAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoKQotICogQGJyaWVmICAgICAgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAgZmlsZQotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwT3V0cHV0RmlsZSApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9Ci0gICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHItPm9wZW5Xcml0ZSgmcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgcE91dHB1dEZpbGUsCi0gICAgICAgIE00T1NBX2tGaWxlV3JpdGUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlOiBXcml0ZU9wZW4gcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKQotICogQGJyaWVmICAgQ3JlYXRlcyBhbmQgcHJlcGFyZSB0aGUgb3V0cHV0IE1QMyBmaWxlCi0gKiBAbm90ZSAgICBDcmVhdGVzIHRoZSB3cml0ZXIsIENyZWF0ZXMgdGhlIG91dHB1dCBmaWxlLCBBZGRzIHRoZSBzdHJlYW1zLAotICAgICAgICAgICBSZWFkaWVzIHRoZSB3cml0aW5nIHByb2Nlc3MKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSggTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBPc2FGaWxlV3JpdFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBPc2FGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwVGVtcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1heE91dHB1dEZpbGVTaXplICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB1aVZlcnNpb247Ci0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSB0ZW1wOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUgY2FsbGVkIHdpdGggcENfZXdjPTB4JXgsIHBPdXRwdXRGaWxlPTB4JXgiLAotICAgICAgICBwQ19ld2MsIHBPdXRwdXRGaWxlKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDX2V3YyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcENfZXdjIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcE91dHB1dEZpbGUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6IHBPdXRwdXRGaWxlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qIFNldCB3cml0ZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcihwQ19TaGVsbEFQSSwgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0T3BlbigmcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgcE91dHB1dEZpbGUsIHBPc2FGaWxlV3JpdFB0ciwgcFRlbXBGaWxlLCBwT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgc2lnbmF0dXJlIG9wdGlvbiBvZiB0aGUgd3JpdGVyICovCi0gICAgZXJyID0KLSAgICAgICAgcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZywgKE00T1NBX0RhdGFPcHRpb24pIk5YUC1TVyA6IFZTUyAgICAiKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoxMS8xMi8yMDA4IENSMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZpZGVvQXJ0aXN0OgotICAgIFNldCB0aGUgbWF4IG91dHB1dCBmaWxlIHNpemUgb3B0aW9uIGluIHRoZSB3cml0ZXIgc28gdGhhdCB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZQotICAgIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4gZmlsZSBzaXplIGxpbWl0YXRpb24qLwotICAgIGlmKCBtYXhPdXRwdXRGaWxlU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSwgJm1heE91dHB1dEZpbGVTaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICB3cml0ZXIgc2V0IG9wdGlvbiBNNFdSSVRFUl9rTWF4RmlsZVNpemUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB2ZXJzaW9uIG9wdGlvbiBvZiB0aGUgd3JpdGVyICovCi0gICAgdWlWZXJzaW9uID0KLSAgICAgICAgKE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IgKiAxMDAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SICogMTAKLSAgICAgICAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OKTsKLSAgICBlcnIgPQotICAgICAgICBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbiwgKE00T1NBX0RhdGFPcHRpb24pICZ1aVZlcnNpb24pOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcENfZXdjLT5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB2aWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtSW5mby5oZWlnaHQgPSBwQ19ld2MtPnVpVmlkZW9IZWlnaHQ7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLndpZHRoID0gcENfZXdjLT51aVZpZGVvV2lkdGg7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmZwcyA9Ci0gICAgICAgICAgICAwLjA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgIHBDX2V3Yy0+cFZpZGVvT3V0cHV0RHNpOyAvKio8IFByZXZpb3VzbHkgY29tcHV0ZWQgb3V0cHV0IERTSSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IHBDX2V3Yy0+Ci0gICAgICAgICAgICB1aVZpZGVvT3V0cHV0RHNpU2l6ZTsgLyoqPCBQcmV2aW91c2x5IGNvbXB1dGVkIG91dHB1dCBEU0kgc2l6ZSAqLwotCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IHBDX2V3Yy0+VmlkZW9TdHJlYW1UeXBlOwotCi0gICAgICAgIHN3aXRjaCggcENfZXdjLT5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgICAgICAgICAvKio8IFdlIEhBVkUgdG8gcHV0IGEgdmFsdWUgaGVyZS4uLiAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPnVpVmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0ubWF4Qml0cmF0ZSA9IHBDX2V3Yy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6IHVua25vd24gaW5wdXQgdmlkZW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCEiLAotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnRpbWVTY2FsZSA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLmR1cmF0aW9uID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgICAgICBzaXplb2YoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyk7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uZGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKSAmKHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAmcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0odmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gQVVfUkFQOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuQ1RTID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLkRUUyA9IDA7ICAgIC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuc2l6ZSA9IDA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5zdHJlYW0gPSAmKHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBBVSBzaXplICovCi0gICAgICAgIHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZSA9IChNNE9TQV9VSW50MzIpKDEuNUYKLSAgICAgICAgICAgICooTTRPU0FfRmxvYXQpKHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLndpZHRoCi0gICAgICAgICAgICAqIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmhlaWdodCkKLSAgICAgICAgICAgICogTTRWU1MzR1BQX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyk7Ci0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZTsKLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCB2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHdyaXRlciBtYXggdmlkZW8gY2h1bmsgc2l6ZSAqLwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSAoTTRPU0FfVUludDMyKShwQ19ld2MtPnVpVmlkZW9NYXhBdVNpemUgXAotICAgICAgICAgICAgKiBNNFZTUzNHUFBfVklERU9fQVVfU0laRV9UT19DSFVOQ0tfU0laRV9SQVRJTyk7IC8qKjwgZnJvbSBtYXggQVUgc2l6ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IENodW5jayBzaXplICovCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCB2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRTWVNfa0F1ZGlvVW5rbm93biAhPSBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zIHN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJTYW1wbGVzUGVyU2VjID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJCaXRzUGVyU2FtcGxlID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJDaGFubmVscyA9IDE7ICAgICAgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotCi0gICAgICAgIGlmKCBwQ19ld2MtPnBBdWRpb091dHB1dERzaSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IHBDX2V3Yy0+dWlBdWRpb091dHB1dERzaVNpemU7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBwQ19ld2MtPnBBdWRpb091dHB1dERzaTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdyaXRlciB3aWxsIHB1dCBhIGRlZmF1bHQgRFNJICovCi0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLlNpemUgPSAwOwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5wQnVmID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gcENfZXdjLT5BdWRpb1N0cmVhbVR5cGU7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5wcm9maWxlTGV2ZWwgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJTYW1wbGVzUGVyU2VjID0KLSAgICAgICAgICAgIHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGUgPSBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW1JbmZvLm5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQ19ld2MtPnVpTmJDaGFubmVsczsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJCaXRzUGVyU2FtcGxlID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgc3dpdGNoKCBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgMDsgLyoqPCBJdCBpcyBub3QgdXNlZCBieSB0aGUgc2hlbGwsIHRoZSBEU0kgaXMgdGFrZW4gaW50byBhY2NvdW50IGluc3RlYWQgKi8KLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tBQUM6Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5tYXhCaXRyYXRlID0gcENfZXdjLT51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFNZU19rRVZSQzoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgMDsgLyoqPCBJdCBpcyBub3QgdXNlZCBieSB0aGUgc2hlbGwsIHRoZSBEU0kgaXMgdGFrZW4gaW50byBhY2NvdW50IGluc3RlYWQgKi8KLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tNUDM6IC8qKjwgdGhlcmUgY2FuJ3QgYmUgTVAzIHRyYWNrIGluIDNHUFAgZmlsZSAtPiBlcnJvciAqLwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogdW5rbm93biBvdXRwdXQgYXVkaW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCEiLAotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogT3VyIHdyaXRlciBzaGVsbCBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBwdXQgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcwotICAgICAgICBpbiB0aGUgRFNJIHBvaW50ZXIuLi4gKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICZzdHJlYW1BdWRpb0luZm87Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGluayB0aGUgQVUgYW5kIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLnN0cmVhbSA9ICYocENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5zaXplID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgICAgICAtcENfZXdjLT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5EVFMgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuYXR0cmlidXRlID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuZnJhZyA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwgJnBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCBhdWRpbyBBVSBzaXplICovCi0gICAgICAgIHBDX2V3Yy0+dWlBdWRpb01heEF1U2l6ZSA9IE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRTsKLSAgICAgICAgdGVtcC5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICB0ZW1wLnZhbHVlID0gcENfZXdjLT51aUF1ZGlvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCBhdWRpbyBjaHVuY2sgc2l6ZSAqLwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSBNNFZTUzNHUFBfQVVESU9fTUFYX0NIVU5DS19TSVpFOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmdGVtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGwgc3RyZWFtcyBhZGRlZCwgd2UncmUgbm93IHJlYWR5IHRvIHdyaXRlICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnRXcml0aW5nKAotICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpCi0gKiBAYnJpZWYgICAgR2VuZXJhdGUgYSBIMjYzIG9yIE1QRUctNCBkZWNvZGVyIHNwZWNpZmljIGluZm8gY29tcGF0aWJsZSB3aXRoIGFsbCBpbnB1dCB2aWRlbwotICogICAgICAgICAgICB0cmFja3MuIENvcHkgYXVkaW8gZHNpIGZyb20gbWFzdGVyIGNsaXAuCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlNYXN0ZXJDbGlwICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpUmVzeW5jaE1hcmtlckRzaUluZGV4OwotICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1Gb3JEc2k7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBEZWNDb25maWdJbmZvOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgZHVtbXlTaXplOwotICAgIE00T1NBX0Jvb2wgYkdldERTaUZyb21FbmNvZGVyID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBNNEVOQ09ERVJfSGVhZGVyICplbmNIZWFkZXI7Ci0gICAgTTRTWVNfU3RyZWFtSURtZW1BZGRyIHN0cmVhbUhlYWRlcjsKLQotICAgIHBTdHJlYW1Gb3JEc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogSDI2MyBjYXNlICovCi0gICAgaWYoIE00U1lTX2tIMjYzID09IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEgyNjMgb3V0cHV0IERTSSBpcyBhbHdheXMgNyBieXRlcyAqLwotICAgICAgICBwQy0+ZXdjLnVpVmlkZW9PdXRwdXREc2lTaXplID0gNzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+ZXdjLnVpVmlkZW9PdXRwdXREc2lTaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBWaWRlb091dHB1dERzaSAoSDI2MykiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTpcCi0gICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSAoSDI2MyksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogKFdlIG92ZXJyaWRlIHRoZSBpbnB1dCB2ZW5kb3IgaW5mby4KLSAgICAgICAgKiBBdCBsZWFzdCB3ZSBrbm93IHRoYXQgbm90aGluZyBzcGVjaWFsIHdpbGwgYmUgdHJpZWQgd2l0aCBQSExQLXN0YW1wZWQKLSAgICAgICAgICBlZGl0ZWQgc3RyZWFtcy4uLikgKi8KLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbMF0gPSAnUCc7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpWzFdID0gJ0gnOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVsyXSA9ICdMJzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbM10gPSAnUCc7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlciB2ZXJzaW9uIGlzIDAgKi8KLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbNF0gPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIExldmVsIGlzIHRoZSBzaXh0aCBieXRlIGluIHRoZSBEU0kgKi8KLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbNV0gPSBwQy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFByb2ZpbGUgaXMgdGhlIHNldmVudGggYnl0ZSBpbiB0aGUgRFNJKi8KLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbNl0gPSBwQy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNUEVHLTQgY2FzZSAqLwotICAgIGVsc2UgaWYoIE00U1lTX2tNUEVHXzQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgfHwKLSAgICAgICAgTTRTWVNfa0gyNjQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpIHsKLQotICAgICAgICAvKiBGb3IgTVBFRzQgYW5kIEguMjY0IGVuY29kZXIgY2FzZQotICAgICAgICAqIEZldGNoIHRoZSBEU0kgZnJvbSB0aGUgc2hlbGwgdmlkZW8gZW5jb2RlciwgYW5kIGZlZWQgaXQgdG8gdGhlIHdyaXRlciBiZWZvcmUKLSAgICAgICAgY2xvc2luZyBpdC4gKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6IGdldCBEU0kgZm9yIEgyNjQgc3RyZWFtIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6IHBDLT5ld2MucEVuY0NvbnRleHQgaXMgTlVMTCIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybmVkIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogZW5jSGVhZGVyLT5wQnVmPTB4JXgsIHNpemU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+cEJ1ZiwgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgICBzZW5kIERTSSBmb3IgdmlkZW8gc3RyZWFtIHRvIDNHUCB3cml0ZXIiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYW5kIGNvcHkgdGhlIG5ldyBEU0kgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZW5jSGVhZGVyLT5TaXplLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChIMjY0KSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwVmlkZW9PdXRwdXREc2ksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSAoTTRPU0FfVUludDE2KWVuY0hlYWRlci0+U2l6ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBWaWRlb091dHB1dERzaSwgKHZvaWQgKillbmNIZWFkZXItPnBCdWYsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+U2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyIHJldHVybmVkIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMLCBjYW5ub3QgZ2V0IHRoZSBEU0kiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBTdHJlYW1Gb3JEc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIENvbXB1dGUgQXVkaW8gRFNJICovCi0gICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYoIHVpTWFzdGVyQ2xpcCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2xpcCBpcyBhbHJlYWR5IG9wZW5lZCAqLwotICAgICAgICAgICAgcFN0cmVhbUZvckRzaSA9ICYocEMtPnBDMS0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV2UgY2FuIHVzZSB0aGUgZmFzdCBvcGVuIG1vZGUgdG8gZ2V0IHRoZSBEU0kgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdCgmcENsaXAsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcENsaXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXAsICZwQy0+cENsaXBMaXN0W3VpTWFzdGVyQ2xpcF0sCi0gICAgICAgICAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX1RSVUUsIE00T1NBX1RSVUUpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBPcGVuKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpID0gJihwQ2xpcC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBBdWRpb091dHB1dERzaSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcEF1ZGlvT3V0cHV0RHNpLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcFN0cmVhbUZvckRzaS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2ksCi0gICAgICAgICAgICAodm9pZCAqKXBTdHJlYW1Gb3JEc2ktPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiBhIGNsaXAgaGFzIGJlZW4gdGVtcG9yYXJpbHkgb3BlbmVkIHRvIGdldCBpdHMgRFNJLCBjbG9zZSBpdCAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkKLSAqIEBicmllZiAgICBTd2l0Y2ggZnJvbSB0aGUgY3VycmVudCBjbGlwIHRvIHRoZSBuZXh0IG9uZQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMxICkKLSAgICB7Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lKTsKLSAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDbG9zZSB0aGUgY3VycmVudCBmaXJzdCBjbGlwICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQy0+cEMxKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiAgaW5jcmVtZW50IGNsaXAgY291bnRlciAqLwotICAgICAgICBwQy0+dWlDdXJyZW50Q2xpcCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgbGFzdCBjbGlwICovCi0gICAgaWYoIHBDLT51aUN1cnJlbnRDbGlwID49IHBDLT51aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgcEMtPnBDMSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0ZJTklTSEVEOwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoQzEpIHJldHVybnMgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlIG5leHQgY2xpcCBoYXMgYWxyZWFkeSBiZSBvcGVuZWQsIHNldCBpdCBhcyBmaXJzdCBjbGlwICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDMiApCi0gICAgewotICAgICAgICBwQy0+cEMxID0gcEMtPnBDMjsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+cEMyLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUgPSBwQy0+cEMyLT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgfQotICAgICAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdDsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBlbHNlIG9wZW4gaXQgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50T3BlbkNsaXAocEMsICZwQy0+cEMxLAotICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXBdKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6IE00VlNTM0dQUF9pbnRPcGVuQ2xpcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIHNlY29uZCBjbGlwIGhhcyBub3QgYmVlbiBvcGVuZWQgeWV0LAotICAgICAgICAgIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBoYXMgYmVlbiBubyB0cmFuc2l0aW9uLgotICAgICAgICAqIFNvIGJvdGggb3V0cHV0IHZpZGVvIGFuZCBhdWRpbyB0aW1lcyBhcmUgT0suCi0gICAgICAgICogU28gd2UgY2FuIHNldCBib3RoIHZpZGVvMiBhbmQgYXVkaW8gb2Zmc2V0cyAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCBjdXJyZW50IHZpZGVvIG91dHB1dCBDVFMgdG8gdGhlIGNsaXAgdmlkZW8gb2Zmc2V0ICovCi0KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgcEMtPnBDMS0+aVZvZmZzZXQgKz0gKE00T1NBX1VJbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIGN1cnJlbnQgYXVkaW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCBhdWRpbyBvZmZzZXQgKi8KLSAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgKz0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIDIwMDUtMDMtMjQ6IEJ1Z0ZpeCBmb3IgYXVkaW8tdmlkZW8gc3luY2hybzoKLSAgICAgICAgKiBUaGVyZSBtYXkgYmUgYSBwb3J0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBBVSBvZiBkZXN5bmNocm8gYXQgZWFjaCBhc3NlbWJseS4KLSAgICAgICAgKiBJdCBsZWFkcyB0byBhbiBhdWRpYmxlIGRlc3luY2hybyB3aGVuIHRoZXJlIGFyZSBhIGxvdCBvZiBjbGlwcyBhc3NlbWJsZWQuCi0gICAgICAgICogVGhpcyBidWcgZml4IGFsbG93cyB0byByZXN5bmNoIHRoZSBhdWRpbyB0cmFjayB3aGVuIHRoZSBkZWx0YSBpcyBoaWdoZXIKLSAgICAgICAgKiB0aGFuIG9uZSBhdWRpbyBBVSBkdXJhdGlvbi4KLSAgICAgICAgKiBXZSBTdGVwIG9uZSBBVSBpbiB0aGUgc2Vjb25kIGNsaXAgYW5kIHdlIGNoYW5nZSB0aGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5LiAqLwotICAgICAgICBpZiggKCBwQy0+cEMxLT5pQW9mZnNldAotICAgICAgICAgICAgLSAoTTRPU0FfSW50MzIpKHBDLT5wQzEtPmlWb2Zmc2V0ICpwQy0+cEMxLT5zY2FsZV9hdWRpbyArIDAuNSkpCi0gICAgICAgID4gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQWR2YW5jZSBvbmUgQU1SIGZyYW1lICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5Ki8KLSAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC09IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IHN0YXJ0aW5nIHN0YXRlIGZvciB0aGlzIGNsaXAgcHJvY2Vzc2luZyAqLwotICAgIGlmKCBNNFNZU19rTVAzID09IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluIHRoZSBNUDMgY2FzZSB3ZSB1c2UgYSBzcGVjaWFsIGF1ZGlvIHN0YXRlICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QM19KVU1QOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBzdGFydCB3aXRoIHRoZSB2aWRlbyBwcm9jZXNzaW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOwotCi0gICAgICAgIGlmKCBwQy0+VnN0YXRlICE9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGlmIG5vdCBhIHRyYW5zaXRpb24gdGhlbiByZXNldCBwcmV2aW91cyB2aWRlbyBzdGF0ZSAqLwotICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBUaGUgZmxhZ3MgYXJlIHNldCB0byBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGNsaXAgKi8KLSAgICBwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCB2aWRlbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAbm90ZSAgICBJZiB0aGVyZSBpcyBhdWRpbyBvbiB0aGUgY3VycmVudCBjbGlwLCBwcm9jZXNzIGl0LCBlbHNlIHN3aXRjaCB0byB0aGUgbmV4dCBjbGlwCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCwgbm93IHdlIGRvIHRoZSBhdWRpbyAqLwotICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0FVRElPOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcChwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbzogTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCkKLSAqIEBicmllZiAgICBEbyB3aGF0IHRvIGRvIHdoZW4gdGhlIGVuZCBvZiBhIGNsaXAgYXVkaW8gdHJhY2sgaXMgcmVhY2hlZAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW86IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTdGFydCB3aXRoIHRoZSB2aWRlbyAqLwotICAgIGlmKCBNNFNZU19rVmlkZW9Vbmtub3duICE9IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCgpCi0gKiBAYnJpZWYgICAgT3BlbiBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqIGhDbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7IC8qKjwgc2hvcnRjdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQzMiBpQ3RzOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogXCIlc1wiIiwKLSAgICAgICAgKE00T1NBX0NoYXIgKilwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoaENsaXAsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIGlmKCAqaENsaXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgqaENsaXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgc2hvcnRjdXQgKi8KLSAgICBwQ2xpcCA9ICpoQ2xpcDsKLQotICAgIGlmIChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSB7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcyA9ICZwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllczsKLSAgICAgICAgcENsaXAtPnBTZXR0aW5ncyA9IHBDbGlwU2V0dGluZ3M7Ci0gICAgICAgIHBDbGlwLT5pRW5kVGltZSA9IHBDbGlwU2V0dGluZ3MtPnVpRW5kQ3V0VGltZTsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXAsIHBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfRkFMU0UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLSAgICAgICAgKmhDbGlwID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAocENsaXBTZXR0aW5ncy0+RmlsZVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICkgewotICAgICAgICBwQ2xpcFByb3BlcnRpZXMgPSAmcENsaXAtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBwQ2xpcC0+dWlTaWxlbmNlUGNtU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZTsKLSAgICBwQ2xpcC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDbGlwLT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICBwQ2xpcC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgcENsaXAtPnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLQotICAgIHBDbGlwLT5pQXVkaW9GcmFtZUN0cyA9IC1wQ2xpcC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOyAvKiBSZXNldCB0aW1lICovCi0KLSAgICAvKioKLSAgICAqIElmIHRoZSBhdWRpbyB0cmFjayBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQgYXVkaW8gZm9ybWF0LAotICAgICogd2UgcmVtb3ZlIGl0LiBTbyBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHNpbGVuY2UgKi8KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCApCi0gICAgewotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2socENsaXApOwotICAgIH0KLQotICAgIC8qKgotICAgICogQWN0dWFsIGJlZ2luIGN1dCAqLwotICAgIGlmKCAwID09IHBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDbGlwLT5pVm9mZnNldCA9IDA7Ci0gICAgICAgIHBDbGlwLT5pQW9mZnNldCA9IDA7Ci0gICAgICAgIHBDbGlwLT5pQWN0dWFsVmlkZW9CZWdpbkN1dCA9IDA7Ci0gICAgICAgIHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dCA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYocENsaXBTZXR0aW5ncy0+RmlsZVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgIGlmKCBNNFNZU19rVmlkZW9Vbmtub3duICE9IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgdGhlIHZpZGVvIHRvIHRoZSB0YXJnZXQgYmVnaW4gY3V0IHRvIGdldCB0aGUgYWN0dWFsIGJlZ2luIGN1dCB2YWx1ZSAqLwotICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcENsaXBTZXR0aW5ncy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICBpQ3RzID0gcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKHBDbGlwLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwLT5wVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogbV9wRmN0SnVtcChWKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVXBkYXRlIGNsaXAgb2Zmc2V0IHdpdGggdGhlIHZpZGVvIGJlZ2luIGN1dCAqLwotICAgICAgICAgICAgcENsaXAtPmlWb2Zmc2V0ID0gLXBDbGlwLT5pQWN0dWFsVmlkZW9CZWdpbkN1dDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgdGhlIGF1ZGlvIHRvIHRoZSB2aWRlbyBhY3R1YWwgYmVnaW4gY3V0ICovCi0gICAgICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa01QMyAhPSBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgICAgICAgICAgICAgIGlDdHMgPSAoTTRPU0FfSW50MzIpKHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dAotICAgICAgICAgICAgICAgICAgICAqIHBDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDbGlwLCAmaUN0cyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KEEpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgYXVkaW8gYmVnaW4gY3V0ICovCi0gICAgICAgICAgICAgICAgcENsaXAtPmlBb2Zmc2V0ID0gLWlDdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBGb3IgdGhlIE1QMywgdGhlIGp1bXAgaXMgbm90IGRvbmUgYmVjYXVzZSBvZiB0aGUgVkJSLAotICAgICAgICAgICAgICAgICAgaXQgY291bGQgYmUgbm90IGVub3VnaCBhY2N1cmF0ZSAqLwotICAgICAgICAgICAgICAgIHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFNZU19rVmlkZW9Vbmtub3duICE9IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGlmICgocENsaXBTZXR0aW5ncy0+RmlsZVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICkpIHsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFJlYWQgdGhlIGZpcnN0IFZpZGVvIEFVIG9mIHRoZSBjbGlwICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgcENsaXAtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXAtPnBWaWRlb1N0cmVhbSwgJnBDbGlwLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIChhbHJlYWR5ISkgcmVhY2ggdGhlIGVuZCBvZiB0aGUgY2xpcCwgd2UgZmlsdGVyIHRoZSBlcnJvci4KLSAgICAgICAgICAgICAgICAqIEl0IHdpbGwgYmUgY29ycmVjdGx5IG1hbmFnZWQgYXQgdGhlIGZpcnN0IHN0ZXAuICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcCi0gICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoICA9IHBDbGlwUHJvcGVydGllcy0+dWlTdGlsbFBpY1dpZHRoOwotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0ID0gcENsaXBQcm9wZXJ0aWVzLT51aVN0aWxsUGljSGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8qIHN0YXRlIGNoZWNrIG5vdCB0byBhbGxvY2F0ZSBidWZmZXIgZHVyaW5nIHNhdmUgc3RhcnQgKi8KLQotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIFZpZGVvIHJlc2l6ZSBtYW5hZ2VtZW50ICAgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIGlucHV0IGNsaXAgaXMgYSByb3RhdGUgdmlkZW8gb3IgdGhlIG91dHB1dCByZXNvbHV0aW9uIGlzIGRpZmZlcmVudAotICAgICAgICAqIGZyb20gdGhlIGlucHV0IHJlc29sdXRpb24sIHRoZW4gdGhlIHZpZGVvIGZyYW1lIG5lZWRzIHRvIGJlIHJvdGF0ZWQKLSAgICAgICAgKiBvciByZXNpemVkLCBmb3JjZSB0byByZXNpemUgbW9kZSAqLwotICAgICAgICBpZiAoKChNNE9TQV9VSW50MzIpcEMtPmV3Yy51aVZpZGVvV2lkdGggIT0KLSAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGgpIHx8Ci0gICAgICAgICAgICAoKE00T1NBX1VJbnQzMilwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgIT0KLSAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0KSB8fAotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT52aWRlb1JvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0KLSAgICAgICAgICAgIGlmIChwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSB2aWRlbyBwbGFuZSB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgIHJlY2VpdmUgdGhlIGRlY29kZWQgaW1hZ2UgYmVmb3JlIHJlc2l6aW5nICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBQcmVSZXNpemVGcmFtZSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgWSBwbGFuZSAqLwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoICA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoCi0gICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfc3RyaWRlICogcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgVSBwbGFuZSAqLwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoICA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKAotICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3N0cmlkZSAqIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgViBwbGFuZSAqLwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jICgKLSAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9zdHJpZGUgKiBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIHZpZGVvIGlzIGN1cnJlbnRseSBpbiByZWFkaW5nIG1vZGUgKi8KLSAgICAgICAgcENsaXAtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRDsKLSAgICB9Ci0KLSAgICBpZiggKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICAmJiAoTTRWSURFT0VESVRJTkdfa01QMyAhPSBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgZmlyc3QgQXVkaW8gQVUgb2YgdGhlIGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXApOwotCi0gICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIGF1ZGlvIGlzIGN1cnJlbnRseSBpbiByZWFkaW5nIG1vZGUgKi8KLSAgICAgICAgcENsaXAtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRPcGVuQ2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRBdmVyYWdlVmlkZW9CaXRyYXRlKCkKLSAqIEBicmllZiAgICBBdmVyYWdlIGJpdHJhdGUgb2YgdGhlIG91dHB1dCBmaWxlLCBjb21wdXRlZCBmcm9tIGlucHV0IGJpdHJhdGVzLAotICogICAgICAgICAgZHVyYXRpb25zLCB0cmFuc2l0aW9ucyBhbmQgY3V0cy4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ1NfMCwgKnBDU18xLCAqcENTXzI7Ci0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFQwLCAqcFQyOwotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9VSW50MzIgdDBfZHVyYXRpb24sIHQyX2R1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiB0MF9iaXRyYXRlLCB0Ml9iaXRyYXRlOwotICAgIE00T1NBX1VJbnQzMiBjMV9kdXJhdGlvbjsKLQotICAgIE00T1NBX1VJbnQzMiB0b3RhbF9kdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50MzIgdG90YWxfYml0c3VtOwotCi0gICAgdG90YWxfZHVyYXRpb24gPSAwOwotICAgIHRvdGFsX2JpdHN1bSA9IDA7Ci0KLSAgICAvKiBMb29wIG9uIHRoZSBudW1iZXIgb2YgY2xpcHMgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBwQ1NfMSA9ICZwQy0+cENsaXBMaXN0W2ldOwotCi0gICAgICAgIHQwX2R1cmF0aW9uID0gMDsKLSAgICAgICAgdDBfYml0cmF0ZSA9IHBDU18xLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgdDJfZHVyYXRpb24gPSAwOwotICAgICAgICB0Ml9iaXRyYXRlID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotCi0gICAgICAgIC8qIFRyYW5zaXRpb24gd2l0aCB0aGUgcHJldmlvdXMgY2xpcCAqLwotICAgICAgICBpZiggaSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ1NfMCA9ICZwQy0+cENsaXBMaXN0W2kgLSAxXTsKLSAgICAgICAgICAgIHBUMCA9ICZwQy0+cFRyYW5zaXRpb25MaXN0W2kgLSAxXTsKLQotICAgICAgICAgICAgaWYoIHBUMC0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICE9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0MF9kdXJhdGlvbiA9IHBUMC0+dWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICBpZiggcENTXzAtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlID4gdDBfYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0MF9iaXRyYXRlID0gcENTXzAtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRyYW5zaXRpb24gd2l0aCB0aGUgbmV4dCBjbGlwICovCi0gICAgICAgIGlmKCBpIDwgcEMtPnVpQ2xpcE51bWJlciAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ1NfMiA9ICZwQy0+cENsaXBMaXN0W2kgKyAxXTsKLSAgICAgICAgICAgIHBUMiA9ICZwQy0+cFRyYW5zaXRpb25MaXN0W2ldOwotCi0gICAgICAgICAgICBpZiggcFQyLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgIT0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQyX2R1cmF0aW9uID0gcFQyLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ1NfMi0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPiB0Ml9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQyX2JpdHJhdGUgPSBwQ1NfMi0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgZm9yIGN1dCB0aW1lcyAqLwotICAgICAgICBpZiggcENTXzEtPnVpRW5kQ3V0VGltZSA+IDAgKQotICAgICAgICAgICAgYzFfZHVyYXRpb24gPSBwQ1NfMS0+dWlFbmRDdXRUaW1lOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjMV9kdXJhdGlvbiA9IHBDU18xLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotCi0gICAgICAgIGlmKCBwQ1NfMS0+dWlCZWdpbkN1dFRpbWUgPiAwICkKLSAgICAgICAgICAgIGMxX2R1cmF0aW9uIC09IHBDU18xLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICBjMV9kdXJhdGlvbiAtPSB0MF9kdXJhdGlvbiArIHQyX2R1cmF0aW9uOwotCi0gICAgICAgIC8qIENvbXB1dGUgYml0c3VtIGFuZCBkdXJhdGlvbiAqLwotICAgICAgICB0b3RhbF9kdXJhdGlvbiArPSBjMV9kdXJhdGlvbiArIHQwX2R1cmF0aW9uIC8gMiArIHQyX2R1cmF0aW9uIC8gMjsKLQotICAgICAgICB0b3RhbF9iaXRzdW0gKz0KLSAgICAgICAgICAgIGMxX2R1cmF0aW9uICogKHBDU18xLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSAvIDEwMDApCi0gICAgICAgICAgICArICh0MF9iaXRyYXRlIC8gMTAwMCkgKiB0MF9kdXJhdGlvbiAvIDIKLSAgICAgICAgICAgICsgKHQyX2JpdHJhdGUgLyAxMDAwKSAqIHQyX2R1cmF0aW9uIC8gMjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLnVpVmlkZW9CaXRyYXRlID0gKCB0b3RhbF9iaXRzdW0gLyB0b3RhbF9kdXJhdGlvbikgKiAxMDAwOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0QXVkaW8uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDY4ODNkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0VkaXRBdWRpby5jCi0gKiBAYnJpZWYgICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBlZGl0IEFQSSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVyICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLSNkZWZpbmUgUFdSX0ZYUF9GUkFDVF9NQVggICAgICAgICAgICAoMzI3NjgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDICk7Ci1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfVUludDggdWlDbGlwMW9yQ2xpcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9UcmFuc2l0aW9uKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfSW50MTYgKnBQQ01kYXRhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBqdW1waW5nIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcC4KLSAqIEBub3RlICAgIE9uIG9uZSBzdGVwLCB0aGUganVtcCBvZiBzZXZlcmFsIEFVIGlzIGRvbmUKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcCA9IHBDLT5wQzE7IC8qKjwgc2hvcnRjdXQgKi8KLSAgICBNNE9TQV9JbnQzMiBKdW1wQ3RzOwotCi0gICAgSnVtcEN0cyA9IHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dDsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocENsaXAsICZKdW1wQ3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoQSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBKdW1wQ3RzID49IHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dCApCi0gICAgewotICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9NUDM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIGNsaXAgb2Zmc2V0IHdpdGggdGhlIGF1ZGlvIGJlZ2luIGN1dCAqLwotICAgICAgICBwQ2xpcC0+aUFvZmZzZXQgPSAtSnVtcEN0czsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgYXVkaW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBhdWRpbyBwcm9jZXNzaW5nIGZvciB0aGUgTVAzIGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcCA9IHBDLT5wQzE7IC8qKjwgc2hvcnRjdXQgKi8KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIGVyciA9IHBDLT5wT3NhRmlsZVdyaXRQdHItPndyaXRlRGF0YShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBwQ2xpcC0+cEF1ZGlvRnJhbWVQdHIsIChNNE9TQV9VSW50MzIpcENsaXAtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXApOwotCi0gICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIGN1cnJlbnQgdGltZSAodG89dGMrVCkgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvID0KLSAgICAgICAgICAgICggcENsaXAtPmlBdWRpb0ZyYW1lQ3RzICsgcENsaXAtPmlBb2Zmc2V0KSAvIHBDbGlwLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICBpZiggKE00T1NBX0ludDMyKShwQ2xpcC0+aUF1ZGlvRnJhbWVDdHMgLyBwQ2xpcC0+c2NhbGVfYXVkaW8gKyAwLjUpCi0gICAgICAgICAgICA+PSBwQ2xpcC0+aUVuZFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNFJFQURFUl9CdWZmZXIgbXAzdGFnQnVmZmVyOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlIGR1cmF0aW9uIGlzIGJldHRlciByZXNwZWN0ZWQgaWYgdGhlIGZpcnN0IEFVIGFuZCBsYXN0IEFVIGFyZSBib3RoIGFib3ZlCi0gICAgICAgICAgICB0aGUgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5wT3NhRmlsZVdyaXRQdHItPndyaXRlRGF0YShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIHBDbGlwLT5wQXVkaW9GcmFtZVB0ciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgLyogVGhlIElEM3YxIHRhZyBpcyBhbHdheXMgYXQgdGhlIGVuZCBvZiB0aGUgbXAzIGZpbGUgc28gdGhlIGVuZCBvZiB0aGUgY3V0dGluZwotICAgICAgICAgICAgcHJvY2VzcyBpcyB3YWl0ZWQgKi8KLSAgICAgICAgICAgIC8qIGJlZm9yZSB3cml0aW5nIHRoZSBtZXRhZGF0YSBpbiB0aGUgb3V0cHV0IGZpbGUqLwotCi0gICAgICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjEgVGFnICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXAtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfTXAzSWQzdjFUYWcsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZtcDN0YWdCdWZmZXIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBNNE1QM1JfZ2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogV3JpdGUgdGhlIGRhdGEgb2YgdGhlIElEM3YxIFRhZyBpbiB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgICAgIGlmKCAwICE9IG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCltcDN0YWdCdWZmZXIubV9wRGF0YSwgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEZyZWUgYmVmb3JlIHRoZSBlcnJvciBjaGVja2luZyBhbnl3YXkgKi8KLSAgICAgICAgICAgICAgICBmcmVlKG1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRXJyb3IgY2hlY2tpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKElEM3YxVGFnKSByZXR1cm5zIDB4JXgiLCAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBUaGUgRW5kIEN1dCBoYXMgYmVlbiByZWFjaGVkICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzIDogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAmJiAoTTRPU0FfRkFMU0UKLSAgICAgICAgICAgID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkgLyoqPCBSZWFjaGVkIGVuZCBvZiBjbGlwICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbygKLSAgICAgICAgICAgICAgICBwQyk7IC8qKjwgQ2xpcCBkb25lLCBkbyB0aGUgbmV4dCBvbmUgKi8KLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMzogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBhdWRpbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgaW50MzJfdCBhdVRpbWVTdGFtcCA9IC0xOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfQm9vbCBiU3RvcEF1ZGlvOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIGVuZCBjdXQgKi8KLSAgICBpZiggKCBwQy0+ZXdjLmRBVG8gLSBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KQotICAgICAgICA+PSBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBpcyBkb25lIGZvciB0aGlzIGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKHBDKTsKLQotICAgICAgICAvKiBSQzogdG8ga25vdyB3aGVuIGEgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICYmIGVyciAhPSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIEF1ZGlvIE1vZGUsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBvdXRwdXQgQ1RTICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKAotICAgICAgICBwQyk7IC8qKjwgVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIHBDLT5Bc3RhdGUgdmFyaWFibGUhICovCi0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIiAgQVVESU8gc3RlcCA6IGRBVG8gPSAlZiAgc3RhdGUgPSAlZCAgb2Zmc2V0ID0gJWxkIiwKLSAgICAgICAgcEMtPmV3Yy5kQVRvLCBwQy0+QXN0YXRlLCBwQy0+cEMxLT5pQW9mZnNldCk7Ci0KLSAgICBiU3RvcEF1ZGlvID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBzd2l0Y2goIHBDLT5Bc3RhdGUgKQotICAgIHsKLSAgICAgICAgICAgIC8qIF9fX19fX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IFJFQURfV1JJVEUgTU9ERSB8Ki8KLSAgICAgICAgICAgIC8qfF9fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvIFJFQURfV1JJVEUiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86XAotICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIG91dHB1dCBhdWRpbyBDVFMgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQlpaWiBidWcgZml4IChyZWFkLXdyaXRlIGNhc2UpOgotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgZmlyc3QgQU1SIEFVIG9mIHRoZSBzdHJlYW0gd2l0aCBhIHNpbGVuY2UgQVUuCi0gICAgICAgICAgICAgICAgKiBJdCByZW1vdmVzIGFubm95aW5nICJCWlpaIiBhdWRpbyBnbGl0Y2guCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGlmIHRoZXJlIGlzIGEgYmVnaW4gY3V0LgotICAgICAgICAgICAgICAgICogSXQgaXMgbm90IG5lZWRlZCBmb3IgdGhlIGZpcnN0IGNsaXAuCi0gICAgICAgICAgICAgICAgKiBCZWNhdXNlIG9mIGFub3RoZXIgYnVnZml4ICgyMDA1LTAzLTI0KSwgdGhlIGZpcnN0IEFVIHdyaXR0ZW4gbWF5IGJlCi0gICAgICAgICAgICAgICAgKiB0aGUgc2Vjb25kIG9uZSB3aGljaCBDVFMgaXMgMjAuIEhlbmNlIHRoZSBjdHM8MjEgdGVzdC4KLSAgICAgICAgICAgICAgICAqICh0aGUgQlpaWiBlZmZlY3Qgb2NjdXJzIGV2ZW4gd2l0aCB0aGUgc2Vjb25kIEFVISkgKi8KLSAgICAgICAgICAgICAgICBpZiggKCBNNE9TQV9GQUxTRSA9PSBwQy0+cEMxLT5iRmlyc3RBdVdyaXR0ZW4pCi0gICAgICAgICAgICAgICAgICAgICYmICgwICE9IHBDLT51aUN1cnJlbnRDbGlwKSAmJiAocEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgPCAocEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKyAxKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQ29weSBhIHNpbGVuY2UgQVUgdG8gdGhlIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkEgIyMjIyBzaWxlbmNlIEFVIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIChNNE9TQV9VSW50MzIpcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZQotICAgICAgICAgICAgICAgICAgICA8IHBDLT5ld2MudWlBdWRpb01heEF1U2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBBVSB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogUkVBRF9XUklURTogQVUgc2l6ZSBncmVhdGVyIHRoYW4gTWF4QXVTaXplIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICglZD4lZCkhIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplLCBwQy0+ZXdjLnVpQXVkaW9NYXhBdVNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgb25seSB1c2VkIHRvIGZpeCB0aGUgQlpaIGJ1Zy4uLiAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbiA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigiQiAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKjExLzEyLzIwMDggQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZpZGVvQXJ0aXN0Ci0gICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZQotICAgICAgICAgICAgICAgICAgICBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwKLSAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFEX1dSSVRFOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEF1ZGlvIGlzIG5vdyBpbiByZWFkIG1vZGUgKHRoZXJlIG1heSBiZSBhICJpZihzdGF0dXMhPVJFQUQpIiBoZXJlLAotICAgICAgICAgICAgICAgIGJ1dCBpdCBpcyByZW1vdmVkIGZvciBvcHRpbWl6YXRpb24pICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQyAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gPSAoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX0ZBTFNFID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIElmIG91dHB1dCBpcyBvdGhlciB0aGFuIEFNUiBvciBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIEVWUkMsd2UgY2FuJ3Qgd3JpdGUgc2lsZW5jZSBpbnRvIGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBTbyB3ZSBzaW1wbHkgZW5kIGhlcmUuKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIF9fX19fX19fX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IERFQ09ERV9FTkNPREUgTU9ERSB8Ki8KLSAgICAgICAgICAgIC8qfF9fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX0RFQ09ERV9FTkNPREU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvIERFQ09ERV9FTkNPREUiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCBhIGZldyBBVSBiYWNrd2FyZCB0byBkZWNvZGUvZW5jb2RlCi0gICAgICAgICAgICAgICAgKHdpdGhvdXQgd3JpdGluZyByZXN1bHQpIGZyb20gdGhhdCBwb2ludC4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgPT0gcEMtPnBDMS0+QXN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpVGFyZ2V0Q3RzLCBpQ3VycmVudEN0czsKLQotICAgICAgICAgICAgICAgICAgICBpZiggMAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gcEMtPnBDMS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQXVkaW9GcmFtZUN0cyApIC8qKjxkb24ndCB0cnkgdG8gcHJlLWRlY29kZSBpZiBjbGlwIGlzIGF0IGl0cyBiZWdpbm5pbmcuICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaUN1cnJlbnRDdHMgPSBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSBpQ3VycmVudEN0cyAtIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpVGFyZ2V0Q3RzIDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IDA7IC8qKjwgU2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBDMSwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEpOyAvKio8IHJlYWQgQVUgd2hlcmUgd2UganVtcGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJEIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUaW1lRGVsdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAvIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRSAqKioqIHByZS1lbmNvZGUiKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFBDTSBidWZmZXIgZm9yIGV2ZXJ5IGRlY29kZVN0ZXAgY2FsbC4qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAuIEluIHRoaXMgY2FzZSBkb25vdCBjYWxsIGVuY29kZSBTdGVwKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy9pZigwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdKQotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGltZXN0YW1wIG9mIGxhc3QgcmVhZCBBVQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1Q1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmF1VGltZVN0YW1wKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdVRpbWVTdGFtcCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgYXVkaW8gdGltZXN0YW1wIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPSBhdVRpbWVTdGFtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IE9LIGZvciBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgaW5wdXQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+cEF1ZGlvRnJhbWVQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRpbWVzdGFtcCBvZiBsYXN0IHJlYWQgQVUKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdUNUUywKLSAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZhdVRpbWVTdGFtcCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXVUaW1lU3RhbXAgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBpbnZhbGlkIGF1ZGlvIFwKLSAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCByZXR1cm5lZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfSU5WQUxJRF9USU1FOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzID0gYXVUaW1lU3RhbXA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KHBDLCAxLCAoTTRPU0FfSW50MTYKLSAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50RW5kQXVkaW9FZmZlY3QgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29tcHV0ZSBvdXRwdXQgYXVkaW8gQ1RTICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBNYXkgaGFwcGVuIHdpdGggY29ycnVwdGVkIGlucHV0IGZpbGVzICh3aGljaCBoYXZlIHN0dHMgZW50cmllcyBub3QKLSAgICAgICAgICAgICAgICBtdWx0aXBsZSBvZiBTaWxlbmNlRnJhbWVEdXJhdGlvbikgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA8IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCWlpaIGJ1ZyBmaXggKGRlY29kZS1lbmNvZGUgY2FzZSk6Ci0gICAgICAgICAgICAgICAgKiAoWWVzLCB0aGUgQnp6IGJ1ZyBtYXkgYWxzbyBvY2N1ciB3aGVuIHdlIHJlLWVuY29kZS4gSXQgZG9lc24ndAotICAgICAgICAgICAgICAgICogIG9jY3VyIGF0IHRoZSBkZWNvZGUgYmVmb3JlIHRoZSBlbmNvZGUsIGJ1dCBhdCB0aGUgcGxheWJhY2shKQotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgZmlyc3QgQU1SIEFVIG9mIHRoZSBlbmNvZGVkIHN0cmVhbSB3aXRoIGEgc2lsZW5jZSBBVS4KLSAgICAgICAgICAgICAgICAqIEl0IHJlbW92ZXMgYW5ub3lpbmcgIkJaWloiIGF1ZGlvIGdsaXRjaC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgaWYgdGhlcmUgaXMgYSBiZWdpbiBjdXQuCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGZvciB0aGUgZmlyc3QgY2xpcC4KLSAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugb2YgYW5vdGhlciBidWdmaXggKDIwMDUtMDMtMjQpLCB0aGUgZmlyc3QgQVUgd3JpdHRlbiBtYXkgYmUKLSAgICAgICAgICAgICAgICAqIHRoZSBzZWNvbmQgb25lIHdoaWNoIENUUyBpcyAyMC4gSGVuY2UgdGhlIGN0czwyMSB0ZXN0LgotICAgICAgICAgICAgICAgICogKHRoZSBCWlpaIGVmZmVjdCBvY2N1cnMgZXZlbiB3aXRoIHRoZSBzZWNvbmQgQVUhKSAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgKDAgIT0gcEMtPnVpQ3VycmVudENsaXApICYmIChwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiArIDEpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBTVIgQVUgdG8gdGhlIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkcgIyMjIyBzaWxlbmNlIEFVIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgZmlsdGVyZWQgUENNIGF1ZGlvIGRpcmVjdGx5IGludG8gdGhlIG91dHB1dCBBVSAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAvIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkggKysrKyBlbmNvZGUgQVUiKTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICogT01YIEF1ZGlvIGRlYyBzaGVsbCBkb2VzIGludGVybmFsIGJ1ZmZlcmluZyBhbmQgaGVuY2UgZG9lcyBub3QgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAuIEluIHRoaXMgY2FzZSBkb25vdCBjYWxsIGVuY29kZSBTdGVwKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggMCAhPSBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSApCi0gICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogU2V0IEFVIHNpemUgKi8KLQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAgICAgICAgIDBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJJIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwKLSAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJKIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZEFUbyA9ICggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSWYgb3V0cHV0IGlzIG90aGVyIHRoYW4gQU1SIG9yIEFBQwotICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gRVZSQyx3ZSBjYW4ndCB3cml0ZSBzaWxlbmNlIGludG8gaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgVFJBTlNJVElPTiBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gVFJBTlNJVElPTiIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgcmVhZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIGEgZmV3IEFVIGJhY2t3YXJkIHRvIGRlY29kZS9lbmNvZGUKLSAgICAgICAgICAgICAgICAod2l0aG91dCB3cml0aW5nIHJlc3VsdCkgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQy0+cEMxLT5Bc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMxLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlBdWRpb0ZyYW1lQ3RzICkgLyoqPGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4qLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhIGZldyBBVXMgYmFja3dhcmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDdXJyZW50Q3RzID0gcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gaUN1cnJlbnRDdHMgLSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggaVRhcmdldEN0cyA8IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSAwOyAvKio8IFNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wQzEsICZpVGFyZ2V0Q3RzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxKTsgLyoqPCByZWFkIEFVIHdoZXJlIHdlIGp1bXBlZCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiSyAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTi1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKGEpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNvZGUvZW5jb2RlIHVwIHRvIHRoZSB3YW50ZWQgcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyA8IGlDdXJyZW50Q3RzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUaW1lRGVsdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAvIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTCAqKioqIHByZS1lbmNvZGUiKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFBDTSBidWZmZXIgZm9yIGV2ZXJ5IGRlY29kZVN0ZXAgY2FsbC4qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAuIEluIHRoaXMgY2FzZSBkb25vdCBjYWxsIGVuY29kZSBTdGVwKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTi1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IE9LIGZvciBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgZmlyc3QgaW5wdXQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoQzEpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBzZWNvbmQgaW5wdXQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoQzIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBkZWNvZGVkIHRoZSBzYW1lIGFtb3VudCBvZiBQQ00gc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAgICAgIT0gcEMtPnBDMi0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIkVSUiA6IEF1ZGlvVHJhbnNpdGlvbjogYm90aCBjbGlwcyBBVSBtdXN0IGhhdmUgdGhlIHNhbWUgZGVjb2RlZFwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBDTSBzaXplISBwYzEgc2l6ZT0weCV4LCBwQzIgc2l6ZSA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICAgICAgLypPTVggQXVkaW8gZGVjb2RlciB1c2VkLgotICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICBhIFBDTSBidWZmZXIgZm9yIGV2ZXJ5IGRlY29kZVN0ZXAgY2FsbC4qCi0gICAgICAgICAgICAgICAgICAgICogU28gUENNIGJ1ZmZlciBzaXplcyBtaWdodCBiZSAwIG9yIGRpZmZlcmVudCBmb3IgY2xpcDEgYW5kIGNsaXAyLgotICAgICAgICAgICAgICAgICAgICAqIFNvIG5vIG5lZWQgdG8gcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSAqLwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiAsIHBjMSBBdWRCdWZmIHNpemU9MHgleCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMyIEF1ZEJ1ZmYgc2l6ZSA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFOwotCi0jZW5kaWYgLy8gTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBhdWRpbyBlZmZlY3Qgb24gY2xpcDEgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KHBDLCAxLCAoTTRPU0FfSW50MTYKLSAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdChDMSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGF1ZGlvIGVmZmVjdCBvbiBjbGlwMiAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDIsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KEMyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgdHJhbnNpdGlvbiBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9UcmFuc2l0aW9uKHBDLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJOICoqKiogYmxlbmQgQVVzIik7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICBhIFBDTSBidWZmZXIgZm9yIGV2ZXJ5IGRlY29kZVN0ZXAgY2FsbC4qCi0gICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAuIEluIHRoaXMgY2FzZSBkb25vdCBjYWxsIGVuY29kZSBTdGVwKi8KLQotICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTICs9IGZyYW1lVGltZURlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJPIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKjExLzEyLzIwMDggQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZpZGVvQXJ0aXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiUCAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgc2Vjb25kYXJ5RXJyb3I7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvID0gKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lIGluIHRoZSBzZWNvbmQgY2xpcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RXJyb3IgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIlEgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCAvIHBDLT5wQzItPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKHNlY29uZGFyeUVycm9yKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKEMyKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RXJyb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00V0FSX05PX01PUkVfQVUgPT0gc2Vjb25kYXJ5RXJyb3IpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBvdXRwdXQgaXMgb3RoZXIgdGhhbiBBTVIgb3IgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBFVlJDLHdlIGNhbid0IHdyaXRlIHNpbGVuY2UgaW50byBpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBFUlJPUiBDQVNFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19ffCovCi0KLSAgICAgICAgZGVmYXVsdDoKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBpbnZhbGlkIGludGVybmFsIHN0YXRlICgweCV4KSwgXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+QXN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIGZvcmNlZCB0byBzdG9wIGF1ZGlvICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gYlN0b3BBdWRpbyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBpcyBkb25lIGZvciB0aGlzIGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCBhdWRpbyBwcm9jZXNzIG1vZGUgd2UgbXVzdCB1c2UsIGRlcGVuZGluZyBvbiB0aGUgb3V0cHV0IENUUy4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBjb25zdCBNNE9TQV9JbnQzMiBURCA9IHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICB1aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbjsgLyoqPCBUcmFuc2l0aW9uIGR1cmF0aW9uICovCi0KLSAgICBjb25zdCBNNFZTUzNHUFBfRWRpdEF1ZGlvU3RhdGUgcHJldmlvdXNBc3RhdGUgPSBwQy0+QXN0YXRlOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBDbGlwMSBpcyBvbiBpdHMgYmVnaW4gY3V0LCBvciBpbiBpdHMgYmVnaW4gZWZmZWN0IG9yIGVuZCBlZmZlY3Qgem9uZSAqLwotICAgIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyhwQywgMSk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiB3aXRoIG5leHQgY2xpcCAqLwotICAgIGlmKCAoIFREID4gMCkgJiYgKChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvIC0gcEMtPnBDMS0+aUFvZmZzZXQKLSAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbyArIDAuNSkgPj0gKHBDLT5wQzEtPmlFbmRUaW1lIC0gVEQpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBhcmUgaW4gYSB0cmFuc2l0aW9uICovCi0gICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1RSQU5TSVRJT047Ci0gICAgICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRG8gd2UgZW50ZXIgdGhlIHRyYW5zaXRpb24gc2VjdGlvbiA/ICovCi0gICAgICAgIGlmKCBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1RSQU5TSVRJT04gIT0gcHJldmlvdXNBc3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3BlbiBzZWNvbmQgY2xpcCBmb3IgdHJhbnNpdGlvbiwgaWYgbm90IHlldCBvcGVuZWQgKi8KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wQzIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzIsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W3BDLT51aUN1cnJlbnRDbGlwICsgMV0pOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTogTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW4gY2FzZSBvZiBzaG9ydCB0cmFuc2l0aW9uIGFuZCBiYWQgbHVjayAoLi4uKSwgdGhlcmUgbWF5IGJlIG5vIHZpZGVvIEFVCi0gICAgICAgICAgICAgICAgKiBpbiB0aGUgdHJhbnNpdGlvbi4gSW4gdGhhdCBjYXNlLCB0aGUgc2Vjb25kIGNsaXAgaGFzIG5vdCBiZWVuIG9wZW5lZC4KLSAgICAgICAgICAgICAgICAqIFNvIHdlIG11c3QgdXBkYXRlIHRoZSB2aWRlbyBvZmZzZXQgaGVyZS4gKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIC8qKjwgQWRkIGN1cnJlbnQgdmlkZW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMyLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQWRkIGN1cnJlbnQgYXVkaW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCBvZmZzZXQKLSAgICAgICAgICAgICogKHZpZGVvIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIHNldCB3aGVuIGRvaW5nIHRoZSB2aWRlbyB0cmFuc2l0aW9uKSAqLwotICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgKz0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIDIwMDUtMDMtMjQ6IEJ1Z0ZpeCBmb3IgYXVkaW8tdmlkZW8gc3luY2hybzoKLSAgICAgICAgICAgICogVGhlcmUgbWF5IGJlIGEgcG9ydGlvbiBvZiB0aGUgZHVyYXRpb24gb2YgYW4gYXVkaW8gQVUgb2YgZGVzeW5jaHJvIGF0IGVhY2ggYXNzZW1ibHkuCi0gICAgICAgICAgICAqIEl0IGxlYWRzIHRvIGFuIGF1ZGlibGUgZGVzeW5jaHJvIHdoZW4gdGhlcmUgYXJlIGEgbG90IG9mIGNsaXBzIGFzc2VtYmxlZC4KLSAgICAgICAgICAgICogVGhpcyBidWcgZml4IGFsbG93cyB0byByZXN5bmNoIHRoZSBhdWRpbyB0cmFjayB3aGVuIHRoZSBkZWx0YSBpcyBoaWdoZXIKLSAgICAgICAgICAgICogdGhhbiBvbmUgYXVkaW8gQVUgZHVyYXRpb24uCi0gICAgICAgICAgICAqIFdlIFN0ZXAgb25lIEFVIGluIHRoZSBzZWNvbmQgY2xpcCBhbmQgd2UgY2hhbmdlIHRoZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkuICovCi0gICAgICAgICAgICBpZiggKCBwQy0+cEMyLT5pQW9mZnNldAotICAgICAgICAgICAgICAgIC0gKE00T1NBX0ludDMyKShwQy0+cEMyLT5pVm9mZnNldCAqcEMtPnBDMi0+c2NhbGVfYXVkaW8gKyAwLjUpKQotICAgICAgICAgICAgICAgICAgICA+IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFkdmFuY2Ugb25lIEFNUiBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIlogLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBb2Zmc2V0IC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVXBkYXRlIGF1ZGlvIG9mZnNldCBhY2NvcmRpbmdseSovCi0gICAgICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgLT0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBiZWdpbiBhbmQgZW5kIGVmZmVjdHMgZm9yIGNsaXAyICovCi0gICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyhwQywgMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBub3QgaW4gYSB0cmFuc2l0aW9uICovCi0gICAgICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGlmIGN1cnJlbnQgbW9kZSBpcyBSZWFkL1dyaXRlIG9yIERlY29kZS9FbmNvZGUgKi8KLSAgICAgICAgaWYoIHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QgPj0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+QXN0YXRlID0gTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBjcmVhdGUvZGVzdHJveSBhbiBlbmNvZGVyICovCi0gICAgaWYoICggTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFID09IHByZXZpb3VzQXN0YXRlKQotICAgICAgICAmJiAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAoTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFICE9IHBDLT5Bc3RhdGUpICkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpQXVkaW9CaXRyYXRlOwotCi0gICAgICAgIC8qIENvbXB1dGUgbWF4IGJpdHJhdGUgZGVwZW5kaW5nIG9uIGlucHV0IGZpbGVzIGJpdHJhdGVzIGFuZCB0cmFuc2l0aW9ucyAqLwotICAgICAgICBpZiggcEMtPkFzdGF0ZSA9PSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1RSQU5TSVRJT04gKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBNYXggb2YgdGhlIHR3byBibGVuZGVkIGZpbGVzICovCi0gICAgICAgICAgICBpZiggcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID4gcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSApCi0gICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQzItPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTYW1lIGFzIGlucHV0IGZpbGUgKi8KLSAgICAgICAgICAgIHVpQXVkaW9CaXRyYXRlID0gcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGU6IE00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cygpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggYXVkaW8gZWZmZWN0IG11c3QgYmUgYXBwbGllZCBhdCB0aGUgY3VycmVudCB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApCi17Ci0gICAgTTRPU0FfVUludDggdWlDbGlwSW5kZXg7Ci0gICAgTTRPU0FfVUludDggdWlGeEluZGV4OwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIgQkMsIEVDOwotICAgIE00T1NBX0ludDggKnBpQ2xpcEFjdGl2ZUVmZmVjdDsKLSAgICBNNE9TQV9JbnQzMiB0OwotCi0gICAgaWYoIDEgPT0gdWlDbGlwTnVtYmVyICkKLSAgICB7Ci0gICAgICAgIHVpQ2xpcEluZGV4ID0gcEMtPnVpQ3VycmVudENsaXA7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcGlDbGlwQWN0aXZlRWZmZWN0ID0gJihwQy0+aUNsaXAxQWN0aXZlRWZmZWN0KTsKLSAgICB9Ci0gICAgZWxzZSAvKio8ICgyID09IHVpQ2xpcE51bWJlcikgKi8KLSAgICB7Ci0gICAgICAgIHVpQ2xpcEluZGV4ID0gcEMtPnVpQ3VycmVudENsaXAgKyAxOwotICAgICAgICBwQ2xpcCA9IHBDLT5wQzI7Ci0gICAgICAgIHBpQ2xpcEFjdGl2ZUVmZmVjdCA9ICYocEMtPmlDbGlwMkFjdGl2ZUVmZmVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTaG9ydGN1dHMgZm9yIGNvZGUgcmVhZGFiaWxpdHkgKi8KLSAgICBCQyA9IHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dDsKLSAgICBFQyA9IHBDbGlwLT5pRW5kVGltZTsKLQotICAgIC8qKgotICAgIENoYW5nZSB0aGUgYWJzb2x1dCB0aW1lIHRvIGNsaXAgcmVsYXRlZCB0aW1lCi0gICAgIFJDIHQgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAtIHBDbGlwLT5pQW9mZnNldC9wQ2xpcC0+c2NhbGVfYXVkaW8gKyAwLjUpOwotICAgIDwgcm91bmRpbmcgKi87Ci0gICAgdCA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvLyotIHBDbGlwLT5pQW9mZnNldC9wQ2xpcC0+c2NhbGVfYXVkaW8qLwotICAgICAgICArIDAuNSk7IC8qKjwgcm91bmRpbmcgKi8KLSAgICA7Ci0KLSAgICAvKioKLSAgICAqIERlZmF1bHQ6IG5vIGVmZmVjdCBhY3RpdmUgKi8KLSAgICAqcGlDbGlwQWN0aXZlRWZmZWN0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoZSB0aHJlZSBlZmZlY3RzICovCi0gICAgLy8gUkMgICAgZm9yICh1aUZ4SW5kZXg9MDsgdWlGeEluZGV4PHBDLT5wQ2xpcExpc3RbdWlDbGlwSW5kZXhdLm5iRWZmZWN0czsgdWlGeEluZGV4KyspCi0gICAgZm9yICggdWlGeEluZGV4ID0gMDsgdWlGeEluZGV4IDwgcEMtPm5iRWZmZWN0czsgdWlGeEluZGV4KysgKQotICAgIHsKLSAgICAgICAgLyoqIFNob3J0Y3V0LCByZXZlcnNlIG9yZGVyIGJlY2F1c2Ugb2YgcHJpb3JpdHkgYmV0d2VlbiBlZmZlY3RzCi0gICAgICAgICggRW5kRWZmZWN0IGFsd2F5cyBjbGVhbiApICovCi0gICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+bmJFZmZlY3RzIC0gMSAtIHVpRnhJbmRleF0pOwotCi0gICAgICAgIGlmKCBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lICE9IHBGeC0+QXVkaW9FZmZlY3RUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENoZWNrIGlmIHRoZXJlIGlzIGFjdHVhbGx5IGEgdmlkZW8gZWZmZWN0ICovCi0gICAgICAgICAgICBpZiggKCB0ID49IChNNE9TQV9JbnQzMikoLypCQyArKi9wRngtPnVpU3RhcnRUaW1lKSkKLSAgICAgICAgICAgICAgICAmJiAvKio8IEFyZSB3ZSBhZnRlciB0aGUgc3RhcnQgdGltZSBvZiB0aGUgZWZmZWN0PyAqLwotICAgICAgICAgICAgICAgICh0IDwgKE00T1NBX0ludDMyKSgvKkJDICsqL3BGeC0+dWlTdGFydFRpbWUgKyBwRngtPgotICAgICAgICAgICAgICAgIHVpRHVyYXRpb24pKSApIC8qKjwgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgICpwaUNsaXBBY3RpdmVFZmZlY3QgPSBwQy0+bmJFZmZlY3RzIC0gMSAtIHVpRnhJbmRleDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVGhlIGZpcnN0IGVmZmVjdCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIHRoZW4gdGhlIHNlY29uZCBvbmUsCi0gICAgICAgICAgICAgICAgICB0aGVuIHRoZSB0aGlycyBvbmUuCi0gICAgICAgICAgICAgICAgKiBIZW5jZSwgYXMgc29vbiBhcyB3ZSBmb3VuZCBhbiBhY3RpdmUgZWZmZWN0LCB3ZSBjYW4gZ2V0IG91dCBvZiB0aGlzIGxvb3AgKi8KLSAgICAgICAgICAgICAgICB1aUZ4SW5kZXggPSBwQy0+bmJFZmZlY3RzOyAvKiogZ2V0IG91dCBvZiB0aGUgZm9yIGxvb3AgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBCdWdmaXg6IFRoZSBkdXJhdGlvbiBvZiB0aGUgZW5kIGVmZmVjdCBoYXMgYmVlbiBzZXQgYWNjb3JkaW5nIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgIGFubm91bmNlZCBjbGlwIGR1cmF0aW9uLgotICAgICAgICAgICAgKiBJZiB0aGUgYW5ub3VuY2VkIGR1cmF0aW9uIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVhbCBvbmUsIHRoZSBlbmQgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgd29uJ3QgYmUgYXBwbGllZCBhdAotICAgICAgICAgICAgKiB0aGUgdmVyeSBlbmQgb2YgdGhlIGNsaXAuIFRvIHNvbHZlIHRoaXMgaXNzdWUgd2UgZm9yY2UgdGhlIGVuZCBlZmZlY3QuICovCi0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCB0byBwUENNZGF0YQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgIHVpQ2xpcDFvckNsaXAyICAgIChJTi9PVVQpIDEgZm9yIGZpcnN0IGNsaXAsIDIgZm9yIHNlY29uZCBjbGlwCi0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXAxb3JDbGlwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICkKLXsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3M7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIKLSAgICAgICAgaTMyc2FtcGxlOyAvKio8IHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpUG9zOwotICAgIE00T1NBX0ludDMyIGlEdXI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKCAxICE9IHVpQ2xpcDFvckNsaXAyKSAmJiAoMiAhPSB1aUNsaXAxb3JDbGlwMiksCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRCZWdpbkF1ZGlvRWZmZWN0OiB1aUNsaXAxb3JDbGlwMiBpbnZhbGlkIik7Ci0KLSAgICBpZiggMSA9PSB1aUNsaXAxb3JDbGlwMiApCi0gICAgewotICAgICAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MgPSAmKHBDLT5wQ2xpcExpc3RbcEMtPgotICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0pOyAvKio8IEdldCBhIHNob3J0Y3V0IHRvIHRoZSBjbGlwIHNldHRpbmdzICovCi0gICAgICAgIC8vIFJDICAgICAgICBwRnggPSAmKHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdF0pOy8qKjwgR2V0IGEgc2hvcnRjdXQKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+Ci0gICAgICAgICAgICBwRWZmZWN0c0xpc3RbcEMtPgotICAgICAgICAgICAgaUNsaXAxQWN0aXZlRWZmZWN0XSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYyKCggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA8IDApCi0gICAgICAgICAgICB8fCAocEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+IDIpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3Q6IGlDbGlwMUFjdGl2ZUVmZmVjdCBpbnZhbGlkIik7Ci0gICAgfQotICAgIGVsc2UgLyoqPCBpZiAoMj09dWlDbGlwMW9yQ2xpcDIpICovCi0gICAgewotICAgICAgICBwQ2xpcCA9IHBDLT5wQzI7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MgPSAmKHBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICsgMV0pOyAvKio8IEdldCBhIHNob3J0Y3V0IHRvIHRoZSBjbGlwIHNldHRpbmdzICovCi0gICAgICAgIC8vIFJDICAgICAgICBwRnggPSAmKHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbcEMtPmlDbGlwMkFjdGl2ZUVmZmVjdF0pOy8qKjwgR2V0IGEgc2hvcnRjdXQKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+Ci0gICAgICAgICAgICBwRWZmZWN0c0xpc3RbcEMtPgotICAgICAgICAgICAgaUNsaXAyQWN0aXZlRWZmZWN0XSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYyKCggcEMtPmlDbGlwMkFjdGl2ZUVmZmVjdCA8IDApCi0gICAgICAgICAgICB8fCAocEMtPmlDbGlwMkFjdGl2ZUVmZmVjdCA+IDIpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3Q6IGlDbGlwMkFjdGl2ZUVmZmVjdCBpbnZhbGlkIik7Ci0gICAgfQotCi0gICAgaUR1ciA9IChNNE9TQV9JbnQzMilwRngtPnVpRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVmZmVjdCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLgotICAgICogSXQgaXMgZG9uZSB3aXRoIGludGVnZXJzIGJlY2F1c2UgdGhlIG9mZnNldCBhbmQgYmVnaW4gY3V0IGhhdmUgYmVlbiByb3VuZGVkIGFscmVhZHkuICovCi0gICAgaVBvcyA9Ci0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICsgMC41IC0gcENsaXAtPmlBb2Zmc2V0IC8gcENsaXAtPnNjYWxlX2F1ZGlvKQotICAgICAgICAtIHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dCAtIHBGeC0+dWlTdGFydFRpbWU7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCBpUG9zID4gaUR1ciApCi0gICAgewotICAgICAgICBpUG9zID0gaUR1cjsKLSAgICB9Ci0gICAgZWxzZSBpZiggaVBvcyA8IDAgKQotICAgIHsKLSAgICAgICAgaVBvcyA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdCB0aGlzIHBvaW50LCBpUG9zIGlzIHRoZSBlZmZlY3QgcHJvZ3Jlc3MsIGluIGEgMCB0byBpRHVyIGJhc2UgKi8KLSAgICBzd2l0Y2goIHBGeC0+QXVkaW9FZmZlY3RUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZUluOgotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgICAgICAgICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTG9vcCBvbiBzYW1wbGVzICovCi0gICAgICAgICAgICB3aGlsZSggdWlQQ01zaXplLS0gPiAwICkgLyoqPCBkZWNyZW1lbnRpbmcgdG8gb3B0aW1pemUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlICo9IGlQb3M7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlIC89IGlEdXI7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX0ZhZGVPdXQ6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBzd2l0Y2ggZnJvbSAwLT5EdXIgdG8gRHVyLT4wIGluIG9yZGVyIHRvIGRvIGZhZGVPVVQgaW5zdGVhZCBvZiBmYWRlSU4gKi8KLSAgICAgICAgICAgIGlQb3MgPSBpRHVyIC0gaVBvczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE9yaWdpbmFsIHNhbXBsZXMgYXJlIHNpZ25lZCAxNmJpdHMuCi0gICAgICAgICAgICAqIFdlIGNvbnZlcnQgaXQgdG8gc2lnbmVkIDMyYml0cyBhbmQgbXVsdGlwbHkgaXQgYnkgaVBvcy4KLSAgICAgICAgICAgICogU28gd2UgbXVzdCBhc3N1cmUgdGhhdCBpUG9zIGlzIG5vdCBoaWdoZXIgdGhhdCAxNmJpdHMgbWF4LgotICAgICAgICAgICAgKiBpUG9zIG1heCB2YWx1ZSBpcyBpRHVyLCBzbyB3ZSB0ZXN0IGlEdXIuICovCi0gICAgICAgICAgICB3aGlsZSggaUR1ciA+IFBXUl9GWFBfRlJBQ1RfTUFYICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpRHVyID4+PQotICAgICAgICAgICAgICAgICAgICAyOyAvKio8IGRpdmlkZSBieSAyIHdvdWxkIGJlIG1vcmUgbG9naWNhbCAoaW5zdGVhZCBvZiA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgYnV0IHdlIGhhdmUgZW5vdWdoIGR5bmFtaWMuLikgKi8KLSAgICAgICAgICAgICAgICBpUG9zID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICAgICAgICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExvb3Agb24gc2FtcGxlcywgYXBwbHkgdGhlIGZhZGUgZmFjdG9yIG9uIGVhY2ggKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyBjb3VudGVyIHRvIG9wdGltaXplICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlID0gKnBQQ01kYXRhOwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSAqPSBpUG9zOwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSAvPSBpRHVyOwotICAgICAgICAgICAgICAgICpwUENNZGF0YSsrID0gKE00T1NBX0ludDE2KWkzMnNhbXBsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogdW5rbm93biBhdWRpbyBlZmZlY3QgdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUiLAotICAgICAgICAgICAgICAgIHBGeC0+QXVkaW9FZmZlY3RUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3Q6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oKQotICogQGJyaWVmICAgIEFwcGx5IHRyYW5zaXRpb24gZWZmZWN0IHRvIHR3byBQQ00gYnVmZmVyCi0gKiBAbm90ZSAgICBUaGUgcmVzdWx0IG9mIHRoZSB0cmFuc2l0aW9uIGlzIHB1dCBpbiB0aGUgZmlyc3QgYnVmZmVyLgotICogICAgICAgICAgSSBrbm93IGl0J3Mgbm90IGJlYXV0aWZ1bCwgYnV0IGl0IGZpdHMgbXkgY3VycmVudCBuZWVkcywgYW5kIGl0J3MgZWZmaWNpZW50IQotICogICAgICAgICAgU28gd2h5IGJvdGhlciB3aXRoIGEgdGhpcmQgb3V0cHV0IGJ1ZmZlcj8KLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGExICAgIChJTi9PVVQpIEZpcnN0IGlucHV0IGFuZCBPdXRwdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICBwUENNZGF0YTIgICAgKElOKSBTZWNvbmQgaW5wdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICB1aVBDTXNpemUgICAgKElOKSBTaXplIG9mIGJvdGggUENNIGJ1ZmZlcnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9JbnQxNiAqcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApCi17Ci0gICAgTTRPU0FfSW50MzIgaTMyc2FtcGxlMSwKLSAgICAgICAgaTMyc2FtcGxlMjsgLyoqPCB3ZSB3aWxsIGNhc3QgZWFjaCBJbnQxNiBzYW1wbGUgaW50byB0aGlzIEludDMyIHZhcmlhYmxlICovCi0gICAgTTRPU0FfSW50MzIgaVBvczEsIGlQb3MyOwotICAgIE00T1NBX0ludDMyIGlEdXIgPSAoTTRPU0FfSW50MzIpcEMtPgotICAgICAgICBwVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgZW5kIGN1dCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLgotICAgICogSXQgaXMgZG9uZSB3aXRoIGludGVnZXJzIGJlY2F1c2UgdGhlIG9mZnNldCBhbmQgYmVnaW4gY3V0IGhhdmUgYmVlbiByb3VuZGVkIGFscmVhZHkuICovCi0gICAgaVBvczEgPSBwQy0+cEMxLT5pRW5kVGltZSAtIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvCi0gICAgICAgICsgMC41IC0gcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbyk7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCBpUG9zMSA+IGlEdXIgKQotICAgIHsKLSAgICAgICAgaVBvczEgPSBpRHVyOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUG9zMSA8IDAgKQotICAgIHsKLSAgICAgICAgaVBvczEgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICogUG9zaXRpb24gb2Ygc2Vjb25kIGNsaXAgaW4gdGhlIHRyYW5zaXRpb24gKi8KLSAgICBpUG9zMiA9IGlEdXIgLSBpUG9zMTsKLQotICAgIC8qKgotICAgICogQXQgdGhpcyBwb2ludCwgaVBvczIgaXMgdGhlIHRyYW5zaXRpb24gcHJvZ3Jlc3MsIGluIGEgMCB0byBpRHVyIGJhc2UuCi0gICAgKiBpUG9zMSBpcyB0aGUgdHJhbnNpdGlvbiBwcm9ncmVzcywgaW4gYSBpRFVyIHRvIDAgYmFzZS4gKi8KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLkF1ZGlvVHJhbnNpdGlvblR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfQ3Jvc3NGYWRlOgotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MxID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgICAgICBpUG9zMiA+Pj0gMjsgLyoqPCBpZGVtICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgICAgICAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMb29wIG9uIHNhbXBsZXMsIGFwcGx5IHRoZSBmYWRlIGZhY3RvciBvbiBlYWNoICovCi0gICAgICAgICAgICB3aGlsZSggdWlQQ01zaXplLS0gPiAwICkgLyoqPCBkZWNyZW1lbnRpbmcgY291bnRlciB0byBvcHRpbWl6ZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgPSAqcFBDTWRhdGExOyAvKio8IEdldCBjbGlwMSBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUxICo9IGlQb3MxOyAgICAgLyoqPCBtdWx0aXBseSBieSBmYWRlIG51bWVyYXRvciAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgLz0gaUR1cjsgICAgICAvKio8IGRpdmlkZSBieSBmYWRlIGRlbm9taW5hdG9yICovCi0KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyID0gKnBQQ01kYXRhMjsgLyoqPCBHZXQgY2xpcDIgc2FtcGxlICovCi0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMiAqPSBpUG9zMjsgICAgIC8qKjwgbXVsdGlwbHkgYnkgZmFkZSBudW1lcmF0b3IgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyIC89IGlEdXI7ICAgICAgLyoqPCBkaXZpZGUgYnkgZmFkZSBkZW5vbWluYXRvciAqLwotCi0gICAgICAgICAgICAgICAgKnBQQ01kYXRhMSsrID0gKE00T1NBX0ludDE2KShpMzJzYW1wbGUxCi0gICAgICAgICAgICAgICAgICAgICsgaTMyc2FtcGxlMik7IC8qKjwgbWl4IHRoZSB0d28gc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIHBQQ01kYXRhMisrOyAvKio8IGRvbid0IGZvcmdldCB0byBpbmNyZW1lbnQgdGhlIHNlY29uZCBidWZmZXIgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhpcyBpcyBhIHN0dXBpZC1ub24gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIE5vbmUgdHJhbnNpdGlvbi4uLgotICAgICAgICAgICAgKiBXZSBjb3B5IHRoZSBQQ00gZnJhbWVzICovCi0gICAgICAgICAgICBpZiggaVBvczEgPCAoaUR1ciA+PiAxKSApIC8qKjwgc2Vjb25kIGhhbGYgb2YgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgUENNIHRvIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBQQ01kYXRhMiwgdWlQQ01zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiB0aGUgb3V0cHV0IG11c3QgYmUgcHV0IGluIHRoZSBmaXJzdCBidWZmZXIuCi0gICAgICAgICAgICAqIEZvciB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgbm9uLXRyYW5zaXRpb24gaXQncyBhbHJlYWR5IHRoZSBjYXNlIQotICAgICAgICAgICAgKiBTbyB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gaGVyZS4uLgotICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9UcmFuc2l0aW9uOiB1bmtub3duIHRyYW5zaXRpb24gdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFIiwKLSAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS5BdWRpb1RyYW5zaXRpb25UeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb246IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFJlc2V0IHRoZSBhdWRpbyBlbmNvZGVyIChDcmVhdGUgaXQgaWYgbmVlZGVkKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoIE00VlNTM0dQUF9FbmNvZGVXcml0ZUNvbnRleHQgKnBDX2V3YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlBdWRpb0JpdHJhdGUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIElmIGFuIGVuY29kZXIgYWxyZWFkeSBleGlzdCwgd2UgZGVzdHJveSBpdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwKAotICAgICAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAgcmV0dXJucyAweCV4IiwgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDcmVhdGVzIGEgbmV3IGVuY29kZXIgICovCi0gICAgc3dpdGNoKCBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAgICAgLy9FVlJDCi0gICAgICAgICAgICAvLyAgICAgICAgY2FzZSBNNFNZU19rRVZSQzoKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rRVZSQzsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0gTTRFTkNPREVSX2tNb25vOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSBNNFZTUzNHUFBfRVZSQ19ERUZBVUxUX0JJVFJBVEU7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQW1yU0lEID0gTTRFTkNPREVSX2tBbXJOb1NJRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBQUM7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcENfZXdjLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazI0MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazMyMDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcjogaW52YWxpZCBpbnB1dCBBQUMgc2FtcGxpbmcgZnJlcXVlbmN5XAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkIEh6KSwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFUl9JTklUX0ZBSUxFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0gKHBDX2V3Yy0+dWlOYkNoYW5uZWxzID09IDEpCi0gICAgICAgICAgICAgICAgPyBNNEVOQ09ERVJfa01vbm8gOiBNNEVOQ09ERVJfa1N0ZXJlbzsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uUmVndWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRFTkNPREVSX2tBYWNSZWd1bE5vbmU7IC8vTTRFTkNPREVSX2tBYWNCaXRSZXNlcnZvaXIKLSAgICAgICAgICAgIC8qIHVudXNlZCAqLwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iSVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYk1TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJQTlMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlROUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgLyogVE9ETyBjaGFuZ2UgaW50byBoaWdoc3BlZWQgYXNhcCAqLwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iSGlnaFNwZWVkID0KLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgLyogUXVhbnRpZnkgdmFsdWUgKGNlaWwgb25lKSAqLwotICAgICAgICAgICAgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDE2MDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAxNjAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gMjQwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDI0MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSAzMjAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMzIwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDQ4MDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSA0ODAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gNjQwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDY0MDAwOwotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gOTYwMDA7Ci0KLSAgICAgICAgICAgIC8qIFNwZWNpYWwgcmVxdWlyZW1lbnQgb2Ygb3VyIGVuY29kZXIgKi8KLSAgICAgICAgICAgIGlmKCAoIHBDX2V3Yy0+dWlOYkNoYW5uZWxzID09IDIpCi0gICAgICAgICAgICAgICAgJiYgKHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA8IDMyMDAwKSApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMzIwMDA7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCAoJWQpLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgYXVkaW8gZW5jb2RlciAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6XAotICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQgY2FsbGVkIHdpdGggdXNlcmRhdGEgMHgleCIsCi0gICAgICAgIHBDX1NoZWxsQVBJLT5wQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhKTsKLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQ19ld2MtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgIHBDX1NoZWxsQVBJLT5wQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhKTsKLQotI2Vsc2UKLQotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgTTRPU0FfTlVMTCAvKiBubyBIVyBlbmNvZGVyICovKTsKLQotI2VuZGlmCi0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogT3BlbiB0aGUgYXVkaW8gZW5jb2RlciAqLwotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4ocENfZXdjLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICAmcENfZXdjLT5BdWRpb0VuY1BhcmFtcywgJnBDX2V3Yy0+cEF1ZGlvRW5jRFNJLAotICAgICAgICBNNE9TQV9OVUxMIC8qIG5vIGdyYWJiaW5nICovKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRWaWRlby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxOWY0MTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRWRpdFZpZGVvLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI3VuZGVmIE00T1NBX1RSQUNFX0xFVkVMCi0jZGVmaW5lIE00T1NBX1RSQUNFX0xFVkVMIDEKLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVyICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qKjwgT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAvKio8IE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKioKLSAqIGNvbXBvbmVudCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIgLyoqPCB2aWRlbyBlZmZlY3RzICovCi0KLS8qZm9yIHRyYW5zaXRpb24gYmVoYXZpb3VyKi8KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oIgotLyoqIERldGVybWluZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhLiAqLwotI2RlZmluZSBNNHhWU1NfQUJTKGEpICggKCAoYSkgPCAoMCkgKSA/ICgtKGEpKSA6IChhKSApCi0jZGVmaW5lIFlfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4MDAKLSNkZWZpbmUgVV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotI2RlZmluZSBWX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfVm9pZAotTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlDbGlwTnVtYmVyICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KAotICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0KTsKLQotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICk7Ci0KLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ3RzICk7Ci1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjICk7Ci1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50R2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpwQ3RzU2VjICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCggTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlXaWR0aCwgTTRPU0FfVUludDMyIHVpSGVpZ2h0ICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKAotICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlSW4sIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKAotICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwKLSAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcElucGxhbmUsCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwbGFuZSk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYklzQ2xpcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFJlc2l6ZVBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU5vUmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHJvdGF0aW9uRGVncmVlKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUqIHBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgdmlkZW8gcHJvY2Vzc2luZwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlDdHMsIGlOZXh0Q3RzOwotICAgIE00RU5DT0RFUl9GcmFtZU1vZGUgRnJhbWVNb2RlOwotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtZTsKLSAgICBNNE9TQV9VSW50MTYgb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCBlbmQgY3V0LiBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nCi0gICAgICogdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICovCi0gICAgaWYgKCAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwQy0+cEMxLT5pVm9mZnNldAotICAgICAgICArIHBDLT5pSW5PdXRUaW1lT2Zmc2V0KSA+PSBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgewotICAgICAgICAvKiBSZS1hZGp1c3QgdmlkZW8gdG8gcHJlY2lzZSBjdXQgdGltZSAqLwotICAgICAgICBwQy0+aUluT3V0VGltZU9mZnNldCA9ICgoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzKSkKLSAgICAgICAgICAgIC0gcEMtPnBDMS0+aVZvZmZzZXQgKyBwQy0+aUluT3V0VGltZU9mZnNldCAtIHBDLT5wQzEtPmlFbmRUaW1lOwotICAgICAgICBpZiAoIHBDLT5pSW5PdXRUaW1lT2Zmc2V0IDwgMCApIHsKLSAgICAgICAgICAgIHBDLT5pSW5PdXRUaW1lT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8ocEMpOwotCi0gICAgICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogRG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZXMgaWYgd2UgYXJlIGluIGRlY29kZVVwVG8oKSAqLwotICAgIGlmICggKE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gIT0gcEMtPnBDMS0+VnN0YXR1cykKLSAgICAgICAgJiYgKCggcEMtPnBDMiA9PSBNNE9TQV9OVUxMKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMyLT5Wc3RhdHVzKSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgVmlkZW8gTW9kZSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG91dHB1dCBDVFMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlKAotICAgICAgICAgICAgcEMpOyAvKio8IFRoaXMgZnVuY3Rpb24gY2hhbmdlIHRoZSBwQy0+VnN0YXRlIHZhcmlhYmxlISAqLwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHN3aXRjaCggcEMtPlZzdGF0ZSApCi0gICAgewotICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgICAgICAvKnwgUkVBRF9XUklURSBNT0RFIHwqLwotICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOgotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBSRUFEX1dSSVRFIik7Ci0KLSAgICAgICAgICAgICAgICBiU2tpcEZyYW1lID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgZGVjb2RpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCB0byBiZSBzdXJlCi0gICAgICAgICAgICAgICAgKiB0byBnZXQgdG8gdGhlIGdvb2QgcG9zaXRpb24uICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEICE9IHBDLT5wQzEtPlZzdGF0dXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSnVtcCB0byB0YXJnZXQgdmlkZW8gdGltZSAodGMgPSB0by1UKSAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMpIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cEMxLT5wVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IG1fcFJlYWRlci0+bV9wRmN0SnVtcChWMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cEMxLT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPnBDMS0+VmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IG1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dEF1IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkEgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMsIHBDLT5wQzEtPmlWb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgZnJhbWUgaGFzIGJlZW4gYWxyZWFkeSB3cml0dGVuIGluIEJFR0lOIENVVCBzdGVwIC0+IHNraXAgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPT0gaUN0cwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPnBDMS0+aVZpZGVvUmVuZGVyQ3RzID49IGlDdHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFRoaXMgZnJhbWUgaGFzIGJlZW4gYWxyZWFkeSB3cml0dGVuIGluIEJFR0lOIENVVCBzdGVwIC0+IHNraXAgaXQgKi8KLSAgICAgICAgICAgICAgICBpZiggKCBwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUKQotICAgICAgICAgICAgICAgICAgICAmJiAocEMtPnBDMS0+VmlkZW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICAgICArIHBDLT5wQzEtPmlWb2Zmc2V0IDw9IHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5DVFMpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVtZW1iZXIgdGhlIGNsaXAgcmVhZGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRDsKLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIC8vIFJvdW5kaW5nIGlzIHRvIGNvbXBlbnNhdGUgcmVhZGVyIGltcHJlY2lzaW9uIChtX0NUUyBpcyBhY3R1YWxseSBhbiBpbnRlZ2VyKQotICAgICAgICAgICAgICAgIGlDdHMgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBDLT5wQzEtPmlWb2Zmc2V0IC0gMTsKLSAgICAgICAgICAgICAgICBpTmV4dEN0cyA9IGlDdHMgKyAoKE00T1NBX0ludDMyKXBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbikgKyAxOwotICAgICAgICAgICAgICAgIC8qIEF2b2lkIHRvIHdyaXRlIGEgbGFzdCBmcmFtZSBvZiBkdXJhdGlvbiAwICovCi0gICAgICAgICAgICAgICAgaWYoIGlOZXh0Q3RzID4gcEMtPnBDMS0+aUVuZFRpbWUgKQotICAgICAgICAgICAgICAgICAgICBpTmV4dEN0cyA9IHBDLT5wQzEtPmlFbmRUaW1lOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJZiB0aGUgQVUgaXMgZ29vZCB0byBiZSB3cml0dGVuLCB3cml0ZSBpdCwgZWxzZSBqdXN0IHNraXAgaXQgKi8KLSAgICAgICAgICAgICAgICBpZiggKCBNNE9TQV9GQUxTRSA9PSBiU2tpcEZyYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiAoKCBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTID49IGlDdHMpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTIDwgaU5leHRDdHMpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSA+IDApKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5wQzEtPlZpZGVvQVUubV9hdHRyaWJ1dGU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5DVFMgPSAoTTRPU0FfVGltZSlwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9UaW1lKXBDLT5wQzEtPmlWb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZvciBoLjI2NCBzdHJlYW0gZG8gbm90IHJlYWQgdGhlIDFzdCA0IGJ5dGVzIGFzIHRoZXkgYXJlIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9ycyAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnBDMS0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgKQotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gNDsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5wQzEtPlZpZGVvQVUubV9zaXplIC0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUgPiBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6IEFVIHNpemUgZ3JlYXRlciB0aGFuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhBdVNpemUgKCVkPiVkKSEgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSwgcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5wQzEtPlZpZGVvQVUubV9kYXRhQWRkcmVzcyArIG9mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgdGltZSBpbmZvIGZvciB0aGUgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBlcXVhbCB0byB0aGUgYml0Ci0gICAgICAgICAgICAgICAgICAgIC1zdHJlYW0gdGltZSovCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyhwQywgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWx1IFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5DVFMsIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlYWQgbmV4dCBBVSBmb3IgbmV4dCBzdGVwICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQyAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX0NUUywgcEMtPnBDMS0+aVZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIERlY2lkZSB3ZXRoZXIgdG8gcmVhZCBvciB0byBpbmNyZW1lbnQgdGltZSBpbmNyZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTID49IGlOZXh0Q3RzKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAoTk9fTU9SRV9BVSBvciByZWFkZXIgaW4gYWR2YW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN3aXRjaCAoZnJvbSBBRlRFUl9DVVQpIHRvIG5vcm1hbCBtb2RlIGJlY2F1c2UgdGltZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgbm8gbW9yZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbiBvdGhlciBjYXNlcyAocmVhZGVyIGxhdGUpLCBqdXN0IGxldCB0aGUgcmVhZGVyIGNhdGNoIHVwCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kVlRvICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEMtPnBDMS0+VmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkQgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTLCBwQy0+cEMxLT5pVm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgREVDT0RFX0VOQ09ERSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8ICAgQkVHSU5fQ1VUIE1PREUgICB8Ki8KLSAgICAgICAgICAgIC8qfF9fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBERUNPREVfRU5DT0RFIC8gQkVHSU5fQ1VUIik7Ci0KLSAgICAgICAgICAgIGlmICgocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSAmJgotICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEpKSB7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMSk7Ci0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCBlcnI9JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgdmlkZW8gdXAgdG8gdGhlIHRhcmdldCB0aW1lCi0gICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCApICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyhwQy0+cEMxLCAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50RGVjb2RlVmlkZW9VcFRvQ3RzIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZGVjb2RpbmcgaXMgbm90IGNvbXBsZXRlZCwgZG8gb25lIG1vcmUgc3RlcCB3aXRoIHRpbWUgZnJvemVuICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcEMtPnBDMS0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSB2aWRlbyBwcmUtcHJvY2Vzc2luZyBlcnJvciBiZWZvcmUgY2FsbGluZyB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkUgKysrKyBlbmNvZGUgQVUiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmcmFtZShyZW5kZXJpbmcsZmlsdGVyaW5nIGFuZCB3cml0aW5nIHdpbGwgYmUgZG9uZQotICAgICAgICAgICAgICAgICBpbiBlbmNvZGVyIGNhbGxiYWNrcykqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUICkKLSAgICAgICAgICAgICAgICAgICAgRnJhbWVNb2RlID0gTTRFTkNPREVSX2tJRnJhbWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa05vcm1hbEZyYW1lOwotCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUocEMtPmV3Yy5wRW5jQ29udGV4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cywgRnJhbWVNb2RlKTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIGhhZCBhIFZQUCBlcnJvci4uLiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IHBDLT5ld2MuVnBwRXJyb3IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUsIHJldHVybmluZyBWcHBFcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSNlbmRpZiAvL000VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEMtPmV3Yy5WcHBFcnJvcjsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKSAvKio8IC4uLm9yIGFuIGVuY29kZXIgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FCi0gICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0RW5jb2RlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEluY3JlbWVudCB0aW1lIGJ5IHRoZSBlbmNvZGluZyBwZXJpb2QgKGZvciBiZWdpbiBjdXQsIGRvIG5vdCBpbmNyZW1lbnQgdG8gbm90Ci0gICAgICAgICAgICAgICAgbG9vc2UgUC1mcmFtZXMpICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwQy0+VnN0YXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgVFJBTlNJVElPTiBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8gVFJBTlNJVElPTiIpOwotCi0gICAgICAgICAgICAgICAgLyogRG9uJ3QgZGVjb2RlIG1vcmUgdGhhbiBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggISgoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gIT0gcEMtPnBDMS0+VnN0YXR1cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcEMtPnBDMi0+VnN0YXR1cykpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgY2xpcDEgdmlkZW8gdXAgdG8gdGhlIHRhcmdldCB0aW1lCi0gICAgICAgICAgICAgICAgICAgICh3aWxsIGp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODgocEMsIHBDLT5wQzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCBlcnI9JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMocEMtPnBDMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMoQzEpIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGRlY29kaW5nIGlzIG5vdCBjb21wbGV0ZWQsIGRvIG9uZSBtb3JlIHN0ZXAgd2l0aCB0aW1lIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEb24ndCBkZWNvZGUgbW9yZSB0aGFuIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAhKCggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMyLT5Wc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBjbGlwMiB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICh3aWxsIGp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBpZiBuZWVkZWQpICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgocEMtPnBDMi0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRkFMU0UgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKHBDLT5wQzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50RGVjb2RlVmlkZW9VcFRvQ3RzKEMyKSByZXR1cm5zIGVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkZWNvZGluZyBpcyBub3QgY29tcGxldGVkLCBkbyBvbmUgbW9yZSBzdGVwIHdpdGggdGltZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcEMtPnBDMi0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgdmlkZW8gcHJlLXByb2Nlc3NpbmcgZXJyb3IgYmVmb3JlIGNhbGxpbmcgdGhlIGVuY29kZXIgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gTTROT19FUlJPUjsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJGICoqKiogYmxlbmQgQVVzIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgZnJhbWUgKHJlbmRlcmluZywgZmlsdGVyaW5nIGFuZCB3cml0aW5nIHdpbGwgYmUgZG9uZQotICAgICAgICAgICAgICAgIGluIGVuY29kZXIgY2FsbGJhY2tzICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUocEMtPmV3Yy5wRW5jQ29udGV4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMsIE00RU5DT0RFUl9rTm9ybWFsRnJhbWUpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJZiBlbmNvZGUgcmV0dXJucyBhIHByb2Nlc3MgZnJhbWUgZXJyb3IsIGl0IGlzIGxpa2VseSB0byBiZSBhIFZQUCBlcnJvciAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IHBDLT5ld2MuVnBwRXJyb3IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUsIHJldHVybmluZyBWcHBFcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQy0+ZXdjLlZwcEVycm9yOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgLyoqPCAuLi5vciBhbiBlbmNvZGVyIGVycm9yICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggKChNNE9TQV9VSW50MzIpTTRFUlJfQUxMT0MpID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLCB0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSBpcwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKz0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIF9fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgRVJST1IgQ0FTRSB8Ki8KLSAgICAgICAgICAgIC8qfF9fX19fX19fX19fX3wqLwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlRFUk5BTF9TVEFURSIsCi0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlRFUk5BTF9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoKQotICogQGJyaWVmICAgIENoZWNrIHdoaWNoIHZpZGVvIHByb2Nlc3MgbW9kZSB3ZSBtdXN0IHVzZSwgZGVwZW5kaW5nIG9uIHRoZSBvdXRwdXQgQ1RTLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIGNvbnN0IE00T1NBX0ludDMyICB0ID0gKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgIC8qKjwgVHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgIGNvbnN0IE00T1NBX0ludDMyIFREID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICBNNE9TQV9JbnQzMiBpVG1wOwotCi0gICAgY29uc3QgTTRWU1MzR1BQX0VkaXRWaWRlb1N0YXRlIHByZXZpb3VzVnN0YXRlID0gcEMtPlZzdGF0ZTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgQ2xpcDEgaXMgb24gaXRzIGJlZ2luIGN1dCwgb3IgaW4gYW4gZWZmZWN0IHpvbmUgKi8KLSAgICBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMocEMsIDEpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgaW4gdGhlIHRyYW5zaXRpb24gd2l0aCBuZXh0IGNsaXAgKi8KLSAgICBpZiggKCBURCA+IDApICYmICgoIHQgLSBwQy0+cEMxLT5pVm9mZnNldCkgPj0gKHBDLT5wQzEtPmlFbmRUaW1lIC0gVEQpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBhcmUgaW4gYSB0cmFuc2l0aW9uICovCi0gICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT047Ci0gICAgICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogT3BlbiBzZWNvbmQgY2xpcCBmb3IgdHJhbnNpdGlvbiwgaWYgbm90IHlldCBvcGVuZWQgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50T3BlbkNsaXAocEMsICZwQy0+cEMyLAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W3BDLT51aUN1cnJlbnRDbGlwICsgMV0pOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfZWRpdE9wZW5DbGlwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZGQgY3VycmVudCB2aWRlbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldAotICAgICAgICAgICAgKiAoYXVkaW8gb3V0cHV0IENUUyBpcyBub3QgeWV0IGF0IHRoZSB0cmFuc2l0aW9uLCBzbyBhdWRpbwotICAgICAgICAgICAgKiAgb2Zmc2V0IGNhbid0IGJlIHVwZGF0ZWQgeWV0KS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBwQy0+cEMyLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAgICAgKiBVcGRhdGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBkdWUgdG8gdGhlIGFjdHVhbCB2aWRlbyB0cmFuc2l0aW9uIGJlZ2lubmluZyB0aW1lLgotICAgICAgICAgICAgKiBJdCB3aWxsIGF2b2lkIGRlc3luY2hyb25pemF0aW9uIHdoZW4gZG9pbmcgdGhlIGF1ZGlvIHRyYW5zaXRpb24uICovCi0gICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBpVG1wID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cylcCi0gICAgICAgICAgICAgLSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCArIHBDLT5wQzEtPmlWb2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChpVG1wIDwgKE00T1NBX0ludDMyKXBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgLyoqPCBUZXN0IGluIGNhc2Ugb2YgYSB2ZXJ5IHNob3J0IHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT4KLSAgICAgICAgICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb24gLT0gaVRtcDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRG9uJ3QgZm9yZ2V0IHRvIGFsc28gY29ycmVjdCB0aGUgdG90YWwgZHVyYXRpb24gdXNlZCBmb3IgdGhlIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgICAgICogKGl0IHdhcyBjb21wdXRlZCB3aXRoIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIGR1cmF0aW9uKS4gKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiArPSBpVG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqPCBObyAiZWxzZSIgaGVyZSBiZWNhdXNlIGl0J3MgaGFyZCBwcmVkaWN0IHRoZSBlZmZlY3Qgb2YgMCBkdXJhdGlvbiB0cmFuc2l0aW9uLi4uKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGVmZmVjdHMgZm9yIGNsaXAyICovCi0gICAgICAgIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyhwQywgMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBub3QgaW4gYSB0cmFuc2l0aW9uICovCi0gICAgICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIGVmZmVjdCB3ZSBnbyB0byBkZWNvZGUvZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgaWYoKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB8fCAocEMtPm5iQWN0aXZlRWZmZWN0czEgPiAwKSB8fAotICAgICAgICAgICAgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHx8Ci0gICAgICAgICAgICAocEMtPnBDMS0+cFNldHRpbmdzLT5iVHJhbnNjb2RpbmdSZXF1aXJlZCA9PSBNNE9TQV9UUlVFKSkgewotICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgfQotICAgICAgICAvKiBXZSBkbyBhIGJlZ2luIGN1dCwgZXhjZXB0IGlmIGFscmVhZHkgZG9uZSAodGltZSBpcyBub3QgcHJvZ3Jlc3NpbmcgYmVjYXVzZSB3ZSB3YW50Ci0gICAgICAgIHRvIGNhdGNoIGFsbCBQLWZyYW1lcyBhZnRlciB0aGUgY3V0KSAqLwotICAgICAgICBlbHNlIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQ2xpcDFBdEJlZ2luQ3V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpIHsKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFOwotICAgICAgICAgICAgICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgICAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUID09IHByZXZpb3VzVnN0YXRlKSApIHsKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBFbHNlIHdlIGFyZSBpbiBkZWZhdWx0IGNvcHkvcGFzdGUgbW9kZSAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICAgICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5iSXNNTVMgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGN1cnJlbnRCaXRyYXRlOwotICAgICAgICAgICAgICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgLyogRG8gd2UgbmVlZCB0byByZWVuY29kZSB0aGUgdmlkZW8gdG8gZG93bmdyYWRlIHRoZSBiaXRyYXRlIG9yIG5vdCA/ICovCi0gICAgICAgICAgICAgICAgLyogTGV0J3MgY29tcHV0ZSB0aGUgY2lycmVudCBiaXRyYXRlIG9mIHRoZSBjdXJyZW50IGVkaXRlZCBjbGlwICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwgJmN1cnJlbnRCaXRyYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6XAotICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBnZXR0aW5nIG5leHQgYml0cmF0ZSBvZiBlZGl0ZWQgY2xpcDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgY3VycmVudEJpdHJhdGUgLT0gMTIyMDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBUZXN0IGlmIHdlIGdvIGludG8gY29weS9wYXN0ZSBtb2RlIG9yIGludG8gZGVjb2RlL2VuY29kZSBtb2RlICovCi0gICAgICAgICAgICAgICAgaWYoIGN1cnJlbnRCaXRyYXRlID4gcEMtPnVpTU1TVmlkZW9CaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighKChwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9PSBNNE9TQV9UUlVFKSAmJgotICAgICAgICAgICAgICAgICAgICAocEMtPlZzdGF0ZSA9PSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUpKSAmJgotICAgICAgICAgICAgICAgICAgICBwQy0+YkVuY29kZVRpbGxFb0YgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGVzdCBpZiB3ZSBnbyBpbnRvIGNvcHkvcGFzdGUgbW9kZSBvciBpbnRvIGRlY29kZS9lbmNvZGUgbW9kZQotICAgICAgICAgICAgICAgICAqIElmIGFuIGV4dGVybmFsIGVmZmVjdCBoYXMgYmVlbiBhcHBsaWVkIG9uIHRoZSBjdXJyZW50IGNsaXAKLSAgICAgICAgICAgICAgICAgKiB0aGVuIGNvbnRpbnVlIHRvIGJlIGluIGRlY29kZS9lbmNvZGUgbW9kZSB0aWxsIGVuZCBvZgotICAgICAgICAgICAgICAgICAqIGNsaXAgdG8gYXZvaWQgSC4yNjQgZGlzdG9ydGlvbi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBjcmVhdGUgYW4gZW5jb2RlciAqLwotICAgIGlmKCAoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQKLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiAoKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUID09IHBDLT5Wc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcEMtPlZzdGF0ZSkpIC8qKjwgZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgJiYgcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDcmVhdGUgdGhlIGVuY29kZXIsIGlmIG5vdCBjcmVhdGVkIGFscmVhZHkqLwotICAgICAgICBpZiAocEMtPmV3Yy5lbmNvZGVyU3RhdGUgPT0gTTRWU1MzR1BQX2tOb0VuY29kZXIpIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIFwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICYmIHBDLT5ld2MucEVuY0NvbnRleHQgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDcmVhdGUgdGhlIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZTogTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlciByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogV2hlbiB3ZSBnbyBmcm9tIGZpbHRlcmluZyB0byByZWFkL3dyaXRlLCB3ZSBtdXN0IGFjdCBsaWtlIGEgYmVnaW4gY3V0LAotICAgICogYmVjYXVzZSB0aGUgbGFzdCBmaWx0ZXJlZCBpbWFnZSBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIG9yaWdpbmFsIGltYWdlLiAqLwotICAgIGVsc2UgaWYoICggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgICAgICYmIChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcEMtPlZzdGF0ZSkgLyoqPCByZWFkIG1vZGUgKi8KLSAgICAgICAgJiYgKHBDLT5iRW5jb2RlVGlsbEVvRiA9PSBNNE9TQV9GQUxTRSkgKQotICAgIHsKLSAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgZGVzdHJveSBhbiBlbmNvZGVyICovCi0gICAgZWxzZSBpZiggKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OCi0gICAgICAgID09IHByZXZpb3VzVnN0YXRlKSkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgICAgICAmJiAoKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUCi0gICAgICAgID09IHBDLT5Wc3RhdGUpKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIERlc3Ryb3kgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlciByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN0YXJ0QVUoKQotICogQGJyaWVmICAgIFN0YXJ0QVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgcHJlcGFyZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3RhcnRBVSggTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCAqcEFVICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB1aU1heEF1U2l6ZTsKLQotICAgIC8qKgotICAgICogR2l2ZW4gY29udGV4dCBpcyBhY3R1YWxseSB0aGUgVlNTM0dQUCBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgcEFVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3RhcnRBVTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRTdGFydEFVOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSgpCi0gKiBAYnJpZWYgICAgUHJvY2Vzc0FVIHdyaXRlci1saWtlIGludGVyZmFjZSB1c2VkIGZvciB0aGUgVlNTIDNHUFAgb25seQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogKElOKSBJdCBpcyB0aGUgVlNTIDNHUFAgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHN0cmVhbUlEOiAoSU4pIElkIG9mIHRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIEFjY2VzcyBVbml0IGlzIHJlbGF0ZWQuCi0gKiBAcGFyYW0gICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHdyaXR0ZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRQcm9jZXNzQVUoIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCAqcEFVICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBHaXZlbiBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICogRml4IHRoZSBlbmNvZGVkIEFVIHRpbWUgKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZE91dHB1dFZpZEN0cyA9IHBBVS0+Q1RTOwotICAgIC8qKgotICAgICogVXBkYXRlIHRpbWUgaW5mbyBmb3IgdGhlIENvdW50ZXIgVGltZSBTeXN0ZW0gdG8gYmUgZXF1YWwgdG8gdGhlIGJpdC1zdHJlYW0gdGltZSAqLwotICAgIE00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyhwQywgcEFVKTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgcEFVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UHJvY2Vzc0FVOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UHJvY2Vzc0FVOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCkKLSAqIEBicmllZiAgICBXZSBpbXBsZW1lbnQgb3VyIG93biBWaWRlb1ByZVByb2Nlc3NpbmcgZnVuY3Rpb24KLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZQUCggTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfTWVkaWFUaW1lIHRzOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwVG1wID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcExhc3REZWNvZGVkRnJhbWUgPSBNNE9TQV9OVUxMIDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcERlY29kZXJSZW5kZXJGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcFRlbXAxWzNdLHBUZW1wMlszXTsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcFBsYW5lQ2xpcDFbM10scFRlbXBQbGFuZUNsaXAyWzNdOwotICAgIE00T1NBX1VJbnQzMiAgaSA9IDAsIHl1dkZyYW1lV2lkdGggPSAwLCB5dXZGcmFtZUhlaWdodCA9IDA7Ci0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgLyoqCi0gICAgKiBWUFAgY29udGV4dCBpcyBhY3R1YWxseSB0aGUgVlNTM0dQUCBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcDEsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFRlbXAyLCAwLCAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSkpOwotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wUGxhbmVDbGlwMSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcFBsYW5lQ2xpcDIsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IFZQUCBlcnJvciByZW1lbWJlcmVkIGluIGNvbnRleHQgKi8KLSAgICBwQy0+ZXdjLlZwcEVycm9yID0gTTROT19FUlJPUjsKLQotICAgIC8qKgotICAgICogQXQgdGhlIGVuZCBvZiB0aGUgZWRpdGluZywgd2UgbWF5IGJlIGNhbGxlZCB3aGVuIG5vIG1vcmUgY2xpcCBpcyBsb2FkZWQuCi0gICAgKiAoYmVjYXVzZSB0byBjbG9zZSB0aGUgZW5jb2RlciBwcm9wZXJseSBpdCBtdXN0IGJlIHN0ZXBwZWQgb25lIG9yIHR3aWNlLi4uKSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgbXVzdCBmaWxsIHRoZSBpbnB1dCBvZiB0aGUgZW5jb2RlciB3aXRoIGEgZHVtbXkgaW1hZ2UsIGJlY2F1c2UKLSAgICAgICAgKiBlbmNvZGluZyBub2lzZSBsZWFkcyB0byBhIGh1Z2UgdmlkZW8gQVUsIGFuZCB0aHVzIGEgd3JpdGVyIGJ1ZmZlciBvdmVyZmxvdy4gKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICBwUGxhbmVPdXRbMF0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMV0ucGFjX2RhdGEsMCwKLSAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3N0cmlkZSAqIHBQbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfc3RyaWRlICogcFBsYW5lT3V0WzJdLnVfaGVpZ2h0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGFib3J0KSIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqKioqKioqKioqKioqKioqIFRyYW5zaXRpb24gY2FzZSAqKioqKioqKioqKioqKioqLwotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iVHJhbnNpdGlvbkVmZmVjdCApCi0gICAgewotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDEsIHBDLT5ld2MudWlWaWRlb1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDEpIHJldHVybnMgMHgleCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMiwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMikgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwQy0+eXV2MSwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDMpIHJldHVybnMgMHgleCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwQy0+eXV2MiwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDQpIHJldHVybnMgMHgleCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwQy0+eXV2MywgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDMpIHJldHVybnMgMHgleCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAxIGJhc2U6IHRzID0gdG8gLSBPZmZzZXQgKi8KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgdHMgPSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAtIHBDLT5wQzEtPmlWb2Zmc2V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJlbmRlciBDbGlwMSAqLwotICAgICAgICBpZiggcEMtPnBDMS0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KHBDLCBwQy0+cEMxLCB0cywgTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMSwgcFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0KTsKLSAgICAgICAgICAgIGlmICgoTTROT19FUlJPUiAhPSBlcnIpICYmCi0gICAgICAgICAgICAgICAgIChNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBlcnIpKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgLyoqIFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAqIGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9UUlVFKSB8fAotICAgICAgICAgICAgIChNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSA9PSBlcnIpKSB7Ci0gICAgICAgICAgICBwVG1wID0gcEMtPnl1djE7Ci0gICAgICAgICAgICBpZiAocEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFswXS51X2hlaWdodCAqIHBUbXBbMF0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMV0udV9oZWlnaHQgKiBwVG1wWzFdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzJdLnVfaGVpZ2h0ICogcFRtcFsyXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9FUlJfTk9fVkFMSURfVklEX0ZSQU1FOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8zKCJDYW4gbm90IGZpbmQgYW4gaW5wdXQgZnJhbWUuIFNldCBlcnJvciAweCV4IGluICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgIGVyciwgX19GSUxFX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSB0aW1lIGluIHRoZSBjbGlwMiBiYXNlOiB0cyA9IHRvIC0gT2Zmc2V0ICovCi0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIHRzID0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgLSBwQy0+cEMyLT5pVm9mZnNldDsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyIENsaXAyICovCi0gICAgICAgIGlmKCBwQy0+cEMyLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdChwQywgcEMtPnBDMiwgdHMsIE00T1NBX0ZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQbGFuZUNsaXAyLCBwVGVtcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQpOwotICAgICAgICAgICAgaWYgKChNNE5PX0VSUk9SICE9IGVycikgJiYKLSAgICAgICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICE9IGVycikpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAvKiogUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICogZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKHBDLT5wQzItPmlzUmVuZGVyRHVwID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FID09IGVycikpIHsKLSAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgIGlmIChwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzBdLnVfaGVpZ2h0ICogcFRtcFswXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsxXS51X2hlaWdodCAqIHBUbXBbMV0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMl0udV9oZWlnaHQgKiBwVG1wWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbihwQywgcFRtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRWUFA6IE00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb24gcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4gIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBQbGFuZUNsaXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBQbGFuZUNsaXAxW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocFRlbXAyW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMltpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAyW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBUZW1wMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKioqKioqKioqKioqKioqKiBObyBUcmFuc2l0aW9uIGNhc2UgKioqKioqKioqKioqKioqKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogTk8gdHJhbnNpdGlvbiBjYXNlIik7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAgYmFzZTogdHMgPSB0byAtIE9mZnNldCAqLwotICAgICAgICB0cyA9IHBDLT5ld2MuZElucHV0VmlkQ3RzIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlbmRlciAqLwotICAgICAgICBpZiAocEMtPnBDMS0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfRkFMU0UpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZW5kZXJkdXAgZmFsc2UiKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgIENoZWNrIGlmIHJlc2l6aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfRkFMU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0LCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilNNE9TQV9GQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0UmVuZGVyKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT0gcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHVuLXJvdGF0ZWQgZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHl1dkZyYW1lV2lkdGggPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVIZWlnaHQgPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSb3RhdGVWaWRlbyhwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVWaWRlbygpIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwQy0+bmJBY3RpdmVFZmZlY3RzID4gMCkgewotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbiBpbnRlcm1lZGlhdGUKLSAgICAgICAgICAgICAgICAgICAgKiBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCwgdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAqIEhlcmUgc2tpcCB0aGUgZnJhbWluZyhvdmVybGF5KSBlZmZlY3Qgd2hlbiBhcHBseWluZyB2aWRlbyBFZmZlY3QuICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwgcFRlbXAxLCBiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFRlbXAxOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBQcmVwYXJlIG92ZXJsYXkgdGVtcG9yYXJ5IGJ1ZmZlciBpZiBvdmVybGF5IGV4aXN0ICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMF0udV93aWR0aCwgcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgsIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcFRlbXAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUuICovCi0gICAgICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSkgZXJyb3IgMHgleCAiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGlzIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwVG1wOwotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLCBwVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSkgZXJyb3IgMHgleCAiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX1RSVUUpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBmb3IgcmVzaXplIGZyYW1lIHBsYW5lCi0gICAgICAgICAgICAgICAgaWYgKDAgIT0gcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyAmJgotICAgICAgICAgICAgICAgICAgICAxODAgIT0gcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dkZyYW1lV2lkdGgsIHl1dkZyYW1lSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IE5PIHJlc2l6ZSByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgIGlmIChwQy0+bmJBY3RpdmVFZmZlY3RzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbgotICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcm1lZGlhdGUgaW1hZ2UgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBUZW1wMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFZpRGVjQ3R4dCwgJnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEhlcmUgd2UgZG8gbm90IHNraXAgdGhlIG92ZXJsYXkgZWZmZWN0IHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAqIG92ZXJsYXkgYW5kIHZpZGVvIGZyYW1lIGFyZSBib3RoIG9mIHNhbWUgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSxwUGxhbmVPdXQsYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICAgICAgcEMtPnBDMS0+aVZpZGVvUmVuZGVyQ3RzID0gKE00T1NBX0ludDMyKXRzOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmVuZGVyZHVwIHRydWUiKTsKLQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aCkpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIElmIHdlIGRvIG1vZGlmeSB0aGUgaW1hZ2UsIHdlIG5lZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgKiBpbnRlcm1lZGlhdGUgaW1hZ2UgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCwgdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAqIEhlcmUgc2tpcCB0aGUgZnJhbWluZyhvdmVybGF5KSBlZmZlY3Qgd2hlbiBhcHBseWluZyB2aWRlbyBFZmZlY3QuICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLHBUZW1wMSwgYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWU9IHBUZW1wMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFByZXBhcmUgb3ZlcmxheSB0ZW1wb3JhcnkgYnVmZmVyIGlmIG92ZXJsYXkgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgsIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcFRlbXAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERvIHJlbmRlcmluZyBtb2RlICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLCBwVG1wKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEFwcGx5IG92ZXJsYXkgaWYgb3ZlcmxheSBpcyBleGlzdCAqLwotICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wMiwgcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSAhPSBNNE9TQV9OVUxMICYmCi0gICAgICAgICAgICAgICAgICAgIHBMYXN0RGVjb2RlZEZyYW1lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcExhc3REZWNvZGVkRnJhbWVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocExhc3REZWNvZGVkRnJhbWVbMF0udV9oZWlnaHQgKiBwTGFzdERlY29kZWRGcmFtZVswXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcExhc3REZWNvZGVkRnJhbWVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocExhc3REZWNvZGVkRnJhbWVbMV0udV9oZWlnaHQgKiBwTGFzdERlY29kZWRGcmFtZVsxXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcExhc3REZWNvZGVkRnJhbWVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocExhc3REZWNvZGVkRnJhbWVbMl0udV9oZWlnaHQgKiBwTGFzdERlY29kZWRGcmFtZVsyXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8zKCJDYW4gbm90IGZpbmQgYW4gaW5wdXQgZnJhbWUuIFNldCBlcnJvciAweCV4IGluICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBpZihwQy0+bmJBY3RpdmVFZmZlY3RzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIHdlIGRvIG5vdCBza2lwIHRoZSBvdmVybGF5IGVmZmVjdCBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgKiBvdmVybGF5IGFuZCB2aWRlbyBhcmUgYm90aCBvZiBzYW1lIHJlc29sdXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXN0RGVjb2RlZEZyYW1lLCBwVG1wLGJTa2lwRnJhbWVFZmZlY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRWUFA6IFJlbmRlcmVkIGF0IENUUyAlLjNmIiwgdHMpOwotCi0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgaWYgKHBUZW1wMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXAyW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMltpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAyW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkoKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIG92ZXJsYXkgZnJvbSBwUGxhbmVJbiB0byBwUGxhbmVPdXQKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBJbnB1dFBsYW5lcyAgICAoSU4pIElucHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgKElOL09VVCkgT3V0cHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpIHsKLQotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgZXh0UHJvZ3Jlc3M7Ci0gICAgTTRPU0FfRG91YmxlIFZpZGVvRWZmZWN0VGltZTsKLSAgICBNNE9TQV9Eb3VibGUgUGVyY2VudGFnZURvbmU7Ci0gICAgTTRPU0FfVUludDggTnVtQWN0aXZlRWZmZWN0cyA9MDsKLSAgICBNNE9TQV9VSW50MzIgQ3RzID0gMDsKLSAgICBNNE9TQV9JbnQzMiBuZXh0RWZmZWN0VGltZTsKLSAgICBNNE9TQV9JbnQzMiB0bXA7Ci0gICAgTTRPU0FfVUludDggaTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgcENsaXAgPSBwQy0+cEMxOwotICAgIGlmIChwQy0+Yklzc2Vjb25kQ2xpcCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICB9IGVsc2UgewotICAgICAgICBOdW1BY3RpdmVFZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICB9Ci0gICAgZm9yIChpPTA7IGk8TnVtQWN0aXZlRWZmZWN0czsgaSsrKSB7Ci0gICAgICAgIGlmIChwQy0+Yklzc2Vjb25kQ2xpcCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDFbaV1dKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVmZmVjdCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIFZpZGVvRWZmZWN0VGltZSA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpICsKLSAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbiAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwRngtPnVpU3RhcnRUaW1lOwotICAgICAgICB9Ci0gICAgICAgIC8qIERvIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCBvbmx5LAotICAgICAgICAgKiBza2lwIG90aGVyIGNvbG9yIGVmZmVjdCB3aGljaCBoYWQgYmVlbiBhcHBsaWVkICovCi0gICAgICAgIGlmIChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUbyBjYWxjdWxhdGUgJSwgc3Vic3RyYWN0IHRpbWVJbmNyZW1lbnQgYmVjYXVzZSBlZmZlY3Qgc2hvdWxkIGZpbmlzaAotICAgICAgICAgKiBvbiB0aGUgbGFzdCBmcmFtZSB3aGljaCBpcyBwcmVzZW50ZWQgZnJvbSBDVFMgPSBlb2YtdGltZUluY3JlbWVudCB0aWxsIENUUyA9IGVvZiAqLwotICAgICAgICBQZXJjZW50YWdlRG9uZSA9IFZpZGVvRWZmZWN0VGltZSAvICgoTTRPU0FfRmxvYXQpcEZ4LT51aUR1cmF0aW9uKTsKLQotICAgICAgICBpZiAoUGVyY2VudGFnZURvbmUgPCAwLjApIHsKLSAgICAgICAgICAgIFBlcmNlbnRhZ2VEb25lID0gMC4wOwotICAgICAgICB9Ci0gICAgICAgIGlmIChQZXJjZW50YWdlRG9uZSA+IDEuMCkgewotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAxLjA7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAwMCkgKi8KLSAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKShQZXJjZW50YWdlRG9uZSAqIDEwMDApOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgcHJvZ3Jlc3MgaW5mbyBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gKi8KLSAgICAgICAgZXh0UHJvZ3Jlc3MudWlQcm9ncmVzcyA9IChNNE9TQV9VSW50MzIpdG1wOwotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICBleHRQcm9ncmVzcy51aUNsaXBUaW1lID0gZXh0UHJvZ3Jlc3MudWlPdXRwdXRUaW1lIC0gcENsaXAtPmlWb2Zmc2V0OwotICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIG5leHRFZmZlY3RUaW1lID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cyBcCi0gICAgICAgICAgICArIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbik7Ci0gICAgICAgIGlmIChuZXh0RWZmZWN0VGltZSA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwRngtPkV4dFZpZGVvRWZmZWN0RmN0KHBGeC0+cEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCwKLSAgICAgICAgICAgIHBQbGFuZUluLCBwUGxhbmVPdXQsICZleHRQcm9ncmVzcywKLSAgICAgICAgICAgIHBGeC0+VmlkZW9FZmZlY3RUeXBlIC0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheTogXAotICAgICAgICAgICAgICAgIEV4dGVybmFsIHZpZGVvIGVmZmVjdCBmdW5jdGlvbiByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkKLSAqIEBicmllZiAgICBBcHBseSB2aWRlbyBlZmZlY3QgZnJvbSBwUGxhbmVJbiB0byBwUGxhbmVPdXQKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgdWlDbGlwMW9yQ2xpcDIgICAgKElOL09VVCkgMSBmb3IgZmlyc3QgY2xpcCwgMiBmb3Igc2Vjb25kIGNsaXAKLSAqIEBwYXJhbSAgICBwSW5wdXRQbGFuZXMgICAgKElOKSBJbnB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lcyAgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHBhcmFtICAgIGJTa2lwRnJhbWluZ0VmZmVjdCAoSU4pIHNraXAgZnJhbWluZyBlZmZlY3QgZmxhZwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLQotICAgIE00T1NBX0RvdWJsZSBWaWRlb0VmZmVjdFRpbWU7Ci0gICAgTTRPU0FfRG91YmxlIFBlcmNlbnRhZ2VEb25lOwotICAgIE00T1NBX0ludDMyIHRtcDsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVUZW1wSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZVRlbXBPdXQ7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgIHBUZW1wWXV2UGxhbmVbM107Ci0gICAgTTRPU0FfVUludDggaTsKLSAgICBNNE9TQV9VSW50OCBOdW1BY3RpdmVFZmZlY3RzID0wOwotCi0KLSAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICBOdW1BY3RpdmVFZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgIH0KLQotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wWXV2UGxhbmUsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRlbXBvcmFyeSBwbGFuZSBpZiBuZWVkZWQgUkMgKi8KLSAgICBpZiAoTnVtQWN0aXZlRWZmZWN0cyA+IDEpIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wWXV2UGxhbmUsIHBQbGFuZU91dC0+dV93aWR0aCwKLSAgICAgICAgICAgICAgICAgIHBQbGFuZU91dC0+dV9oZWlnaHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDQpIHJldHVybnMgMHgleCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChOdW1BY3RpdmVFZmZlY3RzICAlIDIgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBQbGFuZVRlbXBJbiA9IHBQbGFuZUluOwotICAgICAgICBwUGxhbmVUZW1wT3V0ID0gcFRlbXBZdXZQbGFuZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFBsYW5lVGVtcEluID0gcFBsYW5lSW47Ci0gICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwUGxhbmVPdXQ7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8TnVtQWN0aXZlRWZmZWN0czsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpCi0gICAgICAgIHsKLQotCi0gICAgICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDFbaV1dKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVmZmVjdCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIFZpZGVvRWZmZWN0VGltZSA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlUcmFuc2l0aW9uRHVyYXRpb24tIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwRngtPnVpU3RhcnRUaW1lOwotICAgICAgICB9Ci0KLQotCi0gICAgICAgIC8qIFRvIGNhbGN1bGF0ZSAlLCBzdWJzdHJhY3QgdGltZUluY3JlbWVudCBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoIG9uIHRoZSBsYXN0IGZyYW1lKi8KLSAgICAgICAgLyogd2hpY2ggaXMgcHJlc2VudGVkIGZyb20gQ1RTID0gZW9mLXRpbWVJbmNyZW1lbnQgdGlsbCBDVFMgPSBlb2YgKi8KLSAgICAgICAgUGVyY2VudGFnZURvbmUgPSBWaWRlb0VmZmVjdFRpbWUKLSAgICAgICAgICAgIC8gKChNNE9TQV9GbG9hdClwRngtPnVpRHVyYXRpb24vKi0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKi8pOwotCi0gICAgICAgIGlmKCBQZXJjZW50YWdlRG9uZSA8IDAuMCApCi0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDAuMDsKLQotICAgICAgICBpZiggUGVyY2VudGFnZURvbmUgPiAxLjAgKQotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAxLjA7Ci0KLSAgICAgICAgc3dpdGNoKCBwRngtPlZpZGVvRWZmZWN0VHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjazoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpLiAqLwotICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoUGVyY2VudGFnZURvbmUgKiAxMDI0KTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBQbGFuZVRlbXBJbiwKLSAgICAgICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcE91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2s6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KSAqLwotICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoKCAxLjAgLSBQZXJjZW50YWdlRG9uZSkgKiAxMDI0KTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBQbGFuZVRlbXBJbiwKLSAgICAgICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcE91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYoIHBGeC0+VmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgICAgID49IE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0V4dGVybmFsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBuZXh0RWZmZWN0VGltZTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDAwKSAqLwotICAgICAgICAgICAgICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKFBlcmNlbnRhZ2VEb25lICogMTAwMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMil0bXA7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdFRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobmV4dEVmZmVjdFRpbWUgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MuYklzTGFzdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSBza2lwIHRoZSBmcmFtaW5nIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICogZG8gdGhlIGZyYW1pbmcgZWZmZWN0IGFmdGVyIGFwcGx5IHJlbmRlcmluZyBtb2RlICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgocEZ4LT54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBQbGFuZVRlbXBPdXRbMF0ucGFjX2RhdGEsIHBQbGFuZVRlbXBJblswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW5bMF0udV9oZWlnaHQgKiBwUGxhbmVUZW1wSW5bMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFBsYW5lVGVtcE91dFsxXS5wYWNfZGF0YSwgcFBsYW5lVGVtcEluWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJblsxXS51X2hlaWdodCAqIHBQbGFuZVRlbXBJblsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUGxhbmVUZW1wT3V0WzJdLnBhY19kYXRhLCBwUGxhbmVUZW1wSW5bMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lVGVtcEluWzJdLnVfaGVpZ2h0ICogcFBsYW5lVGVtcEluWzJdLnVfd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwRngtPkV4dFZpZGVvRWZmZWN0RmN0KHBGeC0+cEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW4sIHBQbGFuZVRlbXBPdXQsICZleHRQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRngtPlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIHZpZGVvIGVmZmVjdCBmdW5jdGlvbiByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3Q6IHVua25vd24gZWZmZWN0IHR5cGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEZ4LT5WaWRlb0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VGRkVDVF9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBSQyBVcGRhdGVzIHBUZW1wUGxhbmVJbiBhbmQgcFRlbXBQbGFuZU91dCBkZXBlbmRpbmcgb24gY3VycmVudCBlZmZlY3QgKi8KLSAgICAgICAgaWYgKCgoaSAlIDIgPT0gMCkgJiYgKE51bUFjdGl2ZUVmZmVjdHMgICUgMiA9PSAwKSkKLSAgICAgICAgICAgIHx8ICgoaSAlIDIgIT0gMCkgJiYgKE51bUFjdGl2ZUVmZmVjdHMgJSAyICE9IDApKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFBsYW5lVGVtcEluID0gcFRlbXBZdXZQbGFuZTsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwUGxhbmVPdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wSW4gPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wT3V0ID0gcFRlbXBZdXZQbGFuZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvcihpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgIGlmKHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwVGVtcFl1dlBsYW5lW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3Q6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb24oKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIHRyYW5zaXRpb24gZWZmZWN0IHBDMStwQzItPnBQbGFuZU91dAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lcyAgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpUHJvZ3Jlc3M7Ci0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgZXh0UHJvZ3Jlc3M7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZTsKLSAgICBNNE9TQV9JbnQzMiBpOwotICAgIGNvbnN0IE00T1NBX0ludDMyIGlEdXIgPSAoTTRPU0FfSW50MzIpcEMtPgotICAgICAgICBwVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgZW5kIGN1dCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLgotICAgICogSXQgaXMgZG9uZSB3aXRoIGludGVnZXJzIGJlY2F1c2UgdGhlIG9mZnNldCBhbmQgYmVnaW4gY3V0IGhhdmUgYmVlbiByb3VuZGVkIGFscmVhZHkuICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKChNNE9TQV9Eb3VibGUpcEMtPnBDMS0+aUVuZFRpbWUpIC0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKwotICAgICAgICAoKE00T1NBX0RvdWJsZSlwQy0+cEMxLT5pVm9mZnNldCk7Ci0gICAgLyoqCi0gICAgKiBXZSBtdXN0IHJlbW92ZSB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lLCBlbHNlIHdlIHdvdWxkIGFsbW9zdCBuZXZlciByZWFjaCB0aGUgZW5kCi0gICAgKiAoSXQncyBraW5kIG9mIGEgInBpbGUgYW5kIGludGVydmFscyIgaXNzdWUpLiAqLwotICAgIGlQcm9ncmVzcyAtPSAoTTRPU0FfSW50MzIpcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotCi0gICAgaWYoIGlQcm9ncmVzcyA8IDAgKSAvKio8IFNhbml0eSBjaGVja3MgKi8KLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiwgb24gYSBiYXNlIDEwMDAgKi8KLSAgICBpUHJvZ3Jlc3MgPSAoICggaUR1ciAtIGlQcm9ncmVzcykgKiAxMDAwKSAvIGlEdXI7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVja3MgKi8KLSAgICBpZiggaVByb2dyZXNzIDwgMCApCi0gICAgewotICAgICAgICBpUHJvZ3Jlc3MgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUHJvZ3Jlc3MgPiAxMDAwICkKLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDEwMDA7Ci0gICAgfQotCi0gICAgc3dpdGNoKCBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS5UcmFuc2l0aW9uQmVoYXZpb3VyICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWRVcDoKLSAgICAgICAgICAgIGlQcm9ncmVzcyA9ICggaVByb2dyZXNzICogaVByb2dyZXNzKSAvIDEwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0xpbmVhcjoKLSAgICAgICAgICAgIC8qZG8gbm90aGluZyovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1NwZWVkRG93bjoKLSAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoc3FydChpUHJvZ3Jlc3MgKiAxMDAwKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1Nsb3dNaWRkbGU6Ci0gICAgICAgICAgICBpZiggaVByb2dyZXNzIDwgNTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKHNxcnQoaVByb2dyZXNzICogNTAwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaVByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgoICggKCBpUHJvZ3Jlc3MgLSA1MDApICogKGlQcm9ncmVzcyAtIDUwMCkpCi0gICAgICAgICAgICAgICAgICAgIC8gNTAwKSArIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0Zhc3RNaWRkbGU6Ci0gICAgICAgICAgICBpZiggaVByb2dyZXNzIDwgNTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKCggaVByb2dyZXNzICogaVByb2dyZXNzKSAvIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaVByb2dyZXNzID0gKE00T1NBX0ludDMyKShzcXJ0KCggaVByb2dyZXNzIC0gNTAwKSAqIDUwMCkgKyA1MDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qZG8gbm90aGluZyovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQ3Jvc3NGYWRlOgotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEFwcGx5IHRoZSB0cmFuc2l0aW9uIGVmZmVjdCAqLwotICAgICAgICAgICAgZXJyID0gTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBDLT55dXYxLAotICAgICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBDLT55dXYyLAotICAgICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBQbGFuZU91dCwgaVByb2dyZXNzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCByZXR1cm5zIGVycm9yIDB4JXgsXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9UUkFOU0lUSU9OX0ZJTFRFUl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVFJBTlNJVElPTl9GSUxURVJfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOgotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFRoaXMgaXMgYSBzdHVwaWQtbm9uIG9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBOb25lIHRyYW5zaXRpb24uLi4KLSAgICAgICAgICAgICogV2UgY29weSB0aGUgWVVWIGZyYW1lICovCi0gICAgICAgICAgICBpZiggaVByb2dyZXNzIDwgNTAwICkgLyoqPCBmaXJzdCBoYWxmIG9mIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGxhbmUgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBzZWNvbmQgaGFsZiBvZiB0cmFuc2l0aW9uICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgWVVWIGZyYW1lcyAqLwotICAgICAgICAgICAgaSA9IDM7Ci0KLSAgICAgICAgICAgIHdoaWxlKCBpLS0gPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVPdXRbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICh2b2lkICopcFBsYW5lW2ldLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbaV0udV9zdHJpZGUgKiBwUGxhbmVPdXRbaV0udV9oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmKCBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgPj0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgcHJvZ3Jlc3MgaW5mbyBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMilpUHJvZ3Jlc3M7Ci0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQy0+cEMxLT5pVm9mZnNldDsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS5FeHRWaWRlb1RyYW5zaXRpb25GY3QoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnl1djEsIHBDLT55dXYyLCBwUGxhbmVPdXQsICZleHRQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgLSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gdHJhbnNpdGlvbiBmdW5jdGlvbiByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjogdW5rbm93biB0cmFuc2l0aW9uIHR5cGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS5WaWRlb1RyYW5zaXRpb25UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKCkKLSAqIEBicmllZiAgICBVcGRhdGUgYml0IHN0cmVhbSB0aW1lIGluZm8gYnkgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBjb21wbGlhbnQgd2l0aAotICogICAgICAgICAgcGxheWVycyB1c2luZyBiaXQgc3RyZWFtIHRpbWUgaW5mbwotICogQG5vdGUgICAgSDI2MyB1c2VzIGFuIGFic29sdXRlIHRpbWUgY291bnRlciB1bmxpa2UgTVBFRzQgd2hpY2ggdXNlcyBHcm91cCBPZiBWb3BzCi0gKiAgICAgICAgICAoR09WLCBzZWUgdGhlIHN0YW5kYXJkKQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgICAgIChJTi9PVVQpIHJldHVybnMgdGltZSB1cGRhdGVkIHZpZGVvIEFVLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvZmZzZXQgYmV0d2VlbiBzeXN0ZW0gYW5kIHZpZGVvIHRpbWUgKE1QRUc0IG9ubHkpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBjbGlwIChNUEVHNCBvbmx5KQotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX1VJbnQ4IHVpVG1wOwotICAgIE00T1NBX1VJbnQzMiB1aUN0cyA9IDA7Ci0gICAgTTRPU0FfTWVtQWRkcjggcFRtcDsKLSAgICBNNE9TQV9VSW50MzIgdWlBZGQ7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3VyckdvdjsKLSAgICBNNE9TQV9JbnQ4IGlEaWZmOwotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgPSBwQy0+cEMxOwotICAgIE00T1NBX0ludDMyICpwT2Zmc2V0ID0gJihwQy0+ZXdjLmlNcGVnNEdvdk9mZnNldCk7Ci0KLSAgICAvKioKLSAgICAqIFNldCBIMjYzIHRpbWUgY291bnRlciBmcm9tIHN5c3RlbSB0aW1lICovCi0gICAgaWYoIE00U1lTX2tIMjYzID09IHBBVS0+c3RyZWFtLT5zdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIHVpVG1wID0gKE00T1NBX1VJbnQ4KSgoTTRPU0FfVUludDMyKSggKCBwQVUtPkNUUyAqIDMwKSAvIDEwMDEgKyAwLjUpCi0gICAgICAgICAgICAlIE00VlNTM0dQUF9FRElUX0gyNjNfTU9EVUxPX1RJTUUpOwotICAgICAgICBNNFZTUzNHUFBfaW50U2V0SDI2M1RpbWVDb3VudGVyKChNNE9TQV9NZW1BZGRyOCkocEFVLT5kYXRhQWRkcmVzcyksCi0gICAgICAgICAgICB1aVRtcCk7Ci0gICAgfQotICAgIC8qCi0gICAgKiBTZXQgTVBFRzQgR09WIHRpbWUgY291bnRlciByZWdhcmRpbmcgdmlkZW8gYW5kIHN5c3RlbSB0aW1lICovCi0gICAgZWxzZSBpZiggTTRTWVNfa01QRUdfNCA9PSBwQVUtPnN0cmVhbS0+c3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKgotICAgICAgICAqIElmIEdPVi4KLSAgICAgICAgKiBiZXdhcmUgb2YgbGl0dGxlL2JpZyBlbmRpYW4hICovCi0gICAgICAgIC8qIGNvcnJlY3Rpb246IHJlYWQgOCBiaXRzIGJsb2NrIGluc3RlYWQgb2Ygb25lIDMyIGJpdHMgYmxvY2sgKi8KLSAgICAgICAgTTRPU0FfVUludDggKnRlbXA4ID0gKE00T1NBX1VJbnQ4ICopKHBBVS0+ZGF0YUFkZHJlc3MpOwotICAgICAgICBNNE9TQV9VSW50MzIgdGVtcDMyID0gMDsKLQotICAgICAgICB0ZW1wMzIgPSAoIDB4MDAwMDAwZmYgJiAoTTRPU0FfVUludDMyKSgqdGVtcDgpKQotICAgICAgICAgICAgKyAoMHgwMDAwZmYwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMSkpKSA8PCA4KQotICAgICAgICAgICAgKyAoMHgwMGZmMDAwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMikpKSA8PCAxNikKLSAgICAgICAgICAgICsgKDB4ZmYwMDAwMDAgJiAoKE00T1NBX1VJbnQzMikoKih0ZW1wOCArIDMpKSkgPDwgMjQpOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18yKCJSQzogVGVtcDMyOiAweCV4LCBkYXRhQWRkcmVzczogMHgleFxuIiwgdGVtcDMyLAotICAgICAgICAgICAgKihwQVUtPmRhdGFBZGRyZXNzKSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9FRElUX0dPVl9IRUFERVIgPT0gdGVtcDMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcFRtcCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KShwQVUtPmRhdGFBZGRyZXNzCi0gICAgICAgICAgICAgICAgKyAxKTsgLyoqPCBKdW1wIHRvIHRoZSB0aW1lIGNvZGUgKGp1c3QgYWZ0ZXIgdGhlIDMyIGJpdHMgaGVhZGVyKSAqLwotICAgICAgICAgICAgdWlBZGQgPSAoTTRPU0FfVUludDMyKShwQVUtPkNUUykrKCAqcE9mZnNldCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5iTXBlZzRHb3ZTdGF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9GQUxTRTogLyo8IElOSVQgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gdGltZSA9IGNlaWwgKHN5c3RlbSB0aW1lICsgb2Zmc2V0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlDdHMgPSAoIHVpQWRkICsgOTk5KSAvIDEwMDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCB1cGRhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICggKnBPZmZzZXQpICs9ICgoIHVpQ3RzICogMTAwMCkgLSB1aUFkZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnVpTXBlZzRQcmV2R292VmFsdWVTZXQgPSB1aUN0czsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhdGUgdG8gJ2ZpcnN0JyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5iTXBlZzRHb3ZTdGF0ZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX1RSVUU6IC8qPCBVUERBVEUgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IGN1cnJlbnQgR292IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50R2V0TVBFRzRHb3YocFRtcCwgJnVpQ3Vyckdvdik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZGVvIHRpbWUgPSBmbG9vciBvciBjZWlsIChzeXN0ZW0gdGltZSArIG9mZnNldCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3RzID0gKHVpQWRkIC8gMTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpRGlmZiA9IChNNE9TQV9JbnQ4KSh1aUN1cnJHb3YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZUdldCAtIHVpQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPnVpTXBlZzRQcmV2R292VmFsdWVTZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjZWlsaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggaURpZmYgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUN0cyArPSAoTTRPU0FfVUludDMyKShpRGlmZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgdXBkYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAqcE9mZnNldCkgKz0gKCggdWlDdHMgKiAxMDAwKSAtIHVpQWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZUdldCA9IHVpQ3VyckdvdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCA9IHVpQ3RzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YocFRtcCwgdWlDdHMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cygpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggdmlkZW8gZWZmZWN0IG11c3QgYmUgYXBwbGllZCBhdCB0aGUgY3VycmVudCB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKQotewotICAgIE00T1NBX1VJbnQ4IHVpQ2xpcEluZGV4OwotICAgIE00T1NBX1VJbnQ4IHVpRnhJbmRleCwgaTsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotICAgIE00T1NBX0ludDMyIE9mZiwgQkMsIEVDOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgTTRPU0FfSW50MzIgdCA9IChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLQotICAgIHVpQ2xpcEluZGV4ID0gcEMtPnVpQ3VycmVudENsaXA7Ci0gICAgaWYgKHVpQ2xpcE51bWJlciA9PSAxKSB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgICBwQ2xpcCA9IHBDLT5wQzI7Ci0gICAgICAgIHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotICAgIC8qKgotICAgICogU2hvcnRjdXRzIGZvciBjb2RlIHJlYWRhYmlsaXR5ICovCi0gICAgT2ZmID0gcENsaXAtPmlWb2Zmc2V0OwotICAgIEJDID0gcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgIEVDID0gcENsaXAtPmlFbmRUaW1lOwotCi0gICAgaSA9IDA7Ci0KLSAgICBmb3IgKCB1aUZ4SW5kZXggPSAwOyB1aUZ4SW5kZXggPCBwQy0+bmJFZmZlY3RzOyB1aUZ4SW5kZXgrKyApCi0gICAgewotICAgICAgICAvKiogU2hvcnRjdXQsIHJldmVyc2Ugb3JkZXIgYmVjYXVzZSBvZiBwcmlvcml0eSBiZXR3ZWVuIGVmZmVjdHMoRW5kRWZmZWN0IGFsd2F5cyBjbGVhbiApKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+cEVmZmVjdHNMaXN0W3BDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4XSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUgIT0gcEZ4LT5WaWRlb0VmZmVjdFR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSB2aWRlbyBlZmZlY3QgKi8KLQotICAgICAgICAgICAgIGlmKHVpQ2xpcE51bWJlciA9PTEpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgQXJlIHdlIGFmdGVyIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3Q/Ci0gICAgICAgICAgICAgICAgICogb3IgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoICh0ID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSkpICYmCi0gICAgICAgICAgICAgICAgICAgICh0IDw9IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+dWlEdXJhdGlvbikpICkgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgZWZmZWN0KHMpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3RbaV0gPSBwQy0+bmJFZmZlY3RzLTEtdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgY291bnRlciBvZiBhY3RpdmUgZWZmZWN0cyAqLwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZvciBhbGwgZXh0ZXJuYWwgZWZmZWN0cyBzZXQgdGhpcyBmbGFnIHRvIHRydWUuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBGeC0+VmlkZW9FZmZlY3RUeXBlID4gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8gKi8KLSAgICAgICAgICAgICAgICBpZiAoICgoTTRPU0FfSW50MzIpKHQgKyBwQy0+cFRyYW5zaXRpb25MaXN0W3VpQ2xpcEluZGV4XS51aVRyYW5zaXRpb25EdXJhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKCAoTTRPU0FfSW50MzIpKHQgKyBwQy0+cFRyYW5zaXRpb25MaXN0W3VpQ2xpcEluZGV4XS51aVRyYW5zaXRpb25EdXJhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgPD0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QocykgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDFbaV0gPSBwQy0+bmJFZmZlY3RzLTEtdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgY291bnRlciBvZiBhY3RpdmUgZWZmZWN0cyAqLwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBGb3IgYWxsIGV4dGVybmFsIGVmZmVjdHMgc2V0IHRoaXMgZmxhZyB0byB0cnVlLiAqLwotICAgICAgICAgICAgICAgICAgICBpZihwRngtPlZpZGVvRWZmZWN0VHlwZSA+IE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0V4dGVybmFsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogVGhlIHRoaXJkIGVmZmVjdCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIHRoZW4gdGhlIHNlY29uZCBvbmUsIHRoZW4gdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVuY2UsIGFzIHNvb24gYXMgd2UgZm91bmQgYW4gYWN0aXZlIGVmZmVjdCwgd2UgY2FuIGdldCBvdXQgb2YgdGhpcyBsb29wICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00VklERU9FRElUSU5HX2tIMjY0ICE9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIE1wZWc0IGFuZCBIMjYzIGNsaXBzLCBmdWxsIGRlY29kZSBlbmNvZGUgbm90IHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoMT09dWlDbGlwTnVtYmVyKQotICAgIHsKLSAgICAvKioKLSAgICAgKiBTYXZlIG51bWJlciBvZiBhY3RpdmUgZWZmZWN0cyAqLwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzID0gaTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSBpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hhbmdlIHRoZSBhYnNvbHV0IHRpbWUgdG8gY2xpcCByZWxhdGVkIHRpbWUgKi8KLSAgICB0IC09IE9mZjsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIG9uIHRoZSBiZWdpbiBjdXQgKGZvciBjbGlwMSBvbmx5KSAqLwotICAgIGlmKCAoIDAgIT0gQkMpICYmICh0ID09IEJDKSAmJiAoMSA9PSB1aUNsaXBOdW1iZXIpICkKLSAgICB7Ci0gICAgICAgIHBDLT5iQ2xpcDFBdEJlZ2luQ3V0ID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zIEVuY1BhcmFtczsKLQotICAgIC8qKgotICAgICogU2ltdWxhdGUgYSB3cml0ZXIgaW50ZXJmYWNlIHdpdGggb3VyIHNwZWNpZmljIGZ1bmN0aW9uICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBQcm9jZXNzQVUgPQotICAgICAgICBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpdCBmb2xsb3cgdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFN0YXJ0QVUgPQotICAgICAgICBNNFZTUzNHUFBfaW50U3RhcnRBVTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGlzIFZTUyAzR1BQIHNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wV3JpdGVyQ29udGV4dCA9Ci0gICAgICAgIChNNFdSSVRFUl9Db250ZXh0KQotICAgICAgICBwQzsgLyoqPCBXZSBnaXZlIHRoZSBpbnRlcm5hbCBjb250ZXh0IGFzIHdyaXRlciBjb250ZXh0ICovCi0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZW5jb2RlciBpbnRlcmZhY2UsIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2Rlcjogc2V0Q3VycmVudEVuY29kZXIgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IGVuY29kZXIgc2hlbGwgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gVlNTIHNldHRpbmdzICovCi0KLSAgICAvKiBDb21tb24gcGFyYW1ldGVycyAqLwotICAgIEVuY1BhcmFtcy5JbnB1dEZvcm1hdCA9IE00RU5DT0RFUl9rSVlVVjQyMDsKLSAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IHBDLT5ld2MudWlWaWRlb0hlaWdodDsKLSAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGU7Ci0KLSAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKiBObyBzdHJpY3QgcmVndWxhdGlvbiBpbiB2aWRlbyBlZGl0b3IgKi8KLSAgICAgICAgLyogQmVjYXVzZSBvZiB0aGUgZWZmZWN0cyBhbmQgdHJhbnNpdGlvbnMgd2Ugc2hvdWxkIGFsbG93IG1vcmUgZmxleGliaWxpdHkgKi8KLSAgICAgICAgLyogQWxzbyBpdCBwcmV2ZW50cyB0byBkcm9wIGltcG9ydGFudCBmcmFtZXMgKHdpdGggYSBiYWQgcmVzdWx0IG9uIHNoZWR1bGluZyBhbmQKLSAgICAgICAgYmxvY2sgZWZmZXRjcykgKi8KLSAgICAgICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLy8gVmFyaWFibGUgZnJhbWVyYXRlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgU3RhZ2VGcmlnaHQgZW5jb2RlcnMKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00RU5DT0RFUl9rMzBfRlBTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBJbiBjYXNlIG9mIE1NUyBtb2RlLCB3ZSBuZWVkIHRvIGVuYWJsZSBiaXRyYXRlIHJlZ3VsYXRpb24gdG8gYmUgc3VyZSAqLwotICAgICAgICAvKiB0byByZWFjaCB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUgc2l6ZSAqLwotICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9IE00T1NBX1RSVUU7Ci0gICAgICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBwQy0+TU1TdmlkZW9GcmFtZXJhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPdGhlciBlbmNvZGVyIHNldHRpbmdzIChkZWZhdWx0cykgKi8KLSAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOyAgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9IDA7ICAgICAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiA9IE00T1NBX1RSVUU7ICAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICBFbmNQYXJhbXMudWlTdGFydGluZ1F1YW50aXplclZhbHVlID0gMTA7ICAgLyogaW5pdGlhbCBRUCA9IDEwICovCi0gICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgRW5jUGFyYW1zLnZpZGVvTGV2ZWw9IHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIHN3aXRjaCAoIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjM7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSA4OwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IChNNE9TQV9VSW50OCkoKCBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkgLyAxMDAwLjAgKyAwLjUpOwotCi0gICAgICAgICAgICBpZiggRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9PSAwICkKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsgLyogZGVmYXVsdCAqLwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBNNFNZU19IMjY0Iik7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIC8vRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00VklERU9FRElUSU5HX2s1X0ZQUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogVW5rbm93biB2aWRlb1N0cmVhbVR5cGUgMHgleCIsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5iSXNNTVMgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGU7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlNTVNWaWRlb0JpdHJhdGU7IC8qIFJDICovCi0gICAgICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IDA7IC8qIFdlIGxldCB0aGUgZW5jb2RlciBjaG9vc2UgdGhlIHRpbWVzY2FsZSAqLwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdEluaXQiKTsKLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHZpZGVvIGVuY29kZXIgKGFkdmFuY2VkIHNldHRpbmdzIHZlcnNpb24gb2YgdGhlIGVuY29kZXIgT3BlbiBmdW5jdGlvbikgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZTUzNHUFBfaW50VlBQLCBwQywKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJDbG9zZWQ7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IGNhbGxpbmcgZW5jb2RlciBwRmN0T3BlbiIpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RTdGFydCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJSdW5uaW5nOwotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlciggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEVuY0NvbnRleHQgKQotICAgIHsKLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJDbG9zZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhbnVwKAotICAgICAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa05vRW5jb2RlcjsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVzZXQgdmFyaWFibGUgKi8KLSAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoKQotICogQGJyaWVmICAgIE1vZGlmeSB0aGUgdGltZSBjb3VudGVyIG9mIHRoZSBnaXZlbiBIMjYzIHZpZGVvIEFVCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBBdURhdGFCdWZmZXIgICAgKElOL09VVCkgSDI2MyBWaWRlbyBBVSB0byBtb2RpZnkKLSAqIEBwYXJhbSAgICB1aUN0cyAgICAgICAgICAgIChJTikgICAgIE5ldyB0aW1lIGNvdW50ZXIgdmFsdWUKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0SDI2M1RpbWVDb3VudGVyKCBNNE9TQV9NZW1BZGRyOCBwQXVEYXRhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUN0cyApCi17Ci0gICAgLyoKLSAgICAqICBUaGUgSDI2MyB0aW1lIGNvdW50ZXIgaXMgOCBiaXRzIGxvY2F0ZWQgb24gdGhlICJ4IiBiZWxvdzoKLSAgICAqCi0gICAgKiAgIHwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwKLSAgICAqICAgID8/Pz8/Pz8/ID8/Pz8/Pz8/ID8/Pz8/P3h4IHh4eHh4eD8/Ci0gICAgKi8KLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIDIgYml0cyBvbiB0aGUgdGhpcmQgYnl0ZSAqLwotICAgIHBBdURhdGFCdWZmZXJbMl0gPSAoIHBBdURhdGFCdWZmZXJbMl0gJiAweEZDKSB8ICgoIHVpQ3RzID4+IDYpICYgMHgzKTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIDYgYml0cyBvbiB0aGUgZm91cnRoIGJ5dGUgKi8KLSAgICBwQXVEYXRhQnVmZmVyWzNdID0gKCAoIHVpQ3RzIDw8IDIpICYgMHhGQykgfCAocEF1RGF0YUJ1ZmZlclszXSAmIDB4Myk7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoKQotICogQGJyaWVmICAgIE1vZGlmeSB0aGUgdGltZSBpbmZvIGZyb20gR3JvdXAgT2YgVk9QIHZpZGVvIEFVCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBBdURhdGFCdWZmZXIgICAgKElOKSAgICBNUEVHNCBWaWRlbyBBVSB0byBtb2RpZnkKLSAqIEBwYXJhbSAgICB1aUN0c1NlYyAgICAgICAgICAgIChJTikgICAgIE5ldyBHT1YgdGltZSBpbmZvIGluIHNlY29uZCB1bml0Ci0gKiBAcmV0dXJuICAgIG5vdGhpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldE1QRUc0R292KCBNNE9TQV9NZW1BZGRyOCBwQXVEYXRhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUN0c1NlYyApCi17Ci0gICAgLyoKLSAgICAqICBUaGUgTVBFRy00IHRpbWUgY29kZSBsZW5ndGggaXMgMTggYml0czoKLSAgICAqCi0gICAgKiAgICAgaGggICAgIG1tICAgIG1hcmtlciAgICBzcwotICAgICogICAgeHh4eHh8eHh4IHh4eCAgICAgMSAgICB4eHh4IHh4ID8/Pz8/PwotICAgICogICB8LS0tLS0gLS0tfC0tLSAgICAgLSAgICAtLS0tfC0tIC0tLS0tLXwKLSAgICAqLwotICAgIE00T1NBX1VJbnQ4IHVpSGg7Ci0gICAgTTRPU0FfVUludDggdWlNbTsKLSAgICBNNE9TQV9VSW50OCB1aVNzOwotICAgIE00T1NBX1VJbnQ4IHVpVG1wOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgMiBsYXN0IGJpdHMgc3MgKi8KLSAgICB1aVNzID0gKE00T1NBX1VJbnQ4KSh1aUN0c1NlYyAlIDYwKTsgLyoqPCBtb2R1bG8gcGFydCAqLwotICAgIHBBdURhdGFCdWZmZXJbMl0gPSAoKCAoIHVpU3MgJiAweDAzKSA8PCA2KSB8IChwQXVEYXRhQnVmZmVyWzJdICYgMHgzRikpOwotCi0gICAgaWYoIHVpQ3RzU2VjIDwgNjAgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIDMgbGFzdCBiaXRzIG9mIG1tLCB0aGUgbWFya2VyIGJpdCAoMHgxMCAqLwotICAgICAgICBwQXVEYXRhQnVmZmVyWzFdID0gKCggMHgxMCkgfCAodWlTcyA+PiAyKSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgIHBBdURhdGFCdWZmZXJbMF0gPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgMyBsYXN0IGJpdHMgb2YgbW0sIHRoZSBtYXJrZXIgYml0ICgweDEwICovCi0gICAgICAgIHVpVG1wID0gKE00T1NBX1VJbnQ4KSh1aUN0c1NlYyAvIDYwKTsgLyoqPCBpbnRlZ2VyIHBhcnQgKi8KLSAgICAgICAgdWlNbSA9IChNNE9TQV9VSW50OCkodWlUbXAgJSA2MCk7Ci0gICAgICAgIHBBdURhdGFCdWZmZXJbMV0gPSAoKCB1aU1tIDw8IDUpIHwgKDB4MTApIHwgKHVpU3MgPj4gMikpOwotCi0gICAgICAgIGlmKCB1aVRtcCA8IDYwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFdyaXRlIHRoZSA1IGJpdHMgb2YgaGggYW5kIDMgb2YgbW0gKG91dCBvZiA2KSAqLwotICAgICAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9ICgodWlNbSA+PiAzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgICAgICB1aUhoID0gKE00T1NBX1VJbnQ4KSh1aVRtcCAvIDYwKTsKLSAgICAgICAgICAgIHBBdURhdGFCdWZmZXJbMF0gPSAoKCB1aUhoIDw8IDMpIHwgKHVpTW0gPj4gMykpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdigpCi0gKiBAYnJpZWYgICAgR2V0IHRoZSB0aW1lIGluZm8gZnJvbSBHcm91cCBPZiBWT1AgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4pICAgIE1QRUc0IFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHBDdHNTZWMgICAgICAgICAgICAoT1VUKSAgICBDdXJyZW50IEdPViB0aW1lIGluZm8gaW4gc2Vjb25kIHVuaXQKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50R2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpwQ3RzU2VjICkKLXsKLSAgICAvKgotICAgICogIFRoZSBNUEVHLTQgdGltZSBjb2RlIGxlbmd0aCBpcyAxOCBiaXRzOgotICAgICoKLSAgICAqICAgICBoaCAgICAgbW0gICAgbWFya2VyICAgIHNzCi0gICAgKiAgICB4eHh4eHx4eHggeHh4ICAgICAxICAgIHh4eHggeHggPz8/Pz8/Ci0gICAgKiAgIHwtLS0tLSAtLS18LS0tICAgICAtICAgIC0tLS18LS0gLS0tLS0tfAotICAgICovCi0gICAgTTRPU0FfVUludDggdWlIaDsKLSAgICBNNE9TQV9VSW50OCB1aU1tOwotICAgIE00T1NBX1VJbnQ4IHVpU3M7Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHNzICovCi0gICAgdWlTcyA9ICgoIHBBdURhdGFCdWZmZXJbMl0gJiAweEMwKSA+PiA2KTsKLSAgICB1aVRtcCA9ICgoIHBBdURhdGFCdWZmZXJbMV0gJiAweDBGKSA8PCAyKTsKLSAgICB1aUN0c1NlYyA9IHVpU3MgKyB1aVRtcDsKLQotICAgIC8qKgotICAgICogUmVhZCBtbSAqLwotICAgIHVpTW0gPSAoKCBwQXVEYXRhQnVmZmVyWzFdICYgMHhFMCkgPj4gNSk7Ci0gICAgdWlUbXAgPSAoKCBwQXVEYXRhQnVmZmVyWzBdICYgMHgwNykgPDwgMyk7Ci0gICAgdWlNbSA9IHVpTW0gKyB1aVRtcDsKLSAgICB1aUN0c1NlYyA9ICggdWlNbSAqIDYwKSArIHVpQ3RzU2VjOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIGhoICovCi0gICAgdWlIaCA9ICgoIHBBdURhdGFCdWZmZXJbMF0gJiAweEY4KSA+PiAzKTsKLQotICAgIGlmKCB1aUhoICkKLSAgICB7Ci0gICAgICAgIHVpQ3RzU2VjID0gKCB1aUhoICogMzYwMCkgKyB1aUN0c1NlYzsKLSAgICB9Ci0KLSAgICAvKgotICAgICogaW4gc2VjICovCi0gICAgKnBDdHNTZWMgPSB1aUN0c1NlYzsKLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCkKLSAqIEBicmllZiAgICBBbGxvY2F0ZSB0aGUgdGhyZWUgWVVWIDQ6MjowIHBsYW5lcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwUGxhbmVzICAgIChJTi9PVVQpIHZhbGlkIHBvaW50ZXIgdG8gMyBNNFZJRklfSW1hZ2VQbGFuZSBzdHJ1Y3R1cmVzCi0gKiBAcGFyYW0gICAgdWlXaWR0aCAgICAoSU4pICAgICBJbWFnZSB3aWR0aAotICogQHBhcmFtICAgIHVpSGVpZ2h0KElOKSAgICAgSW1hZ2UgaGVpZ2h0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVdpZHRoLCBNNE9TQV9VSW50MzIgdWlIZWlnaHQgKQotewotICAgIGlmIChwUGxhbmVzID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogSW52YWxpZCBwUGxhbmVzIHBvaW50ZXIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBub3QgTlVMTCBhbmQgc2FtZSBzaXplIHdpdGggdGFyZ2V0IHNpemUsCi0gICAgICogZG8gbm90IG1hbGxvYyBhZ2FpbiovCi0gICAgaWYgKHBQbGFuZXNbMF0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCAmJgotICAgICAgICBwUGxhbmVzWzBdLnVfd2lkdGggPT0gdWlXaWR0aCAmJgotICAgICAgICBwUGxhbmVzWzBdLnVfaGVpZ2h0ID09IHVpSGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIHBQbGFuZXNbMF0udV93aWR0aCA9IHVpV2lkdGg7Ci0gICAgcFBsYW5lc1swXS51X2hlaWdodCA9IHVpSGVpZ2h0OwotICAgIHBQbGFuZXNbMF0udV9zdHJpZGUgPSB1aVdpZHRoOwotICAgIHBQbGFuZXNbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgIGlmIChwUGxhbmVzWzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwUGxhbmVzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHBQbGFuZXNbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBQbGFuZXNbMF0udV9zdHJpZGUKLSAgICAgICAgKiBwUGxhbmVzWzBdLnVfaGVpZ2h0LCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBQbGFuZXNbMF0ucGFjX2RhdGEiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBQbGFuZXNbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiB1bmFibGUgdG8gYWxsb2NhdGUgcFBsYW5lc1swXS5wYWNfZGF0YSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBQbGFuZXNbMV0udV93aWR0aCA9IHBQbGFuZXNbMF0udV93aWR0aCA+PiAxOwotICAgIHBQbGFuZXNbMV0udV9oZWlnaHQgPSBwUGxhbmVzWzBdLnVfaGVpZ2h0ID4+IDE7Ci0gICAgcFBsYW5lc1sxXS51X3N0cmlkZSA9IHBQbGFuZXNbMV0udV93aWR0aDsKLSAgICBwUGxhbmVzWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgaWYgKHBQbGFuZXNbMV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMV0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1sxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1sxXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMV0udV9oZWlnaHQsIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSAicFBsYW5lc1sxXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1sxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzFdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFBsYW5lc1syXS51X3dpZHRoID0gcFBsYW5lc1sxXS51X3dpZHRoOwotICAgIHBQbGFuZXNbMl0udV9oZWlnaHQgPSBwUGxhbmVzWzFdLnVfaGVpZ2h0OwotICAgIHBQbGFuZXNbMl0udV9zdHJpZGUgPSBwUGxhbmVzWzJdLnVfd2lkdGg7Ci0gICAgcFBsYW5lc1syXS51X3RvcGxlZnQgPSAwOwotICAgIGlmIChwUGxhbmVzWzJdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwUGxhbmVzWzJdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1syXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHBQbGFuZXNbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBQbGFuZXNbMl0udV9zdHJpZGUKLSAgICAgICAgKiBwUGxhbmVzWzJdLnVfaGVpZ2h0LCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBQbGFuZXNbMl0ucGFjX2RhdGEiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBQbGFuZXNbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiB1bmFibGUgdG8gYWxsb2NhdGUgcFBsYW5lc1syXS5wYWNfZGF0YSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKXBQbGFuZXNbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1sxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZXNbMF0ucGFjX2RhdGEsIDAsIHBQbGFuZXNbMF0udV9zdHJpZGUqcFBsYW5lc1swXS51X2hlaWdodCk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFBsYW5lc1sxXS5wYWNfZGF0YSwgMCwgcFBsYW5lc1sxXS51X3N0cmlkZSpwUGxhbmVzWzFdLnVfaGVpZ2h0KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVzWzJdLnBhY19kYXRhLCAwLCBwUGxhbmVzWzJdLnVfc3RyaWRlKnBQbGFuZXNbMl0udV9oZWlnaHQpOwotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLSogQGJyaWVmICAgIEl0IENvdmVydHMgYW5kIHJlc2l6ZXMgYSBBUkdCODg4OCBpbWFnZSB0byBZVVY0MjAKLSogQG5vdGUKLSogQHBhcmFtICAgIHBGaWxlSW4gICAgICAgICAoSU4pIFRoZSBBUkdCODg4IGlucHV0IGZpbGUKLSogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIFlVVjQyMCBvdXRwdXQgcGxhbmVzIGFsbG9jYXRlZCBieSB0aGUgdXNlci4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICBBUkdCODg4OCBpbWFnZSAgd2lsbCBiZSBjb252ZXJ0ZWQgYW5kIHJlc2l6ZWQgdG8gb3V0cHV0Ci0qICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIHBsYW5lIHNpemUKLSogQHBhcmFtIHdpZHRoICAgICAgIChJTikgd2lkdGggb2YgdGhlIEFSR0I4ODg4Ci0qIEBwYXJhbSBoZWlnaHQgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSogQHJldHVybiAgIE00Tk9fRVJST1I6IE5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9BTExPQzogbWVtb3J5IGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpIHsKLSAgICBNNE9TQV9Db250ZXh0IHBBUkdCSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUxICxyZ2JQbGFuZTI7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9hcmdiID0gd2lkdGggKiBoZWlnaHQgKiA0OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfcmdiODg4ID0gd2lkdGggKiBoZWlnaHQgKiAzOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqPSAwOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVUludDggKnBBcmdiUGxhbmUgPQotICAgICAgICAoTTRPU0FfVUludDgqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImFyZ2IgZGF0YSIpOwotICAgIGlmIChwQXJnYlBsYW5lID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwOiBcCi0gICAgICAgICAgICBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBBUkdCIHBsYW5lIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBHZXQgZmlsZSBzaXplICovCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JJbiwgcEZpbGVJbiwgTTRPU0Ffa0ZpbGVSZWFkKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDogXAotICAgICAgICAgICAgQ2FuIG5vdCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocEFyZ2JQbGFuZSk7Ci0gICAgICAgIHBBcmdiUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5yZWFkRGF0YShwQVJHQkluLChNNE9TQV9NZW1BZGRyOClwQXJnYlBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lU2l6ZV9hcmdiKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFwKLSAgICAgICAgICAgIENhbiBub3QgcmVhZCBBUkdCODg4OCBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBwRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgQ2FuIG5vdCBjbG9zZSBBUkdCODg4OCAgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGVJbiwgZXJyKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICByZ2JQbGFuZTEucGFjX2RhdGEgPQotICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX3JnYjg4OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJSR0I4ODggcGxhbmUxIik7Ci0gICAgaWYocmdiUGxhbmUxLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJnYiBwbGFuZTEiKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHJnYlBsYW5lMS51X2hlaWdodCA9IGhlaWdodDsKLSAgICByZ2JQbGFuZTEudV93aWR0aCA9IHdpZHRoOwotICAgIHJnYlBsYW5lMS51X3N0cmlkZSA9IHdpZHRoKjM7Ci0gICAgcmdiUGxhbmUxLnVfdG9wbGVmdCA9IDA7Ci0KLQotICAgIC8qKiBSZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgKi8KLSAgICBmb3IgKGk9MCwgaiA9IDA7IGkgPCBmcmFtZVNpemVfYXJnYjsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSAlIDQpID09IDApIGNvbnRpbnVlOwotICAgICAgICByZ2JQbGFuZTEucGFjX2RhdGFbal0gPSBwQXJnYlBsYW5lW2ldOwotICAgICAgICBqKys7Ci0gICAgfQotICAgIGZyZWUocEFyZ2JQbGFuZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiByZXNpemluZyBpcyByZXF1aXJlZCB3aXRoIGNvbG9yIGNvbnZlcnNpb24gKi8KLSAgICBpZih3aWR0aCAhPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggfHwgaGVpZ2h0ICE9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIHsKLQotICAgICAgICBmcmFtZVNpemVfcmdiODg4ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X2hlaWdodCAqIDM7Ci0gICAgICAgIHJnYlBsYW5lMi5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX3JnYjg4OCwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikicmdiIFBsYW5lMiIpOwotICAgICAgICBpZihyZ2JQbGFuZTIucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJnYiBwbGFuZTIiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUxLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICByZ2JQbGFuZTIudV9oZWlnaHQgPSAgcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgcmdiUGxhbmUyLnVfd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lMi51X3N0cmlkZSA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCozOwotICAgICAgICByZ2JQbGFuZTIudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAvKiBSZXNpemluZyAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmdiUGxhbmUxLCAmcmdiUGxhbmUyKTsKLSAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHJlc2l6aW5nIFJHQjg4OCB0byBSR0I4ODg6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLypDb252ZXJ0aW5nIFJlc2l6ZWQgUkdCODg4IHRvIFlVVjQyMCAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMiwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIGNvbnZlcnRpbmcgZnJvbSBSR0I4ODggdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUxLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgIH0KLWNsZWFudXA6Ci0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIGV4aXQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZShNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5wbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cGxhbmUpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00QUlSX1BhcmFtcyBhaXJQYXJhbXM7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzVGVtcFszXTsKLSAgICBNNE9TQV9VSW50MzIgaSA9IDA7Ci0KLSAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0cGxhbmVbMF0ucGFjX2RhdGEsIFlfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgKHBPdXRwbGFuZVswXS51X2hlaWdodCpwT3V0cGxhbmVbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dHBsYW5lWzFdLnBhY19kYXRhLCBVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgIChwT3V0cGxhbmVbMV0udV9oZWlnaHQqcE91dHBsYW5lWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRwbGFuZVsyXS5wYWNfZGF0YSwgVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAocE91dHBsYW5lWzJdLnVfaGVpZ2h0KnBPdXRwbGFuZVsyXS51X3N0cmlkZSkpOwotICAgIH0KLQotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rUmVzaXppbmcpIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4KLSAgICAgICAgKiBGcm9tIHRoZSBpbnRlcm1lZGlhdGUgZnJhbWUgdG8gdGhlIGVuY29kZXIgaW1hZ2UgcGxhbmUgKi8KLSAgICAgICAgZXJyID0gTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucGxhbmUsIHBPdXRwbGFuZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBNNFZpRmlsUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVZID0KLSAgICAgICAgICAgIHBPdXRwbGFuZVswXS5wYWNfZGF0YSArIHBPdXRwbGFuZVswXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVVID0KLSAgICAgICAgICAgIHBPdXRwbGFuZVsxXS5wYWNfZGF0YSArIHBPdXRwbGFuZVsxXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVWID0KLSAgICAgICAgICAgIHBPdXRwbGFuZVsyXS5wYWNfZGF0YSArIHBPdXRwbGFuZVsyXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVkgPSBNNE9TQV9OVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVVID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lViA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgLyogVG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgICAgICAvKiBJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcElucGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBJbnBsYW5lLT51X3dpZHRoOwotICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwT3V0cGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICBhaXJQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAvKioKLSAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IHBPdXRwbGFuZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGUgPSBwT3V0cGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gcE91dHBsYW5lWzFdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSA9IHBPdXRwbGFuZVsxXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwT3V0cGxhbmVbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcE91dHBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQWxsb2NhdGVzIHBsYW4gaW4gbG9jYWwgaW1hZ2UgcGxhbmUgc3RydWN0dXJlICovCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFkiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInBJbWFnZVBsYW5lVGVtcCBVIikgOwotICAgICAgICAgICAgaWYgKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlOiBBbGxvYyBFcnJvciIpOwotICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInBJbWFnZVBsYW5lVGVtcCBWIikgOwotICAgICAgICAgICAgaWYgKHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlOiBBbGxvYyBFcnJvciIpOwotICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBJblBsYW5lWSA9IHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgOwotICAgICAgICAgICAgcEluUGxhbmVVID0gcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVYgPSBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhIDsKLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSwgWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSwgVV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSwgVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSkpOwotCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocElucGxhbmUtPnVfaGVpZ2h0ICogcE91dHBsYW5lLT51X3dpZHRoKSAvcElucGxhbmUtPnVfd2lkdGg7Ci0KLSAgICAgICAgICAgIGlmIChoZWlnaHQgPD0gcE91dHBsYW5lLT51X2hlaWdodCkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCB0aGUgYm90dG9tIHNpZGUgKi8KLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwT3V0cGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBOdW1iZXIgb2YgbGluZXMgYXQgdGhlIHRvcCAqLwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpICoKLSAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSAqCi0gICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSAqCi0gICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBCbGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUgKi8KLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcE91dHBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocElucGxhbmUtPnVfd2lkdGggKiBwT3V0cGxhbmUtPnVfaGVpZ2h0KS9wSW5wbGFuZS0+dV9oZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpPj4xKSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFdpZHRoIGFuZCBoZWlnaHQgaGF2ZSB0byBiZSBldmVuICovCi0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENoZWNrIHRoYXQgdmFsdWVzIGFyZSBjb2hlcmVudCAqLwotICAgICAgICAgICAgaWYgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PQotICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1lZGlhIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0Nyb3BwaW5nKSB7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcE91dHBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgICAgIGlmICgoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqCi0gICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKS9haXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPAotICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgLyogSGVpZ2h0IHdpbGwgYmUgY3JvcHBlZCAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKS9haXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpKChwSW5wbGFuZS0+dV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBXaWR0aCB3aWxsIGJlIGNyb3BwZWQgKi8KLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KS9haXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBJbnBsYW5lLT51X3dpZHRoIC0KLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSk+PjEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBPdXRwbGFuZTsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIEFJUiBmdW5jdGlvbnMgKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fYWlyX2NvbnRleHQpIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NyZWF0ZSgmcEMtPm1fYWlyX2NvbnRleHQsIE00QUlSX2tZVVY0MjBQKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRBSVJfY3JlYXRlIHJldHVybmVkIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2NvbmZpZ3VyZShwQy0+bV9haXJfY29udGV4dCwgJmFpclBhcmFtcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGNvbmZpZ3VyaW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChwQy0+bV9haXJfY29udGV4dCwgcElucGxhbmUsIHBQbGFuZVRlbXApOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlOiBcCi0gICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBnZXR0aW5nIEFJUiBwbGFuZTogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwT3V0cGxhbmVbMF0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVksICh2b2lkICopcEluUGxhbmVZLAotICAgICAgICAgICAgICAgICAgICAgICAgcE91dHBsYW5lWzBdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lWSArPSBwT3V0cGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVZICs9IHBPdXRwbGFuZVswXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBPdXRwbGFuZVsxXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lVSwgKHZvaWQgKilwSW5QbGFuZVUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0cGxhbmVbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVVICs9IHBPdXRwbGFuZVsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcE91dHBsYW5lWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpPTA7IGk8cE91dHBsYW5lWzJdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVWLCAodm9pZCAqKXBJblBsYW5lViwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwbGFuZVsyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVYgKz0gcE91dHBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lViArPSBwT3V0cGxhbmVbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci1jbGVhblVwOgotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgaWYgKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiBwQ2xpcEN0eHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnI9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIFlVViBwbGFuZQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2ID0KLSAgICAgKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIqKSJwUGxhbmVZdXYiKTsKLQotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1diA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljSGVpZ2h0OwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfc3RyaWRlID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgPQotICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggKiAxLjUsCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV9oZWlnaHQgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3N0cmlkZSA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfd2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgKwotICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoKTsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfaGVpZ2h0ID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9oZWlnaHQgPj4xOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfd2lkdGggPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoID4+IDE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV9zdHJpZGUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoCi0gICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnBhY19kYXRhICsKLSAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfaGVpZ2h0ICogcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aCk7Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCAoCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5wRmlsZSwKLSAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXYsCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGgsCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljSGVpZ2h0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgWVVWIGRhdGEgdG8gdGhlIGRlY29kZXIgdXNpbmcgc2V0b3B0aW9uCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbiAoCi0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9EZWNZdXZEYXRhLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSA9IE00T1NBX1RSVUU7Ci0KLSAgICAvLyBBbGxvY2F0ZSBZdXYgcGxhbmUgd2l0aCBlZmZlY3QKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPQotICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyKikicFBsYW5lWXV2V2l0aEVmZmVjdCIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQgPSBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQ7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGggPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9zdHJpZGUgPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSA9Ci0gICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCAqIHBDLT5ld2MudWlWaWRlb1dpZHRoICogMS41LAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJpbWFnZUNsaXAgWVVWIGRhdGEiKTsKLSAgICBpZiAocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV9oZWlnaHQgPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQgPj4xOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoID0KLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV9zdHJpZGUgPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoCi0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSArCi0gICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCk7Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0udV9oZWlnaHQgPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQgPj4xOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3dpZHRoID0KLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0udV9zdHJpZGUgPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoCi0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSArCi0gICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV93aWR0aCk7Ci0KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdENvbnRpZ3VvdXMsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYklzQ2xpcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFJlc2l6ZVBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU5vUmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggbnVtRWZmZWN0cyA9IDA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBEZWNvZGVyUmVuZGVyRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB5dXZGcmFtZVdpZHRoID0gMCwgeXV2RnJhbWVIZWlnaHQgPSAwOwotICAgIE00VklGSV9JbWFnZVBsYW5lKiBwVG1wID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcFszXTsKLSAgICBNNE9TQV9VSW50OCBpID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTa2lwRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgbWVtc2V0KCh2b2lkICopcFRlbXAsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgLyogUmVzaXplIG9yIHJvdGF0ZSBjYXNlICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFJlc2l6ZVBsYW5lLAotICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoLAotICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgKHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9GQUxTRSkpIHsKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX1RSVUUpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX0ZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RSZW5kZXIoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgIGlmICgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotICAgICAgICAgICAgICAgIC8vIFNhdmUgd2lkdGggYW5kIGhlaWdodCBvZiB1bi1yb3RhdGVkIGZyYW1lCi0gICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCA9IHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aDsKLSAgICAgICAgICAgICAgICB5dXZGcmFtZUhlaWdodCA9IHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVWaWRlbygpIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbmV3IHZpZGVvIHNpemUgZm9yIHRlbXBvcmFyeSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUocFJlc2l6ZVBsYW5lLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJJc0NsaXAxID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbnVtRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAvKiBJZiB2aWRlbyBmcmFtZSBuZWVkIHRvIGJlIHJlc2l6ZWQgb3Igcm90YXRlZCwKLSAgICAgICAgICAgICAqIHRoZW4gYXBwbHkgdGhlIG92ZXJsYXkgYWZ0ZXIgdGhlIGZyYW1lIHdhcyByZW5kZXJlZCB3aXRoIHJlbmRlcmluZyBtb2RlLgotICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgIGJTa2lwRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywKLSAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lLCBwUmVzaXplUGxhbmUsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdCgpIGVyciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFJlc2l6ZVBsYW5lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgaWYgKChwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpKSB7Ci0gICAgICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMF0udV93aWR0aCwgcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcFRlbXA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlIChwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSxwVG1wKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUgKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBUbXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGV4aXN0Ki8KLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsIHBDLT55dXYxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLCBwQy0+eXV2Mik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IHBDLT55dXYyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0OwotICAgICAgICB9Ci0gICAgICAgIC8vIGZyZWUgdGhlIHRlbXAgYnVmZmVyCi0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPT0gMCkgJiYKLSAgICAgICAgICAgICAocENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX1RSVUUpKSB7Ci0gICAgICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnl1djEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdE5vbkNvbnRpZ3VvdXMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT55dXYyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIG51bGwgZGVjb2RlciBzZXRPcHRpb24gZXJyb3IgMHgleCAiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc2V0IG9yaWdpbmFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHJlc2l6ZSBmcmFtZSBwbGFuZQotICAgICAgICBpZiAoMCAhPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgJiYKLSAgICAgICAgICAgIDE4MCAhPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMpIHsKLQotICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFlVVjQyMFBsYW5lKHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCwgeXV2RnJhbWVIZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiBObyByb3RhdGUgb3Igbm8gcmVzaXplIGNhc2UqLwotICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgbnVtRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihudW1FZmZlY3RzID4gMCkgewotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywgcFBsYW5lTm9SZXNpemUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgUmVuZGVyIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsIHBQbGFuZU5vUmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT55dXYxLCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IHBDLT55dXYxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwQy0+Yklzc2Vjb25kQ2xpcCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsIHBQbGFuZU5vUmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT55dXYyLCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IHBDLT55dXYyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdCBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywgcFRtcCwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBSZW5kZXIgcmV0dXJucyBlcnJvciAweCV4LCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9SZW5kZXJDdHMgPSAoTTRPU0FfSW50MzIpdHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSb3RhdGVWaWRlbyhNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiByb3RhdGlvbkRlZ3JlZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgb3V0UGxhbmVbM107Ci0KLSAgICBpZiAocm90YXRpb25EZWdyZWUgIT0gMTgwKSB7Ci0gICAgICAgIC8vIFN3YXAgd2lkdGggYW5kIGhlaWdodCBvZiBpbiBwbGFuZQotICAgICAgICBvdXRQbGFuZVswXS51X3dpZHRoID0gcFBsYW5lSW5bMF0udV9oZWlnaHQ7Ci0gICAgICAgIG91dFBsYW5lWzBdLnVfaGVpZ2h0ID0gcFBsYW5lSW5bMF0udV93aWR0aDsKLSAgICAgICAgb3V0UGxhbmVbMF0udV9zdHJpZGUgPSBvdXRQbGFuZVswXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVswXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVswXS51X3N0cmlkZSpvdXRQbGFuZVswXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgWSBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRQbGFuZVsxXS51X3dpZHRoID0gcFBsYW5lSW5bMF0udV9oZWlnaHQvMjsKLSAgICAgICAgb3V0UGxhbmVbMV0udV9oZWlnaHQgPSBwUGxhbmVJblswXS51X3dpZHRoLzI7Ci0gICAgICAgIG91dFBsYW5lWzFdLnVfc3RyaWRlID0gb3V0UGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgb3V0UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgb3V0UGxhbmVbMV0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAob3V0UGxhbmVbMV0udV9zdHJpZGUqb3V0UGxhbmVbMV0udV9oZWlnaHQpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgib3V0IFUgcGxhbmUgZm9yIHJvdGF0aW9uIikpOwotICAgICAgICBpZiAob3V0UGxhbmVbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dFBsYW5lWzJdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodC8yOwotICAgICAgICBvdXRQbGFuZVsyXS51X2hlaWdodCA9IHBQbGFuZUluWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgb3V0UGxhbmVbMl0udV9zdHJpZGUgPSBvdXRQbGFuZVsyXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVsyXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVsyXS51X3N0cmlkZSpvdXRQbGFuZVsyXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgViBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN3aXRjaChyb3RhdGlvbkRlZ3JlZSkgewotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwUGxhbmVJbiwgb3V0UGxhbmUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAvLyBJbiBwbGFuZSByb3RhdGlvbiwgc28gcGxhbmVPdXQgPSBwbGFuZUluCi0gICAgICAgICAgICBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcFBsYW5lSW4sIHBQbGFuZUluKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBvdXRQbGFuZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImludmFsaWQgcm90YXRpb24gcGFyYW0gJWQiLCAoaW50KXJvdGF0aW9uRGVncmVlKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lSW5bMF0ucGFjX2RhdGEsIDAsCi0gICAgICAgICAgICAocFBsYW5lSW5bMF0udV93aWR0aCpwUGxhbmVJblswXS51X2hlaWdodCkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVJblsxXS5wYWNfZGF0YSwgMCwKLSAgICAgICAgICAgIChwUGxhbmVJblsxXS51X3dpZHRoKnBQbGFuZUluWzFdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZUluWzJdLnBhY19kYXRhLCAwLAotICAgICAgICAgICAgKHBQbGFuZUluWzJdLnVfd2lkdGgqcFBsYW5lSW5bMl0udV9oZWlnaHQpKTsKLSAgICAgICAgLy8gQ29weSBZLCBVIGFuZCBWIHBsYW5lcwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVJblswXS5wYWNfZGF0YSwgKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIChwUGxhbmVJblswXS51X3dpZHRoKnBQbGFuZUluWzBdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZUluWzFdLnBhY19kYXRhLCAodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgKHBQbGFuZUluWzFdLnVfd2lkdGgqcFBsYW5lSW5bMV0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lSW5bMl0ucGFjX2RhdGEsICh2b2lkICopb3V0UGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAocFBsYW5lSW5bMl0udV93aWR0aCpwUGxhbmVJblsyXS51X2hlaWdodCkpOwotCi0gICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVsyXS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgLy8gU3dhcCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW4gcGxhbmUKLSAgICAgICAgdWludDMyX3QgdGVtcCA9IDA7Ci0gICAgICAgIHRlbXAgPSBwUGxhbmVJblswXS51X3dpZHRoOwotICAgICAgICBwUGxhbmVJblswXS51X3dpZHRoID0gcFBsYW5lSW5bMF0udV9oZWlnaHQ7Ci0gICAgICAgIHBQbGFuZUluWzBdLnVfaGVpZ2h0ID0gdGVtcDsKLSAgICAgICAgcFBsYW5lSW5bMF0udV9zdHJpZGUgPSBwUGxhbmVJblswXS51X3dpZHRoOwotCi0gICAgICAgIHRlbXAgPSBwUGxhbmVJblsxXS51X3dpZHRoOwotICAgICAgICBwUGxhbmVJblsxXS51X3dpZHRoID0gcFBsYW5lSW5bMV0udV9oZWlnaHQ7Ci0gICAgICAgIHBQbGFuZUluWzFdLnVfaGVpZ2h0ID0gdGVtcDsKLSAgICAgICAgcFBsYW5lSW5bMV0udV9zdHJpZGUgPSBwUGxhbmVJblsxXS51X3dpZHRoOwotCi0gICAgICAgIHRlbXAgPSBwUGxhbmVJblsyXS51X3dpZHRoOwotICAgICAgICBwUGxhbmVJblsyXS51X3dpZHRoID0gcFBsYW5lSW5bMl0udV9oZWlnaHQ7Ci0gICAgICAgIHBQbGFuZUluWzJdLnVfaGVpZ2h0ID0gdGVtcDsKLSAgICAgICAgcFBsYW5lSW5bMl0udV9zdHJpZGUgPSBwUGxhbmVJblsyXS51X3dpZHRoOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUqIHBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBpZiAocGxhbmVJbiA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJOVUxMIGluIHBsYW5lLCBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBsYW5lSW5bMF0udV93aWR0aCA9IHdpZHRoOwotICAgIHBsYW5lSW5bMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVJblswXS51X3N0cmlkZSA9IHBsYW5lSW5bMF0udV93aWR0aDsKLQotICAgIHBsYW5lSW5bMV0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVJblsxXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lSW5bMV0udV9zdHJpZGUgPSBwbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICBwbGFuZUluWzJdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lSW5bMl0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZUluWzJdLnVfc3RyaWRlID0gcGxhbmVJblsxXS51X3dpZHRoOwotCi0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjMwZjcwNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKLSAqIEBicmllZiAgICBNZWRpYSByZWFkZXJzIGFuZCBjb2RlY3Mgc3Vic2NyaXB0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgc3Vic2NyaXB0aW9uIG9mIHN1cHBvcnRlZCBtZWRpYQotICogICAgICAgICAgICByZWFkZXJzIGFuZCBkZWNvZGVycyBmb3IgdGhlIFZTUy4gUG90ZW50aWFsIHN1cHBvcnQgY2FuCi0gKiAgICAgICAgICAgIGJlIGFjdGl2YXRlZCBvciBkZS1hY3RpdmF0ZWQKLSAqICAgICAgICAgICAgdXNpbmcgY29tcGlsYXRpb24gZmxhZ3Mgc2V0IGluIHRoZSBwcm9qZWN0cyBzZXR0aW5ncy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIiAgICAgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIFZTUyBzcGVjaWZpYyB0eXBlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIiAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIG1vZHVsZSAqLwotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgcmVhZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBSZWFkZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHJlYWRlciBtdXN0IGJlIGRlZmluZWQgKi8KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfUENNCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTAotI2Vycm9yICJubyByZWFkZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00gKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgKi8KLQotLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgTVBFRzQgZGVjb2RlciAqLwotI2lmICFkZWZpbmVkKE00VlNTX1NVUFBPUlRfVklERUNfM0dQKSAmJiAhZGVmaW5lZChNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMpCi0jZXJyb3IgIldhaXQsIHdoYXQ/IgotLyogIkhleSwgdGhpcyBpcyB0aGUgVlNTM0dQUCBzcGVha2luZy4gUHJheSB0ZWxsLCBob3cgdGhlIGhlY2sgZG8geW91IGV4cGVjdCBtZSB0byBiZSBhYmxlIHRvIGRvCi1hbnkgZWRpdGluZyB3aXRob3V0IGEgYnVpbHQtaW4gdmlkZW8gZGVjb2Rlciwgbm9yIHRoZSBwb3NzaWJpbGl0eSB0byByZWNlaXZlIGFuIGV4dGVybmFsIG9uZT8hCi1TZXJpb3VzbHksIEknZCBsb3ZlIHRvIGtub3cuIiAqLwotI2VuZGlmCi0KLS8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggcmVhZGVyIHRvIHN1YnNjcmliZSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotI2luY2x1ZGUgIlZpZGVvRWRpdG9yM2dwUmVhZGVyLmgiCi0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSNpbmNsdWRlICJNNFJFQURFUl9BbXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSNpbmNsdWRlICJNNFJFQURFUl9QY20uaCIKLSNlbmRpZgotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIGF1ZGlvIGRlY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9OdWxsLmgiCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMCi0jaW5jbHVkZSAiTTRBRF9OdWxsLmgiCi0jZW5kaWYKLQotLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyogV3JpdGVyIHJlZ2lzdHJhdGlvbiA6IGF0IGxlYXN0IG9uZSB3cml0ZXIgbXVzdCBiZSBkZWZpbmVkICovCi0vLyNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLSNlcnJvciAibm8gd3JpdGVyIHJlZ2lzdGVyZWQiCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUCAqLwotLy8jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SICovCi0KLS8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggd3JpdGVyIHRvIHN1YnNjcmliZSAqLwotLy8jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SCi0vKmV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfQU1SX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOyovCi0vLyNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICB2aWRlbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgYXVkaW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLQotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTClcCi0gICAgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSByZWFkZXIsIGRlY29kZXJzLCB3cml0ZXJzIGFuZCBlbmNvZGVycwotICogICAgICAgICAgaW4gdGhlIFZTUy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDb250ZXh0KQotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRSRUFERVJfTWVkaWFUeXBlICAgICAgICAgIHJlYWRlck1lZGlhVHlwZTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgcFJlYWRlckdsb2JhbEludGVyZmFjZTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSAgICAgd3JpdGVyTWVkaWFUeXBlOwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICBwV3JpdGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICBhdWRpb0RlY29kZXJUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCAgICAgICBhdWRpb0NvZGVjVHlwZTsKLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqIHBBdWRpb0NvZGVjSW50ZXJmYWNlOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICBwQXVkaW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSAgICAgICAgIHZpZGVvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgICAgIHZpZGVvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICBwVmlkZW9Db2RlY0ludGVyZmFjZTsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgcFZpZGVvRGVjb2RlckludGVyZmFjZTsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgcmVhZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSAzR1AgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgJnBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfM0dQIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0gICAgLyogLS0tIEFNUiAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotICAgIGVyciA9IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKCAmcmVhZGVyTWVkaWFUeXBlLCAmcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgJnBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1SIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotICAgIGVyciA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9NUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUDMgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzICovCi0KLSAgICAvKiAtLS0gUENNIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfUENNCi0gICAgZXJyID0gTTRSRUFERVJfUENNX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ00gaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQQ00gcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfUENNICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHZpZGVvIGRlY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBNUEVHNCAmIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUAotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgmdmlkZW9EZWNvZGVyVHlwZSwgKE00T1NBX1ZvaWQgKikmcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00REVDT0RFUl9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoIHBDb250ZXh0LCB2aWRlb0RlY29kZXJUeXBlLCBwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QRUc0IGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMKLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgmdmlkZW9EZWNvZGVyVHlwZSwgKE00T1NBX1ZvaWQgKikmcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00REVDT0RFUl9IMjY0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgSDI2NCBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfTlVMTAotICAgIGVyciA9IE00REVDT0RFUl9OVUxMX2dldEludGVyZmFjZSgKLSAgICAgICAgICAgICAgJnZpZGVvRGVjb2RlclR5cGUsICZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VkQgTlVMTCBEZWNvZGVyIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogXAotICAgICAgICBjYW4ndCByZWdpc3RlciB2aWRlbyBOVUxMIGRlY29kZXIiKTsKLSNlbmRpZgotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIEFNUk5CIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNCBBTVJOQiBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLCBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEFNUk5CIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICovCi0KLSAgICAvKiAtLS0gQUFDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00IEFBQyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLCBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEFBQyBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMgKi8KLQotICAgIC8qIC0tLSBNUDMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX01QMwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9NUDMoJmF1ZGlvRGVjb2RlclR5cGUsICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTQgTVAzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVAzIGRlY29kZXIiKTsKLSNlbmRpZiAgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19NUDMgKi8KLQotCi0gICAgLyogLS0tIE5VTEwgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwKLSAgICBlcnIgPSBNNEFEX05VTExfZ2V0SW50ZXJmYWNlKCAmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFEIE5VTEwgRGVjb2RlciBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLCBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEVWUkMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLQotICAgIC8qIC0tLSAzR1BQIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotICAgIC8qIHJldHJpZXZlcyB0aGUgM0dQUCB3cml0ZXIgbWVkaWEgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCAmd3JpdGVyTWVkaWFUeXBlLCAmcFdyaXRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgJnBXcml0ZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciggcENvbnRleHQsIHdyaXRlck1lZGlhVHlwZSwgcFdyaXRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQUCB3cml0ZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBNUEVHNCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotICAgIC8qIHJldHJpZXZlcyB0aGUgTVBFRzQgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZ2aWRlb0NvZGVjVHlwZSwgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfTVBFRzQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIE1QRUc0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotICAgIC8qIC0tLSBIMjYzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBIMjYzIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKCZ2aWRlb0NvZGVjVHlwZSwgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfSDI2MyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gSDI2MyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0ICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0gICAgLyogcmV0cmlldmVzIHRoZSBIMjY0IGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZ2aWRlb0NvZGVjVHlwZSwgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogTTRIMjY0RSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gSDI2NCBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQyAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUgotICAgIC8qIHJldHJpZXZlcyB0aGUgQU1SIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9Db2RlY1R5cGUsICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QU1SIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLCBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBBTVIgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIgKi8KLQotICAgIC8qIC0tLSBBQUMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQUFDCi0gICAgLyogcmV0cmlldmVzIHRoZSBBQUMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FBQygmYXVkaW9Db2RlY1R5cGUsICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLCBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBBQUMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMgKi8KLQotICAgIC8qIC0tLSBFVlJDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0VWUkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEVWUkMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gTTRFVlJDX2dldEludGVyZmFjZXMoICZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRFVlJDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLCBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBFVlJDIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfRVZSQyAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgcENvbnRleHQtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSA9IE00T1NBX1RSVUU7ICAgLyogd2hlbiBOWFAgU1cgY29kZWNzIGFyZSByZWdpc3RlcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBhbGxvdyB1bnJlZ2lzdHJhdGlvbiovCi0jZW5kaWYKLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNHhWU1NfQVBJLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWY1NDEwYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYworKysgL2Rldi9udWxsCkBAIC0xLDYzNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00eFZTU19BUEkuYwotICogQGJyaWVmICAgIEFQSSBvZiBlWHRlbmRlZCBWaWRlbyBTdHVkaW8gU2VydmljZSAoVmlkZW8gU3R1ZGlvIDIuMSkKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiBPU0FMIG1haW4gdHlwZXMgYW5kIGVycm9ycyAqKiovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuaCIKLQotLyoqCi0gKiBWU1MgM0dQUCBBUEkgZGVmaW5pdGlvbiAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqCi1CZWdpbiBvZiB4VlNTIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIk00eFZTU19JbnRlcm5hbC5oIgotCi0vKiBSQzogdG8gZGVsZXRlIHVuZWNlc3NhcnkgdGVtcCBmaWxlcyBvbiB0aGUgZmx5ICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19Jbml0KE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNHhWU1NfSW5pdFBhcmFtcyogcFBhcmFtcykKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgeFZTUwotICogQG5vdGUgICAgICAgIEluaXRpYWxpemVzIHRoZSB4VlNTIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcGFyYW1zICAgICAgICAgICAgICAgIChJTikgUGFyYW1ldGVycyBtYW5kYXRvcnkgZm9yIHhWU1MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX0luaXQoIE00T1NBX0NvbnRleHQgKnBDb250ZXh0LCBNNHhWU1NfSW5pdFBhcmFtcyAqcFBhcmFtcyApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMCwgaTsKLQotICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlBhcmFtZXRlciBzdHJ1Y3R1cmUgZm9yIE00eFZTU19Jbml0IGZ1bmN0aW9uIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cEZpbGVSZWFkUHRyID09IE00T1NBX05VTEwKLSAgICAgICAgfHwgcFBhcmFtcy0+cEZpbGVXcml0ZVB0ciA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgInBGaWxlUmVhZFB0ciBvciBwRmlsZVdyaXRlUHRyIGluIE00eFZTU19Jbml0UGFyYW1zIHN0cnVjdHVyZSBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfQ29udGV4dCksIE00VlMsCi0gICAgICAgIChNNE9TQV9DaGFyICopIkNvbnRleHQgb2YgdGhlIHhWU1MgbGF5ZXIiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSBmaWxlIHJlYWQvd3JpdGUgZnVuY3Rpb25zIHBvaW50ZXJzICovCi0gICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIgPSBwUGFyYW1zLT5wRmlsZVJlYWRQdHI7Ci0gICAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyID0gcFBhcmFtcy0+cEZpbGVXcml0ZVB0cjsKLQotICAgIC8qVVRGIENvbnZlcnNpb24gc3VwcG9ydDogY29weSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBwb2ludGVycyBhbmQgYWxsb2NhdGUgdGhlIHRlbXBvcmFyeQotICAgICBidWZmZXIqLwotICAgIGlmKCBwUGFyYW1zLT5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgaWYoIHBQYXJhbXMtPnBDb252VG9VVEY4RmN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgPQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBDb252RnJvbVVURjhGY3Q7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0ID0KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wQ29udlRvVVRGOEZjdDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPQotICAgICAgICAgICAgICAgIFVURl9DT05WRVJTSU9OX0JVRkZFUl9TSVpFOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKFVURl9DT05WRVJTSU9OX0JVRkZFUl9TSVpFCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDgpLAotICAgICAgICAgICAgICAgIE00VkEsIChNNE9TQV9DaGFyICopIk00eFZTU19Jbml0OiBVVEYgY29udmVyc2lvbiBidWZmZXIiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICA9PSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX0luaXQiKTsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19Jbml0OiBvbmUgVVRGIGNvbnZlcnNpb24gcG9pbnRlciBpcyBudWxsIGFuZCB0aGUgb3RoZXJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgbnVsbCIpOwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9IDA7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyID0KLSAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIHBQYXJhbXMtPnBUZW1wUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qTm8gbmVlZCB0byBjb252ZXJ0IGludG8gVVRGOCBhcyBhbGwgaW5wdXQgb2YgeFZTUyBhcmUgaW4gVVRGOAotICAgICAgICAodGhlIGNvbnZlcnNpb24gY3VzdG9tZXIgZm9ybWF0IGludG8gVVRGOAotICAgICAgICBpcyBkb25lIGluIFZBL1ZBTCkqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4ocFBhcmFtcy0+cFRlbXBQYXRoKSArIDEsCi0gICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTIFBhdGggZm9yIHRlbXBvcmFyeSBmaWxlcyIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX0luaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgKHZvaWQgKilwUGFyYW1zLT5wVGVtcFBhdGgsCi0gICAgICAgICAgICBzdHJsZW4ocFBhcmFtcy0+cFRlbXBQYXRoKSArIDEpOwotICAgICAgICAvKiBUT0RPOiBDaGVjayB0aGF0IG5vIHByZXZpb3VzIHhWU1MgdGVtcG9yYXJ5IGZpbGVzIGFyZSBwcmVzZW50ID8gKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlBhdGggZm9yIHRlbXBvcmFyeSBmaWxlcyBpcyBOVUxMIik7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9Ci0gICAgICAgIChNNFZTUzNHUFBfRWRpdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfRWRpdFNldHRpbmdzKSwKLSAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29weSBvZiBWU1Mgc3RydWN0dXJlIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGggPSBNNE9TQV9OVUxMOwotICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHBvaW50ZXJzIGluIHBTZXR0aW5ncyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsgLyogUkMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogVGhpcyBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIHVzZXIgaGFzIGFkZGVkIG9yIHJlbW92ZWQgc29tZSBtZWRpYXMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciA9IDA7Ci0KLSAgICAvKiAiU3RhdGUgbWFjaGluZSIgKi8KLSAgICB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwID0gMDsKLSAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0gMDsKLQotICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogSW5pdGlhbGl6ZSBQdG8zR1BQIGFuZCBNQ1MgbGlzdHMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotCi0gICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4ID0gMDsKLQotICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMDsKLQotICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRUaW1lc2NhbGUgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qRkI6IGluaXRpYWxpemUgdG8gYXZvaWQgY3Jhc2ggd2hlbiBlcnJvciBkdXJpbmcgdGhlIGVkaXRpbmcqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogSW5pdGlhbGl6ZSBzdGF0ZSBpZiBhbGwgaW5pdGlhbGl6YXRpb25zIGFyZSBjb3JyZWN0cyAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVJbml0aWFsaXplZDsKLQotICAgIC8qIGluaXRpYWxpemUgTUNTIGNvbnRleHQqLwotICAgIHhWU1NfY29udGV4dC0+cE1DU19DdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICpwQ29udGV4dCA9IHhWU1NfY29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgZ2l2ZW4gZWRpdGluZyBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8KLSAqICAgICAgICAgICAgICAgIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgaWYgbmVlZGVkLCBjaGFuZ2VzIHRoZQotICogICAgICAgICAgICAgICAgb3V0cHV0IHBhcmFtZXRlcnMgKFZpZGVvIGNvZGVjLCB2aWRlbyBzaXplLCBhdWRpbyBjb2RlYywKLSAqICAgICAgICAgICAgICAgIGF1ZGlvIG5iIG9mIGNoYW5uZWxzKSB0byBtaW5pbWl6ZSB0aGUgdHJhbnNjb2RpbmcgdGltZS4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgRWRpdGlvbiBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqcFNldHRpbmdzICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0gICAgTTRPU0FfVUludDggaSwgajsKLSAgICBNNE9TQV9Cb29sIGJBdWRpb1RyYW5zaXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJJc0JHTVJlcGxhY2UgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJGb3VuZDsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9Db25maWdbOV0gPQotICAgIHsKLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotICAgIH07Ci0gICAgLyoqIEluZGV4IDwtPiBWaWRlbyBjb25maWcgKiovCi0gICAgLyogMDogICAgICAgIEgyNjMgIFNRQ0lGICAgICAgICAqLwotICAgIC8qIDE6ICAgICAgICBIMjYzICBRQ0lGICAgICAgICAqLwotICAgIC8qIDI6ICAgICAgICBIMjYzICBDSUYgICAgICAgICovCi0gICAgLyogMzogICAgICAgIE1QRUc0IFNRQ0lGICAgICAgICAqLwotICAgIC8qIDQ6ICAgICAgICBNUEVHNCBRUVZHQSAgICAgICAgKi8KLSAgICAvKiA1OiAgICAgICAgTVBFRzQgUUNJRiAgICAgICAgKi8KLSAgICAvKiA2OiAgICAgICAgTVBFRzQgUVZHQSAgICAgICAgKi8KLSAgICAvKiA3OiAgICAgICAgTVBFRzQgQ0lGICAgICAgICAqLwotICAgIC8qIDg6ICAgICAgICBNUEVHNCBWR0EgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgTTRPU0FfVUludDMyIGF1ZGlvQ29uZmlnWzNdID0KLSAgICB7Ci0gICAgICAgIDAsIDAsIDAKLSAgICB9OwotICAgIC8qKiBJbmRleCA8LT4gQXVkaW8gY29uZmlnICoqLwotICAgIC8qIDA6ICAgIEFNUiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAxOiAgICBBQUMgICAgMTZrSHogbW9ubyAgICAgICAgKi8KLSAgICAvKiAyOiAgICBBQUMgMTZrSHogc3RlcmVvICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkIFwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5tX3N0YXRlICE9IE00eFZTU19rU3RhdGVPcGVuZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiQmFkIHN0YXRlIHdoZW4gY2FsbGluZyBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgbnVtYmVyIG9mIGNsaXBzICovCi0gICAgaWYoIHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID09IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlRoZSBudW1iZXIgb2YgaW5wdXQgY2xpcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwICEiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIGJhY2tncm91bmQgbXVzaWMsIGFuZCBpZiBpdHMgYXVkaW8gd2lsbCByZXBsYWNlIGlucHV0IGNsaXAgYXVkaW8gKi8KLSAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9PSAxMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiSXNCR01SZXBsYWNlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFBhcnNlIGFsbCBjbGlwcywgYW5kIGdpdmUgb2NjdXJlbmNlcyBvZiBlYWNoIGNvbWJpbmF0aW9uICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qIFdlIGlnbm9yZSBKUEcgaW5wdXQgZmlsZXMgYXMgdGhleSBhcmUgYWx3YXlzIHRyYW5zY29kZWQgKi8KLSAgICAgICAgaWYoIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQqLwotICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIENvbnZlcnRlZFNpemUgPSAwOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgJkNvbnZlcnRlZFNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUmVkdWNlVHJhbnNjb2RlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSB1dGYgY29udmVyc2lvbiwgbm93IHVzZSB0aGUgY29udmVydGVkIHBhdGgqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICAvL2VyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAvLyAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgTUNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQ2hlY2sgYmVzdCB2aWRlbyBzZXR0aW5ncyAqLwotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAxMjgKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDk2ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjYzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzBdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1szXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAxNjAKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDEyMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s0XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAxNzYKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDE0NCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2MyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1sxXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbNV0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gMzIwCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSAyNDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbNl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gMzUyCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSAyODggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbMl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzddICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDY0MAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gNDgwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzhdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIEJHTSB0aGF0IHJlcGxhY2VzIGV4aXN0aW5nIGF1ZGlvIHRyYWNrLCB3ZSBkbyBub3QgY2FyZSBhYm91dAotICAgICAgICAgICAgYXVkaW8gdHJhY2sgYXMgaXQgd2lsbCBiZSByZXBsYWNlZCAqLwotICAgICAgICAgICAgLyogSWYgbm90LCB3ZSB0cnkgdG8gbWluaW1pemUgYXVkaW8gcmVlbmNvZGluZyAqLwotICAgICAgICAgICAgaWYoIGJJc0JHTVJlcGxhY2UgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ29uZmlnWzFdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPT0gMiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ29uZmlnWzJdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5kIGJlc3Qgb3V0cHV0IHZpZGVvIGZvcm1hdCAodGhlIG1vc3Qgb2NjdXJpbmcgY29tYmluYXRpb24pICovCi0gICAgaiA9IDA7Ci0gICAgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IDk7IGkrKyApCi0gICAgewotICAgICAgICBpZiggdmlkZW9Db25maWdbaV0gPj0gdmlkZW9Db25maWdbal0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBqID0gaTsKLSAgICAgICAgICAgIGJGb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggYkZvdW5kICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1NRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0gyNjM7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0gyNjM7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1NRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRUVZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUVZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tWR0E7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5kIGJlc3Qgb3V0cHV0IGF1ZGlvIGZvcm1hdCAodGhlIG1vc3Qgb2NjdXJpbmcgY29tYmluYXRpb24pICovCi0gICAgaiA9IDA7Ci0gICAgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IDM7IGkrKyApCi0gICAgewotICAgICAgICBpZiggYXVkaW9Db25maWdbaV0gPj0gYXVkaW9Db25maWdbal0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBqID0gaTsKLSAgICAgICAgICAgIGJGb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggYkZvdW5kICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBQUM7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfU2VuZENvbW1hbmQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgdG8gdGhlIHhWU1MgYW4gZWRpdGluZyBzdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBhbmFseXNlcyB0aGlzIHN0cnVjdHVyZSwgYW5kIHByZXBhcmUgZWRpdGlvbgotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBNNHhWU1NfSW5pdCwgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgIE00eFZTU19DbG9zZUNvbW1hbmQsIG9yIGFmdGVyIE00eFZTU19QcmV2aWV3U3RvcC4KLSAqICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCB1bnRpbAotICogICAgICAgICAgICAgICAgaXQgcmV0dXJucyBhbm90aGVyIGVycm9yIHRoYW4gTTROT19FUlJPUi4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqcFNldHRpbmdzICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDggaSwgajsKLSAgICBNNE9TQV9VSW50OCBuYk9mU2FtZUNsaXAgPSAwOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfQm9vbCBpc05ld0JHTSA9IE00T1NBX1RSVUU7Ci0gICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zICpwUHRvM0dQUF9sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcE1DU19sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIGhlaWdodCwgc2FtcGxpbmdGcmVxOwotICAgIE00T1NBX0Jvb2wgYklzVHJhbnNjb2RpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9JbnQzMiB0b3RhbER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgTTRPU0FfSW50OCBtYXN0ZXJDbGlwID0gLTE7Ci0KLSAgICBpID0gMDsKLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkIFwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5tX3N0YXRlICE9IE00eFZTU19rU3RhdGVPcGVuZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiQmFkIHN0YXRlIHdoZW4gY2FsbGluZyBNNHhWU1NfU2VuZENvbW1hbmQgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBTdGF0ZSBpcyBiYWNrIHRvIGluaXRpYWxpemVkIHRvIGFsbG93IGNhbGwgb2YgY2xlYW51cCBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkOwotCi0gICAgLyogQ2hlY2sgaWYgYSBwcmV2aW91cyBzZW5kQ29tbWFuZCBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5wcmV2aW91c0NsaXBOdW1iZXIgIT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgLyogQ29tcGFyZSBCR00gaW5wdXQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICYmIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotCi0gICAgICAgICAgICBpZiggcENtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBhdWRpbyBvdXRwdXQgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPT0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSXQgbWVhbnMgdGhhdCBCR00gaXMgdGhlIHNhbWUgYXMgYmVmb3JlLCBzbywgbm8gbmVlZCB0byByZWRlY29kZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJCR00gaXMgdGhlIHNhbWUgYXMgYmVmb3JlLCBub3RoaW5nIHRvIGRlY29kZSIpOwotICAgICAgICAgICAgICAgICAgICBpc05ld0JHTSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVuYWxsb2NhdGUgUENNIHByZXZpZXcgZmlsZSBwYXRoIGluIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVuYWxsb2NhdGUgUENNIHByZXZpZXcgZmlsZSBwYXRoIGluIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIGlmIG91dHB1dCBzZXR0aW5ncyBoYXZlIGNoYW5nZWQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZQotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZQotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiBpdCBpcyB0aGUgY2FzZSwgd2UgY2FuJ3QgcmV1c2UgYWxyZWFkeSB0cmFuc2NvZGVkL2NvbnZlcnRlZCBmaWxlcyAqLwotICAgICAgICAgICAgLyogc28sIHdlIGRlbGV0ZSB0aGVzZSBmaWxlcyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXNfc2F1djsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVUZW1wKTsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfc2F1dik7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXMgPSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zX3NhdXY7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfYmdtID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSwgd2UgZG8gbm90IGRlbGV0ZSBCR00gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPmlzQkdNICE9IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVUZW1wKTsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX2JnbSA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlBSIFA0TUUwMDAwMzE4MiBpbml0aWFsaXplIHRoaXMgcG9pbnRlciBiZWNhdXNlIHRoZSBmb2xsb3dpbmcgcGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHdpbGwgYmUgZGVhbGxvY2F0ZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXMtPmlzQkdNICE9IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfYmdtLT5wTmV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfYmdtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogTWF5YmUgbmVlZCB0byBpbXBsZW1lbnQgZnJhbWVyYXRlIGNoYW5naW5nICovCi0gICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFVuYWxsb2NhdGUgcHJldmlvdXMgeFZTU19jb250ZXh0LT5wU2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgIE00eFZTU19mcmVlU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotCi0gICAgICAgIC8qVW5hbGxvY2F0ZSBvdXRwdXQgZmlsZSBwYXRoKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IDA7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgQ2xpcHMgcmVnaXN0ZXJpbmcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogQ29weSBzZXR0aW5ncyBmcm9tIHVzZXIgZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciAibG9jYWwiIHN0cnVjdHVyZSAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgIC8qeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gcFNldHRpbmdzLT5wT3V0cHV0RmlsZTsqLwotICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICBUaGUgb3V0cHV0IHZpZGVvIGFuZCBhdWRpbyBiaXRyYXRlIGFyZSBnaXZlbiBieSB0aGUgdXNlciBpbiB0aGUgZWRpdGlvbiBzZXR0aW5ncyBzdHJ1Y3R1cmUqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+UFRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+UFRWb2xMZXZlbDsKLQotICAgIC8qRkI6IGJ1ZyBmaXggaWYgdGhlIG91dHB1dCBwYXRoIGlzIGdpdmVuIGluIE00eFZTU19zZW5kQ29tbWFuZCovCi0KLSAgICBpZiggcFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICAgICAgLypBcyBhbGwgaW5wdXRzIG9mIHRoZSB4VlNTIGFyZSBpbiBVVEY4LCBjb252ZXJ0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGludG8gdGhlCi0gICAgICAgIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJvdXRwdXQgZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IHBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA9IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSA9IHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9Ci0gICAgICAgIDA7IC8qIFdpdGggVlNTIDIuMCwgdGhpcyBuZXcgcGFyYW0gaXMgbWFuZGF0b3J5ICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucFRleHRSZW5kZXJpbmdGY3QgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1MucFRleHRSZW5kZXJpbmdGY3Q7IC8qIENSIHRleHQgaGFuZGxpbmcgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZTsKLQotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgIT0gMCBcCi0gICAgICAgICYmIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCAhPSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfU2VuZENvbW1hbmQ6IEltcG9zc2libGUgdG8gbGltaXQgZmlsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSB3aXRoIG90aGVyIGF1ZGlvIG91dHB1dCB0aGFuIEFBQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMDsKLSAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwID0gMDsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCAhPSBNNFZJREVPRURJVElOR19rTVBFRzQKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQKLSAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0gyNjMKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQKLSAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0gyNjQgKQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICB9Ci0KLSAgICAvKiBHZXQgb3V0cHV0IHdpZHRoL2hlaWdodCAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgd2lkdGggPSAxMjg7Ci0gICAgICAgICAgICBoZWlnaHQgPSA5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgd2lkdGggPSAxNjA7Ci0gICAgICAgICAgICBoZWlnaHQgPSAxMjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgd2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBoZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgd2lkdGggPSAzMjA7Ci0gICAgICAgICAgICBoZWlnaHQgPSAyNDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDM1MjsKLSAgICAgICAgICAgIGhlaWdodCA9IDI4ODsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQToKLSAgICAgICAgICAgIHdpZHRoID0gNjQwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDgwMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICB3aWR0aCA9IDcyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyogLVBSIExWNTgwNyAqLwotICAgICAgICAgICAgLyogK0NSIEdvb2dsZSAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICAgICAgd2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBoZWlnaHQgPSAzNjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4NTRfNDgwOgotCi0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0KLSAgICAgICAgICAgIHdpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0KLSAgICAgICAgICAgIGhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgd2lkdGggPSAxMjgwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgICAgICAgICB3aWR0aCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgIGhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDk2MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIHdpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IE00RU5DT0RFUl8xOTIwXzEwODBfSGVpZ2h0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIC1DUiBHb29nbGUgKi8KLSAgICAgICAgZGVmYXVsdDogLyogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSAqLwotICAgICAgICAgICAgd2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBoZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogR2V0IG91dHB1dCBTYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gODAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDE2MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMjIwNTA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAyNDAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMyMDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDMyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gNDQxMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA0ODAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gODAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMTYwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIGNsaXAvdHJhbnNpdGlvbnMgaWYgY2xpcCBudW1iZXIgaXMgbm90IG51bGwgLi4uICovCi0gICAgaWYoIDAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyICkKLSAgICB7Ci0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopKnhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIsCi0gICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTLCBjb3B5IG9mIHBDbGlwTGlzdCIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLyogU2V0IGNsaXAgbGlzdCB0byBOVUxMICovCi0gICAgICAgIG1lbXNldCgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QsMCwKLSAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopCi0gICAgICAgICAgICAqeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxICkKLSAgICAgICAgewotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9Ci0gICAgICAgICAgICAgICAgKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKiogKSBcCi0gICAgICAgICAgICAgICAgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAqKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikgXAotICAgICAgICAgICAgICAgICJ4VlNTLCBjb3B5IG9mIHBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFNldCB0cmFuc2l0aW9uIGxpc3QgdG8gTlVMTCAqLwotICAgICAgICAgICAgbWVtc2V0KAotICAgICAgICAgICAgICAgICh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCwwLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopCi0gICAgICAgICAgICAgICAgKih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogZWxzZSwgdGhlcmUgaXMgYSBwYiBpbiB0aGUgaW5wdXQgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5vIGNsaXAgaW4gdGhpcyBzZXR0aW5ncyBsaXN0ICEhIik7Ci0gICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAvKiovCi0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogUkMgQWxsb2NhdGUgZWZmZWN0cyBzZXR0aW5ncyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHMgPSBwU2V0dGluZ3MtPm5iRWZmZWN0czsKLQotICAgIGlmKCAwIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cyApCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0cyA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgICh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyksCi0gICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJlZmZlY3RzIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLypGQiBidWcgZml4IDE5LjAzLjIwMDg6IHRoZXNlIHBvaW50ZXJzIHdlcmUgbm90IGluaXRpYWxpemVkIC0+IGNyYXNoIHdoZW4gZnJlZSovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0KLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qKi8KLSAgICB9Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBwVGFyZ2V0ZWRUaW1lU2NhbGUgPSAwOwotCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFRhcmdldGVkVGltZVNjYWxlKHhWU1NfY29udGV4dCwgcFNldHRpbmdzLAotICAgICAgICAgICAgJnBUYXJnZXRlZFRpbWVTY2FsZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyIHx8IHBUYXJnZXRlZFRpbWVTY2FsZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRUaW1lc2NhbGUgPSBwVGFyZ2V0ZWRUaW1lU2NhbGU7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0b3RhbCBkdXJhdGlvbiB2YXJpYWJsZSAqLwotICAgIHRvdGFsRHVyYXRpb24gPSAwOwotCi0gICAgLyogUGFyc2luZyBsaXN0IG9mIGNsaXBzIGdpdmVuIGJ5IGFwcGxpY2F0aW9uLCBhbmQgcHJlcGFyZSBhbmFseXppbmcgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICAvKiBBbGxvY2F0ZSBjdXJyZW50IGNsaXAgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgY2xpcCBzZXR0aW5ncyBmcm9tIGdpdmVuIHN0cnVjdHVyZSB0byBvdXIgeFZTU19jb250ZXh0IHN0cnVjdHVyZSAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sIE00T1NBX1RSVUUpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MgcmV0dXJuIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmJUcmFuc2NvZGluZ1JlcXVpcmVkID0KLSAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICBpZiggaSA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9Ci0gICAgICAgICAgICAgICAgKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikidHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSk7Ci0gICAgICAgICAgICAvKiBJbml0aWFsaXplIGV4dGVybmFsIGVmZmVjdCBjb250ZXh0IHRvIE5VTEwsIHRvIGtub3cgaWYgaW5wdXQganBnIGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgIGRlY29kZWQgb3Igbm90ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIHRyYW5zaXRpb24gdHlwZSBpcyBhbHBoYSBtYWdpYywgd2UgbmVlZCB0byBkZWNvZGUgaW5wdXQgZmlsZSAqLwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWM6Ci0gICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91ciBhbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgdG8gaGF2ZSBhIGNvcHkgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIG9uZSAqLwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gICAgICBcCi0gICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncyksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJJbnB1dCBBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgYWxwaGEgbWFnaWMgc2V0dGluZ3Mgc3RydWN0dXJlIHRvdSBvdXIKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3VyIGFscGhhIG1hZ2ljIGlucHV0IGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmxlbihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikiQWxwaGEgbWFnaWMgZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgYWxwaGEgbWFnaWMgZmlsZW5hbWUgdG8gb3VyICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock5Db3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwgc3RybGVuKAotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCkgKyAxKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZSBhbGwgdHJhbnNpdGlvbiB0byBrbm93IGlmIHRoZSBpbnB1dCBqcGcgaGFzIGFscmVhZHkgYmVlbiBkZWNvZGVkICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgaTsgaisrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBDbXBSZXN1bHQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcENtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYVNldHRpbmdzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxwaGEgbWFnaWMgc2V0dGluZ3Mgc3RydWN0dXJlIDEiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxwaGFTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+cFBsYW5lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLnRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPmJsZW5kaW5nUGVyY2VudCA+IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPmJsZW5kaW5nUGVyY2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50KSAqIDI1NSAvIDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPmJsZW5kaW5ndGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5pc3JldmVyc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+aXNyZXZlcnNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZSBpbnB1dCBqcGcgZmlsZSBmb3IgYWxwaGEgbWFnaWMgaGFzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gZGVjb2RlZCAtPiBubyBuZWRkIHRvIGRlY29kZSBpdCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IGFscGhhU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBqcGcgaGFzIG5vdCBiZWVuIGRlY29kZWQgeWV0IC4uLiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpvdXRwdXRQbGFuZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MgKmFscGhhU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGhfQVJHQjg4OCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+d2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0X0FSR0I4ODggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPmhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVHJhbnNpdGlvbkxpc3RNNHhWU1NfU2VuZENvbW1hbmQgd2lkdGggU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoX0FSR0I4ODgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUcmFuc2l0aW9uTGlzdE00eFZTU19TZW5kQ29tbWFuZCBoZWlnaHQhIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRfQVJHQjg4OCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IHBsYW5lIGZvciBBbHBoYSBtYWdpYyB0cmFuc2l0aW9uIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBvdXRwdXRQbGFuZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnVfc3RyaWRlID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoIHdpZHRoICogaGVpZ2h0ICogMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvYyBmb3IgdGhlIEFscGhhIG1hZ2ljIHBhY19kYXRhIG91dHB1dCBZVVYiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3dpZHRoID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0udV9zdHJpZGUgPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEgPSBvdXRwdXRQbGFuZVswXS5wYWNfZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0UGxhbmVbMF0udV93aWR0aCAqIG91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV93aWR0aCA9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X2hlaWdodCA9IGhlaWdodCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnVfc3RyaWRlID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnBhY19kYXRhID0gb3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG91dHB1dFBsYW5lWzFdLnVfd2lkdGggKiBvdXRwdXRQbGFuZVsxXS51X2hlaWdodDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBwQ29udkZyb21VVEY4RmN0IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiB0aGUgY29udmVyc2lvbiwgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogY29udmVydCArIHJlc2l6aW5nIGZyb20gQVJHQjg4ODggdG8geXV2NDIwICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgb3V0cHV0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfQVJHQjg4OCwgaGVpZ2h0X0FSR0I4ODgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG91dHB1dFBsYW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gZGVjb2RpbmcgYWxwaGEgbWFnaWMgSlBFRzogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYWxwaGEgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKSJBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgMiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxwaGFTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5wUGxhbmUgPSBvdXRwdXRQbGFuZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kaW5nUGVyY2VudCA+IDAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50IDw9IDEwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kaW5nUGVyY2VudCkgKiAyNTUgLyAyMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+aXNyZXZlcnNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3JldmVyc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0gTTR4VlNTX0FscGhhTWFnaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IGFscGhhU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX1NsaWRlVHJhbnNpdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICpzbGlkZVNldHRpbmdzOwotICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVTZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopIkludGVybmFsIHNsaWRlIHRyYW5zaXRpb24gc2V0dGluZ3MiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gc2xpZGVTZXR0aW5ncyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogSnVzdCBjb3B5IHRoZSBsb25lIHBhcmFtZXRlciBmcm9tIHRoZSBpbnB1dCBzZXR0aW5ncyB0byB0aGUgaW50ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNldHRpbmdzLT5kaXJlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLnRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MtPmRpcmVjdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbmVlZCB0byBrZWVwIG91ciBjb3B5IG9mIHRoZSBzZXR0aW5ncy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9ICZNNHhWU1NfU2xpZGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBzbGlkZVNldHRpbmdzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRmFkZUJsYWNrOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPSAmTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+RXh0VmlkZW9UcmFuc2l0aW9uRmN0OwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvVHJhbnNpdGlvblR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoCi0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbF9kdXJhdGlvbiB3aXRoIHRyYW5zaXRpb24gZHVyYXRpb24gKi8KLSAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gLT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+dWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PQotICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuaXNQYW5ab29tKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfaW1nW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgb3V0X2ltZ190bXBbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zICpwUGFyYW1zID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBBUkdCRmlsZUluOwotICAgICAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICAgICAgLyogUGFyc2UgUHRvM0dQUCBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGtub3cgaWYgaW5wdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuCi0gICAgICAgICAgICAgICAgY29udmVydGVkICovCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBDbXBSZXN1bHQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICAgICAgLyogV2UgcGFyc2UgYWxsIFB0bzNncHAgUGFyYW0gY2hhaW5lZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ21wUmVzdWx0ID0gc3RyY21wKChjb25zdCBjaGFyICopcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVJbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBQYXJhbXMtPmR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBQYXJhbXMtPmR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgKQotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgSlBHIGZpbGVuYW1lIHdpdGggZXhpc3RpbmcgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXBsYWNlQVJHQl8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHZhcmlhYmxlLCBpbiBjYXNlIHNvbWUgcGljdHVyZXMgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgYmV0d2VlbiB0d28gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGxzIHRvIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF9pbWcsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAoTTRPU0FfQ2hhciAqKSIlc2ltZyVkLjNncCIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE9TQV9jaHJTUHJpbnRmOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAjaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfY2hyU1ByaW50ZihvdXRfaW1nX3RtcCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsICIlc2ltZyVkLnRtcCIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE9TQV9jaHJTUHJpbnRmOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAjZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgbGFzdCBlbGVtZW50IFB0bzNHUFAgcGFyYW1zIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMgPSAoTTR4VlNTX1B0bzNHUFBfcGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUHRvM0dQUF9wYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJFbGVtZW50IG9mIFB0bzNHUFAgUGFyYW1zIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogUHJvYmxlbSB3aGVuIGFsbG9jYXRpbmcgb25lIGVsZW1lbnQgUHRvM0dQUCBQYXJhbXMiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemVzIHBmaWxleHh4IG1lbWJlcnMgb2YgcFBhcmFtcyB0byBiZSBhYmxlIHRvIGZyZWUgdGhlbSBjb3JyZWN0bHkgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wTmV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgPSBNNHhWU1Nfa1Jlc2l6aW5nOwotCi0gICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDpnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5oZWlnaHQgPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgaV0tPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQ7IC8vQVJHQl9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPndpZHRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbCi0gICAgICAgICAgICAgICAgICAgICAgICBpXS0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY1dpZHRoOyAvL0FSR0JfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiQ0xJUCBNNHhWU1NfU2VuZENvbW1hbmQgQVJHQjg4ODggSCA9ICVkIiwgcFBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJDTElQIE00eFZTU19TZW5kQ29tbWFuZCBBUkdCODg4OCBXID0gJWQiLCBwUGFyYW1zLT53aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBNZWFucyBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHhWU1MgY29udGV4dCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBwUGFyYW1zOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGlzIGVsZW1lbnQgaW4gY2FzZSBvZiBvdGhlciBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBwb2ludGVyIG9mIHRoZSBwcmV2aW91cyBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdC0+cE5leHQgPSBwUGFyYW1zOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHNhdmUgb2YgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19QdG8zR1BQX3BhcmFtcyBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgZHVyYXRpb24gaXMgZmlsbGVkLCBsZXQncyB1c2UgaXQgaW5zdGVhZCBvZiBFbmRDdXRUaW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlB0bzNHUFAgUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZUluID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVJbiwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBpbnB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBKUEcgZmlsZSBpcyBwcmVzZW50IG9uIHRoZSBGUyAoUDRNRTAwMDAyOTc0KSBieSBqdXN0IG9wZW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgY2xvc2luZyBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+b3BlblJlYWQoJnBBUkdCRmlsZUluLCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiQ2FuJ3Qgb3BlbiBpbnB1dCBqcGcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCRmlsZUluKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiQ2FuJ3QgY2xvc2UgaW5wdXQganBnIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGgsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfaW1nOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfaW1nLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBwQ29udkZyb21VVEY4RmN0IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJQdG8zR1BQIFBhcmFtczogZmlsZSBvdXQiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVPdXQsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgb3V0cHV0IGZpbGUgcGF0aCAqLwotCi0gICAgI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0X2ltZ190bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF9pbWdfdG1wLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgdGVtcCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVUZW1wLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IHRlbXBvcmFyeSBmaWxlIHBhdGggKi8KLQotICAgICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxsIFBhbkFuZFpvb20gc2V0dGluZ3MgaWYgbmVlZGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb20gKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzUGFuWm9vbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuaXNQYW5ab29tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgUGFuICYgWm9vbSBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYSA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tWGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFlhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tWGIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhiID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFliID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tWGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVRvcGxlZnRYYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVRvcGxlZnRZYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tWGIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVRvcGxlZnRYYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tVG9wbGVmdFliID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVRvcGxlZnRZYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKyBQUiBObzogYmxybnhwc3cjMjIzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qSW50aWFsaXppbmcgdGhlIFZpZGVvIEZyYW1lIFJhdGUgYXMgaXQgbWF5IG5vdCBiZSBpbnRpYWxpemVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qT3RoZXIgY2hhbmdlcyBtYWRlIGlzIEAgTTR4VlNTX0ludGVybmFsLmMgQCBsaW5lIDE1MTggaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCovCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAzMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDQwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIwX0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gODA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rN181X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gMTMzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAyMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNYWtpbmcgRGVmYXVsdCBGcmFtZSBSYXRlIEAgMTUgRlBTKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNjY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyotUFIgTm86IGJscm54cHN3IzIyMyovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rQ3JvcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQmxhY2tCb3JkZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa1Jlc2l6aW5nICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQ3JlYXRlZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYlRyYW5zY29kaW5nUmVxdWlyZWQgdG8gVFJVRSB0byBpbmRpY2F0ZSB0aGUga2VuYnVybiB2aWRlbyBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICogYmVlbiBnZW5lcmF0ZWQgaW4gYW5hbHlzaXMgcGhhc2UsIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHRhbnNjb2RlZCBhZ2FpbgotICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiBzYXZpbmcgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmJUcmFuc2NvZGluZ1JlcXVpcmVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7Ci0KLSAgICByZXBsYWNlQVJHQl8zR1A6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gKz0gcFBhcmFtcy0+ZHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGxhY2luZyBpbiBWU1Mgc3RydWN0dXJlIHRoZSBKUEcgZmlsZSBieSB0aGUgM2dwIGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gVVRGOCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVPdXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4IixlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTIGZpbGUgcGF0aCBvZiBBUkdCIHRvIDNncCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgKGxlbmd0aCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURjE2IGNvbnZlcnNpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+ZmlsZVBhdGhTaXplID0gbGVuZ3RoKzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAzR1AgaW5wdXQgZmlsZSB0eXBlIGNhc2UKLSAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogTmVlZCB0byBjYWxsIE1DUyBpbiBjYXNlIDNHUCB2aWRlby9hdWRpbyB0eXBlcyBhcmUgbm90IGNvbXBhdGlibGUKLSAgICAgICAgICAgIChIMjYzL01QRUc0IG9yIEFNUk5CL0FBQykgKi8KLSAgICAgICAgICAgIC8qID0+IE5lZWQgdG8gZmlsbCBNQ1NfUGFyYW1zIHN0cnVjdHVyZSB3aXRoIHRoZSByaWdodCBwYXJhbWV0ZXJzICEgKi8KLSAgICAgICAgICAgIC8qIE5lZWQgYWxzbyB0byBwYXJzZSBNQ1MgcGFyYW1zIHN0cnVjdCB0byBjaGVjayBpZiBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gdHJhbnNjb2RlZCAqLwotCi0gICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLSAgICAgICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zOwotICAgICAgICAgICAgTTRPU0FfQm9vbCBhdWRpb0lzRGlmZmVyZW50ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sIHZpZGVvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgYkF1ZGlvTW9ubzsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZmlsZSBwcm9wZXJ0aWVzIHN0cnVjdHVyZSAqLwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKikgJmZpbGVQcm9wZXJ0aWVzLDAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKSk7Ci0KLSAgICAgICAgICAgIC8vZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzsKLQotICAgICAgICAgICAgLyogUHJldmVudCBmcm9tIGJhZCBpbml0aWFsaXppbmcgb2YgcGVyY2VudGFnZSBjdXQgdGltZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlFbmRDdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAxMDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudCA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhlc2UgcGVyY2VudGFnZSBjdXQgdGltZSBoYXZlIHByb2JhYmx5IG5vdCBiZWVuIGluaXRpYWxpemVkICovCi0gICAgICAgICAgICAgICAgLyogTGV0J3Mgbm90IHVzZSB0aGVtIGJ5IHNldHRpbmcgdGhlbSB0byAwICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQgPSAwOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQgPQotICAgICAgICAgICAgICAgICAgICAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgTUNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGtub3cgaWYgaW5wdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBDbXBSZXN1bHQgPSAwOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICAgICAgLyogV2UgcGFyc2UgYWxsIE1DUyBQYXJhbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSggcFBhcmFtcyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byBVVEY4LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBQYXJhbXMtPnBGaWxlSW47Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCByZXR1cm5zIGVycjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgaW5wdXQgZmlsZW5hbWVzIGFyZSB0aGUgc2FtZSwgYW5kIGlmIHRoaXMgaXMgbm90IGEgQkdNLCB3ZSBjYW4gcmV1c2UKLSAgICAgICAgICAgICAgICAgICAgdGhlIHRyYW5zY29kZWQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcENtcFJlc3VsdCA9PSAwICYmIHBQYXJhbXMtPmlzQkdNID09IE00T1NBX0ZBTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zLT5CZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBQYXJhbXMtPkVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPkVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID09IDEwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa051bGxBdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSAzR1AgZmlsZW5hbWUgd2l0aCB0cmFuc2NvZGVkIDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlcGxhY2UzR1BfM0dQOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICggcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSAzR1AgZmlsZW5hbWUgd2l0aCB0cmFuc2NvZGVkIDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVwbGFjZTNHUF8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHZhcmlhYmxlLCBpbiBjYXNlIHNvbWUgM0dQIGZpbGVzIGhhdmUgYmVlbiBhZGRlZAotICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHR3byAqLwotICAgICAgICAgICAgICAgICAgICAvKiBjYWxscyB0byBNNHhWU1Nfc2VuZENvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgcE1DU19sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBwZXJjZW50YWdlIGluZm9ybWF0aW9uIGxldCdzIHVzZSBpdC4uLiAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlFbmRDdXRQZXJjZW50ICE9IDAKLSAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpQmVnaW5DdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSWYgcGVyY2VudGFnZSBpbmZvcm1hdGlvbiBhcmUgbm90IGNvcnJlY3QgYW5kIGlmIGR1cmF0aW9uIGZpZWxkIGlzIG5vdCBmaWxsZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgPD0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFBlcmNlbnQpCi0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogQmFkIHBlcmNlbnRhZ2UgZm9yIGJlZ2luIGFuZCBlbmQgY3V0IHRpbWUgISIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBXZSB0cmFuc2Zvcm0gdGhlIHBlcmNlbnRhZ2UgaW50byBhYnNvbHV0ZSB0aW1lICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgKiBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAvIDEwMCk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgID0gKE00T1NBX1VJbnQzMikoCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICAqIGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC8gMTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIC4uLk90aGVyd2lzZSwgd2UgdXNlIGFic29sdXRlIHRpbWUuICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSWYgZW5kQ3V0VGltZSA9PSAwLCBpdCBtZWFucyBhbGwgdGhlIGZpbGUgaXMgdGFrZW4uIExldCdzIGNoYW5nZSB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIGR1cmF0aW9uLCB0byBhY2N1cmF0ZSBwcmV2aWV3LiAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPT0gMAotICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiBkdXJhdGlvbiBmaWVsZCBpcyBmaWxsZWQsIGl0IGhhcyBwcmlvcml0eSBvbiBvdGhlciBmaWVsZHMgb24gRW5kQ3V0VGltZSwKLSAgICAgICAgICAgICBzbyBsZXQncyB1c2UgaXQgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24gIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgK3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiBvdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIHdlIHRha2UgdmlkZW8gZm9ybWF0IG9mIHRoZSBmaXJzdCAzR1AgdmlkZW8gKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lVmlkZW8gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGU7Ci0gICAgICAgICAgICAgICAgLy9NNE9TQV9UUkFDRTJfMSgiT3V0cHV0IHZpZGVvIGZvcm1hdCBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gY3VycmVudCBjbGlwOiAlZCIsCi0gICAgICAgICAgICAgICAgLy8geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IHZpZGVvIGZvcm1hdCBpcyBub3Qgc2V0LCBhbiBlcnJvciBwYXJhbWV0ZXIgaXMgcmV0dXJuZWQuIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICAgICAgICAgIk91dHB1dCBhdWRpbyBmb3JtYXQgaXMgbm90IHNldCAtPiByZW1vdmUgYXVkaW8gdHJhY2sgb2YgY2xpcDogJWQiLAotICAgICAgICAgICAgICAgICAgICBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiQXVkaW9Nb25vID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAhPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICAgICAgICAgICYmIChmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IHNhbXBsaW5nRnJlcQotICAgICAgICAgICAgICAgIHx8IGJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAhPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vKSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIC8qIElmIHdlIHdhbnQgdG8gcmVwbGFjZSBhdWRpbywgdGhlcmUgaXMgbm8gbmVlZCB0byB0cmFuc2NvZGUgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRlbXAgZml4IDpQVCB2b2x1bWUgbm90IGhlcmFkIGluIHRoZSBzZWNvbmQgY2xpcCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggLyoocFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPT0gMTAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwqLwotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkgLyoxMS8xMi8yMDA4IENSIDMyODMgVkFMIGZvciB0aGUgTU1TCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2UgY2FzZSwgd2UgbmVlZCB0byB0cmFuc2NvZGUgZXhjZXB0IHRoZSBtZWRpYSB3aXRob3V0IGF1ZGlvKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBIZXJlIGNoZWNrIHRoZSBjbGlwIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsLCBpZiBpdCBleGNlZWRzCi0gICAgICAgICAgICAgKiB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgb2YgZXhwb3J0IGZpbGUsIHRoZW4gdGhlIGZpbGUgbmVlZHMKLSAgICAgICAgICAgICAqIHRvIGJlIHRyYW5zY29kZWQoZG8gbm90IGRvIGNvbXByZXNzIGRvbWFpbiB0cmltKS4KLSAgICAgICAgICAgICAqIEFsc28gZm9yIE1QRUc0IGZvbWFydCwgYWx3YXlzIGRvIHRyYW5zY29kaW5nIHNpbmNlIEhXIGVuY29kZXIKLSAgICAgICAgICAgICAqIG1heSB1c2UgZGlmZmVyZW50IHRpbWUgc2NhbGUgdmFsdWUgdGhhbiB0aGUgaW5wdXQgY2xpcCovCi0gICAgICAgICAgIGlmICgoZmlsZVByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGUgPgotICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlKSB8fAotICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPgotICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCkgfHwKLSAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkpIHsKLSAgICAgICAgICAgICAgIC8qIFNldCBiVHJhbnNjb2RpbmdSZXF1aXJlZCB0byBUUlVFIHRvIGluZGljYXRlIHRoZSB2aWRlbyB3aWxsIGJlCi0gICAgICAgICAgICAgICAgKiB0cmFuc2NvZGVkIGluIE1DUy4gKi8KLSAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmJUcmFuc2NvZGluZ1JlcXVpcmVkID0KLSAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgdmlkZW9Jc0RpZmZlcmVudCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHZpZGVvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSB8fCBhdWRpb0lzRGlmZmVyZW50ID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgb3V0XzNncF90bXBbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0KLSAgICAgICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF8zZ3AsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAoTTRPU0FfQ2hhciAqKSIlc3ZpZCVkLjNncCIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE9TQV9jaHJTUHJpbnRmOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF8zZ3BfdG1wLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSwgIiVzdmlkJWQudG1wIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXgrKzsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX01DU19wYXJhbXMgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19NQ1NfcGFyYW1zKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiRWxlbWVudCBvZiBNQ1MgUGFyYW1zIChmb3IgM0dQKSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IFByb2JsZW0gd2hlbiBhbGxvY2F0aW5nIG9uZSBlbGVtZW50IE1DUyBQYXJhbXMiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9IE00eFZTU19rUmVzaXppbmc7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+dmlkZW9jbGlwbnVtYmVyID0gaTsgLy8gSW5kaWNhdGVzIHZpZGVvIGNsaXAgaW5kZXgKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBNZWFucyBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgeFZTUyBjb250ZXh0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgcE1DU19sYXN0LT5wTmV4dCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogU2F2ZSB0aGlzIGVsZW1lbnQgaW4gY2FzZSBvZiBvdGhlciBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zOwotCi0gICAgICAgICAgICAgICAgLyogRmlsbCB0aGUgbGFzdCBNNHhWU1NfTUNTX3BhcmFtcyBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+SW5wdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRUaW1lc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBXZSBkbyBub3QgbmVlZCB0byByZWVuY29kZSB2aWRlbyBpZiBpdHMgcGFyYW1ldGVycyBkbyBub3QgZGlmZmVyICovCi0gICAgICAgICAgICAgICAgLyogZnJvbSBvdXRwdXQgc2V0dGluZ3MgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgIGlmKCB2aWRlb0lzRGlmZmVyZW50ID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm91dHB1dFZpZGVvUHJvZmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWwgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLypGQjogVkFMIENSIFA0TUUwMDAwMzA3NgotICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdHJhdGUgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uCi0gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIHN0cnVjdHVyZSBJZiB0aGUgYml0cmF0ZSBnaXZlbiBieSB0aGUgdXNlciBpcyBpcnJlbGV2YW50Ci0gICAgICAgICAgICAgICAgICAgICh0aGUgTUNTIG1pbmltdW0gYW5kIG1heGltdW0gdmlkZW8gYml0cmF0ZSBhcmUgdXNlZCksCi0gICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgdmlkZW8gYml0cmF0ZSBpcyBoYXJkY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBvdXRwdXQgdmlkZW8gc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2s4X01CUFMgKSAvKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzg0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIFNob3VsZCBub3QgaGFwcGVuICEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tOdWxsVmlkZW87Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxNV9GUFM7IC8qIE11c3QgYmUgc2V0LCBvdGhlcndpc2UsIE1DUyByZXR1cm5zIGFuIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIGF1ZGlvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5iQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpbiB0aGUgQUFDIGNhc2UgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uIHNldHRpbmdzIHN0cnVjdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYml0cmF0ZSBnaXZlbiBieSB0aGUgdXNlciBpcyBpcnJlbGV2YW50IG9yIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIE1DUyBtaW5pbXVtIGFuZCBtYXhpbXVtIGF1ZGlvIGJpdHJhdGUgYXJlIHVzZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGF1ZGlvIGJpdHJhdGUgaXMgaGFyZCBjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGF1ZGlvIGJpdHJhdGUgaXMgY29ycmVjdGx5IGRlZmluZWQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qTW9ubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1MgdmFsdWVzIGZvciBBQUMgTW9ubyBhcmUgbWluOiAxNmticHMgYW5kIG1heDogMTkyIGticHMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PSBNNFZJREVPRURJVElOR19rMTZfS0JQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2sxOTJfS0JQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qU3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDMya2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PSBNNFZJREVPRURJVElOR19rMzJfS0JQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2sxOTJfS0JQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGF1ZGlvIGJpdHJhdGUgaXMgaGFyZCBjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dCBhdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgZnJlcXVlbmN5Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjQwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazQ4X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBiaXRyYXRlIGhhdmUgdG8gYmUgZG91YmxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSArPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5iQXVkaW9Nb25vID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2s4MDAwX0FTRiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByZXZlbnQgZnJvbSB1bmFsbG93ZWQgc2FtcGxpbmcgZnJlcXVlbmNpZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tEZWZhdWx0X0FTRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogU2hvdWxkIG5vdCBoYXBwZW4gISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5iQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tOdWxsQXVkaW87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNQ1MgM0dQIFBhcmFtczogZmlsZSBpbiIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBpbnB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncDsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfM2dwLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNQ1MgM0dQIFBhcmFtczogZmlsZSBvdXQiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF8zZ3BfdG1wOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3BfdG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIHRlbXAiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZVRlbXAsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IHRlbXBvcmFyeSBmaWxlIHBhdGggKi8KLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgLypGQiAyMDA4LzEwLzIwIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvLCBhZGQgbWVkaWEgcmVuZGVyaW5nIHBhcmFtZXRlciovCi0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa0Nyb3BwaW5nCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQmxhY2tCb3JkZXJzCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qRkI6IHRyYW5zY29kaW5nIHBlciBwYXJ0cyovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+QmVnaW5DdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+RW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZTsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5pc0JHTSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQ3JlYXRlZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwrKzsKLSAgICAgICAgICAgICAgICBiSXNUcmFuc2NvZGluZyA9IE00T1NBX1RSVUU7Ci0KLXJlcGxhY2UzR1BfM0dQOgotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgIC0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBSZXBsYWNpbmcgaW4gVlNTIHN0cnVjdHVyZSB0aGUgb3JpZ2luYWwgM0dQIGZpbGUgYnkgdGhlIHRyYW5zY29kZWQgM0dQIGZpbGUgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBQYXJhbXMtPnBGaWxlT3V0OwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgZmlsZSBwYXRoIG9mIDNncCB0byAzZ3AiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgKGxlbmd0aCArIDEpKTsKLSAgICAgICAgICAgICAgICAvKkZCOiBhZGQgZmlsZSBwYXRoIHNpemUgYmVjYXVzZSBvZiBVVEYgMTYgY29udmVyc2lvbiovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+ZmlsZVBhdGhTaXplID0gbGVuZ3RoKzE7Ci0KLSAgICAgICAgICAgICAgICAvKiBXZSBkZWZpbmUgbWFzdGVyIGNsaXAgYXMgZmlyc3QgM0dQIGlucHV0IGNsaXAgKi8KLSAgICAgICAgICAgICAgICAvKmlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU1hc3RlckNsaXAgPT0gMCAmJiBmaWxlUHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9IGk7Ci0gICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgLSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFdlIGRlZmluZSBtYXN0ZXIgY2xpcCBhcyBmaXJzdCAzR1AgaW5wdXQgY2xpcCAqLwotICAgICAgICAgICAgaWYoIG1hc3RlckNsaXAgPT0gLTEKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWFzdGVyQ2xpcCA9IGk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9IGk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgT3RoZXIgaW5wdXQgZmlsZSB0eXBlIGNhc2UKLSAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgZmlsZSB0eXBlIGFzIGlucHV0IGNsaXAiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogUGFyc2UgYWxsIGVmZmVjdHMgdG8gbWFrZSBzb21lIGFkanVzdG1lbnQgZm9yIGZyYW1pbmcsICoKLSAgICAqIHRleHQgYW5kIHRvIHRyYW5zZm9ybSByZWxhdGl2ZSB0aW1lIGludG8gYWJzb2x1dGUgdGltZSAqCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBmb3IgKCBqID0gMDsgaiA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHM7IGorKyApCi0gICAgewotICAgICAgICAvKiBDb3B5IGVmZmVjdCB0byAibG9jYWwiIHN0cnVjdHVyZSAqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXSksCi0gICAgICAgICAgICAodm9pZCAqKSAmKHBTZXR0aW5ncy0+RWZmZWN0c1tqXSksCi0gICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0KLSAgICAgICAgLyogUHJldmVudCBmcm9tIGJhZCBpbml0aWFsaXppbmcgb2YgZWZmZWN0IHBlcmNlbnRhZ2UgdGltZSAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aUR1cmF0aW9uUGVyY2VudCA+IDEwMAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudCA+IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoZXNlIHBlcmNlbnRhZ2UgdGltZSBoYXZlIHByb2JhYmx5IG5vdCBiZWVuIGluaXRpYWxpemVkICovCi0gICAgICAgICAgICAvKiBMZXQncyBub3QgdXNlIHRoZW0gYnkgc2V0dGluZyB0aGVtIHRvIDAgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQgPSAwOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB3ZSBoYXZlIHBlcmNlbnRhZ2UgaW5mb3JtYXRpb24gbGV0J3MgdXNlIGl0Li4uIE90aGVyd2lzZSwgd2UgdXNlIGFic29sdXRlIHRpbWUuICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50ICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgRWZmZWN0c1tqXS51aVN0YXJ0VGltZSA9IChNNE9TQV9VSW50MzIpKHRvdGFsRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlTdGFydFBlcmNlbnQKLSAgICAgICAgICAgICAgICAvIDEwMCk7Ci0gICAgICAgICAgICAvKiBUaGUgcGVyY2VudGFnZSBvZiBlZmZlY3QgZHVyYXRpb24gaXMgYmFzZWQgb24gdGhlIGR1cmF0aW9uIG9mIHRoZSBjbGlwIC0KLSAgICAgICAgICAgIHN0YXJ0IHRpbWUgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnVpRHVyYXRpb24gPSAoTTRPU0FfVUludDMyKSh0b3RhbER1cmF0aW9uCi0gICAgICAgICAgICAgICAgKiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50Ci0gICAgICAgICAgICAgICAgLyAxMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYSBmcmFtaW5nIGVmZmVjdCwgd2UgbmVlZCB0byBhbGxvY2F0ZSBmcmFtaW5nIGVmZmVjdCBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZyApCi0gICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQgKmZyYW1pbmdDdHg7Ci0gICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotI2Vsc2UKLQotICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKmZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgTTRPU0FfQ2hhciAqcEV4dDIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIHJlc3VsdDEsIHJlc3VsdDI7Ci0KLSAgICAgICAgICAgIC8qIENvcHkgZnJhbWluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHN0cmxlbihwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKQotICAgICAgICAgICAgICAgICAgICArIDEsIE00VlMsIChNNE9TQV9DaGFyICopIkxvY2FsIEZyYW1pbmcgZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoCi0gICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCwgc3RybGVuKAotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKSArIDEpOwotCi0gICAgICAgICAgICAgICAgcEV4dDIgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nQ29udGV4dAotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ0NvbnRleHQpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkNvbnRleHQgb2YgdGhlIGZyYW1pbmcgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wU1BTQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+YkVmZmVjdFJlc2l6ZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVJlYWRQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBGaWxlV3JpdGVQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHI7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5lZmZlY3REdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0udWlEdXJhdGlvbjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfSXNGaWxlR2lmID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfYW5pbWF0ZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgLyogT3V0cHV0IHJhdGlvIGZvciB0aGUgZWZmZWN0IGlzIHN0b3JlZCBpbiB1aUZpZnRpZXNPdXRGcmFtZVJhdGUgcGFyYW1ldGVycyBvZiB0aGUKLSAgICAgICAgICAgIGV4dGVuZGVkIHhWU1MgZWZmZWN0cyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZQotICAgICAgICAgICAgICAgICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmZyYW1lRHVyYXRpb25SYXRpbyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9GbG9hdCkoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGUpIC8gMTAwMC4wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5mcmFtZUR1cmF0aW9uUmF0aW8gPSAxLjA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcqLwotICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgYWxwaGEgYmxlbmRpbmcgcGFyYW1ldGVycyBhcmUgY29ycmVjdHMqLwotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID0gMTAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID4gMAotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypBbGxvY2F0ZSB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qRmlsbCB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZQotICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDEwMCAtIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoOwotICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkxvY2FsIEZyYW1pbmcgZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotCi0gICAgICAgICAgICAvKiBTYXZlIGZyYW1pbmcgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eDsKLQotI2Vsc2UKLQotICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotCi0gICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLSAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICAgICAgICAgIGlmKCBwRXh0MiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWNvZGUgdGhlIGltYWdlIGFzc29jaWF0ZWQgdG8gdGhlIGVmZmVjdCwgYW5kIGZpbGwgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBwRXh0MiArPSAoc3RybGVuKChjb25zdCBjaGFyICopcEV4dDIpIC0gNCk7Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQxID0gc3RyY21wKChjb25zdCBjaGFyICopcEV4dDIsKGNvbnN0IGNoYXIgKikiLnJnYiIpOwotICAgICAgICAgICAgICAgIHJlc3VsdDIgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwRXh0MiwoY29uc3QgY2hhciAqKSIuUkdCIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggMCA9PSByZXN1bHQxIHx8IDAgPT0gcmVzdWx0MiApCi0gICAgICAgICAgICAgICAgewotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbERlY29kZUdJRjogQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgU1BTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnBDdXJyZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7IC8qIE9ubHkgdXNlZCBieSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4OCA6IGdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT53aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLndpZHRoOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+aGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MuaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRlJBTU1JTkcgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPndpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkZSQU1NSU5HIEJFRk9SRSBNNHhWU1NfU2VuZENvbW1hbmQgICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5oZWlnaHQpOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgJih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCx4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiRlJBTUlORyBXSURUSCBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+d2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiRlJBTUlORyBIRUlHSFQgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsRGVjb2RlUE5HIHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBTUFMgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBOb3Qgc3VwcG9ydGVkIHN0aWxsIHBpY3R1cmUgZm9ybWF0IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBwUGxhbmUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkNvbnRleHQgb2YgdGhlIGZyYW1pbmcgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0KLSAgICAgICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICAgICAgICAgICAgICAvKiBGb3JjZSBpbnB1dCBSR0IgYnVmZmVyIHRvIGV2ZW4gc2l6ZSB0byBhdm9pZCBlcnJvcnMgaW4gWVVWIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoICYgfjE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgLyogSW5wdXQgUkdCIHBsYW5lIGlzIHByb3ZpZGVkLCBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlICAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICAgICAgICAgICAgICAvKiBGb3JjZSBpbnB1dCBSR0IgYnVmZmVyIHRvIGV2ZW4gc2l6ZSB0byBhdm9pZCBlcnJvcnMgaW4gWVVWIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfd2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi51X2hlaWdodCAmIH4xOwotICAgICAgICAgICAgICAgIC8qIElucHV0IFJHQiBwbGFuZSBpcyBwcm92aWRlZCwgbGV0J3MgY29udmVydCBpdCB0byBZVVY0MjAsIGFuZCB1cGRhdGUgZnJhbWluZwotICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgpOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBObyBpbnB1dCBpbWFnZS9wbGFuZSBwcm92aWRlZCBmb3IgZnJhbWluZyBlZmZlY3QuIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIENSOiBBZGQgdGV4dCBoYW5kbGluZyB3aXRoIGV4dGVybmFsIHRleHQgaW50ZXJmYWNlICovCi0gICAgICAgIC8qIElmIGVmZmVjdCB0eXBlIGlzIHRleHQsIHdlIGNhbGwgZXh0ZXJuYWwgdGV4dCBmdW5jdGlvbiB0byBnZXQgUkdCIDU2NSBidWZmZXIgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfVGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENhbGwgdGhlIGZvbnQgZW5naW5lIGZ1bmN0aW9uIHBvaW50ZXIgdG8gZ2V0IFJHQjU2NSBidWZmZXIgKi8KLSAgICAgICAgICAgIC8qIFdlIHRyYW5zZm9ybSB0ZXh0IGVmZmVjdCBpbnRvIGZyYW1pbmcgZWZmZWN0IGZyb20gYnVmZmVyICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucFRleHRSZW5kZXJpbmdGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypGQjogYWRkIFVURiBjb252ZXJ0aW9uIGZvciB0ZXh0IGJ1ZmZlciovCi0gICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdDb250ZXh0ICpmcmFtaW5nQ3R4OwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKmZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemU7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YkVmZmVjdFJlc2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MuYlJlc2l6ZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVSZWFkUHRyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHI7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVXcml0ZVB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5lZmZlY3REdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnVpRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9Jc0ZpbGVHaWYgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iX2FuaW1hdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKiBTYXZlIGZyYW1pbmcgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLQotICAgICAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0KLSAgICAgICAgICAgICAgICAvKkFscGhhIGJsZW5kaW5nKi8KLSAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyovCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPSAxMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKkZpbGwgdGhlIGFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwIC0gZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QgKGZvciB0ZXh0KSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLyogQnVnRml4IDEuMi4wOiBMZWFrIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSNlbmRpZgotICAgICAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eDsKLQotICAgICAgICAgICAgICAgIC8qIEZCOiBjaGFuZ2VzIGZvciBWaWRlbyBBcnRpc3Q6IG1lbWNvcHkgcFRleHRCdWZmZXIgc28gdGhhdCBpdCBjYW4gYmUgY2hhbmdlZAotICAgICAgICAgICAgICAgIGFmdGVyIGEgY29tcGxldGUgYW5hbHlzaXMqLwotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfU2VuZENvbW1hbmQ6IHBUZXh0QnVmZmVyIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLypDb252ZXJ0IHRleHQgYnVmZmVyIGludG8gY3VzdG9tZXIgZm9ybWF0IGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgKyAxLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJMb2NhbCB0ZXh0IGJ1ZmZlciBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgLy8gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcikrMSwKLSAgICAgICAgICAgICAgICAvLyBNNFZTLCAiTG9jYWwgdGV4dCBidWZmZXIgZWZmZWN0Iik7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vbWVtY3B5KChNNE9TQV9NZW1BZGRyOCl4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXQotICAgICAgICAgICAgICAgICAgICAvLy54VlNTLnBUZXh0QnVmZmVyLCAoTTRPU0FfTWVtQWRkcjgpcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0cmxlbihwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSB0ZXh0IFJHQiBidWZmZXIqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlJHQiBzdHJ1Y3R1cmUgZm9yIHRoZSB0ZXh0IGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVRleHRCdWZmZXJXaWR0aAotICAgICAgICAgICAgICAgICAgICA9PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlckhlaWdodCA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogdGV4dCBwbGFuZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBub3QgZGVmaW5lZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBpbnB1dCBSR0IgdGV4dCBidWZmZXIgYW5kIGZvcmNlIGl0IHRvIGV2ZW4gc2l6ZSB0byBhdm9pZCBlcnJvcnMgaW4KLSAgICAgICAgICAgICAgICAgWVVWIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlcldpZHRoICYgfjE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVySGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgMiAqIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodAotICAgICAgICAgICAgICAgICAgICAqIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiVGV4dCBSR0IgcGxhbmUtPnBhY19kYXRhIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhCi0gICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uICovCi0KLSAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wUmVuZGVyaW5nRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlRleHQgcmVuZGVyaW5nIGV4dGVybmFsIGZ1bmN0aW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgUkdCIGJ1ZmZlciBpcyBzZXQgKi8KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJUZXh0IHJlbmRlcmluZyBmdW5jdGlvbiBkaWQgbm90IHNldCBSR0IgYnVmZmVyIGNvcnJlY3RseSAhIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHBsYW5lIHRvIFlVVjQyMCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgLyogQ2FsbCB0ZXh0IHJlbmRlcmluZyBmdW5jdGlvbiAqLwotCi0gICAgICAgICAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucFRleHRSZW5kZXJpbmdGY3QoCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFJlbmRlcmluZ0RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgJihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlRleHQgcmVuZGVyaW5nIGV4dGVybmFsIGZ1bmN0aW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgUkdCIGJ1ZmZlciBpcyBzZXQgKi8KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGRpZCBub3Qgc2V0IFJHQiBidWZmZXIgY29ycmVjdGx5ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29udmVydCBSR0IgcGxhbmUgdG8gWVVWNDIwIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgUkdCIHRvIFlVVjogMHcleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgICAgIC8qIENoYW5nZSBpbnRlcm5hbGx5IGVmZmVjdCB0eXBlIGZyb20gInRleHQiIHRvIGZyYW1pbmcgKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmc7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE5vIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIHNldCAhISIpOwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkYXRhIG5lZWRlZCBieSB0aGUgRmlmdGllcyBlZmZlY3QgKi8KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX0ZpZnRpZXNTdHJ1Y3QgKmZpZnRpZXNDdHg7Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIHRoZSBleHBlY3RlZCBmcmFtZSByYXRlIGZvciB0aGUgZmlmdGllcyBlZmZlY3QgKG11c3QgYmUgYWJvdmUgMCkgKi8KLSAgICAgICAgICAgIGlmKCAwID09IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBmcmFtZSByYXRlIGZvciB0aGUgZmlmdGllcyBlZmZlY3QgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAhIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlmdGllc0N0eCA9IChNNHhWU1NfRmlmdGllc1N0cnVjdAotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRmlmdGllc1N0cnVjdCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZmlmdGllcyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZpZnRpZXNDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpZnRpZXNDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICAgICAgICAgIGZpZnRpZXNDdHgtPmZpZnRpZXNFZmZlY3REdXJhdGlvbiA9IDEwMDAgLyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZTsKLSAgICAgICAgICAgIGZpZnRpZXNDdHgtPnNoaWZ0UmFuZG9tVmFsdWUgPSAwOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+c3RyaXBlUmFuZG9tVmFsdWUgPSAwOwotCi0gICAgICAgICAgICAvKiBTYXZlIHRoZSBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmaWZ0aWVzQ3R4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgZGF0YSBuZWVkZWQgYnkgdGhlIENvbG9yIGVmZmVjdCAqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZQotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX0NvbG9yU3RydWN0ICpDb2xvckN0eDsKLQotICAgICAgICAgICAgQ29sb3JDdHggPQotICAgICAgICAgICAgICAgIChNNHhWU1NfQ29sb3JTdHJ1Y3QgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db2xvclN0cnVjdCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgY29sb3IgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCBDb2xvckN0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29sb3JDdHgtPmNvbG9yRWZmZWN0VHlwZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNgotICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2xvckN0eC0+cmdiMTZDb2xvckRhdGEgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpUmdiMTZJbnB1dENvbG9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbG9yQ3R4LT5yZ2IxNkNvbG9yRGF0YSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIENvbG9yQ3R4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBCYWNrZ3JvdW5kIG11c2ljIHJlZ2lzdGVyaW5nCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICYmIGlzTmV3QkdNID09IE00T1NBX1RSVUUgKQotICAgIHsKLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLQotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtczsKLSAgICAgICAgTTRPU0FfQ2hhciAqb3V0X3BjbTsKLSAgICAgICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmCi0KLSAgICAgICAgLyogV2Ugc2F2ZSBvdXRwdXQgZmlsZSBwb2ludGVyLCBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB1c2UgaXQgd2hlbiBzYXZpbmcgYXVkaW8gbWl4ZWQKLSAgICAgICAgIGZpbGUgKGxhc3Qgc2F2ZSBzdGVwKSAqLwotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0KLSAgICAgICAgLyogSWYgYSBwcmV2aW91cyBCR00gaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLCBkZWxldGUgaXQgKi8KLSAgICAgICAgLyogSGVyZSBjYW4gYmUgaW1wbGVtZW50ZWQgdGVzdCB0byBrbm93IGlmIHRoZSBzYW1lIEJHTSBpcyByZWdpc3RlcmVkICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT4KLSAgICAgICAgICAgICAgICAgICAgcEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2spOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIEJHTSAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPQotICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopInhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb3B5IGlucHV0IHN0cnVjdHVyZSB0byBvdXIgc3RydWN0dXJlICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpKTsKLSAgICAgICAgLyogQWxsb2NhdGUgZmlsZSBuYW1lLCBhbmQgY29weSBmaWxlIG5hbWUgYnVmZmVyIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9Ci0gICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKHN0cmxlbihwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKLSAgICAgICAgICAgICsgMSksIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgQkdNIGZpbGUgcGF0aCIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgc3RybGVuKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKSArIDEpOwotCi0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIERlY29kZSBCR00gdHJhY2sgdG8gcGNtIG91dHB1dCBmaWxlICovCi0KLSAgICAgICAgcFBhcmFtcyA9Ci0gICAgICAgICAgICAoTTR4VlNTX01DU19wYXJhbXMgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19NQ1NfcGFyYW1zKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgTUNTIFBhcmFtcyAoZm9yIEJHTSkiKTsKLQotICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBQcm9ibGVtIHdoZW4gYWxsb2NhdGluZyBvbmUgZWxlbWVudCBNQ1MgUGFyYW1zIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVycyBpbiBjYXNlIG9mIHByb2JsZW0gKFBSIDIyNzMpICovCi0gICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+QmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgcFBhcmFtcy0+RW5kQ3V0VGltZSA9IDA7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBNZWFucyBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB4VlNTIGNvbnRleHQgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zX3RlbXAgPSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0OwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXNfdGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5pc0JHTSA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1vdmUgUENNIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zX3RlbXAtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDaGFpbiBwcmV2aW91cyBlbGVtZW50IHdpdGggbmV4dCBlbGVtZW50ID0gcmVtb3ZlIEJHTSBjaGFpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3ByZXYgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldi0+cE5leHQgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnJlbnQgcG9pbnRlciBpcyB0aGUgZmlyc3Qgb2YgdGhlIGNoYWluZWQgbGlzdCBhbmQgbmV4dCBwb2ludGVyIG9mCi0gICAgICAgICAgICAgICAgICAgIHRoZSBjaGFpbmVkIGxpc3QgaXMgTlVMTCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBpdCBtZWFucyB0aGF0IHRoZXJlIHdhcyBvbmx5IG9uZSBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qID0+IHdlIHB1dCB0aGUgY29udGV4dCB2YXJpYWJsZSB0byBOVUxMIHRvIHJlYWZmZWN0IHRoZSBmaXJzdCBjaGFpbmVkIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcCA9PSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zX3RlbXAtPnBOZXh0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIEJHTSBwb2ludGVyIGlzIHRoZSBmaXJzdCBvbmUsIGJ1dCB0aGVyZSBhcmUgb3RoZXJzIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICBhZnRlciBpdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBTbywgd2UgbmVlZCB0byBjaGFuZ2UgZmlyc3QgY2hhaW5lZCBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zX3ByZXYgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cE5leHQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gcFBhcmFtc19wcmV2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3ByZXYgPSBwUGFyYW1zX3RlbXA7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogV2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluZWQgbGlzdCB0byBiZSBhYmxlIHRvIGFkZCBuZXcKLSAgICAgICAgICAgICBCR00gZWxlbWVudCAqLwotICAgICAgICAgICAgcE1DU19sYXN0ID0gcFBhcmFtc19wcmV2OwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIG5ldyBwYXJhbXMqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICBwTUNTX2xhc3QtPnBOZXh0ID0gcFBhcmFtczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmlsbCB0aGUgbGFzdCBNNHhWU1NfTUNTX3BhcmFtcyBlbGVtZW50ICovCi0gICAgICAgIHBQYXJhbXMtPklucHV0RmlsZVR5cGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZTsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOwotICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlID0gTTRWSURFT0VESVRJTkdfazE1X0ZQUzsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBQUM7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0gTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotCi0gICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICBUaGUgb3V0cHV0IGF1ZGlvIGJpdHJhdGUgaW4gdGhlIEFBQyBjYXNlIGlzIG5vdyBkaXJlY3RseSBnaXZlbiBieSB0aGUgdXNlciovCi0gICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhdWRpbyBiaXRyYXRlIGlzIGNvcnJlY3RseSBkZWZpbmVkKi8KLSAgICAgICAgICAgIC8qTW9ubwotICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMTZrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA+PSBNNFZJREVPRURJVElOR19rMTZfS0JQUwotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2sxOTJfS0JQUwotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypTdGVyZW8KLSAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDMya2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA+PSBNNFZJREVPRURJVElOR19rMzJfS0JQUwotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2sxOTJfS0JQUwotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9IE00VklERU9FRElUSU5HX2tEZWZhdWx0X0FTRjsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICBwUGFyYW1zLT5iQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZTsKLQotICAgICAgICAvKiBQcmVwYXJlIG91dHB1dCBmaWxlbmFtZSAqLwotICAgICAgICAvKiAyMSBpcyB0aGUgc2l6ZSBvZiAicHJldmlld18xNjAwMF8yLnBjbSIgKyBcMCAqLwotICAgICAgICBvdXRfcGNtID0KLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbih4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCkKLSAgICAgICAgICAgICsgMjEsIE00VlMsIChNNE9TQV9DaGFyICopIlRlbXAgY2hhciogZm9yIHBjbVByZXZpZXdGaWxlIik7Ci0KLSAgICAgICAgaWYoIG91dF9wY20gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX0luaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgdGVtcG9yYXJ5IHBhdGggdG8gZmluYWwgcHJldmlldyBwYXRoIHN0cmluZyAqLwotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfcGNtLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwKLSAgICAgICAgICAgIHN0cmxlbih4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCkgKyAxKTsKLQotICAgICAgICAvKiBEZXBlbmRpbmcgb2YgdGhlIG91dHB1dCBzYW1wbGUgZnJlcXVlbmN5IGFuZCBuYiBvZiBjaGFubmVscywgd2UgY29uc3RydWN0IHByZXZpZXcKLSAgICAgICAgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IFBDTSBmaWxlbmFtZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF9wY20sIChjb25zdCBjaGFyICopInByZXZpZXdfMTYwMDBfMS5wY21cMCIsCi0gICAgICAgICAgICAgICAgICAgIDIwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18xNjAwMF8yLnBjbVwwIiwKLSAgICAgICAgICAgICAgICAgICAgMjApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgUENNIGZpbGVuYW1lICovCi0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18wODAwMF8xLnBjbVwwIiwgMjApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG91dF9wY20gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShvdXRfcGNtKTsKLSAgICAgICAgICAgICAgICBvdXRfcGNtID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBhdWRpbyBvdXRwdXQgZm9ybWF0IFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IG91dF9wY207Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9wY207Ci0gICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0X3BjbSwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBjbVByZXZpZXdGaWxlIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgZnJlZShvdXRfcGNtKTsKLSAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0KLSAgICAgICAgLyogRnJlZSB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIGlmKCBvdXRfcGNtICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNQ1MgQkdNIFBhcmFtczogZmlsZSBvdXQiKTsKLQotICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwodm9pZCAqKSB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlLAotICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0KLSAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPgotICAgICAgICAgICAgICAgIHBGaWxlLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyBCR00gUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVJbiwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgIHBQYXJhbXMtPmlzQkdNID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwrKzsKLSAgICAgICAgYklzVHJhbnNjb2RpbmcgPSBNNE9TQV9UUlVFOwotI2VuZGlmIC8qIFBSRVZJRVdfRU5BQkxFRCAqLwotCi0gICAgfQotICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTAotICAgICAgICAmJiBpc05ld0JHTSA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAvKiBCR00gaXMgdGhlIHNhbWUgYXMgcHJldmlvdXNseSwgbm8gbmVlZCB0byByZWRlY29kZSBhdWRpbyAqLwotICAgICAgICAvKiBOZWVkIHRvIHVwZGF0ZSBNQ1MgcGFyYW1zIGNoYWluZWQgbGlzdCwgdG8gc2lnbmFsIE00eFZTU19zdGVwIGZ1bmN0aW9uIHRvIHNraXAKLSAgICAgICAgQkdNIGRlY29kaW5nICovCi0KLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zX3ByZXYgPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0gICAgICAgIC8qIFdlIHNhdmUgb3V0cHV0IGZpbGUgcG9pbnRlciwgYmVjYXVzZSB3ZSB3aWxsIG5lZWQgdG8gdXNlIGl0IHdoZW4gc2F2aW5nIGF1ZGlvCi0gICAgICAgICBtaXhlZCBmaWxlIChsYXN0IHNhdmUgc3RlcCkgKi8KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wb3JhcnlGaWxlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlOwotCi0gICAgICAgIC8qIFJlLXdyaXRlIEJHTSBzZXR0aW5ncyBpbiBjYXNlIHRoZXkgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdHdvIHNlbmRDb21tYW5kICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHMgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHM7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlCZWdpbkxvb3AgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlCZWdpbkxvb3A7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlFbmRMb29wID0KLSAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpRW5kTG9vcDsKLQotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAvKiBQYXJzZSBNQ1MgcGFyYW1zIGNoYWluZWQgbGlzdCB0byBmaW5kIGFuZCBkZWxldGUgQkdNIGVsZW1lbnQgKi8KLQotICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5pc0JHTSA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPmlzQ3JlYXRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGFyYW1zX3ByZXYgPSBwUGFyYW1zX3RlbXA7Ci0gICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICB9Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTR4VlNTX1NlbmRDb21tYW5kIGhhcyBiZWVuIHJlY2FsbGVkLCBCR00gaXMgdGhlIHNhbWUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5vIEJHTSBpbiB0aGlzIHhWU1MgY29tbWFuZCIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLSAgICAgICAgICAgIC8qIE5lZWQgdG8gcmVtb3ZlIE1DUyBwcmV2aW91cyBwYXJhbXMgY2hhaW5lZCBsaXN0ICovCi0KLSAgICAgICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zX3RlbXAgPSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0OwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXNfdGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5pc0JHTSA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hhaW4gcHJldmlvdXMgZWxlbWVudCB3aXRoIG5leHQgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc19wcmV2ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3ByZXYtPnBOZXh0ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBJZiBjdXJyZW50IHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9mIHRoZSBjaGFpbmVkIGxpc3QgYW5kIG5leHQgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNoYWluZWQgbGlzdCBpcyBOVUxMICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogPT4gd2UgcHV0IHRoZSBjb250ZXh0IHZhcmlhYmxlIHRvIE5VTEwgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcCA9PSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zX3RlbXAtPnBOZXh0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIEJHTSBwb2ludGVyIGlzIHRoZSBmaXJzdCBvbmUsIGJ1dCB0aGVyZSBhcmUgb3RoZXJzCi0gICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBhZnRlciBpdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBTbywgd2UgbmVlZCB0byBjaGFuZ2UgZmlyc3QgY2hhaW5lZCBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIGFsbCBvdGhlciBjYXNlcywgbm90aGluZyBlbHNlIHRvIGRvIGV4Y2VwdCBmcmVlaW5nIHRoZSBjaGFpbmVkCi0gICAgICAgICAgICAgICAgICAgIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgfQotCi0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0gICAgICAgICAgICAvKiBIZXJlLCB3ZSB1bmFsbG9jYXRlIGFsbCBCR00gY29tcG9uZW50cyBhbmQgcHV0IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIHhWU1MucEJHTXRyYWNrIHRvIE5VTEwgKi8KLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENoYW5nZWQgdG8gYmUgYWJsZSB0byBtaXggd2l0aCB2aWRlbyBvbmx5IGZpbGVzIC0+IGluIGNhc2Ugbm8gbWFzdGVyIGNsaXAgaXMgZm91bmQKLSAgICAoaS5lIG9ubHkgSlBHIGlucHV0IG9yIHZpZGVvIG9ubHkgaW5wdXQpICovCi0gICAgLyogYW5kIGlmIHRoZXJlIGlzIGEgQkdNLCB3ZSBmb3JjZSB0aGUgYWRkZWQgdm9sdW1lIHRvIDEwMCAoaS5lIHJlcGxhY2UgYXVkaW8pICovCi0KLSAgICBpZiggbWFzdGVyQ2xpcCA9PSAtMQotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIGl0IG1lYW5zIHRoYXQgbm8gaW5wdXQgM0dQIGZpbGUgaGFzIGEgdmlkZW8gdHJhY2suCi0gICAgICAgIFRoZXJlZm9yZSwgaWYgYSBtaXhpbmcgaXMgYXNrZWQsIGl0IHdpbGwgZmFpbC4gVGh1cywgd2UgZm9yY2UgcmVwbGFjZSBhdWRpby4gKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9IDEwMDsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIGNsaXAgbnVtYmVyIHRvIGtub3cgaWYgYSBNNHhWU1Nfc2VuZENvbW1hbmQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgKi8KLSAgICB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOwotCi0gICAgLyogSW4gY2FzZSBvZiBNTVMgdXNlIGNhc2UsIHdlIGNvbXB1dGUgaGVyZSB0aGUgbWF4IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAvKiBJbiBjYXNlIG9mIHRvbyBsb3cgYml0cmF0ZSwgYSBzcGVjaWZpYyB3YXJuaW5nIGlzIHJldHVybmVkICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplICE9IDAgJiYgdG90YWxEdXJhdGlvbiA+IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHRhcmdldGVkQml0cmF0ZSA9IDA7Ci0gICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotICAgICAgICBNNE9TQV9Eb3VibGUgcmF0aW87Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUKLSAgICAgICAgICAgICAgICA9PSAxMDAgKSAvKiBXZSBhcmUgaW4gInJlcGxhY2UgYXVkaW8gbW9kZSwgbmVlZCB0byBjaGVjayB0aGUgZmlsZXR5cGUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGg7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TZW5kQ29tbWFuZDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgQkdNIHRyYWNrICovCi0gICAgICAgICAgICAgICAgICAgIC8qZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgeFZTUy5wQkdNdHJhY2stPnBGaWxlLCAmZmlsZVByb3BlcnRpZXMpOyovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMgcmV0dXJuZWQgYW4gZXJyb3I6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogSW1wb3NzaWJsZSB0byB1c2UgTU1TIG1vZGUgd2l0aCBCR00gIT0gQU1SLU5CIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUgotICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19zZW5kQ29tbWFuZDogQmFkIGlucHV0IEJHTSBmaWxlIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB0YXJnZXRlZCBiaXRyYXRlLCB3aXRoIDglIG1hcmdpbiAobW9vdikgKi8KLSAgICAgICAgaWYoIHRvdGFsRHVyYXRpb24gPiAxMDAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgKiA4ICogMC44NCkgLyAodG90YWxEdXJhdGlvbiAvIDEwMDApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZW1vdmUgYXVkaW8gYml0cmF0ZSAqLwotICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlID49IDEyMjAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlIC09IDEyMjAwOyAvKiBPbmx5IEFNUiBpcyBzdXBwb3J0ZWQgaW4gTU1TIGNhc2UgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIGFuIGluZGljYXRvciBvZiAiY29tcGxleGl0eSIgZGVwZW5kaW5nIG9uIG5iIG9mIHNlcXVlbmNlcyBhbmQgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgLyogVGhlIGhpZ2hlc3QgaXMgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMsIHRoZSBtb3JlIHRoZXJlIGFyZSBzb21lIEkgZnJhbWVzICovCi0gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlZHVjZSB0aGUgdGFyZ2V0IGJpdHJhdGUgKi8KLSAgICAgICAgcmF0aW8gPQotICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcgotICAgICAgICAgICAgKiAxMDAwMDApIC8gKE00T1NBX0RvdWJsZSkodG90YWxEdXJhdGlvbikpOwotICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICJSYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZFxuVG90YWwgZHVyYXRpb246ICVkIiwKLSAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgICogMTAwMDAwKSAvIChNNE9TQV9Eb3VibGUpKHRvdGFsRHVyYXRpb24pKSwKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSwgdG90YWxEdXJhdGlvbik7Ci0KLSAgICAgICAgaWYoIHJhdGlvID4gNTAgJiYgcmF0aW8gPD0gNzUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcG90ZW50aWFsIHJpc2sgb2YgaGF2aW5nIGEgaGlnaGVyIGZpbGUgc2l6ZQotICAgICAgICAgICAgdGhhbiBzcGVjaWZpZWQgKi8KLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSAtPSAoTTRPU0FfVUludDMyKSh0YXJnZXRlZEJpdHJhdGUgKiAwLjEpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoCi0gICAgICAgICAgICAgICAgIk5ldyBiaXRyYXRlMSAhIVxuUmF0aW8gY2xpcF9uYi9kdXJhdGlvbiA9ICVmXG5UYXJnZXRlZCBiaXRyYXRlID0gJWQiLAotICAgICAgICAgICAgICAgIHJhdGlvLCB0YXJnZXRlZEJpdHJhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHJhdGlvID4gNzUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgLT0gKE00T1NBX1VJbnQzMikodGFyZ2V0ZWRCaXRyYXRlICogMC4xNSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgICAgICAgICAiTmV3IGJpdHJhdGUyICEhXG5SYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgcmF0aW8sIHRhcmdldGVkQml0cmF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKkNSIDMyODMgTU1TIHVzZSBjYXNlIGZvciBWQUw6Ci0gICAgICAgIERlY3JlYXNlIHRoZSBvdXRwdXQgZmlsZSBzaXplIHRvIGtlZXAgYSBtYXJnaW4gb2YgNSUKLSAgICAgICAgVGhlIHdyaXRlciB3aWxsIHN0b3Agd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUgc2l6ZSB3aWxsIGJlIHJlYWNoZWQqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAtPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgKiAwLjA1KTsKLQotICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAzMjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDMyMDAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQToKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgMzIwMDAgKSAgICAgICAgICAgICAgLyo0ODAwMCkqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAzMjAwMDsgLyo0ODAwMDsqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCA0ODAwMCApICAgICAgICAgICAgICAvKjY0MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDQ4MDAwOyAvKjY0MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDY0MDAwICkgICAgICAgICAgICAgIC8qMTI4MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDY0MDAwOyAvKjEyODAwMDsqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDEyODAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDEyODAwMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAxOTIwMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAxOTIwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogQ2Fubm90IGhhcHBlbiAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBFcnJvciBpbiBvdXRwdXQgZmlsZVNpemUgISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKXRhcmdldGVkQml0cmF0ZTsKLSAgICB9Ci0KLSAgICBpZiggYklzVHJhbnNjb2RpbmcgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfVFJBTlNDT0RJTkdfTkVDRVNTQVJZOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NoYXIqIHBGaWxlUGF0aCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlIHRoZSBzYXZlCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgY3JlYXRlIDNHUCBlZGl0ZWQgZmluYWwgZmlsZQotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORQotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZVBhdGggICAgICAgICAgICAoSU4pIElmIHRoZSB1c2VyIHdhbnRzIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZW5hbWUsIGVsc2UgY2FuIGJlIE5VTEwgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NhdmVTdGFydCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCAqcEZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKkFkZCBmb3IgVVRGIGNvbnZlcnNpb246IGNvcHkgdGhlIHBTZXR0aW5ncyBzdHJ1Y3R1cmUgaW50byBhIG5ldyBwQ3VycmVudEVkaXRTZXR0aW5ncyovCi0gICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqcEVkaXRTYXZpbmdTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDggaSwgajsKLSAgICBNNE9TQV9VSW50MzIgb2Zmc2V0ID0gMDsKLSAgICBNNE9TQV9VSW50OCBuYkVmZmVjdHMgPSAwOwotICAgIC8qb25seSBmb3IgVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMDsKLSAgICAvKiovCi0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TYXZlU3RhcnQgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBSQzogdG8gdGVtcG9yYXJ5IGhhbmRsZSBjaGFuZ2luZyBvZiBvdXRwdXQgZmlsZXBhdGggKi8KLSAgICAvKiBUTyBCRSBDSEFOR0VEIENMRUFOTFkgV0lUSCBBIE1BTExPQy9NRU1DUFkgISEhISAqLwotICAgIGlmKCBwRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKml0IG1lYW5zIHRoYXQgcE91dHB1dEZpbGUgaGFzIGJlZW4gYWxsb2NhdGVkIGluIE00eFZTU19zZW5kQ29tbWFuZCgpKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwRGVjb2RlZFBhdGggPSBwRmlsZVBhdGg7Ci0gICAgICAgIC8qQXMgYWxsIGlucHV0cyBvZiB0aGUgeFZTUyBhcmUgaW4gVVRGOCwgY29udmVydCB0aGUgb3V0cHV0IGZpbGUgcGF0aCBpbnRvIHRoZSBjdXN0b21lcgotICAgICAgICAgZm9ybWF0Ki8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwRmlsZVBhdGgsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIGZpbGVQYXRoU2l6ZSA9IGxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZmlsZVBhdGhTaXplICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19TYXZlU3RhcnQ6IG91dHB1dCBmaWxlIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwgZmlsZVBhdGhTaXplICsgMSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGVbZmlsZVBhdGhTaXplXSA9ICdcMCc7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gZmlsZVBhdGhTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICoqKi8KLQotICAgIC8qRkI6IEFkZCBmb3IgVVRGIGNvbnZlcnNpb246IGNvcHkgdGhlIHBTZXR0aW5ncyBzdHJ1Y3R1cmUgaW50byBhIG5ldyBwQ3VycmVudEVkaXRTZXR0aW5ncyovCi0gICAgLypJdCBpcyB0aGUgc2FtZSBwcmluY2lwbGUgYXMgaW4gdGhlIFByZXZpZXdTdGFydCgpKi8KLSAgICBwRWRpdFNhdmluZ1NldHRpbmdzID0KLSAgICAgICAgKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MpLAotICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJTYXZpbmcsIGNvcHkgb2YgVlNTIHN0cnVjdHVyZSIpOwotCi0gICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogQ29weSBzZXR0aW5ncyBmcm9tIGlucHV0IHN0cnVjdHVyZSAqLwotICAgIG1lbWNweSgodm9pZCAqKSAmKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MpLAotICAgICAgICAodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTKSwKLSAgICAgICAgc2l6ZW9mKE00eFZTU19FZGl0U2V0dGluZ3MpKTsKLQotICAgIC8qIEluaXRpYWxpemUgcEVkaXRTYXZpbmdTZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0KLSAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSA9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU1hc3RlckNsaXA7IC8qIFZTUzIuMCBtYW5kYXRvcnkgcGFyYW1ldGVyICovCi0KLSAgICAvKiBBbGxvY2F0ZSBzYXZpbmdTZXR0aW5ncy5wQ2xpcExpc3QvcFRyYW5zaXRpb25zIHN0cnVjdHVyZSAqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdCA9IChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoKLSAgICAgICAgKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopCi0gICAgICAgICpwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIsCi0gICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIHNhdmluZyAsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0ID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICoKLSAgICAgICAgICAgICogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKQotICAgICAgICAgICAgKihwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIHNhdmluZywgY29weSBvZiBwVHJhbnNpdGlvbkxpc3QiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyksCi0gICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJzYXZpbmcgY2xpcCBzZXR0aW5ncyIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBpIDwgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAtIDEgKSAvKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJzYXZpbmcgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8vIEFkZCBNUDQgZmlsZSBzdXBwb3J0Ci0KLSAgICAgICAgaWYoICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQKQotICAgICAgICAgICAgfHwgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0KQotICAgICAgICAgICAgfHwgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWKQotICAgICAgICAgICAgfHwgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpKQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIGdpdmVuIHN0cnVjdHVyZSB0byBvdXIgc2F2aW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyhwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRSAvKiByZW1vdmUgZWZmZWN0cyAqLyk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0gICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICBmcmVlKAotICAgICAgICAgICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJzYXZpbmcgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+ZmlsZVBhdGhTaXplID0gbGVuZ3RoKzE7Ci0KLSAgICAgICAgICAgIGlmKCBpCi0gICAgICAgICAgICAgICAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAgICAgLSAxICkgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBFcnJvciB3aGVuIHBhcnNpbmcgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXTpcCi0gICAgICAgICAgICAgICAgIEJhZCBmaWxlIHR5cGUiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHZpZGVvIGVmZmVjdHMsIHVzZWQgdG8ga25vdyBob3cgbXVjaCBtZW1vcnkgaXMgbmVlZGVkIHRvIGFsbG9jYXRlKi8KLSAgICAvKiBGQiAyMDA4LzEwLzE1OiByZW1vdmVkIDogbm90IGNvbXBhdGlibGUgd2l0aCBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lCi0gICAgZm9yKGo9MDtqPHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHM7aisrKQotICAgIHsKLSAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUgIT0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSkKLSAgICB7Ci0gICAgbmJFZmZlY3RzKys7Ci0gICAgfQotICAgIH0qLwotICAgIG5iRWZmZWN0cyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHM7Ci0KLSAgICAvKiBBbGxvY2F0ZSBlZmZlY3RzIHNhdmluZyBzdHJ1Y3R1cmUgd2l0aCBjb3JyZWN0IG51bWJlciBvZiBlZmZlY3RzICovCi0gICAgaWYoIG5iRWZmZWN0cyAhPSAwICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMgPQotICAgICAgICAgICAgKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuYkVmZmVjdHMKLSAgICAgICAgICAgICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKSJTYXZpbmcgc2V0dGluZ3MsIGVmZmVjdHMgdGFibGUgb2Ygc3RydWN0dXJlIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEp1c3QgY29weSBlZmZlY3Qgc3RydWN0dXJlIHRvIHNhdmluZyBzdHJ1Y3R1cmUsIGFzIGVmZmVjdHMgdGltZSBhcmUgbm93ICovCi0gICAgICAgIC8qIHJlbGF0aXZlIHRvIG91dHB1dCBjbGlwIHRpbWUqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT5FZmZlY3RzLAotICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0cywKLSAgICAgICAgICAgIG5iRWZmZWN0cyAqIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPm5iRWZmZWN0cyA9IDA7Ci0gICAgfQotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPm5iRWZmZWN0cyA9IG5iRWZmZWN0czsKLQotICAgIGlmKCBwRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wT3V0cHV0RmlsZSA9IHBGaWxlUGF0aDsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIHBvaW50ZXIgb2Ygc2F2aW5nIHZpZGVvIGVkaXRvciB0byB1c2UgaW4gc3RlcCBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBwRWRpdFNhdmluZ1NldHRpbmdzOwotCi0gICAgLyogQ2hhbmdlIG91dHB1dCBmaWxlIG5hbWUgdG8gdGVtcG9yYXJ5IG91dHB1dCBmaWxlIG5hbWUsIGJlY2F1c2UgZmluYWwgZmlsZSB3aWxsIGJlCi0gICAgIGdlbmVyYXRlZCBieSBhdWRpbyBtaXhlciAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgewotCi0gICAgICAgIE00T1NBX0NoYXIgb3V0XzNncFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLQotICAgICAgICAvKiovCi0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0KLSAgICAgICAgICAgIChNNHhWU1NfQkdNU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19CR01TZXR0aW5ncyksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgKikiU2F2aW5nIHNldHRpbmdzLCBlZmZlY3RzIHRhYmxlIG9mIHN0cnVjdHVyZSBzZXR0aW5ncyIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjayA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSnVzdCBjb3B5IGVmZmVjdCBzdHJ1Y3R1cmUgdG8gc2F2aW5nIHN0cnVjdHVyZSwgYXMgZWZmZWN0cyB0aW1lIGFyZSBub3cgKi8KLSAgICAgICAgLyogcmVsYXRpdmUgdG8gb3V0cHV0IGNsaXAgdGltZSovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCi0gICAgICAgICAgICBzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSk7Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgZmlsZSBuYW1lLCBhbmQgY29weSBmaWxlIG5hbWUgYnVmZmVyIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKHN0cmxlbih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQotICAgICAgICAgICAgKyAxKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIlNhdmluZyBzdHJ1Y3QgeFZTUyBCR00gZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgc3RybGVuKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpCi0gICAgICAgICAgICArIDEpOwotCi0gICAgICAgIC8qQ29weSBCR00gdHJhY2sgZmlsZSBwYXRoKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbiovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICBmcmVlKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgKikiTTR4VlNTX1NhdmVTdGFydDogVGVtcCBmaWxlbmFtZSBpbiBjYXNlIG9mIEJHTSIpOwotCi0gICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiovCi0KLSAgICAgICAgTTRPU0FfY2hyTkNvcHkob3V0XzNncCwgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxKTsKLSAgICAgICAgTTRPU0FfY2hyTkNvcHkob3V0XzNncF90bXAsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0KLSAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgM0dQIGZpbGVuYW1lICovCi0gICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfM2dwLCAoY29uc3QgY2hhciAqKSJzYXZldGVtcC4zZ3BcMCIsIDEzKTsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF8zZ3BfdG1wLCAoY29uc3QgY2hhciAqKSJzYXZldGVtcC50bXBcMCIsIDEzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncDsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfM2dwLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wIGZpbGVuYW1lIGluIGNhc2Ugb2YgQkdNIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGggKyAxOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwX3RtcDsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfM2dwX3RtcCwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1NhdmVTdGFydDogVGVtcG9yYXJ5IGZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLQotICAgICAgICAvKiBQdXQgbmIgb2Ygc3RlcCBmb3IgcHJvZ3Jlc3Npb24gbW9uaXRvcmluZyB0byAyLCBiZWNhdXNlIGF1ZGlvIG1peGluZyBpcyBuZWVkZWQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCA9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKiBQdXQgbmIgb2Ygc3RlcCBmb3IgcHJvZ3Jlc3Npb24gbW9uaXRvcmluZyB0byAxLCBiZWNhdXNlIG5vIGF1ZGlvIG1peGluZyBpcyBuZWVkZWQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKioqLwotCi0gICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgLyoqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBwVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qIFRPRE86IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBSZWluaXRpYWxpemUgY3VycmVudCBzdGVwIG51bWJlciBmb3IgcHJvZ3Jlc3Npb24gbW9uaXRvcmluZyAqLwotICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgPSAwOwotCi0gICAgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlU2F2aW5nOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiB1bmFsbG9jYXRlIHNhdmUgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkUKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NhdmVTdG9wKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZVNhdmluZyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TYXZlU3RvcCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIEZyZWUgc2F2aW5nIHN0cnVjdHVyZXMgKi8KLSAgICBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZVNhdmVkOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfU3RlcChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGRpZmZlcmVudHMgdGFza3MsIGRlcGVuZGluZyBvZiB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZS4KLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uOgotICogICAgICAgICAgICAgICAgICAgIC0gYW5hbHlzZXMgZWRpdGluZyBzdHJ1Y3R1cmUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TZW5kQ29tbWFuZAotICogICAgICAgICAgICAgICAgICAgIC0gZ2VuZXJhdGVzIHByZXZpZXcgZmlsZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdGFydAotICogICAgICAgICAgICAgICAgICAgIC0gZ2VuZXJhdGVzIGZpbmFsIGVkaXRlZCBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfU2F2ZVN0YXJ0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgICAgICAgICAgIChJTi9PVVQpIFBvaW50ZXIgb24gYW4gaW50ZWdlciBnaXZpbmcgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzIGluZGljYXRpb24gKGJldHdlZW4gMC0xMDApCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IsIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCBhZ2FpbgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWTogICAgUHJldmlldyBmaWxlIGlzIGdlbmVyYXRlZAotICogQHJldHVybiAgICBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOiAgICAgICAgRmluYWwgZWRpdGVkIGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkU6ICAgIEFuYWx5c2UgaXMgZG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1N0ZXAoIE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQXVkaW9NaXhpbmdDdHh0ID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQ4IHVpUHJvZ3Jlc3MgPSAwOwotCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2aW5nOgotICAgICAgICAvL2Nhc2UgTTR4VlNTX2tTdGF0ZUdlbmVyYXRpbmdQcmV2aWV3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZUVkaXRpbmcgKSAvKiBWU1MgLT4gY3JlYXRpbmcgZWZmZWN0cywgdHJhbnNpdGlvbnMgLi4uICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBSQzogdG8gZGVsZXRlIHVuZWNlc3NhcnkgdGVtcCBmaWxlcyBvbiB0aGUgZmx5ICovCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwVlNTQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwVnNzQ3R4dDsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdFN0ZXAocFZzc0N0eHQsICZ1aVByb2dyZXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBlcnIgIT0gTTROT19FUlJPUikgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1N0ZXA6IE00VlNTM0dQUF9lZGl0U3RlcCByZXR1cm5lZCAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2VkaXRDbGVhblVwKHBWc3NDdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBSQzogdG8gZGVsZXRlIHVuZWNlc3NhcnkgdGVtcCBmaWxlcyBvbiB0aGUgZmx5ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSNpZm5kZWYgRE9fTk9UX1JFTU9WRV9URU1QX0ZJTEVTCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB3ZSBjYW4gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3Qgc3RlcCwgY2hlY2sgdGhlIHRlbXAgZmlsZSBpcyBub3QgdXNlIHNvbWV3aGVyZSBlbHNlIGFmdGVyICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgY21wUmVzdWx0ID0gLTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSBwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgcFZTU0NvbnRleHQtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcFZTU0NvbnRleHQtPnBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLmZpbGVQYXRoU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwVlNTQ29udGV4dC0+cENsaXBMaXN0W2ldLmZpbGVQYXRoU2l6ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBSZXN1bHQgPSBtZW1jbXAoKHZvaWQgKilwVlNTQ29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0ucEZpbGUsICh2b2lkICopcFZTU0NvbnRleHQtPnBDbGlwTGlzdFtpXS5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5maWxlUGF0aFNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbXBSZXN1bHQgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHdlIGZvdW5kIGEgY29ycmVzcG9uZGluZyBmaWxlLCB3ZSBkbyBub3QgZGVsZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNtcFJlc3VsdCAhPSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAqdG90bzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICpwVG1wU3RyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCByZXN1bHQgaW4gVVRGOCB0byBjaGVjayBpZiB3ZSBjYW4gZGVsZXRlIGl0IG9yIG5vdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwVlNTQ29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0ucEZpbGUsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdG8gPSAoTTRPU0FfQ2hhciAqKXN0cnN0cigoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wU3RyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdG8gPSAoTTRPU0FfQ2hhciAqKXN0cnN0cigoY29uc3QgY2hhciAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgPSBwVlNTQ29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0ucEZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRvdG8gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcyB0ZW1wb3JhcnkgZmlsZXMgY2FuIGJlIGltZ1hYWC4zZ3Agb3IgdmlkWFhYLjNncCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wU3RyICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKChjb25zdCBjaGFyICopcFRtcFN0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTApOyAvKiBCZWNhdXNlIHRlbXBvcmFyeSBmaWxlcyBoYXZlIGEgbGVuZ3RoIGF0IG1vc3Qgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdG8gPSAoTTRPU0FfQ2hhciAqKXN0cnN0cigoY29uc3QgY2hhciAqKXBUbXBTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSJpbWciKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdG90byAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFRtcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSJ2aWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00Tk9fRVJST1IgKSAvKiBJdCBtZWFucyB0aGUgZmlsZSBpcyBhIHRlbXBvcmFyeSBmaWxlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGRlbGV0ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwVlNTQ29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKiBET19OT1RfUkVNT1ZFX1RFTVBfRklMRVMqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzIHVubGVzcyBwcm9ncmVzcyB3b3VsZCBiZSB3cm9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeCBmb3IgIGJscm54cHN3IzIzNC0tLT4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qPC0tLS0gRml4IGZvciAgYmxybnhwc3cjMjM0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQXVkaW9NaXhpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbiBBdWRpbyBtaXhpbmcgY29tcG9uZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQXVkaW9NaXhpbmcgKSAvKiBBdWRpbyBtaXhpbmc6IG1peC9yZXBsYWNlIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgIHdpdGggZ2l2ZW4gQkdNICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKHBBdWRpb01peGluZ0N0eHQsICZ1aVByb2dyZXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChlcnIgIT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdNYWluOiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwIHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogV2hlbiBhIHN0ZXAgaXMgY29tcGxldGUsIGluY3JlbWVudCBjdXJyZW50U3RlcCBhbmQgcmVzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBzdGF0ZSBpbiBzdGVwIGZ1bmN0aW9uICEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tTdGF0ZUFuYWx5emluZzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUCApIC8qIFB0bzNHUFAsIGFuYWx5c2luZyBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQVG8zR1BQcGFyYW1zTGlzdDsgLyogQ3VycmVudCBQdG8zR1BQIFBhcmFtZXRlciBpcyB0aGUgZmlyc3QgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7IC8qIEN1cnJlbnQgUHRvM0dQUCBQYXJhbWV0ZXIgaXMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkgLyogSXQgbWVhbnMgdGhlcmUgaXMgbm8gbmV4dCBpbWFnZSB0byBjb252ZXJ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2Ugc3RlcCB0byBNQ1MgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1M7IC8qIENoYW5nZSBBbmFseXppbmcgbWljcm8gc3RhdGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTIHBoYXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgZmlsZSBoYXMgdG8gYmUgY29udmVydGVkIG9yIG5vdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBJZiBub3QsIHdlIGp1c3QgcmV0dXJuIE00Tk9fRVJST1IsIGFuZCBnbyB0byBuZXh0IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5pc0NyZWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbmluZyBQdG8zR1BQICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUNvbnZlcnRQdG8zR1BQOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFAgKSAvKiBQdG8zR1BQLCBjb252ZXJ0aW5nICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfU3RlcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwcm9ncmVzcyBiYXIgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgPiAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gKHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dC0+bV9JbWFnZUNvdW50ZXIgKiAxMDApIC8gKHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dC0+bV9OYkltYWdlIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKSAmJiAoZXJyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSAoKE00T1NBX1VJbnQzMilNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HKSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUTyBCRSBDSEVDS0VEIE5PIExFQUtTICAhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TdGVwOiBNNFBUTzNHUFBfU3RlcCByZXR1cm5lZCAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgID09ICgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQOyAvKiBXZSBnbyBiYWNrIHRvIGFuYWx5emUgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5leHQgZmlsZSB0byBjb252ZXJ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSQyAhISEhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogVG8gYXZvaWQgcmVjb252ZXJ0aW5nIGl0IGlmIGFub3RoZXIgU2VuZENvbW1hbmQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlNTOmJscm54cHN3IyAgMjM0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PQotICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTICkgLyogTUNTOiBhbmFseXppbmcgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPT0gTTRPU0FfTlVMTCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUNTcGFyYW1zTGlzdDsgLyogQ3VycmVudCBNQ1MgUGFyYW1ldGVyIGlzIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyAhPSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OyAvKiBDdXJyZW50IE1DUyBQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGVyZSBpcyBubyBuZXh0IGltYWdlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFJlaW5pdCBBbmFseXppbmcgbWljcm8gc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkOyAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsgLyogRW5kIG9mIEFuYWx5c2lzICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFJlaW5pdCBBbmFseXppbmcgbWljcm8gc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tTdGF0ZU9wZW5lZDsgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBBbmFseXNpcyAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBmaWxlIGhhcyB0byBiZSB0cmFuc2NvZGVkIG9yIG5vdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBJZiBub3QsIHdlIGp1c3QgcmV0dXJuIE00Tk9fRVJST1IsIGFuZCBnbyB0byBuZXh0IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW5pbmcgTUNTICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcm90YXRpb25EZWdyZWUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RhcnRUcmFuc2NvZGluZyh4VlNTX2NvbnRleHQsICZyb3RhdGlvbkRlZ3JlZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nIHJldHVybmVkXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+dmlkZW9jbGlwbnVtYmVyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3V0cyBhcmUgZG9uZSBpbiB0aGUgTUNTLCBzbyB3ZSBuZWVkIHRvIHJlcGxhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiZWdpbkN1dFRpbWUgYW5kIGVuZEN1dFRpbWUgdG8ga2VlcCB0aGUgZW50aXJlIHZpZGVvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2luZGV4XS0+dWlFbmRDdXRUaW1lID0gMDsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nIHJldHVybmVkIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczsgTUNTIGNvbnRleHQ6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlVHJhbnNjb2RlTUNTOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRhaW4gcm90YXRpb24gaW5mbyBvZiB0cmltbWVkIC8gdHJhbnNjb2RlZCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2luZGV4XS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzID0gcm90YXRpb25EZWdyZWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1MgKQotICAgICAgICAgICAgICAgICAgICAvKiBNQ1M6IHRyYW5zY29kaW5nIGZpbGUgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3N0ZXAoeFZTU19jb250ZXh0LT5wTUNTX0N0eHQsICZ1aVByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgLypTUzpibHJueHBzdyMgIDIzNCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00TUNTX0VSUl9OT01PUkVfU1BBQ0UpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChlcnIgIT0gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE8gQkUgQ0hFQ0tFRCBOTyBMRUFLUyAgISEhISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogTTRNQ1Nfc3RlcCByZXR1cm5lZCAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZXJyID09IE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsgLyogV2UgZ28gYmFjayB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5emUgcGFyYW1ldGVycyB0byBzZWUgaWYgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBuZXh0IGZpbGUgdG8gdHJhbnNjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSQyAhISEhISEhISEqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBUbyBhdm9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29udmVydGluZyBpdCBpZiBhbm90aGVyIFNlbmRDb21tYW5kIGlzIGNhbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcgcmV0dXJuZWQgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgTUNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIG1pY3JvIHN0YXRlIGluIGFuYWx5emluZyBzdGF0ZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TdGVwIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLWVuZF9zdGVwOgotICAgIC8qIENvbXB1dGUgcHJvZ3Jlc3Npb24gKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCAhPSAwICkKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpKCggKCB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwICogMTAwKSBcCi0gICAgICAgICAgICAvICh4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKSkKLSAgICAgICAgICAgICsgKHVpUHJvZ3Jlc3MgLyAoeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCkpKTsKLQotICAgICAgICBpZiggKnBQcm9ncmVzcyA+IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0Nsb3NlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgY3VycmVudCBlZGl0aW5nIHByb2ZpbGUsIHVuYWxsb2NhdGUKLSAqICAgICAgICAgICAgICAgIHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIGNhbiBjYWxsIGEgbmV3IE00eFZTU19TZW5kQ29tbWFuZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQ2xvc2VDb21tYW5kKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIC8qIERlcGVuZGluZyBvZiB0aGUgc3RhdGUsIGRpZmZlcmVudHMgdGhpbmdzIGhhdmUgdG8gYmUgZG9uZSAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5tX3N0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTR4VlNTX2tTdGF0ZU9wZW5lZDoKLSAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwID09IE00eFZTU19rTWljcm9TdGF0ZUVkaXRpbmcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DbG9zZUNvbW1hbmQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYXJlIHJldGFpbmluZyBlcnJvciBoZXJlIGFuZCByZXR1cm5pbmcgZXJyb3IgIGluIHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAgYXMgdG8gYXZpb2QgbWVtb3J5IGxlYWsqLwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQXVkaW9NaXhpbmcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeCBmb3IgYmxybnhwc3cjMjM0LS0tLT4qLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfQ2xvc2VDb21tYW5kOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYXJlIHJldGFpbmluZyBlcnJvciBoZXJlIGFuZCByZXR1cm5pbmcgZXJyb3IgIGluIHRoZSBlbmQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiAgYXMgdG8gYXZpb2QgbWVtb3J5IGxlYWsqLwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogPC0tLS1GaXggZm9yIGJscm54cHN3IzIzNCovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qIFdlIGZyZWUgdGhpcyBwb2ludGVyIG9ubHkgaWYgYSBCR00gdHJhY2sgaXMgcHJlc2VudCwgYmVjYXVzZSBpbiB0aGF0IGNhc2UsCi0gICAgICAgICAgICAgICAgdGhpcyBwb2ludGVyIG93bnMgdG8gdXMgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tTdGF0ZVNhdmVkOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID09IE00eFZTU19rTWljcm9TdGF0ZUNvbnZlcnRQdG8zR1BQICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgUHRvM0dQUCBtb2R1bGUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwIHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYXJlIHJldGFpbmluZyBlcnJvciBoZXJlIGFuZCByZXR1cm5pbmcgZXJyb3IgIGluIHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAgYXMgdG8gYXZpb2QgbWVtb3J5IGxlYWsqLwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIDwtLS0tLUZpeCBmb3IgYmxybnhwc3cjMjM0PiovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlVHJhbnNjb2RlTUNTICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgTUNTIG1vZHVsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19hYm9ydCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZpeCBmb3IgYmxybnhwc3cjMjM0LS0tLT4qLwotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNE1DU19hYm9ydCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYXJlIHJldGFpbmluZyBlcnJvciBoZXJlIGFuZCByZXR1cm5pbmcgZXJyb3IgIGluIHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAgYXMgdG8gYXZpb2QgbWVtb3J5IGxlYWsqLwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIDwtLS1GaXggZm9yIGJscm54cHN3IzIzNCovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19DbG9zZUNvbW1hbmQgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQ7IC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBkZWxldGVzIGFsbCB4VlNTIHJlc3NvdXJjZXMKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19DbG9zZUNvbW1hbmQuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19DbGVhblVwKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19DbGVhblVwOmVudGVyaW5nIik7Ci0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKFwKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19DbGVhblVwIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsXAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVVRGIGNvbnZlcnNpb246IGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlciovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0KLSAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzKTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0NsZWFuVXA6bGVhdmluZyAiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBWaWRlbyBTdHVkaW8gMi4xCi0gKgotICogQHBhcmFtICAgIHBWZXJzaW9uICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB2ZXJzaW9uIGluZm8gc3RydWN0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19HZXRWZXJzaW9uKCBNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24gKQotewotICAgIC8qIEp1c3QgdXNlZCBmb3IgYSBncmVwIGluIGNvZGUgKi8KLSAgICAvKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0gICAgc3RhdGljIGNvbnN0IE00T1NBX0NoYXIgY1ZlcnNpb25bMjZdID0gIk5YUFNXX1ZpZGVvU3R1ZGlvMjFfMV8zXzAiOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFZlcnNpb24gKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwVmVyc2lvbi0+bV9tYWpvciA9IE00X3hWU1NfTUFKT1I7Ci0gICAgcFZlcnNpb24tPm1fbWlub3IgPSBNNF94VlNTX01JTk9SOwotICAgIHBWZXJzaW9uLT5tX3JldmlzaW9uID0gTTRfeFZTU19SRVZJU0lPTjsKLSAgICBwVmVyc2lvbi0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X1ZlcnNpb25JbmZvKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzWyBdIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBTaXplIG9mIHRoZSBjbGlwIHBhdGggKG5lZWRlZCBmb3IgdGhlIFVURjE2IGNvbnZlcnNpb24pCi0gKiBAcGFyYW0gICAgbmJFZmZlY3RzICAgICAgICAgICAoSU4pIE5iIG9mIGVmZmVjdCBzZXR0aW5ncyB0byBhbGxvY2F0ZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBGaWxlLCBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyBjYWxsZWQgd2l0aCBwQ2xpcFNldHRpbmdzPTB4JXAiLAotICAgICAgICBwQ2xpcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qIENyZWF0ZSBpbmhlcml0ZWQgVlNTM0dQUCBzdHVmZiAqLwotICAgIC8qZXJyID0gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncywgcEZpbGUsbmJFZmZlY3RzKTsqLwotICAgIC8qRkI6IGFkZCBjbGlwIHBhdGggc2l6ZSAobmVlZGVkIGZvciBVVEYgMTYgY29udmVyc2lvbikqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKHBDbGlwU2V0dGluZ3MsIHBGaWxlLCBmaWxlUGF0aFNpemUsCi0gICAgICAgIG5iRWZmZWN0cyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MgOlwKLSAgICAgICAgICAgICAgICAgICAgICAgRVJST1IgaW4gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIGNsaXAgc2V0dGluZ3MgdG8gZGVmYXVsdCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlFbmRDdXRQZXJjZW50ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLnVpRHVyYXRpb24gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuaXNQYW5ab29tID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFhhID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WWEgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVRvcGxlZnRYYiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFliID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21YYSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tWGIgPSAwOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRHVwbGljYXRlcyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlLCBwZXJmb3JtaW5nIGFsbG9jYXRpb25zIGlmIHJlcXVpcmVkCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NEZXN0ICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc09yaWcgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIGJDb3B5RWZmZWN0cyAgICAgICAgKElOKSBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkdXBsaWNhdGUgZWZmZWN0cwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDbGlwU2V0dGluZ3NEZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiQ29weUVmZmVjdHMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIGRlc3Q9MHglcCBzcmM9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3NEZXN0LCBwQ2xpcFNldHRpbmdzT3JpZyk7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc0Rlc3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzRGVzdCBpcyBOVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NPcmlnKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5nc09yaWcgaXMgTlVMTCIpOwotCi0gICAgLyogQ2FsbCBpbmhlcml0ZWQgVlNTM0dQUCBkdXBsaWNhdGlvbiAqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKHBDbGlwU2V0dGluZ3NEZXN0LAotICAgICAgICBwQ2xpcFNldHRpbmdzT3JpZywgYkNvcHlFZmZlY3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyA6XAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBpbiBNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRnJlZSB0aGUgcG9pbnRlcnMgYWxsb2NhdGVkIGluIHRoZSBDbGlwU2V0dGluZyBzdHJ1Y3R1cmUgKHBGaWxlLCBFZmZlY3RzLCAuLi4pLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRnJlZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5ncyBpcyBOVUxMIik7Ci0KLSAgICAvKiBGcmVlIGluaGVyaXRlZCBWU1MzR1BQIHN0dWZmICovCi0gICAgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKHBDbGlwU2V0dGluZ3MpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIE1DUyBjb250ZXh0IHdpdGhpbiB0aGUgeFZTUyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIFZTUyBzdGF0ZSBoYXMgbW92ZWQgdG8gYW5hbHl6aW5nIHN0YXRlIG9yCi0gKiBiZXlvbmQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgbWNzQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciB0byBwb2ludGVyIG9mIG1jcyBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2dldE1DU0NvbnRleHQoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCAqbWNzQ29udGV4dCApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfZ2V0TUNTQ29udGV4dDogcENvbnRleHQgaXMgTlVMTCIpOwotCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9PSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19nZXRNQ1NDb250ZXh0OiBCYWQgc3RhdGUhIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgKm1jc0NvbnRleHQgPSB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBWU1MzR1BQIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBHZW5lcmF0aW5nIHByZXZpZXcKLSAqICAgICAgICAgICAgICBvciBiZXlvbmQKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICB2c3MzZ3BwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciB0byBwb2ludGVyIG9mIHZzczNncHAgY29udGV4dCB0byByZXR1cm4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCAqdnNzM2dwcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0OiBwQ29udGV4dCBpcyBOVUxMIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5tX3N0YXRlIDwgTTR4VlNTX2tTdGF0ZVNhdmluZyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0OiBCYWQgc3RhdGUhIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgKnZzczNncHBDb250ZXh0ID0geFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00eFZTU19nZXRWaWRlb0RlY29kZXJDYXBhYmlsaXRpZXMoTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMgKipkZWNvZGVycykgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gQ2FsbCB0aGUgZGVjb2RlciBhcGkgZGlyZWN0bHkKLSAgICAvLyB0byBnZXQgYWxsIHRoZSB2aWRlbyBkZWNvZGVyIGNhcGFibGl0aWVzLgotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoZGVjb2RlcnMpOwotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNHhWU1NfaW50ZXJuYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjRhNmY0MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX2ludGVybmFsLmMKLSAqIEBicmllZiAgICBJbnRlcm5hbCBmdW5jdGlvbnMgb2YgZXh0ZW5kZWQgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgKFZpZGVvIFN0dWRpbyAyLjEpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0ludGVybmFsLmgiCi0KLS8qZm9yIHJnYjE2IGNvbG9yIGVmZmVjdCovCi0jaW5jbHVkZSAiTTRWSUZJX0RlZmluZXMuaCIKLSNpbmNsdWRlICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqIGNvbXBvbmVudCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIgICAgICAgICAgICAvKio8IHZpZGVvIGVmZmVjdHMgKi8KLQotLyogSW50ZXJuYWwgaGVhZGVyIGZpbGUgb2YgVlNTIGlzIGluY2x1ZGVkIGJlY2F1c2Ugb2YgTU1TIHVzZSBjYXNlICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLQotLypFeGlmIGhlYWRlciBmaWxlcyB0byBhZGQgaW1hZ2UgcmVuZGVyaW5nIHN1cHBvcnQgKGNyb3BwaW5nLCBibGFjayBib3JkZXJzKSovCi0jaW5jbHVkZSAiTTRFWElGQ19Db21tb25BUEkuaCIKLS8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLSNkZWZpbmUgVFJBTlNQQVJFTlRfQ09MT1IgMHg3RTAKLQotLyogUHJvdG90eXBlIG9mIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwIGZ1bmN0aW9uIChhdm9pZCBncmVlbiBlZmZlY3Qgb2YgdHJhbnNwYXJlbmN5IGNvbG9yKSAqLwotTTRWSUZJX1VJbnQ4IE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0KLS8qc3BlY2lhbCBNQ1MgZnVuY3Rpb24gdXNlZCBvbmx5IGluIFZpZGVvQXJ0aXN0IGFuZCBWaWRlb1N0dWRpbyB0byBvcGVuIHRoZSBtZWRpYSBpbiB0aGUgbm9ybWFsCi0gbW9kZS4gVGhhdCB3YXkgdGhlIG1lZGlhIGR1cmF0aW9uIGlzIGFjY3VyYXRlKi8KLWV4dGVybiBNNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgTUNTICgzR1AgdHJhbnNjb2Rlcikgd2l0aCB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgICAgICBUaGUgdHJhbnNjb2RpbmcgcGFyYW1ldGVycyBhcmUgZ2l2ZW4gYnkgdGhlIGludGVybmFsIHhWU1MgY29udGV4dC4KLSAqICAgICAgICAgICAgICAgIFRoaXMgY29udGV4dCBjb250YWlucyBhIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUKLSAqICAgICAgICAgICAgICAgIGNoYWluZWQgbGlzdCBvZiBNQ1MgcGFyYW1ldGVycy4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnJvdGF0aW9uRGVncmVlKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRNQ1NfQ29udGV4dCBtY3NfY29udGV4dDsKLSAgICBNNE1DU19PdXRwdXRQYXJhbXMgUGFyYW1zOwotICAgIE00TUNTX0VuY29kaW5nUGFyYW1zIFJhdGVzOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGNsaXBQcm9wczsKLQotICAgIGVyciA9IE00TUNTX2luaXQoJm1jc19jb250ZXh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19pbml0OiAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE1DU19vcGVuKG1jc19jb250ZXh0LCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5wRmlsZUluLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+SW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5wRmlsZU91dCwKLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5wRmlsZVRlbXApOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19vcGVuOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIGNsaXAgcHJvcGVydGllcwotICAgICAqLwotICAgIGVyciA9IE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMobWNzX2NvbnRleHQsICZjbGlwUHJvcHMpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgKnJvdGF0aW9uRGVncmVlID0gY2xpcFByb3BzLnZpZGVvUm90YXRpb25EZWdyZWVzOwotCi0gICAgLyoqCi0gICAgICogRmlsbCBNQ1MgcGFyYW1ldGVycyB3aXRoIHRoZSBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQotICAgICAgIE1DUyBwYXJhbWV0ZXJzIGNoYWluZWQgbGlzdCAqLwotICAgIFBhcmFtcy5PdXRwdXRGaWxlVHlwZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dEZpbGVUeXBlOwotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0OwotICAgIFBhcmFtcy5vdXRwdXRWaWRlb1Byb2ZpbGU9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBQYXJhbXMub3V0cHV0VmlkZW9MZXZlbCA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVSYXRlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGU7Ci0gICAgUGFyYW1zLk91dHB1dEF1ZGlvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgUGFyYW1zLk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBQYXJhbXMuYkF1ZGlvTW9ubyA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPmJBdWRpb01vbm87Ci0gICAgUGFyYW1zLnBPdXRwdXRQQ01maWxlID0gTTRPU0FfTlVMTDsKLSAgICAvKkZCIDIwMDgvMTAvMjA6IGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyIHRvIGtlZXAgYXNwZWN0IHJhdGlvKi8KLSAgICBzd2l0Y2goeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcpCi0gICAgewotICAgIGNhc2UgTTR4VlNTX2tSZXNpemluZzoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa1Jlc2l6aW5nOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00eFZTU19rQ3JvcHBpbmc6Ci0gICAgICAgIFBhcmFtcy5NZWRpYVJlbmRlcmluZyA9IE00TUNTX2tDcm9wcGluZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNHhWU1Nfa0JsYWNrQm9yZGVyczoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa0JsYWNrQm9yZGVyczsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qKi8KLSAgICAvLyBuZXcgcGFyYW1zIGFmdGVyIGludGVncmF0aW5nIE1DUyAyLjAKLSAgICAvLyBTZXQgdGhlIG51bWJlciBvZiBhdWRpbyBlZmZlY3RzOyAwIGZvciBub3cuCi0gICAgUGFyYW1zLm5iRWZmZWN0cyA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIGVmZmVjdDsgbnVsbCBmb3Igbm93LgotICAgIFBhcmFtcy5wRWZmZWN0cyA9IE5VTEw7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIGVmZmVjdDsgbnVsbCBmb3Igbm93LgotICAgIFBhcmFtcy5iRGlzY2FyZEV4aWYgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLmJBZGp1c3RPcmllbnRhdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgIC8vIG5ldyBwYXJhbXMgYWZ0ZXIgaW50ZWdyYXRpbmcgTUNTIDIuMAotCi0gICAgLyoqCi0gICAgICogU2V0IG91dHB1dCBwYXJhbWV0ZXJzICovCi0gICAgZXJyID0gTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKG1jc19jb250ZXh0LCAmUGFyYW1zKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIFJhdGVzLk91dHB1dFZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICBSYXRlcy5PdXRwdXRBdWRpb0JpdHJhdGUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgUmF0ZXMuQmVnaW5DdXRUaW1lID0gMDsKLSAgICBSYXRlcy5FbmRDdXRUaW1lID0gMDsKLSAgICBSYXRlcy5PdXRwdXRGaWxlU2l6ZSA9IDA7Ci0KLSAgICAvKkZCOiB0cmFuc2NvZGluZyBwZXIgcGFydHMqLwotICAgIFJhdGVzLkJlZ2luQ3V0VGltZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPkJlZ2luQ3V0VGltZTsKLSAgICBSYXRlcy5FbmRDdXRUaW1lID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+RW5kQ3V0VGltZTsKLSAgICBSYXRlcy5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlOwotCi0gICAgZXJyID0gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMobWNzX2NvbnRleHQsICZSYXRlcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX3NldEVuY29kaW5nUGFyYW1zOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQobWNzX2NvbnRleHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0OiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgTUNTIGNvbnRleHQgdG8gYmUgYWJsZSB0byBjYWxsIE1DUyBzdGVwIGZ1bmN0aW9uIGluIE00eFZTU19zdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBtY3NfY29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIE1DUyAoM0dQIHRyYW5zY29kZXIpCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBlcnIgPSBNNE1DU19jbG9zZSh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZzogRXJyb3IgaW4gTTRNQ1NfY2xvc2U6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0aGlzIE1DUyBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00TUNTX2NsZWFuVXAoeFZTU19jb250ZXh0LT5wTUNTX0N0eHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2Rpbmc6IEVycm9yIGluIE00TUNTX2NsZWFuVXA6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHhWU1NfY29udGV4dC0+cE1DU19DdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0gKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhbmQgcmVzaXplcyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRmlsZUluICAgICAgICAgICAgKElOKSBUaGUgSW1hZ2UgaW5wdXQgZmlsZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBZVVY0MjAgb3V0cHV0IHBsYW5lcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCAgdG8gb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIHBsYW5lIHNpemUKLSAqQHBhcmFtICAgIHdpZHRoICAgICAgICAoSU4pIHdpZHRoIG9mIHRoZSBBUkdCODg4OAotICpAcGFyYW0gICAgaGVpZ2h0ICAgICAgICAgICAgKElOKSBoZWlnaHQgb2YgdGhlIEFSR0I4ODg4Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBtZW1vcnkgZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpCi17Ci0gICAgTTRPU0FfQ29udGV4dCBwQVJHQkluOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHJnYlBsYW5lMSAscmdiUGxhbmUyOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfYXJnYj0od2lkdGggKiBoZWlnaHQgKiA0KTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gKHdpZHRoICogaGVpZ2h0ICogMyk7IC8vU2l6ZSBvZiBSR0I4ODggZGF0YS4KLSAgICBNNE9TQV9VSW50MzIgaSA9IDAsaj0gMDsKLSAgICBNNE9TQV9FUlIgZXJyPU00Tk9fRVJST1I7Ci0KLQotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgYXJnYiBkYXRhIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBFbnRlcmluZyA6Iik7Ci0gICAgaWYocFRtcERhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOlwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6d2lkdGggYW5kIGhlaWdodCAlZCAlZCIsCi0gICAgICAgIHdpZHRoICxoZWlnaHQpOwotICAgIC8qIEdldCBmaWxlIHNpemUgKG1hbmRhdG9yeSBmb3IgY2h1bmsgZGVjb2RpbmcpICovCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JJbiwgcEZpbGVJbiwgTTRPU0Ffa0ZpbGVSZWFkKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgQ2FuJ3Qgb3BlbiBpbnB1dCBBUkdCODg4OCBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5yZWFkRGF0YShwQVJHQkluLChNNE9TQV9NZW1BZGRyOClwVG1wRGF0YSwgJmZyYW1lU2l6ZV9hcmdiKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBDYW4ndCBjbG9zZSBBUkdCODg4OFwKLSAgICAgICAgICAgICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBwRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIGVyciA9IHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIENhbid0IGNsb3NlIEFSR0I4ODg4IFwKLSAgICAgICAgICAgICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgcmdiUGxhbmUxLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgIGlmKHJnYlBsYW5lMS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAgICAgcmdiUGxhbmUxLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZTEudV93aWR0aCA9IHdpZHRoOwotICAgICAgICByZ2JQbGFuZTEudV9zdHJpZGUgPSB3aWR0aCozOwotICAgICAgICByZ2JQbGFuZTEudV90b3BsZWZ0ID0gMDsKLQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpKyspIHsKLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIHJnYlBsYW5lMS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2ldOwotICAgICAgICBqKys7Ci0gICAgfQotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLQotICAgIC8qIFRvIENoZWNrIGlmIHJlc2l6aW5nIGlzIHJlcXVpcmVkIHdpdGggY29sb3IgY29udmVyc2lvbiAqLwotICAgIGlmKHdpZHRoICE9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCB8fCBoZWlnaHQgIT0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBSZXNpemluZyA6Iik7Ci0gICAgICAgIGZyYW1lU2l6ZSA9ICAoIHBJbWFnZVBsYW5lcy0+dV93aWR0aCAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQgKiAzKTsKLSAgICAgICAgcmdiUGxhbmUyLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCODg4IGRhdGEiKTsKLSAgICAgICAgaWYocmdiUGxhbmUyLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAgICAgcmdiUGxhbmUyLnVfaGVpZ2h0ID0gIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgIHJnYlBsYW5lMi51X3N0cmlkZSA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCozOwotICAgICAgICAgICAgcmdiUGxhbmUyLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgLyogUmVzaXppbmcgUkdCODg4IHRvIFJHQjg4OCAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OChNNE9TQV9OVUxMLCAmcmdiUGxhbmUxLCAmcmdiUGxhbmUyKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSZXNpemUgUkdCODg4IHRvIFJHQjg4ODogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUxLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypDb252ZXJ0aW5nIFJlc2l6ZWQgUkdCODg4IHRvIFlVVjQyMCAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMiwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0I4ODggdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUkdCIHRvIFlVViBkb25lIik7Ci0KLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgTk8gIFJlc2l6aW5nIDoiKTsKLSAgICAgICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZTEsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgfQotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUkdCIHRvIFlVViBkb25lIik7Ci0gICAgfQotY2xlYW51cDoKLSAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgbGVhdmluZyA6Iik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQpOwotICogQGJyaWVmICAgIEl0IENvdmVydHMgYSBBUkdCODg4OCBpbWFnZSB0byBZVVY0MjAKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEZpbGVJbiAgICAgICAgICAgIChJTikgVGhlIEltYWdlIGlucHV0IGZpbGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHIgICAgKElOKSBQb2ludGVyIG9uIGZpbGVzeXN0ZW0gZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzICAgIChJTi9PVVQpIFBvaW50ZXIgb24gWVVWNDIwIG91dHB1dCBwbGFuZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkdCODg4OCBpbWFnZSAgd2lsbCBiZSBjb252ZXJ0ZWQgYW5kIHJlc2l6ZWQgIHRvIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIHBsYW5lIHNpemUKLSAqIEBwYXJhbSAgICB3aWR0aCAgICAgICAgKElOKSB3aWR0aCBvZiB0aGUgQVJHQjg4ODgKLSAqIEBwYXJhbSAgICBoZWlnaHQgICAgICAgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IG1lbW9yeSBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnl1dlBsYW5lID0gTTRPU0FfTlVMTDsKLQotICAgIHl1dlBsYW5lID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoeXV2UGxhbmUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOlwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICB5dXZQbGFuZVswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICB5dXZQbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgeXV2UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKLSAgICB5dXZQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgIHl1dlBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHl1dlBsYW5lWzBdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVswXS51X3dpZHRoICogMS41LCBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotCi0gICAgeXV2UGxhbmVbMV0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgeXV2UGxhbmVbMV0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICB5dXZQbGFuZVsxXS51X3N0cmlkZSA9IHl1dlBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgeXV2UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICB5dXZQbGFuZVsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVswXS5wYWNfZGF0YSArIHl1dlBsYW5lWzBdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVswXS51X3dpZHRoKTsKLQotICAgIHl1dlBsYW5lWzJdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOwotICAgIHl1dlBsYW5lWzJdLnVfd2lkdGggPSB5dXZQbGFuZVswXS51X3dpZHRoID4+IDE7Ci0gICAgeXV2UGxhbmVbMl0udV9zdHJpZGUgPSB5dXZQbGFuZVsyXS51X3dpZHRoOwotICAgIHl1dlBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgeXV2UGxhbmVbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoeXV2UGxhbmVbMV0ucGFjX2RhdGEgKyB5dXZQbGFuZVsxXS51X2hlaWdodCBcCi0gICAgICAgICogeXV2UGxhbmVbMV0udV93aWR0aCk7Ci0gICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoIHBGaWxlSW4scEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dlBsYW5lLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCByZXR1cm4gZXJyb3I6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgIGZyZWUoeXV2UGxhbmUpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICAgICAqcEltYWdlUGxhbmVzID0geXV2UGxhbmU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAgOkxlYXZpbmciKTsKLSAgICByZXR1cm4gZXJyOwotCi19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgKE00T1NBX1ZvaWQqIHBQaWN0dXJlQ3R4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBQaWN0dXJlRHVyYXRpb24pOwotICogQGJyaWVmICAgIEl0IGZlZWRzIHRoZSBQVE8zR1BQIHdpdGggWVVWNDIwIHBpY3R1cmVzLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBnaXZlbiB0byB0aGUgUFRPM0dQUCBpbiB0aGUgTTRQVE8zR1BQX1BhcmFtcyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMKLSAqIEBwYXJhbSAgICBwUGljdHVyZUR1cmF0aW9uKE9VVCkgRHVyYXRpb24gb2YgdGhlIHJldHVybmVkIHBpY3R1cmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFOiBUaGUgcmV0dXJuZWQgaW1hZ2UgaXMgdGhlIGxhc3Qgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RvdWJsZSogcFBpY3R1cmVEdXJhdGlvbikKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCAgICBsYXN0X2ZyYW1lX2ZsYWcgPSAwOwotICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KiBwQyA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopIChwUGljdHVyZUN0eHQpOwotCi0gICAgLypVc2VkIGZvciBwYW4mem9vbSovCi0gICAgTTRPU0FfVUludDggdGVtcFBhbnpvb21YYSA9IDA7Ci0gICAgTTRPU0FfVUludDggdGVtcFBhbnpvb21YYiA9IDA7Ci0gICAgTTRBSVJfUGFyYW1zIFBhcmFtczsKLSAgICAvKiovCi0KLSAgICAvKlVzZWQgZm9yIGNyb3BwaW5nIGFuZCBibGFjayBib3JkZXJzKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgIHBQaWN0dXJlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgIHBpY3R1cmVTaXplID0gMCA7Ci0gICAgTTRPU0FfVUludDgqICAgIHBpY3R1cmVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIC8vTTRFWElGQ19Db250ZXh0IHBFeGlmQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRFWElGQ19CYXNpY1RhZ3MgcEJhc2ljVGFnczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXMxID0gcEltYWdlUGxhbmVzWzBdOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lczIgPSBwSW1hZ2VQbGFuZXNbMV07Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzMyA9IHBJbWFnZVBsYW5lc1syXTsKLSAgICAvKiovCi0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wUGljdHVyZUN0eHQpLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHBQaWN0dXJlQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wSW1hZ2VQbGFuZXMpLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHBJbWFnZVBsYW5lcyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wUGljdHVyZUR1cmF0aW9uKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHBQaWN0dXJlRHVyYXRpb24gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0IDpFbnRlcmluZyIpOwotICAgIC8qUFIgUDRNRTAwMDAzMTgxIEluIGNhc2UgdGhlIGltYWdlIG51bWJlciBpcyAwLCBwYW4mem9vbSBjYW4gbm90IGJlIHVzZWQqLwotICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSAmJiBwQy0+bV9OYkltYWdlID09IDApCi0gICAgewotICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0gICAgLypJZiBubyBjcm9wcGluZy9ibGFjayBib3JkZXJzIG9yIHBhbiZ6b29tLCBqdXN0IGRlY29kZSBhbmQgcmVzaXplIHRoZSBwaWN0dXJlKi8KLSAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa1Jlc2l6aW5nICYmIE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBhbmQgcmVzaXplIGlucHV0IEFSR0I4ODg4IGZpbGUgdG8gWVVWNDIwICovCi0gICAgICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4OCA6ICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0IDE6IHdpZHRoIGFuZCBoZWdodCAlZCAlZCIsCi0gICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+d2lkdGgscEMtPm1fcFB0bzNHUFBwYXJhbXMtPmhlaWdodCk7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKHBDLT5tX0ZpbGVJbiwKLSAgICAgICAgICAgICBwQy0+bV9wRmlsZVJlYWRQdHIsIHBJbWFnZVBsYW5lcyxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+d2lkdGgsCi0gICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmhlaWdodCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBkZWNvZGluZyBKUEVHOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKkluIGNhc2Ugb2YgY3JvcHBpbmcsIGJsYWNrIGJvcmRlcnMgb3IgcGFuJnpvb20sIGNhbGwgdGhlIEVYSUYgcmVhZGVyIGFuZCB0aGUgQUlSKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29tcHV0ZXMgcmF0aW9zICovCi0gICAgICAgIGlmKHBDLT5tX3BEZWNvZGVkUGxhbmUgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDb252ZXJ0IGlucHV0IEFSR0I4ODg4IGZpbGUgdG8gWVVWNDIwICovCi0gICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgMjogd2lkdGggYW5kIGhlZ2h0ICVkICVkIiwKLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+d2lkdGgscEMtPm1fcFB0bzNHUFBwYXJhbXMtPmhlaWdodCk7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChwQy0+bV9GaWxlSW4sIHBDLT5tX3BGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAmKHBDLT5tX3BEZWNvZGVkUGxhbmUpLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGRlY29kaW5nIEpQRUc6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcERlY29kZWRQbGFuZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogWVVWNDIwIHBsYW5hciBpcyByZXR1cm5lZCBidXQgYWxsb2NhdGlvbiBpcyBtYWRlIG9ubHkgb25jZQotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRpZ291cyBwbGFuZXMgaW4gbWVtb3J5KSAqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wRGVjb2RlZFBsYW5lLT5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qSW5pdGlhbGl6ZSBBSVIgUGFyYW1zKi8KLSAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAwOwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2JPdXRwdXRTdHJpcGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgIC8qSW5pdGlhbGl6ZSBFeGlmIHBhcmFtcyBzdHJ1Y3R1cmUqLwotICAgICAgICBwQmFzaWNUYWdzLm9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjsKLQotICAgICAgICAvKioKLSAgICAgICAgUGFuJnpvb20gcGFyYW1zKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNhdmUgcmF0aW8gdmFsdWVzLCB0aGV5IGNhbiBiZSByZXVzZWQgaWYgdGhlIG5ldyByYXRpb3MgYXJlIDAqLwotICAgICAgICAgICAgdGVtcFBhbnpvb21YYSA9IChNNE9TQV9VSW50OClwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhOwotICAgICAgICAgICAgdGVtcFBhbnpvb21YYiA9IChNNE9TQV9VSW50OClwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiOwotICAgICAgICAgICAgLypDaGVjayB0aGF0IHRoZSByYXRpbyBpcyBub3QgMCovCi0gICAgICAgICAgICAvKkNoZWNrIChhKSBwYXJhbWV0ZXJzKi8KLSAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBtYXhSYXRpbyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPj0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSArIHRlbXBQYW56b29tWGEgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsgdGVtcFBhbnpvb21YYSAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgKyB0ZW1wUGFuem9vbVhhID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArIHRlbXBQYW56b29tWGEgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qTW9kaWZ5IHRoZSAoYSkgcGFyYW1ldGVyczoqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIHRvIG1hdGNoIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSA+PSBtYXhSYXRpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qVGhlIChhKSB0b3BsZWZ0IHBhcmFtZXRlcnMgY2FuIGJlIG1vdmVkIHRvIGtlZXAgdGhlIHNhbWUgYXJlYSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgLT0gbWF4UmF0aW87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTW92ZSB0aGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVyIHRvIDAgYnV0IHRoZSByYXRpbyB3aWxsIGJlIGFsc28gZnVydGhlcgotICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qVGhlIG5ldyByYXRpbyBpcyB0aGUgb3JpZ2luYWwgb25lKi8KLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhID0gdGVtcFBhbnpvb21YYTsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChhKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKkNoZWNrIChiKSBwYXJhbWV0ZXJzKi8KLSAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBtYXhSYXRpbyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPj0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgKyB0ZW1wUGFuem9vbVhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiArIHRlbXBQYW56b29tWGIgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qVGhlIHJhdGlvIGlzIDAsIHRoYXQgbWVhbnMgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChiKQotICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpcyBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliICsgdGVtcFBhbnpvb21YYiA+IDEwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG92ZXJzaXplIGlzIG1heFJhdGlvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhdGlvID0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgKyB0ZW1wUGFuem9vbVhiIC0gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKk1vZGlmeSB0aGUgKGIpIHBhcmFtZXRlcnM6Ki8KLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA+PSBtYXhSYXRpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qVGhlIChiKSB0b3BsZWZ0IHBhcmFtZXRlcnMgY2FuIGJlIG1vdmVkIHRvIGtlZXAgdGhlIHNhbWUgYXJlYSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgLT0gbWF4UmF0aW87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTW92ZSB0aGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVyIHRvIDAgYnV0IHRoZSByYXRpbyB3aWxsIGJlIGFsc28gZnVydGhlcgotICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIHRvIG1hdGNoIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKlRoZSBuZXcgcmF0aW8gaXMgdGhlIG9yaWdpbmFsIG9uZSovCi0gICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IHRlbXBQYW56b29tWGI7Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQ2hhbmdlIHRoZSByYXRpbyBpZiB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpIHBhcmFtZXRlcnMgaXMKLSAgICAgICAgICAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiID0gMTAwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbXB1dGVzIEFJUiBwYXJhbWV0ZXJzICovCi0vKiAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSArCi0gICAgICAgICAgICAoTTRPU0FfSW50MTYpKChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiBcCi0gICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSkgKgotICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZSkpIC8gMTAwOwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArCi0gICAgICAgICAgICAoTTRPU0FfSW50MTYpKChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYlwKLSAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSkgKgotICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZSkpIC8gMTAwOwotCi0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCAqCi0gICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArCi0gICAgICAgICAgICAoTTRPU0FfSW50MTYpKChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSkgKgotICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZSkpIC8gMTAwOwotCi0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9ICAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqCi0gICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArCi0gICAgICAgICAgICAoTTRPU0FfSW50MTYpKChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSkgKgotICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZSkpIC8gMTAwOwotICovCi0gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHVzaW5nIHBDLT5tX05iSW1hZ2Ugd2UgaGF2ZSB0byB1c2UgKHBDLT5tX05iSW1hZ2UtMSkgYXMgcEMtPm1fSW1hZ2VDb3VudGVyCi0gICAgICAgICAgICAvLyB3aWxsIGJlIHgtMSBtYXggZm9yIHggbm8uIG9mIGZyYW1lcwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCAqCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYlwKLSAgICAgICAgICAgICAgICAgICAgIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEpICoKLSAgICAgICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlLTEpKSAvIDEwMDApKTsKLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfRG91YmxlKXBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArCi0gICAgICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYlwKLSAgICAgICAgICAgICAgICAgICAgIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiIFwKLSAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIGlmKChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCArIFBhcmFtcy5tX2lucHV0Q29vcmQubV94KVwKLSAgICAgICAgICAgICAgICAgPiBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3g7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgKyBQYXJhbXMubV9pbnB1dENvb3JkLm1feSlcCi0gICAgICAgICAgICAgICAgID4gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0Q29vcmQubV95OwotICAgICAgICAgICAgfQotCi0KLQotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgICAgUGljdHVyZSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLwotCi0gICAgICAgIGlmKHBDLT5tX21lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQmxhY2tCb3JkZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1sxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgRmlyc3Qgd2l0aG91dCBwYW4mem9vbSovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKSA8PSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgaGVpZ2h0IHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBvbiB0aGUgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X3dpZHRoKSAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk+PjEpKSpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgd2lkdGggc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpPj4xKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0Qm90dG9tOgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KSA8IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID4gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypudW1iZXIgb2YgbGluZXMgYXQgdGhlIHRvcCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKT4+MSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyB3aWR0aCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KSAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICBTZWNvbmRseSB3aXRoIHBhbiZ6b29tKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2gocEJhc2ljVGFncy5vcmllbnRhdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblVua25vd246Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgICAgICAgICAgLypOTyBST1RBVElPTiovCi0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpIDw9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypCbGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCBoZWlnaHQgaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dEhlaWdodCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdXRwdXQgd2lkdGggaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZUhlaWdodCA9ICh0ZW1wT3V0cHV0U2l6ZUhlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBpbnB1dCBoZWlnaHQgYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9IChwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL3RlbXBPdXRwdXRTaXplSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9ICh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBpbWFnZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZUhlaWdodE1heCA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiBoZWlnaHQgd2lsbCBiZSB0aGUgbWF4aW11bSBwb3NzaWJsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV95XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIGNhbiBiZSBleHRlbmRlZCBzeW1tZXRyaWNhbGx5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgYW5kIGJvdHRvbSBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgLT0gKCh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2UgYWJvdmUgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2UgYmVsb3cgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgYm90dG9tKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVIZWlnaHRNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIGFsbCB0aGUgaW5wdXQgaW1hZ2UgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBPdXRwdXRTaXplSGVpZ2h0KnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSBvZiB0aGUgb3V0cHV0IHZpZGVvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBvdXRwdXQgd2lkdGggaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgaGVpZ2h0IGlzIHRoZSBzY3JlZW4gaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dFdpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0gKHRlbXBPdXRwdXRTaXplV2lkdGg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BvcnRpb25hbCB0byB0aGUgbWF4aW11bSBvdXRwdXQgd2lkdGgpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBJbnB1dFNpemVXaWR0aE1heCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXMtPnVfd2lkdGgqUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcE91dHB1dFNpemVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBJbnB1dFNpemVXaWR0aE1heCA9ICh0ZW1wSW5wdXRTaXplV2lkdGhNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IHdpZHRoIGlzIGNvbnRhaW5lZCBpbnRvIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRlbXBJbnB1dFNpemVXaWR0aE1heCA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiB3aWR0aCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVXaWR0aE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVXaWR0aE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94IC09ICgodGVtcElucHV0U2l6ZVdpZHRoTWF4XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dENvb3JkLm1feCA8IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggKyBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2UgYWJvdmUgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIGxlZnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBiZWxvdyB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgcmlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHdpZHRoIG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gdGVtcElucHV0U2l6ZVdpZHRoTWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IHdpZHRoIG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVXaWR0aCpwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9QYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpPj4xKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0Qm90dG9tOgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgICAgICAgICAgLypST1RBVElPTiovCi0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpIDwgcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA+IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSBvZiB0aGUgb3V0cHV0IHZpZGVvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBvdXRwdXQgaGVpZ2h0IGlmIHRoZSBpbnB1dCBpbWFnZSBhc3BlY3QgcmF0aW8gaXMga2VwdCBhbmQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgaGVpZ2h0IGlzIHRoZSBzY3JlZW4gd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dEhlaWdodCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdXRwdXQgd2lkdGggaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0gKHRlbXBPdXRwdXRTaXplSGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IGhlaWdodCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCBoZWlnaHQpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KlBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3RlbXBPdXRwdXRTaXplSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9ICh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZUhlaWdodE1heCA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSB3aWR0aCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiB3aWR0aCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IGFuZCBsZWZ0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCAtPSAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgbGVmdCBvZiB0aGUgaW5wdXQgcGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBsZWZ0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBwYW4gem9vbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSByaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSB3aWR0aCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IHdpZHRoIG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVIZWlnaHQqcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9QYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKSk+PjEpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypCbGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCB3aWR0aCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcE91dHB1dFNpemVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVXaWR0aE1heCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcEZpbmFsSW5wdXRXaWR0aCA9IDAsIHRlbXBGaW5hbE91dHB1dFdpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dFNpemVXaWR0aCA9ICh0ZW1wT3V0cHV0U2l6ZVdpZHRoPj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IHdpZHRoIGFjY29yZGluZyB0byB0aGUgbWF4aW11bSBvdXRwdXQgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXMtPnVfd2lkdGgqUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KS90ZW1wT3V0cHV0U2l6ZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gKHRlbXBJbnB1dFNpemVXaWR0aE1heD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGludG8gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGVpZ2h0IChyb3RhdGlvbiBpbmNsdWRlZCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZVdpZHRoTWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1lYW5zIG5vIGJsYWNrIGJvcmRlcnMsIHRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIHdpbGwgYmUgZXh0ZW5kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoZSBpbnB1dCBBSVIgaGVpZ2h0IHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVXaWR0aE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJpZ2h0IGFuZCBsZWZ0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSAtPSAoKHRlbXBJbnB1dFNpemVXaWR0aE1heCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV95IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgKyBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIG9uIHRoZSB0b3Agb2YgdGhlIGlucHV0IHBhbiB6b29tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEgdG8gZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIGJvdHRvbSBvZiB0aGUgaW5wdXQgcGFuIHpvb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEgdG8gZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgYm90dG9tKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1lYW5zIGJsYWNrIGJvcmRlcnMgYXJlIG5lY2Vzc2FyeSB0byBrZWVwIGFzcGVjdCByYXRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbnB1dCBoZWlnaHQgb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZVdpZHRoKnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNbMF0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNbMV0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogUmVzaXppbmcgYW5kIENyb3BwaW5nKi8KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgIT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wOgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgUGljdHVyZSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tDcm9wcGluZykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgIC9QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg8UGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSGVpZ2h0ID0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgIC8qaGVpZ2h0IHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ICs9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgodGVtcEhlaWdodCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBXaWR0aD0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gIChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgL1BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gIChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ICs9IChNNE9TQV9JbnQzMilcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKChNNE9TQV9JbnQzMikodGVtcFdpZHRoIC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsIEFJUiBmdW5jdGlvbnMgKi8KLSAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwQy0+bV9haXJfY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwotICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gaW5pdGlhbGl6aW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2NvbmZpZ3VyZShwQy0+bV9haXJfY29udGV4dCwgJlBhcmFtcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDpcCi0gICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNEFJUl9nZXQocEMtPm1fYWlyX2NvbnRleHQsIHBDLT5tX3BEZWNvZGVkUGxhbmUsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBnZXR0aW5nIEFJUiBwbGFuZTogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwotICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBJbWFnZVBsYW5lc1swXSA9IHBJbWFnZVBsYW5lczE7Ci0gICAgICAgIHBJbWFnZVBsYW5lc1sxXSA9IHBJbWFnZVBsYW5lczI7Ci0gICAgICAgIHBJbWFnZVBsYW5lc1syXSA9IHBJbWFnZVBsYW5lczM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnQgdGhlIGltYWdlIGNvdW50ZXIgKi8KLSAgICBwQy0+bV9JbWFnZUNvdW50ZXIrKzsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGVuZCBvZiBzZXF1ZW5jZSAqLwotICAgIGxhc3RfZnJhbWVfZmxhZyAgICA9IChwQy0+bV9JbWFnZUNvdW50ZXIgPj0gcEMtPm1fTmJJbWFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHRoZSBwaWN0dXJlIGR1cmF0aW9uICovCi0gICAgKnBQaWN0dXJlRHVyYXRpb24gPSBwQy0+bV90aW1lRHVyYXRpb247Ci0KLSAgICBpZiAoMSA9PSBsYXN0X2ZyYW1lX2ZsYWcpCi0gICAgewotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGNsZWFuaW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BEZWNvZGVkUGxhbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwotICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBMZWF2aW5nICIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIFB0bzNHUFAgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycwotICogQG5vdGUgICAgVGhlICJQaWN0dXJlcyB0byAzR1BQIiBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBieSB0aGUgaW50ZXJuYWwgeFZTUwotICogICAgICAgICAgICBjb250ZXh0LiBUaGlzIGNvbnRleHQgY29udGFpbnMgYSBwb2ludGVyIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQKLSAqICAgICAgICAgICAgb2YgdGhlIGNoYWluZWQgbGlzdCBvZiBQdG8zR1BQIHBhcmFtZXRlcnMuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBEZWZpbml0aW9ucyB0byBnZW5lcmF0ZSBkdW1teSBBTVIgZmlsZSB1c2VkIHRvIGFkZCBBTVIgc2lsZW5jZSBpbiBmaWxlcyBnZW5lcmF0ZWQKLSAgICAgYnkgUHRvM0dQUCAqLwotICAgICNkZWZpbmUgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFICAgICAxMwotICAgIC8qIFRoaXMgY29uc3RhbnQgaXMgZGVmaW5lZCBpbiBNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCAqLwotICAgIGV4dGVybiBjb25zdCBNNE9TQV9VSW50OFwKLSAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXTsKLQotICAgIC8qIEFNUiBzaWxlbnQgZnJhbWUgdXNlZCB0byBjb21wdXRlIGR1bW15IEFNUiBzaWxlbmNlIGZpbGUgKi8KLSAgICAjZGVmaW5lIE00VlNTM0dQUF9BTVJfSEVBREVSX1NJWkUgNgotICAgIGNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BTVJfSEVBREVSW000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQotICAgIHsgMHgyMywgMHgyMSwgMHg0MSwgMHg0ZCwgMHg1MiwgMHgwYSB9OwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00UFRPM0dQUF9Db250ZXh0IHBNNFBUTzNHUFBfQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRQVE8zR1BQX1BhcmFtcyBQYXJhbXM7Ci0gICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KiAgICBwQ2FsbEJhY2tDdHh0OwotICAgIE00T1NBX0Jvb2wgY21wUmVzdWx0PU00T1NBX0ZBTFNFOwotICAgIE00T1NBX0NvbnRleHQgcER1bW15QU1SRmlsZTsKLSAgICBNNE9TQV9DaGFyIG91dF9hbXJbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTTRQVE8zR1BQIGluc3RhbmNlICovCi0gICAgZXJyID0gTTRQVE8zR1BQX0luaXQoICZwTTRQVE8zR1BQX0N0eHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwIHJldHVybmVkICVsZFxuIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDYWxsQmFja0N0eHQgPSAoTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQpLAotICAgICAgICAgTTRWUywoTTRPU0FfQ2hhciAqKSAiUHRvM2dwcCBjYWxsYmFjayBzdHJ1Y3QiKTsKLSAgICBpZihwQ2FsbEJhY2tDdHh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICBQYXJhbXMudmlkZW9Qcm9maWxlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIFBhcmFtcy52aWRlb0xldmVsID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlICJkdW1teSIgYW1yIGZpbGUgY29udGFpbmluZyBzaWxlbmNlIGluIHRlbXBvcmFyeSBmb2xkZXIgKi8KLSAgICBNNE9TQV9jaHJOQ29weShvdXRfYW1yLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfYW1yLCAoY29uc3QgY2hhciAqKSJkdW1teS5hbXJcMCIsIDEwKTsKLQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSB0ZW1wb3JhcnkgcGF0aCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQqLwotICAgIHBEZWNvZGVkUGF0aCA9IG91dF9hbXI7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZCopIG91dF9hbXIsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwOlwKLSAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEVuZCBvZiB0aGUgY29udmVyc2lvbiwgbm93IHVzZSB0aGUgY29udmVydGVkIHBhdGgqLwotCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT5vcGVuV3JpdGUoJnBEdW1teUFNUkZpbGUsIHBEZWNvZGVkUGF0aCwgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0KLSAgICAvKkNvbW1lbnRlZCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIFVURiBjb252ZXJzaW9uIHNlZSBhYm92ZSovCi0vKiAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPm9wZW5Xcml0ZSgmcER1bW15QU1SRmlsZSwgb3V0X2FtciwgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0gKi8KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UGljdHVyZVRvM2dwOiBDYW4ndCBvcGVuIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcyxcCi0gICAgICAgICAgICAgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT53cml0ZURhdGEocER1bW15QU1SRmlsZSwKLSAgICAgICAgKE00T1NBX0ludDgqKU00VlNTM0dQUF9BTVJfSEVBREVSLCBNNFZTUzNHUFBfQU1SX0hFQURFUl9TSVpFKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UGljdHVyZVRvM2dwOiBDYW4ndCB3cml0ZSBvdXRwdXQgZHVtbXkgYW1yIGZpbGUgJXMsXAotICAgICAgICAgICAgIGVycm9yOiAweCV4XG4iLG91dF9hbXIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+d3JpdGVEYXRhKHBEdW1teUFNUkZpbGUsCi0gICAgICAgICAoTTRPU0FfSW50OCopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OCwgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UGljdHVyZVRvM2dwOiBcCi0gICAgICAgICAgICBDYW4ndCB3cml0ZSBvdXRwdXQgZHVtbXkgYW1yIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLG91dF9hbXIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+Y2xvc2VXcml0ZShwRHVtbXlBTVJGaWxlKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UGljdHVyZVRvM2dwOiBcCi0gICAgICAgICAgICBDYW4ndCBjbG9zZSBvdXRwdXQgZHVtbXkgYW1yIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLG91dF9hbXIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCBwYXJhbWV0ZXJzIGZvciBQdG8zR1BQIHdpdGggdGhlIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCi0gICAgICogUHRvM0dQUCBwYXJhbWV0ZXJzIGNoYWluZWQgbGlzdCBhbmQgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZSA9PSAwKSB7Ci0gICAgICAgIFBhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUgICAgPSBNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICAgUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY1RvM0dQOiB2aWRlbyBiaXRyYXRlID0gJWQiLAotICAgICAgICBQYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKTsKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgIFBhcmFtcy5PdXRwdXRGaWxlTWF4U2l6ZSAgICA9IE00UFRPM0dQUF9rVU5MSU1JVEVEOwotICAgIFBhcmFtcy5wUGljdHVyZUNhbGxiYWNrRmN0ICAgID0gTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDsKLSAgICBQYXJhbXMucFBpY3R1cmVDYWxsYmFja0N0eHQgICAgPSBwQ2FsbEJhY2tDdHh0OwotICAgIC8qRkI6IGNoYW5nZSB0byB1c2UgdGhlIGNvbnZlcnRlZCBwYXRoIChVVEYgY29udmVyc2lvbikgc2VlIHRoZSBjb252ZXJzaW9uIGFib3ZlKi8KLSAgICAvKkZpeCA6LSBBZGRpbmcgQXVkaW8gVHJhY2sgaW4gSW1hZ2UgYXMgaW5wdXQgOkF1ZGlvVGFyY2tGaWxlIFNldHRpbmcgdG8gTlVMTCAqLwotICAgIFBhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSAgICA9IE00T1NBX05VTEw7Ly8oTTRPU0FfVm9pZCopcERlY29kZWRQYXRoOy8vb3V0X2FtcjsKLSAgICBQYXJhbXMuQXVkaW9QYWRkaW5nTW9kZSAgICAgICAgPSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcDsKLSAgICBQYXJhbXMuQXVkaW9GaWxlRm9ybWF0ICAgICAgICA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVI7Ci0gICAgUGFyYW1zLnBPdXRwdXQzZ3BwRmlsZSAgICAgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+cEZpbGVPdXQ7Ci0gICAgUGFyYW1zLnBUZW1wb3JhcnlGaWxlICAgICAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5wRmlsZVRlbXA7Ci0gICAgLyorUFIgTm86ICBibHJueHBzdyMyMjMqLwotICAgIC8qSW5jcmVhc2luZyBmcmVxdWVuY3kgb2YgRnJhbWUsIGNhbGN1bGF0aW5nIE5vcyBvZiBGcmFtZSA9IGR1cmF0aW9uIC9GUFMgKi8KLSAgICAvKk90aGVyIGNoYW5nZXMgbWFkZSBpcyBAIE00eFZTU19BUEkuYyBAIGxpbmUgMzg0MSBpbiBNNHhWU1NfU2VuZENvbW1hbmQqLwotICAgIC8qSWYgY2FzZSBjaGVjayBmb3IgUGFuWm9vbSByZW1vdmVkICovCi0gICAgUGFyYW1zLk5iVmlkZW9GcmFtZXMgICAgICAgICAgICA9IChNNE9TQV9VSW50MzIpCi0gICAgICAgICh4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+ZHVyYXRpb24gXAotICAgICAgICAgICAgLyB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+ZnJhbWVyYXRlKTsgLyogKi8KLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3RpbWVEdXJhdGlvbiAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5mcmFtZXJhdGU7Ci0gICAgLyotUFIgTm86ICBibHJueHBzdyMyMjMqLwotICAgIHBDYWxsQmFja0N0eHQtPm1fSW1hZ2VDb3VudGVyICAgID0gMDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX0ZpbGVJbiAgICAgICAgICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPnBGaWxlSW47Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9OYkltYWdlICAgICAgICA9IFBhcmFtcy5OYlZpZGVvRnJhbWVzOwotICAgIHBDYWxsQmFja0N0eHQtPm1fcEZpbGVSZWFkUHRyICAgID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHI7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9wRGVjb2RlZFBsYW5lICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3BQdG8zR1BQcGFyYW1zICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXM7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9haXJfY29udGV4dCAgICA9IE00T1NBX05VTEw7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9tZWRpYVJlbmRlcmluZyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5NZWRpYVJlbmRlcmluZzsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyAqLwotICAgIGVyciA9IE00UFRPM0dQUF9PcGVuKHBNNFBUTzNHUFBfQ3R4dCwgJlBhcmFtcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuIHJldHVybmVkOiAweCV4XG4iLGVycik7Ci0gICAgICAgIGlmKHBDYWxsQmFja0N0eHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQ2FsbEJhY2tDdHh0KTsKLSAgICAgICAgICAgIHBDYWxsQmFja0N0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIE00UFRPM0dQUF9DbGVhblVwKHBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2FsbCBQdG8zR1BQIHN0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCA9IHBNNFBUTzNHUFBfQ3R4dDsKLSAgICB4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQgPSBwQ2FsbEJhY2tDdHh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgUHRvM0dQUAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfQ2hhciBvdXRfYW1yW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgTTRPU0FfQ2hhciogcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgUFRPM0dQUCBjYWxsYmFjayBjb250ZXh0ICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluYWxpemUgdGhlIG91dHB1dCBmaWxlICovCi0gICAgZXJyID0gTTRQVE8zR1BQX0Nsb3NlKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAoeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgdGhpcyBNNFBUTzNHUFAgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbGVhblVwIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgZHVtbXkuYW1yIGZpbGUgKi8KLSAgICBNNE9TQV9jaHJOQ29weShvdXRfYW1yLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfYW1yLCAoY29uc3QgY2hhciAqKSJkdW1teS5hbXJcMCIsIDEwKTsKLQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSB0ZW1wb3JhcnkgcGF0aCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQqLwotICAgIHBEZWNvZGVkUGF0aCA9IG91dF9hbXI7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZCopIG91dF9hbXIsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3A6XAotICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLSAgICAvKioKLSAgICAqIEVuZCBvZiB0aGUgY29udmVyc2lvbiwgbm93IHVzZSB0aGUgZGVjb2RlZCBwYXRoKi8KLSAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwRGVjb2RlZFBhdGgpOwotCi0gICAgLypDb21tZW50ZWQgYmVjYXVzZSBvZiB0aGUgdXNlIG9mIHRoZSBVVEYgY29udmVyc2lvbiovCi0vKiAgICByZW1vdmUob3V0X2Ftcik7Ci0gKi8KLQotICAgIHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBSR0I1NjUgcGxhbmUgdG8gWVVWNDIwIHBsYW5hcgotICogQG5vdGUgICAgSXQgaXMgdXNlZCBvbmx5IGZvciBmcmFtaW5nIGVmZmVjdAotICogICAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgICBmcmFtaW5nQ3R4ICAgIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCNTY1IHBsYW5lCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgb3V0cHV0IFlVViBwbGFuZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPQotICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAqZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCozKT4+MSwgTTRWUywgKE00T1NBX0NoYXIgKilcCi0gICAgICAgICAgICAgICAgIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSBcCi0gICAgICAgICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgXAotICAgICAgICArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGlucHV0IFJHQiA1NjUgdG8gWVVWIDQyMCB0byBiZSBhYmxlIHRvIG1lcmdlIGl0IHdpdGggb3V0cHV0IHZpZGVvIGluIGZyYW1pbmcKLSAgICAgIGVmZmVjdCAqLwotICAgIGVyciA9IE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjpcCi0gICAgICAgICAgICAgZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICB9Ci0KLSAgICBmcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogT25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0IChubyBhbmltYXRlZCBpbWFnZSB3aXRoIFJHQiBidWZmZXIuLi4pICovCi0gICAgZnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU2V0UGxhbmVUcmFuc3BhcmVudChNNE9TQV9VSW50OCogcGxhbmVJbiwgTTRPU0FfVUludDMyIHNpemUpCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRPU0FfVUludDgqIHBsYW5lID0gcGxhbmVJbjsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDEgPSAoTTRPU0FfVUludDgpKChUUkFOU1BBUkVOVF9DT0xPUiAmIDB4RkYwMCk+PjgpOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MiA9IChNNE9TQV9VSW50OClUUkFOU1BBUkVOVF9DT0xPUjsKLQotICAgIGZvcihpPTA7IGk8KHNpemU+PjEpOyBpKyspCi0gICAgewotICAgICAgICAqcGxhbmUrKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgKnBsYW5lKysgPSB0cmFuc3BhcmVudDI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkJHODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgT3V0cHV0VmlkZW9SZXNvbHV0aW9uKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIEFSR0I4ODg4IGlucHV0IGZpbGUgIHRvIFlVVjQyMCB3aGVudXNlZCBmb3IgZnJhbW1pbmcgZWZmZWN0Ci0gKiBAbm90ZSAgICBUaGUgaW5wdXQgQVJHQjg4ODggZmlsZSBwYXRoIGlzIGNvbnRhaW5lZCBpbiB0aGUgcEVmZmVjdCBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgSWYgdGhlIEFSR0I4ODg4IG11c3QgYmUgcmVzaXplZCB0byBmaXQgb3V0cHV0IHZpZGVvIHNpemUsIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgd2lsbCBkbyBpdC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEVmZmVjdCAgICAgICAgKElOKSBUaGUgZWZmZWN0IHN0cnVjdHVyZSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbnMgb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgdG8gZGVjb2RlLCByZXNpemluZyAuLi4KLSAqIEBwYXJhbSAgICBmcmFtaW5nQ3R4ICAgIChJTi9PVVQpIFN0cnVjdHVyZSBpbiB3aGljaCB0aGUgb3V0cHV0IFJHQiB3aWxsIGJlIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiBGaWxlIG5vdCBmb3VuZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0KE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9SZXNvbHV0aW9uKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0NvbnRleHQgcEFSR0JJbjsKLSAgICBNNE9TQV9VSW50MzIgZmlsZV9zaXplOwotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgaGVpZ2h0LCB3aWR0aF9vdXQsIGhlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVm9pZCogcEZpbGUgPSBwRWZmZWN0LT54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQxID0gKE00T1NBX1VJbnQ4KSgoVFJBTlNQQVJFTlRfQ09MT1IgJiAweEZGMDApPj44KTsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDIgPSAoTTRPU0FfVUludDgpVFJBTlNQQVJFTlRfQ09MT1I7Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqID0gMDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSByZ2JQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2I9KGZyYW1pbmdDdHgtPndpZHRoICogZnJhbWluZ0N0eC0+aGVpZ2h0ICogNCk7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgdGVtcEFscGhhUGVyY2VudCA9IDA7Ci0gICAgTTRWSUZJX1VJbnQ4KiBUZW1wUGFjRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDE2ICpwdHIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB6ID0gMDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OiBFbnRlcmluZyAiKTsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0IHdpZHRoIGFuZCBoZWlnaHQgJWQgJWQgIiwKLSAgICAgICAgZnJhbWluZ0N0eC0+d2lkdGgsZnJhbWluZ0N0eC0+aGVpZ2h0KTsKLQotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwgTTRWUywgKE00T1NBX0NoYXIqKVwKLSAgICAgICAgIkltYWdlIGFyZ2IgZGF0YSIpOwotICAgIGlmKHBUbXBEYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCB0aGUgZmlsZSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gcEZpbGU7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZCopIHBGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbERlY29kZVBORzpcCi0gICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsZXJyKTsKLSAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEVuZCBvZiB0aGUgY29udmVyc2lvbiwgbm93IHVzZSB0aGUgZGVjb2RlZCBwYXRoKi8KLQotICAgICAvKiBPcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgYW5kIHN0b3JlIGl0IGludG8gbWVtb3J5ICovCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRGVjb2RlZFBhdGgsIE00T1NBX2tGaWxlUmVhZCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlLCBlcnIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5yZWFkRGF0YShwQVJHQkluLChNNE9TQV9NZW1BZGRyOClwVG1wRGF0YSwgJmZyYW1lU2l6ZV9hcmdiKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JJbik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBjbG9zZSBpbnB1dCBwbmcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGUsIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICByZ2JQbGFuZS51X2hlaWdodCA9IGZyYW1pbmdDdHgtPmhlaWdodDsKLSAgICByZ2JQbGFuZS51X3dpZHRoID0gZnJhbWluZ0N0eC0+d2lkdGg7Ci0gICAgcmdiUGxhbmUudV9zdHJpZGUgPSByZ2JQbGFuZS51X3dpZHRoKjM7Ci0gICAgcmdiUGxhbmUudV90b3BsZWZ0ID0gMDsKLQotICAgIGZyYW1lU2l6ZSA9IChyZ2JQbGFuZS51X3dpZHRoICogcmdiUGxhbmUudV9oZWlnaHQgKiAzKTsgLy9TaXplIG9mIFJHQjg4OCBkYXRhCi0gICAgcmdiUGxhbmUucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKChmcmFtZVNpemUpKyAoMiAqIGZyYW1pbmdDdHgtPndpZHRoKSksCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCODg4IGRhdGEiKTsKLSAgICBpZihyZ2JQbGFuZS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDpcCi0gICAgICAgICAgUmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsICAiKTsKLQotICAgIC8qIHByZW11bHRpcGxpZWQgYWxwaGEgJSBvbiBSR0IgKi8KLSAgICBmb3IgKGk9MCwgaiA9IDA7IGkgPCBmcmFtZVNpemVfYXJnYjsgaSArPSA0KSB7Ci0gICAgICAgIC8qIHRoaXMgaXMgYWxwaGEgdmFsdWUgKi8KLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcEFscGhhUGVyY2VudCA9IHBUbXBEYXRhW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUiAqLwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2krMV07Ci0gICAgICAgIGorKzsKLQotICAgICAgICAvKiBHICovCi0gICAgICAgIGlmICh0ZW1wQWxwaGFQZXJjZW50ID4gMCkgewotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpKzJdOwotICAgICAgICAgICAgaisrOwotICAgICAgICB9IGVsc2Ugey8qIEluIGNhc2Ugb2YgYWxwaGEgdmFsdWUgMCwgbWFrZSBHUkVFTiB0byAyNTUgKi8KLSAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gMjU1OyAvL3BUbXBEYXRhW2krMl07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBCICovCi0gICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaSszXTsKLSAgICAgICAgaisrOwotICAgIH0KLQotICAgIGZyZWUocFRtcERhdGEpOwotICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIGNvbnZlcnQgUkdCODg4IHRvIFJHQjU2NSAqLwotCi0gICAgLyogYWxsb2NhdGUgdGVtcCBSR0IgNTY1IGJ1ZmZlciAqLwotICAgIFRlbXBQYWNEYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICg0ICogKGZyYW1pbmdDdHgtPndpZHRoICsgZnJhbWluZ0N0eC0+aGVpZ2h0ICsgMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjU2NSBkYXRhIik7Ci0gICAgaWYgKFRlbXBQYWNEYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAgUkdCNTY1IGRhdGEiKTsKLSAgICAgICAgZnJlZShyZ2JQbGFuZS5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwdHIgPSAoTTRPU0FfVUludDE2ICopVGVtcFBhY0RhdGE7Ci0gICAgeiA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaiA7IGkgKz0gMykKLSAgICB7Ci0gICAgICAgIHB0clt6KytdID0gUEFDS19SR0I1NjUoMCwgICByZ2JQbGFuZS5wYWNfZGF0YVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2krMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtpKzJdKTsKLSAgICB9Ci0KLSAgICAvKiBmcmVlIHRoZSBSQkc4ODggYW5kIGFzc2lnbiBSR0I1NjUgKi8KLSAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IFRlbXBQYWNEYXRhOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgb3V0cHV0IHNpemVzIGFyZSBvZGQgKi8KLSAgICBpZihyZ2JQbGFuZS51X2hlaWdodCAlIDIgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00VklGSV9VSW50OCogb3V0cHV0X3BhY19kYXRhID0gcmdiUGxhbmUucGFjX2RhdGE7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDpcCi0gICAgICAgICAgICAgb3V0cHV0IGhlaWdodCBpcyBvZGQgICIpOwotICAgICAgICBvdXRwdXRfcGFjX2RhdGEgKz1yZ2JQbGFuZS51X3dpZHRoICogcmdiUGxhbmUudV9oZWlnaHQqMjsKLQotICAgICAgICBmb3IoaT0wO2k8cmdiUGxhbmUudV93aWR0aDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBqdXN0IGFkZCBhIHdoaXRlIGxpbmUgdG8gdGhlIFBORyB0aGF0IHdpbGwgYmUgdHJhbnNwYXJlbnQgKi8KLSAgICAgICAgcmdiUGxhbmUudV9oZWlnaHQrKzsKLSAgICB9Ci0gICAgaWYocmdiUGxhbmUudV93aWR0aCAlIDIgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBhZGQgYSBuZXcgY29sdW1uIG9mIHdoaXRlICg9dHJhbnNwYXJlbnQpLCBidXQgd2UgbmVlZCB0byBwYXJzZSBhbGwgUkdCIGxpbmVzIC4uLiAqLwotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBuZXdSR0JwYWNfZGF0YTsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBvdXRwdXRfcGFjX2RhdGEsICppbnB1dF9wYWNfZGF0YTsKLQotICAgICAgICByZ2JQbGFuZS51X3dpZHRoKys7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OiBcCi0gICAgICAgICAgICAgb3V0cHV0IHdpZHRoIGlzIG9kZCAgIik7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IFJHQiBvdXRwdXQgYnVmZmVyIGluIHdoaWNoIGFsbCBkZWNvZGVkIGRhdGEKLSAgICAgICAgICArIHdoaXRlIGxpbmUgd2lsbCBiZSBjb3BpZWQgKi8KLSAgICAgICAgbmV3UkdCcGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocmdiUGxhbmUudV9oZWlnaHQqcmdiUGxhbmUudV93aWR0aCoyXAotICAgICAgICAgICAgKnNpemVvZihNNFZJRklfVUludDgpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJOZXcgRnJhbWluZyBHSUYgT3V0cHV0IHBhY19kYXRhIFJHQiIpOwotCi0gICAgICAgIGlmKG5ld1JHQnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIFwKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0Iik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dHB1dF9wYWNfZGF0YT0gbmV3UkdCcGFjX2RhdGE7Ci0gICAgICAgIGlucHV0X3BhY19kYXRhID0gcmdiUGxhbmUucGFjX2RhdGE7Ci0KLSAgICAgICAgZm9yKGk9MDtpPHJnYlBsYW5lLnVfaGVpZ2h0O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopb3V0cHV0X3BhY19kYXRhLCAodm9pZCAqKWlucHV0X3BhY19kYXRhLAotICAgICAgICAgICAgICAgICAocmdiUGxhbmUudV93aWR0aC0xKSoyKTsKLQotICAgICAgICAgICAgb3V0cHV0X3BhY19kYXRhICs9ICgocmdiUGxhbmUudV93aWR0aC0xKSoyKTsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcGl4ZWwgdG8gdHJhbnNwYXJlbmN5IGNvbG9yICovCi0gICAgICAgICAgICAqb3V0cHV0X3BhY19kYXRhKysgPSB0cmFuc3BhcmVudDE7Ci0gICAgICAgICAgICAqb3V0cHV0X3BhY19kYXRhKysgPSB0cmFuc3BhcmVudDI7Ci0KLSAgICAgICAgICAgIGlucHV0X3BhY19kYXRhICs9ICgocmdiUGxhbmUudV93aWR0aC0xKSoyKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBuZXdSR0JwYWNfZGF0YTsKLSAgICB9Ci0KLSAgICAvKiByZXNldCBzdHJpZGUgKi8KLSAgICByZ2JQbGFuZS51X3N0cmlkZSA9IHJnYlBsYW5lLnVfd2lkdGgqMjsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgY2hhaW5lZCBsaXN0IHBhcmFtZXRlcnMgKi8KLSAgICBmcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogT25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0IChubyBhbmltYXRlZCBpbWFnZSAuLi4pICovCi0gICAgZnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotICAgIC8qKgotICAgICAqIEdldCBvdXRwdXQgd2lkdGgvaGVpZ2h0ICovCi0gICAgIHN3aXRjaChPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi0gICAgLy9zd2l0Y2goeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplKQotICAgIHsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTI4OwotICAgICAgICBoZWlnaHRfb3V0ID0gOTY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSAxNjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAxMjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgIHdpZHRoX291dCA9IDE3NjsKLSAgICAgICAgaGVpZ2h0X291dCA9IDE0NDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgd2lkdGhfb3V0ID0gMzIwOwotICAgICAgICBoZWlnaHRfb3V0ID0gMjQwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgIHdpZHRoX291dCA9IDM1MjsKLSAgICAgICAgaGVpZ2h0X291dCA9IDI4ODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSA2NDA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDgwMDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgd2lkdGhfb3V0ID0gNzIwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNDgwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICB3aWR0aF9vdXQgPSA2NDA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAzNjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICAgICAgd2lkdGhfb3V0ID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICB3aWR0aF9vdXQgPSAxMjgwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNzIwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgICAgICB3aWR0aF9vdXQgPSBNNEVOQ09ERVJfMTA4MF83MjBfV2lkdGg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA3MjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDk2MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDcyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICB3aWR0aF9vdXQgPSAxOTIwOwotICAgICAgICBoZWlnaHRfb3V0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgIGJyZWFrOwotICAgIC8qKgotICAgICAqIElmIG91dHB1dCB2aWRlbyBzaXplIGlzIG5vdCBnaXZlbiwgd2UgdGFrZSBRQ0lGIHNpemUsCi0gICAgICogc2hvdWxkIG5vdCBoYXBwZW4sIGJlY2F1c2UgYWxyZWFkeSBkb25lIGluIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHdpZHRoX291dCA9IDE3NjsKLSAgICAgICAgaGVpZ2h0X291dCA9IDE0NDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgb3V0cHV0IHBsYW5lcyBzdHJ1Y3R1cmVzICovCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJGcmFtaW5nIE91dHB1dCBwbGFuZSBSR0IiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmVzaXplIFJHQiBpZiBuZWVkZWQgKi8KLSAgICBpZigocEVmZmVjdC0+eFZTUy5iUmVzaXplKSAmJgotICAgICAgICAgKHJnYlBsYW5lLnVfd2lkdGggIT0gd2lkdGhfb3V0IHx8IHJnYlBsYW5lLnVfaGVpZ2h0ICE9IGhlaWdodF9vdXQpKQotICAgIHsKLSAgICAgICAgd2lkdGggPSB3aWR0aF9vdXQ7Ci0gICAgICAgIGhlaWdodCA9IGhlaWdodF9vdXQ7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IFwKLSAgICAgICAgICAgICBOZXcgV2lkdGggYW5kIGhlaWdodCAlZCAlZCAgIix3aWR0aCxoZWlnaHQpOwotCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gaGVpZ2h0X291dDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9IHdpZHRoX291dDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKjI7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPQotICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCpmcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgRnJhbWluZ1JnYi0+dV93aWR0aCoyKnNpemVvZihNNFZJRklfVUludDgpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGFjX2RhdGEgUkdCIik7Ci0KLSAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gXAotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OiAgUmVzaXppbmcgTmVlZGVkICIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDpcCi0gICAgICAgICAgICAgIHJnYlBsYW5lLnVfaGVpZ2h0ICYgcmdiUGxhbmUudV93aWR0aCAlZCAlZCIscmdiUGxhbmUudV9oZWlnaHQscmdiUGxhbmUudV93aWR0aCk7Ci0KLSAgICAgICAgLy9lcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OChNNE9TQV9OVUxMLCAmcmdiUGxhbmUsZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KE00T1NBX05VTEwsICZyZ2JQbGFuZSxmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLQotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QgOlwKLSAgICAgICAgICAgICAgICB3aGVuIHJlc2l6aW5nIFJHQiBwbGFuZTogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZ2JQbGFuZS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICAgUmVzaXppbmcgTm90IE5lZWRlZCAiKTsKLQotICAgICAgICB3aWR0aCA9IHJnYlBsYW5lLnVfd2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IHJnYlBsYW5lLnVfaGVpZ2h0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9IHdpZHRoOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgqMjsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLSAgICB9Ci0KLQotICAgIGlmKHBFZmZlY3QtPnhWU1MuYlJlc2l6ZSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBGb3JjZSB0b3BsZWZ0IHRvIDAgZm9yIHB1cmUgZnJhbWluZyBlZmZlY3QgKi8KLSAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0gMDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgIFJHQiBvdXRwdXQgdG8gWVVWIDQyMCB0byBiZSBhYmxlIHRvIG1lcmdlIGl0IHdpdGggb3V0cHV0IHZpZGVvIGluIGZyYW1pbmcKLSAgICAgZWZmZWN0ICovCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkZyYW1pbmcgT3V0cHV0IHBsYW5lIFlVViIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvLyBBbGxvYyBmb3IgWSwgVSBhbmQgViBwbGFuZXMKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSAoKHdpZHRoKzEpPj4xKTw8MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gKChoZWlnaHQrMSk+PjEpPDwxOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlID0gKCh3aWR0aCsxKT4+MSk8PDE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jIGZvciB0aGUgb3V0cHV0IFkiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0Iik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCA9ICgoKGhlaWdodCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLQotCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSBvdXRwdXQgVSIpOwotICAgIGlmIChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoKCh3aWR0aCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoKChoZWlnaHQrMSk+PjEpPDwxKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0KLQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQsIE00VlMsCi0gICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jIGZvciB0aGUgIG91dHB1dCBWIik7Ci0gICAgaWYgKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgY29udmVydCBSR0IgdG8gWVVWICIpOwotCi0gICAgLy9lcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgIGVyciA9IE00VklGSV9SR0I1NjV0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0KLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiU1BTIHBuZzogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6ICBMZWF2aW5nICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBWU1MgZm9yIGVkaXRpbmcKLSAqIEBub3RlICAgIEl0IGFsc28gc2V0IHNwZWNpYWwgeFZTUyBlZmZlY3QgYXMgZXh0ZXJuYWwgZWZmZWN0cyBmb3IgdGhlIFZTUwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBWc3NDdHh0OwotICAgIE00T1NBX1VJbnQzMiBpLGo7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFZTUyAzR1BQIGVkaXRpb24gaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdEluaXQoICZwVnNzQ3R4dCwgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cik7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZTogTTRWU1MzR1BQX2VkaXRJbml0IHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KiBwVlNTQ29udGV4dCA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqKXBWc3NDdHh0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcTsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUgOwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5iQXVkaW9Nb25vID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvTGV2ZWwgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLSAgICAvKiBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgd2UgZmlsbCBkaXJlY3RseSBpbnRvIHRoZSBWU1MgY29udGV4dCB0aGUgdGFyZ2V0ZWQgYml0cmF0ZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlICE9IDApCi0gICAgewotICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCogcFZTU0NvbnRleHQgPSAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqKXBWc3NDdHh0OwotCi0gICAgICAgIHBWU1NDb250ZXh0LT5iSXNNTVMgPSBNNE9TQV9UUlVFOwotICAgICAgICBwVlNTQ29udGV4dC0+dWlNTVNWaWRlb0JpdHJhdGUgPSB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZTsKLSAgICAgICAgcFZTU0NvbnRleHQtPk1NU3ZpZGVvRnJhbWVyYXRlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgIH0KLQotICAgIC8qV2FybmluZzogc2luY2UgdGhlIGFkZGluZyBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHBTZXR0aW5ncyBoYXMgYmVlbiBjaGFuZ2VkIGluIHRoZSBuZXh0Ci0gICAgcGFydCBpbiAgcEN1cnJlbnRFZGl0U2V0dGluZ3MgKHRoZXJlIGlzIGEgc3BlY2lmaWMgY3VycmVudCBlZGl0aW5nIHN0cnVjdHVyZSBmb3IgdGhlIHNhdmluZywKLSAgICAgYXMgZm9yIHRoZSBwcmV2aWV3KSovCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGV4dGVybmFsIHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMsIGZvciBzYXZpbmcgbW9kZSAodG8gYmUgbW92ZWQgdG8KLSAgICAgIE00eFZTU19zYXZlU3RhcnQoKSA/KSovCi0gICAgZm9yIChpPTA7IGk8eFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGo9MDsgajx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5uYkVmZmVjdHM7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPT0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU7Ci0gICAgICAgICAgICAgICAgLypjb21tZW50ZWQgRkIqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQKLSAgICAgICAgICAgICAgICAgZHVyaW5nIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluayA9PQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms7IC8qKjwgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAvLyB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4gPT0KLSAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgLyoqPCB3ZSBkb24ndCB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEgPT0KLSAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE7Ci0gICAgICAgICAgICAgICAgLyoqPCB3ZSBkb24ndCB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllczsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZyYW1pbmcgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZTsKLSAgICAgICAgICAgICAgICAgLyoqPCB3ZSBkb24ndCB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZyA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmc7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBmcmFtaW5nIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW47IC8qKjwgd2UgZG9uJ3QgdXNlIGFueQotICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dCA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb207Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21PdXQ7IC8qKjwgd2UgZG9uJ3QgdXNlIGFueQotICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNiA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY7Ci0gICAgICAgICAgICAgICAgLyoqPCB3ZSBkb24ndCB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gdGhlIFZTUyAzR1BQICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXRPcGVuKHBWc3NDdHh0LCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdE9wZW4gcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBWU1MgY29udGV4dCB0byBiZSBhYmxlIHRvIGNsb3NlIC8gZnJlZSBWU1MgbGF0ZXIgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBwVnNzQ3R4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIFZTUwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENsb3NlIHRoZSBWU1MgM0dQUCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENsb3NlKHBWc3NDdHh0KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2VkaXRDbG9zZSByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgdGhpcyBWU1MzR1BQIGVkaXRpb24gaW5zdGFuY2UgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDbGVhblVwKHBWc3NDdHh0KTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgVlNTIGNvbnRleHQgdG8gTlVMTCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGU6IFwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBWU1MgZm9yIGF1ZGlvIG1peGluZwotICogQG5vdGUgICAgSXQgdGFrZXMgaXRzIHBhcmFtZXRlcnMgZnJvbSB0aGUgQkdNIHNldHRpbmdzIGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyoqKgotICogRkI6IHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBzYXZpbmcgaXMgbm93IHRoZQotICogIHBDdXJyZW50RWRpdFNldHRpbmdzIGFuZCBub3QgdGhlIHBTZXR0aW5ncwotICogVGhpcyBjaGFuZ2UgaGFzIGJlZW4gYWRkZWQgZm9yIHRoZSBVVEYgc3VwcG9ydAotICogQWxsIHRoZSAieFZTU19jb250ZXh0LT5wU2V0dGluZ3MiIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICJ4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzIgotICoqKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5nczsKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBBdWRpb01peGluZ0N0eHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLQotICAgIC8qKgotICAgICAqIEFsbG9jYXRlIGF1ZGlvIG1peGluZyBzZXR0aW5ncyBzdHJ1Y3R1cmUgYW5kIGZpbGwgaXQgd2l0aCBCR00gcGFyYW1ldGVycyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzID0gKE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKLSAgICAgICAgKHNpemVvZihNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyICopInBBdWRpb01peFNldHRpbmdzIik7Ci0gICAgaWYocEF1ZGlvTWl4U2V0dGluZ3MgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUgPT0KLSAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQKQotICAgIHsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcygoTTRPU0FfQ29udGV4dCl4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgKE00T1NBX0NoYXIqKXhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZTpcCi0gICAgICAgICAgICAgICAgIGltcG9zc2libGUgdG8gcmV0cmlldmUgYXVkaW8gQkdNIHByb3BlcnRpZXMgLT5cCi0gICAgICAgICAgICAgICAgICAgICByZWVuY29kaW5nIGF1ZGlvIGJhY2tncm91bmQgbXVzaWMiLCBlcnIpOwotICAgICAgICAgICAgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCsxOwotICAgICAgICAgICAgICAgICAgLyogVG8gZm9yY2UgQkdNIGVuY29kaW5nICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+YlJlbW92ZU9yaWdpbmFsID0gTTRPU0FfRkFMU0U7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPkFkZGVkQXVkaW9GaWxlVHlwZSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cEFkZGVkQXVkaW9UcmFja0ZpbGUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGU7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lOwotCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEFTRiA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpTnVtQ2hhbm5lbHMgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpTnVtQ2hhbm5lbHM7Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+Yl9EdWNraW5nTmVlZGVlZCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5iX0R1Y2tpbmdOZWVkZWVkOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5mQlRWb2xMZXZlbCA9Ci0gICAgIChNNE9TQV9GbG9hdCApeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+SW5EdWNraW5nX3RocmVzaG9sZCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5JbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5JbkR1Y2tpbmdfbG93Vm9sdW1lID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmxvd1ZvbHVtZS8xMDA7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPmZQVFZvbExldmVsID0KLSAgICAgKE00T1NBX0Zsb2F0KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5QVFZvbExldmVsLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+Ykxvb3AgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmJMb29wOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubykKLSAgICB7Ci0gICAgICAgIHBBdWRpb01peFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGwgYXVkaW8gbWl4IHNldHRpbmdzIHdpdGggQkdNIHBhcmFtZXRlcnMgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlCZWdpbkxvb3AgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlCZWdpbkxvb3A7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpRW5kTG9vcCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUVuZExvb3A7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkQ3RzOwotCi0gICAgLyoqCi0gICAgICogT3V0cHV0IGZpbGUgb2YgdGhlIGF1ZGlvIG1peGVyIHdpbGwgYmUgZmluYWwgZmlsZSAoYXVkaW8gbWl4aW5nIGlzIHRoZSBsYXN0IHN0ZXApICovCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnBPdXRwdXRDbGlwRmlsZSA9IHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGU7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0geFZTU19jb250ZXh0LT5wVGVtcG9yYXJ5RmlsZTsKLQotICAgIC8qKgotICAgICAqIElucHV0IGZpbGUgb2YgdGhlIGF1ZGlvIG1peGVyIGlzIGEgdGVtcG9yYXJ5IGZpbGUgY29udGFpbmluZyBhbGwgYXVkaW8vdmlkZW8gZWRpdGlvbnMgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cE9yaWdpbmFsQ2xpcEZpbGUgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLQotICAgIC8qKgotICAgICAqIFNhdmUgYXVkaW8gbWl4aW5nIHNldHRpbmdzIHBvaW50ZXIgdG8gYmUgYWJsZSB0byBmcmVlIGl0IGluCi0gICAgIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzID0gcEF1ZGlvTWl4U2V0dGluZ3M7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KCZwQXVkaW9NaXhpbmdDdHh0LCBwQXVkaW9NaXhTZXR0aW5ncywKLSAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBiZSBhYmxlIHRvIGNhbGwgYXVkaW8gbWl4aW5nIHN0ZXAgZnVuY3Rpb24gaW4KLSAgICAgIE00eFZTU19zdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhDb250ZXh0ID0gcEF1ZGlvTWl4aW5nQ3R4dDsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZTpcCi0gICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgIC8vTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcChwQXVkaW9NaXhpbmdDdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgVlNTIGZvciBhdWRpbyBtaXhpbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRoaXMgVlNTM0dQUCBhdWRpbyBtaXhpbmcgaW5zdGFuY2UgKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhDb250ZXh0KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZTpcCi0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgVlNTIGF1ZGlvIG1peGluZyBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVByZXZpZXcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgcHJldmlldyBlZGl0aW9uIHN0cnVjdHVyZSB1c2VkIHRvIGdlbmVyYXRlCi0gKiAgICAgICAgICAgIHByZXZpZXcuM2dwIGZpbGUgZ2l2ZW4gdG8gdGhlIFZQUwotICogQG5vdGUgICAgSXQgYWxzbyBmcmVlIHRoZSBwcmV2aWV3IHN0cnVjdHVyZSBnaXZlbiB0byB0aGUgVlBTCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVByZXZpZXcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgLyoqCi0gICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICBmb3IoaT0wOyBpPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgIHsKLSAgICAgICAgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIGlmKGkgIT0geFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY2xpcC90cmFuc2l0aW9uIGxpc3QgKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgb3V0cHV0IHByZXZpZXcgZmlsZSBwYXRoICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0ZW1wb3JhcnkgcHJldmlldyBmaWxlIHBhdGggKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgImxvY2FsIiBCR00gc2V0dGluZ3MgKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGN1cnJlbnQgZWRpdCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHByZXZpZXcgZWZmZWN0cyBnaXZlbiB0byBhcHBsaWNhdGlvbiAqLwotICAgIGlmKE00T1NBX05VTEwgIT0geFZTU19jb250ZXh0LT5wUHJldmlld1NldHRpbmdzLT5FZmZlY3RzKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPm5iRWZmZWN0cyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEZyZWVTYXZpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgc2F2aW5nIGVkaXRpb24gc3RydWN0dXJlIHVzZWQgdG8gZ2VuZXJhdGUKLSAqICAgICAgICAgICAgb3V0cHV0LjNncCBmaWxlIGdpdmVuIHRvIHRoZSBWUFMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgZm9yKGk9MDsgaTx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICAgICAgaWYoaSAhPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKFwKLSAgICAgICAgICAgICAgICAgICAgKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gbGlzdCAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIG91dHB1dCBzYXZpbmcgZmlsZSBwYXRoICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgdGVtcG9yYXJ5IHNhdmluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2spOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgY3VycmVudCBlZGl0IHNldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBhbiBNNFZTUzNHUFBfRWRpdFNldHRpbmdzIHN0cnVjdHVyZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgKElOKSBQb2ludGVyIG9uIE00VlNTM0dQUF9FZGl0U2V0dGluZ3Mgc3RydWN0dXJlIHRvIGZyZWUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19mcmVlU2V0dGluZ3MoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzKQotewotICAgIE00T1NBX1VJbnQ4IGksajsKLQotICAgIC8qKgotICAgICAqIEZvciBlYWNoIGNsaXAgLi4uICovCi0gICAgZm9yKGk9MDsgaTxwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIC4uLiBmcmVlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwotICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIC4uLiBmcmVlIHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgaWYoaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLTEpIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlZpZGVvVHJhbnNpdGlvblR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEluIGNhc2Ugb2YgQWxwaGEgTWFnaWMgdHJhbnNpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBleHRyYSBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgZnJlZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKCgoKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lLT5wYWNfZGF0YSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUtPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKCgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KS0+cFBsYW5lID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqPWkrMTtqPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLTE7aisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3Rbal0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3Rbal0tPlZpZGVvVHJhbnNpdGlvblR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdD0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3Rbal0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwQ21wUmVzdWx0ID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIGV4dHJhIGludGVybmFsIGFscGhhIG1hZ2ljIHN0cnVjdHVyZSBhbmQgcHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHRvIE5VTEwgdG8gYXZvaWQgcmVmcmVlaW5nIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX1NsaWRlVHJhbnNpdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBGcmVlIHRyYW5zaXRpb24gc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0pKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGNsaXAgbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+cENsaXBMaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBDbGlwTGlzdCkpOwotICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0cmFuc2l0aW9uIGxpc3QgKi8KLSAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpKTsKLSAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJDOiBGcmVlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0cyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZm9yKGk9MDsgaTxwU2V0dGluZ3MtPm5iRWZmZWN0czsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEZvciBlYWNoIGNsaXAsIGZyZWUgZnJhbWluZyBzdHJ1Y3R1cmUgaWYgbmVlZGVkICovCi0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcKLSAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1RleHQpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQqIGZyYW1pbmdDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eF9zYXZlOwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nMzEwMlN0cnVjdCogZnJhbWluZ0N0eF9maXJzdCA9IGZyYW1pbmdDdHg7Ci0jZW5kaWYKLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKSAvKiBCdWdmaXggMS4yLjA6IGNyYXNoLCB0cnlpbmcgdG8gZnJlZSBub24gZXhpc3RhbnQKLSAgICAgICAgICAgICAgICAgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1l1dlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzJdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qSW4gY2FzZSB0aGVyZSBhcmUgc3RpbGwgYWxsb2NhdGVkKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAgICBNNFNQU19kZXN0cm95KGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKkFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHggIT0gTTRPU0FfTlVMTCkgLyogQnVnZml4IDEuMi4wOiBjcmFzaCwgdHJ5aW5nIHRvIGZyZWUgbm9uCi0gICAgICAgICAgICAgICAgICAgIGV4aXN0YW50IHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHhfc2F2ZSA9IGZyYW1pbmdDdHgtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IGZyYW1pbmdDdHhfc2F2ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IGJ1ZyBmaXggUDRNRTAwMDAzMDAyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZShmcmFtaW5nQ3R4X2ZpcnN0ICE9IGZyYW1pbmdDdHgpOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRnJlZSBGaWZ0aWVzIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCogRmlmdGllc0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotCi0gICAgICAgICAgICAgICAgaWYoRmlmdGllc0N0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShGaWZ0aWVzQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgRmlmdGllc0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2ID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiA9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50PT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIENvbG9yIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QqIENvbG9yQ3R4ID0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICBpZihDb2xvckN0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShDb2xvckN0eCk7Ci0gICAgICAgICAgICAgICAgICAgIENvbG9yQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEZyZWUgc2ltcGxlIGZpZWxkcyAqLwotICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdGaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBUZXh0QnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUocFNldHRpbmdzLT5FZmZlY3RzKTsKLSAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00eFZTU19mcmVlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotLy8gICAgTTRPU0FfVUludDggaSxqOwotCi0gICAgLyogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2spOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIE00eFZTU19mcmVlU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqIHBQYXJhbXNfc2F1djsKLQotICAgICAgICB3aGlsZShwUGFyYW1zICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotI2VuZGlmLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyogcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zKiBwUGFyYW1zX3NhdXY7Ci0KLSAgICAgICAgd2hpbGUocFBhcmFtcyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZUluICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVUZW1wKTsKLSNlbmRpZi8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IHBQYXJhbXM7Ci0gICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICBmcmVlKHBQYXJhbXNfc2F1dik7Ci0gICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUmVpbml0IGFsbCBjb250ZXh0IHZhcmlhYmxlcyAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0gMDsKLSAgICB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwID0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZzsKLSAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0gTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXggPSAwOwotICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRUaW1lc2NhbGUgPSAwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHBGaWxlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlIHByb3BlcnRpZXMgb2YgYW4gaW5wdXQgM0dQIGZpbGUgdXNpbmcgTUNTCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEZpbGUgICAgICAgICAgICAoSU4pIDNHUCBmaWxlIHRvIGFuYWx5c2UKLSAqIEBwYXJhbSAgICBwRmlsZVByb3BlcnRpZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBhIHN0cnVjdHVyZSB0aGF0IHdpbGwgY29udGFpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDNHUCBmaWxlIHByb3BlcnRpZXMKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRNQ1NfQ29udGV4dCBtY3NfY29udGV4dDsKLQotICAgIGVyciA9IE00TUNTX2luaXQoJm1jc19jb250ZXh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzOiBFcnJvciBpbiBNNE1DU19pbml0OiAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKm9wZW4gdGhlIE1DUyBpbiB0aGUgIm5vcm1hbCBvcGVuaW5nIiBtb2RlIHRvIHJldHJpZXZlIHRoZSBleGFjdCBkdXJhdGlvbiovCi0gICAgZXJyID0gTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKG1jc19jb250ZXh0LCBwRmlsZSwgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAsCi0gICAgICAgIE00T1NBX05VTEwsIE00T1NBX05VTEwpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzOiBFcnJvciBpbiBNNE1DU19vcGVuOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMobWNzX2NvbnRleHQsIHBGaWxlUHJvcGVydGllcyk7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX2Fib3J0OiAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwVGFyZ2V0ZWRUaW1lU2NhbGUpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmUgdGFyZ2V0ZWQgdGltZSBzY2FsZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgICAgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwVGFyZ2V0ZWRUaW1lU2NhbGUgICAgKE9VVCkgICAgVGFyZ2V0ZWQgdGltZSBzY2FsZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFRhcmdldGVkVGltZVNjYWxlKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHRvdGFsRHVyYXRpb24gPSAwOwotICAgIE00T1NBX1VJbnQ4IGkgPSAwOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wVGltZVNjYWxlID0gMCwgdGVtcER1cmF0aW9uID0gMDsKLQotICAgIGZvcihpPTA7aTxwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjtpKyspCi0gICAgewotICAgICAgICAvKnNlYXJjaCB0aW1lc2NhbGUgb25seSBpbiBtcGVnNCBjYXNlKi8KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQCi0gICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNAotICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotCi0gICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgTTRPU0FfQ2hhciogcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19Jbml0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypFbmQgb2YgdGhlIGNvbnZlcnNpb246IHVzZSB0aGUgZGVjb2RlZCBwYXRoKi8KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIC8qZ2V0IGlucHV0IGZpbGUgcHJvcGVydGllcyovCi0gICAgICAgICAgICAvKmVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnBGaWxlLCAmZmlsZVByb3BlcnRpZXMpOyovCi0gICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGU6XAotICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZDogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih0ZW1wRHVyYXRpb24gPCAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUaW1lU2NhbGUgPSBmaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcER1cmF0aW9uID0gKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih0ZW1wRHVyYXRpb24gPCAoZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb25cCi0gICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wVGltZVNjYWxlID0gZmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEdXJhdGlvbiA9IChmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qdGhlIHRpbWVzY2FsZSBpcyAzMCBmb3IgUFRPM0dQKi8KLSAgICAgICAgICAgICpwVGFyZ2V0ZWRUaW1lU2NhbGUgPSAzMDsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih0ZW1wVGltZVNjYWxlID49IDMwKS8qRGVmaW5lIGEgbWluaW11bSB0aW1lIHNjYWxlLCBvdGhlcndpc2UgaWYgdGhlIHRpbWVzY2FsZSBpcyBub3QKLSAgICBlbm91Z2gsIHRoZXJlIHdpbGwgYmUgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgc2hlbGwgZW5jb2RlciovCi0gICAgewotICAgICAgICAqcFRhcmdldGVkVGltZVNjYWxlID0gdGVtcFRpbWVTY2FsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnBUYXJnZXRlZFRpbWVTY2FsZSA9IDMwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYXBwbHkgYSBjb2xvciBlZmZlY3Qgb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLXsKLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLSAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QqIENvbG9yQ29udGV4dCA9IChNNHhWU1NfQ29sb3JTdHJ1Y3QqKXBGdW5jdGlvbkNvbnRleHQ7Ci0KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKQotICAgIHsKLSAgICAgICAgcF9idWZfc3JjID0gJihQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hyb21pbmFuY2UgKi8KLSAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSB8fCBwbGFuZV9udW1iZXI9PTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkKLSAgICAgICAgICAgICAgICAvLyBjb21tZW50ZWQgYmVjYXVzZSBhIHN0cnVjdHVyZSBmb3IgdGhlIGVmZmVjdHMgY29udGV4dCBleGlzdAotICAgICAgICAgICAgICAgIHN3aXRjaCAoQ29sb3JDb250ZXh0LT5jb2xvckVmZmVjdFR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rOgotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW46Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDEzOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmtlZXAgeSwgYnV0IHJlcGxhY2UgdSBhbmQgdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LCAoTTRPU0FfVUludDgpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgciA9IDAsZyA9IDAsYiA9IDAseSA9IDAsdSA9IDAsdiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZpcnN0IGdldCB0aGUgciwgZywgYiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDdlMCk+PjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4ZjgwMCk+PjExOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmb3IgY29sb3IgZ3JhZGF0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKE00T1NBX1VJbnQxNikoIGIgLSAoKGIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IChNNE9TQV9VSW50MTYpKGcgLSAoKGcqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IChNNE9TQV9VSW50MTYpKHIgLSAoKHIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmtlZXAgeSwgYnV0IHJlcGxhY2UgdSBhbmQgdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTHVtaW5hbmNlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkKLSAgICAgICAgICAgICAgICAvLyBjb21tZW50ZWQgYmVjYXVzZSBhIHN0cnVjdHVyZSBmb3IgdGhlIGVmZmVjdHMgY29udGV4dCBleGlzdAotICAgICAgICAgICAgICAgIHN3aXRjaCAoQ29sb3JDb250ZXh0LT5jb2xvckVmZmVjdFR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7aisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZfZGVzdFtqXSA9IDI1NSAtIHBfYnVmX3NyY1tqXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfYnVmX3NyYyArPSBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWRkIGEgZml4ZWQgb3IgYW5pbWF0ZWQgaW1hZ2Ugb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApCi17Ci0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfaW5fWSA9IFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1UgPSBQbGFuZUluWzFdLnBhY19kYXRhOwotICAgIE00VklGSV9VSW50OCAqcF9pbl9WID0gUGxhbmVJblsyXS5wYWNfZGF0YTsKLQotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBGcmFtaW5nID0gTTRPU0FfTlVMTDsKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogY3VycmVudEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9VSW50OCAqRnJhbWluZ1JHQiA9IE00T1NBX05VTEw7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLQotICAgIE00VklGSV9VSW50MzIgdG9wbGVmdFsyXTsKLQotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9IChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0jaWZuZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKXVzZXJEYXRhOwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZy0+cEN1cnJlbnQ7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgLypGQiovCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmc7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotICAgIC8qZW5kIEZCKi8KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwX2luX1kgKz0gUGxhbmVJblswXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9VICs9IFBsYW5lSW5bMV0udV90b3BsZWZ0OwotICAgIHBfaW5fViArPSBQbGFuZUluWzJdLnVfdG9wbGVmdDsKLQotICAgIHBfb3V0MCA9IFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBfb3V0MSA9IFBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIHBfb3V0MiA9IFBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgLyoqCi0gICAgICogRGVwZW5kaW5nIG9uIHRpbWUsIGluaXRpYWxpemUgRnJhbWluZyBmcmFtZSB0byB1c2UgKi8KLSAgICBpZihGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID09IC0xKQotICAgIHsKLSAgICAgICAgRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBjdXJyZW50IGNsaXAgdGltZSBoYXMgcmVhY2ggdGhlIGR1cmF0aW9uIG9mIG9uZSBmcmFtZSBvZiB0aGUgZnJhbWluZyBwaWN0dXJlCi0gICAgICogd2UgbmVlZCB0byBzdGVwIHRvIG5leHQgZnJhbWluZyBwaWN0dXJlICovCi0KLSAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgRnJhbWluZ1JHQiA9IGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSAgICB0b3BsZWZ0WzBdID0gY3VycmVudEZyYW1pbmctPnRvcGxlZnRfeDsKLSAgICB0b3BsZWZ0WzFdID0gY3VycmVudEZyYW1pbmctPnRvcGxlZnRfeTsKLQotICAgIGZvciggeD0wIDt4IDwgUGxhbmVJblswXS51X2hlaWdodCA7IHgrKykKLSAgICB7Ci0gICAgICAgIGZvciggeT0wIDt5IDwgUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRvIGhhbmRsZSBmcmFtaW5nIHdpdGggaW5wdXQgc2l6ZSAhPSBvdXRwdXQgc2l6ZQotICAgICAgICAgICAgICogRnJhbWluZyBpcyBhcHBseWVkIGlmIGNvb3JkaW5hdGVzIG1hdGNoZXMgYmV0d2VlbiBmcmFtaW5nL3RvcGxlZnQgYW5kIGlucHV0IHBsYW5lICovCi0gICAgICAgICAgICBpZiggeSA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgICYmCi0gICAgICAgICAgICAgICAgeSA+PSB0b3BsZWZ0WzBdICYmCi0gICAgICAgICAgICAgICAgeCA8ICh0b3BsZWZ0WzFdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQpICYmCi0gICAgICAgICAgICAgICAgeCA+PSB0b3BsZWZ0WzFdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcgc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgTTRPU0FfRmxvYXQgYWxwaGFCbGVuZGluZyA9IDE7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqICBhbHBoYUJsZW5kaW5nU3RydWN0ID1cCi0gICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyopXAotICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hbHBoYUJsZW5kaW5nU3RydWN0OwotCi0gICAgICAgICAgICAgICAgaWYoYWxwaGFCbGVuZGluZ1N0cnVjdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYocFByb2dyZXNzLT51aVByb2dyZXNzIFwKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0IC8gMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MvKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgKz0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5cCi0gICAgICAgICAgICAgICAgICAgIG1fZmFkZUluVGltZSoxMCkgJiYgcFByb2dyZXNzLT51aVByb2dyZXNzIDwgMTAwMFwKLSAgICAgICAgICAgICAgICAgICAgIC0gKE00T1NBX1VJbnQzMikoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoTTRPU0FfRmxvYXQpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChNNE9TQV9GbG9hdClhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZS8xMDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IDEwMDAgLSAoTTRPU0FfVUludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQgLyAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCkpKigxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgKz0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyAvPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqLwotCi0gICAgICAgICAgICAgICAgaWYoKCooRnJhbWluZ1JHQik9PXRyYW5zcGFyZW50MSkgJiYgKCooRnJhbWluZ1JHQisxKT09dHJhbnNwYXJlbnQyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSsoeS10b3BsZWZ0WzBdKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArKHgtdG9wbGVmdFsxXSkqY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUpKSphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKSs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArKCh4LXRvcGxlZnRbMV0pPj4xKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSkpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArKCh4LXRvcGxlZnRbMV0pPj4xKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSkpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIFBsYW5lSW5bMF0udV93aWR0aCA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgICAgeSA9PSBQbGFuZUluWzBdLnVfd2lkdGgtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nUkdCICsgMiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAqICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQbGFuZUluWzBdLnVfd2lkdGggKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSnVzdCBjb3B5IGlucHV0IHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBtYWtlIGEgdmlkZW8gbG9vayBhcyBpZiBpdCB3YXMgdGFrZW4gaW4gdGhlIGZpZnRpZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhICAgICAgIChJTikgQ29udGV4dAotICogQHBhcmFtICAgIHBQbGFuZUluICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwRmlmdGllc0RhdGEsIHBQbGFuZU91dCBvciBwUHJvZ3Jlc3MgYXJlIE5VTEwgKERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApCi17Ci0gICAgTTRWSUZJX1VJbnQzMiB4LCB5LCB4U2hpZnQ7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwSW5ZID0gcFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwT3V0WSwgKnBJblliZWdpbjsKLSAgICBNNFZJRklfVUludDggKnBJbkNyLCogcE91dENyOwotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0KLSAgICAvKiBJbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCogcF9GaWZ0aWVzRGF0YSA9IChNNHhWU1NfRmlmdGllc1N0cnVjdCAqKXBVc2VyRGF0YTsKLQotICAgIC8qIENoZWNrIHRoZSBpbnB1dHMgKGRlYnVnIG9ubHkpICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwX0ZpZnRpZXNEYXRhID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJ4VlNTOiBwX0ZpZnRpZXNEYXRhIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwUGxhbmVPdXQgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInhWU1M6IHBfUGxhbmVPdXQgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBQcm9ncmVzcyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJ4VlNTOiBwX1Byb2dyZXNzIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzIik7Ci0KLSAgICAvKiBJbml0aWFsaXplIGlucHV0IC8gb3V0cHV0IHBsYW5lIHBvaW50ZXJzICovCi0gICAgcEluWSArPSBwUGxhbmVJblswXS51X3RvcGxlZnQ7Ci0gICAgcE91dFkgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcEluWWJlZ2luICA9IHBJblk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSByYW5kb20gKi8KLSAgICBpZihwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lIDwgMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX3JhbmRJbml0KCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyICopJihwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfaGVpZ2h0KSA+PiA0KTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnN0cmlwZVJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfd2lkdGgpPDwgMik7Ci0gICAgICAgIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBDaG9vc2UgcmFuZG9tIHZhbHVlcyBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGR1cmF0aW9uIG9mIGEgcGFydGlhbCBlZmZlY3QgKi8KLSAgICBlbHNlIGlmKCAocFByb2dyZXNzLT51aU91dHB1dFRpbWUgLSBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lKVwKLSAgICAgICAgID4gcF9GaWZ0aWVzRGF0YS0+ZmlmdGllc0VmZmVjdER1cmF0aW9uKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIFB1dCBpbiBTZXBpYSB0aGUgY2hyb21pbmFuY2UgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDE7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKQotICAgIHsKLSAgICAgICAgcEluQ3IgID0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSAgKyBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLSAgICAgICAgcE91dENyID0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgxID09IHBsYW5lX251bWJlcikKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDExNyxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBVIHZhbHVlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dENyLCAxMzkscFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsgLyogViB2YWx1ZSAqLwotCi0gICAgICAgICAgICBwSW5DciAgKz0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBPdXRDciArPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdGhlIG5ldyBwaXhlbHMgdmFsdWVzICovCi0gICAgZm9yKCB4ID0gMCA7IHggPCBwUGxhbmVJblswXS51X2hlaWdodCA7IHgrKykKLSAgICB7Ci0gICAgICAgIE00VklGSV9VSW50OCAqcF9vdXRZdG1wLCAqcF9pbll0bXA7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB0aGUgeFNoaWZ0IChyYW5kb20gdmFsdWUpICovCi0gICAgICAgIGlmICgwID09IChwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlICUgNSApKQotICAgICAgICAgICAgeFNoaWZ0ID0gKHggKyBwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlICkgJSAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeFNoaWZ0ID0gKHggKyAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSBwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlKSApIFwKLSAgICAgICAgICAgICAgICAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzICovCi0gICAgICAgIHBfb3V0WXRtcCA9IHBPdXRZICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB5U2hpZnQgb2YgMSBwaXhlbCAqLwotICAgICAgICBwX2luWXRtcCAgPSBwSW5ZYmVnaW4gKyAoeFNoaWZ0ICogcFBsYW5lSW5bMF0udV9zdHJpZGUpOyAgLyogQXBwbHkgdGhlIHhTaGlmdCAqLwotCi0gICAgICAgIGZvciggeSA9IDAgOyB5IDwgcFBsYW5lSW5bMF0udV93aWR0aCA7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2V0IFkgdmFsdWUgKi8KLSAgICAgICAgICAgIGlmICh4U2hpZnQgPiAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSA0KSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gNDA7ICAgICAgICAvKiBBZGQgc29tZSBob3Jpem9udGFsIGJsYWNrIGxpbmVzIGJldHdlZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIHBhcnRzIG9mIHRoZSBpbWFnZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoIHkgPT0gcF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9IDkwOyAgICAgICAgLyogQWRkIGEgcmFuZG9tIHZlcnRpY2FsIGxpbmUgZm9yIHRoZSBidWxrICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9ICpwX2luWXRtcDsKLQotCi0gICAgICAgICAgICAvKiBHbyB0byB0aGUgbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgcF9vdXRZdG1wKys7Ci0gICAgICAgICAgICBwX2luWXRtcCsrOwotCi0gICAgICAgICAgICAvKiBSZXN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgZm9yIHRoZSBsYXN0IHBpeGVsKi8KLSAgICAgICAgICAgIGlmICh5ID09IChwUGxhbmVJblswXS51X3dpZHRoIC0gMikpCi0gICAgICAgICAgICAgICAgcF9vdXRZdG1wID0gcE91dFk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBHbyB0byB0aGUgbmV4dCBsaW5lICovCi0gICAgICAgIHBPdXRZICs9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb20oICkKLSAqIEBicmllZiAgICBab29tIGluL291dCB2aWRlbyBlZmZlY3QgZnVuY3Rpb25zLgotICogQG5vdGUgICAgVGhlIGV4dGVybmFsIHZpZGVvIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgaXMgc2V0IHRvCi0gKiBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4gb3IgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dC4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICAgcElucHV0UGxhbmVzICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZSB2YWxpZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lcyAgICAgICAgKElOL09VVCkgT3V0cHV0IChmaWx0ZXJlZCkgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAgICAgKElOKSBTZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpZGVvIHRyYW5zaXRpb24gcHJvZ3Jlc3MuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pCi17Ci0gICAgTTRPU0FfVUludDMyIGJveFdpZHRoOwotICAgIE00T1NBX1VJbnQzMiBib3hIZWlnaHQ7Ci0gICAgTTRPU0FfVUludDMyIGJveFBvc1g7Ci0gICAgTTRPU0FfVUludDMyIGJveFBvc1k7Ci0gICAgTTRPU0FfVUludDMyIHJhdGlvID0gMDsKLSAgICAvKiAgKiAxLjE4OTIwNyBiZXR3ZWVuIHJhdGlvICovCi0gICAgLyogem9vbSBiZXR3ZWVuIHgxIGFuZCB4MTYgKi8KLSAgICBNNE9TQV9VSW50MzIgcmF0aW90YWJbMTddID17MTAyNCwxMjE4LDE0NDgsMTcyMiwyMDQ4LDI0MzUsMjg5NiwzNDQ0LDQwOTYsNDg3MSw1NzkzLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjg4OSw4MTkyLDk3NDIsMTE1ODUsMTM3NzcsMTYzODR9OwotICAgIE00T1NBX1VJbnQzMiBpazsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lIGJveFBsYW5lWzNdOwotCi0gICAgaWYoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dCA9PSAoTTRPU0FfVUludDMyKXBGdW5jdGlvbkNvbnRleHQpCi0gICAgewotICAgICAgICAvL3JhdGlvID0gMTYgLSAoMTUgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIHJhdGlvID0gMTYgLSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgLyA2NiA7Ci0gICAgfQotICAgIGVsc2UgaWYoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbUluID09IChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vcmF0aW8gPSAxICsgKDE1ICogcFByb2dyZXNzLT51aVByb2dyZXNzKS8xMDAwOwotICAgICAgICByYXRpbyA9IDEgKyBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgLyA2NiA7Ci0gICAgfQotCi0gICAgZm9yKGlrPTA7aWs8MztpaysrKXsKLQotICAgICAgICBib3hQbGFuZVtpa10udV9zdHJpZGUgPSBwSW5wdXRQbGFuZXNbaWtdLnVfc3RyaWRlOwotICAgICAgICBib3hQbGFuZVtpa10ucGFjX2RhdGEgPSBwSW5wdXRQbGFuZXNbaWtdLnBhY19kYXRhOwotCi0gICAgICAgIGJveEhlaWdodCA9ICggcElucHV0UGxhbmVzW2lrXS51X2hlaWdodCA8PCAxMCApIC8gcmF0aW90YWJbcmF0aW9dOwotICAgICAgICBib3hXaWR0aCA9ICggcElucHV0UGxhbmVzW2lrXS51X3dpZHRoIDw8IDEwICkgLyByYXRpb3RhYltyYXRpb107Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X2hlaWdodCA9IChib3hIZWlnaHQpJih+MSk7Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X3dpZHRoID0gKGJveFdpZHRoKSYofjEpOwotCi0gICAgICAgIGJveFBvc1kgPSAocElucHV0UGxhbmVzW2lrXS51X2hlaWdodCA+PiAxKSAtIChib3hQbGFuZVtpa10udV9oZWlnaHQgPj4gMSk7Ci0gICAgICAgIGJveFBvc1ggPSAocElucHV0UGxhbmVzW2lrXS51X3dpZHRoID4+IDEpIC0gKGJveFBsYW5lW2lrXS51X3dpZHRoID4+IDEpOwotICAgICAgICBib3hQbGFuZVtpa10udV90b3BsZWZ0ID0gYm94UG9zWSAqIGJveFBsYW5lW2lrXS51X3N0cmlkZSArIGJveFBvc1g7Ci0gICAgfQotCi0gICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgKE00VklGSV9JbWFnZVBsYW5lKikmYm94UGxhbmUsIHBPdXRwdXRQbGFuZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuICovCi0gICAgcmV0dXJuKE00Tk9fRVJST1IpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHVzZXJEYXRhICAgICAgICAoSU4pIENvbnRhaW5zIGEgcG9pbnRlciBvbiBhIHNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIFBsYW5lSW4xICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAxCi0gKiBAcGFyYW0gICAgUGxhbmVJbjIgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpVHJhbnNpdGlvbktpbmQoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWMoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpCi17Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyogYWxwaGFDb250ZXh0OwotICAgIE00VklGSV9JbnQzMiBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVzd2FwOwotICAgIE00VklGSV9VSW50MzIgeCx5OwotCi0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDA7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDI7Ci0gICAgTTRWSUZJX1VJbnQ4ICphbHBoYU1hc2s7Ci0gICAgLyogIk9sZCBpbWFnZSIgKi8KLSAgICBNNFZJRklfVUludDggKnBfaW4xX1k7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9VOwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfVjsKLSAgICAvKiAiTmV3IGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9WOwotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGFscGhhQ29udGV4dCA9IChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKil1c2VyRGF0YTsKLQotICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKiAxMjgpLzEwMDA7Ci0KLSAgICBpZiggYWxwaGFDb250ZXh0LT5pc3JldmVyc2UgIT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAxMjggLSBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgICAgIHBsYW5lc3dhcCA9IFBsYW5lSW4xOwotICAgICAgICBQbGFuZUluMSA9IFBsYW5lSW4yOwotICAgICAgICBQbGFuZUluMiA9IHBsYW5lc3dhcDsKLSAgICB9Ci0KLSAgICBwX291dDAgPSBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwX291dDEgPSBQbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICBwX291dDIgPSBQbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGFscGhhTWFzayA9IGFscGhhQ29udGV4dC0+cFBsYW5lLT5wYWNfZGF0YTsKLQotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgcF9pbjFfWSA9IFBsYW5lSW4xWzBdLnBhY19kYXRhOwotICAgIHBfaW4xX1UgPSBQbGFuZUluMVsxXS5wYWNfZGF0YTsKLSAgICBwX2luMV9WID0gUGxhbmVJbjFbMl0ucGFjX2RhdGE7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBwX2luMl9ZID0gUGxhbmVJbjJbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfVSA9IFBsYW5lSW4yWzFdLnBhY19kYXRhOwotICAgIHBfaW4yX1YgPSBQbGFuZUluMlsyXS5wYWNfZGF0YTsKLQotICAgICAvKioKLSAgICAgKiBGb3IgZWFjaCBjb2x1bW4gLi4uICovCi0gICAgZm9yKCB5PTA7IHk8UGxhbmVPdXQtPnVfaGVpZ2h0OyB5KysgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIC4uLiBhbmQgZWFjaCByb3cgb2YgdGhlIGFscGhhIG1hc2sgKi8KLSAgICAgICAgZm9yKCB4PTA7IHg8UGxhbmVPdXQtPnVfd2lkdGg7IHgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSWYgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBpeGVsIG9mIHRoZSBhbHBoYSBtYXNrIGlzID4gdG8gdGhlIGN1cnJlbnQgdGltZQotICAgICAgICAgICAgICogKCBjdXJyZW50IHRpbWUgaXMgbm9ybWFsaXplZCBvbiBbMC0yNTVdICkgKi8KLSAgICAgICAgICAgIGlmKCBhbHBoYVByb2dyZXNzTGV2ZWwgPCBhbHBoYU1hc2tbeCt5KlBsYW5lT3V0LT51X3dpZHRoXSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogV2Uga2VlcCAib2xkIGltYWdlIiBpbiBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAqKCBwX291dDAreCt5KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0qKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVSsoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVisoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzJdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSB0YWtlICJuZXcgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjJfWSt4K3kqUGxhbmVJbjJbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMl9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjJbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMl9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjJbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKGVycik7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYXBwbHkgYSBjb2xvciBlZmZlY3Qgb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICB1c2VyRGF0YSAgICAgICAgKElOKSBDb250YWlucyBhIHBvaW50ZXIgb24gYSBzZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBQbGFuZUluMSAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyIGZyb20gdmlkZW8gMQotICogQHBhcmFtICAgIFBsYW5lSW4yICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aVRyYW5zaXRpb25LaW5kKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqIGFscGhhQ29udGV4dDsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFQcm9ncmVzc0xldmVsOwotICAgIE00VklGSV9JbnQzMiBhbHBoYUJsZW5kTGV2ZWxNaW47Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhQmxlbmRMZXZlbE1heDsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFCbGVuZFJhbmdlOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBsYW5lc3dhcDsKLSAgICBNNFZJRklfVUludDMyIHgseTsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFNYXNrVmFsdWU7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLSAgICBNNFZJRklfVUludDggKmFscGhhTWFzazsKLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9WOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1Y7Ci0KLQotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBhbHBoYUNvbnRleHQgPSAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopdXNlckRhdGE7Ci0KLSAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAocFByb2dyZXNzLT51aVByb2dyZXNzICogMTI4KS8xMDAwOwotCi0gICAgaWYoIGFscGhhQ29udGV4dC0+aXNyZXZlcnNlICE9IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgYWxwaGFQcm9ncmVzc0xldmVsID0gMTI4IC0gYWxwaGFQcm9ncmVzc0xldmVsOwotICAgICAgICBwbGFuZXN3YXAgPSBQbGFuZUluMTsKLSAgICAgICAgUGxhbmVJbjEgPSBQbGFuZUluMjsKLSAgICAgICAgUGxhbmVJbjIgPSBwbGFuZXN3YXA7Ci0gICAgfQotCi0gICAgYWxwaGFCbGVuZExldmVsTWluID0gYWxwaGFQcm9ncmVzc0xldmVsLWFscGhhQ29udGV4dC0+YmxlbmRpbmd0aHJlc2hvbGQ7Ci0KLSAgICBhbHBoYUJsZW5kTGV2ZWxNYXggPSBhbHBoYVByb2dyZXNzTGV2ZWwrYWxwaGFDb250ZXh0LT5ibGVuZGluZ3RocmVzaG9sZDsKLQotICAgIGFscGhhQmxlbmRSYW5nZSA9IChhbHBoYUNvbnRleHQtPmJsZW5kaW5ndGhyZXNob2xkKSoyOwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICBhbHBoYU1hc2sgPSBhbHBoYUNvbnRleHQtPnBQbGFuZS0+cGFjX2RhdGE7Ci0KLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIHBfaW4xX1kgPSBQbGFuZUluMVswXS5wYWNfZGF0YTsKLSAgICBwX2luMV9VID0gUGxhbmVJbjFbMV0ucGFjX2RhdGE7Ci0gICAgcF9pbjFfViA9IFBsYW5lSW4xWzJdLnBhY19kYXRhOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgcF9pbjJfWSA9IFBsYW5lSW4yWzBdLnBhY19kYXRhOwotICAgIHBfaW4yX1UgPSBQbGFuZUluMlsxXS5wYWNfZGF0YTsKLSAgICBwX2luMl9WID0gUGxhbmVJbjJbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKiBhcHBseSBBbHBoYSBNYWdpYyBvbiBlYWNoIHBpeGVsICovCi0gICAgICAgZm9yKCB5PTA7IHk8UGxhbmVPdXQtPnVfaGVpZ2h0OyB5KysgKQotICAgIHsKLSAgICAgICAgZm9yKCB4PTA7IHg8UGxhbmVPdXQtPnVfd2lkdGg7IHgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFscGhhTWFza1ZhbHVlID0gYWxwaGFNYXNrW3greSpQbGFuZU91dC0+dV93aWR0aF07Ci0gICAgICAgICAgICBpZiggYWxwaGFCbGVuZExldmVsTWF4IDwgYWxwaGFNYXNrVmFsdWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIGtlZXAgIm9sZCBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMV9ZK3greSpQbGFuZUluMVswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4xX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4xX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAoYWxwaGFCbGVuZExldmVsTWluIDwgYWxwaGFNYXNrVmFsdWUpJiYKLSAgICAgICAgICAgICAgICAgICAgKGFscGhhTWFza1ZhbHVlIDw9IGFscGhhQmxlbmRMZXZlbE1heCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBibGVuZCAib2xkIGFuZCBuZXcgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPShNNFZJRklfVUludDgpCi0gICAgICAgICAgICAgICAgICAgICgoIChhbHBoYU1hc2tWYWx1ZS1hbHBoYUJsZW5kTGV2ZWxNaW4pKiggKihwX2luMV9ZK3greSpQbGFuZUluMVswXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICArKGFscGhhQmxlbmRMZXZlbE1heC1hbHBoYU1hc2tWYWx1ZSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiggKihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9KE00VklGSV9VSW50OClcCi0gICAgICAgICAgICAgICAgICAgICgoIChhbHBoYU1hc2tWYWx1ZS1hbHBoYUJsZW5kTGV2ZWxNaW4pKiggKihwX2luMV9VKyh4Pj4xKSsoeT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAqUGxhbmVJbjFbMV0udV9zdHJpZGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKSooICoocF9pbjJfVSsoeD4+MSkrKHk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGxhbmVJbjJbMV0udV9zdHJpZGUpKSApL2FscGhhQmxlbmRSYW5nZSApOwotCi0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KSgoIChhbHBoYU1hc2tWYWx1ZS1hbHBoYUJsZW5kTGV2ZWxNaW4pXAotICAgICAgICAgICAgICAgICAgICAgICAgKiggKihwX2luMV9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMl0udV9zdHJpZGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKGFscGhhQmxlbmRMZXZlbE1heC1hbHBoYU1hc2tWYWx1ZSkqKCAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMlsyXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSB0YWtlICJuZXcgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjJfWSt4K3kqUGxhbmVJbjJbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMl9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjJbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMl9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjJbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKGVycik7Ci19Ci0KLSNkZWZpbmUgTTRYWFhfU2FtcGxlQWRkcmVzcyhwbGFuZSwgeCwgeSkgICggKHBsYW5lKS5wYWNfZGF0YSArIChwbGFuZSkudV90b3BsZWZ0ICsgKHkpXAotICAgICAqIChwbGFuZSkudV9zdHJpZGUgKyAoeCkgKQotCi1zdGF0aWMgdm9pZCBNNFhYWF9Db3B5UGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUqIGRlc3QsIE00VklGSV9JbWFnZVBsYW5lKiBzb3VyY2UpCi17Ci0gICAgTTRPU0FfVUludDMyICAgIGhlaWdodCwgd2lkdGgsIHNvdXJjZVN0cmlkZSwgZGVzdFN0cmlkZSwgeTsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBzb3VyY2VXYWxrLCBkZXN0V2FsazsKLQotICAgIC8qIGNhY2hlIHRoZSB2YXJzIHVzZWQgaW4gdGhlIGxvb3Agc28gYXMgdG8gYXZvaWQgdGhlbSBiZWluZyByZXBlYXRlZGx5IGZldGNoZWQgYW5kCi0gICAgIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgaGVpZ2h0ID0gZGVzdC0+dV9oZWlnaHQ7Ci0gICAgd2lkdGggPSBkZXN0LT51X3dpZHRoOwotCi0gICAgc291cmNlV2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKCpzb3VyY2UsIDAsIDApOwotICAgIHNvdXJjZVN0cmlkZSA9IHNvdXJjZS0+dV9zdHJpZGU7Ci0KLSAgICBkZXN0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKCpkZXN0LCAwLCAwKTsKLSAgICBkZXN0U3RyaWRlID0gZGVzdC0+dV9zdHJpZGU7Ci0KLSAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrLCAodm9pZCAqKXNvdXJjZVdhbGssIHdpZHRoKTsKLSAgICAgICAgZGVzdFdhbGsgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgfQotfQotCi1zdGF0aWMgTTRPU0FfRVJSIE00eFZTU19WZXJ0aWNhbFNsaWRlVHJhbnNpdGlvbihNNFZJRklfSW1hZ2VQbGFuZSogdG9wUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogYm90dG9tUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgICAgc2hpZnRVVikKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIC8qIERvIHRocmVlIGxvb3BzLCBvbmUgZm9yIGVhY2ggcGxhbmUgdHlwZSwgaW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIHRvbyBtYW55IGJ1ZmZlcnMKLSAgICAiaG90IiBhdCB0aGUgc2FtZSB0aW1lIChiZXR0ZXIgZm9yIGNhY2hlKS4gKi8KLSAgICBmb3IgKGk9MDsgaTwzOyBpKyspCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgICAgdG9wUGFydEhlaWdodCwgYm90dG9tUGFydEhlaWdodCwgd2lkdGgsIHNvdXJjZVN0cmlkZSwgZGVzdFN0cmlkZSwgeTsKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggICAgc291cmNlV2FsaywgZGVzdFdhbGs7Ci0KLSAgICAgICAgLyogY2FjaGUgdGhlIHZhcnMgdXNlZCBpbiB0aGUgbG9vcCBzbyBhcyB0byBhdm9pZCB0aGVtIGJlaW5nIHJlcGVhdGVkbHkgZmV0Y2hlZCBhbmQKLSAgICAgICAgIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIGlmICgwID09IGkpIC8qIFkgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgYm90dG9tUGFydEhlaWdodCA9IDIqc2hpZnRVVjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIFUgYW5kIFYgcGxhbmVzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvdHRvbVBhcnRIZWlnaHQgPSBzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIHRvcFBhcnRIZWlnaHQgPSBQbGFuZU91dFtpXS51X2hlaWdodCAtIGJvdHRvbVBhcnRIZWlnaHQ7Ci0gICAgICAgIHdpZHRoID0gUGxhbmVPdXRbaV0udV93aWR0aDsKLQotICAgICAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3ModG9wUGxhbmVbaV0sIDAsIGJvdHRvbVBhcnRIZWlnaHQpOwotICAgICAgICBzb3VyY2VTdHJpZGUgPSB0b3BQbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICBkZXN0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKFBsYW5lT3V0W2ldLCAwLCAwKTsKLSAgICAgICAgZGVzdFN0cmlkZSA9IFBsYW5lT3V0W2ldLnVfc3RyaWRlOwotCi0gICAgICAgIC8qIEZpcnN0IHRoZSBwYXJ0IGZyb20gdGhlIHRvcCBzb3VyY2UgY2xpcCBmcmFtZS4gKi8KLSAgICAgICAgZm9yICh5PTA7IHk8dG9wUGFydEhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2FsaywgKHZvaWQgKilzb3VyY2VXYWxrLCB3aWR0aCk7Ci0gICAgICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhbmQgbm93IGNoYW5nZSB0aGUgdmFycyB0byBjb3B5IHRoZSBwYXJ0IGZyb20gdGhlIGJvdHRvbSBzb3VyY2UgY2xpcCBmcmFtZS4gKi8KLSAgICAgICAgc291cmNlV2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKGJvdHRvbVBsYW5lW2ldLCAwLCAwKTsKLSAgICAgICAgc291cmNlU3RyaWRlID0gYm90dG9tUGxhbmVbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogZGVzdFdhbGsgaXMgYWxyZWFkeSBhdCBNNFhYWF9TYW1wbGVBZGRyZXNzKFBsYW5lT3V0W2ldLCAwLCB0b3BQYXJ0SGVpZ2h0KSAqLwotCi0gICAgICAgIGZvciAoeT0wOyB5PGJvdHRvbVBhcnRIZWlnaHQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGssICh2b2lkICopc291cmNlV2Fsaywgd2lkdGgpOwotICAgICAgICAgICAgZGVzdFdhbGsgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgICAgIHNvdXJjZVdhbGsgKz0gc291cmNlU3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1zdGF0aWMgTTRPU0FfRVJSIE00eFZTU19Ib3Jpem9udGFsU2xpZGVUcmFuc2l0aW9uKE00VklGSV9JbWFnZVBsYW5lKiBsZWZ0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiByaWdodFBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWKQotewotICAgIE00T1NBX1VJbnQzMiBpLCB5OwotICAgIC8qIElmIHdlIHNoaWZ0ZWQgYnkgZXhhY3RseSAwLCBvciBieSB0aGUgd2lkdGggb2YgdGhlIHRhcmdldCBpbWFnZSwgdGhlbiB3ZSB3b3VsZCBnZXQgdGhlIGxlZnQKLSAgICBmcmFtZSBvciB0aGUgcmlnaHQgZnJhbWUsIHJlc3BlY3RpdmVseS4gVGhlc2UgY2FzZXMgYXJlbid0IGhhbmRsZWQgdG9vIHdlbGwgYnkgdGhlIGdlbmVyYWwKLSAgICBoYW5kbGluZywgc2luY2UgdGhleSByZXN1bHQgaW4gMC1zaXplIG1lbWNvcGllcywgc28gbWlnaHQgYXMgd2VsbCBwYXJ0aWN1bGFyaXplIHRoZW0uICovCi0KLSAgICBpZiAoMCA9PSBzaGlmdFVWKSAgICAvKiBvdXRwdXQgbGVmdCBmcmFtZSAqLwotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaTwzOyBpKyspIC8qIGZvciBlYWNoIFlVViBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNFhYWF9Db3B5UGxhbmUoJihQbGFuZU91dFtpXSksICYobGVmdFBsYW5lW2ldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoUGxhbmVPdXRbMV0udV93aWR0aCA9PSBzaGlmdFVWKSAvKiBvdXRwdXQgcmlnaHQgZnJhbWUgKi8KLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGk8MzsgaSsrKSAvKiBmb3IgZWFjaCBZVVYgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRYWFhfQ29weVBsYW5lKCYoUGxhbmVPdXRbaV0pLCAmKHJpZ2h0UGxhbmVbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotCi0gICAgLyogRG8gdGhyZWUgbG9vcHMsIG9uZSBmb3IgZWFjaCBwbGFuZSB0eXBlLCBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgYnVmZmVycwotICAgICJob3QiIGF0IHRoZSBzYW1lIHRpbWUgKGJldHRlciBmb3IgY2FjaGUpLiAqLwotICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICBoZWlnaHQsIGxlZnRQYXJ0V2lkdGgsIHJpZ2h0UGFydFdpZHRoOwotICAgICAgICBNNE9TQV9VSW50MzIgICAgbGVmdFN0cmlkZSwgICAgcmlnaHRTdHJpZGUsICAgIGRlc3RTdHJpZGU7Ci0gICAgICAgIE00T1NBX01lbUFkZHI4ICAgIGxlZnRXYWxrLCAgICByaWdodFdhbGssICAgIGRlc3RXYWxrTGVmdCwgZGVzdFdhbGtSaWdodDsKLQotICAgICAgICAvKiBjYWNoZSB0aGUgdmFycyB1c2VkIGluIHRoZSBsb29wIHNvIGFzIHRvIGF2b2lkIHRoZW0gYmVpbmcgcmVwZWF0ZWRseSBmZXRjaGVkCi0gICAgICAgIGFuZCByZWNvbXB1dGVkIGZyb20gbWVtb3J5LiAqLwotICAgICAgICBoZWlnaHQgPSBQbGFuZU91dFtpXS51X2hlaWdodDsKLQotICAgICAgICBpZiAoMCA9PSBpKSAvKiBZIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJpZ2h0UGFydFdpZHRoID0gMipzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogVSBhbmQgViBwbGFuZXMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcmlnaHRQYXJ0V2lkdGggPSBzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGxlZnRQYXJ0V2lkdGggPSBQbGFuZU91dFtpXS51X3dpZHRoIC0gcmlnaHRQYXJ0V2lkdGg7Ci0KLSAgICAgICAgbGVmdFdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyhsZWZ0UGxhbmVbaV0sIHJpZ2h0UGFydFdpZHRoLCAwKTsKLSAgICAgICAgbGVmdFN0cmlkZSA9IGxlZnRQbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICByaWdodFdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyhyaWdodFBsYW5lW2ldLCAwLCAwKTsKLSAgICAgICAgcmlnaHRTdHJpZGUgPSByaWdodFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGRlc3RXYWxrTGVmdCA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKFBsYW5lT3V0W2ldLCAwLCAwKTsKLSAgICAgICAgZGVzdFdhbGtSaWdodCA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKFBsYW5lT3V0W2ldLCBsZWZ0UGFydFdpZHRoLCAwKTsKLSAgICAgICAgZGVzdFN0cmlkZSA9IFBsYW5lT3V0W2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa0xlZnQsICh2b2lkICopbGVmdFdhbGssIGxlZnRQYXJ0V2lkdGgpOwotICAgICAgICAgICAgbGVmdFdhbGsgKz0gbGVmdFN0cmlkZTsKLQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGtSaWdodCwgKHZvaWQgKilyaWdodFdhbGssIHJpZ2h0UGFydFdpZHRoKTsKLSAgICAgICAgICAgIHJpZ2h0V2FsayArPSByaWdodFN0cmlkZTsKLQotICAgICAgICAgICAgZGVzdFdhbGtMZWZ0ICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgICAgICBkZXN0V2Fsa1JpZ2h0ICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbiggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MqIHNldHRpbmdzID0KLSAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MqKXVzZXJEYXRhOwotICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWOwotCi0gICAgTTRPU0FfVFJBQ0UxXzAoImluc2lkZSBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIik7Ci0gICAgaWYgKChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHx8IChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0xlZnRPdXRSaWdodEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pICkKLSAgICB7Ci0gICAgICAgIC8qIGhvcml6b250YWwgc2xpZGUgKi8KLSAgICAgICAgc2hpZnRVViA9ICgoUGxhbmVPdXRbMV0pLnVfd2lkdGggKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIHVwcGVyOiBzaGlmdFVWID0gJWQscHJvZ3Jlc3MgPSAlZCIsCi0gICAgICAgICAgICBzaGlmdFVWLHBQcm9ncmVzcy0+dWlQcm9ncmVzcyApOwotICAgICAgICBpZiAoTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9SaWdodE91dExlZnRJbiA9PSBzZXR0aW5ncy0+ZGlyZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQdXQgdGhlIHByZXZpb3VzIGNsaXAgZnJhbWUgcmlnaHQsIHRoZSBuZXh0IGNsaXAgZnJhbWUgbGVmdCwgYW5kIHJldmVyc2Ugc2hpZnRVVgotICAgICAgICAgICAgKHNpbmNlIGl0J3MgYSBzaGlmdCBmcm9tIHRoZSBsZWZ0IGZyYW1lKSBzbyB0aGF0IHdlIHN0YXJ0IG91dCBvbiB0aGUgcmlnaHQKLSAgICAgICAgICAgIChpLmUuIG5vdCBsZWZ0KSBmcmFtZSwgaXQKLSAgICAgICAgICAgIGJlaW5nIGZyb20gdGhlIHByZXZpb3VzIGNsaXAuICovCi0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjIsIFBsYW5lSW4xLCBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgKFBsYW5lT3V0WzFdKS51X3dpZHRoIC0gc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBMZWZ0IG91dCwgcmlnaHQgaW4qLwotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjEsIFBsYW5lSW4yLCBQbGFuZU91dCwgc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogdmVydGljYWwgc2xpZGUgKi8KLSAgICAgICAgc2hpZnRVViA9ICgoUGxhbmVPdXRbMV0pLnVfaGVpZ2h0ICogcFByb2dyZXNzLT51aVByb2dyZXNzKS8xMDAwOwotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX1NsaWRlVHJhbnNpdGlvbiBib3R0b206IHNoaWZ0VVYgPSAlZCxwcm9ncmVzcyA9ICVkIixzaGlmdFVWLAotICAgICAgICAgICAgcFByb2dyZXNzLT51aVByb2dyZXNzICk7Ci0gICAgICAgIGlmIChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1RvcE91dEJvdHRvbUluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcHJldmlvdXMgY2xpcCBmcmFtZSB0b3AsIHRoZSBuZXh0IGNsaXAgZnJhbWUgYm90dG9tLiAqLwotICAgICAgICAgICAgcmV0dXJuIE00eFZTU19WZXJ0aWNhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMSwgUGxhbmVJbjIsIFBsYW5lT3V0LCBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIEJvdHRvbSBvdXQsIHRvcCBpbiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKFBsYW5lSW4yLCBQbGFuZUluMSwgUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgKFBsYW5lT3V0WzFdKS51X2hlaWdodCAtIHNoaWZ0VVYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogTm90ZTogaXQgbWlnaHQgYmUgd29ydGh3aGlsZSB0byBkbyBzb21lIHBhcmFtZXRlciBjaGVja2luZywgc2VlIGlmIGRpbWVuc2lvbnMgbWF0Y2gsIGV0Yy4sCi0gICAgYXQgbGVhc3QgaW4gZGVidWcgbW9kZS4gKi8KLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfRmFkZUJsYWNrVHJhbnNpdGlvbihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGZhZGUgdG8gYmxhY2sgYW5kIHRoZW4gYSBmYWRlIGZyb20gYmxhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNE9TQV9JbnQzMiB0bXAgPSAwOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0KLSAgICBpZigocFByb2dyZXNzLT51aVByb2dyZXNzKSA8IDUwMCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KSAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKCgxLjAgLSAoKE00T1NBX0Zsb2F0KShwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MqMikvMTAwMCkpICogMTAyNCApOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICBlcnIgPSBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKCAoTTRWaUNvbUltYWdlUGxhbmUqKVBsYW5lSW4xLAotICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVPdXQsIHRtcCwgTTRPU0FfTlVMTCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uOiBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnNcCi0gICAgICAgICAgICAgICAgIGVycm9yIDB4JXgsIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KS4gKi8KLSAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKSggKCgoTTRPU0FfRmxvYXQpKCgocFByb2dyZXNzLT51aVByb2dyZXNzLTUwMCkqMikpLzEwMDApKSAqIDEwMjQgKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QgKi8KLSAgICAgICAgZXJyID0gTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSgoTTRWaUNvbUltYWdlUGxhbmUqKVBsYW5lSW4yLAotICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVPdXQsIHRtcCwgTTRPU0FfTlVMTCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSByZXR1cm5zIGVycm9yIDB4JXgsXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIHRoZSBjdXN0b21lciBmb3JtYXQgdG8gVVRGOAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKElOKSAgICBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBCdWZmZXJJbiAgICAgICAgKElOKSAgICBCdWZmZXIgdG8gY29udmVydAotICogQHBhcmFtICAgIHBCdWZmZXJPdXQgICAgICAgIChPVVQpICAgIENvbnZlcnRlZCBidWZmZXIKLSAqIEBwYXJhbSAgICBjb252ZXJ0ZWRTaXplICAgIChPVVQpICAgIFNpemUgb2YgdGhlIGNvbnZlcnRlZCBidWZmZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQnVmZmVyT3V0ID0gcEJ1ZmZlckluOwotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIENvbnZlcnRlZFNpemUgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplOwotCi0gICAgICAgIG1lbXNldCgodm9pZCAqKXhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLDAKLSAgICAgICAgICAgICwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgIChNNE9TQV9VSW50OCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgaWYoZXJyID09IE00eFZTU1dBUl9CVUZGRVJfT1VUX1RPT19TTUFMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjg6IHBDb252VG9VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotCi0gICAgICAgICAgICAvKmZyZWUgdG9vIHNtYWxsIGJ1ZmZlciovCi0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIC8qcmUtYWxsb2NhdGUgdGhlIGJ1ZmZlciovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAgICA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoQ29udmVydGVkU2l6ZSpzaXplb2YoTTRPU0FfVUludDgpLCBNNFZBLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7Ci0gICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gQ29udmVydGVkU2l6ZTsKLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLDAsKE00T1NBX1VJbnQzMil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0KChNNE9TQV9Wb2lkKilwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKXhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qZGVjb2RlZCBwYXRoKi8KLSAgICAgICAgcEJ1ZmZlck91dCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAoKmNvbnZlcnRlZFNpemUpID0gQ29udmVydGVkU2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnQgZnJvbSBVVEY4IHRvIHRoZSBjdXN0b21lciBmb3JtYXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBCdWZmZXJJbiAgICAgICAgKElOKSAgICBCdWZmZXIgdG8gY29udmVydAotICogQHBhcmFtICAgIHBCdWZmZXJPdXQgICAgICAgIChPVVQpICAgIENvbnZlcnRlZCBidWZmZXIKLSAqIEBwYXJhbSAgICBjb252ZXJ0ZWRTaXplICAgIChPVVQpICAgIFNpemUgb2YgdGhlIGNvbnZlcnRlZCBidWZmZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQnVmZmVyT3V0ID0gcEJ1ZmZlckluOwotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemU7Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplKTsKLQotICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3RcCi0gICAgICAgICAgICAoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwoTTRPU0FfVUludDgqKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgKE00T1NBX1VJbnQzMiopJkNvbnZlcnRlZFNpemUpOwotICAgICAgICBpZihlcnIgPT0gTTR4VlNTV0FSX0JVRkZFUl9PVVRfVE9PX1NNQUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotCi0gICAgICAgICAgICAvKmZyZWUgdG9vIHNtYWxsIGJ1ZmZlciovCi0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIC8qcmUtYWxsb2NhdGUgdGhlIGJ1ZmZlciovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAgICA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhDb252ZXJ0ZWRTaXplKnNpemVvZihNNE9TQV9VSW50OCksIE00VkEsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IFVURiBjb252ZXJzaW9uIGJ1ZmZlciIpOwotICAgICAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gQ29udmVydGVkU2l6ZTsKLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLDAsKE00T1NBX1VJbnQzMil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGODogcENvbnZGcm9tVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypkZWNvZGVkIHBhdGgqLwotICAgICAgICBwQnVmZmVyT3V0ID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICgqY29udmVydGVkU2l6ZSkgPSBDb252ZXJ0ZWRTaXplOwotICAgIH0KLQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExMjljM2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclJlc2FtcGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBWaWRlb0VkaXRvclJlc2FtcGxlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLQotICAgIHB1YmxpYzoKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwotCi0gICAgZW51bSB7IC8vU2FtcGxpbmcgZnJlcQotICAgICBrRnJlcTgwMDBIeiA9IDgwMDAsCi0gICAgIGtGcmVxMTEwMjVIeiA9IDExMDI1LAotICAgICBrRnJlcTEyMDAwSHogPSAxMjAwMCwKLSAgICAga0ZyZXExNjAwMEh6ID0gMTYwMDAsCi0gICAgIGtGcmVxMjIwNTBIeiA9IDIyMDUwLAotICAgICBrRnJlcTI0MDAwSHogPSAyNDAwMCwKLSAgICAga0ZyZXEzMjAwMEh6ID0gMzIwMDAsCi0gICAgIGtGcmVxNDQxMDAgPSA0NDEwMCwKLSAgICAga0ZyZXE0ODAwMCA9IDQ4MDAwLAotICAgIH07Ci0KLSAgICBBdWRpb1Jlc2FtcGxlciAqbVJlc2FtcGxlcjsKLSAgICBpbnQxNl90KiBtSW5wdXQ7Ci0gICAgaW50IG5iQ2hhbm5lbHM7Ci0gICAgaW50IG5iU2FtcGxlczsKLSAgICBNNE9TQV9JbnQzMiBvdXRTYW1wbGluZ1JhdGU7Ci0gICAgTTRPU0FfSW50MzIgaW5TYW1wbGluZ1JhdGU7Ci0KLSAgICBpbnQxNl90ICptVG1wSW5CdWZmZXI7Ci19OwotCi0jZGVmaW5lIE1BWF9TQU1QTEVEVVJBVElPTl9GT1JfQ09OVkVSVElPTiA0MCAvL21zCi0KLXN0YXR1c190IFZpZGVvRWRpdG9yUmVzYW1wbGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwgaW50NjRfdCBwdHMpIHsKLQotICAgIHVpbnQzMl90IGRhdGFTaXplID0gcEJ1ZmZlci0+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+cEZjdFN0ZXAgICAgICAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXA7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RHZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb247Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnBFbmNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLWV4dGVybiAiQyIgewotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FBQygKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00RU5DT0RFUl9rQUFDLCBwRm9ybWF0LCBwRW5jb2RlckludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00RU5DT0RFUl9rQU1STkIsIHBGb3JtYXQsIHBFbmNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QMyBubyBlcnJvciIpOwotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tNUDMsIHBGb3JtYXQsIHBFbmNvZGVySW50ZXJmYWNlKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGNmYTdjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JCdWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQnVmZmVyLmMKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBCdWZmZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jdW5kZWYgTTRPU0FfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgTTRPU0FfVFJBQ0VfTEVWRUwgMQotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JCdWZmZXIuaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2RlZmluZSBWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRSA0MAotCi0jZGVmaW5lIFZJREVPRURJVE9SX1NBRkVfRlJFRShwKSBcCi17IFwKLSAgICBpZihNNE9TQV9OVUxMICE9IHApIFwKLSAgICB7IFwKLSAgICAgICAgZnJlZShwKTsgXAotICAgICAgICBwID0gTTRPU0FfTlVMTDsgXAotICAgIH0gXAotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCoqIHBwb29sLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuYkJ1ZmZlcnMpCi0gKiBAYnJpZWYgICBBbGxvY2F0ZSBhIHBvb2wgb2YgbmJCdWZmZXJzIGJ1ZmZlcnMKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGNyZWF0ZQotICogQHBhcmFtICAgbmJCdWZmZXJzICA6IElOIFRoZSBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcG9vbAotICogQHBhcmFtICAgcG9vbE5hbWUgICA6IElOIGEgbmFtZSBnaXZlbiB0byB0aGUgcG9vbAotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gICAgICAgIE00T1NBX1VJbnQzMiBuYkJ1ZmZlcnMsIE00T1NBX0NoYXIqIHBvb2xOYW1lKQotewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcG9vbDsKLSAgICBNNE9TQV9VSW50MzIgaW5kZXg7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IHBwb29sID0gMHgleCBuYkJ1ZmZlcnMgPSAlZCAiLAotICAgICAgICBwcG9vbCwgbmJCdWZmZXJzKTsKLQotICAgIHBvb2wgPSBNNE9TQV9OVUxMOwotICAgIHBvb2wgPSAoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIHNpemVvZihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCksIFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2w6IHBvb2wiKSk7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcG9vbCkKLSAgICB7Ci0gICAgICAgIGxlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBbGxvY2F0aW5nIFBvb2wgYnVmZmVycyIpOwotICAgIHBvb2wtPnBOWFBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBvb2wtPnBOWFBCdWZmZXIgPSAoVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKSpuYkJ1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIkJVRkZFUl9hbGxvY2F0ZVBvb2w6IHBOWFBCdWZmZXIiKSk7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBwb29sLT5wTlhQQnVmZmVyKQotICAgIHsKLSAgICAgICAgbGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2xfQ2xlYW51cDsKLSAgICB9Ci0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuYkJ1ZmZlcnM7IGluZGV4KyspCi0gICAgewotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBbGxvY2F0aW5nIFBvb2wgbmFtZSBidWZmZXIiKTsKLSAgICBwb29sLT5wb29sTmFtZSA9IE00T1NBX05VTEw7Ci0gICAgcG9vbC0+cG9vbE5hbWUgPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRSxWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCi0gICAgICAgIChNNE9TQV9DaGFyKikoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2w6IHBvb2xuYW1lIikpOwotICAgIGlmKHBvb2wtPnBvb2xOYW1lID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBsZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOwotICAgIH0KLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIDogQXNzaWduaW5nIFBvb2wgbmFtZSBidWZmZXIiKTsKLQotICAgIG1lbXNldCgodm9pZCAqKXBvb2wtPnBvb2xOYW1lLCAwLFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFKTsKLSAgICBtZW1jcHkoKHZvaWQgKilwb29sLT5wb29sTmFtZSwgKHZvaWQgKilwb29sTmFtZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUtMSk7Ci0KLSAgICBwb29sLT5OQiA9IG5iQnVmZmVyczsKLQotVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOgotICAgIGlmKE00Tk9fRVJST1IgIT0gbGVycikKLSAgICB7Ci0gICAgICAgIFZJREVPRURJVE9SX1NBRkVfRlJFRShwb29sLT5wTlhQQnVmZmVyKTsKLSAgICAgICAgVklERU9FRElUT1JfU0FGRV9GUkVFKHBvb2wtPnBvb2xOYW1lKTsKLSAgICAgICAgVklERU9FRElUT1JfU0FGRV9GUkVFKHBvb2wpOwotICAgIH0KLSAgICAqcHBvb2wgPSBwb29sOwotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIEVORCIpOwotCi0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sKQotICogQGJyaWVmICAgRGVhbGxvY2F0ZSBhIGJ1ZmZlciBwb29sCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbCB0byBmcmVlCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgIGogPSAwOwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbCA6IHBwb29sID0gMHgleCIsIHBwb29sKTsKLQotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgcHBvb2wtPk5COyBqKyspCi0gICAgewotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhKTsKLSAgICAgICAgICAgIHBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBwb29sICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBTQUZFX0ZSRUUocHBvb2wtPnBOWFBCdWZmZXIpOwotICAgICAgICBTQUZFX0ZSRUUocHBvb2wtPnBvb2xOYW1lKTsKLSAgICAgICAgU0FGRV9GUkVFKHBwb29sKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICogICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcikKLSAqIEBicmllZiAgIFJldHVybnMgYSBidWZmZXIgaW4gYSBnaXZlbiBzdGF0ZQotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wKLSAqIEBwYXJhbSAgIGRlc2lyZWRTdGF0ZSA6IElOIFRoZSBidWZmZXIgc3RhdGUKLSAqIEBwYXJhbSAgIHBOWFBCdWZmZXIgOiBJTiBUaGUgc2VsZWN0ZWQgYnVmZmVyCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgZGVzaXJlZFN0YXRlLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcikKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9Cb29sIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX1VJbnQzMiBpLCBpYnVmOwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIgZnJvbSAlcyBpbiBzdGF0ZT0lZCIsCi0gICAgICAgIHBwb29sLT5wb29sTmFtZSwgZGVzaXJlZFN0YXRlKTsKLQotICAgIGlidWYgPSAwOwotCi0gICAgZm9yIChpPTA7IGkgPCBwcG9vbC0+TkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGJGb3VuZCA9IChwcG9vbC0+cE5YUEJ1ZmZlcltpXS5zdGF0ZSA9PSBkZXNpcmVkU3RhdGUpOwotICAgICAgICBpZiAoYkZvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBpYnVmID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIWJGb3VuZCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyIE5vIGJ1ZmZlciBhdmFpbGFibGUgaW4gc3RhdGUgJWQiLAotICAgICAgICAgICAgZGVzaXJlZFN0YXRlKTsKLSAgICAgICAgKnBOWFBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfTk9fQlVGRkVSX0FWQUlMQUJMRTsKLSAgICB9Ci0KLSAgICAvKiBjYXNlIHdoZXJlIGEgYnVmZmVyIGhhcyBiZWVuIGZvdW5kICovCi0gICAgKnBOWFBCdWZmZXIgPSAmKHBwb29sLT5wTlhQQnVmZmVyW2lidWZdKTsKLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyOiBpZHggPSAlZCIsIGlidWYpOwotCi0gICAgcmV0dXJuKGVycik7Ci19Ci0KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfaW5pdFBvb2xCdWZmZXJzKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwb29sLAotICAgIE00T1NBX1VJbnQzMiBsU2l6ZSkKLXsKLSAgICBNNE9TQV9FUlIgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyICBpbmRleCwgajsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBwb29sICovCi0gICAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCBwb29sLT5OQjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEgPSAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgbFNpemUsIFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIkJVRkZFUl9pbml0UG9vbEJ1ZmZlcnM6IEJ1ZmZlciBkYXRhIikpOwotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5kZXg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpOwotICAgICAgICAgICAgICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uc2l6ZSA9IDA7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnN0YXRlID0gVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eTsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uaWR4ID0gaW5kZXg7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLmJ1ZmZDVFMgPSAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRPbGRlc3RCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wgKnBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotewotICAgIE00T1NBX0VSUiAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgIGluZGV4LCBqOwotICAgIE00X01lZGlhVGltZSAgY2FuZGlkYXRlVGltZVN0YW1wID0gKE00X01lZGlhVGltZSkweDdmZmZmZmY7Ci0gICAgTTRPU0FfQm9vbCAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgICpwTlhQQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBmb3IoaW5kZXggPSAwOyBpbmRleDwgcG9vbC0+TkI7IGluZGV4KyspCi0gICAgewotICAgICAgICBpZihwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5zdGF0ZSA9PSBkZXNpcmVkU3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLmJ1ZmZDVFMgPD0gY2FuZGlkYXRlVGltZVN0YW1wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJGb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlVGltZVN0YW1wID0gcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUzsKLSAgICAgICAgICAgICAgICAgICAgKnBOWFBCdWZmZXIgPSAmKHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZihNNE9TQV9GQUxTRSA9PSBiRm91bmQpCi0gICAgewotICAgICAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlciBXQVJOSU5HIG5vIGJ1ZmZlciBhdmFpbGFibGUiKTsKLSAgICAgICAgZXJyID0gTTRFUlJfTk9fQlVGRkVSX0FWQUlMQUJMRTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmNTNjNTQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBNUDMgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfTVAzUkVBREVSIgotCi0vKioKLSAqIEhFQURFUlMKLSAqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvck1wM1JlYWRlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLQotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotLyoqCi0gKiBTT1VSQ0UgQ0xBU1MKLSAqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZXh0IG9mIHRoZSBTRiBNUDMgcmVhZGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzcDxEYXRhU291cmNlPiAgICAgICAgICAgICAgbURhdGFTb3VyY2U7Ci0gICAgc3A8TWVkaWFFeHRyYWN0b3I+ICAgICAgICAgIG1FeHRyYWN0b3I7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgIG1NZWRpYVNvdXJjZTsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbUF1ZGlvQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1NYXhEdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbVN0cmVhbU51bWJlcjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbVNlZWtpbmc7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1TZWVrVGltZTsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUV4dHJhY3RvckZsYWdzOwotfSBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBNUDMgcmVhZGVyCi0gKiBAbm90ZSAgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgdmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlIGJlZ2luIik7Ci0KLSAgICAvKiBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbiAqLwotICAgIFNBRkVfTUFMTE9DKHBSZWFkZXJDb250ZXh0LCBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXIiKTsKLQotICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyICA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uID0gMDsKLSAgICAqcENvbnRleHQgPSBwUmVhZGVyQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgTVAzIHJlYWRlcgotICogQG5vdGUgICAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgVGhlIGlucHV0IHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95KE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJlYWRlckNvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLQotICAgIFNBRkVfRlJFRShwUmVhZGVyQ29udGV4dCk7Ci1jbGVhblVwOgotICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgTVAzIGZpbGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgdG8gb3BlbgotCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSAgIHRoZSBtZWRpYSBpcyBEUk0gcHJvdGVjdGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGJlZ2luIik7Ci0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW46IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW46IGludmFsaWQgcG9pbnRlciBwRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIERhdGFzb3VyY2Ugc3RhcnQgJXMiLAotICAgICAgICAoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSAoKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBlbmQiKTsKLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBEYXRhc291cmNlIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGV4dHJhY3RvciBzdGFydCIpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZSgKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGV4dHJhY3RvciBlbmQiKTsKLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3RvciA9PSBOVUxMKSAgICB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGV4dHJhY3RvciBlcnJvciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgPSAwOwotCi0gICAgaW50MzJfdCBpc0RSTVByb3RlY3RlZCA9IDA7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKLSAgICBtZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmaXNEUk1Qcm90ZWN0ZWQpOwotICAgIGlmIChpc0RSTVByb3RlY3RlZCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlcnJvciAtIERSTSBQcm90ZWN0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIE1QMyByZWFkZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlIGJlZ2luIik7Ci0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmVhZGVyQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5cCi0gICAgICAgICAgICAgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMuXAotICAgICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBmcmVlKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1LmRhdGFBZGRyZXNzID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0b3AoKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLmNsZWFyKCk7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3IuY2xlYXIoKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChPVVQpICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRPcHRpb24gYmVnaW46IG9wdGlvbklkPSAlZCAiLChpbnQpb3B0aW9uSWQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKSB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJNcDNSZWFkZXIgZHVyYXRpb249JWxkIixwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uKTsKLSAgICAgICAgICAgICooTTRPU0FfVGltZSopcFZhbHVlID0gcFJlYWRlckNvbnRleHQtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgICpwQml0cmF0ZSA9IHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZzoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZzoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbjogIE00RVJSX0JBRF9PUFRJT05fSUQiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGFuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTikgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgYmVnaW46IG9wdGlvbklkOiAlZCBWYWx1ZTogJWQgIiwKLSAgICAgICAgKGludClvcHRpb25JZCwoaW50KXBWYWx1ZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0cjoKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBqdW1wIGludG8gdGhlIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAoSU4pICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIoSU4pICAgc3RyZWFtIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAoSS9PKUlOOnRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHRoZSB0aW1lIHRvIHdoaWNoIHRoZSBzdHJlYW0gcmVhbGx5IGp1bXBlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNE9TQV9JbnQzMiogcFRpbWUpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE00T1NBX1RpbWUgdGltZTY0ID0gKE00T1NBX1RpbWUpKnBUaW1lOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgYmVnaW4iKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZWFkZXJDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFRpbWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICBpZihwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcil7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wIHRpbWUgbXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgIHRpbWU2NCA9IHRpbWU2NCAqIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWNybyBzZWMgKi8KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCB0aW1lIHVzICVsZCAiLCB0aW1lNjQpOwotCi0gICAgcFJlYWRlckNvbnRleHQtPm1TZWVraW5nID0gTTRPU0FfVFJVRTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtUaW1lID0gdGltZTY0OwotCi0gICAgdGltZTY0ID0gdGltZTY0IC8gMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pbGxpIHNlYyAqLwotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYSBmaWxlCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWVkaWFGYW1pbHk6ICAgKE9VVCkgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgZmFtaWx5IG9mIHRoZSBmb3VuZCBzdHJlYW0KLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKE9VVCkgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYW5kIGZpbGxlZCB3aXRoIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXJQYXJhbSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlcjsKLSAgICBNNE9TQV9VSW50OCB0eXBlLCB0ZW1wOwotICAgIE00T1NBX0Jvb2wgaGF2ZUF1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBOVUxMOwotICAgIGludDY0X3QgRHVyYXRpb247Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBiZWdpbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFGYW1pbHkgPT0gMCksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFGYW1pbHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyUGFyYW0gPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBzdHJlYW0gbnVtYmVyID0gJWQiLAotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlcik7Ci0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyID49IDEpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbWF4IG51bWJlciBvZiBzdHJlYW0gcmVhY2hlZCIpOwotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgfQotICAgIHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyID0gcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgKyAxOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIG51bWJlciBvZiBUcmFja3MlZCIsCi0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpKTsKLSAgICBmb3IgKHRlbXAgPSAwOyB0ZW1wIDwgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7IHRlbXArKykgewotICAgICAgICBtZXRhID0gcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodGVtcCk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIWhhdmVBdWRpbyAmJiAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlID0KLSAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Z2V0VHJhY2sodGVtcCk7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLT5zdGFydCgpOwotICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXZlQXVkaW8pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFoYXZlQXVkaW8pIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbm8gbW9yZSBzdHJlYW0gIik7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3JGbGFncyA9IHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5mbGFncygpOwotICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbzsKLQotICAgIHN0cmVhbURlc2MuZHVyYXRpb24gPSBtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmRHVyYXRpb24pOwotICAgIHN0cmVhbURlc2MuZHVyYXRpb24gPSAoTTRPU0FfVGltZSlEdXJhdGlvbi8xMDAwOwotCi0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdCopJnN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgKGludDMyX3QqKSZzdHJlYW1EZXNjLnRpbWVTY2FsZSk7Ci0gICAgQUxPR1YoIkJpdHJhdGUgPSAlZCwgU2FtcGxlUmF0ZSA9ICVkIGR1cmF0aW9uID0gJWxsZCIsCi0gICAgICAgIHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUsc3RyZWFtRGVzYy50aW1lU2NhbGUsRHVyYXRpb24vMTAwMCk7Ci0KLSAgICBzdHJlYW1EZXNjLnN0cmVhbVR5cGUgPSBNNFNZU19rTVAzOwotICAgIHN0cmVhbURlc2MucHJvZmlsZUxldmVsID0gMHhGRiA7Ci0gICAgc3RyZWFtRGVzYy5zdHJlYW1JRCA9IHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyOwotICAgIHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgc3RyZWFtRGVzYy5tYXhCaXRyYXRlID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLQotICAgIC8qICAgIEFsbG9jYXRlIHRoZSBhdWRpbyBzdHJlYW0gaGFuZGxlciBhbmQgc2V0IGl0cyBwYXJhbWV0ZXJzICAgICovCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksIE00UkVBREVSX01QMywKLSAgICAgICAgKE00T1NBX0NoYXIqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIGlmIChwQXVkaW9TdHJlYW1IYW5kbGVyID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbWFsbG9jIGZhaWxlZCIpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwU3RyZWFtSGFuZGxlciA9KE00X1N0cmVhbUhhbmRsZXIqKShwQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAqcFN0cmVhbUhhbmRsZXJQYXJhbSA9IHBTdHJlYW1IYW5kbGVyOwotICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyID0gcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtZXRhIGlzIE5VTEwiKTsKLSAgICB9Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gc3RyZWFtRGVzYy50aW1lU2NhbGU7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAoTTRPU0FfVUludDgqKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLQotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICAoaW50MzJfdCopJnBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyk7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxMTUyOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgPSAyOwotCi0gICAgcFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhID0gTlVMTDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCA9IHN0cmVhbURlc2Muc3RyZWFtSUQ7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24gPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24gPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2F2ZXJhZ2VCaXRSYXRlID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSA9IDA7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBmaWxsIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUgd2l0aCBpbml0aWFsaXphdGlvbiB2YWx1ZXMKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvIHdoaWNoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY2Nlc3MgdW5pdCB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGVyKSB0byBpbml0aWFsaXplCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICpwQXU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZWFkZXJDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3Qgc3RhcnQgIik7Ci0gICAgaWYocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBSZWFkZXJDb250ZXh0LT5cCi0gICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXIpewotICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHBBdSBzdHJ1Y3R1cmUgKi8KLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQXUtPnNpemUgICAgICAgID0gMDsKLSAgICBwQXUtPkNUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPkRUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIC8qIEluaXRpYWxpemUgcEFjY2Vzc1VuaXQgc3RydWN0dXJlICovCi0gICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9DVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0IGVuZCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgaS5lIHNlZWsgaXQgdG8gdGhlIGJlZ2lubmluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgY29udGV4dDogICAgICAgICAgKElOKSAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NCA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQgc3RhcnQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZWFkZXJDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBSZWFkZXJDb250ZXh0LT5cCi0gICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgcEF1ID0gJnBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgcFJlYWRlckNvbnRleHQtPm1TZWVraW5nID0gTTRPU0FfVFJVRTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtUaW1lID0gdGltZTY0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXRzIGFuIGFjY2VzcyB1bml0IChBVSkgZnJvbSB0aGUgc3RyZWFtIGhhbmRsZXIgc291cmNlLgotICogQG5vdGUgICAgQVUgaXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBkYXRhIHRvIGJlIGRlY29kZWQgYnkgZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlciAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQgICAgKEkvTylQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyAgIE00RVJSX0FMTE9DICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybnMgICBNNFdBUl9OT19NT1JFX0FVICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNZWRpYUJ1ZmZlciAqbUF1ZGlvQnVmZmVyOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBzdGFydCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU6IFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocFJlYWRlckNvbnRleHQtPm1TZWVraW5nKSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHBSZWFkZXJDb250ZXh0LT5tU2Vla1RpbWUpOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnJlYWQoJm1BdWRpb0J1ZmZlciwgJm9wdGlvbnMpOwotCi0gICAgaWYgKG1BdWRpb0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB8fAotICAgICAgICAgICAgKHBBdS0+c2l6ZSA8IG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKSB7Ci0gICAgICAgICAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZSgoTTRPU0FfSW50MzIqKXBBdS0+ZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQzMiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIChtQXVkaW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMykgJiB+MHgzLAotICAgICAgICAgICAgICAgIE00UkVBREVSX01QMywgKE00T1NBX0NoYXIqKSJwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyIgKTsKLQotICAgICAgICAgICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgbWFsbG9jIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5zaXplID0gbUF1ZGlvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiltQXVkaW9CdWZmZXItPmRhdGEoKSArIG1BdWRpb0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICBtQXVkaW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICBtQXVkaW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsIChpbnQ2NF90KikmcEF1LT5DVFMpOwotCi0KLSAgICAgICAgcEF1LT5DVFMgPSBwQXUtPkNUUyAvIDEwMDA7IC8qY29udmVydGluZyB0aGUgbWljcm9zZWMgdG8gbWlsbGlzZWMgKi8KLSAgICAgICAgcEF1LT5EVFMgID0gcEF1LT5DVFM7Ci0gICAgICAgIHBBdS0+YXR0cmlidXRlID0gTTRTWVNfa0ZyYWdBdHRyT2s7Ci0gICAgICAgIG1BdWRpb0J1ZmZlci0+cmVsZWFzZSgpOwotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgQVUgQ1RTID0gJWxkIixwQXUtPkNUUyk7Ci0KLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50OCopIHBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSBwQXUtPnNpemU7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0NUUyA9IHBBdS0+Q1RTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgPSBwQXUtPkRUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gcEF1LT5hdHRyaWJ1dGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBFT1MgcmVhY2hlZC4iKTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZT0wOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0KLSAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgbUF1ZGlvQnVmZmVyID0gTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IGVuZCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlOiBiZWdpbiIpOwotICAgIC8qIElucHV0IHBhcmFtZXRlcnMgY2hlY2sgKi8KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBNZWRpYVR5cGUsICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJHbG9iYWxJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmRyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwUmRyR2xvYmFsSW50ZXJmYWNlLCBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UiKTsKLSAgICBTQUZFX01BTExPQygqcFJkckRhdGFJbnRlcmZhY2UsIE00UkVBREVSX0RhdGFJbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UiKTsKLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZU1QMzsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtID0KLSAgICAgICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RGaWxsQXVTdHJ1Y3QgPQotICAgICAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdG9wICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEp1bXAgICAgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0UmVzZXQgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OwotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgICAgICA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZTogZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLX0gIC8qIGV4dGVybiAiQyIgKi8KLX0gIC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVXRpbHMuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclV0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE3MjM3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclV0aWxzLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIFV0aWxpdGllcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlNGX3V0aWxzIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KLS8qIEFuZHJvaWQgaW5jbHVkZXMqLwotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lbW9yeS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgREVCVUcgTEVWRUwgU0VUVVAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIExPRzEgQUxPR0UgICAgLypFUlJPUlMgTG9nZ2luZyovCi0jZGVmaW5lIExPRzIgQUxPR0kgICAgLypXQVJOSU5HIExvZ2dpbmcqLwotI2RlZmluZSBMT0czIC8vQUxPR1YgIC8qQ09NTUVOVFMgTG9nZ2luZyovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdm9pZCBkaXNwbGF5TWV0YURhdGEoY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEpIHsKLQotICAgIGNvbnN0IGNoYXIqIGNoYXJEYXRhOwotICAgIGludDMyX3QgaW50MzJEYXRhOwotICAgIGludDY0X3QgaW50NjREYXRhOwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCogZGF0YTsKLSAgICB2b2lkKiBwdHI7Ci0gICAgc2l6ZV90IHNpemU7Ci0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5TUlNRVR5cGUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVdpZHRoICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUhlaWdodCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlJRnJhbWVzSW50ZXJ2YWwgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5U3RyaWRlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5U2xpY2VIZWlnaHQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q2hhbm5lbENvdW50ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTYW1wbGVSYXRlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlCaXRSYXRlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUVTRFMgdHlwZT0lZCBzaXplPSVkIiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBVkNDIGRhdGE9MHglWCB0eXBlPSVkIHNpemU9JWQiLAotICAgICAgICAgICAgKigodW5zaWduZWQgaW50KilkYXRhKSwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlWb3JiaXNJbmZvIHR5cGU9JWQgc2l6ZT0lZCIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZvcmJpc0Jvb2tzIHR5cGU9JWQgc2l6ZT0lZCIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlXYW50c05BTEZyYWdtZW50cyAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlzU3luY0ZyYW1lICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlJc0NvZGVjQ29uZmlnICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5VGltZSwgJmludDY0RGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUaW1lICVsbGQiLCBpbnQ2NERhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEdXJhdGlvbiwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlEdXJhdGlvbiAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNvbG9yRm9ybWF0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRQb2ludGVyKGtLZXlQbGF0Zm9ybVByaXZhdGUsICZwdHIpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5UGxhdGZvcm1Qcml2YXRlIHBvaW50ZXI9MHgleCIsIChpbnQzMl90KSBwdHIpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlEZWNvZGVyQ29tcG9uZW50ICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCdWZmZXJJRCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlCdWZmZXJJRCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlNYXhJbnB1dFNpemUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCAmaW50NjREYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRodW1ibmFpbFRpbWUgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5QWxidW0sICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBbGJ1bSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBcnRpc3QsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBcnRpc3QgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5QWxidW1BcnRpc3QsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBbGJ1bUFydGlzdCAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlDb21wb3NlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNvbXBvc2VyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUdlbnJlLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5R2VucmUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5VGl0bGUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUaXRsZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlZZWFyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5WWVhciAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBbGJ1bUFydCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBbGJ1bUFydCB0eXBlPSVkIHNpemU9JWQiLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBbGJ1bUFydE1JTUUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5QXV0aG9yLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QXV0aG9yICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlDRFRyYWNrTnVtYmVyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURpc2NOdW1iZXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlEaXNjTnVtYmVyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURhdGUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlEYXRlICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleVdyaXRlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVdyaXRlciAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VGltZVNjYWxlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpbWVTY2FsZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvUHJvZmlsZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlWaWRlb1Byb2ZpbGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb0xldmVsLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZpZGVvTGV2ZWwgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5NjRCaXRGaWxlT2Zmc2V0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RmlsZVR5cGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RmlsZVR5cGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsICZpbnQ2NERhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VHJhY2tUaW1lU3RhdHVzICVsbGQiLCBpbnQ2NERhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlSZWFsVGltZVJlY29yZGluZywgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlSZWFsVGltZVJlY29yZGluZyAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotfQotCi0vKioKLSAqIFRoaXMgY29kZSB3YXMgZXh0cmFjdGVkIGZyb20gU3RhZ2VGcmlnaHQgTVBFRzQgd3JpdGVyCi0gKiBJcyBpcyB1c2VkIHRvIHBhcnNlIGFuZCBmb3JtYXQgdGhlIEFWQyBjb2RlYyBzcGVjaWZpYyBpbmZvIHJlY2VpdmVkCi0gKiBmcm9tIFN0YWdlRnJpZ2h0IGVuY29kZXJzCi0gKi8KLXN0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0ID0gMHgwNzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0ID0gMHgwODsKLXN0cnVjdCBBVkNQYXJhbVNldCB7Ci0gICAgQVZDUGFyYW1TZXQodWludDE2X3QgbGVuZ3RoLCBjb25zdCB1aW50OF90ICpkYXRhKQotICAgICAgICA6IG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkge30KLQotICAgIHVpbnQxNl90IG1MZW5ndGg7Ci0gICAgY29uc3QgdWludDhfdCAqbURhdGE7Ci19Owotc3RydWN0IEFWQ0NvZGVjU3BlY2lmaWNDb250ZXh0IHsKLSAgICBMaXN0PEFWQ1BhcmFtU2V0PiBtU2VxUGFyYW1TZXRzOwotICAgIExpc3Q8QVZDUGFyYW1TZXQ+IG1QaWNQYXJhbVNldHM7Ci0gICAgdWludDhfdCBtUHJvZmlsZUlkYzsKLSAgICB1aW50OF90IG1Qcm9maWxlQ29tcGF0aWJsZTsKLSAgICB1aW50OF90IG1MZXZlbElkYzsKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgKnBhcnNlUGFyYW1TZXQoQVZDQ29kZWNTcGVjaWZpY0NvbnRleHQqIHBDLAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoLCBpbnQgdHlwZSwgc2l6ZV90ICpwYXJhbVNldExlbikgewotICAgIENIRUNLKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQgfHwKLSAgICAgICAgICB0eXBlID09IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0KTsKLQotICAgIHNpemVfdCBieXRlc0xlZnQgPSBsZW5ndGg7Ci0gICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgICYmCi0gICAgICAgICAgICBtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCAmZGF0YVtsZW5ndGggLSBieXRlc0xlZnRdLCA0KSkgewotICAgICAgICAtLWJ5dGVzTGVmdDsKLSAgICB9Ci0gICAgaWYgKGJ5dGVzTGVmdCA8PSA0KSB7Ci0gICAgICAgIGJ5dGVzTGVmdCA9IDA7IC8vIExhc3QgcGFyYW1ldGVyIHNldAotICAgIH0KLSAgICBjb25zdCB1aW50OF90ICpuZXh0U3RhcnRDb2RlID0gJmRhdGFbbGVuZ3RoIC0gYnl0ZXNMZWZ0XTsKLSAgICAqcGFyYW1TZXRMZW4gPSBuZXh0U3RhcnRDb2RlIC0gZGF0YTsKLSAgICBpZiAoKnBhcmFtU2V0TGVuID09IDApIHsKLSAgICAgICAgQUxPR0UoIlBhcmFtIHNldCBpcyBtYWxmb3JtZWQsIHNpbmNlIGl0cyBsZW5ndGggaXMgMCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBBVkNQYXJhbVNldCBwYXJhbVNldCgqcGFyYW1TZXRMZW4sIGRhdGEpOwotICAgIGlmICh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0KSB7Ci0gICAgICAgIGlmICgqcGFyYW1TZXRMZW4gPCA0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2VxIHBhcmFtZXRlciBzZXQgbWFsZm9ybWVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAocEMtPm1TZXFQYXJhbVNldHMuZW1wdHkoKSkgewotICAgICAgICAgICAgcEMtPm1Qcm9maWxlSWRjID0gZGF0YVsxXTsKLSAgICAgICAgICAgIHBDLT5tUHJvZmlsZUNvbXBhdGlibGUgPSBkYXRhWzJdOwotICAgICAgICAgICAgcEMtPm1MZXZlbElkYyA9IGRhdGFbM107Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocEMtPm1Qcm9maWxlSWRjICE9IGRhdGFbMV0gfHwKLSAgICAgICAgICAgICAgICBwQy0+bVByb2ZpbGVDb21wYXRpYmxlICE9IGRhdGFbMl0gfHwKLSAgICAgICAgICAgICAgICBwQy0+bUxldmVsSWRjICE9IGRhdGFbM10pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IHByb2ZpbGUvbGV2ZWwgZm91bmQgaW4gc2VxIHBhcmFtZXRlciBzZXRzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPm1TZXFQYXJhbVNldHMucHVzaF9iYWNrKHBhcmFtU2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBwQy0+bVBpY1BhcmFtU2V0cy5wdXNoX2JhY2socGFyYW1TZXQpOwotICAgIH0KLSAgICByZXR1cm4gbmV4dFN0YXJ0Q29kZTsKLX0KLQotc3RhdHVzX3QgYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSh1aW50OF90ICoqcE91dHB1dERhdGEsIHNpemVfdCAqcE91dHB1dFNpemUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBNZXRhRGF0YSAqcGFyYW0pCi17Ci0gICAgLy9BTE9HVigiYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSIpOwotCi0gICAgaWYgKCAocE91dHB1dERhdGEgPT0gTlVMTCkgfHwgKHBPdXRwdXRTaXplID09IE5VTEwpICkgewotICAgICAgICBBTE9HRSgib3V0cHV0IGlzIGludmFsaWQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoKnBPdXRwdXREYXRhICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkFscmVhZHkgaGF2ZSBjb2RlYyBzcGVjaWZpYyBkYXRhIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIEFMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICVkIiwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgLy8gRGF0YSBpcyBpbiB0aGUgZm9ybSBvZiBBVkNDb2RlY1NwZWNpZmljRGF0YQotICAgIGlmIChtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCBkYXRhLCA0KSkgewotICAgICAgICAvLyAyIGJ5dGVzIGZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aCBmaWVsZAotICAgICAgICAvLyBwbHVzIHRoZSA3IGJ5dGVzIGZvciB0aGUgaGVhZGVyCi0gICAgICAgIGlmIChzaXplIDwgNCArIDcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICVkIiwgc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgKnBPdXRwdXRTaXplID0gc2l6ZTsKLSAgICAgICAgKnBPdXRwdXREYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhzaXplKTsKLSAgICAgICAgbWVtY3B5KCpwT3V0cHV0RGF0YSwgZGF0YSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBBVkNDb2RlY1NwZWNpZmljQ29udGV4dCBjdHg7Ci0gICAgdWludDhfdCAqb3V0cHV0RGF0YSA9IE5VTEw7Ci0gICAgc2l6ZV90IG91dHB1dFNpemUgPSAwOwotCi0gICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGEgaXMgdmFsaWQKLSAgICB1aW50OF90IHR5cGUgPSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldDsKLSAgICBib29sIGdvdFNwcyA9IGZhbHNlOwotICAgIGJvb2wgZ290UHBzID0gZmFsc2U7Ci0gICAgY29uc3QgdWludDhfdCAqdG1wID0gZGF0YTsKLSAgICBjb25zdCB1aW50OF90ICpuZXh0U3RhcnRDb2RlID0gZGF0YTsKLSAgICBzaXplX3QgYnl0ZXNMZWZ0ID0gc2l6ZTsKLSAgICBzaXplX3QgcGFyYW1TZXRMZW4gPSAwOwotICAgIG91dHB1dFNpemUgPSAwOwotICAgIHdoaWxlIChieXRlc0xlZnQgPiA0ICYmICFtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCB0bXAsIDQpKSB7Ci0gICAgICAgIHR5cGUgPSAoKih0bXAgKyA0KSkgJiAweDFGOwotICAgICAgICBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCkgewotICAgICAgICAgICAgaWYgKGdvdFBwcykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJTUFMgbXVzdCBjb21lIGJlZm9yZSBQUFMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFnb3RTcHMpIHsKLSAgICAgICAgICAgICAgICBnb3RTcHMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dFN0YXJ0Q29kZSA9IHBhcnNlUGFyYW1TZXQoJmN0eCwgdG1wICsgNCwgYnl0ZXNMZWZ0IC0gNCwgdHlwZSwKLSAgICAgICAgICAgICAgICAmcGFyYW1TZXRMZW4pOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlUGljUGFyYW1TZXQpIHsKLSAgICAgICAgICAgIGlmICghZ290U3BzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNQUyBtdXN0IGNvbWUgYmVmb3JlIFBQUyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWdvdFBwcykgewotICAgICAgICAgICAgICAgIGdvdFBwcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0U3RhcnRDb2RlID0gcGFyc2VQYXJhbVNldCgmY3R4LCB0bXAgKyA0LCBieXRlc0xlZnQgLSA0LCB0eXBlLAotICAgICAgICAgICAgICAgICZwYXJhbVNldExlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiT25seSBTUFMgYW5kIFBQUyBOYWwgdW5pdHMgYXJlIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5leHRTdGFydENvZGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1vdmUgb24gdG8gZmluZCB0aGUgbmV4dCBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgIGJ5dGVzTGVmdCAtPSBuZXh0U3RhcnRDb2RlIC0gdG1wOwotICAgICAgICB0bXAgPSBuZXh0U3RhcnRDb2RlOwotICAgICAgICBvdXRwdXRTaXplICs9ICgyICsgcGFyYW1TZXRMZW4pOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgb24gdGhlIG51bWJlciBvZiBzZXEgcGFyYW1ldGVyIHNldHMKLSAgICAgICAgc2l6ZV90IG5TZXFQYXJhbVNldHMgPSBjdHgubVNlcVBhcmFtU2V0cy5zaXplKCk7Ci0gICAgICAgIGlmIChuU2VxUGFyYW1TZXRzID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VuZCBub3QgZmluZCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Iik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5TZXFQYXJhbVNldHMgPiAweDFGKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgc2VxIHBhcmFtZXRlciBzZXRzICglZCkgZm91bmQiLCBuU2VxUGFyYW1TZXRzKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIG9uIHRoZSBudW1iZXIgb2YgcGljIHBhcmFtZXRlciBzZXRzCi0gICAgICAgIHNpemVfdCBuUGljUGFyYW1TZXRzID0gY3R4Lm1QaWNQYXJhbVNldHMuc2l6ZSgpOwotICAgICAgICBpZiAoblBpY1BhcmFtU2V0cyA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bmQgbm90IGZpbmQgcGljdHVyZSBwYXJhbWV0ZXIgc2V0Iik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuUGljUGFyYW1TZXRzID4gMHhGRikgewotICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHBpYyBwYXJhbWV0ZXIgc2V0cyAoJWQpIGZvdW5kIiwgblBpY1BhcmFtU2V0cyk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSVNPIDE0NDk2LTE1OiBBVkMgZmlsZSBmb3JtYXQKLSAgICBvdXRwdXRTaXplICs9IDc7ICAvLyA3IG1vcmUgYnl0ZXMgaW4gdGhlIGhlYWRlcgotICAgIG91dHB1dERhdGEgPSAodWludDhfdCAqKW1hbGxvYyhvdXRwdXRTaXplKTsKLSAgICB1aW50OF90ICpoZWFkZXIgPSBvdXRwdXREYXRhOwotICAgIGhlYWRlclswXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgotICAgIGhlYWRlclsxXSA9IGN0eC5tUHJvZmlsZUlkYzsgICAgICAgICAgIC8vIHByb2ZpbGUgaW5kaWNhdGlvbgotICAgIGhlYWRlclsyXSA9IGN0eC5tUHJvZmlsZUNvbXBhdGlibGU7ICAgIC8vIHByb2ZpbGUgY29tcGF0aWJpbGl0eQotICAgIGhlYWRlclszXSA9IGN0eC5tTGV2ZWxJZGM7Ci0KLSAgICAvLyA2LWJpdCAnMTExMTExJyBmb2xsb3dlZCBieSAyLWJpdCB0byBsZW5ndGhTaXplTWludXVzT25lCi0gICAgaW50MzJfdCB1c2UyQnl0ZU5hbExlbmd0aCA9IDA7Ci0gICAgaWYgKHBhcmFtICYmCi0gICAgICAgIHBhcmFtLT5maW5kSW50MzIoa0tleTJCeXRlTmFsTGVuZ3RoLCAmdXNlMkJ5dGVOYWxMZW5ndGgpICYmCi0gICAgICAgIHVzZTJCeXRlTmFsTGVuZ3RoKSB7Ci0gICAgICAgIGhlYWRlcls0XSA9IDB4ZmMgfCAxOyAgLy8gbGVuZ3RoIHNpemUgPT0gMiBieXRlcwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhlYWRlcls0XSA9IDB4ZmMgfCAzOyAgLy8gbGVuZ3RoIHNpemUgPT0gNCBieXRlcwotICAgIH0KLQotICAgIC8vIDMtYml0ICcxMTEnIGZvbGxvd2VkIGJ5IDUtYml0IG51bVNlcXVlbmNlUGFyYW1ldGVyU2V0cwotICAgIGludCBuU2VxdWVuY2VQYXJhbVNldHMgPSBjdHgubVNlcVBhcmFtU2V0cy5zaXplKCk7Ci0gICAgaGVhZGVyWzVdID0gMHhlMCB8IG5TZXF1ZW5jZVBhcmFtU2V0czsKLSAgICBoZWFkZXIgKz0gNjsKLSAgICBmb3IgKExpc3Q8QVZDUGFyYW1TZXQ+OjppdGVyYXRvciBpdCA9IGN0eC5tU2VxUGFyYW1TZXRzLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBjdHgubVNlcVBhcmFtU2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICAvLyAxNi1iaXQgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBsZW5ndGgKLSAgICAgICAgdWludDE2X3Qgc2VxUGFyYW1TZXRMZW5ndGggPSBpdC0+bUxlbmd0aDsKLSAgICAgICAgaGVhZGVyWzBdID0gc2VxUGFyYW1TZXRMZW5ndGggPj4gODsKLSAgICAgICAgaGVhZGVyWzFdID0gc2VxUGFyYW1TZXRMZW5ndGggJiAweGZmOwotICAgICAgICAvL0FMT0dFKCIjIyMgU1BTICVkICVkICVkIiwgc2VxUGFyYW1TZXRMZW5ndGgsIGhlYWRlclswXSwgaGVhZGVyWzFdKTsKLQotICAgICAgICAvLyBTUFMgTkFMIHVuaXQgKHNlcXVlbmNlIHBhcmFtZXRlciBsZW5ndGggYnl0ZXMpCi0gICAgICAgIG1lbWNweSgmaGVhZGVyWzJdLCBpdC0+bURhdGEsIHNlcVBhcmFtU2V0TGVuZ3RoKTsKLSAgICAgICAgaGVhZGVyICs9ICgyICsgc2VxUGFyYW1TZXRMZW5ndGgpOwotICAgIH0KLQotICAgIC8vIDgtYml0IG5QaWN0dXJlUGFyYW1ldGVyU2V0cwotICAgIGludCBuUGljdHVyZVBhcmFtU2V0cyA9IGN0eC5tUGljUGFyYW1TZXRzLnNpemUoKTsKLSAgICBoZWFkZXJbMF0gPSBuUGljdHVyZVBhcmFtU2V0czsKLSAgICBoZWFkZXIgKz0gMTsKLSAgICBmb3IgKExpc3Q8QVZDUGFyYW1TZXQ+OjppdGVyYXRvciBpdCA9IGN0eC5tUGljUGFyYW1TZXRzLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBjdHgubVBpY1BhcmFtU2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICAvLyAxNi1iaXQgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aAotICAgICAgICB1aW50MTZfdCBwaWNQYXJhbVNldExlbmd0aCA9IGl0LT5tTGVuZ3RoOwotICAgICAgICBoZWFkZXJbMF0gPSBwaWNQYXJhbVNldExlbmd0aCA+PiA4OwotICAgICAgICBoZWFkZXJbMV0gPSBwaWNQYXJhbVNldExlbmd0aCAmIDB4ZmY7Ci0vL0FMT0dFKCIjIyMgUFBTICVkICVkICVkIiwgcGljUGFyYW1TZXRMZW5ndGgsIGhlYWRlclswXSwgaGVhZGVyWzFdKTsKLQotICAgICAgICAvLyBQUFMgTmFsIHVuaXQgKHBpY3R1cmUgcGFyYW1ldGVyIHNldCBsZW5ndGggYnl0ZXMpCi0gICAgICAgIG1lbWNweSgmaGVhZGVyWzJdLCBpdC0+bURhdGEsIHBpY1BhcmFtU2V0TGVuZ3RoKTsKLSAgICAgICAgaGVhZGVyICs9ICgyICsgcGljUGFyYW1TZXRMZW5ndGgpOwotICAgIH0KLQotICAgICpwT3V0cHV0U2l6ZSA9IG91dHB1dFNpemU7Ci0gICAgKnBPdXRwdXREYXRhID0gb3V0cHV0RGF0YTsKLSAgICByZXR1cm4gT0s7Ci19Ci19Ly8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlOTE3MzEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZGVjb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX1ZJREVPREVDT0RFUiIKLS8qKioqKioqKioqKioqKioqKioqCi0gKiAgICAgSEVBREVSUyAgICAgKgotICoqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgREVGSU5JVElPTlMgICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNQVhfREVDX0JVRkZFUlMgMTAKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIFNPVVJDRSBDTEFTUyAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotc3RhdGljIE00T1NBX0VSUiBjb3B5QnVmZmVyVG9RdWV1ZSgKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0LAotICAgIE1lZGlhQnVmZmVyKiBwRGVjb2RlZEJ1ZmZlcik7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NvZGVjVHlwZSBjb2RlY1R5cGUsCi0gICAgICAgICAgICB2b2lkICpkZWNvZGVyU2hlbGxDb250ZXh0KTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotICAgIHByb3RlY3RlZCA6Ci0gICAgICAgIHZpcnR1YWwgflZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKLSAgICAgICAgTWVkaWFCdWZmZXIqIG1CdWZmZXI7Ci0gICAgICAgIE1lZGlhQnVmZmVyR3JvdXAqIG1Hcm91cDsKLSAgICAgICAgTXV0ZXggbUxvY2s7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIG1wRGVjU2hlbGxDb250ZXh0OwotICAgICAgICBpbnQzMl90IG1NYXhBVVNpemU7Ci0gICAgICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgICAgIFZJREVPRURJVE9SX0NvZGVjVHlwZSBtQ29kZWNUeXBlOwotCi0gICAgICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgJik7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlICZvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSAmKTsKLX07Ci0KLVZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsIFZJREVPRURJVE9SX0NvZGVjVHlwZSBjb2RlY1R5cGUsCi0gICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpIDoKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgICBtR3JvdXAoTlVMTCksCi0gICAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgICAgbUNvZGVjVHlwZShjb2RlY1R5cGUpIHsKLSAgICBtcERlY1NoZWxsQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgZGVjb2RlclNoZWxsQ29udGV4dDsKLX0KLQotVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgpIHsKLSAgICBpZiAobVN0YXJ0ZWQgPT0gdHJ1ZSkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6c3RhcnQoCi0gICAgICAgIE1ldGFEYXRhICpwYXJhbXMpIHsKLQotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgaWYgKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmbU1heEFVU2l6ZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBrS2V5TWF4SW5wdXRTaXplIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgICAgIGlmIChtR3JvdXAgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkZBVEFMOiBtZW1vcnkgbGltaXRhdGlvbiAhICIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobU1heEFVU2l6ZSkpOwotCi0gICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6c3RvcCgpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAvLyBGSVhNRToKLSAgICAgICAgICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRvIGNoZWNrIG9uIHRoZSByZWYgY291bnQ/Ci0gICAgICAgICAgICBpbnQgcmVmX2NvdW50ID0gbUJ1ZmZlci0+cmVmY291bnQoKTsKLSAgICAgICAgICAgIEFMT0dWKCJNZWRpYUJ1ZmZlciByZWZjb3VudCBpcyAlZCIscmVmX2NvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmX2NvdW50OyArK2kpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgICAgIG1Hcm91cCA9IE5VTEw7Ci0gICAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLQotICAgIHJldHVybiBtRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlcioqIGJ1ZmZlcl9vdXQsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIGlmIChvcHRpb25zICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCB0aW1lX3VzOwotICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgICAgIG9wdGlvbnMtPmdldFNlZWtUbygmdGltZV91cywgJm1vZGUpOwotICAgICAgICBpZiAobW9kZSAhPSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQykgewotICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgcmVhZCBvcHRpb25zIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfRVJSIGVycjsKLSAgICAgICAgTTRPU0FfSW50MzIgcmFwVGltZSA9IHRpbWVfdXMgLyAxMDAwOwotCi0gICAgICAgIC8qLS0tIFJldHJpZXZlIHRoZSBwcmV2aW91cyBSQVAgdGltZSAtLS0qLwotICAgICAgICBlcnIgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyR2xvYmFsLT5tX3BGY3RHZXRQcmV2UmFwVGltZSgKLSAgICAgICAgICAgICAgICAgIG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKiltcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLAotICAgICAgICAgICAgICAgICAgJnJhcFRpbWUpOwotCi0gICAgICAgIGlmIChlcnIgPT0gTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UKSB7Ci0gICAgICAgICAgICAvKiBObyBSQVAgdGFibGUsIGp1bXAgYmFja3dhcmQgYW5kIHByZWRlY29kZSAqLwotICAgICAgICAgICAgcmFwVGltZSAtPSA0MDAwMDsKLSAgICAgICAgICAgIGlmKHJhcFRpbWUgPCAwKSByYXBUaW1lID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXQgcmFwIHRpbWUgZXJyb3IgPSAweCV4XG4iLCAodWludDMyX3QpZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlckdsb2JhbC0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKW1wRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgJnJhcFRpbWUpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJqdW1wIGVyciA9IDB4JXhcbiIsICh1aW50MzJfdCllcnIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpidWZmZXJfb3V0ID0gTlVMTDsKLQotICAgIE00T1NBX0VSUiBsZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7Ci0gICAgaWYgKGxlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGxlcnI7Ci0gICAgfQotICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5jbGVhcigpOyAgLy8gY2xlYXIgYWxsIHRoZSBtZXRhIGRhdGEKLQotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAvL2dldE5leHQgQVUgZnJvbSByZWFkZXIuCi0gICAgICAgIE00X0FjY2Vzc1VuaXQqIHBBY2Nlc3NVbml0ID0gbXBEZWNTaGVsbENvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7Ci0gICAgICAgIGxlcnIgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlci0+bV9yZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKiltcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLAotICAgICAgICAgICAgICAgICAgIHBBY2Nlc3NVbml0KTsKLSAgICAgICAgaWYgKGxlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQgfHwgbGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKSB7Ci0gICAgICAgICAgICAqYnVmZmVyX291dCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vY29weSB0aGUgcmVhZGVyIEFVIGJ1ZmZlciB0byBtQnVmZmVyCi0gICAgICAgIE00T1NBX1VJbnQzMiBsU2l6ZSAgPSAocEFjY2Vzc1VuaXQtPm1fc2l6ZSA+IChNNE9TQV9VSW50MzIpbU1heEFVU2l6ZSlcCi0gICAgICAgICAgICA/IChNNE9TQV9VSW50MzIpbU1heEFVU2l6ZSA6IHBBY2Nlc3NVbml0LT5tX3NpemU7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKW1CdWZmZXItPmRhdGEoKSwodm9pZCAqKXBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgbFNpemUpOwotCi0gICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBsU2l6ZSk7Ci0gICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSAoaW50NjRfdCkgKHBBY2Nlc3NVbml0LT5tX0NUUyAqIDEwMDApOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZVVzKTsKLQotICAgICAgICAvLyBSZXBsYWNlIHRoZSBBVSBzdGFydCBjb2RlIGZvciBIMjY0Ci0gICAgICAgIGlmIChWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjID09IG1Db2RlY1R5cGUpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgICAgICBkYXRhWzBdPTA7Ci0gICAgICAgICAgICBkYXRhWzFdPTA7Ci0gICAgICAgICAgICBkYXRhWzJdPTA7Ci0gICAgICAgICAgICBkYXRhWzNdPTE7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwKLSAgICAgICAgICAgIChwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPT0gMHgwNCk/IDEgOiAwKTsKLSAgICAgICAgKmJ1ZmZlcl9vdXQgPSBtQnVmZmVyOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgIFZJREVPRURJVE9SX1ZJREVPX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwgTTRPU0FfVUludDMyIG5iX2JpdHMpIHsKLSAgICByZXR1cm4gKE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoKE00VlNfQml0c3RyZWFtX2N0eHQqKSBwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgIG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsUGFyc2VWaWRlb0RTSShNNE9TQV9VSW50OCogcFZvbCwKLSAgICAgICAgTTRPU0FfSW50MzIgYVZvbFNpemUsIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERjaSwKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZSkgewotCi0gICAgVklERU9FRElUT1JfVklERU9fQml0c3RyZWFtX2N0eHQgcGFyc2luZ0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGNvZGUsIGo7Ci0gICAgTTRPU0FfTWVtQWRkcjggc3RhcnQ7Ci0gICAgTTRPU0FfVUludDggaTsKLSAgICBNNE9TQV9VSW50MzIgdGltZV9pbmNyX2xlbmd0aDsKLSAgICBNNE9TQV9VSW50OCB2b2xfdmVyaWQ9MCwgYl9oaWVyYXJjaHlfdHlwZTsKLQotICAgIC8qIFBhcnNpbmcgdmFyaWFibGVzICovCi0gICAgTTRPU0FfVUludDggdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggc2NhbGFiaWxpdHkgPSAwOwotICAgIE00T1NBX1VJbnQ4IGVuaGFuY2VtZW50X3R5cGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBpbnRlcmxhY2VkID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfd2FycGluZ19wb2ludHMgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSA9IDA7Ci0gICAgTTRPU0FfVUludDggcXVhbnRfcHJlY2lzaW9uID0gMDsKLQotICAgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCAgICAgID0gMDsKLSAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ICAgICA9IDA7Ci0KLSAgICBwRGNpLT51aVRpbWVTY2FsZSAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlQcm9maWxlICAgICAgICAgICAgPSAwOwotICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gMDsKLSAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBEY2ktPmJVc2VPZlJWTEMgICAgICAgICAgID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBSZXNldCB0aGUgYml0c3RyZWFtIGNvbnRleHQgKi8KLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1fYnl0ZSA9IDA7Ci0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4ID0gODsKLSAgICBwYXJzaW5nQ3R4dC5pbiA9IChNNE9TQV9NZW1BZGRyOCkgcFZvbDsKLQotICAgIHN0YXJ0ID0gKE00T1NBX01lbUFkZHI4KSBwVm9sOwotCi0gICAgLyogU3RhcnQgcGFyc2luZyAqLwotICAgIHdoaWxlIChwYXJzaW5nQ3R4dC5pbiAtIHN0YXJ0IDwgYVZvbFNpemUpIHsKLSAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgIGlmIChjb2RlID09IDApIHsKLSAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsOCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBjb2RlIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHgyMC4uMHgyRiA6IHZpZGVvX29iamVjdF9sYXllcl9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4gMHgxRikgJiYgKGNvZGUgPCAweDMwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDE1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZCB0byBzYXZlIGl0IGZvciB2b3AgcGFyc2luZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgLyogb25seSByZWN0YW5ndWxhciBjYXNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVGltZVNjYWxlID0gY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZXMgdGltZSBpbmNyZW1lbnQgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqICAgID0gY29kZSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IDMyKSAmJiAoaiAhPSAwKTsgaiA+Pj0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyX2xlbmd0aCA9IChpID09IDApID8gMSA6IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIHRpbWVfaW5jcl9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMSkgeyAvKiAxID0gQmluYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBIZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogaW50ZXJsYWNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogT0JNQyBkaXNhYmxlICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZvbF92ZXJpZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAyKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzcHJpdGVfZW5hYmxlID09IDEpIHx8IChzcHJpdGVfZW5hYmxlID09IDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIHNwcml0ZSB3aWR0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIGhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIGwgY29vcmRpbmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIHRvcCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA2KTsvKiBzcHJpdGUgd2FycGluZyBwb2ludHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfd2FycGluZ19wb2ludHMgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMik7Lyogc3ByaXRlIHdhcnBpbmcgYWNjdXJhY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc3ByaXRlIGJyaWdodG5lc3MgY2hhbmdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodm9sX3ZlcmlkICE9IDEpICYmICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHNhZGN0IGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7IC8qIG5vdCA4IGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOy8qIHF1YW50IHByZWNpc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50X3ByZWNpc2lvbiA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsvKiBiaXRzIHBlciBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBncmV5c2NhbGUgbm90IHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHF1YW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGxvYWQgaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsvKiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogbG9hZCBub24gaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsvKiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbF92ZXJpZCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHF1YXJ0ZXIgc2FtcGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGNvbXBsZXhpdHkgZXN0aW1hdGlvbiBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiByZXN5bmMgbWFya2VyIGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gKGNvZGUpID8gMCA6IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGRhdGEgcGFydGl0aW9ubmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHJldmVyc2libGUgVkxDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+YlVzZU9mUlZMQyA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbF92ZXJpZCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIG5ld3ByZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHNjYWxhYmlsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJpbGl0eSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogaGllcmFyY2h5IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX2hpZXJhcmNoeV90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOy8qIHJlZiBsYXllciBpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiByZWYgc2FtcGxpbmcgZGlyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsvKiBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7LyogdmVydCBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGVuaGFuY2VtZW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudF90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghYl9oaWVyYXJjaHlfdHlwZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiB1c2UgcmVmIHNoYXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogdXNlIHJlZiB0ZXh0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEIwIDogdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOy8qIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpUHJvZmlsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHhCNSA6IHZpc3VhbF9vYmplY3Rfc3RhcnRfY29kZSAtLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoY29kZSA9PSAweEI1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsgLyogdmlzdWFsIG9iamVjdCB2ZXJpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDcpOyAvKiBSZWFsaWduIG9uIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gZW5kIC0tLS0tICovCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4+IDIpID09IDB4MjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEgyNjMgLi4uLT4gd3JvbmcqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00VklGSV9VSW50OCBNNFZJRklfU2VtaXBsYW5hcllWVTQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICppbnl1diwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICkgewotICAgIE00VklGSV9VSW50OCByZXR1cm5fY29kZSA9IE00VklGSV9PSzsKLSAgICBNNFZJRklfVUludDggKm91dHl1diA9Ci0gICAgICAgICgoTTRWSUZJX1VJbnQ4KikmKFBsYW5lT3V0WzBdLnBhY19kYXRhW1BsYW5lT3V0WzBdLnVfdG9wbGVmdF0pKTsKLSAgICBpbnQzMl90IHdpZHRoID0gUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICBpbnQzMl90IGhlaWdodCA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0KLSAgICAgICAgKHVpbnQxNl90ICopICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0KLSAgICAgICAgKHVpbnQxNl90ICopICYoUGxhbmVPdXRbMl0ucGFjX2RhdGFbUGxhbmVPdXRbMl0udV90b3BsZWZ0XSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilvdXR5LCAodm9pZCAqKWlueXV2LCBvdXRZc2l6ZSk7Ci0KLSAgICAvKiBVICYgViBjb3B5aW5nICovCi0gICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOwotICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgotICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKLSAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotdm9pZCBsb2dTdXBwb3J0RGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMqIGRlY29kZXJzKSB7Ci0gICAgVmlkZW9EZWNvZGVyICpwRGVjb2RlcjsKLSAgICBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllcyAqcE9teENvbXBvbmVudHMgPSBOVUxMOwotICAgIFZpZGVvUHJvZmlsZUxldmVsICpwUHJvZmlsZUxldmVsID0gTlVMTDsKLSAgICBwRGVjb2RlciA9IGRlY29kZXJzLT5kZWNvZGVyOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBkZWNvZGVycy0+ZGVjb2Rlck51bWJlcjsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCJTdXBwb3J0ZWQgQ29kZWNbJWRdIDolZCIsIGksIHBEZWNvZGVyLT5jb2RlYyk7Ci0gICAgICAgIHBPbXhDb21wb25lbnRzID0gcERlY29kZXItPmNvbXBvbmVudDsKLSAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8ICBwRGVjb2Rlci0+Y29tcG9uZW50TnVtYmVyOyBqKyspIHsKLSAgICAgICAgICAgcFByb2ZpbGVMZXZlbCA9IHBPbXhDb21wb25lbnRzLT5wcm9maWxlTGV2ZWw7Ci0gICAgICAgICAgIEFMT0dWKCItLT5jb21wb25lbnQgJWQiLCBqKTsKLSAgICAgICAgICAgZm9yKHNpemVfdCBrID0gMDsgayA8IHBPbXhDb21wb25lbnRzLT5wcm9maWxlTnVtYmVyOyBrKyspIHsKLSAgICAgICAgICAgICAgIEFMT0dWKCItLT5wcm9maWxlOiVsZCBtYXhMZXZlbDolbGQiLCBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbCsrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHBPbXhDb21wb25lbnRzKys7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZXIrKzsKLSAgICB9Ci19Ci0KLU00T1NBX0VSUiBxdWVyeVZpZGVvRGVjb2RlckNhcGFiaWxpdGllcwotICAgIChNNERFQ09ERVJfVmlkZW9EZWNvZGVycyoqIGRlY29kZXJzKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgY29uc3QgY2hhciAqa01pbWVUeXBlc1tdID0gewotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzCi0gICAgfTsKLQotICAgIGludDMyX3Qgc3VwcG9ydEZvcm1hdHMgPSBzaXplb2Yoa01pbWVUeXBlcykgLyBzaXplb2Yoa01pbWVUeXBlc1swXSk7Ci0gICAgTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMgKnBEZWNvZGVyczsKLSAgICBWaWRlb0RlY29kZXIgKnBEZWNvZGVyOwotICAgIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzICpwT214Q29tcG9uZW50cyA9IE5VTEw7Ci0gICAgVmlkZW9Qcm9maWxlTGV2ZWwgKnBQcm9maWxlTGV2ZWwgPSBOVUxMOwotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgU0FGRV9NQUxMT0MocERlY29kZXJzLCBNNERFQ09ERVJfVmlkZW9EZWNvZGVycywgMSwgIlZpZGVvRGVjb2RlcnMiKTsKLSAgICBTQUZFX01BTExPQyhwRGVjb2RlciwgVmlkZW9EZWNvZGVyLCBzdXBwb3J0Rm9ybWF0cywKLSAgICAgICAgIlZpZGVvRGVjb2RlciIpOwotICAgIHBEZWNvZGVycy0+ZGVjb2RlciA9IHBEZWNvZGVyOwotCi0gICAgcERlY29kZXJzLT5kZWNvZGVyTnVtYmVyPSBzdXBwb3J0Rm9ybWF0czsKLSAgICBzdGF0dXMgPSBjbGllbnQuY29ubmVjdCgpOwotICAgIENIRUNLKHN0YXR1cyA9PSBPSyk7Ci0gICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBzaXplb2Yoa01pbWVUeXBlcykgLyBzaXplb2Yoa01pbWVUeXBlc1swXSk7Ci0gICAgICAgICAgICAgKytrKSB7Ci0gICAgICAgICAgICBWZWN0b3I8Q29kZWNDYXBhYmlsaXRpZXM+IHJlc3VsdHM7Ci0gICAgICAgICAgICBDSEVDS19FUShRdWVyeUNvZGVjcyhjbGllbnQuaW50ZXJmYWNlKCksIGtNaW1lVHlwZXNba10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvLyBxdWVyeURlY29kZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0cyksIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIFNBRkVfTUFMTE9DKHBPbXhDb21wb25lbnRzLCBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllcywKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5zaXplKCksICJWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllcyIpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJLPSVkIixrKTsKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29tcG9uZW50ID0gcE9teENvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvbXBvbmVudE51bWJlciA9IHJlc3VsdHMuc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiICBkZWNvZGVyICclcycgc3VwcG9ydHMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXS5tQ29tcG9uZW50TmFtZS5zdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1tpXS5tUHJvZmlsZUxldmVscy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiTk9USElORy5cbiIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGlnbm9yZSB0aGUgc29mdHdhcmUgY29kZWNzIGFuZCBtYWtlIElzU29mdHdhcmVDb2RlYygpCi0gICAgICAgICAgICAgICAgLy8gcGFydCBvZiBwdWJpYyBBUEkgZnJvbSBPTVhDb2RlYy5jcHAKLSAgICAgICAgICAgICAgICBpZiAoSXNTb2Z0d2FyZUNvZGVjKHJlc3VsdHNbaV0ubUNvbXBvbmVudE5hbWUuc3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJJZ25vcmUgc29mdHdhcmUgY29kZWMgJXMiLCByZXN1bHRzW2ldLm1Db21wb25lbnROYW1lLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvLyBDb3VudCB0aGUgc3VwcG9ydGVkIHByb2ZpbGVzCi0gICAgICAgICAgICAgICAgaW50MzJfdCBwcm9maWxlTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzW2pdOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogYXNzdW1lIHRoYXQgdGhlIHByb2ZpbGVzIGFyZSBvcmRlcmVkCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWwubVByb2ZpbGUgIT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IHByb2ZpbGVMZXZlbC5tUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVOdW1iZXIrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTQUZFX01BTExPQyhwUHJvZmlsZUxldmVsLCBWaWRlb1Byb2ZpbGVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlciwgIlZpZGVvUHJvZmlsZUxldmVsIik7Ci0gICAgICAgICAgICAgICAgcE9teENvbXBvbmVudHMtPnByb2ZpbGVMZXZlbCA9IHBQcm9maWxlTGV2ZWw7Ci0gICAgICAgICAgICAgICAgcE9teENvbXBvbmVudHMtPnByb2ZpbGVOdW1iZXIgPSBwcm9maWxlTnVtYmVyOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBtYXggTGV2ZWwgZm9yIGVhY2ggcHJvZmlsZS4KLSAgICAgICAgICAgICAgICBpbnQzMl90IG1heExldmVsID0gLTE7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZSA9IC0xOwotICAgICAgICAgICAgICAgIHByb2ZpbGVOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHNbal07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IC0xICYmIG1heExldmVsID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gcHJvZmlsZUxldmVsLm1Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBwcm9maWxlTGV2ZWwubUxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUgPSBwcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsID0gbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgcHJvZmlsZTogJWxkLCBtYXggbGV2ZWw6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLCBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWwubVByb2ZpbGUgIT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IHByb2ZpbGVMZXZlbC5tUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gcHJvZmlsZUxldmVsLm1MZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVOdW1iZXIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlID0gcHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCA9IG1heExldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVkIHByb2ZpbGU6ICVsZCwgbWF4IGxldmVsOiAlbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSwgcFByb2ZpbGVMZXZlbC0+bUxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlTGV2ZWwubUxldmVsID4gbWF4TGV2ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gcHJvZmlsZUxldmVsLm1MZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCA9IG1heExldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVkIHByb2ZpbGU6ICVsZCwgbWF4IGxldmVsOiAlbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSwgcFByb2ZpbGVMZXZlbC0+bUxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBPbXhDb21wb25lbnRzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIGtNaW1lVHlwZXNba10pKQotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb2RlYyA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwga01pbWVUeXBlc1trXSkpCi0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvZGVjID0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDsKLSAgICAgICAgICAgIGlmICghc3RyY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIGtNaW1lVHlwZXNba10pKQotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb2RlYyA9IE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzsKLQotICAgICAgICAgICAgcERlY29kZXIrKzsKLSAgICB9Ci0KLSAgICBsb2dTdXBwb3J0RGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMocERlY29kZXJzKTsKLSAgICAqZGVjb2RlcnMgPSBwRGVjb2RlcnM7Ci1jbGVhblVwOgotICAgIHJldHVybiBlcnI7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZXRhRGF0YSogbWV0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIGJvb2wgc3VjY2VzcyA9IE9LOwotICAgIGludDMyX3Qgd2lkdGggPSAwOwotICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKLSAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IDA7Ci0gICAgaW50MzJfdCB2V2lkdGgsIHZIZWlnaHQ7Ci0gICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IG1ldGEsICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBiZWdpbiIpOwotCi0gICAgcERlY1NoZWxsQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmdldpZHRoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhUUlVFID09IHN1Y2Nlc3MsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmdkhlaWdodCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soVFJVRSA9PSBzdWNjZXNzLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoInZXaWR0aCA9ICVkLCB2SGVpZ2h0ID0gJWQiLCB2V2lkdGgsIHZIZWlnaHQpOwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPSB2V2lkdGg7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0ID0gdkhlaWdodDsKLQotICAgIGlmICghbWV0YS0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAga0tleUNyb3BSZWN0LCAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpIHsKLQotICAgICAgICBjcm9wTGVmdCA9IGNyb3BUb3AgPSAwOwotICAgICAgICBjcm9wUmlnaHQgPSB2V2lkdGggLSAxOwotICAgICAgICBjcm9wQm90dG9tID0gdkhlaWdodCAtIDE7Ci0KLSAgICAgICAgQUxPR1YoImdvdCBkaW1lbnNpb25zIG9ubHkgJWQgeCAlZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJnb3QgY3JvcCByZWN0ICVkLCAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QubGVmdCA9IGNyb3BMZWZ0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC5yaWdodCA9IGNyb3BSaWdodDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QudG9wID0gY3JvcFRvcDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QuYm90dG9tID0gY3JvcEJvdHRvbTsKLQotICAgIHdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOwotICAgIGhlaWdodCA9IGNyb3BCb3R0b20gLSBjcm9wVG9wICsgMTsKLQotICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIDogVz0lZCBIPSVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soKDAgIT0gd2lkdGgpICYmICgwICE9IGhlaWdodCksIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBpZiggKE00T1NBX05VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCkgJiYKLSAgICAgICAgKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoICA9PSBcCi0gICAgICAgICAgICAodWludDMyX3Qpd2lkdGgpICYmCi0gICAgICAgIChwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQgPT0gXAotICAgICAgICAgICAgKHVpbnQzMl90KWhlaWdodCkgKSB7Ci0gICAgICAgIC8vIE5vIG5lZWQgdG8gcmVjb25maWd1cmUKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSAgcmVzZXQ6IFc9JWQgSD0lZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIC8vIFVwZGF0ZSB0aGUgc3RyZWFtIGhhbmRsZXIgcGFyYW1ldGVycwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoICA9IHdpZHRoOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCA9IGhlaWdodDsKLSAgICBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7Ci0KLSAgICAvLyBDb25maWd1cmUgdGhlIGJ1ZmZlciBwb29sCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgOiByZXNldCB0aGUgYnVmZmVyIHBvb2wiKTsKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgZXJyID0gIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woJnBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wsCi0gICAgICAgIE1BWF9ERUNfQlVGRkVSUywgKE00T1NBX0NoYXIqKSJWSURFT0VESVRPUl9EZWNvZGVkQnVmZmVyUG9vbCIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIGVyciA9IFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgICAgICAgICBmcmFtZVNpemUgKyBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqIDIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCApIHsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sKTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gUmVsZWFzZSB0aGUgY29sb3IgY29udmVydGVyCi0gICAgZGVsZXRlIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIGlmKCBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyICE9IE5VTEwgKSB7Ci0gICAgICAgIEFMT0dWKCIjIyMgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSA6IHJlbGVhc2luZyBkZWNvZGVyIik7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPnN0b3AoKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci5jbGVhcigpOwotICAgIH0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLmNsZWFyKCk7Ci0KLSAgICAvLyBSZWxlYXNlIG1lbW9yeQotICAgIGlmKCBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICE9IE00T1NBX05VTEwgKSB7Ci0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIFNBRkVfRlJFRShwRGVjU2hlbGxDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IE5VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmVhZGVyRGF0YUludGVyZmFjZSwKLSAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQsIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotICAgIGJvb2wgc3VjY2VzcyA9IFRSVUU7Ci0gICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHNpemUgPSAwOwotICAgIHNwPE1ldGFEYXRhPiBkZWNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGludCBkZWNvZGVyT3V0cHV0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBTdHJlYW1IYW5kbGVyLCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJlYWRlckRhdGFJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbgotICAgIFNBRkVfTUFMTE9DKHBEZWNTaGVsbENvbnRleHQsIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRGVjb2RlciIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciA9Ci0gICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPSBwQWNjZXNzVW5pdDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwgPSBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlciA9IHBSZWFkZXJEYXRhSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSAtMTsKLSAgICBzd2l0Y2goIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzsKLSAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBWT0wgaGVhZGVyCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbFBhcnNlVmlkZW9EU0koCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmcERlY1NoZWxsQ29udGV4dC0+bV9EY2ksICZwRGVjU2hlbGxDb250ZXh0LT5tX1ZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzICAgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RJbnB1dEN0cyAgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJSZW5kZXJlZEZyYW1lcyAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RSZW5kZXJlZEN0cyAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgICA9IE00T1NBX05VTEw7Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIGludGVydmFsIGJldHdlZW4gdHdvIHZpZGVvIGZyYW1lcy4KLSAgICBDSEVDSyhwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZSA+IDApOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GcmFtZUludGVydmFsTXMgPQotICAgICAgICAgICAgMTAwMC4wIC8gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotICAgIGRlY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5RVNEUywga1R5cGVFU0RTLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9FU0RTSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0RlY29kZXJfY3JlYXRlIDogaW5jb3JyZWN0IHN0cmVhbSB0eXBlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemUpOwotICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyIHNvdXJjZQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UgPSBuZXcgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlLAotICAgICAgICAodm9pZCAqKXBEZWNTaGVsbENvbnRleHQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgZmFsc2UsIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci5nZXQoKSwKLSAgICAgICAgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0KLSAgICAvLyBHZXQgdGhlIG91dHB1dCBjb2xvciBmb3JtYXQKLSAgICBzdWNjZXNzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKLSAgICAgICAga0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWNvbG9yRm9ybWF0OwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGgpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gR2V0IHRoZSBjb2xvciBjb252ZXJ0ZXIKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gbmV3IEk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICBpZiAocERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+aXNMb2FkZWQoKSkgewotICAgICAgICBkZWNvZGVyT3V0cHV0ID0gcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+Z2V0RGVjb2Rlck91dHB1dEZvcm1hdCgpOwotICAgIH0KLQotICAgIGlmIChkZWNvZGVyT3V0cHV0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgZGVsZXRlIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBOVUxMOwotICAgIH0KLQotICAgIEFMT0dJKCJkZWNvZGVyIG91dHB1dCBmb3JtYXQgPSAweCVYXG4iLCBkZWNvZGVyT3V0cHV0KTsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgYnVmZmVyIHBvb2wgZnJvbSB0aGUgbWV0YWRhdGEKLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEocERlY1NoZWxsQ29udGV4dCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCkuZ2V0KCkpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gU3RhcnQgdGhlIGdyYXBoCi0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+c3RhcnQoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSBzdGF0dXMsIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KXBEZWNTaGVsbENvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveShwRGVjU2hlbGxDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IERPTkUiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb1NvZnR3YXJlRGVjb2Rlcl9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCwgTTRPU0FfVm9pZCAqcFVzZXJEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgYm9vbCBzdWNjZXNzID0gVFJVRTsKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA9IDA7Ci0gICAgc3A8TWV0YURhdGE+IGRlY29kZXJNZXRhZGF0YSA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwU3RyZWFtSGFuZGxlciwgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZWFkZXJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24KLSAgICBTQUZFX01BTExPQyhwRGVjU2hlbGxDb250ZXh0LCBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIiKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIgPQotICAgICAgICAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0gcEFjY2Vzc1VuaXQ7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyR2xvYmFsID0gcFJlYWRlckdsb2JhbEludGVyZmFjZTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXIgPSBwUmVhZGVyRGF0YUludGVyZmFjZTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzID0gLTE7Ci0gICAgc3dpdGNoKCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlICkgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWM7Ci0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgVk9MIGhlYWRlcgotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWxQYXJzZVZpZGVvRFNJKAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJnBEZWNTaGVsbENvbnRleHQtPm1fRGNpLCAmcERlY1NoZWxsQ29udGV4dC0+bV9WaWRlb1NpemUpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0RlY29kZXJfY3JlYXRlIDogaW5jb3JyZWN0IHN0cmVhbSB0eXBlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgICAgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyAgICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0SW5wdXRDdHMgICAgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iUmVuZGVyZWRGcmFtZXMgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RSZW5kZXJlZEN0cyAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0UmVuZGVyZWRDdHMgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzICAgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgICAgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdE91dHB1dEN0cyAgICAgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICAgPSBNNE9TQV9OVUxMOwotCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHR3byB2aWRlbyBmcmFtZXMuCi0gICAgaWYocERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX2F2ZXJhZ2VGcmFtZVJhdGUgPiAwKXsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZyYW1lSW50ZXJ2YWxNcyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotICAgIGRlY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5RVNEUywga1R5cGVFU0RTLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9FU0RTSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0RlY29kZXJfY3JlYXRlIDogaW5jb3JyZWN0IHN0cmVhbSB0eXBlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemUpOwotICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyIHNvdXJjZQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UgPSBuZXcgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlLAotICAgICAgICAodm9pZCAqKXBEZWNTaGVsbENvbnRleHQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgIEFMT0dJKCJVc2luZyBzb2Z0d2FyZSBjb2RlY3Mgb25seSIpOwotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlcgotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ2xpZW50LmludGVyZmFjZSgpLAotICAgICAgICBkZWNvZGVyTWV0YWRhdGEsIGZhbHNlLCBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLE5VTEwsT01YQ29kZWM6OmtTb2Z0d2FyZUNvZGVjc09ubHkpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci5nZXQoKSwKLSAgICAgICAgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgLy8gR2V0IHRoZSBvdXRwdXQgY29sb3IgZm9ybWF0Ci0gICAgc3VjY2VzcyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgIGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhUUlVFID09IHN1Y2Nlc3MsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+ZGVjT3VwdXRDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSljb2xvckZvcm1hdDsKLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+c2V0SW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KTsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgYnVmZmVyIHBvb2wgZnJvbSB0aGUgbWV0YWRhdGEKLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEocERlY1NoZWxsQ29udGV4dCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCkuZ2V0KCkpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gU3RhcnQgdGhlIGdyYXBoCi0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+c3RhcnQoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSBzdGF0dXMsIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KXBEZWNTaGVsbENvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveShwRGVjU2hlbGxDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IERPTkUiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLSAgICBNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemU7Ci0gICAgTTRPU0FfVUludDMyKiBwTmV4dEZyYW1lQ3RzOwotICAgIE00T1NBX1VJbnQzMiAqcGxhc3REZWNvZGVkRnJhbWVDdHM7Ci0gICAgTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbCogcHJvZmlsZTsKLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8qIHBEZWNDb25mSW5mbzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb24gYmVnaW4iKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0FWQ0xhc3REZWNvZGVkRnJhbWVDVFM6Ci0gICAgICAgICAgICAgcGxhc3REZWNvZGVkRnJhbWVDdHMgPSAoTTRPU0FfVUludDMyICopIHBWYWx1ZTsKLSAgICAgICAgICAgICAqcGxhc3REZWNvZGVkRnJhbWVDdHMgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTOwotICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICAgICAgcFZlcnNpb25JbmZvID0gKE00X1ZlcnNpb25JbmZvKilwVmFsdWU7Ci0KLSAgICAgICAgICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9NQUpPUjsKLSAgICAgICAgICAgIHBWZXJzaW9uSW5mby0+bV9taW5vcj0gVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX01JTk9SOwotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uID0gVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX1JFVklTSU9OOwotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X1ZlcnNpb25JbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9WaWRlb1NpemU6Ci0gICAgICAgICAgICAvKiogT25seSBWUFMgdXNlcyB0aGlzIE9wdGlvbiBJRC4gKi8KLSAgICAgICAgICAgIHBWaWRlb1NpemUgPSAoTTRERUNPREVSX1ZpZGVvU2l6ZSopcFZhbHVlOwotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgICAgICAgICAgKGludDMyX3QqKSgmcFZpZGVvU2l6ZS0+bV91aVdpZHRoKSk7Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgKGludDMyX3QqKSgmcFZpZGVvU2l6ZS0+bV91aUhlaWdodCkpOwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbiA6IFc9JWQgSD0lZCIsCi0gICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoLCBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9OZXh0UmVuZGVyZWRGcmFtZUNUUzoKLSAgICAgICAgICAgIC8qKiBIb3cgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24uIFNGIGRlY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGlzLiAqCi0gICAgICAgICAgICAqKiBMZXQgdXMgcHJvdmlkZSBsYXN0IGRlY29kZWQgZnJhbWUgQ1RTIGFzIG9mIG5vdy4gKgotICAgICAgICAgICAgKiogT25seSBWUFMgdXNlcyB0aGlzIE9wdGlvbiBJRC4gKi8KLSAgICAgICAgICAgIHBOZXh0RnJhbWVDdHMgPSAoTTRPU0FfVUludDMyICopcFZhbHVlOwotICAgICAgICAgICAgKnBOZXh0RnJhbWVDdHMgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRERUNPREVSX01QRUc0X2tPcHRpb25JRF9EZWNvZGVyQ29uZmlnSW5mbzoKLSAgICAgICAgICAgIGlmKHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9PSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYykgewotICAgICAgICAgICAgICAgICgqKE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyopcFZhbHVlKSA9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fRGNpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBsZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbjogZW5kIHdpdGggZXJyID0gMHgleCIsIGxlcnIpOwotICAgIHJldHVybiBsZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQgKnBEZWNTaGVsbENvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopIGNvbnRleHQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uIGJlZ2luIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklkKSB7Ci0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXI6IHsKLSAgICAgICAgICAgICAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyKiBwT3V0cHV0RmlsdGVyID0KLSAgICAgICAgICAgICAgICAgICAgKE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqKSBwVmFsdWU7Ci0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9QbGFuQ29udmVydGVyRnVuY3Rpb25UeXBlKilwT3V0cHV0RmlsdGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fcEZpbHRlckZ1bmN0aW9uOwotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcEZpbHRlclVzZXJEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgcE91dHB1dEZpbHRlci0+bV9wRmlsdGVyVXNlckRhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlYmxvY2tpbmdGaWx0ZXI6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGxlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb246IGVuZCB3aXRoIGVyciA9IDB4JXgiLCBsZXJyKTsKLSAgICByZXR1cm4gbGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00T1NBX0Jvb2wgYkp1bXAsIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLSAgICBpbnQ2NF90IGxGcmFtZVRpbWU7Ci0gICAgTWVkaWFCdWZmZXIqIHBEZWNvZGVyQnVmZmVyID0gTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogcE5leHRCdWZmZXIgPSBOVUxMOwotICAgIHN0YXR1c190IGVyclN0YXR1czsKLSAgICBib29sIG5lZWRTZWVrID0gYkp1bXA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlIGJlZ2luIik7Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwRGVjU2hlbGxDb250ZXh0LT5tUmVhY2hlZEVPUyApIHsKLSAgICAgICAgLy8gRG8gbm90IGNhbGwgcmVhZCgpLCBpdCBjb3VsZCBsZWFkIHRvIGEgZnJlZXplCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgOiBFT1MgYWxyZWFkeSByZWFjaGVkIik7Ci0gICAgICAgIGxlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgfQotICAgIGlmKHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPj0gKnBUaW1lKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfZGVjb2RlOiBBbHJlYWR5IGRlY29kZWQgdXAgdG8gdGhpcyB0aW1lIENUUyA9ICVsZi4iLAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyk7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfVFJVRSA9PSBiSnVtcCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlOiBKdW1wIGNhbGxlZCIpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTID0gLTE7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cyA9IC0xOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYklucHV0RnJhbWVzKys7Ci0gICAgaWYgKDAgPiBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyl7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzID0gKnBUaW1lOwotICAgIH0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdElucHV0Q3RzID0gKnBUaW1lOwotCi0gICAgd2hpbGUgKHBEZWNvZGVyQnVmZmVyID09IE5VTEwgfHwgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyArIHRvbGVyYW5jZSA8ICpwVGltZSkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlLCBmcmFtZUNUUyA9ICVsZiwgRGVjb2RlVXBUbyA9ICVsZiIsCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTLCAqcFRpbWUpOwotCi0gICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdGFnZWZyaWdodCBkZWNvZGVyCi0gICAgICAgIGlmIChuZWVkU2VlaykgewotICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgICAgICBpbnQ2NF90IHRpbWVfdXMgPSAqcFRpbWUgKiAxMDAwOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8odGltZV91cywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwotICAgICAgICAgICAgZXJyU3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+cmVhZCgmcE5leHRCdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgIG5lZWRTZWVrID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnJTdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5yZWFkKCZwTmV4dEJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBIYW5kbGUgRU9TIGFuZCBmb3JtYXQgY2hhbmdlCi0gICAgICAgIGlmIChlcnJTdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgQUxPR1YoIkVuZCBvZiBzdHJlYW0gcmVhY2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUgIik7Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tUmVhY2hlZEVPUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBsZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIC8vIElmIHdlIGRlY29kZWQgYSBidWZmZXIgYmVmb3JlIEVPUywgd2Ugc3RpbGwgbmVlZCB0byBwdXQgaXQKLSAgICAgICAgICAgIC8vIGludG8gdGhlIHF1ZXVlLgotICAgICAgICAgICAgaWYgKHBEZWNvZGVyQnVmZmVyICYmIGJKdW1wKSB7Ci0gICAgICAgICAgICAgICAgY29weUJ1ZmZlclRvUXVldWUocERlY1NoZWxsQ29udGV4dCwgcERlY29kZXJCdWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgICAgICB9IGVsc2UgaWYgKElORk9fRk9STUFUX0NIQU5HRUQgPT0gZXJyU3RhdHVzKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2RlY29kZSA6IHNvdXJjZSByZXR1cm5zIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgICAgIGxlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dCwKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBsZXJyICkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIhISEgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlIEVSUk9SIDogIgotICAgICAgICAgICAgICAgICAgICAiVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSByZXR1cm5zIDB4JVgiLCBsZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKGVyclN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSBFUlJPUjoweCV4KCVkKSIsCi0gICAgICAgICAgICAgICAgZXJyU3RhdHVzLGVyclN0YXR1cyk7Ci0gICAgICAgICAgICBsZXJyID0gZXJyU3RhdHVzOwotICAgICAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIE9NWENvZGVjIGNsaWVudCBzaG91bGQgZXhwZWN0IHRvIHJlY2VpdmUgMC1sZW5ndGggYnVmZmVycwotICAgICAgICAvLyBhbmQgZHJvcCB0aGUgMC1sZW5ndGggYnVmZmVycy4KLSAgICAgICAgaWYgKHBOZXh0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBwTmV4dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgd2UgaGF2ZSBhIGdvb2QgbmV4dCBidWZmZXIsIHJlbGVhc2UgdGhlIHByZXZpb3VzIG9uZS4KLSAgICAgICAgaWYgKHBEZWNvZGVyQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHBEZWNvZGVyQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBwRGVjb2RlckJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZXJCdWZmZXIgPSBwTmV4dEJ1ZmZlcjsKLQotICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWVzdGFtcCBvZiBsYXN0IGRlY29kZWQgYnVmZmVyCi0gICAgICAgIHBEZWNvZGVyQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbEZyYW1lVGltZSk7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAoTTRfTWVkaWFUaW1lKShsRnJhbWVUaW1lLzEwMDApOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlLGRlY29kZWQgZnJhbWV0aW1lID0gJWxmLHNpemUgPSAlZCIsCi0gICAgICAgICAgICAoTTRfTWVkaWFUaW1lKWxGcmFtZVRpbWUsIHBEZWNvZGVyQnVmZmVyLT5zaXplKCkgKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBuZWVkIHRvIHNhdmUgYSBidWZmZXIgaWYgYkp1bXAgPT0gZmFsc2UgdG8gYSBxdWV1ZS4gVGhlc2UKLSAgICAgICAgICogYnVmZmVycyBoYXZlIGEgdGltZXN0YW1wID49IHRoZSB0YXJnZXQgdGltZSwgKnBUaW1lIChmb3IgaW5zdGFuY2UsCi0gICAgICAgICAqIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gdHdvIHZpZGVvcywgb3IgYSB0cmltbWluZyBwb3N0aW9uIGluc2lkZQotICAgICAgICAgKiBvbmUgdmlkZW8pLCBzaW5jZSB0aGV5IGFyZSBwYXJ0IG9mIHRoZSB0cmFuc2l0aW9uIGNsaXAgb3IgdGhlCi0gICAgICAgICAqIHRyaW1tZWQgdmlkZW8uCi0gICAgICAgICAqCi0gICAgICAgICAqIElmICpwVGltZSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGFueSBvZiB0aGUgZXhpc3RpbmcKLSAgICAgICAgICogdmlkZW8gZnJhbWVzLCB3ZSB3b3VsZCBsaWtlIHRvIGdldCB0aGUgYnVmZmVyIHJpZ2h0IGJlZm9yZSAqcFRpbWUKLSAgICAgICAgICogYW5kIGluIHRoZSB0cmFuc2NvZGluZyBwaHJhc2UsIHRoaXMgdmlkZW8gZnJhbWUgd2lsbCBiZSBlbmNvZGVkCi0gICAgICAgICAqIGFzIGEga2V5IGZyYW1lIGFuZCBiZWNvbWVzIHRoZSBmaXJzdCB2aWRlbyBmcmFtZSBmb3IgdGhlIHRyYW5zaXRpb24gb3IgdGhlCi0gICAgICAgICAqIHRyaW1tZWQgdmlkZW8gdG8gYmUgZ2VuZXJhdGVkLiBUaGlzIGJ1ZmZlciBtdXN0IGFsc28gYmUgcXVldWVkLgotICAgICAgICAgKgotICAgICAgICAgKi8KLSAgICAgICAgaW50NjRfdCB0YXJnZXRUaW1lTXMgPQotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgKwotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GcmFtZUludGVydmFsTXMgKwotICAgICAgICAgICAgICAgIHRvbGVyYW5jZTsKLSAgICAgICAgaWYgKCFiSnVtcCB8fCB0YXJnZXRUaW1lTXMgPiAqcFRpbWUpIHsKLSAgICAgICAgICAgIGxlcnIgPSBjb3B5QnVmZmVyVG9RdWV1ZShwRGVjU2hlbGxDb250ZXh0LCBwRGVjb2RlckJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKys7Ci0gICAgaWYgKCAwID4gcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICkgewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSAqcFRpbWU7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0T3V0cHV0Q3RzID0gKnBUaW1lOwotCi1WSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOgotICAgICpwVGltZSA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgaWYgKHBEZWNvZGVyQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgcERlY29kZXJCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgcERlY29kZXJCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU6IGVuZCB3aXRoIDB4JXgiLCBsZXJyKTsKLSAgICByZXR1cm4gbGVycjsKLX0KLQotc3RhdGljIE00T1NBX0VSUiBjb3B5QnVmZmVyVG9RdWV1ZSgKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0LAotICAgIE1lZGlhQnVmZmVyKiBwRGVjb2RlckJ1ZmZlcikgewotCi0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqIHRtcERlY0J1ZmZlcjsKLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBxdWV1ZQotICAgIGxlcnIgPSBWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHksICZ0bXBEZWNCdWZmZXIpOwotICAgIGlmIChsZXJyID09IChNNE9TQV9VSW50MzIpTTRFUlJfTk9fQlVGRkVSX0FWQUlMQUJMRSkgewotICAgICAgICBsZXJyID0gVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcigKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wsCi0gICAgICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfa0ZpbGxlZCwgJnRtcERlY0J1ZmZlcik7Ci0gICAgICAgIHRtcERlY0J1ZmZlci0+c3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5OwotICAgICAgICBsZXJyID0gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAobGVyciAhPSBNNE5PX0VSUk9SKSByZXR1cm4gbGVycjsKLQotICAgIC8vIENvbG9yIGNvbnZlcnQgb3IgY29weSBmcm9tIHRoZSBnaXZlbiBNZWRpYUJ1ZmZlciB0byBvdXIgYnVmZmVyCi0gICAgaWYgKHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIpIHsKLSAgICAgICAgaWYgKHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXItPmNvbnZlcnREZWNvZGVyT3V0cHV0VG9JNDIwKAotICAgICAgICAgICAgKHVpbnQ4X3QgKilwRGVjb2RlckJ1ZmZlci0+ZGF0YSgpLC8vID8/ICsgcERlY29kZXJCdWZmZXItPnJhbmdlX29mZnNldCgpLCAgIC8vIGRlY29kZXJCaXRzCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCwgIC8vIGRlY29kZXJXaWR0aAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0LCAgLy8gZGVjb2RlckhlaWdodAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUNyb3BSZWN0LCAgLy8gZGVjb2RlclJlY3QKLSAgICAgICAgICAgIHRtcERlY0J1ZmZlci0+cERhdGEgLyogZHN0Qml0cyAqLykgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY29udmVydERlY29kZXJPdXRwdXRUb0k0MjAgZmFpbGVkIik7Ci0gICAgICAgICAgICBsZXJyID0gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgaW50MzJfdCB3aWR0aCA9IHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoOwotICAgICAgICBpbnQzMl90IGhlaWdodCA9IHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgaW50MzJfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGludDMyX3QgdXZQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodCAvIDQ7Ci0gICAgICAgIGludDMyX3Qgb2Zmc2V0U3JjID0gMDsKLQotICAgICAgICBpZiAoKCB3aWR0aCA9PSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCApICAmJgotICAgICAgICAgICAgKCBoZWlnaHQgPT0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0ICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBUbXBCdWZmID0gKE00T1NBX01lbUFkZHI4KXBEZWNvZGVyQnVmZmVyLT5kYXRhKCkgKyBwRGVjb2RlckJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXRtcERlY0J1ZmZlci0+cERhdGEsICh2b2lkICopcFRtcEJ1ZmYsIHlQbGFuZVNpemUpOwotCi0gICAgICAgICAgICBvZmZzZXRTcmMgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKiBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQ7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGEgKyB5UGxhbmVTaXplKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKShwVG1wQnVmZiArIG9mZnNldFNyYyksIHV2UGxhbmVTaXplKTsKLQotICAgICAgICAgICAgb2Zmc2V0U3JjICs9IChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA+PiAxKSAqIChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgPj4gMSk7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGEgKyB5UGxhbmVTaXplICsgdXZQbGFuZVNpemUpLAotICAgICAgICAgICAgICAgICh2b2lkICopKHBUbXBCdWZmICsgb2Zmc2V0U3JjKSwgdXZQbGFuZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcEJ1ZmYgPSAoTTRPU0FfTWVtQWRkcjgpcERlY29kZXJCdWZmZXItPmRhdGEoKSArIHBEZWNvZGVyQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBUbXBCdWZmRHN0ID0gKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGE7Ci0gICAgICAgICAgICBpbnQzMl90IGluZGV4OwotCi0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgaGVpZ2h0OyBpbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBCdWZmRHN0LCAodm9pZCAqKXBUbXBCdWZmLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZEc3QgKz0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBUbXBCdWZmICs9IChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqICggcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0IC0gaGVpZ2h0KSk7Ci0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgaGVpZ2h0ID4+IDE7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoID4+IDEpOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmRHN0ICs9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPj4gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gKChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqIChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgLSBoZWlnaHQpKSAvIDQpOwotICAgICAgICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGhlaWdodCA+PiAxOyBpbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBCdWZmRHN0LCAodm9pZCAqKXBUbXBCdWZmLCB3aWR0aCA+PiAxKTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZkRzdCArPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmICs9IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiVmlkZW9EZWNvZGVyX2RlY29kZTogdW5leHBlY3RlZCBjb2xvciBmb3JtYXQgMHglWCIsCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0KTsKLSAgICAgICAgbGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB0bXBEZWNCdWZmZXItPmJ1ZmZDVFMgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTOwotICAgIHRtcERlY0J1ZmZlci0+c3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0ZpbGxlZDsKLSAgICB0bXBEZWNCdWZmZXItPnNpemUgPSBwRGVjb2RlckJ1ZmZlci0+c2l6ZSgpOwotCi0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9NZWRpYVRpbWUqIHBUaW1lLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHB1dFBsYW5lLAotICAgICAgICBNNE9TQV9Cb29sIGJGb3JjZVJlbmRlcikgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopIGNvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIGxpbmRleCwgaTsKLSAgICBNNE9TQV9VSW50OCogcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSB0bXBQbGFuZUluLCB0bXBQbGFuZU91dDsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiBwVG1wVklERU9FRElUT1JCdWZmZXIsICpwUmVuZGVyVklERU9FRElUT1JCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBNNF9NZWRpYVRpbWUgY2FuZGlkYXRlVGltZVN0YW1wID0gLTE7Ci0gICAgTTRPU0FfQm9vbCBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFRpbWUsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT3V0cHV0UGxhbmUsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBhbHJlYWR5IGFsbG9jYXRlZCwganVzdCBjb3B5IHRoZSBkYXRhCi0gICAgaWYgKCAoKnBUaW1lIDw9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cykgJiYKLSAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PSBiRm9yY2VSZW5kZXIpICkgewotICAgICAgICBBTE9HVigiVklERU9FRElUT1JfVklERU9fcmVuZGVyIEZyYW1lIGluIHRoZSBwYXN0Iik7Ci0gICAgICAgIGVyciA9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FOwotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfcmVuZGVyOiBsYXN0UmVuZGVyZWQgdGltZSA9ICVsZixyZXF1ZXN0ZWQgcmVuZGVyIHRpbWUgPSAiCi0gICAgICAgICIlbGYiLCBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMsICpwVGltZSk7Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBidWZmZXIgYXBwcm9wcmlhdGUgZm9yIHJlbmRlcmluZy4gICovCi0gICAgZm9yIChpPTA7IGkgPCBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sLT5OQjsgaSsrKSB7Ci0gICAgICAgIHBUbXBWSURFT0VESVRPUkJ1ZmZlciA9ICZwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sXAotICAgICAgICAgICAgLT5wTlhQQnVmZmVyW2ldOwotICAgICAgICBpZiAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5zdGF0ZSA9PSBWSURFT0VESVRPUl9CVUZGRVJfa0ZpbGxlZCkgewotICAgICAgICAgICAgLyoqIEZyZWUgYWxsIHRob3NlIGJ1ZmZlcnMgb2xkZXIgdGhhbiBsYXN0IHJlbmRlcmVkIGZyYW1lLiAqLwotICAgICAgICAgICAgaWYgKHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+YnVmZkNUUyA8IHBEZWNTaGVsbENvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9sYXN0UmVuZGVyQ3RzKSB7Ci0gICAgICAgICAgICAgICAgcFRtcFZJREVPRURJVE9SQnVmZmVyLT5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKiBHZXQgdGhlIGJ1ZmZlciB3aXRoIGFwcHJvcHJpYXRlIHRpbWVzdGFtcCAgKi8KLSAgICAgICAgICAgIGlmICggKHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+YnVmZkNUUyA+PSBwRGVjU2hlbGxDb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgICAgIG1fbGFzdFJlbmRlckN0cykgJiYKLSAgICAgICAgICAgICAgICAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTIDw9ICpwVGltZSkgJiYKLSAgICAgICAgICAgICAgICAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTID4gY2FuZGlkYXRlVGltZVN0YW1wKSkgewotICAgICAgICAgICAgICAgIGJGb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcFJlbmRlclZJREVPRURJVE9SQnVmZmVyID0gcFRtcFZJREVPRURJVE9SQnVmZmVyOwotICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVRpbWVTdGFtcCA9IHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+YnVmZkNUUzsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9EZWNvZGVyX3JlbmRlcjogZm91bmQgYSBidWZmZXIgd2l0aCB0aW1lc3RhbXAgPSAlbGYiLAotICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVUaW1lU3RhbXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChNNE9TQV9GQUxTRSA9PSBiRm91bmQpIHsKLSAgICAgICAgZXJyID0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUU7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIDMgb3VwdXQgJWQgJWQgJWQgJWQiLAotICAgICAgICBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCwgcE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0LAotICAgICAgICBwT3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0LCBwT3V0cHV0UGxhbmVbMF0udV9zdHJpZGUpOwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzID0gY2FuZGlkYXRlVGltZVN0YW1wOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyICkgewotICAgICAgICAvLyBGaWx0ZXJpbmcgd2FzIHJlcXVlc3RlZAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSB0bXBQbGFuZVszXTsKLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgb3V0cHV0IGltYWdlIGZvciBjb252ZXJzaW9uCi0gICAgICAgIHRtcFBsYW5lWzBdLnVfd2lkdGggICA9Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aDsKLSAgICAgICAgdG1wUGxhbmVbMF0udV9oZWlnaHQgID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgdG1wUGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgdG1wUGxhbmVbMF0udV9zdHJpZGUgID0gdG1wUGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgdG1wUGxhbmVbMF0ucGFjX2RhdGEgID0gKE00VklGSV9VSW50OCopcFJlbmRlclZJREVPRURJVE9SQnVmZmVyLT5wRGF0YTsKLSAgICAgICAgdG1wUGxhbmVbMV0udV93aWR0aCAgID0gdG1wUGxhbmVbMF0udV93aWR0aC8yOwotICAgICAgICB0bXBQbGFuZVsxXS51X2hlaWdodCAgPSB0bXBQbGFuZVswXS51X2hlaWdodC8yOwotICAgICAgICB0bXBQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB0bXBQbGFuZVsxXS51X3N0cmlkZSAgPSB0bXBQbGFuZVswXS51X3N0cmlkZS8yOwotICAgICAgICB0bXBQbGFuZVsxXS5wYWNfZGF0YSAgPSB0bXBQbGFuZVswXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAodG1wUGxhbmVbMF0udV9zdHJpZGUgKiB0bXBQbGFuZVswXS51X2hlaWdodCk7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfd2lkdGggICA9IHRtcFBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfaGVpZ2h0ICA9IHRtcFBsYW5lWzFdLnVfaGVpZ2h0OwotICAgICAgICB0bXBQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB0bXBQbGFuZVsyXS51X3N0cmlkZSAgPSB0bXBQbGFuZVsxXS51X3N0cmlkZTsKLSAgICAgICAgdG1wUGxhbmVbMl0ucGFjX2RhdGEgID0gdG1wUGxhbmVbMV0ucGFjX2RhdGEgKwotICAgICAgICAgICAgKHRtcFBsYW5lWzFdLnVfc3RyaWRlICogdG1wUGxhbmVbMV0udV9oZWlnaHQpOwotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgdyA9ICVkIEggPSAlZCIsCi0gICAgICAgICAgICB0bXBQbGFuZVswXS51X3dpZHRoLHRtcFBsYW5lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyKE00T1NBX05VTEwsICZ0bXBQbGFuZVswXSwgcE91dHB1dFBsYW5lKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBKdXN0IGNvcHkgdGhlIFlVVjQyMFAgYnVmZmVyCi0gICAgICAgIE00T1NBX01lbUFkZHI4IHRlbXBCdWZmUHRyID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwUmVuZGVyVklERU9FRElUT1JCdWZmZXItPnBEYXRhOwotICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFdpZHRoID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoOwotICAgICAgICBNNE9TQV9VSW50MzIgdGVtcEhlaWdodCA9Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQ7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopIHBPdXRwdXRQbGFuZVswXS5wYWNfZGF0YSwgKHZvaWQgKil0ZW1wQnVmZlB0ciwKLSAgICAgICAgICAgIHRlbXBXaWR0aCAqIHRlbXBIZWlnaHQpOwotICAgICAgICB0ZW1wQnVmZlB0ciArPSAodGVtcFdpZHRoICogdGVtcEhlaWdodCk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSBwT3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEsICh2b2lkICopdGVtcEJ1ZmZQdHIsCi0gICAgICAgICAgICAodGVtcFdpZHRoLzIpICogKHRlbXBIZWlnaHQvMikpOwotICAgICAgICB0ZW1wQnVmZlB0ciArPSAoKHRlbXBXaWR0aC8yKSAqICh0ZW1wSGVpZ2h0LzIpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopIHBPdXRwdXRQbGFuZVsyXS5wYWNfZGF0YSwgKHZvaWQgKil0ZW1wQnVmZlB0ciwKLSAgICAgICAgICAgICh0ZW1wV2lkdGgvMikgKiAodGVtcEhlaWdodC8yKSk7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iUmVuZGVyZWRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RSZW5kZXJlZEN0cyApIHsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0UmVuZGVyZWRDdHMgPSAqcFRpbWU7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0UmVuZGVyZWRDdHMgPSAqcFRpbWU7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICAqcFRpbWUgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHM7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiBwRGVjb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0KLSAgICBwRGVjb2RlckludGVyZmFjZSA9IChNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgc2l6ZW9mKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSksIE00REVDT0RFUl9FWFRFUk5BTCwKLSAgICAgICAgKE00T1NBX0NoYXIqKSJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UiICk7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwRGVjb2RlclR5cGUgPSBkZWNvZGVyVHlwZTsKLQotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RDcmVhdGUgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlc3Ryb3kgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3k7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdEdldE9wdGlvbiA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbjsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0U2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZWNvZGUgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFJlbmRlciAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcjsKLQotICAgICpwRGVjSW50ZXJmYWNlID0gKE00T1NBX0NvbnRleHQpcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZShNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqIHBEZWNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLQotICAgIHBEZWNvZGVySW50ZXJmYWNlID0gKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKSwgTTRERUNPREVSX0VYVEVSTkFMLAotICAgICAgICAoTTRPU0FfQ2hhciopIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdENyZWF0ZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9Tb2Z0d2FyZURlY29kZXJfY3JlYXRlOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZXN0cm95ICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95OwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RHZXRPcHRpb24gPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb247Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFNldE9wdGlvbiA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3NldE9wdGlvbjsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0RGVjb2RlICAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RSZW5kZXIgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXI7Ci0KLSAgICAqcERlY0ludGVyZmFjZSA9IChNNE9TQV9Db250ZXh0KXBEZWNvZGVySW50ZXJmYWNlOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNCwKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlKE00REVDT0RFUl9rVmlkZW9UeXBlQVZDLAotICAgICAgICBwRGVjb2RlclR5cGUsIHBEZWNJbnRlcmZhY2UpOwotCi19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlKE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZV9IMjY0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci0KLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoCi0gICAgTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMqKiBkZWNvZGVycykgewotICAgIHJldHVybiBxdWVyeVZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhkZWNvZGVycyk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3ODc2ODAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZW5jb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX1ZJREVPRU5DT0RFUiIKLQotLyoqKioqKioqKioqKioqKioqKioKLSAqICAgICBIRUFERVJTICAgICAqCi0gKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNZWRpYUJ1ZmZlclB1bGxlci5oIgotI2luY2x1ZGUgPEk0MjBDb2xvckNvbnZlcnRlci5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+Ci0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKgotICogICBERUZJTklUSU9OUyAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIEZvcmNlIHVzaW5nIGhhcmR3YXJlIGVuY29kZXIKLSNkZWZpbmUgVklERU9FRElUT1JfRk9SQ0VDT0RFQyBrSGFyZHdhcmVDb2RlY3NPbmx5Ci0KLSNpZiAhZGVmaW5lZChWSURFT0VESVRPUl9GT1JDRUNPREVDKQotICAgICNlcnJvciAiQ2Fubm90IGZvcmNlIERTSSByZXRyaWV2YWwgaWYgY29kZWMgdHlwZSBpcyBub3QgZml4ZWQiCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIFNPVVJDRSBDTEFTUyAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgaW50MzJfdCBzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IGdldE51bWJlck9mQnVmZmVyc0luUXVldWUoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0cnVjdCBNZWRpYUJ1ZmZlckNoYWluIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXI7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXh0TGluazsKLSAgICAgICAgfTsKLSAgICAgICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgICAgICBDUkVBVEVELAotICAgICAgICAgICAgU1RBUlRFRCwKLSAgICAgICAgICAgIEVSUk9SCi0gICAgICAgIH07Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLQotICAgICAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKGNvbnN0IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlICYpOwotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSAmb3BlcmF0b3I9KAotICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlICYpOwotCi0gICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG1MYXN0QnVmZmVyTGluazsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgbU5iQnVmZmVyOwotICAgICAgICBib29sICAgICAgICAgICAgICBtSXNFT1M7Ci0gICAgICAgIFN0YXRlICAgICAgICAgICAgIG1TdGF0ZTsKLSAgICAgICAgc3A8TWV0YURhdGE+ICAgICAgbUVuY0Zvcm1hdDsKLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgbUxvY2s7Ci0gICAgICAgIENvbmRpdGlvbiAgICAgICAgIG1CdWZmZXJDb25kOwotfTsKLQotc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpDcmVhdGUoCi0gICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpIHsKLQotICAgIHNwPFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKGZvcm1hdCk7Ci0gICAgcmV0dXJuIGFTb3VyY2U7Ci19Ci0KLVZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSgKLSAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk6Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsoTlVMTCksCi0gICAgICAgIG1MYXN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbU5iQnVmZmVyKDApLAotICAgICAgICBtSXNFT1MoZmFsc2UpLAotICAgICAgICBtU3RhdGUoQ1JFQVRFRCksCi0gICAgICAgIG1FbmNGb3JtYXQoZm9ybWF0KSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSIpOwotfQotCi1WaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6flZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKCkgewotCi0gICAgLy8gU2FmZXR5IGNsZWFuIHVwCi0gICAgaWYoIFNUQVJURUQgPT0gbVN0YXRlICkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQoKSBiZWdpbiIpOwotCi0gICAgaWYoIENSRUFURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0YXJ0OiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotICAgIG1TdGF0ZSA9IFNUQVJURUQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0YXJ0KCkgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3AoKSBiZWdpbiIpOwotCi0gICAgaWYoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3A6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIgY2hhaW4KLSAgICBpbnQzMl90IGkgPSAwOwotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIHRtcExpbmsgPSBOVUxMOwotICAgIHdoaWxlKCBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBpKys7Ci0gICAgICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0gICAgICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBpKTsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotCi0gICAgbVN0YXRlID0gQ1JFQVRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCgpIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbUVuY0Zvcm1hdDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgcmVhZE9wdGlvbnM7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQoKSBiZWdpbiIpOwotCi0gICAgaWYgKCBTVEFSVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpyZWFkOiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgd2hpbGUgKG1GaXJzdEJ1ZmZlckxpbmsgPT0gTlVMTCAmJiAhbUlzRU9TKSB7Ci0gICAgICAgIG1CdWZmZXJDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIC8vIEVuZCBvZiBzdHJlYW0/Ci0gICAgaWYgKG1GaXJzdEJ1ZmZlckxpbmsgPT0gTlVMTCkgewotICAgICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpyZWFkIDogRU9TIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBjaGFpbgotICAgICpidWZmZXIgPSBtRmlyc3RCdWZmZXJMaW5rLT5idWZmZXI7Ci0gICAgdG1wTGluayA9IG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgbUZpcnN0QnVmZmVyTGluayA9IG1GaXJzdEJ1ZmZlckxpbmstPm5leHRMaW5rOwotCi0gICAgaWYgKCBOVUxMID09IG1GaXJzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluayA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIG1OYkJ1ZmZlci0tOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpyZWFkKCkgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50MzJfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKCkgYmVnaW4iKTsKLQotICAgIGlmKCBOVUxMID09IGJ1ZmZlciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciA6IHJlYWNoZWQgRU9TIik7Ci0gICAgICAgIG1Jc0VPUyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbmV3TGluayA9IG5ldyBNZWRpYUJ1ZmZlckNoYWluOwotICAgICAgICBuZXdMaW5rLT5idWZmZXIgPSBidWZmZXI7Ci0gICAgICAgIG5ld0xpbmstPm5leHRMaW5rID0gTlVMTDsKLSAgICAgICAgaWYoIE5VTEwgIT0gbUxhc3RCdWZmZXJMaW5rICkgewotICAgICAgICAgICAgbUxhc3RCdWZmZXJMaW5rLT5uZXh0TGluayA9IG5ld0xpbms7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbmV3TGluazsKLSAgICAgICAgfQotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgICAgICBtTmJCdWZmZXIrKzsKLSAgICB9Ci0gICAgbUJ1ZmZlckNvbmQuc2lnbmFsKCk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcigpIGVuZCIpOwotICAgIHJldHVybiBtTmJCdWZmZXI7Ci19Ci0KLWludDMyX3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OmdldE51bWJlck9mQnVmZmVyc0luUXVldWUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbU5iQnVmZmVyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU3RhZ2VGcmlnaHQgdmlkZW8gZW5jb2RlcgotICogICAgICAgICAgIHNoZWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBDUkVBVEVEICAgPSAweDEsCi0gICAgT1BFTkVEICAgID0gMHgyLAotICAgIFNUQVJURUQgICA9IDB4NCwKLSAgICBCVUZGRVJJTkcgPSAweDgsCi0gICAgUkVBRElORyAgID0gMHgxMAotfSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9TdGF0ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX1N0YXRlICAgICBtU3RhdGU7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7Ci0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgICAgICAgIG1Xcml0ZXJEYXRhSW50ZXJmYWNlOwotICAgIE00VlBQX2FwcGx5X2ZjdCogICAgICAgICAgICAgICAgICBtUHJlUHJvY0Z1bmN0aW9uOwotICAgIE00VlBQX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICBtUHJlUHJvY0NvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgICAgICAgICAgIG1BY2Nlc3NVbml0OwotICAgIE00RU5DT0RFUl9QYXJhbXMqICAgICAgICAgICAgICAgICBtQ29kZWNQYXJhbXM7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAgICAgICAgICAgICAgICAgIG1IZWFkZXI7Ci0gICAgSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFVfZmN0KiAgIG1IMjY0TkFMVVBvc3RQcm9jZXNzRmN0OwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICBtSDI2NE5BTFVQb3N0UHJvY2Vzc0N0eDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgbUxhc3RDVFM7Ci0gICAgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IG1FbmNvZGVyU291cmNlOwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50OwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICAgICAgICBtRW5jb2RlcjsKLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAgICAgICAgICAgICAgbUVuY29kZXJDb2xvckZvcm1hdDsKLSAgICBNZWRpYUJ1ZmZlclB1bGxlciogICAgICAgICAgICAgICAgbVB1bGxlcjsKLSAgICBJNDIwQ29sb3JDb252ZXJ0ZXIqICAgICAgICAgICAgICAgbUk0MjBDb2xvckNvbnZlcnRlcjsKLQotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJJbnB1dEZyYW1lczsKLSAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0SW5wdXRDdHM7Ci0gICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0SW5wdXRDdHM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0T3V0cHV0Q3RzOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE91dHB1dEN0czsKLQotICAgIE1lZGlhUHJvZmlsZXMgKm1WaWRlb0VkaXRvclByb2ZpbGU7Ci0gICAgaW50MzJfdCBtTWF4UHJlZmV0Y2hGcmFtZXM7Ci19IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKgotICogICAgICBUT09MUyAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0koTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqICBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIGludDMyX3QgbmJCdWZmZXIgPSAwOwotICAgIGludDMyX3Qgc3RyaWRlID0gMDsKLSAgICBpbnQzMl90IGhlaWdodCA9IDA7Ci0gICAgaW50MzJfdCBmcmFtZXJhdGUgPSAwOwotICAgIGludDMyX3QgaXNDb2RlY0NvbmZpZyA9IDA7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIHVpbnQzMl90IGNvZGVjRmxhZ3MgPSAwOwotICAgIE1lZGlhQnVmZmVyKiBpbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IGVuY29kZXJTb3VyY2UgPSBOVUxMOwotICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gTlVMTDs7Ci0gICAgT01YQ2xpZW50IGNsaWVudDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IG1ldGFEYXRhLmdldCgpLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKENSRUFURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBlbmNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OkNyZWF0ZShtZXRhRGF0YSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBlbmNvZGVyU291cmNlLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gY2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0gICAgLy8gVklERU9FRElUT1JfRk9SQ0VDT0RFQyBNVVNUIGJlIGRlZmluZWQgaGVyZQotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0gICAgZW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoY2xpZW50LmludGVyZmFjZSgpLCBtZXRhRGF0YSwgdHJ1ZSwKLSAgICAgICAgZW5jb2RlclNvdXJjZSwgTlVMTCwgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBlbmNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGZha2UgZnJhbWVzIGFuZCByZXRyaWV2ZSB0aGUgRFNJCi0gICAgICovCi0gICAgLy8gU2VuZCBhIGZha2UgZnJhbWUgdG8gdGhlIHNvdXJjZQotICAgIG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgICAgICZzdHJpZGUpOwotICAgIG1ldGFEYXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgICAgICZoZWlnaHQpOwotICAgIG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZmcmFtZXJhdGUpOwotICAgIHNpemUgPSAoc2l6ZV90KShzdHJpZGUqaGVpZ2h0KjMpLzI7Ci0gICAgaW5wdXRCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoc2l6ZSk7Ci0gICAgaW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgMCk7Ci0gICAgbmJCdWZmZXIgPSBlbmNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihpbnB1dEJ1ZmZlcik7Ci0gICAgZW5jb2RlclNvdXJjZS0+c3RvcmVCdWZmZXIoTlVMTCk7IC8vIFNpZ25hbCBFT1MKLQotICAgIC8vIENhbGwgcmVhZCBvbmNlIHRvIGdldCB0aGUgRFNJCi0gICAgcmVzdWx0ID0gZW5jb2Rlci0+c3RhcnQoKTs7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgcmVzdWx0ID0gZW5jb2Rlci0+cmVhZCgmb3V0cHV0QnVmZmVyLCBOVUxMKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhvdXRwdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoCi0gICAgICAgIGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY0NvbmZpZykgJiYgaXNDb2RlY0NvbmZpZywgTTRFUlJfU1RBVEUpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCA9PSBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwgTTRFUlJfU1RBVEUpOwotICAgIGlmICggTTRFTkNPREVSX2tIMjY0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCApIHsKLSAgICAgICAgLy8gRm9yIEgyNjQsIGZvcm1hdCB0aGUgRFNJCi0gICAgICAgIHJlc3VsdCA9IGJ1aWxkQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICAodWludDhfdCoqKSgmKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmKSksCi0gICAgICAgICAgICAoc2l6ZV90KikoJihwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSkpLAotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW91dHB1dEJ1ZmZlci0+ZGF0YSgpICsgb3V0cHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIGVuY29kZXItPmdldEZvcm1hdCgpLmdldCgpKTsKLSAgICAgICAgb3V0cHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEZvciBNUEVHNCwganVzdCBjb3B5IHRoZSBEU0kKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilvdXRwdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwgTTRPU0FfSW50OCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplLCAiRW5jb2RlciBoZWFkZXIiKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYsCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKG91dHB1dEJ1ZmZlci0+ZGF0YSgpKStvdXRwdXRCdWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplKTsKLSAgICAgICAgb3V0cHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgcmVzdWx0ID0gZW5jb2Rlci0+c3RvcCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi1jbGVhblVwOgotICAgIC8vIERlc3Ryb3kgdGhlIGdyYXBoCi0gICAgaWYgKCBlbmNvZGVyICE9IE5VTEwgKSB7IGVuY29kZXIuY2xlYXIoKTsgfQotICAgIGNsaWVudC5kaXNjb25uZWN0KCk7Ci0gICAgaWYgKCBlbmNvZGVyU291cmNlICE9IE5VTEwgKSB7IGVuY29kZXJTb3VyY2UuY2xlYXIoKTsgfQotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKENSRUFURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIFJlbGVhc2UgbWVtb3J5Ci0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmKTsKLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsCi0gICAgICAgIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgaW50IGVuY29kZXJJbnB1dCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBiZWdpbjogZm9ybWF0ICAlZCIsIGZvcm1hdCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwV3JpdGVyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWUFBmY3QsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwVlBQY3R4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IENSRUFURUQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ID0gZm9ybWF0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UgPSBwV3JpdGVyRGF0YUludGVyZmFjZTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QcmVQcm9jRnVuY3Rpb24gPSBwVlBQZmN0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NDb250ZXh0ID0gcFZQUGN0eHQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyID0gTlVMTDsKLQotICAgIC8vIEdldCBjb2xvciBjb252ZXJ0ZXIgYW5kIGRldGVybWluZSBlbmNvZGVyIGlucHV0IGZvcm1hdAotICAgIHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IG5ldyBJNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+aXNMb2FkZWQoKSkgewotICAgICAgICBlbmNvZGVySW5wdXQgPSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXItPmdldEVuY29kZXJJbnB1dEZvcm1hdCgpOwotICAgIH0KLSAgICBpZiAoZW5jb2RlcklucHV0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgZGVsZXRlIHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gTlVMTDsKLSAgICB9Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlckNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWVuY29kZXJJbnB1dDsKLSAgICBBTE9HSSgiZW5jb2RlciBpbnB1dCBmb3JtYXQgPSAweCVYXG4iLCBlbmNvZGVySW5wdXQpOwotCi0gICAgKnBDb250ZXh0ID0gcEVuY29kZXJDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cChwRW5jb2RlckNvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfSDI2MyhNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICAgICAgICB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa0gyNjMsIHBDb250ZXh0LAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9NUEVHNChNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICAgICAgICB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa01QRUc0LCBwQ29udGV4dCwKLSAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UsIHBWUFBmY3QsIHBWUFBjdHh0LCBwRXh0ZXJuYWxBUEksIHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfSDI2NChNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICAgICAgICB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa0gyNjQsIHBDb250ZXh0LAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9QRU5FRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gUmVsZWFzZSBtZW1vcnkKLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMpOwotCi0gICAgLy8gRGVzdHJveSB0aGUgZ3JhcGgKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmNsZWFyKCk7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLmNsZWFyKCk7Ci0KLSAgICBkZWxldGUgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlciA9IE5VTEw7Ci0KLSAgICBkZWxldGUgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IE5VTEw7Ci0KLSAgICAvLyBTZXQgdGhlIG5ldyBzdGF0ZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQ1JFQVRFRDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4oTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSwgTTRPU0FfVm9pZCogcFBhcmFtcykgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRFTkNPREVSX1BhcmFtcyogcENvZGVjUGFyYW1zID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBzcDxNZXRhRGF0YT4gZW5jb2Rlck1ldGFkYXRhID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiBtaW1lID0gTlVMTDsKLSAgICBpbnQzMl90IGlQcm9maWxlID0gMDsKLSAgICBpbnQzMl90IGlMZXZlbCA9IDA7Ci0KLSAgICBpbnQzMl90IGlGcmFtZVJhdGUgPSAwOwotICAgIHVpbnQzMl90IGNvZGVjRmxhZ3MgPSAwOwotCi0gICAgQUxPR1YoIj4+PiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQVUsICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQYXJhbXMsICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBDb2RlY1BhcmFtcyA9IChNNEVOQ09ERVJfUGFyYW1zKilwUGFyYW1zOwotICAgIFZJREVPRURJVE9SX0NIRUNLKENSRUFURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbnRleHQgaW5pdGlhbGl6YXRpb24KLSAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0ID0gcEFVOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVZpZGVvRWRpdG9yUHJvZmlsZSA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTWF4UHJlZmV0Y2hGcmFtZXMgPQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1WaWRlb0VkaXRvclByb2ZpbGUtPmdldFZpZGVvRWRpdG9yQ2FwUGFyYW1CeU5hbWUoCi0gICAgICAgICJtYXhQcmVmZXRjaFlVVkZyYW1lcyIpOwotCi0gICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMsIE00RU5DT0RFUl9QYXJhbXMsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRW5jb2RlciIpOwotCi0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+SW5wdXRGb3JtYXQgPSBwQ29kZWNQYXJhbXMtPklucHV0Rm9ybWF0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5JbnB1dEZyYW1lV2lkdGggPQotICAgICAgICBwQ29kZWNQYXJhbXMtPklucHV0RnJhbWVXaWR0aDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+SW5wdXRGcmFtZUhlaWdodCA9Ci0gICAgICAgIHBDb2RlY1BhcmFtcy0+SW5wdXRGcmFtZUhlaWdodDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCA9IHBDb2RlY1BhcmFtcy0+RnJhbWVXaWR0aDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQgPSBwQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5CaXRyYXRlID0gcENvZGVjUGFyYW1zLT5CaXRyYXRlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVJhdGUgPSBwQ29kZWNQYXJhbXMtPkZyYW1lUmF0ZTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ID0gcENvZGVjUGFyYW1zLT5Gb3JtYXQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPnZpZGVvUHJvZmlsZSA9IHBDb2RlY1BhcmFtcy0+dmlkZW9Qcm9maWxlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT52aWRlb0xldmVsPSBwQ29kZWNQYXJhbXMtPnZpZGVvTGV2ZWw7Ci0KLSAgICAvLyBDaGVjayBvdXRwdXQgZm9ybWF0IGNvbnNpc3RlbmN5IGFuZCByZXNvbHV0aW9uCi0gICAgVklERU9FRElUT1JfQ0hFQ0soCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0LAotICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKDAgPT0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGggICUgMTYsCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soMCA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQgJSAxNiwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0KLSAgICAvLyBDcmVhdGUgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGVuY29kZXIKLSAgICBlbmNvZGVyTWV0YWRhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIG1pbWUgICAgID0gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVBFRzQ6Ci0gICAgICAgICAgICBtaW1lICAgICA9IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjY0OgotICAgICAgICAgICAgbWltZSAgICAgPSBNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9FbmNvZGVyX29wZW4gOiBpbmNvcnJlY3QgaW5wdXQgZm9ybWF0IiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlQcm9maWxlID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPnZpZGVvUHJvZmlsZTsKLSAgICBpTGV2ZWwgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9MZXZlbDsKLSAgICBBTE9HVigiRW5jb2RlciBtaW1lICVzIHByb2ZpbGUgJWQsIGxldmVsICVkIiwKLSAgICAgICAgbWltZSxpUHJvZmlsZSwgaUxldmVsKTsKLSAgICBBTE9HVigiRW5jb2RlciB3ICVkLCBoICVkLCBiaXRyYXRlICVkLCBmcHMgJWQiLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0LAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lUmF0ZSk7Ci0gICAgQ0hFQ0soaVByb2ZpbGUgIT0gMHg3ZmZmZmZmZik7Ci0gICAgQ0hFQ0soaUxldmVsICE9IDB4N2ZmZmZmZmYpOwotCi0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBpUHJvZmlsZSk7Ci0gICAgLy9GSVhNRToKLSAgICAvLyBUZW1wOiBEbyBub3Qgc2V0IHRoZSBsZXZlbCBmb3IgTXBlZzQgLyBILjI2MyBFbmMKLSAgICAvLyBhcyBPTVguTnZpZGlhLm1wNC5lbmNvZGVyIGFuZCBPTVguTnZpZGlhLmgyNjMuZW5jb2RlcgotICAgIC8vIHJldHVybiAweDgwMDAxMDE5Ci0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgPT0gTTRFTkNPREVSX2tIMjY0KSB7Ci0gICAgICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIGlMZXZlbCk7Ci0gICAgfQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQpOwotCi0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVSYXRlICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rNV9GUFM6ICAgIGlGcmFtZVJhdGUgPSA1OyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2s3XzVfRlBTOiAgaUZyYW1lUmF0ZSA9IDg7ICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEwX0ZQUzogICBpRnJhbWVSYXRlID0gMTA7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTJfNV9GUFM6IGlGcmFtZVJhdGUgPSAxMzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2sxNV9GUFM6ICAgaUZyYW1lUmF0ZSA9IDE1OyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazIwX0ZQUzogICBpRnJhbWVSYXRlID0gMjA7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjVfRlBTOiAgIGlGcmFtZVJhdGUgPSAyNTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2szMF9GUFM6ICAgaUZyYW1lUmF0ZSA9IDMwOyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1ZBUklBQkxFX0ZQUzoKLSAgICAgICAgICAgIGlGcmFtZVJhdGUgPSAzMDsKLSAgICAgICAgICAgIEFMT0dJKCJGcmFtZSByYXRlIHNldCB0byBNNEVOQ09ERVJfa1ZBUklBQkxFX0ZQUzogc2V0IHRvIDMwIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFOgotICAgICAgICAgICAgaUZyYW1lUmF0ZSA9IDMwOwotICAgICAgICAgICAgQUxPR0koIkZyYW1lIHJhdGUgc2V0IHRvIE00RU5DT0RFUl9rVVNFX1RJTUVTQ0FMRTogIHNldCB0byAzMCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9FbmNvZGVyX29wZW46aW5jb3JyZWN0IGZyYW1lcmF0ZSIsCi0gICAgICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgaUZyYW1lUmF0ZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgMSk7Ci0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlckNvbG9yRm9ybWF0KTsKLQotICAgIGlmIChwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICE9IE00RU5DT0RFUl9rSDI2MykgewotICAgICAgICAvLyBHZXQgdGhlIGVuY29kZXIgRFNJCi0gICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSShwRW5jb2RlckNvbnRleHQsIGVuY29kZXJNZXRhZGF0YSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgZW5jb2Rlck1ldGFkYXRhKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0jaWZkZWYgVklERU9FRElUT1JfRk9SQ0VDT0RFQwotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0jZW5kaWYgLyogVklERU9FRElUT1JfRk9SQ0VDT0RFQyAqLwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuaW50ZXJmYWNlKCksIGVuY29kZXJNZXRhZGF0YSwgdHJ1ZSwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZSwgTlVMTCwgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gOiBET05FIik7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyID0gbmV3IE1lZGlhQnVmZmVyUHVsbGVyKAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyKTsKLQotICAgIC8vIFNldCB0aGUgbmV3IHN0YXRlCi0gICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBPUEVORUQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRG91YmxlIEN0cywKLSAgICAgICAgTTRPU0FfQm9vbCBiUmVhY2hlZEVPUykgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcE91dFBsYW5lWzNdOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotICAgIGludDMyX3QgbmJCdWZmZXIgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBiZWdpbjogY3RzICAlZiIsIEN0cyk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcE91dFBsYW5lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwT3V0UGxhbmVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBPdXRQbGFuZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICBpZiAoIE00T1NBX0ZBTFNFID09IGJSZWFjaGVkRU9TICkgewotICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZVkgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCAqCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzaXplVSA9IHNpemVZID4+IDI7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzaXplICA9IHNpemVZICsgMipzaXplVTsKLSAgICAgICAgTTRPU0FfVUludDgqIHBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3Qpc2l6ZSk7Ci0gICAgICAgIHBEYXRhID0gKE00T1NBX1VJbnQ4KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgb3V0cHV0IGltYWdlIGZvciBwcmUtcHJvY2Vzc2luZwotICAgICAgICBwT3V0UGxhbmVbMF0udV93aWR0aCAgID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGg7Ci0gICAgICAgIHBPdXRQbGFuZVswXS51X2hlaWdodCAgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0gICAgICAgIHBPdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwT3V0UGxhbmVbMF0udV9zdHJpZGUgID0gcE91dFBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X3dpZHRoICAgPSBwT3V0UGxhbmVbMF0udV93aWR0aC8yOwotICAgICAgICBwT3V0UGxhbmVbMV0udV9oZWlnaHQgID0gcE91dFBsYW5lWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwT3V0UGxhbmVbMV0udV9zdHJpZGUgID0gcE91dFBsYW5lWzBdLnVfc3RyaWRlLzI7Ci0gICAgICAgIHBPdXRQbGFuZVsyXS51X3dpZHRoICAgPSBwT3V0UGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfaGVpZ2h0ICA9IHBPdXRQbGFuZVsxXS51X2hlaWdodDsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBPdXRQbGFuZVsyXS51X3N0cmlkZSAgPSBwT3V0UGxhbmVbMV0udV9zdHJpZGU7Ci0KLSAgICAgICAgcE91dFBsYW5lWzBdLnBhY19kYXRhID0gcERhdGE7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS5wYWNfZGF0YSA9IHBEYXRhICsgc2l6ZVk7Ci0gICAgICAgIHBPdXRQbGFuZVsyXS5wYWNfZGF0YSA9IHBEYXRhICsgc2l6ZVkgKyBzaXplVTsKLQotICAgICAgICAvLyBBcHBseSBwcmUtcHJvY2Vzc2luZwotICAgICAgICBlcnIgPSBwRW5jb2RlckNvbnRleHQtPm1QcmVQcm9jRnVuY3Rpb24oCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QcmVQcm9jQ29udGV4dCwgTTRPU0FfTlVMTCwgcE91dFBsYW5lKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgLy8gQ29udmVydCBNZWRpYUJ1ZmZlciB0byB0aGUgZW5jb2RlciBpbnB1dCBmb3JtYXQgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGlmIChwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIpIHsKLSAgICAgICAgICAgIEk0MjBDb2xvckNvbnZlcnRlciogY29udmVydGVyID0gcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotICAgICAgICAgICAgaW50IGFjdHVhbFdpZHRoID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGg7Ci0gICAgICAgICAgICBpbnQgYWN0dWFsSGVpZ2h0ID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0OwotCi0gICAgICAgICAgICBpbnQgZW5jb2RlcldpZHRoLCBlbmNvZGVySGVpZ2h0OwotICAgICAgICAgICAgQVJlY3QgZW5jb2RlclJlY3Q7Ci0gICAgICAgICAgICBpbnQgZW5jb2RlckJ1ZmZlclNpemU7Ci0KLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZXItPmdldEVuY29kZXJJbnB1dEJ1ZmZlckluZm8oCi0gICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsIGFjdHVhbEhlaWdodCwKLSAgICAgICAgICAgICAgICAmZW5jb2RlcldpZHRoLCAmZW5jb2RlckhlaWdodCwKLSAgICAgICAgICAgICAgICAmZW5jb2RlclJlY3QsICZlbmNvZGVyQnVmZmVyU2l6ZSkgPT0gMCkgewotCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIqIG5ld0J1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihlbmNvZGVyQnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLT5jb252ZXJ0STQyMFRvRW5jb2RlcklucHV0KAotICAgICAgICAgICAgICAgICAgICBwRGF0YSwgIC8vIHNyY0JpdHMKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsIGFjdHVhbEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlcldpZHRoLCBlbmNvZGVySGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKW5ld0J1ZmZlci0+ZGF0YSgpICsgbmV3QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb252ZXJ0STQyMFRvRW5jb2RlcklucHV0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBuZXcgYnVmZmVyCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3QnVmZmVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBtZXRhZGF0YQotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QpKEN0cyoxMDAwKSk7Ci0gICAgfQotCi0gICAgLy8gUHVzaCB0aGUgYnVmZmVyIHRvIHRoZSBzb3VyY2UsIGEgTlVMTCBidWZmZXIsIG5vdGlmaWVzIHRoZSBzb3VyY2Ugb2YgRU9TCi0gICAgbmJCdWZmZXIgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihidWZmZXIpOwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgZXJyb3IgMHglWCIsIGVycik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIE5VTEwgIT0gYnVmZmVyICkgewotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcigKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsIE1lZGlhQnVmZmVyKiBidWZmZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgIGludDMyX3QgaTMyVG1wID0gMDsKLSAgICBpbnQ2NF90IGk2NFRtcCA9IDA7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gYnVmZmVyLCAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZXR1cm5lZCBBVQotICAgIGlmICggMCA9PSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICkgewotICAgICAgICAvLyBFbmNvZGVyIGhhcyBubyBkYXRhIHlldCwgbm90aGluZyB1bnVzdWFsCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIDogYnVmZmVyIGlzIGVtcHR5Iik7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soMCA9PSAoKE00T1NBX1VJbnQzMilidWZmZXItPmRhdGEoKSklNCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmdldCgpLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIGlmICggYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaTMyVG1wKSAmJiBpMzJUbXAgKXsKLSAgICAgICAgeyAgIC8vIERpc3BsYXkgdGhlIERTSQotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgRFNJICVkIiwKLSAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHRtcCA9ICh1aW50OF90KikoYnVmZmVyLT5kYXRhKCkpOwotICAgICAgICAgICAgZm9yKCB1aW50MzJfdCBpPTA7IGk8YnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsgaSsrICkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJEU0kgWyVkXSAlLjJYIiwgaSwgdG1wW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBDVFMKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaTY0VG1wKSwKLSAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcysrOwotICAgICAgICBpZiAoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyApIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gaTY0VG1wOwotICAgICAgICB9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0KLSAgICAgICAgQ3RzID0gKE00T1NBX0ludDMyKShpNjRUbXAvMTAwMCk7Ci0gICAgICAgIEFMT0dWKCJbVFNfQ0hFQ0tdIFZJL0VOQyBXUklURSBmcmFtZSAlZCBAICVsbGQgLT4gJWQgKGxhc3QgJWQpIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzLCBpNjRUbXAsIEN0cywKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotICAgICAgICBpZiAoIEN0cyA8IHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMgKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgV0FSTklORyA6IEN0cyBpcyBnb2luZyAiCi0gICAgICAgICAgICAiYmFja3dhcmRzICVkIDwgJWQiLCBDdHMsIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIDogJWQgJWQiLAotICAgICAgICAgICAgQ3RzLCBwRW5jb2RlckNvbnRleHQtPm1MYXN0Q1RTKTsKLQotICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgQVUgY29udGFpbmVyCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UtPnBTdGFydEFVKAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zdHJlYW0tPnN0cmVhbUlELAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdCk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgICAgIC8vIEZvcm1hdCB0aGUgQVUKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpIDw9IHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUsCi0gICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAvLyBSZW1vdmUgSDI2NCBBVSBzdGFydCBjb2RlCi0gICAgICAgIGlmICggTTRFTkNPREVSX2tIMjY0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCApIHsKLSAgICAgICAgICAgIGlmICghbWVtY21wKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBcCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksICJceDAwXHgwMFx4MDBceDAxIiwgNCkgKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIDQsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKE00RU5DT0RFUl9rSDI2NCA9PSBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQpICYmCi0gICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzRmN0KSApIHsKLSAgICAgICAgLy8gSDI2NCB0cmltbWluZyBjYXNlLCBOQUxVIHBvc3QgcHJvY2Vzc2luZyBpcyBuZWVkZWQKLSAgICAgICAgTTRPU0FfSW50MzIgb3V0cHV0U2l6ZSA9IHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemU7Ci0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NGY3QoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4LAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilidWZmZXItPmRhdGEoKStidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKLSAgICAgICAgICAgIChNNE9TQV9VSW50OCopcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAmb3V0cHV0U2l6ZSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplID0gKE00T1NBX1VJbnQzMilvdXRwdXRTaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhlIEFVIGNhbiBqdXN0IGJlIGNvcGllZAotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+XAotICAgICAgICAgICAgICAgIGRhdGFBZGRyZXNzLCAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPlwKLSAgICAgICAgICAgICAgICByYW5nZV9vZmZzZXQoKSksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCZpMzJUbXApICYmIGkzMlRtcCl7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5hdHRyaWJ1dGUgPSBBVV9QX0ZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMgPSBDdHM7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPkNUUyA9IEN0czsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+RFRTID0gQ3RzOwotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyOiBBVSBAIDB4JVggMHglWCAlZCAlZCIsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICpwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5DVFMpOwotCi0gICAgICAgIC8vIFdyaXRlIHRoZSBBVQotICAgICAgICBlcnIgPSBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zdHJlYW0tPnN0cmVhbUlELAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdCk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUgPSAwOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJblBsYW5lLCBNNE9TQV9Eb3VibGUgQ3RzLAotICAgICAgICBNNEVOQ09ERVJfRnJhbWVNb2RlIEZyYW1lTW9kZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIDB4JVggJWYgJWQiLCBwSW5QbGFuZSwgQ3RzLCBGcmFtZU1vZGUpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgaWYgKCBTVEFSVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IEJVRkZFUklORzsKLSAgICB9Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soCi0gICAgICAgIChCVUZGRVJJTkcgfCBSRUFESU5HKSAmIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzKys7Ci0gICAgaWYgKCAwID4gcEVuY29kZXJDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyApIHsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyA9IEN0czsKLSAgICB9Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdElucHV0Q3RzID0gQ3RzOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSAweCVYICVkICVmICglZCkiLCBwSW5QbGFuZSwgRnJhbWVNb2RlLAotICAgICAgICBDdHMsIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotCi0gICAgLy8gUHVzaCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcihwRW5jb2RlckNvbnRleHQsIEN0cywKLSAgICAgICAgTTRPU0FfRkFMU0UpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gTm90aWZ5IHRoZSBzb3VyY2UgaW4gY2FzZSBvZiBFT1MKLSAgICBpZiAoIE00RU5DT0RFUl9rTGFzdEZyYW1lID09IEZyYW1lTW9kZSApIHsKLSAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LCAwLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi0gICAgaWYgKCBCVUZGRVJJTkcgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7Ci0gICAgICAgIC8vIFByZWZldGNoIGlzIGNvbXBsZXRlLCBzdGFydCByZWFkaW5nCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gUkVBRElORzsKLSAgICB9Ci0gICAgLy8gUmVhZAotICAgIHdoaWxlICgxKSAgewotICAgICAgICBNZWRpYUJ1ZmZlciAqb3V0cHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPmdldEJ1ZmZlck5vbkJsb2NraW5nKCk7Ci0KLSAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQzMl90IFlVVkJ1ZmZlck51bWJlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPmdldE51bWJlck9mQnVmZmVyc0luUXVldWUoKTsKLSAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBjb25maWd1cmVkIG1heGltdW0gbnVtYmVyIG9mIHByZWZldGNoIFlVViBmcmFtZXMgaXMKLSAgICAgICAgICAgICAqIG5vdCBleGNlZWRlZC4gVGhpcyBpcyB0byBsaW1pdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2FnZSBvZiB2aWRlbyBlZGl0b3IgZW5naW5lLgotICAgICAgICAgICAgICogVGhlIHZhbHVlIG9mIG1heGltdW0gcHJlZmV0Y2ggWXV2IGZyYW1lcyBpcyBkZWZpbmVkIGluIG1lZGlhX3Byb2ZpbGVzLnhtbCAqLwotICAgICAgICAgICAgaWYgKChZVVZCdWZmZXJOdW1iZXIgPCBwRW5jb2RlckNvbnRleHQtPm1NYXhQcmVmZXRjaEZyYW1lcykgfHwKLSAgICAgICAgICAgICAgICAocEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5oYXNNZWRpYVNvdXJjZVJldHVybmVkRXJyb3IoKQotICAgICAgICAgICAgICAgICAgICA9PSB0cnVlKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUHJvdmlkZSB0aGUgZW5jb2RlZCBBVSB0byB0aGUgd3JpdGVyCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+cHV0QnVmZmVyKG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICBlcnIgICAgICAgICAgICAgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgcmVzdWx0ICAgICAgICAgID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPUEVORUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzICA9IC0xLjA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdElucHV0Q3RzICAgPSAtMS4wOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyA9IC0xOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgID0gLTE7Ci0KLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5zdGFydCgpOwotCi0gICAgLy8gU2V0IHRoZSBuZXcgc3RhdGUKLSAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IFNUQVJURUQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3AoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE1lZGlhQnVmZmVyKiBvdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3AgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBTZW5kIEVPUyBhZ2FpbiB0byBtYWtlIHN1cmUgdGhlIHNvdXJjZSBkb2Vzbid0IGJsb2NrLgotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcihwRW5jb2RlckNvbnRleHQsIDAsCi0gICAgICAgIE00T1NBX1RSVUUpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gUHJvY2VzcyB0aGUgcmVtYWluaW5nIGJ1ZmZlcnMgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgKCAoQlVGRkVSSU5HIHwgUkVBRElORykgJiBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgd2hpbGUgKDEpICB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqb3V0cHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPmdldEJ1ZmZlckJsb2NraW5nKCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgPT0gTlVMTCkgYnJlYWs7Ci0KLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIoCi0gICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LCBvdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+cHV0QnVmZmVyKG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IFNUQVJURUQ7Ci0gICAgfQotCi0gICAgLy8gU3RvcCB0aGUgZ3JhcGggbW9kdWxlIGlmIG5lY2Vzc2FyeQotICAgIGlmICggU1RBUlRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5zdG9wKCk7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnN0b3AoKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBPUEVORUQ7Ci0gICAgfQotCi0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgIT0gcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMpIHsKLSAgICAgICAgQUxPR1coIlNvbWUgZnJhbWVzIHdlcmUgbm90IGVuY29kZWQ6IGlucHV0KCVkKSAhPSBvdXRwdXQoJWQpIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMsIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKTsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3Agbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3AgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIEFMT0dXKCJyZWd1bEJpdFJhdGUgaXMgbm90IGltcGxlbWVudGVkIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24oTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIHN0YXJ0IG9wdGlvbklEIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rT3B0aW9uSURfU2V0SDI2NFByb2Nlc3NOQUxVZmN0c1B0cjoKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NGY3QgPQotICAgICAgICAgICAgICAgIChIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVV9mY3QqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tPcHRpb25JRF9IMjY0UHJvY2Vzc05BTFVDb250ZXh0OgotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0N0eCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0NvbnRleHQpb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb246IHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbiBiZWdpbiBvcHRpbklkIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXI6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgKihNNEVOQ09ERVJfSGVhZGVyKiopb3B0aW9uVmFsdWUgPSAmKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb246IHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSl7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRm9ybWF0LCAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBFbmNvZGVySW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZSBiZWdpbiAweCV4IDB4JXggJWQiLCBwRm9ybWF0LAotICAgICAgICBwRW5jb2RlckludGVyZmFjZSwgbW9kZSk7Ci0KLSAgICBTQUZFX01BTExPQygqcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRW5jb2RlciIpOwotCi0gICAgKnBGb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICBzd2l0Y2goIGZvcm1hdCApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0KLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVBFRzQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0KLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9NUEVHNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0KLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZSA6IHVuc3VwcG9ydGVkIGZvcm1hdCAlZCIsCi0gICAgICAgICAgICAgICAgZm9ybWF0KTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RPcGVuICAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0U3RhcnQgICAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQ7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTdG9wICAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0UGF1c2UgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFJlc3VtZSAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RDbG9zZSAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsZWFudXAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXA7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RSZWd1bEJpdFJhdGUgPQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9yZWd1bEJpdFJhdGU7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RFbmNvZGUgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGU7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb247Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RHZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb247Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnBFbmNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2MyhNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9rSDI2MywgcEZvcm1hdCwKLSAgICAgICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9NUEVHNChNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9rTVBFRzQsIHBGb3JtYXQsCi0gICAgICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjY0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tIMjY0LCBwRm9ybWF0LAotICAgICAgICAgICBwRW5jb2RlckludGVyZmFjZSwgbW9kZSk7Ci0KLX0KLQotfSAgLy8gZXh0ZXJuICJDIgotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyZDIxMTEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotI2luY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWE1MzBjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9maWx0ZXJzCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl92aWRlb2ZpbHRlcnMKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMgXAotICAgICAgTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMgXAotICAgICAgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMgXAotICAgICAgTTRWSUZJX0NsaXAuYyBcCi0gICAgICBNNFZJRklfUmVzaXplWVVWdG9CR1I1NjUuYyBcCi0gICAgICBNNFZJRklfUkdCODg4dG9ZVVY0MjAuYyBcCi0gICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyBcCi0gICAgICBNNFZGTF90cmFuc2l0aW9uLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLSMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KLUxPQ0FMX0xETElCUyA6PSBcCi0gICAgLWxwdGhyZWFkIC1sZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZGTF90cmFuc2l0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhNWUwYjYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VFJBTl90cmFuc2l0aW9uLmMKLSAqIEBicmllZgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKiBPU0FMIChtZW1zZXQgYW5kIG1lbWNweSkgKioqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBMSVRUTEVfRU5ESUFOCi0jZGVmaW5lIE00VkZMX1NXQVBfU0hPUlQoYSkgYSA9ICgoYSAmIDB4RkYpIDw8IDgpIHwgKChhICYgMHhGRjAwKSA+PiA4KQotI2Vsc2UKLSNkZWZpbmUgTTRWRkxfU1dBUF9TSE9SVChhKQotI2VuZGlmCi0KLSNkZWZpbmUgTFVNX0ZBQ1RPUl9NQVggMTAKLQotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFCeVN0ZXAoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX01vZGlmTHVtUGFyYW0gKmx1bV9wYXJhbSwgdm9pZCAqdXNlcl9kYXRhKQotewotICAgIHVuc2lnbmVkIHNob3J0ICpwX3NyYywgKnBfZGVzdCwgKnBfc3JjX2xpbmUsICpwX2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBsb25nIHBpeF9zcmM7Ci0gICAgdW5zaWduZWQgbG9uZyB1X291dHB4LCB1X291dHB4MjsKLSAgICB1bnNpZ25lZCBsb25nIHVfd2lkdGgsIHVfc3RyaWRlLCB1X3N0cmlkZV9vdXQsdV9oZWlnaHQsIHBpeDsKLSAgICB1bnNpZ25lZCBsb25nIGxmMSwgbGYyLCBsZjM7Ci0gICAgbG9uZyBpLCBqOwotCi0gICAgaWYgKGx1bV9wYXJhbS0+Y29weV9jaHJvbWEgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGNvcHkgY2hyb21hIHBsYW5lICovCi0KLSAgICB9Ci0KLSAgICAvKiBhcHBseSBsdW1hIGZhY3RvciAqLwotICAgIHVfd2lkdGggPSBwbGFuZV9pblswXS51X3dpZHRoOwotICAgIHVfaGVpZ2h0ID0gcGxhbmVfaW5bMF0udV9oZWlnaHQ7Ci0gICAgdV9zdHJpZGUgPSAocGxhbmVfaW5bMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgdV9zdHJpZGVfb3V0ID0gKHBsYW5lX291dFswXS51X3N0cmlkZSA+PiAxKTsKLSAgICBwX2Rlc3QgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX291dFswXS5wYWNfZGF0YVtwbGFuZV9vdXRbMF0udV90b3BsZWZ0XTsKLSAgICBwX3NyYyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfaW5bMF0ucGFjX2RhdGFbcGxhbmVfaW5bMF0udV90b3BsZWZ0XTsKLSAgICBwX2Rlc3RfbGluZSA9IHBfZGVzdDsKLSAgICBwX3NyY19saW5lID0gcF9zcmM7Ci0KLSAgICBzd2l0Y2gobHVtX3BhcmFtLT5sdW1fZmFjdG9yKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIC8qIHZlcnkgc3BlY2lmaWMgY2FzZSA6IHNldCBsdW1hIHBsYW5lIHRvIDE2ICovCi0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0LDE2LCB1X3dpZHRoKTsKLSAgICAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICAgIC8qIDAuMjUgKi8KLSAgICAgICAgbGYxID0gNjsgbGYyID0gNjsgbGYzID0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICAvKiAwLjM3NSAqLwotICAgICAgICBsZjEgPSA3OyBsZjIgPSA3OyBsZjMgPSA3OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIC8qIDAuNSAqLwotICAgICAgICBsZjEgPSA3OyBsZjIgPSA3OyBsZjMgPSA4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAgIC8qIDAuNjI1ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDg7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgICAgLyogMC43NSAqLwotICAgICAgICBsZjEgPSA4OyBsZjIgPSA4OyBsZjMgPSA4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICAgIC8qIDAuODc1ICovCi0gICAgICAgIGxmMSA9IDk7IGxmMiA9IDg7IGxmMyA9IDc7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGxmMSA9IDg7IGxmMiA9IDg7IGxmMyA9IDk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICB7Ci0gICAgICAgIHBfZGVzdCA9IHBfZGVzdF9saW5lOwotICAgICAgICBwX3NyYyA9IHBfc3JjX2xpbmU7Ci0gICAgICAgIGZvciAoaSA9ICh1X3dpZHRoID4+IDEpOyBpICE9IDA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgICAgcGl4X3NyYyA9ICh1bnNpZ25lZCBsb25nKSAqcF9zcmMrKzsKLSAgICAgICAgICAgIHBpeCA9IHBpeF9zcmMgJiAweEZGOwotICAgICAgICAgICAgdV9vdXRweCA9ICgoKHBpeCA8PCBsZjEpICsgKHBpeCA8PCBsZjIpICsgKHBpeCA8PCBsZjMpICkgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgcGl4ID0gKChwaXhfc3JjICYgMHhGRjAwKSA+PiA4KTsKLSAgICAgICAgICAgIHVfb3V0cHgyID0gKCgoKHBpeCA8PCBsZjEpICsgKHBpeCA8PCBsZjIpICsgKHBpeCA8PCBsZjMpICkgPj4gTFVNX0ZBQ1RPUl9NQVgpPDwgOCkgOwotICAgICAgICAgICAgKnBfZGVzdCsrID0gKHVuc2lnbmVkIHNob3J0KSAodV9vdXRweDIgfCB1X291dHB4KTsKLSAgICAgICAgfQotICAgICAgICBwX2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgIHBfc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZShNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbHVtX2ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQotewotICAgIHVuc2lnbmVkIHNob3J0ICpwX3NyYywgKnBfZGVzdCwgKnBfc3JjX2xpbmUsICpwX2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBjaGFyICpwX2NzcmMsICpwX2NkZXN0LCAqcF9jc3JjX2xpbmUsICpwX2NkZXN0X2xpbmU7Ci0gICAgdW5zaWduZWQgbG9uZyBwaXhfc3JjOwotICAgIHVuc2lnbmVkIGxvbmcgdV9vdXRweCwgdV9vdXRweDI7Ci0gICAgdW5zaWduZWQgbG9uZyB1X3dpZHRoLCB1X3N0cmlkZSwgdV9zdHJpZGVfb3V0LHVfaGVpZ2h0LCBwaXg7Ci0gICAgbG9uZyBpLCBqOwotCi0gICAgLyogY29weSBvciBmaWx0ZXIgY2hyb21hICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzFdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblsxXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IHBsYW5lX2luWzFdLnVfc3RyaWRlOwotICAgIHVfc3RyaWRlX291dCA9IHBsYW5lX291dFsxXS51X3N0cmlkZTsKLSAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzFdLnBhY19kYXRhW3BsYW5lX291dFsxXS51X3RvcGxlZnRdOwotICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzFdLnBhY19kYXRhW3BsYW5lX2luWzFdLnVfdG9wbGVmdF07Ci0KLSAgICBpZiAobHVtX2ZhY3RvciA+IDI1NikKLSAgICB7Ci0gICAgICAgIHBfY2Rlc3QgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmMgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMl0ucGFjX2RhdGFbcGxhbmVfaW5bMl0udV90b3BsZWZ0XTsKLSAgICAgICAgLyogY29weSBjaHJvbWEgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2NkZXN0X2xpbmUsICh2b2lkICopcF9jc3JjX2xpbmUsIHVfd2lkdGgpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3QsKHZvaWQgKikgcF9jc3JjLCB1X3dpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NkZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICAgICAgcF9jc3JjICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGZpbHRlciBjaHJvbWEgKi8KLSAgICAgICAgcGl4ID0gKDEwMjQgLSBsdW1fZmFjdG9yKSA8PCA3OwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjKysgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmNfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjICYgMHhGRikgKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogYXBwbHkgbHVtYSBmYWN0b3IgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMF0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzBdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gKHBsYW5lX2luWzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHVfc3RyaWRlX291dCA9IChwbGFuZV9vdXRbMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgcF9kZXN0ID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9vdXRbMF0ucGFjX2RhdGFbcGxhbmVfb3V0WzBdLnVfdG9wbGVmdF07Ci0gICAgcF9zcmMgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX2luWzBdLnBhY19kYXRhW3BsYW5lX2luWzBdLnVfdG9wbGVmdF07Ci0gICAgcF9kZXN0X2xpbmUgPSBwX2Rlc3Q7Ci0gICAgcF9zcmNfbGluZSA9IHBfc3JjOwotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VklGSV9JbWFnZUJsZW5kaW5nb25ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4xLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICBCbGVuZHMgdHdvIFlVViA0OjI6MCBQbGFuYXIgaW1hZ2VzLgotICogQG5vdGUgICAgQmxlbmRzIFlVVjQyMCBwbGFuYXIgaW1hZ2VzLAotICogICAgICAgICAgTWFwIHRoZSB2YWx1ZSBvZiBwcm9ncmVzcyBmcm9tICgwIC0gMTAwMCkgdG8gKDAgLSAxMDI0KQotICogICAgICAgICAgU2V0IHRoZSByYW5nZSBvZiBibGVuZGluZ2ZhY3RvciwKLSAqICAgICAgICAgICAgICAgICAgMS4gZnJvbSAwIHRvIChQcm9ncmVzcyA8PCAxKSAgICAgICAgICAgIDtmb3IgUHJvZ3Jlc3MgPD0gNTEyCi0gKiAgICAgICAgICAgICAgICAgIDIuIGZyb20gKCggUHJvZ3Jlc3MgLSA1MTIpPDwgMSkgdG8gMTAyNCA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBTZXQgdGhlIGluY3JlbWVudCBvZiBibGVuZGluZ2ZhY3RvciBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBpbWFnZSByb3cgYnkgdGhlIGZhY3RvciwKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlLTEpIC8gKGltYWdlIHdpZHRoLTEpICA7Zm9yIHdpZHRoID49IHJhbmdlCi0gKiAgICAgICAgICAgICAgICAgID0gIChSYW5nZSkgLyAoaW1hZ2Ugd2lkdGgpICAgICAgO290aGVyd2lzZQotICogICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaSkgcm93IG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCg9IGopIGNvbHVtbiBvZiBvdXRwdXQgWSBwbGFuZSAoc3RlcHMgb2YgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCBvbmUgVSAmIFYgc2FtcGxlIGZyb20gdHdvIGlucHV0IFlVVjQ6MjowIGltYWdlcyBhbmQKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBmb3VyIFkgc2FtcGxlIGFuZCBvbmUgVSAmIFYgc2FtcGxlIGZvciBvdXRwdXQgWVVWNDoyOjAgaW1hZ2UKLSAqICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBmb2xsb3dpbmcsCi0gKiAgICAgICAgICAgICAgICAgIE91dChpLGopID0gYmxlbmRpbmdmYWN0b3IoaSxqKSAqIEluMShpLGopKyAobCAtIGJsZW5kaW5nZmFjdG9yKGksaikpICpJbjIoaSxqKQotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93LgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pICBVc2VyIFNwZWNpZmljIFBhcmFtZXRlcgotICogQHBhcmFtICAgcFBsYW5lSW4xOiAoSU4pICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZAotICogICAgICAgICAgIGZvciBZLCBVIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZUluMjogKElOKSAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQKLSAqICAgICAgICAgICBmb3IgWSwgVSBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkCi0gKiAgICAgICAgICAgZm9yIFksIFUgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgUHJvZ3Jlc3M6ICAoSU4pICBQcm9ncmVzcyB2YWx1ZSAodmFyaWVzIGJldHdlZW4gMCBhbmQgMTAwMCkKLSAqIEByZXR1cm4gIE00VklGSV9PSzogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqIENoZWNrIGZvciB2YWx1ZSBpcyBFVkVOICovCi0jaWZuZGVmIElTX0VWRU4KLSNkZWZpbmUgSVNfRVZFTihhKSAgKCEoYSAmIDB4MDEpKQotI2VuZGlmCi0KLS8qKiBVc2VkIGZvciBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiAqLwotI2lmbmRlZiBNQVhfU0hPUlQKLSNkZWZpbmUgTUFYX1NIT1JUICAgMHgxMDAwMAotI2VuZGlmCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICAgIDAKLSNlbmRpZgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICAgMAotI2RlZmluZSBUUlVFICAgICFGQUxTRQotI2VuZGlmCi0KLXVuc2lnbmVkIGNoYXIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lSW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lSW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgUHJvZ3Jlc3MpCi17Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfc3RhcnQxLCpwdThfZGF0YV9VX3N0YXJ0MSwqcHU4X2RhdGFfVl9zdGFydDE7Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfc3RhcnQyLCpwdThfZGF0YV9VX3N0YXJ0MiwqcHU4X2RhdGFfVl9zdGFydDI7Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfc3RhcnQzLCpwdThfZGF0YV9VX3N0YXJ0MywqcHU4X2RhdGFfVl9zdGFydDM7Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfY3VycmVudDEsICpwdThfZGF0YV9ZX25leHQxLCAqcHU4X2RhdGFfVTEsICpwdThfZGF0YV9WMTsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9jdXJyZW50MiwgKnB1OF9kYXRhX1lfbmV4dDIsICpwdThfZGF0YV9VMiwgKnB1OF9kYXRhX1YyOwotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX2N1cnJlbnQzLCpwdThfZGF0YV9ZX25leHQzLCAqcHU4X2RhdGFfVTMsICpwdThfZGF0YV9WMzsKLSAgICBVSW50MzIgICB1MzJfc3RyaWRlX1kxLCB1MzJfc3RyaWRlMl9ZMSwgdTMyX3N0cmlkZV9VMSwgdTMyX3N0cmlkZV9WMTsKLSAgICBVSW50MzIgICB1MzJfc3RyaWRlX1kyLCB1MzJfc3RyaWRlMl9ZMiwgdTMyX3N0cmlkZV9VMiwgdTMyX3N0cmlkZV9WMjsKLSAgICBVSW50MzIgICB1MzJfc3RyaWRlX1kzLCB1MzJfc3RyaWRlMl9ZMywgdTMyX3N0cmlkZV9VMywgdTMyX3N0cmlkZV9WMzsKLSAgICBVSW50MzIgICB1MzJfaGVpZ2h0LCAgdTMyX3dpZHRoOwotICAgIFVJbnQzMiAgIHUzMl9ibGVuZGZhY3RvciwgdTMyX3N0YXJ0QSwgdTMyX2VuZEEsIHUzMl9ibGVuZF9pbmMsIHUzMl94X2FjY3VtOwotICAgIFVJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3csIHUzMl9yYW5nZUEsIHUzMl9wcm9ncmVzczsKLSAgICBVSW50MzIgICB1MzJfVTEsdTMyX1YxLHUzMl9VMix1MzJfVjIsIHUzMl9ZMSwgdTMyX1kyOwotCi0KLSAgICAvKiBDaGVjayB0aGUgWSBwbGFuZSBoZWlnaHQgaXMgRVZFTiBhbmQgaW1hZ2UgcGxhbmUgaGVpZ2h0cyBhcmUgc2FtZSAqLwotICAgIGlmKCAoSVNfRVZFTihwUGxhbmVJbjFbMF0udV9oZWlnaHQpID09IEZBTFNFKSAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVJbjJbMF0udV9oZWlnaHQpID09IEZBTFNFKSAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXRbMF0udV9oZWlnaHQpID09IEZBTFNFKSAgICAgICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4xWzBdLnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4yWzBdLnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0aGUgWSBwbGFuZSB3aWR0aCBpcyBFVkVOIGFuZCBpbWFnZSBwbGFuZSB3aWR0aHMgYXJlIHNhbWUgKi8KLSAgICBpZiggKElTX0VWRU4ocFBsYW5lSW4xWzBdLnVfd2lkdGgpID09IEZBTFNFKSAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lSW4yWzBdLnVfd2lkdGgpID09IEZBTFNFKSAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0WzBdLnVfd2lkdGgpID09IEZBTFNFKSAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZUluMVswXS51X3dpZHRoICAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZUluMlswXS51X3dpZHRoICAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQxIFlVVjQyMCBpbWFnZSBwbGFuZXMgKi8KLSAgICBwdThfZGF0YV9ZX3N0YXJ0MSA9IHBQbGFuZUluMVswXS5wYWNfZGF0YSArIHBQbGFuZUluMVswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVV9zdGFydDEgPSBwUGxhbmVJbjFbMV0ucGFjX2RhdGEgKyBwUGxhbmVJbjFbMV0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Zfc3RhcnQxID0gcFBsYW5lSW4xWzJdLnBhY19kYXRhICsgcFBsYW5lSW4xWzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dDIgWVVWNDIwIGltYWdlIHBsYW5lcyAqLwotICAgIHB1OF9kYXRhX1lfc3RhcnQyID0gcFBsYW5lSW4yWzBdLnBhY19kYXRhICsgcFBsYW5lSW4yWzBdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9VX3N0YXJ0MiA9IHBQbGFuZUluMlsxXS5wYWNfZGF0YSArIHBQbGFuZUluMlsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVl9zdGFydDIgPSBwUGxhbmVJbjJbMl0ucGFjX2RhdGEgKyBwUGxhbmVJbjJbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBZVVY0MjAgaW1hZ2UgcGxhbmVzICovCi0gICAgcHU4X2RhdGFfWV9zdGFydDMgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Vfc3RhcnQzID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9WX3N0YXJ0MyA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgcm93IGluIGVhY2ggaW5wdXQxIFlVVjQyMCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWTEgPSBwUGxhbmVJbjFbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9VMSA9IHBQbGFuZUluMVsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YxID0gcFBsYW5lSW4xWzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzdHJpZGUgZm9yIHRoZSBuZXh0IHJvdyBpbiBlYWNoIGlucHV0MiBZVVY0MjAgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kyID0gcFBsYW5lSW4yWzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVTIgPSBwUGxhbmVJbjJbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WMiA9IHBQbGFuZUluMlsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc3RyaWRlIGZvciB0aGUgbmV4dCByb3cgaW4gZWFjaCBvdXRwdXQgWVVWNDIwIHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZMyA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1UzID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVjMgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICB1MzJfc3RyaWRlMl9ZMSAgID0gdTMyX3N0cmlkZV9ZMSA8PCAxOwotICAgIHUzMl9zdHJpZGUyX1kyICAgPSB1MzJfc3RyaWRlX1kyIDw8IDE7Ci0gICAgdTMyX3N0cmlkZTJfWTMgICA9IHUzMl9zdHJpZGVfWTMgPDwgMTsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLSAgICB1MzJfd2lkdGggID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0KLSAgICAvKiBVc2VyIFNwZWNpZmllZCBQcm9ncmVzcyB2YWx1ZSAqLwotICAgIHUzMl9wcm9ncmVzcyA9IFByb2dyZXNzOwotCi0gICAgLyogTWFwIFByb2dyZXNzIHZhbHVlIGZyb20gKDAgLSAxMDAwKSB0byAoMCAtIDEwMjQpIC0+IGZvciBvcHRpbWlzYXRpb24gKi8KLSAgICBpZih1MzJfcHJvZ3Jlc3MgPCAxMDAwKQotICAgICAgICB1MzJfcHJvZ3Jlc3MgPSAoKHUzMl9wcm9ncmVzcyA8PCAxMCkgLyAxMDAwKTsKLSAgICBlbHNlCi0gICAgICAgIHUzMl9wcm9ncmVzcyA9IDEwMjQ7Ci0KLSAgICAvKiBTZXQgdGhlIHJhbmdlIG9mIGJsZW5kaW5nZmFjdG9yICovCi0gICAgaWYodTMyX3Byb2dyZXNzIDw9IDUxMikKLSAgICB7Ci0gICAgICAgIHUzMl9zdGFydEEgPSAwOwotICAgICAgICB1MzJfZW5kQSAgID0gKHUzMl9wcm9ncmVzcyA8PCAxKTsKLSAgICB9Ci0gICAgZWxzZSAvKiB1MzJfcHJvZ3Jlc3MgPiA1MTIgKi8KLSAgICB7Ci0gICAgICAgIHUzMl9zdGFydEEgPSAodTMyX3Byb2dyZXNzIC0gNTEyKSA8PCAxOwotICAgICAgICB1MzJfZW5kQSAgID0gIDEwMjQ7Ci0gICAgfQotICAgIHUzMl9yYW5nZUEgPSB1MzJfZW5kQSAtIHUzMl9zdGFydEE7Ci0KLSAgICAvKiBTZXQgdGhlIGluY3JlbWVudCBvZiBibGVuZGluZ2ZhY3RvciBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBpbWFnZSByb3cgKi8KLSAgICBpZiAoKHUzMl93aWR0aCA+PSB1MzJfcmFuZ2VBKSAmJiAodTMyX3JhbmdlQSA+IDApICkKLSAgICB7Ci0gICAgICAgIHUzMl9ibGVuZF9pbmMgICA9ICgodTMyX3JhbmdlQS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoIC0gMSk7Ci0gICAgfQotICAgIGVsc2UgLyogKHUzMl93aWR0aCA8IHUzMl9yYW5nZUEpIHx8ICh1MzJfcmFuZ2VBIDwgMCkgKi8KLSAgICB7Ci0gICAgICAgIHUzMl9ibGVuZF9pbmMgICA9ICh1MzJfcmFuZ2VBICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgpOwotICAgIH0KLQotICAgIC8qIFR3byBZVVY0MjAgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodDsgdTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIFNldCBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgZm9yIGVhY2ggaW5wdXQgaW1hZ2UxIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfY3VycmVudDEgPSBwdThfZGF0YV9ZX3N0YXJ0MTsKLSAgICAgICAgcHU4X2RhdGFfVTEgPSBwdThfZGF0YV9VX3N0YXJ0MTsKLSAgICAgICAgcHU4X2RhdGFfVjEgPSBwdThfZGF0YV9WX3N0YXJ0MTsKLQotICAgICAgICAvKiBTZXQgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcm93IGZvciBlYWNoIGlucHV0IGltYWdlMiBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9ZX2N1cnJlbnQyID0gcHU4X2RhdGFfWV9zdGFydDI7Ci0gICAgICAgIHB1OF9kYXRhX1UyID0gcHU4X2RhdGFfVV9zdGFydDI7Ci0gICAgICAgIHB1OF9kYXRhX1YyID0gcHU4X2RhdGFfVl9zdGFydDI7Ci0KLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJvdyBmb3IgZWFjaCBvdXRwdXQgaW1hZ2UgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9jdXJyZW50MyA9IHB1OF9kYXRhX1lfc3RhcnQzOwotICAgICAgICBwdThfZGF0YV9VMyA9IHB1OF9kYXRhX1Vfc3RhcnQzOwotICAgICAgICBwdThfZGF0YV9WMyA9IHB1OF9kYXRhX1Zfc3RhcnQzOwotCi0gICAgICAgIC8qIFNldCBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdyBmb3IgaW1hZ2UgbHVtYSBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9ZX25leHQxID0gcHU4X2RhdGFfWV9jdXJyZW50MSArIHUzMl9zdHJpZGVfWTE7Ci0gICAgICAgIHB1OF9kYXRhX1lfbmV4dDIgPSBwdThfZGF0YV9ZX2N1cnJlbnQyICsgdTMyX3N0cmlkZV9ZMjsKLSAgICAgICAgcHU4X2RhdGFfWV9uZXh0MyA9IHB1OF9kYXRhX1lfY3VycmVudDMgKyB1MzJfc3RyaWRlX1kzOwotCi0gICAgICAgIC8qIEluaXRpYWxpc2UgYmxlbmRmYWN0b3IgKi8KLSAgICAgICAgdTMyX2JsZW5kZmFjdG9yICAgPSB1MzJfc3RhcnRBOwotICAgICAgICAvKiBCbGVuZGZhY3RvciBJbmNyZW1lbnQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgdTMyX3hfYWNjdW0gPSAwOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGJsZW5kaW5nIGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX2JsZW5kZmFjdG9yID0gdTMyX3N0YXJ0QSArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4LHkpIG9mIGlucHV0IEltYWdlMSAqLwotICAgICAgICAgICAgdTMyX1kxID0gKnB1OF9kYXRhX1lfY3VycmVudDErKzsKLQotICAgICAgICAgICAgLyogR2V0IGNocm9taW5hbmNlMiB2YWx1ZSAqLwotICAgICAgICAgICAgdTMyX1UxID0gKnB1OF9kYXRhX1UxKys7Ci0gICAgICAgICAgICB1MzJfVjEgPSAqcHU4X2RhdGFfVjErKzsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9jdXJyZW50MisrOwotCi0gICAgICAgICAgICAvKiBHZXQgY2hyb21pbmFuY2UyIHZhbHVlICovCi0gICAgICAgICAgICB1MzJfVTIgPSAqcHU4X2RhdGFfVTIrKzsKLSAgICAgICAgICAgIHUzMl9WMiA9ICpwdThfZGF0YV9WMisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgseSkgb2YgT3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9jdXJyZW50MysrICA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9ZMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfWTEpID4+IDEwKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgY2hyb21hKFUpIHZhbHVlIG9mIE91dHB1dCBpbWFnZSAqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1UzKysgICAgICAgICAgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfVTIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1UxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGNocm9tYShWKSB2YWx1ZSBvZiBPdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9WMysrICAgICAgICAgID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1YyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9WMSkgPj4gMTApOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCx5KzEpIG9mIGlucHV0IEltYWdlMSAqLwotICAgICAgICAgICAgdTMyX1kxID0gKnB1OF9kYXRhX1lfbmV4dDErKzsKLQotICAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4LHkrMSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9uZXh0MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgseSsxKSBvZiBPdXRwdXQgaW1hZ2UqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1lfbmV4dDMrKyA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9ZMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotICAgICAgICAgICAgLyogVXBkYXRlIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeF9hY2N1bSArPSB1MzJfYmxlbmRfaW5jOwotCi0gICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGJsZW5kaW5nIGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX2JsZW5kZmFjdG9yID0gdTMyX3N0YXJ0QSArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4KzEseSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9jdXJyZW50MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkpIG9mIGlucHV0IEltYWdlMiAqLwotICAgICAgICAgICAgdTMyX1kyID0gKnB1OF9kYXRhX1lfY3VycmVudDIrKzsKLQotICAgICAgICAgICAgLyogQ29tcHV0ZSBMdW1hIHZhbHVlICh4KzEseSkgb2YgT3V0cHV0IGltYWdlKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9ZX2N1cnJlbnQzKysgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfWTIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfWTEpID4+IDEwKTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgrMSx5KzEpIG9mIGlucHV0IEltYWdlMSAqLwotICAgICAgICAgICAgdTMyX1kxID0gKnB1OF9kYXRhX1lfbmV4dDErKzsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgrMSx5KzEpIG9mIGlucHV0IEltYWdlMiAqLwotICAgICAgICAgICAgdTMyX1kyID0gKnB1OF9kYXRhX1lfbmV4dDIrKzsKLQotICAgICAgICAgICAgLyogQ29tcHV0ZSBMdW1hIHZhbHVlICh4KzEseSsxKSBvZiBPdXRwdXQgaW1hZ2UqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1lfbmV4dDMrKyA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9ZMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotICAgICAgICAgICAgLyogVXBkYXRlIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeF9hY2N1bSArPSB1MzJfYmxlbmRfaW5jOwotCi0gICAgICAgICAgICAvKiBXb3JraW5nIHBvaW50ZXJzIGFyZSBpbmNyZW1lbnRlZCBqdXN0IGFmdGVyIGVhY2ggc3RvcmFnZSAqLwotCi0gICAgICAgIH0vKiBFbmQgb2Ygcm93IHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogVXBkYXRlIHdvcmtpbmcgcG9pbnRlciBvZiBpbnB1dCBpbWFnZTEgZm9yIG5leHQgcm93ICovCi0gICAgICAgIHB1OF9kYXRhX1lfc3RhcnQxICs9IHUzMl9zdHJpZGUyX1kxOwotICAgICAgICBwdThfZGF0YV9VX3N0YXJ0MSArPSB1MzJfc3RyaWRlX1UxOwotICAgICAgICBwdThfZGF0YV9WX3N0YXJ0MSArPSB1MzJfc3RyaWRlX1YxOwotCi0gICAgICAgIC8qIFVwZGF0ZSB3b3JraW5nIHBvaW50ZXIgb2YgaW5wdXQgaW1hZ2UyIGZvciBuZXh0IHJvdyAqLwotICAgICAgICBwdThfZGF0YV9ZX3N0YXJ0MiArPSB1MzJfc3RyaWRlMl9ZMjsKLSAgICAgICAgcHU4X2RhdGFfVV9zdGFydDIgKz0gdTMyX3N0cmlkZV9VMjsKLSAgICAgICAgcHU4X2RhdGFfVl9zdGFydDIgKz0gdTMyX3N0cmlkZV9WMjsKLQotICAgICAgICAvKiBVcGRhdGUgd29ya2luZyBwb2ludGVyIG9mIG91dHB1dCBpbWFnZSBmb3IgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9zdGFydDMgKz0gdTMyX3N0cmlkZTJfWTM7Ci0gICAgICAgIHB1OF9kYXRhX1Vfc3RhcnQzICs9IHUzMl9zdHJpZGVfVTM7Ci0gICAgICAgIHB1OF9kYXRhX1Zfc3RhcnQzICs9IHUzMl9zdHJpZGVfVjM7Ci0KLSAgICB9LyogRW5kIG9mIGNvbHVtbiBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9JbWFnZUJsZW5kaW5nb25ZVVY0MjAuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2MDg3NjcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9CR1I1NjV0b1lVVjQyMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMC5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgQ29sb3IgQ29udmVyc2lvbiBGaWx0ZXIKLSAqICAgICAgICAgICAtIyBDb250YWlucyB0aGUgZm9ybWF0IGNvbnZlcnNpb24gZmlsdGVycyBmcm9tIEJHUjU2NSB0byBZVVY0MjAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgVHJhbnNmb3JtIEJHUjU2NSBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBub3RlICAgIENvbnZlcnQgQkdSNTY1IHRvIFlVVjQyMCwKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICogICAgICAgICAgICAgICAgICBHZXQgNCBCR1Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICogICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICogICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIEJHUjU2NSBQbGFuZQotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvICBZVVY0MjAgYnVmZmVyIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9ZLCB1MzJfc3RyaWRlMl9ZLCB1MzJfc3RyaWRlX1UsIHUzMl9zdHJpZGVfVjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9iZ3IsIHUzMl9zdHJpZGVfMmJncjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdzsKLQotICAgIE00VklGSV9JbnQzMiAgICBpMzJfcjAwLCBpMzJfcjAxLCBpMzJfcjEwLCBpMzJfcjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfZzAwLCBpMzJfZzAxLCBpMzJfZzEwLCBpMzJfZzExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfYjAwLCBpMzJfYjAxLCBpMzJfYjEwLCBpMzJfYjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfeTAwLCBpMzJfeTAxLCBpMzJfeTEwLCBpMzJfeTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdTAwLCBpMzJfdTAxLCBpMzJfdTEwLCBpMzJfdTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdjAwLCBpMzJfdjAxLCBpMzJfdjEwLCBpMzJfdjExOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3luLCAqcHU4X3lzLCAqcHU4X3UsICpwdThfdjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95X2RhdGEsICpwdThfdV9kYXRhLCAqcHU4X3ZfZGF0YTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9iZ3JuX2RhdGEsICpwdThfYmdybjsKLSAgICBNNFZJRklfVUludDE2ICAgdTE2X3BpeDEsIHUxNl9waXgyLCB1MTZfcGl4MywgdTE2X3BpeDQ7Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgaGVpZ2h0IGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBsYW5lcyB3aWR0aCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X3dpZHRoICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhICA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSAgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF92X2RhdGEgID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfYmdybl9kYXRhICAgPSBwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggICA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIHUzMl9oZWlnaHQgID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZID0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX2JnciA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJiZ3IgPSB1MzJfc3RyaWRlX2JnciA8PCAxOwotCi0gICAgLyogTG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiBUd28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBDdXJyZW50IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biA9IHB1OF95X2RhdGE7Ci0gICAgICAgIC8qIE5leHQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3lzID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotICAgICAgICAvKiBDdXJyZW50IFUgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3UgPSBwdThfdV9kYXRhOwotICAgICAgICAvKiBDdXJyZW50IFYgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3YgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9iZ3JuID0gcHU4X2Jncm5fZGF0YTsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0IGZvdXIgQkdSIDU2NSBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgdTE2X3BpeDEgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSBwdThfYmdybik7Ci0gICAgICAgICAgICB1MTZfcGl4MiA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgdTE2X3BpeDMgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X2Jncm4gKyB1MzJfc3RyaWRlX2JncikpOwotICAgICAgICAgICAgdTE2X3BpeDQgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X2Jncm4gKyB1MzJfc3RyaWRlX2JnciArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgLyogVW5wYWNrIFJHQjU2NSB0byA4Yml0IFIsIEcsIEIgKi8KLSAgICAgICAgICAgIC8qICh4LHkpICovCi0gICAgICAgICAgICBHRVRfQkdSNTY1KGkzMl9iMDAsIGkzMl9nMDAsIGkzMl9yMDAsIHUxNl9waXgxKTsKLSAgICAgICAgICAgIC8qICh4KzEseSkgKi8KLSAgICAgICAgICAgIEdFVF9CR1I1NjUoaTMyX2IxMCwgaTMyX2cxMCwgaTMyX3IxMCwgdTE2X3BpeDIpOwotICAgICAgICAgICAgLyogKHgseSsxKSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjAxLCBpMzJfZzAxLCBpMzJfcjAxLCB1MTZfcGl4Myk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9CR1I1NjUoaTMyX2IxMSwgaTMyX2cxMSwgaTMyX3IxMSwgdTE2X3BpeDQpOwotCi0gICAgICAgICAgICAvKiBDb252ZXJ0IEJHUiB2YWx1ZSB0byBZVVYgKi8KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAwID0gWTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMCA9IFkxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDEgPSBZMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTExID0gWTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBsdW1pbmFuY2UgZGF0YSAqLwotICAgICAgICAgICAgcHU4X3luWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAwOwotICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwotICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBjaHJvbWEgZGF0YSAqLwotICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0KLSAgICAgICAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgY29sdW1uICovCi0gICAgICAgICAgICBwdThfYmdybiArPSAoQ1NUX1JHQl8xNl9TSVpFPDwxKTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjdXJyZW50IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95biArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3lzICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgVSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3UgKys7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgViBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBQcmVwYXJlIHBvaW50ZXJzIGZvciB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X3lfZGF0YSAgICAgICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgICAgICArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgICAgICArPSB1MzJfc3RyaWRlX1Y7Ci0gICAgICAgIHB1OF9iZ3JuX2RhdGEgICArPSB1MzJfc3RyaWRlXzJiZ3I7Ci0KLSAgICB9IC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9CR1I1NjV0b1lVVjQyMC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQ2xpcC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9DbGlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0MjkwYjEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9DbGlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfQ2xpcC5jCi0gKiBAYnJpZWYgICAgTWFuYWdlbWVudCBvZiB0aGUgUkdCIENsaXBwaW5nIG1hdHJpeCBpbmNsdXNpb24gYW5kIERpdmlzaW9uIFRhYmxlCi0gKiBAbm90ZSAgICAgLSMgQ2xpcHBpbmcgTWF0cml4IGlzIHVzZWQgaW4gb3JkZXIgdG8gcHJvcGVybHkgbWFuYWdlIHRoZSBpbmNsdXNpb24gb2YKLSAqICAgICAgICAgICB0aGUgZXh0ZXJuYWwgUkdCIENsaXBwaW5nIG1hdHJpeCB1c2VkIGZvciBjb2xvciBjb252ZXJzaW9uLgotICogICAgICAgICAgIFRoaXMgZmlsZSBIQVMgVE8gQkUgY29tcGlsZWQgd2l0aCBhbGwgY29sb3IgY29udmVyc2lvbiBmaWx0ZXJzIHByb2plY3QKLSAqICAgICAgICAgICAtIyBEaXZpc2lvbiB0YWJsZSBpcyB1c2VkIGluIFJHQiB0byBITFMgY29sb3IgY29udmVyc2lvbgotICogICAgICAgICAgIEltcG9ydGFudDogVGhpcyBmaWxlIG11c3QgYmUgY29tcGlsZWQgZHVyaW5nIHRoZSBhc3NlbWJseSBsaWJyYXJ5IGJ1aWxkaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi1DTlNUIE00VklGSV9VSW50OCAgIE00VklGSV9DbGlwVGFibGVbMTI1Nl0KLT0gewotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLAotMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwKLTB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCi0weDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDFiLAotMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywKLTB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsCi0weDJjLCAweDJkLCAweDJlLCAweDJmLCAweDMwLCAweDMxLCAweDMyLCAweDMzLAotMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwKLTB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsCi0weDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDRiLAotMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywKLTB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsCi0weDVjLCAweDVkLCAweDVlLCAweDVmLCAweDYwLCAweDYxLCAweDYyLCAweDYzLAotMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwKLTB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsCi0weDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLCAweDdiLAotMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywKLTB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsCi0weDhjLCAweDhkLCAweDhlLCAweDhmLCAweDkwLCAweDkxLCAweDkyLCAweDkzLAotMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwKLTB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsCi0weGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGFiLAotMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywKLTB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsCi0weGJjLCAweGJkLCAweGJlLCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLAotMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwKLTB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsCi0weGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGRiLAotMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywKLTB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsCi0weGVjLCAweGVkLCAweGVlLCAweGVmLCAweGYwLCAweGYxLCAweGYyLCAweGYzLAotMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwKLTB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgotfTsKLQotLyogRGl2aXNpb24gdGFibGUgZm9yICggNjU1MzUveCApOyB4ID0gMCB0byA1MTIgKi8KLUNOU1QgTTRWSUZJX1VJbnQxNiAgTTRWSUZJX0RpdlRhYmxlWzUxMl0KLT0gewotMCwgNjU1MzUsIDMyNzY4LCAyMTg0NSwgMTYzODQsIDEzMTA3LCAxMDkyMiwgOTM2MiwKLTgxOTIsIDcyODEsIDY1NTMsIDU5NTcsIDU0NjEsIDUwNDEsIDQ2ODEsIDQzNjksCi00MDk2LCAzODU1LCAzNjQwLCAzNDQ5LCAzMjc2LCAzMTIwLCAyOTc4LCAyODQ5LAotMjczMCwgMjYyMSwgMjUyMCwgMjQyNywgMjM0MCwgMjI1OSwgMjE4NCwgMjExNCwKLTIwNDgsIDE5ODUsIDE5MjcsIDE4NzIsIDE4MjAsIDE3NzEsIDE3MjQsIDE2ODAsCi0xNjM4LCAxNTk4LCAxNTYwLCAxNTI0LCAxNDg5LCAxNDU2LCAxNDI0LCAxMzk0LAotMTM2NSwgMTMzNywgMTMxMCwgMTI4NSwgMTI2MCwgMTIzNiwgMTIxMywgMTE5MSwKLTExNzAsIDExNDksIDExMjksIDExMTAsIDEwOTIsIDEwNzQsIDEwNTcsIDEwNDAsCi0xMDI0LCAxMDA4LCA5OTIsIDk3OCwgOTYzLCA5NDksIDkzNiwgOTIzLAotOTEwLCA4OTcsIDg4NSwgODczLCA4NjIsIDg1MSwgODQwLCA4MjksCi04MTksIDgwOSwgNzk5LCA3ODksIDc4MCwgNzcxLCA3NjIsIDc1MywKLTc0NCwgNzM2LCA3MjgsIDcyMCwgNzEyLCA3MDQsIDY5NywgNjg5LAotNjgyLCA2NzUsIDY2OCwgNjYxLCA2NTUsIDY0OCwgNjQyLCA2MzYsCi02MzAsIDYyNCwgNjE4LCA2MTIsIDYwNiwgNjAxLCA1OTUsIDU5MCwKLTU4NSwgNTc5LCA1NzQsIDU2OSwgNTY0LCA1NjAsIDU1NSwgNTUwLAotNTQ2LCA1NDEsIDUzNywgNTMyLCA1MjgsIDUyNCwgNTIwLCA1MTYsCi01MTIsIDUwOCwgNTA0LCA1MDAsIDQ5NiwgNDkyLCA0ODksIDQ4NSwKLTQ4MSwgNDc4LCA0NzQsIDQ3MSwgNDY4LCA0NjQsIDQ2MSwgNDU4LAotNDU1LCA0NTEsIDQ0OCwgNDQ1LCA0NDIsIDQzOSwgNDM2LCA0MzQsCi00MzEsIDQyOCwgNDI1LCA0MjIsIDQyMCwgNDE3LCA0MTQsIDQxMiwKLTQwOSwgNDA3LCA0MDQsIDQwMiwgMzk5LCAzOTcsIDM5NCwgMzkyLAotMzkwLCAzODcsIDM4NSwgMzgzLCAzODEsIDM3OCwgMzc2LCAzNzQsCi0zNzIsIDM3MCwgMzY4LCAzNjYsIDM2NCwgMzYyLCAzNjAsIDM1OCwKLTM1NiwgMzU0LCAzNTIsIDM1MCwgMzQ4LCAzNDYsIDM0NCwgMzQzLAotMzQxLCAzMzksIDMzNywgMzM2LCAzMzQsIDMzMiwgMzMwLCAzMjksCi0zMjcsIDMyNiwgMzI0LCAzMjIsIDMyMSwgMzE5LCAzMTgsIDMxNiwKLTMxNSwgMzEzLCAzMTIsIDMxMCwgMzA5LCAzMDcsIDMwNiwgMzA0LAotMzAzLCAzMDIsIDMwMCwgMjk5LCAyOTcsIDI5NiwgMjk1LCAyOTMsCi0yOTIsIDI5MSwgMjg5LCAyODgsIDI4NywgMjg2LCAyODQsIDI4MywKLTI4MiwgMjgxLCAyODAsIDI3OCwgMjc3LCAyNzYsIDI3NSwgMjc0LAotMjczLCAyNzEsIDI3MCwgMjY5LCAyNjgsIDI2NywgMjY2LCAyNjUsCi0yNjQsIDI2MywgMjYyLCAyNjEsIDI2MCwgMjU5LCAyNTgsIDI1NywKLTI1NiwgMjU1LCAyNTQsIDI1MywgMjUyLCAyNTEsIDI1MCwgMjQ5LAotMjQ4LCAyNDcsIDI0NiwgMjQ1LCAyNDQsIDI0MywgMjQyLCAyNDEsCi0yNDAsIDI0MCwgMjM5LCAyMzgsIDIzNywgMjM2LCAyMzUsIDIzNCwKLTIzNCwgMjMzLCAyMzIsIDIzMSwgMjMwLCAyMjksIDIyOSwgMjI4LAotMjI3LCAyMjYsIDIyNSwgMjI1LCAyMjQsIDIyMywgMjIyLCAyMjIsCi0yMjEsIDIyMCwgMjE5LCAyMTksIDIxOCwgMjE3LCAyMTcsIDIxNiwKLTIxNSwgMjE0LCAyMTQsIDIxMywgMjEyLCAyMTIsIDIxMSwgMjEwLAotMjEwLCAyMDksIDIwOCwgMjA4LCAyMDcsIDIwNiwgMjA2LCAyMDUsCi0yMDQsIDIwNCwgMjAzLCAyMDIsIDIwMiwgMjAxLCAyMDEsIDIwMCwKLTE5OSwgMTk5LCAxOTgsIDE5NywgMTk3LCAxOTYsIDE5NiwgMTk1LAotMTk1LCAxOTQsIDE5MywgMTkzLCAxOTIsIDE5MiwgMTkxLCAxOTEsCi0xOTAsIDE4OSwgMTg5LCAxODgsIDE4OCwgMTg3LCAxODcsIDE4NiwKLTE4NiwgMTg1LCAxODUsIDE4NCwgMTg0LCAxODMsIDE4MywgMTgyLAotMTgyLCAxODEsIDE4MSwgMTgwLCAxODAsIDE3OSwgMTc5LCAxNzgsCi0xNzgsIDE3NywgMTc3LCAxNzYsIDE3NiwgMTc1LCAxNzUsIDE3NCwKLTE3NCwgMTczLCAxNzMsIDE3MiwgMTcyLCAxNzIsIDE3MSwgMTcxLAotMTcwLCAxNzAsIDE2OSwgMTY5LCAxNjgsIDE2OCwgMTY4LCAxNjcsCi0xNjcsIDE2NiwgMTY2LCAxNjUsIDE2NSwgMTY1LCAxNjQsIDE2NCwKLTE2MywgMTYzLCAxNjMsIDE2MiwgMTYyLCAxNjEsIDE2MSwgMTYxLAotMTYwLCAxNjAsIDE1OSwgMTU5LCAxNTksIDE1OCwgMTU4LCAxNTcsCi0xNTcsIDE1NywgMTU2LCAxNTYsIDE1NiwgMTU1LCAxNTUsIDE1NCwKLTE1NCwgMTU0LCAxNTMsIDE1MywgMTUzLCAxNTIsIDE1MiwgMTUyLAotMTUxLCAxNTEsIDE1MSwgMTUwLCAxNTAsIDE0OSwgMTQ5LCAxNDksCi0xNDgsIDE0OCwgMTQ4LCAxNDcsIDE0NywgMTQ3LCAxNDYsIDE0NiwKLTE0NiwgMTQ1LCAxNDUsIDE0NSwgMTQ0LCAxNDQsIDE0NCwgMTQ0LAotMTQzLCAxNDMsIDE0MywgMTQyLCAxNDIsIDE0MiwgMTQxLCAxNDEsCi0xNDEsIDE0MCwgMTQwLCAxNDAsIDE0MCwgMTM5LCAxMzksIDEzOSwKLTEzOCwgMTM4LCAxMzgsIDEzNywgMTM3LCAxMzcsIDEzNywgMTM2LAotMTM2LCAxMzYsIDEzNSwgMTM1LCAxMzUsIDEzNSwgMTM0LCAxMzQsCi0xMzQsIDEzNCwgMTMzLCAxMzMsIDEzMywgMTMyLCAxMzIsIDEzMiwKLTEzMiwgMTMxLCAxMzEsIDEzMSwgMTMxLCAxMzAsIDEzMCwgMTMwLAotMTMwLCAxMjksIDEyOSwgMTI5LCAxMjksIDEyOCwgMTI4LCAxMjgKLX07Ci0KLUNOU1QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlMVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLDB4MDAwMDA2NDksMHgwMDAwMGQwZiwgMHgwMDAwRDg2QywgMHgwMDAwRDgzQiwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMAotfTsKLQotQ05TVCBNNFZJRklfSW50MzIgIGNvbnN0X3N0b3JhZ2VbOF0KLT0gewotMHgwMDAwMjU2OCwgMHgwMDAwMzM0MywgMHgxQkY4MDAsIDB4MDAwMDA2NDksIDB4MDAwMDBkMGYsIDB4MTEwMTgwLCAweDQwY2YsIDB4MjJCRTAwCi19OwotCi0KLUNOU1QgTTRWSUZJX1VJbnQxNiAgKk00VklGSV9EaXZUYWJsZV96ZXJvCi0gPSAmTTRWSUZJX0RpdlRhYmxlWzBdOwotCi1DTlNUIE00VklGSV9VSW50OCAgICpNNFZJRklfQ2xpcFRhYmxlX3plcm8KLSA9ICZNNFZJRklfQ2xpcFRhYmxlWzUwMF07Ci0KLQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0NsaXAuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0Y2JkNTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SR0I1NjV0b1lVVjQyMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBDb2xvciBDb252ZXJzaW9uIEZpbHRlcgotICogICAgICAgICAgIENvbnRhaW5zIHRoZSBmb3JtYXQgY29udmVyc2lvbiBmaWx0ZXJzIGZyb20gUkdCNTY1IHRvIFlVVjQyMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgdHJhbnNmb3JtIFJHQjU2NSBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBub3RlICAgIENvbnZlcnQgUkdCNTY1IHRvIFlVVjQyMCwKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICogICAgICAgICAgICAgICAgICBHZXQgNCBSR0Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICogICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICogICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFJHQjU2NSBQbGFuZQotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvICBZVVY0MjAgYnVmZmVyIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX3JnYiwgdTMyX3N0cmlkZV8ycmdiOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3JnYm5fZGF0YSwgKnB1OF9yZ2JuOwotICAgIE00VklGSV9VSW50MTYgICB1MTZfcGl4MSwgdTE2X3BpeDIsIHUxNl9waXgzLCB1MTZfcGl4NDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYgKChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmICgocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF92X2RhdGEgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9yZ2JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIHUzMl9oZWlnaHQgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfcmdiID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLQotICAgIC8qIExvb3Agb24gZWFjaCByb3cgb2YgdGhlIG91dHB1dCBpbWFnZSwgaW5wdXQgY29vcmRpbmF0ZXMgYXJlIGVzdGltYXRlZCBmcm9tIG91dHB1dCBvbmVzICovCi0gICAgLyogVHdvIFlVViByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0IDt1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogQ3VycmVudCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeW4gPSBwdThfeV9kYXRhOwotICAgICAgICAvKiBOZXh0IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95cyA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLSAgICAgICAgLyogQ3VycmVudCBVIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF91ID0gcHU4X3VfZGF0YTsKLSAgICAgICAgLyogQ3VycmVudCBWIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF92ID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibiA9IHB1OF9yZ2JuX2RhdGE7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldCBmb3VyIFJHQiA1NjUgc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgIHUxNl9waXgxID0gKiggKE00VklGSV9VSW50MTYgKikgcHU4X3JnYm4pOwotICAgICAgICAgICAgdTE2X3BpeDIgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyBDU1RfUkdCXzE2X1NJWkUpKTsKLSAgICAgICAgICAgIHUxNl9waXgzID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IpKTsKLSAgICAgICAgICAgIHUxNl9waXg0ID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzE2X1NJWkUpKTsKLQotICAgICAgICAgICAgLyogVW5wYWNrIFJHQjU2NSB0byA4Yml0IFIsIEcsIEIgKi8KLSAgICAgICAgICAgIC8qICh4LHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMDAsaTMyX2cwMCxpMzJfYjAwLHUxNl9waXgxKTsKLSAgICAgICAgICAgIC8qICh4KzEseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IxMCxpMzJfZzEwLGkzMl9iMTAsdTE2X3BpeDIpOwotICAgICAgICAgICAgLyogKHgseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjAxLGkzMl9nMDEsaTMyX2IwMSx1MTZfcGl4Myk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IxMSxpMzJfZzExLGkzMl9iMTEsdTE2X3BpeDQpOwotCi0gICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiB2YWx1ZSB0byBZVVYgKi8KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAwID0gWTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMCA9IFkxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDEgPSBZMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTExID0gWTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBsdW1pbmFuY2UgZGF0YSAqLwotICAgICAgICAgICAgcHU4X3luWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAwOwotICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwotICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBjaHJvbWEgZGF0YSAqLwotICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0KLSAgICAgICAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgY29sdW1uICovCi0gICAgICAgICAgICBwdThfcmdibiArPSAoQ1NUX1JHQl8xNl9TSVpFPDwxKTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjdXJyZW50IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95biArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3lzICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgVSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3UgKys7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgViBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBQcmVwYXJlIHBvaW50ZXJzIGZvciB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X3lfZGF0YSArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSArPSB1MzJfc3RyaWRlX1Y7Ci0gICAgICAgIHB1OF9yZ2JuX2RhdGEgKz0gdTMyX3N0cmlkZV8ycmdiOwotCi0KLSAgICB9IC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjg4OHRvWVVWNDIwLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjg4OHRvWVVWNDIwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4NWEyYTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SR0I4ODh0b1lVVjQyMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUHJvdG86Ci1NNFZJRklfVUludDggICAgTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pOwotUHVycG9zZTogICAgZmlsbGluZyBvZiB0aGUgWVVWNDIwIHBsYW5lIGZyb20gYSBCR1IyNCBwbGFuZQotQWJzdHJhY3Q6ICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAgICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICAgICAgICAgICAgICAgICAgICBHZXQgNCBCR1Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICAgICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICAgICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0KLUluOiAgICAgICAgICAgIFJHQjI0IHBsYW5lCi1Jbk91dDogICAgICAgIG5vbmUKLU91dDogICAgICAgIGFycmF5IG9mIDMgTTRWSUZJX0ltYWdlUGxhbmUgc3RydWN0dXJlcwotTW9kaWZpZWQ6ICAgIE1MOiBSR0IgZnVuY3Rpb24gbW9kaWZpZWQgdG8gQkdSLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pCi17Ci0gICAgTTRWSUZJX1VJbnQzMiAgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WLCB1MzJfc3RyaWRlX3JnYixcCi0gICAgICAgICAgICAgICAgICAgICB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3JnYm5fZGF0YSwgKnB1OF9yZ2JuOwotCi0gICAgLyogY2hlY2sgc2l6ZXMgKi8KLSAgICBpZiggKFBsYW5lSW4tPnVfaGVpZ2h0ICE9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0KLSAgICBpZiggKFBsYW5lSW4tPnVfd2lkdGggIT0gUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X3dpZHRoICE9IChQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotCi0KLSAgICAvKiBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgICAgPSBQbGFuZU91dFswXS5wYWNfZGF0YSArIFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhICAgID0gUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSAgICA9IFBsYW5lT3V0WzJdLnBhY19kYXRhICsgUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgYnVmZmVyICovCi0gICAgcHU4X3JnYm5fZGF0YSAgICA9IFBsYW5lSW4tPnBhY19kYXRhICsgUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggICAgPSBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIHUzMl9oZWlnaHQgICAgPSBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIHNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIGlkZW0gZm9yIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0gICAgLyogbG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiB0d28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAgICAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiB1cGRhdGUgd29ya2luZyBwb2ludGVycyAqLwotICAgICAgICBwdThfeW4gICAgPSBwdThfeV9kYXRhOwotICAgICAgICBwdThfeXMgICAgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0KLSAgICAgICAgcHU4X3UgICAgPSBwdThfdV9kYXRhOwotICAgICAgICBwdThfdiAgICA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm49IHB1OF9yZ2JuX2RhdGE7Ci0KLSAgICAgICAgLyogbG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlKi8KLSAgICAgICAgZm9yICAgICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogZ2V0IFJHQiBzYW1wbGVzIG9mIDQgcGl4ZWxzICovCi0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCwgcHU4X3JnYm4sIDApOwotICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTAsIHB1OF9yZ2JuLCBDU1RfUkdCXzI0X1NJWkUpOwotICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEsIHB1OF9yZ2JuLCB1MzJfc3RyaWRlX3JnYik7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8yNF9TSVpFKTsKLQotICAgICAgICAgICAgaTMyX3UwMCAgICA9IFUyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgICAgPSBWMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfeTAwICAgID0gWTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOyAgICAgICAgLyogbWF0cml4IGx1bWluYW5jZSAqLwotICAgICAgICAgICAgcHU4X3luWzBdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgICAgPSBVMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwICAgID0gVjI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3kxMCAgICA9IFkyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIHB1OF95blsxXT0gKE00VklGSV9VSW50OClpMzJfeTEwOwotCi0gICAgICAgICAgICBpMzJfdTAxICAgID0gVTI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSAgICA9IFYyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl95MDEgICAgPSBZMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBwdThfeXNbMF09IChNNFZJRklfVUludDgpaTMyX3kwMTsKLQotICAgICAgICAgICAgaTMyX3UxMSAgICA9IFUyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgICAgPSBWMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfeTExICAgID0gWTI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotCi0gICAgICAgICAgICAqcHU4X3UgICAgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ICAgID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgcHU4X3JnYm4gICAgKz0gIChDU1RfUkdCXzI0X1NJWkU8PDEpOwotICAgICAgICAgICAgcHU4X3luICAgICAgICArPSAyOwotICAgICAgICAgICAgcHU4X3lzICAgICAgICArPSAyOwotCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIGVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgcHU4X3lfZGF0YSAgICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICAgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlX1Y7Ci0gICAgICAgIHB1OF9yZ2JuX2RhdGEgICAgKz0gdTMyX3N0cmlkZV8ycmdiOwotCi0KLSAgICB9IC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjE3ZTRlZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgVGhpcyBmaWxlIGhhcyBhIFJlc2l6ZSBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICBHZW5lcmljIHJlc2l6aW5nIG9mIFJHQjU2NSAoUGxhbmFyKSBpbWFnZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBSZXNpemVzIFJHQjU2NSBQbGFuYXIgcGxhbmUuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFJHQjU2NSAoUGxhbmFyKSBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBSR0I1NjUgKFBsYW5hcikgcGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MTYgICAqcHUxNl9kYXRhX2luOwotICAgIE00VklGSV9VSW50MTYgICAqcHUxNl9kYXRhX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoX2luLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9pbiwgdTMyX3N0cmlkZV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luYywgdTMyX3lfaW5jOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9hY2N1bSwgdTMyX3lfYWNjdW0sIHUzMl94X2FjY3VtX3N0YXJ0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9SdGVtcF92YWx1ZSx1MzJfR3RlbXBfdmFsdWUsdTMyX0J0ZW1wX3ZhbHVlOwotICAgIE00VklGSV9VSW50MTYgICAqcHUxNl9zcmNfdG9wOwotICAgIE00VklGSV9VSW50MTYgICAqcHUxNl9zcmNfYm90dG9tOwotICAgIE00VklGSV9VSW50MzIgICBpMzJfYjAwLCBpMzJfZzAwLCBpMzJfcjAwOwotICAgIE00VklGSV9VSW50MzIgICBpMzJfYjAxLCBpMzJfZzAxLCBpMzJfcjAxOwotICAgIE00VklGSV9VSW50MzIgICBpMzJfYjAyLCBpMzJfZzAyLCBpMzJfcjAyOwotICAgIE00VklGSV9VSW50MzIgICBpMzJfYjAzLCBpMzJfZzAzLCBpMzJfcjAzOwotICAgIE00VklGSV9VSW50OCAgICBjb3VudF90cmFucz0wOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBSR0Igd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJbi0+dV9oZWlnaHQpID09IEZBTFNFKSB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXQtPnVfaGVpZ2h0KSA9PSBGQUxTRSkpIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfd2lkdGgpID09IEZBTFNFKSB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXQtPnVfd2lkdGgpID09IEZBTFNFKSkgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0gICAgcHUxNl9kYXRhX2luICAgID0gKE00VklGSV9VSW50MTYqKShwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0KTsKLSAgICBwdTE2X2RhdGFfb3V0ICAgPSAoTTRWSUZJX1VJbnQxNiopKHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdCk7Ci0KLSAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgIHUzMl9zdHJpZGVfaW4gICA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX291dCAgPSBwUGxhbmVPdXQtPnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgIHUzMl93aWR0aF9pbiAgICA9IHBQbGFuZUluLT51X3dpZHRoOwotICAgIHUzMl9oZWlnaHRfaW4gICA9IHBQbGFuZUluLT51X2hlaWdodDsKLQotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aC4qLwotICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikgewotICAgICAgICB1MzJfeF9pbmMgICA9ICgodTMyX3dpZHRoX2luLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHUzMl94X2luYyAgID0gKHUzMl93aWR0aF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pIHsKLSAgICAgICAgdTMyX3lfaW5jICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3lfaW5jID0gKHUzMl9oZWlnaHRfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luYyA+PSBNQVhfU0hPUlQpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICAgIEtlZXAgdGhlIGZyYWN0aW9uYWwgcGFydCwgaW50ZWdlciAgcGFydCBpcyBjb2RlZAotICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAqLwotICAgICAgICB1MzJfeV9hY2N1bSA9IHUzMl95X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICBpZiAoIXUzMl95X2FjY3VtKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl95X2FjY3VtID4+PSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHUzMl95X2FjY3VtID0gMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3hfaW5jID49IE1BWF9TSE9SVCkgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICBpZiAoIXUzMl94X2FjY3VtX3N0YXJ0KSB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID4+PSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICB9Ci0KLSAgICB1MzJfaGVpZ2h0ID0gdTMyX2hlaWdodF9vdXQ7Ci0KLSAgICAvKgotICAgIEJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQKLSAgICByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLiBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUKLSAgICBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToKLSAgICBGKHAnLHEnKT1mKHAscSlSKC1hKVIoYikrZihwLHEtMSlSKC1hKVIoYi0xKStmKHArMSxxKVIoMS1hKVIoYikrZihwKyYscSsxKVIoMS1hKVIoYi0xKQotICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYil3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uCi0gICAgKi8KLQotICAgIGRvIHsgLyogU2NhbiBhbGwgdGhlIHJvdyAqLwotCi0gICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bT4+MTIpJjE1OwotCi0gICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeF9hY2N1bSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgIHUzMl93aWR0aCA9IHUzMl93aWR0aF9vdXQ7Ci0KLSAgICAgICAgZG8geyAvKiBTY2FuIGFsb25nIGVhY2ggcm93ICovCi0gICAgICAgICAgICBwdTE2X3NyY190b3AgPSBwdTE2X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotICAgICAgICAgICAgcHUxNl9zcmNfYm90dG9tID0gcHUxNl9zcmNfdG9wICsgKHUzMl9zdHJpZGVfaW4+PjEpOwotICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzBdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFsxXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAyLGkzMl9nMDIsaTMyX3IwMiwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMF0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzFdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMF0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzFdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLChNNFZJRklfVUludDE2KXB1MTZfc3JjX2JvdHRvbVswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMywoTTRWSUZJX1VJbnQxNilwdTE2X3NyY19ib3R0b21bMV0pOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFNvbHV0aW9uIHRvIGF2b2lkIGdyZWVuIGVmZmVjdHMgZHVlIHRvIHRyYW5zcGFyZW5jeSAqLwotICAgICAgICAgICAgY291bnRfdHJhbnMgPSAwOwotCi0gICAgICAgICAgICAvKiBJZiBSR0IgaXMgdHJhbnNwYXJlbnQgY29sb3IgKDAsIDYzLCAwKSwgd2UgdHJhbnNmb3JtIGl0IHRvIHdoaXRlICgzMSw2MywzMSkgKi8KLSAgICAgICAgICAgIGlmIChpMzJfYjAwID09IDAgJiYgaTMyX2cwMCA9PSA2MyAmJiBpMzJfcjAwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDAgPSAzMTsKLSAgICAgICAgICAgICAgICBjb3VudF90cmFucysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkzMl9iMDEgPT0gMCAmJiBpMzJfZzAxID09IDYzICYmIGkzMl9yMDEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMSA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaTMyX2IwMiA9PSAwICYmIGkzMl9nMDIgPT0gNjMgJiYgaTMyX3IwMiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDIgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAyID0gMzE7Ci0gICAgICAgICAgICAgICAgY291bnRfdHJhbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpMzJfYjAzID09IDAgJiYgaTMyX2cwMyA9PSA2MyAmJiBpMzJfcjAzID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMyA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDMgPSAzMTsKLSAgICAgICAgICAgICAgICBjb3VudF90cmFucysrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY291bnRfdHJhbnMgPiAyKSB7Ci0gICAgICAgICAgICAgICAgLyogcGl4ZWwgaXMgdHJhbnNwYXJlbnQgKi8KLSAgICAgICAgICAgICAgICB1MzJfUnRlbXBfdmFsdWUgPSAwOwotICAgICAgICAgICAgICAgIHUzMl9HdGVtcF92YWx1ZSA9IDYzOwotICAgICAgICAgICAgICAgIHUzMl9CdGVtcF92YWx1ZSA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgoaTMyX3IwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX3IwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfZzAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfZzAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfQnRlbXBfdmFsdWUgPSAgKE00VklGSV9VSW50OCkoKChpMzJfYjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfYjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpwdTE2X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQxNikoICgoKHUzMl9HdGVtcF92YWx1ZSAmIDB4MzgpID4+IDMpIHwgKHUzMl9CdGVtcF92YWx1ZSA8PCAzKSkgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKCh1MzJfR3RlbXBfdmFsdWUgJiAweDcpIDw8IDUgKSB8IHUzMl9SdGVtcF92YWx1ZSk8PDggKSk7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeF9hY2N1bSArPSB1MzJfeF9pbmM7Ci0KLSAgICAgICAgfSB3aGlsZSgtLXUzMl93aWR0aCk7Ci0KLQotICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgdTMyX3lfYWNjdW0gKz0gdTMyX3lfaW5jOwotICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KSB7Ci0gICAgICAgICAgICBwdTE2X2RhdGFfaW4gPSBwdTE2X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogKHUzMl9zdHJpZGVfaW4+PjEpOwotICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICB9Ci0KLSAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlYjlkNDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I4ODh0b1JHQjg4OC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX1Jlc2l6ZVlVVjQyMHRvWVVWNDIwLmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBUaGlzIGZpbGUgaGFzIGEgUmVzaXplIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIC0jIEdlbmVyaWMgcmVzaXppbmcgb2YgWVVWNDIwIChQbGFuYXIpIGltYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBSZXNpemVzIFlVVjQyMCBQbGFuYXIgcGxhbmUuCi0gKiBAbm90ZSAgICBCYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgVSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgUGxhY2UgdGhlIFlVViBpbiB0aGUgb3VwdXQgcGxhbmUKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBjb2x1bW4KLSAqICAgICAgICAgIGVuZCBsb29wIHJvdwotICogICAgICAgICAgRm9yIHJlc2l6aW5nIGJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nCi0gKiAgICAgICAgICBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0IHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvd24gZWFjaCBjb2x1bW4uCi0gKiAgICAgICAgICBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQKLSAqICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMuIFRoZSByYXRpbyBvZiBjb21wcmVzc2lvbgotICogICAgICAgICAgb3IgZGlsYXRhdGlvbiBpcyBlc3RpbWF0ZWQgdXNpbmcgaW5wdXQgYW5kIG91dHB1dCBzaXplcy4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gWVVWNDIwIChQbGFuYXIpIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIFlVVjQyMCAoUGxhbmFyKSBwbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfZGF0YV9pbjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9kYXRhX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoX2luLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9pbiwgdTMyX3N0cmlkZV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luYywgdTMyX3lfaW5jOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9hY2N1bSwgdTMyX3lfYWNjdW0sIHUzMl94X2FjY3VtX3N0YXJ0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9SdGVtcF92YWx1ZSx1MzJfR3RlbXBfdmFsdWUsdTMyX0J0ZW1wX3ZhbHVlOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKLSAgICBNNFZJRklfVUludDMyICAgIGkzMl9iMDAsIGkzMl9nMDAsIGkzMl9yMDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICBpMzJfYjAxLCBpMzJfZzAxLCBpMzJfcjAxOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMiwgaTMyX2cwMiwgaTMyX3IwMjsKLSAgICBNNFZJRklfVUludDMyICAgIGkzMl9iMDMsIGkzMl9nMDMsIGkzMl9yMDM7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFlVViB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluLT51X2hlaWdodCkgPT0gRkFMU0UpICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV9oZWlnaHQpID09IEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluLT51X3dpZHRoKSA9PSBGQUxTRSkgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0LT51X3dpZHRoKSA9PSBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0KLSAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0gICAgICAgIHB1OF9kYXRhX2luICAgICA9IChNNFZJRklfVUludDgqKShwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0KTsKLSAgICAgICAgcHU4X2RhdGFfb3V0ICAgID0gKE00VklGSV9VSW50OCopKHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdCk7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICAgICAgdTMyX3N0cmlkZV9pbiAgID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgICAgICB1MzJfc3RyaWRlX291dCAgPSBwUGxhbmVPdXQtPnVfc3RyaWRlOwotCi0gICAgICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICAgICAgdTMyX3dpZHRoX2luICAgID0gcFBsYW5lSW4tPnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfaW4gICA9IHBQbGFuZUluLT51X2hlaWdodDsKLQotICAgICAgICB1MzJfd2lkdGhfb3V0ICAgPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfb3V0ICA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aC4qLwotICAgICAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2luYyAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9pbmMgICA9ICh1MzJfd2lkdGhfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA+PSB1MzJfaGVpZ2h0X2luKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9pbmMgICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2luYyA9ICh1MzJfaGVpZ2h0X2luICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfeV9pbmMgPj0gTUFYX1NIT1JUKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZAotICAgICAgICAgICAgICAgIG9uIHRoZSAxNiBoaWdoIGJpdHMgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHUzMl95X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeV9hY2N1bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IDA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3hfaW5jID49IE1BWF9TSE9SVCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSB1MzJfeF9pbmMgJiAweGZmZmY7Ci0KLSAgICAgICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSBNQVhfU0hPUlQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID4+PSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX2hlaWdodCA9IHUzMl9oZWlnaHRfb3V0OwotCi0gICAgICAgIC8qCi0gICAgICAgIEJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQKLSAgICAgICAgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4gRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlCi0gICAgICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOgotICAgICAgICBGKHAnLHEnKT1mKHAscSlSKC1hKVIoYikrZihwLHEtMSlSKC1hKVIoYi0xKStmKHArMSxxKVIoMS1hKVIoYikrZihwKyYscSsxKVIoMS1hKVIoYi0xKQotICAgICAgICB3aXRoICBSKHgpID0gLyB4KzEgIC0xID08IHggPTwgMCBcIDEteCAgMCA9PCB4ID08IDEgYW5kIGEgKHJlc3AuIGIpd2VpZ2h0aW5nIGNvZWZmaWNpZW50Ci0gICAgICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAgICAgKi8KLQotICAgICAgICBkbyB7IC8qIFNjYW4gYWxsIHRoZSByb3cgKi8KLQotICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bT4+MTIpJjE1OwotCi0gICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgICAgIHUzMl93aWR0aCA9IHUzMl93aWR0aF9vdXQ7Ci0KLSAgICAgICAgICAgIGRvIHsgLyogU2NhbiBhbG9uZyBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpKjM7Ci0gICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArICh1MzJfc3RyaWRlX2luKTsKLSAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICBpZiAoKHUzMl93aWR0aCA9PSAxKSAmJiAodTMyX3dpZHRoX2luID09IHUzMl93aWR0aF9vdXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgIFdoZW4gaW5wdXQgaGVpZ2h0IGlzIGVxdWFsIHRvIG91dHB1dCBoZWlnaHQgYW5kIGlucHV0IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIG91dHB1dCB3aWR0aCwgcmVwbGljYXRlIHRoZSBjb3JuZXIgcGl4ZWxzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgodTMyX2hlaWdodCA9PSAxKSAmJiAodTMyX2hlaWdodF9pbiA9PSB1MzJfaGVpZ2h0X291dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCxwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSxwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAyLGkzMl9nMDIsaTMyX3IwMixwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMyxwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGlucHV0IGhlaWdodCBpcyBub3QgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgd2lkdGggZXF1YWwgdG8gb3V0cHV0IHdpZHRoLCByZXBsaWNhdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCxwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSxwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAyLGkzMl9nMDIsaTMyX3IwMixwdThfc3JjX2JvdHRvbSwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMyxwdThfc3JjX2JvdHRvbSwwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgIFdoZW4gaW5wdXQgaGVpZ2h0IGlzIGVxdWFsIHRvIG91dHB1dCBoZWlnaHQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGlucHV0IHdpZHRoIG5vdCBlcXVhbCB0byBvdXRwdXQgd2lkdGgsIHJlcGxpY2F0ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgcm93IGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgodTMyX2hlaWdodCA9PSAxKSAmJiAodTMyX2hlaWdodF9pbiA9PSB1MzJfaGVpZ2h0X291dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCxwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSxwdThfc3JjX3RvcCwzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAyLGkzMl9nMDIsaTMyX3IwMixwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMyxwdThfc3JjX3RvcCwzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCxwdThfc3JjX3RvcCwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSxwdThfc3JjX3RvcCwzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAyLGkzMl9nMDIsaTMyX3IwMixwdThfc3JjX2JvdHRvbSwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMyxwdThfc3JjX2JvdHRvbSwzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1MzJfUnRlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9yMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9yMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9yMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9yMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgIHUzMl9HdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgoaTMyX2cwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2cwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX2cwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2cwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgdTMyX0J0ZW1wX3ZhbHVlID0gIChNNFZJRklfVUludDgpKCgoaTMyX2IwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2IwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX2IwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2IwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gdTMyX0J0ZW1wX3ZhbHVlIDsKLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSB1MzJfR3RlbXBfdmFsdWUgOwotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IHUzMl9SdGVtcF92YWx1ZSA7Ci0KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl94X2luYzsKLQotICAgICAgICAgICAgfSB3aGlsZSgtLXUzMl93aWR0aCk7Ci0KLSAgICAgICAgICAgIC8vcHUxNl9kYXRhX291dCA9IHB1MTZfZGF0YV9vdXQgKyAodTMyX3N0cmlkZV9vdXQ+PjEpIC0gKHUzMl93aWR0aF9vdXQpOwotCi0gICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHUzMl95X2luYzsKLSAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbikgOwotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSgtLXUzMl9oZWlnaHQpOwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9CR1I1NjUuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9CR1I1NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDA0MmU4MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvQkdSNTY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9CR1I1NjUuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBDb21ibyBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAtIyBSZXNpemVzIFlVVjQyMCBhbmQgY29udmVydHMgdG8gUkdSNTY1IHdpdGggcm90YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUodm9pZCAqcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZSBZVVY0MjAgcGxhbmUgYW5kIGNvbnZlcnRzIHRvIEJHUjU2NSB3aXRoICs5MCByb3RhdGlvbi4KLSAqIEBub3RlICAgIEJhc2ljIHN0dXJ0dXJlIG9mIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoc3RlcCAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKHN0ZXAgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCAxIHUgJiBWIHNhbXBsZQotICogICAgICAgICAgICAgICAgICBSZXNpemUgdGhlIFkgd2l0aCBjb3JyZXNwb25pbmcgVSBhbmQgViBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIENvbXB1dGUgdGhlIGZvdXIgY29ycmVzcG9uZGluZyBSIEcgQiB2YWx1ZXMKLSAqICAgICAgICAgICAgICAgICAgUGxhY2UgdGhlIFIgRyBCIGluIHRoZSBvdXB1dCBwbGFuZSBpbiByb3RhdGVkIGZhc2hpb24KLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBjb2x1bW4KLSAqICAgICAgICAgIGVuZCBsb29wIHJvdwotICogICAgICAgICAgRm9yIHJlc2l6aW5nIGJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nCi0gKiAgICAgICAgICBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0IHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvd24gZWFjaCBjb2x1bW4uCi0gKiAgICAgICAgICBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQKLSAqICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMuIFRoZSByYXRpbyBvZiBjb21wcmVzc2lvbgotICogICAgICAgICAgb3IgZGlsYXRhdGlvbiBpcyBlc3RpbWF0ZWQgdXNpbmcgaW5wdXQgYW5kIG91dHB1dCBzaXplcy4KLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gWVVWIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcENvbnRleHQ6IChJTikgQ29udGV4dCBQb2ludGVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gQkdSNTY1IFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUodm9pZCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9kYXRhX2luW1BMQU5FU10sICpwdThfZGF0YV9pbjFbUExBTkVTXSwqcHU4X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICAqcHUzMl9yZ2JfZGF0YV9jdXJyZW50LCAqcHUzMl9yZ2JfZGF0YV9uZXh0LCAqcHUzMl9yZ2JfZGF0YV9zdGFydDsKLQotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW5bUExBTkVTXSwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbltQTEFORVNdLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9pbltQTEFORVNdOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX291dCwgdTMyX3N0cmlkZTJfb3V0LCB1MzJfd2lkdGgyX1JHQiwgdTMyX2hlaWdodDJfUkdCOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9pbmNbUExBTkVTXSwgdTMyX3lfaW5jW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtX1ksIHUzMl94X2FjY3VtX1UsIHUzMl94X2FjY3VtX3N0YXJ0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeV9hY2N1bV9ZLCB1MzJfeV9hY2N1bV9VOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9mcmFjX1ksIHUzMl94X2ZyYWNfVSwgdTMyX3lfZnJhY19ZLHUzMl95X2ZyYWNfVTsKLSAgICBNNFZJRklfSW50MzIgICAgVV8zMiwgVl8zMiwgWV8zMiwgWXZhbF8zMjsKLSAgICBNNFZJRklfVUludDggICAgdThfUmVkLCB1OF9HcmVlbiwgdThfQmx1ZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JvdywgdTMyX2NvbDsKLQotICAgIE00VklGSV9VSW50MzIgICB1MzJfcGxhbmU7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9yZ2JfdGVtcDEsIHUzMl9yZ2JfdGVtcDI7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9yZ2JfdGVtcDMsdTMyX3JnYl90ZW1wNDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NoZWNrX3NpemU7Ci0KLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfdG9wX1ksKnB1OF9zcmNfdG9wX1UsKnB1OF9zcmNfdG9wX1YgOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY19ib3R0b21fWSwgKnB1OF9zcmNfYm90dG9tX1UsICpwdThfc3JjX2JvdHRvbV9WOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBZVVYgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgIHUzMl9jaGVja19zaXplID0gSVNfRVZFTihwUGxhbmVJblswXS51X2hlaWdodCk7Ci0gICAgaWYoIHUzMl9jaGVja19zaXplID09IEZBTFNFICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotICAgIHUzMl9jaGVja19zaXplID0gSVNfRVZFTihwUGxhbmVJblswXS51X3dpZHRoKTsKLSAgICBpZiAodTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotCi0gICAgfQotICAgIC8qIE1ha2UgdGhlIG91cHV0IHdpZHRoIGFuZCBoZWlnaHQgYXMgZXZlbiAqLwotICAgIHBQbGFuZU91dC0+dV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0ICYgMHhGRkZGRkZGRTsKLSAgICBwUGxhbmVPdXQtPnVfd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGggJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV9zdHJpZGUgPSBwUGxhbmVPdXQtPnVfc3RyaWRlICYgMHhGRkZGRkZGQzsKLQotICAgIC8qIEFzc2lnbm1lbnQgb2Ygb3V0cHV0IHBvaW50ZXIgKi8KLSAgICBwdThfZGF0YV9vdXQgICAgPSBwUGxhbmVPdXQtPnBhY19kYXRhICsgcFBsYW5lT3V0LT51X3RvcGxlZnQ7Ci0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgd2lkdGgocm90YXRlZCkgKi8KLSAgICB1MzJfd2lkdGhfb3V0ICAgPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgaGVpZ2h0KHJvdGF0ZWQpICovCi0gICAgdTMyX2hlaWdodF9vdXQgID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLQotICAgIHUzMl93aWR0aDJfUkdCICA9IHBQbGFuZU91dC0+dV93aWR0aCA+PiAxOwotICAgIHUzMl9oZWlnaHQyX1JHQiA9IHBQbGFuZU91dC0+dV9oZWlnaHQgPj4gMTsKLQotICAgIHUzMl9zdHJpZGVfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAxOwotICAgIHUzMl9zdHJpZGUyX291dCA9IHBQbGFuZU91dC0+dV9zdHJpZGUgPj4gMjsKLQotICAgIGZvcih1MzJfcGxhbmUgPSAwOyB1MzJfcGxhbmUgPCBQTEFORVM7IHUzMl9wbGFuZSsrKQotICAgIHsKLSAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0gICAgICAgIHB1OF9kYXRhX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnBhY19kYXRhICsgcFBsYW5lSW5bdTMyX3BsYW5lXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICAgICAgdTMyX3N0cmlkZV9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfaGVpZ2h0OwotICAgIH0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoIGZvciBZIFBsYW5lLiAqLwotICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbltZUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICgodTMyX3dpZHRoX2luW1lQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tZUGxhbmVdICAgPSAodTMyX3dpZHRoX2luW1lQbGFuZV0gKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodCBmb3IgWSBQbGFuZS4qLwotICAgIGlmICh1MzJfaGVpZ2h0X291dCA+PSB1MzJfaGVpZ2h0X2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbWVBsYW5lXSAgID0gKCh1MzJfaGVpZ2h0X2luW1lQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbWVBsYW5lXSA9ICh1MzJfaGVpZ2h0X2luW1lQbGFuZV0gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoIGZvciBVIGFuZCBWIFBsYW5lcy4gKi8KLSAgICBpZiAodTMyX3dpZHRoMl9SR0IgPj0gdTMyX3dpZHRoX2luW1VQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbVVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bVVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoMl9SR0ItMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tVUGxhbmVdICAgPSAodTMyX3dpZHRoX2luW1VQbGFuZV0gKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aDJfUkdCKTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQgZm9yIFUgYW5kIFYgUGxhbmVzLiAqLwotCi0gICAgaWYgKHUzMl9oZWlnaHQyX1JHQiA+PSB1MzJfaGVpZ2h0X2luW1VQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgID0gKCh1MzJfaGVpZ2h0X2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHQyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1VQbGFuZV0gID0gKHUzMl9oZWlnaHRfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCKTsKLSAgICB9Ci0KLSAgICB1MzJfeV9pbmNbVlBsYW5lXSA9IHUzMl95X2luY1tVUGxhbmVdOwotICAgIHUzMl94X2luY1tWUGxhbmVdID0gdTMyX3hfaW5jW1VQbGFuZV07Ci0KLSAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeV9pbmNbWVBsYW5lXSA+IE1BWF9TSE9SVCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQgb24gdGhlIDE2IGhpZ2ggYml0cywKLSAgICAgICAgICAgIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtX1kgPSB1MzJfeV9pbmNbWVBsYW5lXSAmIDB4ZmZmZjsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IHUzMl95X2luY1tVUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW1fWSkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA+Pj0gMTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IDA7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPSAwOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl94X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSB1MzJfeF9pbmNbWVBsYW5lXSAmIDB4ZmZmZjsKLQotICAgICAgICBpZiAoIXUzMl94X2FjY3VtX3N0YXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IDA7Ci0gICAgfQotCi0gICAgcHUzMl9yZ2JfZGF0YV9zdGFydCA9IChNNFZJRklfVUludDMyKilwdThfZGF0YV9vdXQ7Ci0KLSAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0Ci0gICAgICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgICAgICBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYSA6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYikgd2VpZ2h0aW5nIGNvZWZmaWNpZW50Ci0gICAgICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHRfb3V0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0gMikKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX1kgPSB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICAgICAgdTMyX3hfYWNjdW1fVSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgdTMyX3lfZnJhY19ZID0gKHUzMl95X2FjY3VtX1kgPj4gMTIpICYgMTU7Ci0gICAgICAgIHUzMl95X2ZyYWNfVSA9ICh1MzJfeV9hY2N1bV9VID4+IDEyKSAmIDE1OwotCi0gICAgICAgIC8qIFJHQiBjdXJyZW50IGxpbmUgcG9zaXRpb24gcG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgPSBwdTMyX3JnYl9kYXRhX3N0YXJ0IDsKLQotICAgICAgICAvKiBSR0IgbmV4dCBsaW5lIHBvc2l0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9uZXh0ICAgID0gcHUzMl9yZ2JfZGF0YV9jdXJyZW50ICsgKHUzMl9zdHJpZGUyX291dCk7Ci0KLSAgICAgICAgLyogWSBQbGFuZSBuZXh0IHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gcHU4X2RhdGFfaW5bWVBsYW5lXTsKLQotICAgICAgICB1MzJfcmdiX3RlbXAzID0gdTMyX3lfYWNjdW1fWSArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIGlmICh1MzJfcmdiX3RlbXAzID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbjFbWVBsYW5lXSA9ICBwdThfZGF0YV9pbltZUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfcmdiX3RlbXAzID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3JnYl90ZW1wMyAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3JnYl90ZW1wNCA9ICh1MzJfcmdiX3RlbXAzID4+IDEyKSAmIDE1OwotCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aF9vdXQ7IHUzMl9jb2wgIT0gMDsgdTMyX2NvbCAtPSAyKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFkgcGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbltZUGxhbmVdICsgKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFUgUGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1UgPSBwdThfZGF0YV9pbltVUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fVSA9IHB1OF9zcmNfdG9wX1UgKyB1MzJfc3RyaWRlX2luW1VQbGFuZV07Ci0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1YgPSBwdThfZGF0YV9pbltWUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fViA9IHB1OF9zcmNfdG9wX1YgKyB1MzJfc3RyaWRlX2luW1ZQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciBmb3IgWSBwbGFuZSAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBVIGFuZCBWIHBsYW5lcyAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19VID0gKHUzMl94X2FjY3VtX1UgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgVV8zMiA9ICgoKHB1OF9zcmNfdG9wX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9VWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpICsgKHB1OF9zcmNfYm90dG9tX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9VWzFdKnUzMl94X2ZyYWNfVSkqdTMyX3lfZnJhY19VICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIFZfMzIgPSAoKChwdThfc3JjX3RvcF9WWzBdKigxNi11MzJfeF9mcmFjX1UpICsgcHU4X3NyY190b3BfVlsxXSp1MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19VKSsgKHB1OF9zcmNfYm90dG9tX1ZbMF0qKDE2LXUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9WWzFdKnUzMl94X2ZyYWNfVSkqdTMyX3lfZnJhY19VICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19ZKSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl95X2ZyYWNfWSApID4+IDgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9VICs9ICh1MzJfeF9pbmNbVVBsYW5lXSk7Ci0KLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMSA9IFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDEgPSBQQUNLX0JHUjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW4xW1lQbGFuZV0rKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl9yZ2JfdGVtcDQpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3JnYl90ZW1wNCApID4+IDgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9ZICs9IHUzMl94X2luY1tZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2ZyYWNfWSA9ICh1MzJfeF9hY2N1bV9ZID4+IDEyKSYxNTsKLQotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX0JHUjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAyID0gUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNikgOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLQotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9jdXJyZW50KSsrID0gdTMyX3JnYl90ZW1wMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfY3VycmVudCkrKyA9IHUzMl9yZ2JfdGVtcDEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX0JHUjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbjFbWVBsYW5lXSsgKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl9yZ2JfdGVtcDQpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3JnYl90ZW1wNCApPj44KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fWSArPSB1MzJfeF9pbmNbWVBsYW5lXTsKLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzI9WV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMj1ZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9uZXh0KSsrID0gdTMyX3JnYl90ZW1wMiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfbmV4dCkrKyA9IHUzMl9yZ2JfdGVtcDIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX0JHUjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0gICAgICAgIH0gICAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIHUzMl95X2FjY3VtX1kgID0gIHUzMl9yZ2JfdGVtcDMgKyAodTMyX3lfaW5jW1lQbGFuZV0pOwotICAgICAgICB1MzJfeV9hY2N1bV9VICs9ICh1MzJfeV9pbmNbVVBsYW5lXSk7Ci0KLSAgICAgICAgLyogWSBwbGFuZSByb3cgdXBkYXRlICovCi0gICAgICAgIGlmICh1MzJfeV9hY2N1bV9ZID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltZUGxhbmVdID0gIHB1OF9kYXRhX2luMVtZUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyX3lfYWNjdW1fWSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltZUGxhbmVdKSk7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9ZICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1lQbGFuZV0gPSBwdThfZGF0YV9pbjFbWVBsYW5lXTsKLSAgICAgICAgfQotICAgICAgICAvKiBVIGFuZCBWIHBsYW5lcyByb3cgdXBkYXRlICovCi0gICAgICAgIGlmICh1MzJfeV9hY2N1bV9VID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltVUGxhbmVdID0gIHB1OF9kYXRhX2luW1VQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl95X2FjY3VtX1UgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bVVBsYW5lXSk7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltWUGxhbmVdID0gIHB1OF9kYXRhX2luW1ZQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl95X2FjY3VtX1UgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bVlBsYW5lXSk7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9VICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgICAvKiBCR1IgcG9pbnRlciBVcGRhdGUgKi8KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9zdGFydCArPSB1MzJfc3RyaWRlX291dDsKLQotICAgIH0gICAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvUkdCNTY1LmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvUkdCNTY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkYTlkMDcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b1JHQjU2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX1Jlc2l6ZVlVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0LmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBUaGlzIGZpbGUgaGFzIGEgQ29tYm8gZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgLSMgUmVzaXplcyBZVVY0MjAgYW5kIGNvbnZlcnRzIHRvIFJHUjU2NSB3aXRoIHJvdGF0aW9uCi0gKiBAZGF0ZQotICogICAgICAgICAgIC0gMjAwNC8wOC8xMTogQ3JlYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCh2b2lkICpwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZSBZVVY0MjAgcGxhbmUgYW5kIGNvbnZlcnRzIHRvIFJHQjU2NSB3aXRoICs5MCByb3RhdGlvbi4KLSAqIEBub3RlICAgIEJhc2ljIHN0dXJ0dXJlIG9mIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoc3RlcCAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKHN0ZXAgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCAxIHUgJiBWIHNhbXBsZQotICogICAgICAgICAgICAgICAgICBSZXNpemUgdGhlIFkgd2l0aCBjb3JyZXNwb25pbmcgVSBhbmQgViBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIENvbXB1dGUgdGhlIGZvdXIgY29ycmVzcG9uZGluZyBSIEcgQiB2YWx1ZXMKLSAqICAgICAgICAgICAgICAgICAgUGxhY2UgdGhlIFIgRyBCIGluIHRoZSBvdXB1dCBwbGFuZSBpbiByb3RhdGVkIGZhc2hpb24KLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBjb2x1bW4KLSAqICAgICAgICAgIGVuZCBsb29wIHJvdwotICogICAgICAgICAgRm9yIHJlc2l6aW5nIGJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nCi0gKiAgICAgICAgICBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0IHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvd24gZWFjaCBjb2x1bW4uCi0gKiAgICAgICAgICBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQKLSAqICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMuIFRoZSByYXRpbyBvZiBjb21wcmVzc2lvbgotICogICAgICAgICAgb3IgZGlsYXRhdGlvbiBpcyBlc3RpbWF0ZWQgdXNpbmcgaW5wdXQgYW5kIG91dHB1dCBzaXplcy4KLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gWVVWIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcENvbnRleHQ6IChJTikgQ29udGV4dCBQb2ludGVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gQkdSNTY1IFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSh2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9kYXRhX2luW1BMQU5FU10sICpwdThfZGF0YV9pbjFbUExBTkVTXSwqcHU4X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICAqcHUzMl9yZ2JfZGF0YV9jdXJyZW50LCAqcHUzMl9yZ2JfZGF0YV9uZXh0LCAqcHUzMl9yZ2JfZGF0YV9zdGFydDsKLQotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW5bUExBTkVTXSwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbltQTEFORVNdLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9pbltQTEFORVNdOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX291dCwgdTMyX3N0cmlkZTJfb3V0LCB1MzJfd2lkdGgyX1JHQiwgdTMyX2hlaWdodDJfUkdCOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9pbmNbUExBTkVTXSwgdTMyX3lfaW5jW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtX1ksIHUzMl94X2FjY3VtX1UsIHUzMl94X2FjY3VtX3N0YXJ0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeV9hY2N1bV9ZLCB1MzJfeV9hY2N1bV9VOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9mcmFjX1ksIHUzMl94X2ZyYWNfVSwgdTMyX3lfZnJhY19ZLHUzMl95X2ZyYWNfVTsKLSAgICBNNFZJRklfSW50MzIgICAgVV8zMiwgVl8zMiwgWV8zMiwgWXZhbF8zMjsKLSAgICBNNFZJRklfVUludDggICAgdThfUmVkLCB1OF9HcmVlbiwgdThfQmx1ZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JvdywgdTMyX2NvbDsKLQotICAgIE00VklGSV9VSW50MzIgICB1MzJfcGxhbmU7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9yZ2JfdGVtcDEsIHUzMl9yZ2JfdGVtcDI7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9yZ2JfdGVtcDMsdTMyX3JnYl90ZW1wNDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NoZWNrX3NpemU7Ci0KLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfdG9wX1ksKnB1OF9zcmNfdG9wX1UsKnB1OF9zcmNfdG9wX1YgOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY19ib3R0b21fWSwgKnB1OF9zcmNfYm90dG9tX1UsICpwdThfc3JjX2JvdHRvbV9WOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSAgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgIHUzMl9jaGVja19zaXplID0gSVNfRVZFTihwUGxhbmVJblswXS51X2hlaWdodCk7Ci0gICAgaWYoIHUzMl9jaGVja19zaXplID09IEZBTFNFICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotICAgIHUzMl9jaGVja19zaXplID0gSVNfRVZFTihwUGxhbmVJblswXS51X3dpZHRoKTsKLSAgICBpZiAodTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotCi0gICAgfQotICAgIC8qIE1ha2UgdGhlIG91cHV0IHdpZHRoIGFuZCBoZWlnaHQgYXMgZXZlbiAqLwotICAgIHBQbGFuZU91dC0+dV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0ICYgMHhGRkZGRkZGRTsKLSAgICBwUGxhbmVPdXQtPnVfd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGggJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV9zdHJpZGUgPSBwUGxhbmVPdXQtPnVfc3RyaWRlICYgMHhGRkZGRkZGQzsKLQotICAgIC8qIEFzc2lnbm1lbnQgb2Ygb3V0cHV0IHBvaW50ZXIgKi8KLSAgICBwdThfZGF0YV9vdXQgICAgPSBwUGxhbmVPdXQtPnBhY19kYXRhICsgcFBsYW5lT3V0LT51X3RvcGxlZnQ7Ci0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgd2lkdGgocm90YXRlZCkgKi8KLSAgICB1MzJfd2lkdGhfb3V0ICAgPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgaGVpZ2h0KHJvdGF0ZWQpICovCi0gICAgdTMyX2hlaWdodF9vdXQgID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGgyX1JHQiAgPSBwUGxhbmVPdXQtPnVfd2lkdGggPj4gMTsKLSAgICB1MzJfaGVpZ2h0Ml9SR0IgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0ID4+IDE7Ci0gICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICB1MzJfc3RyaWRlX291dCA9IHBQbGFuZU91dC0+dV9zdHJpZGUgPj4gMTsKLSAgICB1MzJfc3RyaWRlMl9vdXQgPSBwUGxhbmVPdXQtPnVfc3RyaWRlID4+IDI7Ci0KLSAgICBmb3IodTMyX3BsYW5lID0gMDsgdTMyX3BsYW5lIDwgUExBTkVTOyB1MzJfcGxhbmUrKykKLSAgICB7Ci0gICAgICAgIC8qIFNldCB0aGUgd29ya2luZyBwb2ludGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dC9vdXRwdXQgZGF0YSBmaWVsZCAqLwotICAgICAgICBwdThfZGF0YV9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZUluW3UzMl9wbGFuZV0udV90b3BsZWZ0OwotCi0gICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgICAgIHUzMl9zdHJpZGVfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgICAgICB1MzJfd2lkdGhfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X2hlaWdodDsKLSAgICB9Ci0gICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aCBmb3IgWSBQbGFuZS4qLwotICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbltZUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICgodTMyX3dpZHRoX2luW1lQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tZUGxhbmVdICAgPSAodTMyX3dpZHRoX2luW1lQbGFuZV0gKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodCBmb3IgWSBQbGFuZS4qLwotICAgIGlmICh1MzJfaGVpZ2h0X291dCA+PSB1MzJfaGVpZ2h0X2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbWVBsYW5lXSAgID0gKCh1MzJfaGVpZ2h0X2luW1lQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbWVBsYW5lXSA9ICh1MzJfaGVpZ2h0X2luW1lQbGFuZV0gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoIGZvciBVIGFuZCBWIFBsYW5lcy4qLwotICAgIGlmICh1MzJfd2lkdGgyX1JHQiA+PSB1MzJfd2lkdGhfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tVUGxhbmVdICAgPSAoKHUzMl93aWR0aF9pbltVUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoMl9SR0IpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodCBmb3IgVSBhbmQgViBQbGFuZXMuKi8KLQotICAgIGlmICh1MzJfaGVpZ2h0Ml9SR0IgPj0gdTMyX2hlaWdodF9pbltVUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1VQbGFuZV0gICA9ICgodTMyX2hlaWdodF9pbltVUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0Ml9SR0ItMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tVUGxhbmVdICA9ICh1MzJfaGVpZ2h0X2luW1VQbGFuZV0gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHQyX1JHQik7Ci0gICAgfQotCi0gICAgdTMyX3lfaW5jW1ZQbGFuZV0gPSB1MzJfeV9pbmNbVVBsYW5lXTsKLSAgICB1MzJfeF9pbmNbVlBsYW5lXSA9IHUzMl94X2luY1tVUGxhbmVdOwotCi0gICAgLyoKLSAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeV9pbmNbWVBsYW5lXSA+IE1BWF9TSE9SVCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZCBvbiB0aGUgMTYgaGlnaCBiaXRzLAotICAgICAgICBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAqLwotICAgICAgICB1MzJfeV9hY2N1bV9ZID0gdTMyX3lfaW5jW1lQbGFuZV0gJiAweGZmZmY7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPSB1MzJfeV9pbmNbVVBsYW5lXSAmIDB4ZmZmZjsKLQotICAgICAgICBpZiAoIXUzMl95X2FjY3VtX1kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1kgPSBNQVhfU0hPUlQ7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9VID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0gICAgICAgIHUzMl95X2FjY3VtX1kgPj49IDE7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPj49IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2FjY3VtX1kgPSAwOwotICAgICAgICB1MzJfeV9hY2N1bV9VID0gMDsKLQotICAgIH0KLQotICAgIC8qCi0gICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3hfaW5jW1lQbGFuZV0gPiBNQVhfU0hPUlQpCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luY1tZUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICB9Ci0gICAgLyogSW50aWFsaXNlIHRoZSBSR0IgcG9pbnRlciAqLwotICAgIHB1MzJfcmdiX2RhdGFfc3RhcnQgPSAoTTRWSUZJX1VJbnQzMiopcHU4X2RhdGFfb3V0OwotCi0gICAgLyoKLSAgICAgICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgICAgICByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLiBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUKLSAgICAgICAgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3VycyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgOgotICAgICAgICBGKHAnLHEnKT1mKHAscSlSKC1hKVIoYikrZihwLHEtMSlSKC1hKVIoYi0xKStmKHArMSxxKVIoMS1hKVIoYikrZihwKyYscSsxKVIoMS1hKVIoYi0xKQotICAgICAgICB3aXRoICBSKHgpID0gLyB4KzEgIC0xID08IHggPTwgMCBcIDEteCAgMCA9PCB4ID08IDEgYW5kIGEgKHJlc3AuIGIpIHdlaWdodGluZyBjb2VmZmljaWVudAotICAgICAgICBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uCi0gICAgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0X291dDsgdTMyX3JvdyAhPSAwOyB1MzJfcm93IC09IDIpCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9ZID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgICAgIHUzMl94X2FjY3VtX1UgPSB1MzJfeF9hY2N1bV9zdGFydDsKLQotICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgIHUzMl95X2ZyYWNfWSA9ICh1MzJfeV9hY2N1bV9ZID4+IDEyKSAmIDE1OwotICAgICAgICB1MzJfeV9mcmFjX1UgPSAodTMyX3lfYWNjdW1fVSA+PiAxMikgJiAxNTsKLQotICAgICAgICAvKiBSR0IgY3VycmVudCBsaW5lIFBvc2l0aW9uIFBvaW50ZXIgKi8KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9jdXJyZW50ID0gcHUzMl9yZ2JfZGF0YV9zdGFydCA7Ci0KLSAgICAgICAgLyogUkdCIG5leHQgbGluZSBwb3NpdGlvbiBwb2ludGVyICovCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfbmV4dCAgICA9IHB1MzJfcmdiX2RhdGFfY3VycmVudCArICh1MzJfc3RyaWRlMl9vdXQpOwotCi0gICAgICAgIC8qIFkgUGxhbmUgbmV4dCByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfZGF0YV9pbjFbWVBsYW5lXSA9IHB1OF9kYXRhX2luW1lQbGFuZV07Ci0KLSAgICAgICAgdTMyX3JnYl90ZW1wMyA9IHUzMl95X2FjY3VtX1kgKyAodTMyX3lfaW5jW1lQbGFuZV0pOwotICAgICAgICBpZiAodTMyX3JnYl90ZW1wMyA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gPSAgcHU4X2RhdGFfaW5bWVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3JnYl90ZW1wMyA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltZUGxhbmVdKTsKLSAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDMgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIHUzMl9yZ2JfdGVtcDQgPSAodTMyX3JnYl90ZW1wMyA+PiAxMikgJiAxNTsKLQotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGhfb3V0OyB1MzJfY29sICE9IDA7IHUzMl9jb2wgLT0gMikKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKiBJbnB1dCBZIHBsYW5lIGVsZW1lbnRzICovCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW5bWVBsYW5lXSArICh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBJbnB1dCBVIFBsYW5lIGVsZW1lbnRzICovCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9VID0gcHU4X2RhdGFfaW5bVVBsYW5lXSArICh1MzJfeF9hY2N1bV9VID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1UgPSBwdThfc3JjX3RvcF9VICsgdTMyX3N0cmlkZV9pbltVUGxhbmVdOwotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9WID0gcHU4X2RhdGFfaW5bVlBsYW5lXSArICh1MzJfeF9hY2N1bV9VID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1YgPSBwdThfc3JjX3RvcF9WICsgdTMyX3N0cmlkZV9pbltWUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgZm9yIFkgUGxhbmUgKi8KLSAgICAgICAgICAgIHUzMl94X2ZyYWNfWSA9ICh1MzJfeF9hY2N1bV9ZID4+IDEyKSYxNTsKLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciBmb3IgVSBhbmQgViBQbGFuZXMgKi8KLSAgICAgICAgICAgIHUzMl94X2ZyYWNfVSA9ICh1MzJfeF9hY2N1bV9VID4+IDEyKSYxNTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFVfMzIgPSAoKChwdThfc3JjX3RvcF9VWzBdKigxNi11MzJfeF9mcmFjX1UpICsgcHU4X3NyY190b3BfVVsxXSp1MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19VKSArIChwdThfc3JjX2JvdHRvbV9VWzBdKigxNi11MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fVVsxXSp1MzJfeF9mcmFjX1UpKnUzMl95X2ZyYWNfVSApID4+IDgpOwotCi0gICAgICAgICAgICBWXzMyID0gKCgocHU4X3NyY190b3BfVlswXSooMTYtdTMyX3hfZnJhY19VKSArIHB1OF9zcmNfdG9wX1ZbMV0qdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfVSkgKyAocHU4X3NyY19ib3R0b21fVlswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1ZbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1kpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3lfZnJhY19ZICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1UgKz0gKHUzMl94X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMSA9IFBBQ0tfUkdCNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbjFbWVBsYW5lXSsodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2ZyYWNfWSA9ICh1MzJfeF9hY2N1bV9ZID4+IDEyKSYxNTsKLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAyID0gUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMiA9IFBBQ0tfUkdCNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbltZUGxhbmVdICsgKHUzMl94X2FjY3VtX1kgPj4gMTYpIDsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1kpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3lfZnJhY19ZICkgPj4gOCk7Ci0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9jdXJyZW50KSsrID0gdTMyX3JnYl90ZW1wMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfUkdCNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICk+PjgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9ZICs9IHUzMl94X2luY1tZUGxhbmVdOwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMj1ZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9uZXh0KSsrID0gdTMyX3JnYl90ZW1wMiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfUkdCNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLSAgICAgICAgfSAgIC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSAgPSAgdTMyX3JnYl90ZW1wMyArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgKz0gKHUzMl95X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAvKiBZIHBsYW5lIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1kgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1lQbGFuZV0gPSAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzJfeV9hY2N1bV9ZID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1kgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdOwotICAgICAgICB9Ci0gICAgICAgIC8qIFUgYW5kIFYgcGxhbmVzIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1UgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1VQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltVUGxhbmVdKTsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1ZQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVlBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltWUGxhbmVdKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgJj0gMHhmZmZmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9zdGFydCArPSB1MzJfc3RyaWRlX291dDsKLQotICAgIH0gICAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmNwcCBiL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmNwcAppbmRleCA2NTM5MTcxLi45MWNmMmZkIDEwMDY0NAotLS0gYS9tZWRpYS9jb21tb25fdGltZS91dGlscy5jcHAKKysrIGIvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwCkBAIC01OSw3ICs1OSw3IEBACiB9CiAKIHZvaWQgZGVzZXJpYWxpemVTb2NrYWRkcihjb25zdCBQYXJjZWwqIHAsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKiBhZGRyKSB7Ci0gICAgbWVtc2V0KGFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisgICAgbWVtc2V0KGFkZHIsIDAsIHNpemVvZigqYWRkcikpOwogCiAgICAgYWRkci0+c3NfZmFtaWx5ID0gcC0+cmVhZEludDMyKCk7CiAgICAgc3dpdGNoKGFkZHItPnNzX2ZhbWlseSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL0FuZHJvaWQubWsgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QwMGJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNSBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9CeXRlQXJyYXlPdXRwdXQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9CeXRlQXJyYXlPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTczOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX0JZVEVfQVJSQVlfT1VUUFVUX0gKKyNkZWZpbmUgSU1HX1VUSUxTX0JZVEVfQVJSQVlfT1VUUFVUX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBhY2N1bXVsYXRlcyB3cml0dGVuIGJ5dGVzIGludG8gYSBidWZmZXIuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIEJ5dGVBcnJheU91dHB1dCA6IHB1YmxpYyBPdXRwdXQgeworICAgIHB1YmxpYzoKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXQoKTsKKworICAgICAgICB2aXJ0dWFsIH5CeXRlQXJyYXlPdXRwdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiB0aGlzIEJ5dGVBcnJheU91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhlIG51bWJlciBvZiBieXRlcyBnaXZlbiBpbiB0aGUgY291bnQKKyAgICAgICAgICogYXJndW1lbnQgd2lsbCBiZSB3cml0dGVuLiAgQnl0ZXMgd2lsbCBiZSB3cml0dGVuIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBzdGFydGluZworICAgICAgICAgKiBhdCB0aGUgaW5kZXggZ2l2ZW4gaW4gdGhlIG9mZnNldCBhcmd1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhpcyBCeXRlQXJyYXlPdXRwdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgY3VycmVudCBzaXplIG9mIHRoZSBhcnJheSBvZiBieXRlcyB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgcG9pbnRlciB0byBhcnJheSBvZiBieXRlcyB3cml0dGVuLiAgSXQgaXMgbm90IHZhbGlkIHRvIHVzZSB0aGlzIHBvaW50ZXIgaWYKKyAgICAgICAgICogb3Blbiwgd3JpdGUsIG9yIGNsb3NlIGlzIGNhbGxlZCBhZnRlciB0aGlzIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogZ2V0QXJyYXkoKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IG1CeXRlQXJyYXk7Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfQllURV9BUlJBWV9PVVRQVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODliMDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRE5HX1VUSUxTX0gKKyNkZWZpbmUgSU1HX1VUSUxTX0ROR19VVElMU19ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvQnl0ZUFycmF5T3V0cHV0Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL0VuZGlhblV0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKyNkZWZpbmUgTkVMRU1TKHgpICgoaW50KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpKQorCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGJ1aWxkaW5nIHZhbHVlcyBmb3IgdGhlIE9wY29kZUxpc3QgdGFncyBzcGVjaWZpZWQKKyAqIGluIHRoZSBBZG9iZSBETkcgMS40IHNwZWMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIE9wY29kZUxpc3RCdWlsZGVyIDogcHVibGljIExpZ2h0UmVmQmFzZTxPcGNvZGVMaXN0QnVpbGRlcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBDZmFMYXlvdXQgeworICAgICAgICAgICAgQ0ZBX1JHR0IgPSAwLAorICAgICAgICAgICAgQ0ZBX0dSQkcsCisgICAgICAgICAgICBDRkFfR0JSRywKKyAgICAgICAgICAgIENGQV9CR0dSLAorICAgICAgICB9OworCisgICAgICAgIE9wY29kZUxpc3RCdWlsZGVyKCk7CisgICAgICAgIHZpcnR1YWwgfk9wY29kZUxpc3RCdWlsZGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdG90YWwgc2l6ZSBvZiB0aGlzIG9wY29kZSBsaXN0IGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBvcGNvZGVzIGRlZmluZWQgaW4gdGhpcyBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgb3Bjb2RlIGxpc3QgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhpcyBidWZmZXIKKyAgICAgICAgICogbXVzdCBiZSBhYmxlIHRvIGhvbGQgYXQgbGVhc3QgYXMgbWFueSBlbGVtZW50cyBhcyByZXR1cm5lZAorICAgICAgICAgKiBieSBjYWxsaW5nIHRoZSBnZXRTaXplKCkgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYnVpbGRPcExpc3QoLypvdXQqLyB1aW50OF90KiBidWYpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgR2Fpbk1hcCBvcGNvZGUocykgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLiAgVGhlIGdpdmVuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBHYWluTWFwIG9wY29kZSB3aXRoIHRoZSBnaXZlbiBmaWVsZHMuICBUaGUgbWFwR2FpbnMgYXJyYXkKKyAgICAgICAgICogbXVzdCBoYXZlIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJvd1BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFwUG9pbnRzSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBPcmlnaW5WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWFwR2FpbnMpOworCisgICAgICAgIC8vIFRPRE86IEFkZCBvdGhlciBPcGNvZGUgbWV0aG9kcworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEZMQUdfT1BUSU9OQUwgPSAweDF1OworICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR19PUFRJT05BTF9GT1JfUFJFVklFVyA9IDB4MnU7CisKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBHQUlOX01BUF9JRCA9IDksCisgICAgICAgICAgICBMU01fUl9JTkQgPSAwLAorICAgICAgICAgICAgTFNNX0dFX0lORCA9IDEsCisgICAgICAgICAgICBMU01fR09fSU5EID0gMiwKKyAgICAgICAgICAgIExTTV9CX0lORCA9IDMsCisgICAgICAgIH07CisKKyAgICAgICAgdWludDMyX3QgbUNvdW50OworICAgICAgICBCeXRlQXJyYXlPdXRwdXQgbU9wTGlzdDsKKyAgICAgICAgRW5kaWFuT3V0cHV0IG1FbmRpYW5PdXQ7CisKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19ETkdfVVRJTFNfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRW5kaWFuVXRpbHMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9FbmRpYW5VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWJlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRW5kaWFuVXRpbHMuaApAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRU5ESUFOX1VUSUxTCisjZGVmaW5lIElNR19VVElMU19FTkRJQU5fVVRJTFMKKworI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBFbmRpYW5uZXNzIHR5cGVzIHN1cHBvcnRlZC4KKyAqLworZW51bSBBTkRST0lEX0FQSSBFbmRpYW5uZXNzIHsKKyAgICBVTkRFRklORURfRU5ESUFOLCAvLyBEZWZhdWx0IGVuZGlhbm5lc3Mgd2lsbCBiZSB1c2VkLgorICAgIEJJRywKKyAgICBMSVRUTEUKK307CisKKy8qKgorICogQ29udmVydCBmcm9tIHRoZSBuYXRpdmUgZGV2aWNlIGVuZGlhbm5lc3MgdG8gYmlnIGVuZGlhbi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgY29udmVydFRvQmlnRW5kaWFuKFQgaW4pOworCisvKioKKyAqIENvbnZlcnQgZnJvbSB0aGUgbmF0aXZlIGRldmljZSBlbmRpYW5uZXNzIHRvIGxpdHRsZSBlbmRpYW4uCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIGNvbnZlcnRUb0xpdHRsZUVuZGlhbihUIGluKTsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgZm9yIHdyaXRpbmcgdG8gYW4gT3V0cHV0IHdpdGggdGhlIGdpdmVuIGVuZGlhbm5lc3MuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIEVuZGlhbk91dHB1dCA6IHB1YmxpYyBPdXRwdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyYXAgdGhlIGdpdmVuIE91dHB1dC4gIENhbGxpbmcgd3JpdGUgbWV0aG9kcyB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgKiB3cml0ZXMgdG8gdGhpcyBvdXRwdXQuCisgICAgICAgICAqLworICAgICAgICBFbmRpYW5PdXRwdXQoT3V0cHV0KiBvdXQsIEVuZGlhbm5lc3MgZW5kPUxJVFRMRSk7CisKKyAgICAgICAgdmlydHVhbCB+RW5kaWFuT3V0cHV0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGwgb3BlbiBvbiB0aGUgd3JhcHBlZCBvdXRwdXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbCBjbG9zZSBvbiB0aGUgd3JhcHBlZCBvdXRwdXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgZW5kaWFubmVzcyB0byB1c2Ugd2hlbiB3cml0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEVuZGlhbm5lc3MoRW5kaWFubmVzcyBlbmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGVuZGlhbm5lc3MuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIEVuZGlhbm5lc3MgZ2V0RW5kaWFubmVzcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gYnkgdGhpcyBFbmRpYW5PdXRwdXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldEN1cnJlbnRPZmZzZXQoKSBjb25zdDsKKworCisgICAgICAgIC8vIFRPRE86IHN3aXRjaCB3cml0ZSBtZXRob2RzIHRvIHVpbnQzMl90IGluc3RlYWQgb2Ygc2l6ZV90LAorICAgICAgICAvLyB0aGUgbWF4IHNpemUgb2YgYSBUSUZGIGZpbGVzIGlzIGJvdW5kZWQKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHdpbGwgd3JpdGUgZWxlbWVudHMgZnJvbSBnaXZlbiBpbnB1dCBidWZmZXIgdG8gdGhlIG91dHB1dC4KKyAgICAgICAgICogQ291bnQgZWxlbWVudHMgaW4gdGhlIGJ1ZmZlciB3aWxsIGJlIHdyaXR0ZW4gd2l0aCB0aGUgZW5kaWFubmVzcyBzZXQgZm9yIHRoaXMKKyAgICAgICAgICogRW5kaWFuT3V0cHV0LiAgSWYgdGhlIGdpdmVuIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gemVybywgdGhhdCBtYW55IGVsZW1lbnRzIHdpbGwKKyAgICAgICAgICogYmUgc2tpcHBlZCBpbiB0aGUgYnVmZmVyIGJlZm9yZSB3cml0aW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgaW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB1aW50MTZfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgaW50MTZfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDMyX3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IGludDMyX3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQ2NF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBpbnQ2NF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBmbG9hdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgZG91YmxlKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGlubGluZSBzdGF0dXNfdCB3cml0ZUhlbHBlcihjb25zdCBUKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdWludDMyX3QgbU9mZnNldDsKKyAgICAgICAgT3V0cHV0KiBtT3V0cHV0OworICAgICAgICBFbmRpYW5uZXNzIG1FbmRpYW47Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIHN0YXR1c190IEVuZGlhbk91dHB1dDo6d3JpdGVIZWxwZXIoY29uc3QgVCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBhc3NlcnQob2Zmc2V0IDw9IGNvdW50KTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihUKTsKKyAgICBzd2l0Y2gobUVuZGlhbikgeworICAgICAgICBjYXNlIEJJRzogeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IG9mZnNldDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBUIHRtcCA9IGNvbnZlcnRUb0JpZ0VuZGlhbjxUPihidWZbb2Zmc2V0ICsgaV0pOworICAgICAgICAgICAgICAgIGlmICgocmVzID0gbU91dHB1dC0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnRtcCksIDAsIHNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU9mZnNldCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBMSVRUTEU6IHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSBvZmZzZXQ7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgVCB0bXAgPSBjb252ZXJ0VG9MaXR0bGVFbmRpYW48VD4oYnVmW29mZnNldCArIGldKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IG1PdXRwdXQtPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZ0bXApLCAwLCBzaXplKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1PZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQ4X3QgY29udmVydFRvQmlnRW5kaWFuKHVpbnQ4X3QgaW4pIHsKKyAgICByZXR1cm4gaW47Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ4X3QgY29udmVydFRvQmlnRW5kaWFuKGludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQxNl90IGNvbnZlcnRUb0JpZ0VuZGlhbih1aW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9iZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDE2X3QgY29udmVydFRvQmlnRW5kaWFuKGludDE2X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmUxNihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50MzJfdCBjb252ZXJ0VG9CaWdFbmRpYW4odWludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQzMl90IGNvbnZlcnRUb0JpZ0VuZGlhbihpbnQzMl90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlMzIoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDY0X3QgY29udmVydFRvQmlnRW5kaWFuKHVpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlNjQoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50NjRfdCBjb252ZXJ0VG9CaWdFbmRpYW4oaW50NjRfdCBpbikgeworICAgIHJldHVybiBodG9iZTY0KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQ4X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKHVpbnQ4X3QgaW4pIHsKKyAgICByZXR1cm4gaW47Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ4X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKGludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQxNl90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbih1aW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9sZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDE2X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKGludDE2X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGUxNihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50MzJfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4odWludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQzMl90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbihpbnQzMl90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlMzIoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDY0X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKHVpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlNjQoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50NjRfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4oaW50NjRfdCBpbikgeworICAgIHJldHVybiBodG9sZTY0KGluKTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX0VORElBTl9VVElMUyovCisKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9GaWxlSW5wdXQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9GaWxlSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRmMjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVJbnB1dC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX0ZJTEVfSU5QVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfRklMRV9JTlBVVF9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvSW5wdXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciByZWFkaW5nIGZyb20gYSBmaWxlLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBGaWxlSW5wdXQgOiBwdWJsaWMgSW5wdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGZpbGUgaW5wdXQgZm9yIHRoZSBnaXZlbiBwYXRoLgorICAgICAgICAgKi8KKyAgICAgICAgRmlsZUlucHV0KFN0cmluZzggcGF0aCk7CisKKyAgICAgICAgdmlydHVhbCB+RmlsZUlucHV0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHBhdGggZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIGZpbGUgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLiAgQXQgbW9zdCwgdGhlIG51bWJlcgorICAgICAgICAgKiBvZiBieXRlcyBnaXZlbiBpbiB0aGUgY291bnQgYXJndW1lbnQgd2lsbCBiZSByZWFkLiAgQnl0ZXMgd2lsbCBiZSB3cml0dGVuCisgICAgICAgICAqIGludG8gdGhlIGdpdmVuIGJ1ZmZlciBzdGFydGluZyBhdCB0aGUgaW5kZXggZ2l2ZW4gaW4gdGhlIG9mZnNldCBhcmd1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIE5PVF9FTk9VR0hfREFUQSBpZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgSWYgYW4KKyAgICAgICAgICogZXJyb3IgaGFzIG9jY3VycmVkLCB0aGlzIHdpbGwgcmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlciB0aGFuIE5PVF9FTk9VR0hfREFUQS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3NpemVfdCByZWFkKHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworICAgIHByaXZhdGU6CisgICAgICAgIEZJTEUgKm1GcDsKKyAgICAgICAgU3RyaW5nOCBtUGF0aDsKKyAgICAgICAgYm9vbCBtT3BlbjsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKworI2VuZGlmIC8qSU1HX1VUSUxTX0lOUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVPdXRwdXQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9GaWxlT3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1YmUyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9GaWxlT3V0cHV0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRklMRV9PVVRQVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfRklMRV9PVVRQVVRfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworY2xhc3MgQU5EUk9JRF9BUEkgRmlsZU91dHB1dCA6IHB1YmxpYyBPdXRwdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsZU91dHB1dChTdHJpbmc4IHBhdGgpOworICAgICAgICB2aXJ0dWFsIH5GaWxlT3V0cHV0KCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworICAgIHByaXZhdGU6CisgICAgICAgIEZJTEUgKm1GcDsKKyAgICAgICAgU3RyaW5nOCBtUGF0aDsKKyAgICAgICAgYm9vbCBtT3BlbjsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19GSUxFX09VVFBVVF9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9JbnB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwMzY0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9JbnB1dC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX0lOUFVUX0gKKyNkZWZpbmUgSU1HX1VUSUxTX0lOUFVUX0gKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHVzZWQgYXMgYSBzb3VyY2Ugb2YgYnl0ZXMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIElucHV0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfklucHV0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wZW4gdGhpcyBJbnB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVhZCBieXRlcyBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBBdCBtb3N0LCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIGluIHRoZQorICAgICAgICAgKiBjb3VudCBhcmd1bWVudCB3aWxsIGJlIHJlYWQuICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4gaW50byB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nCisgICAgICAgICAqIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgTk9UX0VOT1VHSF9EQVRBIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICBJZiBhbgorICAgICAgICAgKiBlcnJvciBoYXMgb2NjdXJyZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyIHRoYW4gTk9UX0VOT1VHSF9EQVRBLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2tpcHMgYnl0ZXMgaW4gdGhlIGlucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2tpcHBlZCwgb3IgTk9UX0VOT1VHSF9EQVRBIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICBJZiBhbgorICAgICAgICAgKiBlcnJvciBoYXMgb2NjdXJyZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyIHRoYW4gTk9UX0VOT1VHSF9EQVRBLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHNraXAoc2l6ZV90IGNvdW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhlIElucHV0LiAgSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgb3BlbiBvbiBhIHByZXZpb3VzbHkgY2xvc2VkIElucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKworI2VuZGlmIC8qSU1HX1VUSUxTX0lOUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL09yZGVyYWJsZS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL09yZGVyYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjUzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3JkZXJhYmxlLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfT1JERVJBQkxFCisjZGVmaW5lIElNR19VVElMU19PUkRFUkFCTEUKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBDT01QQVJFX0RFRihvcCkgXAoraW5saW5lIGJvb2wgb3BlcmF0b3Igb3AgKGNvbnN0IE9yZGVyYWJsZSYgb3JkZXJhYmxlKSBjb25zdDsKKworLyoqCisgKiBTdWJjbGFzc2VzIG9mIE9yZGVyYWJsZSBjYW4gYmUgY29tcGFyZWQgYW5kIHNvcnRlZC4gIFRoaXMgaXMKKyAqIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHNvcnRlZCBhcnJheXMgb2YgVElGRiBlbnRyaWVzCisgKiBhbmQgSUZEcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgT3JkZXJhYmxlICB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5PcmRlcmFibGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGFyaXNvbiBvcGVyYXRvdG9ycyBhcmUgYmFzZWQgb24gdGhlIHZhbHVlIHJldHVybmVkCisgICAgICAgICAqIGZyb20gdGhpcyBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENvbXBhcmFibGVWYWx1ZSgpIGNvbnN0ID0gMDsKKworICAgICAgICBDT01QQVJFX0RFRig+KQorICAgICAgICBDT01QQVJFX0RFRig8KQorICAgICAgICBDT01QQVJFX0RFRig+PSkKKyAgICAgICAgQ09NUEFSRV9ERUYoPD0pCisgICAgICAgIENPTVBBUkVfREVGKD09KQorICAgICAgICBDT01QQVJFX0RFRighPSkKK307CisKKyN1bmRlZiBDT01QQVJFX0RFRgorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfT1JERVJBQkxFKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9PdXRwdXQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9PdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZhZTIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL091dHB1dC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX09VVFBVVF9ICisjZGVmaW5lIElNR19VVElMU19PVVRQVVRfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdXNlZCB0byBvdXRwdXQgYnl0ZXMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIE91dHB1dCB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5PdXRwdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiB0aGlzIE91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhlIG51bWJlciBvZiBieXRlcyBnaXZlbiBpbiB0aGUgY291bnQKKyAgICAgICAgICogYXJndW1lbnQgd2lsbCBiZSB3cml0dGVuLiAgQnl0ZXMgd2lsbCBiZSB3cml0dGVuIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBzdGFydGluZworICAgICAgICAgKiBhdCB0aGUgaW5kZXggZ2l2ZW4gaW4gdGhlIG9mZnNldCBhcmd1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlIHRoaXMgT3V0cHV0LiAgSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgb3BlbiBvbiBhIHByZXZpb3VzbHkgY2xvc2VkIE91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfT1VUUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1BhaXIuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9QYWlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1MWNhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9QYWlyLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfUEFJUl9ICisjZGVmaW5lIElNR19VVElMU19QQUlSX0gKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBHZW5lcmljIHBhaXIgdXRpbGl0eSBjbGFzcy4gIE5vdGhpbmcgc3BlY2lhbCBoZXJlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBTPgorY2xhc3MgQU5EUk9JRF9BUEkgUGFpciB7CisgICAgcHVibGljOgorICAgICAgICBGIGZpcnN0OworICAgICAgICBTIHNlY29uZDsKKworICAgICAgICBQYWlyKCkge30KKworICAgICAgICBQYWlyKGNvbnN0IFBhaXImIG8pIDogZmlyc3Qoby5maXJzdCksIHNlY29uZChvLnNlY29uZCkge30KKworICAgICAgICBQYWlyKGNvbnN0IEYmIGYsIGNvbnN0IFMmIHMpIDogZmlyc3QoZiksIHNlY29uZChzKSB7fQorfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1BBSVJfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvU29ydGVkRW50cnlWZWN0b3IuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTlhODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvU29ydGVkRW50cnlWZWN0b3IuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19TT1JURURfRU5UUllfVkVDVE9SX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1NPUlRFRF9FTlRSWV9WRUNUT1JfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeS5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBTdWJjbGFzcyBvZiBTb3J0ZWRWZWN0b3IgdGhhdCBoYXMgYmVlbiBleHRlbmRlZCB0bworICogZG8gY29tcGFyaXNvbnMvbG9va3VwcyBiYXNlZCBvbiB0aGUgdGFnIElEIG9mIHRoZSBlbnRyaWVzLgorICovCitjbGFzcyBTb3J0ZWRFbnRyeVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8c3A8VGlmZkVudHJ5PiA+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflNvcnRlZEVudHJ5VmVjdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcgSUQsIG9yCisgICAgICAgICAqIC0xIGlmIG5vbmUgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgc3NpemVfdCBpbmRleE9mVGFnKHVpbnQxNl90IHRhZykgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJlIHRhZyBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0OworfTsKKworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfU09SVEVEX0VOVFJZX1ZFQ1RPUl9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9TdHJpcFNvdXJjZS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1N0cmlwU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjNmI2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9TdHJpcFNvdXJjZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1NUUklQX1NPVVJDRV9ICisjZGVmaW5lIElNR19VVElMU19TVFJJUF9TT1VSQ0VfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGhpcyBjbGFzcyBhY3RzIGFzIGEgZGF0YSBzb3VyY2UgZm9yIHN0cmlwcyBzZXQgaW4gYSBUaWZmSWZkLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBTdHJpcFNvdXJjZSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5TdHJpcFNvdXJjZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBjb3VudCBieXRlcyB0byB0aGUgc3RyZWFtLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1N0cmVhbShPdXRwdXQmIHN0cmVhbSwgdWludDMyX3QgY291bnQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBzb3VyY2UgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJZmQoKSBjb25zdCA9IDA7Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfU1RSSVBfU09VUkNFX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWE3NDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmgKQEAgLTAsMCArMSwxMzkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19USUZGX1RBR19ERUZJTklUSU9OX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfVEFHX0RFRklOSVRJT05fSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGFnIGRlZmluaXRpb25zIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgc3RhbmRhcmQgVElGRiBjb21wYXRpYmxlIHRhZ3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IFRhZ0RlZmluaXRpb24geworICAgIC8vIFRoZSB0YWcgbmFtZS4KKyAgICBjb25zdCBjaGFyKiB0YWdOYW1lOworICAgIC8vIFRoZSBzcGVjaWZpZWQgdGFnIElELgorICAgIGNvbnN0IHVpbnQxNl90IHRhZ0lkOworICAgIC8vIFRoZSBkZWZhdWx0IHR5cGUgZm9yIHRoaXMgdGFnLiAgVGhpcyBtdXN0IGJlIGEgdmFsaWQgVElGRiB0eXBlLgorICAgIGNvbnN0IFRhZ1R5cGUgZGVmYXVsdFR5cGU7CisgICAgLy8gVGhlIGRlZmF1bHQgSW1hZ2UgRmlsZSBEaXJlY3RvcnkgKElGRCkgZm9yIHRoaXMgdGFnLgorICAgIGNvbnN0IHVpbnQzMl90IGRlZmF1bHRJZmQ7CisgICAgLy8gVGhlIHZhbGlkIGNvdW50IGZvciB0aGlzIHRhZywgb3IgMCBpZiB0aGUgY291bnQgaXMgbm90IGZpeGVkLgorICAgIGNvbnN0IHVpbnQzMl90IGZpeGVkQ291bnQ7CisgICAgLy8gVGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhZyB2YWx1ZSwgb3IgVU5ERUZJTkVEX0VORElBTiBpZiB0aGVyZSBpcyBubyBmaXhlZCBlbmRpYW4KKyAgICBjb25zdCBFbmRpYW5uZXNzIGZpeGVkRW5kaWFuOworfSBUYWdEZWZpbml0aW9uX3Q7CisKKy8qKgorICogQ29udmVuaWVuY2UgZGVmaW5lcyBmb3IgdGFnIGlkcy4KKyAqLworZW51bSB7CisgICAgVEFHX1JBV1RPUFJFVklFV0dBSU4gPSAweEM3QTh1LAorICAgIFRBR19ORVdSQVdJTUFHRURJR0VTVCA9IDB4QzdBN3UsCisgICAgVEFHX09SSUdJTkFMREVGQVVMVENST1BTSVpFID0gMHhDNzkzdSwKKyAgICBUQUdfT1JJR0lOQUxCRVNUUVVBTElUWUZJTkFMU0laRSA9IDB4Qzc5MnUsCisgICAgVEFHX09SSUdJTkFMREVGQVVMVEZJTkFMU0laRSA9IDB4Qzc5MXUsCisgICAgVEFHX1BST0ZJTEVIVUVTQVRNQVBFTkNPRElORyA9IDB4QzdBM3UsCisgICAgVEFHX1BST0ZJTEVMT09LVEFCTEVFTkNPRElORyA9IDB4QzdBNHUsCisgICAgVEFHX0JBU0VMSU5FRVhQT1NVUkVPRkZTRVQgPSAweEM3QTV1LAorICAgIFRBR19ERUZBVUxUQkxBQ0tSRU5ERVIgPSAweEM3QTZ1LAorICAgIFRBR19ERUZBVUxUVVNFUkNST1AgPSAweEM3QjV1LAorICAgIFRBR19OT0lTRVBST0ZJTEUgPSAweEM3NjF1LAorICAgIFRBR19PUENPREVMSVNUMyA9IDB4Qzc0RXUsCisgICAgVEFHX09QQ09ERUxJU1QyID0gMHhDNzQxdSwKKyAgICBUQUdfT1BDT0RFTElTVDEgPSAweEM3NDB1LAorICAgIFRBR19QUk9GSUxFTE9PS1RBQkxFREFUQSA9IDB4QzcyNnUsCisgICAgVEFHX1BST0ZJTEVMT09LVEFCTEVESU1TID0gMHhDNzI1dSwKKyAgICBUQUdfUk9XSU5URVJMRUFWRUZBQ1RPUiA9IDB4QzcxRnUsCisgICAgVEFHX1NVQlRJTEVCTE9DS1NJWkUgPSAweEM3MUV1LAorICAgIFRBR19PUklHSU5BTFJBV0ZJTEVESUdFU1QgPSAweEM3MUR1LAorICAgIFRBR19SQVdJTUFHRURJR0VTVCA9IDB4QzcxQ3UsCisgICAgVEFHX1BSRVZJRVdEQVRFVElNRSA9IDB4QzcxQnUsCisgICAgVEFHX1BSRVZJRVdDT0xPUlNQQUNFID0gMHhDNzFBdSwKKyAgICBUQUdfUFJFVklFV1NFVFRJTkdTRElHRVNUID0gMHhDNzE5dSwKKyAgICBUQUdfUFJFVklFV1NFVFRJTkdTTkFNRSA9IDB4QzcxOHUsCisgICAgVEFHX1BSRVZJRVdBUFBMSUNBVElPTlZFUlNJT04gPSAweEM3MTd1LAorICAgIFRBR19QUkVWSUVXQVBQTElDQVRJT05OQU1FID0gMHhDNzE2dSwKKyAgICBUQUdfRk9SV0FSRE1BVFJJWDIgPSAweEM3MTV1LAorICAgIFRBR19GT1JXQVJETUFUUklYMSA9IDB4QzcxNHUsCisgICAgVEFHX1BST0ZJTEVDT1BZUklHSFQgPSAweEM2RkV1LAorICAgIFRBR19QUk9GSUxFRU1CRURQT0xJQ1kgPSAweEM2RkR1LAorICAgIFRBR19QUk9GSUxFVE9ORUNVUlZFID0gMHhDNkZDdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUERBVEEyID0gMHhDNkZCdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUERBVEExID0gMHhDNkZBdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUERJTVMgPSAweEM2Rjl1LAorICAgIFRBR19QUk9GSUxFTkFNRSA9IDB4QzZGOHUsCisgICAgVEFHX05PSVNFUkVEVUNUSU9OQVBQTElFRCA9IDB4QzZGN3UsCisgICAgVEFHX0FTU0hPVFBST0ZJTEVOQU1FID0gMHhDNkY2dSwKKyAgICBUQUdfRVhUUkFDQU1FUkFQUk9GSUxFUyA9IDB4QzZGNXUsCisgICAgVEFHX1BST0ZJTEVDQUxJQlJBVElPTlNJR05BVFVSRSA9IDB4QzZGNHUsCisgICAgVEFHX0NBTUVSQUNBTElCUkFUSU9OU0lHTkFUVVJFID0gMHhDNkYzdSwKKyAgICBUQUdfQ09MT1JJTUVUUklDUkVGRVJFTkNFID0gMHhDNkJGdSwKKyAgICBUQUdfQ1VSUkVOVFBSRVBST0ZJTEVNQVRSSVggPSAweEM2OTJ1LAorICAgIFRBR19DVVJSRU5USUNDUFJPRklMRSA9IDB4QzY5MXUsCisgICAgVEFHX0FTU0hPVFBSRVBST0ZJTEVNQVRSSVggPSAweEM2OTB1LAorICAgIFRBR19BU1NIT1RJQ0NQUk9GSUxFID0gMHhDNjhGdSwKKyAgICBUQUdfTUFTS0VEQVJFQVMgPSAweEM2OEV1LAorICAgIFRBR19BQ1RJVkVBUkVBID0gMHhDNjhEdSwKKyAgICBUQUdfT1JJR0lOQUxSQVdGSUxFREFUQSA9IDB4QzY4Q3UsCisgICAgVEFHX09SSUdJTkFMUkFXRklMRU5BTUUgPSAweEM2OEJ1LAorICAgIFRBR19SQVdEQVRBVU5JUVVFSUQgPSAweEM2NUR1LAorICAgIFRBR19NQUtFUk5PVEVTQUZFVFkgPSAweEM2MzV1LAorICAgIFRBR19ETkdQUklWQVRFREFUQSA9IDB4QzYzNHUsCisgICAgVEFHX1NIQURPV1NDQUxFID0gMHhDNjMzdSwKKyAgICBUQUdfQU5USUFMSUFTU1RSRU5HVEggPSAweEM2MzJ1LAorICAgIFRBR19DSFJPTUFCTFVSUkFESVVTID0gMHhDNjMxdSwKKyAgICBUQUdfTEVOU0lORk8gPSAweEM2MzB1LAorICAgIFRBR19DQU1FUkFTRVJJQUxOVU1CRVIgPSAweEM2MkZ1LAorICAgIFRBR19MSU5FQVJSRVNQT05TRUxJTUlUID0gMHhDNjJFdSwKKyAgICBUQUdfQkFZRVJHUkVFTlNQTElUID0gMHhDNjJEdSwKKyAgICBUQUdfQkFTRUxJTkVTSEFSUE5FU1MgPSAweEM2MkN1LAorICAgIFRBR19CQVNFTElORU5PSVNFID0gMHhDNjJCdSwKKyAgICBUQUdfQkFTRUxJTkVFWFBPU1VSRSA9IDB4QzYyQXUsCisgICAgVEFHX0FTU0hPVFdISVRFWFkgPSAweEM2Mjl1LAorICAgIFRBR19BU1NIT1RORVVUUkFMID0gMHhDNjI4dSwKKyAgICBUQUdfQU5BTE9HQkFMQU5DRSA9IDB4QzYyN3UsCisgICAgVEFHX1JFRFVDVElPTk1BVFJJWDIgPSAweEM2MjZ1LAorICAgIFRBR19SRURVQ1RJT05NQVRSSVgxID0gMHhDNjI1dSwKKyAgICBUQUdfQ0FNRVJBQ0FMSUJSQVRJT04yID0gMHhDNjI0dSwKKyAgICBUQUdfQ0FNRVJBQ0FMSUJSQVRJT04xID0gMHhDNjIzdSwKKyAgICBUQUdfQ09MT1JNQVRSSVgyID0gMHhDNjIydSwKKyAgICBUQUdfQ09MT1JNQVRSSVgxID0gMHhDNjIxdSwKKyAgICBUQUdfQ0FMSUJSQVRJT05JTExVTUlOQU5UMiA9IDB4QzY1QnUsCisgICAgVEFHX0NBTElCUkFUSU9OSUxMVU1JTkFOVDEgPSAweEM2NUF1LAorICAgIFRBR19ERUZBVUxUQ1JPUFNJWkUgPSAweEM2MjB1LAorICAgIFRBR19ERUZBVUxUQ1JPUE9SSUdJTiA9IDB4QzYxRnUsCisgICAgVEFHX0JFU1RRVUFMSVRZU0NBTEUgPSAweEM2NUN1LAorICAgIFRBR19ERUZBVUxUU0NBTEUgPSAweEM2MUV1LAorICAgIFRBR19XSElURUxFVkVMID0gMHhDNjFEdSwKKyAgICBUQUdfQkxBQ0tMRVZFTERFTFRBViA9IDB4QzYxQ3UsCisgICAgVEFHX0JMQUNLTEVWRUxERUxUQUggPSAweEM2MUJ1LAorICAgIFRBR19CTEFDS0xFVkVMID0gMHhDNjFBdSwKKyAgICBUQUdfQkxBQ0tMRVZFTFJFUEVBVERJTSA9IDB4QzYxOXUsCisgICAgVEFHX0xJTkVBUklaQVRJT05UQUJMRSA9IDB4QzYxOHUsCisgICAgVEFHX0NGQUxBWU9VVCA9IDB4QzYxN3UsCisgICAgVEFHX0NGQVBMQU5FQ09MT1IgPSAweEM2MTZ1LAorICAgIFRBR19MT0NBTElaRURDQU1FUkFNT0RFTCA9IDB4QzYxNXUsCisgICAgVEFHX1VOSVFVRUNBTUVSQU1PREVMID0gMHhDNjE0dSwKKyAgICBUQUdfRE5HQkFDS1dBUkRWRVJTSU9OID0gMHhDNjEzdSwKKyAgICBUQUdfRE5HVkVSU0lPTiA9IDB4QzYxMnUsCisgICAgVEFHX1NVQkZJTEVUWVBFID0gMHgwMEZGdSwKKyAgICBUQUdfWVJFU09MVVRJT04gPSAweDAxMUJ1LAorICAgIFRBR19YUkVTT0xVVElPTiA9IDB4MDExQXUsCisgICAgVEFHX1RIUkVTSEhPTERJTkcgPSAweDAxMDd1LAorICAgIFRBR19TVFJJUE9GRlNFVFMgPSAweDAxMTF1LAorICAgIFRBR19TVFJJUEJZVEVDT1VOVFMgPSAweDAxMTd1LAorICAgIFRBR19TT0ZUV0FSRSA9IDB4MDEzMXUsCisgICAgVEFHX1NBTVBMRVNQRVJQSVhFTCA9IDB4MDExNXUsCisgICAgVEFHX1JPV1NQRVJTVFJJUCA9IDB4MDExNnUsCisgICAgVEFHX1JFU09MVVRJT05VTklUID0gMHgwMTI4dSwKKyAgICBUQUdfUExBTkFSQ09ORklHVVJBVElPTiA9IDB4MDExQ3UsCisgICAgVEFHX1BIT1RPTUVUUklDSU5URVJQUkVUQVRJT04gPSAweDAxMDZ1LAorICAgIFRBR19PUklFTlRBVElPTiA9IDB4MDExMnUsCisgICAgVEFHX05FV1NVQkZJTEVUWVBFID0gMHgwMEZFdSwKKyAgICBUQUdfTU9ERUwgPSAweDAxMTB1LAorICAgIFRBR19NSU5TQU1QTEVWQUxVRSA9IDB4MDExOHUsCisgICAgVEFHX01BWFNBTVBMRVZBTFVFID0gMHgwMTE5dSwKKyAgICBUQUdfTUFLRSA9IDB4MDEwRnUsCisgICAgVEFHX0lNQUdFV0lEVEggPSAweDAxMDB1LAorICAgIFRBR19JTUFHRUxFTkdUSCA9IDB4MDEwMXUsCisgICAgVEFHX0lNQUdFREVTQ1JJUFRJT04gPSAweDAxMEV1LAorICAgIFRBR19IT1NUQ09NUFVURVIgPSAweDAxM0N1LAorICAgIFRBR19HUkFZUkVTUE9OU0VVTklUID0gMHgwMTIydSwKKyAgICBUQUdfR1JBWVJFU1BPTlNFQ1VSVkUgPSAweDAxMjN1LAorICAgIFRBR19GUkVFT0ZGU0VUUyA9IDB4MDEyMHUsCisgICAgVEFHX0ZSRUVCWVRFQ09VTlRTID0gMHgwMTIxdSwKKyAgICBUQUdfRklMTE9SREVSID0gMHgwMTBBdSwKKyAgICBUQUdfRVhUUkFTQU1QTEVTID0gMHgwMTUydSwKKyAgICBUQUdfREFURVRJTUUgPSAweDAxMzJ1LAorICAgIFRBR19DT1BZUklHSFQgPSAweDgyOTh1LAorICAgIFRBR19DT01QUkVTU0lPTiA9IDB4MDEwM3UsCisgICAgVEFHX0NPTE9STUFQID0gMHgwMTQwdSwKKyAgICBUQUdfQ0VMTFdJRFRIID0gMHgwMTA4dSwKKyAgICBUQUdfQ0VMTExFTkdUSCA9IDB4MDEwOXUsCisgICAgVEFHX0JJVFNQRVJTQU1QTEUgPSAweDAxMDJ1LAorICAgIFRBR19BUlRJU1QgPSAweDAxM0J1LAorICAgIFRBR19FWElGVkVSU0lPTiA9IDB4OTAwMHUsCisgICAgVEFHX0NGQVJFUEVBVFBBVFRFUk5ESU0gPSAweDgyOER1LAorICAgIFRBR19EQVRFVElNRU9SSUdJTkFMID0gMHg5MDAzdSwKKyAgICBUQUdfQ0ZBUEFUVEVSTiA9IDB4ODI4RXUsCisgICAgVEFHX1NVQklGRFMgPSAweDAxNEF1LAorICAgIFRBR19USUZGRVBTVEFOREFSRElEID0gMHg5MjE2dSwKKyAgICBUQUdfRVhQT1NVUkVUSU1FID0gMHg4MjlBdSwKKyAgICBUQUdfSVNPU1BFRURSQVRJTkdTID0gMHg4ODI3dSwKKyAgICBUQUdfRk9DQUxMRU5HVEggPSAweDkyMEF1LAorICAgIFRBR19GTlVNQkVSID0gMHg4MjlEdSwKKyAgICBUQUdfR1BTSU5GTyA9IDB4ODgyNXUsCisgICAgVEFHX0dQU1ZFUlNJT05JRCA9IDB4MHUsCisgICAgVEFHX0dQU0xBVElUVURFUkVGID0gMHgxdSwKKyAgICBUQUdfR1BTTEFUSVRVREUgPSAweDJ1LAorICAgIFRBR19HUFNMT05HSVRVREVSRUYgPSAweDN1LAorICAgIFRBR19HUFNMT05HSVRVREUgPSAweDR1LAorICAgIFRBR19HUFNUSU1FU1RBTVAgPSAweDd1LAorICAgIFRBR19HUFNEQVRFU1RBTVAgPSAweDAwMUR1LAorfTsKKworLyoqCisgKiBUSUZGX0VQX1RBR19ERUZJTklUSU9OUyBjb250YWlucyB0YWdzIGRlZmluZWQgaW4gdGhlIFRJRkYgRVAgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgVElGRl9FUF9UQUdfREVGSU5JVElPTlNbXSA9ICB7CisgICAgeyAvLyBQaG90b21ldHJpY0ludGVycHJldGF0aW9uCisgICAgICAgICJQaG90b21ldHJpY0ludGVycHJldGF0aW9uIiwKKyAgICAgICAgMHgwMTA2dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN1YklmZHMKKyAgICAgICAgIlN1YklmZHMiLAorICAgICAgICAweDAxNEF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFQYXR0ZXJuCisgICAgICAgICJDRkFQYXR0ZXJuIiwKKyAgICAgICAgMHg4MjhFdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ0ZBUmVwZWF0UGF0dGVybkRpbQorICAgICAgICAiQ0ZBUmVwZWF0UGF0dGVybkRpbSIsCisgICAgICAgIDB4ODI4RHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEYXRlVGltZU9yaWdpbmFsCisgICAgICAgICJEYXRlVGltZU9yaWdpbmFsIiwKKyAgICAgICAgMHg5MDAzdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAyMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBUaWZmL0VQU3RhbmRhcmRJRAorICAgICAgICAiVGlmZiIsCisgICAgICAgIDB4OTIxNnUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEV4cG9zdXJlVGltZQorICAgICAgICAiRXhwb3N1cmVUaW1lIiwKKyAgICAgICAgMHg4MjlBdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIElTT1NwZWVkUmF0aW5ncworICAgICAgICAiSVNPU3BlZWRSYXRpbmdzIiwKKyAgICAgICAgMHg4ODI3dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZvY2FsTGVuZ3RoCisgICAgICAgICJGb2NhbExlbmd0aCIsCisgICAgICAgIDB4OTIwQXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGTnVtYmVyCisgICAgICAgICJGTnVtYmVyIiwKKyAgICAgICAgMHg4MjlEdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0luZm8KKyAgICAgICAgIkdQU0luZm8iLAorICAgICAgICAweDg4MjV1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNWZXJzaW9uSUQKKyAgICAgICAgIkdQU1ZlcnNpb25JRCIsCisgICAgICAgIDB4MHUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0xhdGl0dWRlUmVmCisgICAgICAgICJHUFNMYXRpdHVkZVJlZiIsCisgICAgICAgIDB4MXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNMYXRpdHVkZQorICAgICAgICAiR1BTTGF0aXR1ZGUiLAorICAgICAgICAweDJ1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTTG9uZ2l0dWRlUmVmCisgICAgICAgICJHUFNMb25naXR1ZGVSZWYiLAorICAgICAgICAweDN1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTTG9uZ2l0dWRlCisgICAgICAgICJHUFNMb25naXR1ZGUiLAorICAgICAgICAweDR1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTVGltZVN0YW1wCisgICAgICAgICJHUFNUaW1lU3RhbXAiLAorICAgICAgICAweDd1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIC8qVE9ETzogUmVtYWluaW5nIFRJRkYgRVAgdGFncyovCit9OworCisvKioKKyAqIEVYSUZfMl8zX1RBR19ERUZJTklUSU9OUyBjb250YWlucyB0YWdzIGRlZmluZWQgaW4gdGhlIEplaXRhIEVYSUYgMi4zIHNwZWMKKyAqLworY29uc3QgVGFnRGVmaW5pdGlvbl90IEVYSUZfMl8zX1RBR19ERUZJTklUSU9OU1tdID0geworICAgIHsgLy8gRXhpZlZlcnNpb24KKyAgICAgICAgIkV4aWZWZXJzaW9uIiwKKyAgICAgICAgMHg5MDAwdSwKKyAgICAgICAgVU5ERUZJTkVELAorICAgICAgICBJRkRfMCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNEYXRlU3RhbXAKKyAgICAgICAgIkdQU0RhdGVTdGFtcCIsCisgICAgICAgIDB4MDAxRHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIC8qVE9ETzogUmVtYWluaW5nIEVYSUYgMi4zIHRhZ3MqLworfTsKKworLyoqCisgKiBUSUZGXzZfVEFHX0RFRklOSVRJT05TIGNvbnRhaW5zIHRhZ3MgZGVmaW5lZCBpbiB0aGUgVElGRiA2LjAgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgVElGRl82X1RBR19ERUZJTklUSU9OU1tdID0geworICAgIHsgLy8gU3ViRmlsZVR5cGUKKyAgICAgICAgIlN1YkZpbGVUeXBlIiwKKyAgICAgICAgMHgwMEZGdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFydGlzdAorICAgICAgICAiQXJ0aXN0IiwKKyAgICAgICAgMHgwMTNCdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJpdHNQZXJTYW1wbGUKKyAgICAgICAgIkJpdHNQZXJTYW1wbGUiLAorICAgICAgICAweDAxMDJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2VsbExlbmd0aAorICAgICAgICAiQ2VsbExlbmd0aCIsCisgICAgICAgIDB4MDEwOXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDZWxsV2lkdGgKKyAgICAgICAgIkNlbGxXaWR0aCIsCisgICAgICAgIDB4MDEwOHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb2xvck1hcAorICAgICAgICAiQ29sb3JNYXAiLAorICAgICAgICAweDAxNDB1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ29tcHJlc3Npb24KKyAgICAgICAgIkNvbXByZXNzaW9uIiwKKyAgICAgICAgMHgwMTAzdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvcHlyaWdodAorICAgICAgICAiQ29weXJpZ2h0IiwKKyAgICAgICAgMHg4Mjk4dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERhdGVUaW1lCisgICAgICAgICJEYXRlVGltZSIsCisgICAgICAgIDB4MDEzMnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMjAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRXh0cmFTYW1wbGVzCisgICAgICAgICJFeHRyYVNhbXBsZXMiLAorICAgICAgICAweDAxNTJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRmlsbE9yZGVyCisgICAgICAgICJGaWxsT3JkZXIiLAorICAgICAgICAweDAxMEF1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRnJlZUJ5dGVDb3VudHMKKyAgICAgICAgIkZyZWVCeXRlQ291bnRzIiwKKyAgICAgICAgMHgwMTIxdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRnJlZU9mZnNldHMKKyAgICAgICAgIkZyZWVPZmZzZXRzIiwKKyAgICAgICAgMHgwMTIwdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR3JheVJlc3BvbnNlQ3VydmUKKyAgICAgICAgIkdyYXlSZXNwb25zZUN1cnZlIiwKKyAgICAgICAgMHgwMTIzdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdyYXlSZXNwb25zZVVuaXQKKyAgICAgICAgIkdyYXlSZXNwb25zZVVuaXQiLAorICAgICAgICAweDAxMjJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gSG9zdENvbXB1dGVyCisgICAgICAgICJIb3N0Q29tcHV0ZXIiLAorICAgICAgICAweDAxM0N1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gSW1hZ2VEZXNjcmlwdGlvbgorICAgICAgICAiSW1hZ2VEZXNjcmlwdGlvbiIsCisgICAgICAgIDB4MDEwRXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBJbWFnZUxlbmd0aAorICAgICAgICAiSW1hZ2VMZW5ndGgiLAorICAgICAgICAweDAxMDF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBJbWFnZVdpZHRoCisgICAgICAgICJJbWFnZVdpZHRoIiwKKyAgICAgICAgMHgwMTAwdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTWFrZQorICAgICAgICAiTWFrZSIsCisgICAgICAgIDB4MDEwRnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYXhTYW1wbGVWYWx1ZQorICAgICAgICAiTWF4U2FtcGxlVmFsdWUiLAorICAgICAgICAweDAxMTl1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTWluU2FtcGxlVmFsdWUKKyAgICAgICAgIk1pblNhbXBsZVZhbHVlIiwKKyAgICAgICAgMHgwMTE4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE1vZGVsCisgICAgICAgICJNb2RlbCIsCisgICAgICAgIDB4MDExMHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBOZXdTdWJmaWxlVHlwZQorICAgICAgICAiTmV3U3ViZmlsZVR5cGUiLAorICAgICAgICAweDAwRkV1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmllbnRhdGlvbgorICAgICAgICAiT3JpZW50YXRpb24iLAorICAgICAgICAweDAxMTJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUGhvdG9NZXRyaWNJbnRlcnByZXRhdGlvbgorICAgICAgICAiUGhvdG9NZXRyaWNJbnRlcnByZXRhdGlvbiIsCisgICAgICAgIDB4MDEwNnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQbGFuYXJDb25maWd1cmF0aW9uCisgICAgICAgICJQbGFuYXJDb25maWd1cmF0aW9uIiwKKyAgICAgICAgMHgwMTFDdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJlc29sdXRpb25Vbml0CisgICAgICAgICJSZXNvbHV0aW9uVW5pdCIsCisgICAgICAgIDB4MDEyOHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSb3dzUGVyU3RyaXAKKyAgICAgICAgIlJvd3NQZXJTdHJpcCIsCisgICAgICAgIDB4MDExNnUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFNhbXBsZXNQZXJQaXhlbAorICAgICAgICAiU2FtcGxlc1BlclBpeGVsIiwKKyAgICAgICAgMHgwMTE1dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFNvZnR3YXJlCisgICAgICAgICJTb2Z0d2FyZSIsCisgICAgICAgIDB4MDEzMXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBTdHJpcEJ5dGVDb3VudHMKKyAgICAgICAgIlN0cmlwQnl0ZUNvdW50cyIsCisgICAgICAgIDB4MDExN3UsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN0cmlwT2Zmc2V0cworICAgICAgICAiU3RyaXBPZmZzZXRzIiwKKyAgICAgICAgMHgwMTExdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3ViZmlsZVR5cGUKKyAgICAgICAgIlN1YmZpbGVUeXBlIiwKKyAgICAgICAgMHgwMEZGdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFRocmVzaGhvbGRpbmcKKyAgICAgICAgIlRocmVzaGhvbGRpbmciLAorICAgICAgICAweDAxMDd1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gWFJlc29sdXRpb24KKyAgICAgICAgIlhSZXNvbHV0aW9uIiwKKyAgICAgICAgMHgwMTFBdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFlSZXNvbHV0aW9uCisgICAgICAgICJZUmVzb2x1dGlvbiIsCisgICAgICAgIDB4MDExQnUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCit9OworCisvKioKKyAqIEROR19UQUdfREVGSU5JVElPTlMgY29udGFpbnMgdGFncyBkZWZpbmVkIGluIHRoZSBETkcgMS40IHNwZWMKKyAqLworY29uc3QgVGFnRGVmaW5pdGlvbl90IEROR19UQUdfREVGSU5JVElPTlNbXSA9IHsKKyAgICB7IC8vIEROR1ZlcnNpb24KKyAgICAgICAgIkROR1ZlcnNpb24iLAorICAgICAgICAweEM2MTJ1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBETkdCYWNrd2FyZFZlcnNpb24KKyAgICAgICAgIkROR0JhY2t3YXJkVmVyc2lvbiIsCisgICAgICAgIDB4QzYxM3UsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFVuaXF1ZUNhbWVyYU1vZGVsCisgICAgICAgICJVbmlxdWVDYW1lcmFNb2RlbCIsCisgICAgICAgIDB4QzYxNHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMb2NhbGl6ZWRDYW1lcmFNb2RlbAorICAgICAgICAiTG9jYWxpemVkQ2FtZXJhTW9kZWwiLAorICAgICAgICAweEM2MTV1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ0ZBUGxhbmVDb2xvcgorICAgICAgICAiQ0ZBUGxhbmVDb2xvciIsCisgICAgICAgIDB4QzYxNnUsCisgICAgICAgIEJZVEUsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ0ZBTGF5b3V0CisgICAgICAgICJDRkFMYXlvdXQiLAorICAgICAgICAweEM2MTd1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMaW5lYXJpemF0aW9uVGFibGUKKyAgICAgICAgIkxpbmVhcml6YXRpb25UYWJsZSIsCisgICAgICAgIDB4QzYxOHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWxSZXBlYXREaW0KKyAgICAgICAgIkJsYWNrTGV2ZWxSZXBlYXREaW0iLAorICAgICAgICAweEM2MTl1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCbGFja0xldmVsCisgICAgICAgICJCbGFja0xldmVsIiwKKyAgICAgICAgMHhDNjFBdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCbGFja0xldmVsRGVsdGFICisgICAgICAgICJCbGFja0xldmVsRGVsdGFIIiwKKyAgICAgICAgMHhDNjFCdSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWxEZWx0YVYKKyAgICAgICAgIkJsYWNrTGV2ZWxEZWx0YVYiLAorICAgICAgICAweEM2MUN1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gV2hpdGVMZXZlbAorICAgICAgICAiV2hpdGVMZXZlbCIsCisgICAgICAgIDB4QzYxRHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGVmYXVsdFNjYWxlCisgICAgICAgICJEZWZhdWx0U2NhbGUiLAorICAgICAgICAweEM2MUV1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCZXN0UXVhbGl0eVNjYWxlCisgICAgICAgICJCZXN0UXVhbGl0eVNjYWxlIiwKKyAgICAgICAgMHhDNjVDdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGVmYXVsdENyb3BPcmlnaW4KKyAgICAgICAgIkRlZmF1bHRDcm9wT3JpZ2luIiwKKyAgICAgICAgMHhDNjFGdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0Q3JvcFNpemUKKyAgICAgICAgIkRlZmF1bHRDcm9wU2l6ZSIsCisgICAgICAgIDB4QzYyMHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2FsaWJyYXRpb25JbGx1bWluYW50MQorICAgICAgICAiQ2FsaWJyYXRpb25JbGx1bWluYW50MSIsCisgICAgICAgIDB4QzY1QXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYWxpYnJhdGlvbklsbHVtaW5hbnQyCisgICAgICAgICJDYWxpYnJhdGlvbklsbHVtaW5hbnQyIiwKKyAgICAgICAgMHhDNjVCdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yTWF0cml4MQorICAgICAgICAiQ29sb3JNYXRyaXgxIiwKKyAgICAgICAgMHhDNjIxdSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb2xvck1hdHJpeDIKKyAgICAgICAgIkNvbG9yTWF0cml4MiIsCisgICAgICAgIDB4QzYyMnUsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2FtZXJhQ2FsaWJyYXRpb24xCisgICAgICAgICJDYW1lcmFDYWxpYnJhdGlvbjEiLAorICAgICAgICAweEM2MjN1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbWVyYUNhbGlicmF0aW9uMgorICAgICAgICAiQ2FtZXJhQ2FsaWJyYXRpb24yIiwKKyAgICAgICAgMHhDNjI0dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSZWR1Y3Rpb25NYXRyaXgxCisgICAgICAgICJSZWR1Y3Rpb25NYXRyaXgxIiwKKyAgICAgICAgMHhDNjI1dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSZWR1Y3Rpb25NYXRyaXgyCisgICAgICAgICJSZWR1Y3Rpb25NYXRyaXgyIiwKKyAgICAgICAgMHhDNjI2dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBbmFsb2dCYWxhbmNlCisgICAgICAgICJBbmFsb2dCYWxhbmNlIiwKKyAgICAgICAgMHhDNjI3dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdE5ldXRyYWwKKyAgICAgICAgIkFzU2hvdE5ldXRyYWwiLAorICAgICAgICAweEM2Mjh1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXNTaG90V2hpdGVYWQorICAgICAgICAiQXNTaG90V2hpdGVYWSIsCisgICAgICAgIDB4QzYyOXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXNlbGluZUV4cG9zdXJlCisgICAgICAgICJCYXNlbGluZUV4cG9zdXJlIiwKKyAgICAgICAgMHhDNjJBdSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXNlbGluZU5vaXNlCisgICAgICAgICJCYXNlbGluZU5vaXNlIiwKKyAgICAgICAgMHhDNjJCdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJhc2VsaW5lU2hhcnBuZXNzCisgICAgICAgICJCYXNlbGluZVNoYXJwbmVzcyIsCisgICAgICAgIDB4QzYyQ3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXllckdyZWVuU3BsaXQKKyAgICAgICAgIkJheWVyR3JlZW5TcGxpdCIsCisgICAgICAgIDB4QzYyRHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTGluZWFyUmVzcG9uc2VMaW1pdAorICAgICAgICAiTGluZWFyUmVzcG9uc2VMaW1pdCIsCisgICAgICAgIDB4QzYyRXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYW1lcmFTZXJpYWxOdW1iZXIKKyAgICAgICAgIkNhbWVyYVNlcmlhbE51bWJlciIsCisgICAgICAgIDB4QzYyRnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMZW5zSW5mbworICAgICAgICAiTGVuc0luZm8iLAorICAgICAgICAweEM2MzB1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2hyb21hQmx1clJhZGl1cworICAgICAgICAiQ2hyb21hQmx1clJhZGl1cyIsCisgICAgICAgIDB4QzYzMXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFudGlBbGlhc1N0cmVuZ3RoCisgICAgICAgICJBbnRpQWxpYXNTdHJlbmd0aCIsCisgICAgICAgIDB4QzYzMnUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFNoYWRvd1NjYWxlCisgICAgICAgICJTaGFkb3dTY2FsZSIsCisgICAgICAgIDB4QzYzM3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBETkdQcml2YXRlRGF0YQorICAgICAgICAiRE5HUHJpdmF0ZURhdGEiLAorICAgICAgICAweEM2MzR1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYWtlck5vdGVTYWZldHkKKyAgICAgICAgIk1ha2VyTm90ZVNhZmV0eSIsCisgICAgICAgIDB4QzYzNXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSYXdEYXRhVW5pcXVlSUQKKyAgICAgICAgIlJhd0RhdGFVbmlxdWVJRCIsCisgICAgICAgIDB4QzY1RHUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICAxNiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbFJhd0ZpbGVOYW1lCisgICAgICAgICJPcmlnaW5hbFJhd0ZpbGVOYW1lIiwKKyAgICAgICAgMHhDNjhCdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsUmF3RmlsZURhdGEKKyAgICAgICAgIk9yaWdpbmFsUmF3RmlsZURhdGEiLAorICAgICAgICAweEM2OEN1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBCSUcKKyAgICB9LAorICAgIHsgLy8gQWN0aXZlQXJlYQorICAgICAgICAiQWN0aXZlQXJlYSIsCisgICAgICAgIDB4QzY4RHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTWFza2VkQXJlYXMKKyAgICAgICAgIk1hc2tlZEFyZWFzIiwKKyAgICAgICAgMHhDNjhFdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBc1Nob3RJQ0NQcm9maWxlCisgICAgICAgICJBc1Nob3RJQ0NQcm9maWxlIiwKKyAgICAgICAgMHhDNjhGdSwKKyAgICAgICAgVU5ERUZJTkVELAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBc1Nob3RQcmVQcm9maWxlTWF0cml4CisgICAgICAgICJBc1Nob3RQcmVQcm9maWxlTWF0cml4IiwKKyAgICAgICAgMHhDNjkwdSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDdXJyZW50SUNDUHJvZmlsZQorICAgICAgICAiQ3VycmVudElDQ1Byb2ZpbGUiLAorICAgICAgICAweEM2OTF1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEN1cnJlbnRJQ0NQcm9maWxlCisgICAgICAgICJDdXJyZW50SUNDUHJvZmlsZSIsCisgICAgICAgIDB4QzY5MXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ3VycmVudFByZVByb2ZpbGVNYXRyaXgKKyAgICAgICAgIkN1cnJlbnRQcmVQcm9maWxlTWF0cml4IiwKKyAgICAgICAgMHhDNjkydSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb2xvcmltZXRyaWNSZWZlcmVuY2UKKyAgICAgICAgIkNvbG9yaW1ldHJpY1JlZmVyZW5jZSIsCisgICAgICAgIDB4QzZCRnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYW1lcmFDYWxpYnJhdGlvblNpZ25hdHVyZQorICAgICAgICAiQ2FtZXJhQ2FsaWJyYXRpb25TaWduYXR1cmUiLAorICAgICAgICAweEM2RjN1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUNhbGlicmF0aW9uU2lnbmF0dXJlCisgICAgICAgICJQcm9maWxlQ2FsaWJyYXRpb25TaWduYXR1cmUiLAorICAgICAgICAweEM2RjR1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRXh0cmFDYW1lcmFQcm9maWxlcworICAgICAgICAiRXh0cmFDYW1lcmFQcm9maWxlcyIsCisgICAgICAgIDB4QzZGNXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdFByb2ZpbGVOYW1lCisgICAgICAgICJBc1Nob3RQcm9maWxlTmFtZSIsCisgICAgICAgIDB4QzZGNnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBOb2lzZVJlZHVjdGlvbkFwcGxpZWQKKyAgICAgICAgIk5vaXNlUmVkdWN0aW9uQXBwbGllZCIsCisgICAgICAgIDB4QzZGN3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVOYW1lCisgICAgICAgICJQcm9maWxlTmFtZSIsCisgICAgICAgIDB4QzZGOHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlSHVlU2F0TWFwRGltcworICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcERpbXMiLAorICAgICAgICAweEM2Rjl1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlSHVlU2F0TWFwRGF0YTEKKyAgICAgICAgIlByb2ZpbGVIdWVTYXRNYXBEYXRhMSIsCisgICAgICAgIDB4QzZGQXUsCisgICAgICAgIEZMT0FULAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlSHVlU2F0TWFwRGF0YTIKKyAgICAgICAgIlByb2ZpbGVIdWVTYXRNYXBEYXRhMiIsCisgICAgICAgIDB4QzZGQnUsCisgICAgICAgIEZMT0FULAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlVG9uZUN1cnZlCisgICAgICAgICJQcm9maWxlVG9uZUN1cnZlIiwKKyAgICAgICAgMHhDNkZDdSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVFbWJlZFBvbGljeQorICAgICAgICAiUHJvZmlsZUVtYmVkUG9saWN5IiwKKyAgICAgICAgMHhDNkZEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUNvcHlyaWdodAorICAgICAgICAiUHJvZmlsZUNvcHlyaWdodCIsCisgICAgICAgIDB4QzZGRXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGb3J3YXJkTWF0cml4MQorICAgICAgICAiRm9yd2FyZE1hdHJpeDEiLAorICAgICAgICAweEM3MTR1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZvcndhcmRNYXRyaXgyCisgICAgICAgICJGb3J3YXJkTWF0cml4MiIsCisgICAgICAgIDB4QzcxNXUsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld0FwcGxpY2F0aW9uTmFtZQorICAgICAgICAiUHJldmlld0FwcGxpY2F0aW9uTmFtZSIsCisgICAgICAgIDB4QzcxNnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3QXBwbGljYXRpb25WZXJzaW9uCisgICAgICAgICJQcmV2aWV3QXBwbGljYXRpb25WZXJzaW9uIiwKKyAgICAgICAgMHhDNzE3dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByZXZpZXdTZXR0aW5nc05hbWUKKyAgICAgICAgIlByZXZpZXdTZXR0aW5nc05hbWUiLAorICAgICAgICAweEM3MTh1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld1NldHRpbmdzRGlnZXN0CisgICAgICAgICJQcmV2aWV3U2V0dGluZ3NEaWdlc3QiLAorICAgICAgICAweEM3MTl1LAorICAgICAgICBCWVRFLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld0NvbG9yU3BhY2UKKyAgICAgICAgIlByZXZpZXdDb2xvclNwYWNlIiwKKyAgICAgICAgMHhDNzFBdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld0RhdGVUaW1lCisgICAgICAgICJQcmV2aWV3RGF0ZVRpbWUiLAorICAgICAgICAweEM3MUJ1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUmF3SW1hZ2VEaWdlc3QKKyAgICAgICAgIlJhd0ltYWdlRGlnZXN0IiwKKyAgICAgICAgMHhDNzFDdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsUmF3RmlsZURpZ2VzdAorICAgICAgICAiT3JpZ2luYWxSYXdGaWxlRGlnZXN0IiwKKyAgICAgICAgMHhDNzFEdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN1YlRpbGVCbG9ja1NpemUKKyAgICAgICAgIlN1YlRpbGVCbG9ja1NpemUiLAorICAgICAgICAweEM3MUV1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJvd0ludGVybGVhdmVGYWN0b3IKKyAgICAgICAgIlJvd0ludGVybGVhdmVGYWN0b3IiLAorICAgICAgICAweEM3MUZ1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVMb29rVGFibGVEaW1zCisgICAgICAgICJQcm9maWxlTG9va1RhYmxlRGltcyIsCisgICAgICAgIDB4QzcyNXUsCisgICAgICAgIExPTkcsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAzLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVMb29rVGFibGVEYXRhCisgICAgICAgICJQcm9maWxlTG9va1RhYmxlRGF0YSIsCisgICAgICAgIDB4QzcyNnUsCisgICAgICAgIEZMT0FULAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcGNvZGVMaXN0MQorICAgICAgICAiT3Bjb2RlTGlzdDEiLAorICAgICAgICAweEM3NDB1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBPcGNvZGVMaXN0MgorICAgICAgICAiT3Bjb2RlTGlzdDIiLAorICAgICAgICAweEM3NDF1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBPcGNvZGVMaXN0MworICAgICAgICAiT3Bjb2RlTGlzdDMiLAorICAgICAgICAweEM3NEV1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBOb2lzZVByb2ZpbGUKKyAgICAgICAgIk5vaXNlUHJvZmlsZSIsCisgICAgICAgIDB4Qzc2MXUsCisgICAgICAgIERPVUJMRSwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0VXNlckNyb3AKKyAgICAgICAgIkRlZmF1bHRVc2VyQ3JvcCIsCisgICAgICAgIDB4QzdCNXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERlZmF1bHRCbGFja1JlbmRlcgorICAgICAgICAiRGVmYXVsdEJsYWNrUmVuZGVyIiwKKyAgICAgICAgMHhDN0E2dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmFzZWxpbmVFeHBvc3VyZU9mZnNldAorICAgICAgICAiQmFzZWxpbmVFeHBvc3VyZU9mZnNldCIsCisgICAgICAgIDB4QzdBNXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlTG9va1RhYmxlRW5jb2RpbmcKKyAgICAgICAgIlByb2ZpbGVMb29rVGFibGVFbmNvZGluZyIsCisgICAgICAgIDB4QzdBNHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBFbmNvZGluZworICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcEVuY29kaW5nIiwKKyAgICAgICAgMHhDN0EzdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxEZWZhdWx0RmluYWxTaXplCisgICAgICAgICJPcmlnaW5hbERlZmF1bHRGaW5hbFNpemUiLAorICAgICAgICAweEM3OTF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbEJlc3RRdWFsaXR5RmluYWxTaXplCisgICAgICAgICJPcmlnaW5hbEJlc3RRdWFsaXR5RmluYWxTaXplIiwKKyAgICAgICAgMHhDNzkydSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxEZWZhdWx0Q3JvcFNpemUKKyAgICAgICAgIk9yaWdpbmFsRGVmYXVsdENyb3BTaXplIiwKKyAgICAgICAgMHhDNzkzdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTmV3UmF3SW1hZ2VEaWdlc3QKKyAgICAgICAgIk5ld1Jhd0ltYWdlRGlnZXN0IiwKKyAgICAgICAgMHhDN0E3dSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJhd1RvUHJldmlld0dhaW4KKyAgICAgICAgIlJhd1RvUHJldmlld0dhaW4iLAorICAgICAgICAweEM3QTh1LAorICAgICAgICBET1VCTEUsCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX1RBR19ERUZJTklUSU9OX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjcyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5LmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfRU5UUlkKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfRU5UUlkKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKyNkZWZpbmUgQ09NUEFSRV9ERUYob3ApIFwKK2lubGluZSBib29sIG9wZXJhdG9yIG9wIChjb25zdCBUaWZmRW50cnkmIGVudHJ5KSBjb25zdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgc2luZ2xlIFRJRkYgSUZEIGVudHJ5LgorICoKKyAqIFN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIHN1cHBvcnQgYXNzaWdubWVudCBhbmQgY29weWluZyBvcGVyYXRpb25zLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBUaWZmRW50cnkgOiBwdWJsaWMgVGlmZldyaXRhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflRpZmZFbnRyeSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgMTItYnl0ZSBJRkQgZW50cnkgdG8gdGhlIG91dHB1dC4gVGhlIGdpdmVuIG9mZnNldCB3aWxsIGJlCisgICAgICAgICAqIHNldCBhcyB0aGUgdGFnIHZhbHVlIGlmIHRoZSBzaXplIG9mIHRoZSB0YWcgdmFsdWUgZXhjZWVkcyB0aGUgbWF4CisgICAgICAgICAqIHNpemUgZm9yIHRoZSBUSUZGIFZhbHVlIGZpZWxkICg0IGJ5dGVzKSwgYW5kIHNob3VsZCBiZSB3b3JkIGFsaWduZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVGFnSW5mbyh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGNvdW50IHNldCBmb3IgdGhpcyBlbnRyeS4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBDb3VudAorICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q291bnQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdGFnIGlkIHNldCBmb3IgdGhpcyBlbnRyeS4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBUYWcKKyAgICAgICAgICogZmllbGQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQxNl90IGdldFRhZygpIGNvbnN0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0eXBlIHNldCBmb3IgdGhpcyBlbnRyeS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFRJRkYgVHlwZQorICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgVGFnVHlwZSBnZXRUeXBlKCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRlZmluZWQgZW5kaWFubmVzcyBmb3IgdGhpcyBlbnRyeS4gIElmIHRoaXMgaXMgZGVmaW5lZCwKKyAgICAgICAgICogdGhlIHRhZyB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gd2l0aCB0aGUgZ2l2ZW4gYnl0ZSBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgRW5kaWFubmVzcyBnZXRFbmRpYW5uZXNzKCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGlzIGVudHJ5LiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBWYWx1ZQorICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBOVUxMIGlmIHRoZSB2YWx1ZSBpcyBOVUxMLCBvciBpZiB0aGUgdHlwZSB1c2VkIGRvZXMgbm90CisgICAgICAgICAqIG1hdGNoIHRoZSB0eXBlIG9mIHRoaXMgdGFnLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgY29uc3QgVCogZ2V0RGF0YSgpIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3JjZSB0aGUgdHlwZSB1c2VkIGhlcmUgdG8gYmUgYSB2YWxpZCBUSUZGIHR5cGUuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgTlVMTCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgTlVMTCwgb3IgaWYgdGhlIHR5cGUgZ2l2ZW4gZG9lcworICAgICAgICAgKiBub3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGdpdmVuLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIGNvbnN0IFQqIGZvcmNlVmFsaWRUeXBlKFRhZ1R5cGUgdHlwZSwgY29uc3QgVCogdmFsdWUpOworCisgICAgICAgIHZpcnR1YWwgY29uc3Qgdm9pZCogZ2V0RGF0YUhlbHBlcigpIGNvbnN0ID0gMDsKKworICAgICAgICBDT01QQVJFX0RFRig+KQorICAgICAgICBDT01QQVJFX0RFRig8KQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIID0gMjU2CisgICAgICAgIH07Cit9OworCisjZGVmaW5lIENPTVBBUkUob3ApIFwKK2Jvb2wgVGlmZkVudHJ5OjpvcGVyYXRvciBvcCAoY29uc3QgVGlmZkVudHJ5JiBlbnRyeSkgY29uc3QgeyBcCisgICAgcmV0dXJuIGdldENvbXBhcmFibGVWYWx1ZSgpIG9wIGVudHJ5LmdldENvbXBhcmFibGVWYWx1ZSgpOyBcCit9CisKK0NPTVBBUkUoPikKK0NPTVBBUkUoPCkKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3QgVCogVGlmZkVudHJ5OjpnZXREYXRhKCkgY29uc3QgeworICAgIGNvbnN0IFQqIHZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oZ2V0RGF0YUhlbHBlcigpKTsKKyAgICByZXR1cm4gZm9yY2VWYWxpZFR5cGU8VD4oZ2V0VHlwZSgpLCB2YWx1ZSk7Cit9CisKKyN1bmRlZiBDT01QQVJFCisjdW5kZWYgQ09NUEFSRV9ERUYKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfRU5UUlkqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmRW50cnlJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjY2I1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmRW50cnlJbXBsLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfRU5UUllfSU1QTAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9FTlRSWV9JTVBMCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZklmZC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnkuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL0VuZGlhblV0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgVGlmZkVudHJ5SW1wbCA6IHB1YmxpYyBUaWZmRW50cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGlmZkVudHJ5SW1wbCh1aW50MTZfdCB0YWcsIFRhZ1R5cGUgdHlwZSwgdWludDMyX3QgY291bnQsIEVuZGlhbm5lc3MgZW5kLCBjb25zdCBUKiBkYXRhKTsKKyAgICAgICAgdmlydHVhbCB+VGlmZkVudHJ5SW1wbCgpOworCisgICAgICAgIHN0YXR1c190IHdyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IHdyaXRlVGFnSW5mbyh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3Q7CisKKyAgICAgICAgdWludDMyX3QgZ2V0Q291bnQoKSBjb25zdDsKKyAgICAgICAgdWludDE2X3QgZ2V0VGFnKCkgY29uc3Q7CisgICAgICAgIFRhZ1R5cGUgZ2V0VHlwZSgpIGNvbnN0OworICAgICAgICBFbmRpYW5uZXNzIGdldEVuZGlhbm5lc3MoKSBjb25zdDsKKyAgICAgICAgc2l6ZV90IGdldFNpemUoKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZ2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGNvbnN0IHZvaWQqIGdldERhdGFIZWxwZXIoKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZ2V0QWN0dWFsU2l6ZSgpIGNvbnN0OworCisgICAgICAgIHVpbnQxNl90IG1UYWc7CisgICAgICAgIHVpbnQxNl90IG1UeXBlOworICAgICAgICB1aW50MzJfdCBtQ291bnQ7CisgICAgICAgIEVuZGlhbm5lc3MgbUVuZDsKKyAgICAgICAgVmVjdG9yPFQ+IG1EYXRhOworCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVGlmZkVudHJ5SW1wbDxUPjo6VGlmZkVudHJ5SW1wbCh1aW50MTZfdCB0YWcsIFRhZ1R5cGUgdHlwZSwgdWludDMyX3QgY291bnQsIEVuZGlhbm5lc3MgZW5kLAorICAgICAgICBjb25zdCBUKiBkYXRhKQorICAgICAgICA6IG1UYWcodGFnKSwgbVR5cGUoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHR5cGUpKSwgbUNvdW50KGNvdW50KSwgbUVuZChlbmQpIHsKKyAgICBjb3VudCA9ICh0eXBlID09IFJBVElPTkFMIHx8IHR5cGUgPT0gU1JBVElPTkFMKSA/IGNvdW50ICogMiA6IGNvdW50OworICAgIHNzaXplX3QgaW5kZXggPSBtRGF0YS5hcHBlbmRBcnJheShkYXRhLCBjb3VudCk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICIlczogQ291bGQgbm90IGFsbG9jYXRlIHZlY3RvciBmb3IgZGF0YS4iLCBfX0ZVTkNUSU9OX18pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVGlmZkVudHJ5SW1wbDxUPjo6flRpZmZFbnRyeUltcGwoKSB7fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDMyX3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0Q291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Db3VudDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3VpbnQxNl90IFRpZmZFbnRyeUltcGw8VD46OmdldFRhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRhZzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1RhZ1R5cGUgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnVHlwZT4obVR5cGUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgdm9pZCogVGlmZkVudHJ5SW1wbDxUPjo6Z2V0RGF0YUhlbHBlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4obURhdGEuYXJyYXkoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzaXplX3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbCA9IGdldEFjdHVhbFNpemUoKTsKKyAgICBXT1JEX0FMSUdOKHRvdGFsKQorICAgIHJldHVybiAodG90YWwgPD0gT0ZGU0VUX1NJWkUpID8gMCA6IHRvdGFsOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDMyX3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0QWN0dWFsU2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbCA9IHNpemVvZihUKSAqIG1Db3VudDsKKyAgICBpZiAoZ2V0VHlwZSgpID09IFJBVElPTkFMIHx8IGdldFR5cGUoKSA9PSBTUkFUSU9OQUwpIHsKKyAgICAgICAgLy8gMiBpbnRzIHN0b3JlZCBmb3IgZWFjaCByYXRpb25hbCwgbXVsdGlwbHkgYnkgMgorICAgICAgICB0b3RhbCA8PD0gMTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRW5kaWFubmVzcyBUaWZmRW50cnlJbXBsPFQ+OjpnZXRFbmRpYW5uZXNzKCkgY29uc3QgeworICAgIHJldHVybiBtRW5kOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDMyX3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBtVGFnOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxUPjo6d3JpdGVUYWdJbmZvKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdCB7CisgICAgYXNzZXJ0KChvZmZzZXQgJSBUSUZGX1dPUkRfU0laRSkgPT0gMCk7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1UYWcsIDAsIDEpLCByZXQpOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZtVHlwZSwgMCwgMSksIHJldCk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1Db3VudCwgMCwgMSksIHJldCk7CisKKyAgICB1aW50MzJfdCBkYXRhU2l6ZSA9IGdldEFjdHVhbFNpemUoKTsKKyAgICBpZiAoZGF0YVNpemUgPiBPRkZTRVRfU0laRSkgeworICAgICAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmb2Zmc2V0LCAwLCAxKSwgcmV0KTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IG1Db3VudDsKKyAgICAgICAgaWYgKGdldFR5cGUoKSA9PSBSQVRJT05BTCB8fCBnZXRUeXBlKCkgPT0gU1JBVElPTkFMKSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJhdGlvbmFscyBhcmUgc3RvcmVkIGFzIGFuIGFycmF5IG9mIGludHMuICBFYWNoCisgICAgICAgICAgICAgKiByYXRpb25hbCBpcyByZXByZXNlbnRlZCBieSAyIGludHMuICBUbyByZWNvdmVyIHRoZQorICAgICAgICAgICAgICogc2l6ZSBvZiB0aGUgYXJyYXkgaGVyZSwgbXVsdGlwbHkgdGhlIGNvdW50IGJ5IDIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvdW50IDw8PSAxOworICAgICAgICB9CisgICAgICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKG1EYXRhLmFycmF5KCksIDAsIGNvdW50KSwgcmV0KTsKKyAgICAgICAgWkVST19USUxMX1dPUkQob3V0LCBkYXRhU2l6ZSwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXR1c190IFRpZmZFbnRyeUltcGw8VD46OndyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIEVuZGlhbk91dHB1dCogb3V0KSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisKKyAgICAvLyBTb21lIHRhZ3MgaGF2ZSBmaXhlZC1lbmRpYW4gdmFsdWUgb3V0cHV0CisgICAgRW5kaWFubmVzcyB0bXAgPSBVTkRFRklORURfRU5ESUFOOworICAgIGlmIChtRW5kICE9IFVOREVGSU5FRF9FTkRJQU4pIHsKKyAgICAgICAgdG1wID0gb3V0LT5nZXRFbmRpYW5uZXNzKCk7CisgICAgICAgIG91dC0+c2V0RW5kaWFubmVzcyhtRW5kKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3VudCA9IG1Db3VudDsKKyAgICBpZiAoZ2V0VHlwZSgpID09IFJBVElPTkFMIHx8IGdldFR5cGUoKSA9PSBTUkFUSU9OQUwpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJhdGlvbmFscyBhcmUgc3RvcmVkIGFzIGFuIGFycmF5IG9mIGludHMuICBFYWNoCisgICAgICAgICAqIHJhdGlvbmFsIGlzIHJlcHJlc2VudGVkIGJ5IDIgaW50cy4gIFRvIHJlY292ZXIgdGhlCisgICAgICAgICAqIHNpemUgb2YgdGhlIGFycmF5IGhlcmUsIG11bHRpcGx5IHRoZSBjb3VudCBieSAyLgorICAgICAgICAgKi8KKyAgICAgICAgY291bnQgPDw9IDE7CisgICAgfQorCisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUobURhdGEuYXJyYXkoKSwgMCwgY291bnQpLCByZXQpOworCisgICAgaWYgKG1FbmQgIT0gVU5ERUZJTkVEX0VORElBTikgeworICAgICAgICBvdXQtPnNldEVuZGlhbm5lc3ModG1wKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byBuZXh0IHdvcmQgYWxpZ25tZW50CisgICAgWkVST19USUxMX1dPUkQob3V0LCBzaXplb2YoVCkgKiBjb3VudCwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxzcDxUaWZmSWZkPiA+Ojp3cml0ZVRhZ0luZm8odWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKG9mZnNldCAlIFRJRkZfV09SRF9TSVpFKSA9PSAwKTsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbVRhZywgMCwgMSksIHJldCk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1UeXBlLCAwLCAxKSwgcmV0KTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbUNvdW50LCAwLCAxKSwgcmV0KTsKKworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZvZmZzZXQsIDAsIDEpLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50MzJfdCBUaWZmRW50cnlJbXBsPHNwPFRpZmZJZmQ+ID46OmdldEFjdHVhbFNpemUoKSBjb25zdCB7CisgICAgdWludDMyX3QgdG90YWwgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURhdGEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdG90YWwgKz0gbURhdGFbaV0tPmdldFNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxzcDxUaWZmSWZkPiA+Ojp3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCBFbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgeworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ291bnQ7ICsraSkgeworICAgICAgICBCQUlMX09OX0ZBSUwobURhdGFbaV0tPndyaXRlRGF0YShvZmZzZXQsIG91dCksIHJldCk7CisgICAgICAgIG9mZnNldCArPSBtRGF0YVtpXS0+Z2V0U2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfVElGRl9FTlRSWV9JTVBMKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkhlbHBlcnMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjllNGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkhlbHBlcnMuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9IRUxQRVJTX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfSEVMUEVSU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK2NvbnN0IHVpbnQ4X3QgWkVST19XT1JEW10gPSB7MCwgMCwgMCwgMH07CisKKyNkZWZpbmUgQkFJTF9PTl9GQUlMKHgsIGZsYWcpIFwKKyAgICBpZiAoKGZsYWcgPSAoeCkpICE9IE9LKSByZXR1cm4gZmxhZzsKKworI2RlZmluZSBCWVRFU19USUxMX1dPUkQoaW5kZXgpIFwKKyAgICAoKFRJRkZfV09SRF9TSVpFIC0gKChpbmRleCkgJSBUSUZGX1dPUkRfU0laRSkpICUgVElGRl9XT1JEX1NJWkUpCisKKyNkZWZpbmUgV09SRF9BTElHTihjb3VudCkgXAorICAgIGNvdW50ICs9IEJZVEVTX1RJTExfV09SRChjb3VudCk7CisKKyNkZWZpbmUgWkVST19USUxMX1dPUkQob3V0cHV0LCBpbmRleCwgcmV0KSBcCisgICAgeyBcCisgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBCWVRFU19USUxMX1dPUkQoaW5kZXgpOyBcCisgICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7IFwKKyAgICAgICAgICAgIEJBSUxfT05fRkFJTCgob3V0cHV0KS0+d3JpdGUoWkVST19XT1JELCAwLCByZW1haW5pbmcpLCByZXQpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworLyoqCisgKiBCYXNpYyBUSUZGIGhlYWRlciBjb25zdGFudHMuCisgKi8KK2VudW0geworICAgIEJBRF9PRkZTRVQgPSAwLAorICAgIFRJRkZfV09SRF9TSVpFID0gNCwgLy8gU2l6ZSBpbiBieXRlcworICAgIElGRF9IRUFERVJfU0laRSA9IDIsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBJRkRfRk9PVEVSX1NJWkUgPSA0LCAvLyBTaXplIGluIGJ5dGVzCisgICAgVElGRl9FTlRSWV9TSVpFID0gMTIsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBNQVhfSUZEX0VOVFJJRVMgPSBVSU5UMTZfTUFYLAorICAgIEZJTEVfSEVBREVSX1NJWkUgPSA4LCAvLyBTaXplIGluIGJ5dGVzCisgICAgRU5ESUFOX01BUktFUl9TSVpFID0gMiwgLy8gU2l6ZSBpbiBieXRlcworICAgIFRJRkZfTUFSS0VSX1NJWkUgPSAyLCAvLyBTaXplIGluIGJ5dGVzCisgICAgT0ZGU0VUX01BUktFUl9TSVpFID0gNCwgLy8gU2l6ZSBpbiBieXRlcworICAgIFRJRkZfRklMRV9NQVJLRVIgPSA0MiwKKyAgICBCSUdfRU5ESUFOX01BUktFUiA9IDB4NEQ0RHUsCisgICAgTElUVExFX0VORElBTl9NQVJLRVIgPSAweDQ5NDl1Cit9OworCisvKioKKyAqIENvbnN0YW50cyBmb3IgdGhlIFRJRkYgdGFnIHR5cGVzLgorICovCitlbnVtIFRhZ1R5cGUgeworICAgIFVOS05PV05fVEFHVFlQRSA9IDAsCisgICAgQllURT0xLAorICAgIEFTQ0lJLAorICAgIFNIT1JULAorICAgIExPTkcsCisgICAgUkFUSU9OQUwsCisgICAgU0JZVEUsCisgICAgVU5ERUZJTkVELAorICAgIFNTSE9SVCwKKyAgICBTTE9ORywKKyAgICBTUkFUSU9OQUwsCisgICAgRkxPQVQsCisgICAgRE9VQkxFCit9OworCisvKioKKyAqIFNpemVzIG9mIHRoZSBUSUZGIGVudHJ5IGZpZWxkcyAoaW4gYnl0ZXMpLgorICovCitlbnVtIHsKKyAgICBUQUdfU0laRSA9IDIsCisgICAgVFlQRV9TSVpFID0gMiwKKyAgICBDT1VOVF9TSVpFID0gNCwKKyAgICBPRkZTRVRfU0laRSA9IDQKK307CisKKy8qKgorICogQ29udmVuaWVuY2UgSUZEIGlkIGNvbnN0YW50cy4KKyAqLworZW51bSB7CisgICAgSUZEXzAgPSAwLAorICAgIFJBV19JRkQsCisgICAgUFJPRklMRV9JRkQsCisgICAgUFJFVklFV19JRkQKK307CisKK2lubGluZSBzaXplX3QgZ2V0VHlwZVNpemUoVGFnVHlwZSB0eXBlKSB7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSBVTkRFRklORUQ6CisgICAgICAgIGNhc2UgQVNDSUk6CisgICAgICAgIGNhc2UgQllURToKKyAgICAgICAgY2FzZSBTQllURToKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICBjYXNlIFNTSE9SVDoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIExPTkc6CisgICAgICAgIGNhc2UgU0xPTkc6CisgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgY2FzZSBSQVRJT05BTDoKKyAgICAgICAgY2FzZSBTUkFUSU9OQUw6CisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgcmV0dXJuIDg7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2lubGluZSB1aW50MzJfdCBjYWxjdWxhdGVJZmRTaXplKHNpemVfdCBudW1iZXJPZkVudHJpZXMpIHsKKyAgICByZXR1cm4gSUZEX0hFQURFUl9TSVpFICsgSUZEX0ZPT1RFUl9TSVpFICsgVElGRl9FTlRSWV9TSVpFICogbnVtYmVyT2ZFbnRyaWVzOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfVElGRl9IRUxQRVJTX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZJZmQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSWZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiNWM5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSWZkLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfSUZEX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfSUZEX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBhIHNpbmdsZSBUSUZGIEltYWdlIEZpbGUgRGlyZWN0b3J5IChJRkQpIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIG1hcHMgdG8gdGhlIFRJRkYgSUZEIHN0cnVjdHVyZSB0aGF0IGlzIGxvZ2ljYWxseSBjb21wb3NlZCBvZjoKKyAqIC0gQSAyLWJ5dGUgZmllbGQgbGlzdGluZyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuCisgKiAtIEEgbGlzdCBvZiAxMi1ieXRlIFRJRkYgZW50cmllcy4KKyAqIC0gQSA0LWJ5dGUgb2Zmc2V0IHRvIHRoZSBuZXh0IElGRC4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgVGlmZklmZCA6IHB1YmxpYyBUaWZmV3JpdGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGlmZklmZCh1aW50MzJfdCBpZmRJZCk7CisgICAgICAgIHZpcnR1YWwgflRpZmZJZmQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgVGlmZkVudHJ5IHRvIHRoaXMgSUZEIG9yIHJlcGxhY2UgYW4gZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUKKyAgICAgICAgICogc2FtZSB0YWcgSUQuICBObyB2YWxpZGF0aW9uIGlzIGRvbmUuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVudHJ5KGNvbnN0IHNwPFRpZmZFbnRyeT4mIGVudHJ5KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IElGRC4gIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYSBsaW5rZWQKKyAgICAgICAgICogbGlzdCBvZiBJRkRzIGFzIGRlZmluZWQgYnkgdGhlIFRJRkYgNi4wIHNwZWMuLCBhbmQgaXMgbm90IGluY2x1ZGVkCisgICAgICAgICAqIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgSUZEIGFuZCBlbnRyaWVzIGZvciB0aGUgZ2V0U2l6ZSgpCisgICAgICAgICAqIG1ldGhvZCAodW5saWtlIFN1YklGRHMpLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE5leHRJZmQoY29uc3Qgc3A8VGlmZklmZD4mIGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBJRkQsIG9yIE5VTEwgaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNwPFRpZmZJZmQ+IGdldE5leHRJZmQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgdGhlIElGRCBkYXRhLiAgVGhpcyBpbmNsdWRlcyB0aGUgSUZEIGhlYWRlciwgZW50cmllcywgZm9vdGVyLAorICAgICAgICAgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciBlYWNoIGVudHJ5IChyZWN1cnNpdmVseSBpbmNsdWRpbmcKKyAgICAgICAgICogc3ViLUlGRHMpLiAgVGhlIHdyaXR0ZW4gYW1vdW50IHNob3VsZCBlbmQgb24gYSB3b3JkIGJvdW5kYXJ5LCBhbmQKKyAgICAgICAgICogdGhlIGdpdmVuIG9mZnNldCBzaG91bGQgYmUgd29yZCBhbGlnbmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIElGRC4gVGhpcyBpbmNsdWRlcyB0aGUgSUZEIGhlYWRlciwgZW50cmllcywgZm9vdGVyLAorICAgICAgICAgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciBlYWNoIGVudHJ5IChyZWN1cnNpdmVseSBpbmNsdWRpbmcKKyAgICAgICAgICogYW55IHN1Yi1JRkRzKS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGlzIElGRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SWQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGFuIGVudHJ5IHdpdGggdGhlIGdpdmVuIHRhZyBJRC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBlbnRyeSBpZiBpdCBleGlzdHMsIG9yIGFuIGVtcHR5IHN0cm9uZworICAgICAgICAgKiBwb2ludGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzcDxUaWZmRW50cnk+IGdldEVudHJ5KHVpbnQxNl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElEIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCByZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gdmFsaWRhdGUgYW5kIHNldCBzdHJpcC1yZWxhdGVkIGltYWdlIHRhZ3MuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgc2V0cyBhbGwgc3RyaXAgcmVsYXRlZCB0YWdzLCBidXQgbGVhdmVzIG9mZnNldCB2YWx1ZXMgdW5pdGlhbGl6ZWQuCisgICAgICAgICAqIHNldFN0cmlwT2Zmc2V0cyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBkZXNpcmVkIG9mZnNldCBiZWZvcmUgd3JpdGluZy4KKyAgICAgICAgICogVGhlIHN0cmlwIHRhZyB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZXhpc3RpbmcgdGFncyBmb3IgaW1hZ2UKKyAgICAgICAgICogZGltZW5zaW9ucyBhbmQgcGl4ZWwgdHlwZSBzZXQgaW4gdGhlIElGRC4KKyAgICAgICAgICoKKyAgICAgICAgICogRG9lcyBub3QgaGFuZGxlIHBsYW5hciBpbWFnZSBjb25maWd1cmF0aW9ucyAoUGxhbmFyQ29uZmlndXJhdGlvbiAhPSAxKS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0ZUFuZFNldFN0cmlwVGFncyBoYXMgYmVlbiBjYWxsZWQsIGJ1dCBub3Qgc2V0U3RyaXBPZmZzZXRzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBib29sIHVuaW5pdGlhbGl6ZWRPZmZzZXRzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzZXQgYmVnaW5uaW5nIG9mZnNldCBmb3Igc3RyaXBzLgorICAgICAgICAgKgorICAgICAgICAgKiBDYWxsIHRoaXMgdG8gdXBkYXRlIHRoZSBzdHJpcCBvZmZzZXRzIGJlZm9yZSBjYWxsaW5nIHdyaXRlRGF0YS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmlwT2Zmc2V0KHVpbnQzMl90IG9mZnNldCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgc3RyaXBzIGluIGJ5dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHN1bXMgdGhlIGJ5dGUgY291bnQgYXQgZWFjaCBzdHJpcCBvZmZzZXQsIGFuZCByZXR1cm5zCisgICAgICAgICAqIHRoZSB0b3RhbCBjb3VudCBvZiBieXRlcyBzdG9yZWQgaW4gc3RyaXBzIGZvciB0aGlzIElGRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyaXBTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByaW50IGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBJRkQgdG8gbG9nY2F0LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBsb2coKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHZhbHVlIHVzZWQgdG8gZGV0ZXJtaW5lIHNvcnQgb3JkZXIuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENvbXBhcmFibGVWYWx1ZSgpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGNoZWNrQW5kR2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgY29uc3Q7CisgICAgICAgIFNvcnRlZEVudHJ5VmVjdG9yIG1FbnRyaWVzOworICAgICAgICBzcDxUaWZmSWZkPiBtTmV4dElmZDsKKyAgICAgICAgdWludDMyX3QgbUlmZElkOworICAgICAgICBib29sIG1TdHJpcE9mZnNldHNJbml0aWFsaXplZDsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX0lGRF9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGFibGUuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJjZWNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfV1JJVEFCTEUKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfV1JJVEFCTEUKKworI2luY2x1ZGUgPGltZ191dGlscy9PcmRlcmFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFRpZmZXcml0YWJsZSBzdWJjbGFzc2VzIHJlcHJlc2VudCBUSUZGIG1ldGFkYXRhIG9iamVjdHMgdGhhdCBjYW4gYmUgd3JpdHRlbgorICogdG8gYW4gRW5kaWFuT3V0cHV0IG9iamVjdC4gIFRoaXMgaXMgdXNlZCBmb3IgVElGRiBlbnRyaWVzIGFuZCBJRkRzLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBUaWZmV3JpdGFibGUgOiBwdWJsaWMgT3JkZXJhYmxlLCBwdWJsaWMgTGlnaHRSZWZCYXNlPFRpZmZXcml0YWJsZT4geworICAgIHB1YmxpYzoKKyAgICAgICAgVGlmZldyaXRhYmxlKCk7CisgICAgICAgIHZpcnR1YWwgflRpZmZXcml0YWJsZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0LiBUaGUgZ2l2ZW4gb2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlCisgICAgICAgICAqIHRoZSBoZWFkZXIgb2Zmc2V0IGZvciB2YWx1ZXMgd3JpdHRlbi4gIFRoZSBvZmZzZXQgaXMgZGVmaW5lZAorICAgICAgICAgKiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBUSUZGIGhlYWRlciwgYW5kIGlzIHdvcmQgYWxpZ25lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0byB3cml0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCA9IDA7CisKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX1dSSVRBQkxFKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGVyLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YWYyMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0ZXIuaApAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9XUklURVJfSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9XUklURVJfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL0VuZGlhblV0aWxzLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1N0cmlwU291cmNlLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZklmZC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK2NsYXNzIFRpZmZFbnRyeTsKK2NsYXNzIFRpZmZJZmQ7CitjbGFzcyBPdXRwdXQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBhIGNvbGxlY3Rpb24gb2YgVElGRiBJRkRzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gYXMgYQorICogY29tcGxldGUgRE5HIGZpbGUgaGVhZGVyLgorICoKKyAqIFRoaXMgbWFwcyB0byB0aGUgVElGRiBoZWFkZXIgc3RydWN0dXJlIHRoYXQgaXMgbG9naWNhbGx5IGNvbXBvc2VkIG9mOgorICogLSBBbiA4LWJ5dGUgZmlsZSBoZWFkZXIgY29udGFpbmluZyBhbiBlbmRpYW5uZXNzIGluZGljYXRvciwgdGhlIFRJRkYKKyAqICAgZmlsZSBtYXJrZXIsIGFuZCB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBJRkQuCisgKiAtIEEgbGlzdCBvZiBUSUZGIElGRCBzdHJ1Y3R1cmVzLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBUaWZmV3JpdGVyIDogcHVibGljIExpZ2h0UmVmQmFzZTxUaWZmV3JpdGVyPiB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIFN1YklmZFR5cGUgeworICAgICAgICAgICAgU1VCSUZEID0gMCwKKyAgICAgICAgICAgIEdQU0lORk8KKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIFRpZmZXcml0ZXIgd2l0aCB0aGUgZGVmYXVsdCB0YWcgbWFwcGluZ3MuIFRoaXMgZW5hYmxlcworICAgICAgICAgKiBhbGwgb2YgdGhlIHRhZ3MgZGVmaW5lZCBpbiBUYWdEZWZpbml0aW9ucy5oLCBhbmQgdXNlcyB0aGUgZm9sbG93aW5nCisgICAgICAgICAqIG1hcHBpbmcgcHJlY2VkZW5jZSB0byByZXNvbHZlIGNvbGxpc2lvbnM6CisgICAgICAgICAqIChoaWdoZXN0IHByZWNlZGVuY2UpIFRJRkYvRVAgPiBETkcgPiBFWElGIDIuMyA+IFRJRkYgNi4wCisgICAgICAgICAqLworICAgICAgICBUaWZmV3JpdGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBUaWZmV3JpdGVyIHdpdGggdGhlIGdpdmVuIHRhZyBtYXBwaW5ncy4gIFRoZSBtYXBwaW5nCisgICAgICAgICAqIHByZWNlZGVuY2Ugd2lsbCBiZSBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgZGVmaW5pdGlvbiBtYXBzIGFyZSBnaXZlbiwKKyAgICAgICAgICogd2hlcmUgdGhlIGxvd2VyIGluZGV4IG1hcCBnZXRzIHByZWNlZGVuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgd2l0aCB1c2VyLWRlZmluZWQgZGVmaW5pdGlvbnMsIG9yIGRlZmluaXRpb25zIGZvcm0KKyAgICAgICAgICogVGFnRGVmaW5pdGlvbnMuaAorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgZW5hYmxlZERlZmluaXRpb25zIG1hcHBpbmcgb2JqZWN0IGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBtdXN0CisgICAgICAgICAqIHN0YXkgYWxpdmUgZm9yIHRoZSBsaWZlc3BhbiBvZiB0aGUgY29uc3RydWN0ZWQgVGlmZldyaXRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBUaWZmV3JpdGVyKEtleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiogZW5hYmxlZERlZmluaXRpb25zLAorICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOworCisgICAgICAgIHZpcnR1YWwgflRpZmZXcml0ZXIoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgYSBUSUZGIGhlYWRlciBjb250YWluaW5nIGVhY2ggSUZEIHNldC4gIFRoaXMgd2lsbCByZWN1cnNpdmVseQorICAgICAgICAgKiB3cml0ZSBhbGwgU3ViSUZEcyBhbmQgdGFncy4KKyAgICAgICAgICoKKyAgICAgICAgICogQW55IFN0cmlwU291cmNlcyBwYXNzZWQgaW4gd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYXMgaW1hZ2Ugc3RyaXBzCisgICAgICAgICAqIGF0IHRoZSBhcHByb3ByaWF0ZSBvZmZlc3RzLiAgVGhlIFN0cmlwQnl0ZUNvdW50cywgUm93c1BlclN0cmlwLCBhbmQKKyAgICAgICAgICogU3RyaXBPZmZzZXRzIHRhZ3MgbXVzdCBiZSBzZXQgdG8gdXNlIHRoaXMuICBUbyBzZXQgdGhlc2UgdGFncyBpbiBhCisgICAgICAgICAqIGdpdmVuIElGRCwgdXNlIHRoZSBhZGRTdHJpcCBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKE91dHB1dCogb3V0LCBTdHJpcFNvdXJjZSoqIHNvdXJjZXMsIHNpemVfdCBzb3VyY2VzQ291bnQsCisgICAgICAgICAgICAgICAgRW5kaWFubmVzcyBlbmQgPSBMSVRUTEUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBhIFRJRkYgaGVhZGVyIGNvbnRhaW5pbmcgZWFjaCBJRkQgc2V0LiAgVGhpcyB3aWxsIHJlY3Vyc2l2ZWx5CisgICAgICAgICAqIHdyaXRlIGFsbCBTdWJJRkRzIGFuZCB0YWdzLgorICAgICAgICAgKgorICAgICAgICAgKiBJbWFnZSBkYXRhIGZvciBzdHJpcHMgb3IgdGlsZXMgbXVzdCBiZSB3cml0dGVuIHNlcGFyYXRlbHkgYXQgdGhlCisgICAgICAgICAqIGFwcHJvcHJpYXRlIG9mZnNldHMuICBUaGVzZSBvZmZzZXRzIG11c3Qgbm90IGZhbGwgd2l0aGluIHRoZSBmaWxlCisgICAgICAgICAqIGhlYWRlciB3cml0dGVuIHRoaXMgd2F5LiAgVGhlIHNpemUgb2YgdGhlIGhlYWRlciB3cml0dGVuIGlzIGdpdmVuCisgICAgICAgICAqIGJ5IHRoZSBnZXRUb3RhbFNpemUoKSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKE91dHB1dCogb3V0LCBFbmRpYW5uZXNzIGVuZCA9IExJVFRMRSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdG90YWwgc2l6ZSBpbiBieXRlcyBvZiB0aGUgVElGRiBoZWFkZXIuICBUaGlzIGluY2x1ZGVzIGFsbAorICAgICAgICAgKiBJRkRzLCB0YWdzLCBhbmQgdmFsdWVzIHNldCBmb3IgdGhpcyBUaWZmV3JpdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRUb3RhbFNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGFuIGVudHJ5IHRvIHRoZSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuIFZhbGlkCisgICAgICAgICAqIGVycm9yIGNvZGVzIGZvciB0aGlzIG1ldGhvZCBhcmU6CisgICAgICAgICAqIC0gQkFEX0lOREVYIC0gVGhlIGdpdmVuIHRhZyBkb2Vzbid0IGV4aXN0LgorICAgICAgICAgKiAtIEJBRF9WQUxVRSAtIFRoZSBnaXZlbiBjb3VudCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1aXJlZCBjb3VudCBmb3IKKyAgICAgICAgICogICAgICAgICAgICAgICB0aGlzIHRhZy4KKyAgICAgICAgICogLSBCQURfVFlQRSAgLSBUaGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZGF0YSBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgdHlwZSByZXF1aXJlZCBmb3IgdGhpcyB0YWcuCisgICAgICAgICAqIC0gTkFNRV9OT1RfRk9VTkQgLSBObyBpZmQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIElELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFbnRyeShjb25zdCBzcDxUaWZmRW50cnk+JiBlbnRyeSwgdWludDMyX3QgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgYW4gZW50cnkgZm9yIGEga25vd24gdGFnIGFuZCBhZGQgaXQgdG8gdGhlIElGRCB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgICAgICogVGhpcyB0YWcgbXVzdCBiZSBkZWZpbmVkIGluIG9uZSBvZiB0aGUgZGVmaW5pdGlvbiB2ZWN0b3JzIHRoaXMgVElGRiB3cml0ZXIKKyAgICAgICAgICogd2FzIGNvbnN0cnVjdGVkIHdpdGguIFRoZSBjb3VudCBhbmQgdHlwZSBhcmUgdmFsaWRhdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBWYWxpZAorICAgICAgICAgKiBlcnJvciBjb2RlcyBmb3IgdGhpcyBtZXRob2QgYXJlOgorICAgICAgICAgKiAtIEJBRF9JTkRFWCAtIFRoZSBnaXZlbiB0YWcgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICogLSBCQURfVkFMVUUgLSBUaGUgZ2l2ZW4gY291bnQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWlyZWQgY291bnQgZm9yCisgICAgICAgICAqICAgICAgICAgICAgICAgdGhpcyB0YWcuCisgICAgICAgICAqIC0gQkFEX1RZUEUgIC0gVGhlIHR5cGUgb2YgdGhlIGdpdmVuIGRhdGEgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHR5cGUgcmVxdWlyZWQgZm9yIHRoaXMgdGFnLgorICAgICAgICAgKiAtIE5BTUVfTk9UX0ZPVU5EIC0gTm8gaWZkIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXR1c190IGFkZEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IFQqIGRhdGEsIHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuIGVudHJ5IGZvciBhIGtub3duIHRhZy4gIFRoaXMgdGFnIG11c3QgYmUgb25lIG9mIHRoZSB0YWdzCisgICAgICAgICAqIGRlZmluZWQgaW4gb25lIG9mIHRoZSBkZWZpbml0aW9uIHZlY3RvcnMgdGhpcyBUSUZGIHdyaXRlciB3YXMgY29uc3RydWN0ZWQKKyAgICAgICAgICogd2l0aC4gVGhlIGNvdW50IGFuZCB0eXBlIGFyZSB2YWxpZGF0ZWQuIElmIHRoaXMgc3VjY2VlZHMsIHRoZSByZXN1bHRpbmcKKyAgICAgICAgICogZW50cnkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG91dEVudHJ5IHBvaW50ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuIFZhbGlkCisgICAgICAgICAqIGVycm9yIGNvZGVzIGZvciB0aGlzIG1ldGhvZCBhcmU6CisgICAgICAgICAqIC0gQkFEX0lOREVYIC0gVGhlIGdpdmVuIHRhZyBkb2Vzbid0IGV4aXN0LgorICAgICAgICAgKiAtIEJBRF9WQUxVRSAtIFRoZSBnaXZlbiBjb3VudCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1aXJlZCBjb3VudCBmb3IKKyAgICAgICAgICogICAgICAgICAgICAgICB0aGlzIHRhZy4KKyAgICAgICAgICogLSBCQURfVFlQRSAgLSBUaGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZGF0YSBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgdHlwZSByZXF1aXJlZCBmb3IgdGhpcyB0YWcuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0dXNfdCBidWlsZEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IFQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAvKm91dCovc3A8VGlmZkVudHJ5Piogb3V0RW50cnkpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBzZXQgdGhlIHN0cmlwIHJlbGF0ZWQgdGFncyBmb3IgYSBnaXZlbiBJRkQuCisgICAgICAgICAqCisgICAgICAgICAqIENhbGwgdGhpcyBiZWZvcmUgdXNpbmcgYSBTdHJpcFNvdXJjZSBhcyBhbiBpbnB1dCB0byB3cml0ZS4KKyAgICAgICAgICogVGhlIGZvbGxvd2luZyB0YWdzIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kOgorICAgICAgICAgKiAtIEltYWdlV2lkdGgKKyAgICAgICAgICogLSBJbWFnZUxlbmd0aAorICAgICAgICAgKiAtIFNhbXBsZXNQZXJQaXhlbAorICAgICAgICAgKiAtIEJpdHNQZXJTYW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmlwKHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgVElGRiBlbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcgSUQgaW4gdGhlIElGRCB3aXRoIHRoZSBnaXZlbiBJRCwKKyAgICAgICAgICogb3IgYW4gZW1wdHkgcG9pbnRlciBpZiBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3A8VGlmZkVudHJ5PiBnZXRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGlmZCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSB0aGUgVElGRiBlbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcgSUQgaW4gdGhlIGdpdmVuIElGRCBpZiBpdCBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gZW1wdHkgSUZEIHdpdGggdGhlIGdpdmVuIElEIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICogbGlzdCBvZiBJRkRzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRJZmQodWludDMyX3QgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIGVtcHR5IElGRCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgYWRkIGl0IGFzIGEgU3ViSWZkIG9mIHRoZQorICAgICAgICAgKiBwYXJlbnQgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdWJJZmQodWludDMyX3QgcGFyZW50SWZkLCB1aW50MzJfdCBpZmQsIFN1YklmZFR5cGUgdHlwZSA9IFNVQklGRCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdHlwZSBmb3IgdGhlIGdpdmVuIHRhZyBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgVGFnVHlwZSBnZXREZWZhdWx0VHlwZSh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGNvdW50IGZvciBhIGdpdmVuIHRhZyBJRCwgb3IgMCBpZiB0aGlzCisgICAgICAgICAqIHRhZyBub3JtYWxseSBoYXMgYSB2YXJpYWJsZSBjb3VudC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGVmYXVsdENvdW50KHVpbnQxNl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbiBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBib29sIGhhc0lmZCh1aW50MzJfdCBpZmQpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBkZWZpbml0aW9uIGV4aXN0IGZvciB0aGUgZ2l2ZW4gdGFnIElELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBib29sIGNoZWNrSWZEZWZpbmVkKHVpbnQxNl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRhZyBpZiBhIGRlZmluaXRpb24gZXhpc3RzIGZvciB0aGUgZ2l2ZW4gdGFnCisgICAgICAgICAqIElELCBvciBudWxsIGlmIG5vIGRlZmluaXRpb24gZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRUYWdOYW1lKHVpbnQxNl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByaW50IHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBJRkRzIGFuZCBlbnRyaWVzIHRvIGxvZ2NhdC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgYW4gZW50cnkuICBObyB2YWxpZGF0aW9uIGlzIGRvbmUuCisgICAgICAgICAqCisgICAgICAgICAqIFdBUk5JTkc6IFVzaW5nIHRoaXMgbWV0aG9kIGNhbiByZXN1bHQgaW4gY3JlYXRpbmcgcG9vcmx5IGZvcm1hdHRlZAorICAgICAgICAgKiBUSUZGIGZpbGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIGEgVGlmZkVudHJ5IHdpdGggdGhlIGdpdmVuIHRhZywgdHlwZSwgY291bnQsIGVuZGlhbm5lc3MsCisgICAgICAgICAqIGFuZCBkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHNwPFRpZmZFbnRyeT4gdW5jaGVja2VkQnVpbGRFbnRyeSh1aW50MTZfdCB0YWcsIFRhZ1R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LCBFbmRpYW5uZXNzIGVuZCwgY29uc3QgVCogZGF0YSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gYnVpbGQgYXRhZy10by1kZWZpbml0aW9uIG1hcHBpbmcgZnJvbSBhIGdpdmVuCisgICAgICAgICAqIGFycmF5IG9mIHRhZyBkZWZpbml0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gYnVpbGRUYWdNYXAoCisgICAgICAgICAgICAgICAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb25zLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBERUZBVUxUX05VTV9UQUdfTUFQUyA9IDQsCisgICAgICAgIH07CisKKyAgICAgICAgc3A8VGlmZklmZD4gZmluZExhc3RJZmQoKTsKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVGaWxlSGVhZGVyKEVuZGlhbk91dHB1dCYgb3V0KTsKKyAgICAgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBsb29rdXBEZWZpbml0aW9uKHVpbnQxNl90IHRhZykgY29uc3Q7CisgICAgICAgIHN0YXR1c190IGNhbGN1bGF0ZU9mZnNldHMoKTsKKworICAgICAgICBzcDxUaWZmSWZkPiBtSWZkOworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgc3A8VGlmZklmZD4gPiBtTmFtZWRJZmRzOworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4qIG1UYWdNYXBzOworICAgICAgICBzaXplX3QgbU51bVRhZ01hcHM7CisKKyAgICAgICAgc3RhdGljIEtleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiBzVGFnTWFwc1tdOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXR1c190IFRpZmZXcml0ZXI6OmJ1aWxkRW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVCogZGF0YSwKKyAgICAgICAgICAgICAgICAgIC8qb3V0Ki9zcDxUaWZmRW50cnk+KiBvdXRFbnRyeSkgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IGxvb2t1cERlZmluaXRpb24odGFnKTsKKworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBzdWNoIHRhZyBleGlzdHMgZm9yIGlkICV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmaXhlZENvdW50ID0gZGVmaW5pdGlvbi0+Zml4ZWRDb3VudDsKKyAgICBpZiAoZml4ZWRDb3VudCA+IDAgJiYgZml4ZWRDb3VudCAhPSBjb3VudCkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY291bnQgJWQgZm9yIHRhZyAleCAoZXhwZWN0cyAlZCkuIiwgX19GVU5DVElPTl9fLCBjb3VudCwgdGFnLAorICAgICAgICAgICAgICAgIGZpeGVkQ291bnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFRhZ1R5cGUgZml4ZWRUeXBlID0gZGVmaW5pdGlvbi0+ZGVmYXVsdFR5cGU7CisgICAgaWYgKFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGUoZml4ZWRUeXBlLCBkYXRhKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCB0eXBlIHVzZWQgZm9yIHRhZyB2YWx1ZSBmb3IgdGFnICV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgICpvdXRFbnRyeSA9IG5ldyBUaWZmRW50cnlJbXBsPFQ+KHRhZywgZml4ZWRUeXBlLCBjb3VudCwKKyAgICAgICAgZGVmaW5pdGlvbi0+Zml4ZWRFbmRpYW4sIGRhdGEpOworCisgICAgcmV0dXJuIE9LOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdHVzX3QgVGlmZldyaXRlcjo6YWRkRW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVCogZGF0YSwgdWludDMyX3QgaWZkKSB7CisgICAgc3A8VGlmZkVudHJ5PiBvdXRFbnRyeTsKKworICAgIHN0YXR1c190IHJldCA9IGJ1aWxkRW50cnk8VD4odGFnLCBjb3VudCwgZGF0YSwgJm91dEVudHJ5KTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGJ1aWxkIGVudHJ5IGZvciB0YWcgJXguIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBhZGRFbnRyeShvdXRFbnRyeSwgaWZkKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3NwPFRpZmZFbnRyeT4gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeSh1aW50MTZfdCB0YWcsIFRhZ1R5cGUgdHlwZSwgdWludDMyX3QgY291bnQsCisgICAgICAgIEVuZGlhbm5lc3MgZW5kLCBjb25zdCBUKiBkYXRhKSB7CisgICAgVGlmZkVudHJ5SW1wbDxUPiogZW50cnkgPSBuZXcgVGlmZkVudHJ5SW1wbDxUPih0YWcsIHR5cGUsIGNvdW50LCBlbmQsIGRhdGEpOworICAgIHJldHVybiBzcDxUaWZmRW50cnk+KGVudHJ5KTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworCisjZW5kaWYgLypJTUdfVVRJTFNfVElGRl9XUklURVJfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0FuZHJvaWQubWsgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3NDg0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDYyIEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIEVuZGlhblV0aWxzLmNwcCBcCisgIEZpbGVJbnB1dC5jcHAgXAorICBGaWxlT3V0cHV0LmNwcCBcCisgIFNvcnRlZEVudHJ5VmVjdG9yLmNwcCBcCisgIElucHV0LmNwcCBcCisgIE91dHB1dC5jcHAgXAorICBPcmRlcmFibGUuY3BwIFwKKyAgVGlmZklmZC5jcHAgXAorICBUaWZmV3JpdGFibGUuY3BwIFwKKyAgVGlmZldyaXRlci5jcHAgXAorICBUaWZmRW50cnkuY3BwIFwKKyAgVGlmZkVudHJ5SW1wbC5jcHAgXAorICBCeXRlQXJyYXlPdXRwdXQuY3BwIFwKKyAgRG5nVXRpbHMuY3BwIFwKKyAgU3RyaXBTb3VyY2UuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgIGxpYmV4cGF0IFwKKyAgbGlidXRpbHMgXAorICBsaWJjdXRpbHMgXAorICBsaWJjYW1lcmFfbWV0YWRhdGEgXAorICBsaWJjYW1lcmFfY2xpZW50CisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAkKExPQ0FMX1BBVEgpLy4uL2luY2x1ZGUgXAorICBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUKKworTE9DQUxfQ0ZMQUdTICs9IFwKKyAgLVdhbGwgXAorICAtV2V4dHJhIFwKKyAgLVdlcnJvciBcCisgIC1mdmlzaWJpbGl0eT1oaWRkZW4KKworaWZuZXEgKCQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpLCkKKyAgICAjIEVuYWJsZSBhc3NlcnQoKSBpbiBlbmcgYnVpbGRzCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1VTkRFQlVHIC1ETE9HX05ERUJVRz0xCitlbmRpZgorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS8uLi9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJpbWdfdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9CeXRlQXJyYXlPdXRwdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9CeXRlQXJyYXlPdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMmQyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0J5dGVBcnJheU91dHB1dC5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9CeXRlQXJyYXlPdXRwdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworQnl0ZUFycmF5T3V0cHV0OjpCeXRlQXJyYXlPdXRwdXQoKSB7fQorCitCeXRlQXJyYXlPdXRwdXQ6On5CeXRlQXJyYXlPdXRwdXQoKSB7fQorCitzdGF0dXNfdCBCeXRlQXJyYXlPdXRwdXQ6Om9wZW4oKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCeXRlQXJyYXlPdXRwdXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgaWYgKG1CeXRlQXJyYXkuYXBwZW5kQXJyYXkoYnVmICsgb2Zmc2V0LCBjb3VudCkgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHRvIEJ5dGVBcnJheU91dHB1dC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEJ5dGVBcnJheU91dHB1dDo6Y2xvc2UoKSB7CisgICAgbUJ5dGVBcnJheS5jbGVhcigpOworICAgIHJldHVybiBPSzsKK30KKworc2l6ZV90IEJ5dGVBcnJheU91dHB1dDo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJ5dGVBcnJheS5zaXplKCk7Cit9CisKK2NvbnN0IHVpbnQ4X3QqIEJ5dGVBcnJheU91dHB1dDo6Z2V0QXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CeXRlQXJyYXkuYXJyYXkoKTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiNGEzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0RuZ1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitPcGNvZGVMaXN0QnVpbGRlcjo6T3Bjb2RlTGlzdEJ1aWxkZXIoKSA6IG1Db3VudCgwKSwgbU9wTGlzdCgpLCBtRW5kaWFuT3V0KCZtT3BMaXN0LCBCSUcpIHsKKyAgICBpZihtRW5kaWFuT3V0Lm9wZW4oKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IE9wZW4gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorfQorCitPcGNvZGVMaXN0QnVpbGRlcjo6fk9wY29kZUxpc3RCdWlsZGVyKCkgeworICAgIGlmKG1FbmRpYW5PdXQuY2xvc2UoKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENsb3NlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KK30KKworc2l6ZV90IE9wY29kZUxpc3RCdWlsZGVyOjpnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtT3BMaXN0LmdldFNpemUoKSArIHNpemVvZihtQ291bnQpOworfQorCit1aW50MzJfdCBPcGNvZGVMaXN0QnVpbGRlcjo6Z2V0Q291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Db3VudDsKK30KKworc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmJ1aWxkT3BMaXN0KHVpbnQ4X3QqIGJ1ZikgY29uc3QgeworICAgIHVpbnQzMl90IGNvdW50ID0gY29udmVydFRvQmlnRW5kaWFuKG1Db3VudCk7CisgICAgbWVtY3B5KGJ1ZiwgJmNvdW50LCBzaXplb2YoY291bnQpKTsKKyAgICBtZW1jcHkoYnVmICsgc2l6ZW9mKGNvdW50KSwgbU9wTGlzdC5nZXRBcnJheSgpLCBtT3BMaXN0LmdldFNpemUoKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CisgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoID0gYWN0aXZlQXJlYVJpZ2h0IC0gYWN0aXZlQXJlYUxlZnQ7CisgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCA9IGFjdGl2ZUFyZWFCb3R0b20gLSBhY3RpdmVBcmVhVG9wOworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIGxzbUhlaWdodDsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBsc21XaWR0aDsKKworICAgIGZsb2F0IHJlZE1hcFtsc21XaWR0aCAqIGxzbUhlaWdodF07CisgICAgZmxvYXQgZ3JlZW5FdmVuTWFwW2xzbVdpZHRoICogbHNtSGVpZ2h0XTsKKyAgICBmbG9hdCBncmVlbk9kZE1hcFtsc21XaWR0aCAqIGxzbUhlaWdodF07CisgICAgZmxvYXQgYmx1ZU1hcFtsc21XaWR0aCAqIGxzbUhlaWdodF07CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKKyAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOworICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKKyAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIH0KKworICAgIHVpbnQzMl90IHJlZFRvcCA9IDA7CisgICAgdWludDMyX3QgcmVkTGVmdCA9IDA7CisgICAgdWludDMyX3QgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICB1aW50MzJfdCBncmVlbkV2ZW5MZWZ0ID0gMTsKKyAgICB1aW50MzJfdCBncmVlbk9kZFRvcCA9IDE7CisgICAgdWludDMyX3QgZ3JlZW5PZGRMZWZ0ID0gMDsKKyAgICB1aW50MzJfdCBibHVlVG9wID0gMTsKKyAgICB1aW50MzJfdCBibHVlTGVmdCA9IDE7CisKKyAgICBzd2l0Y2goY2ZhKSB7CisgICAgICAgIGNhc2UgQ0ZBX1JHR0I6CisgICAgICAgICAgICByZWRUb3AgPSAwOworICAgICAgICAgICAgcmVkTGVmdCA9IDA7CisgICAgICAgICAgICBncmVlbkV2ZW5Ub3AgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuTGVmdCA9IDE7CisgICAgICAgICAgICBncmVlbk9kZFRvcCA9IDE7CisgICAgICAgICAgICBncmVlbk9kZExlZnQgPSAwOworICAgICAgICAgICAgYmx1ZVRvcCA9IDE7CisgICAgICAgICAgICBibHVlTGVmdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRkFfR1JCRzoKKyAgICAgICAgICAgIHJlZFRvcCA9IDA7CisgICAgICAgICAgICByZWRMZWZ0ID0gMTsKKyAgICAgICAgICAgIGdyZWVuRXZlblRvcCA9IDA7CisgICAgICAgICAgICBncmVlbkV2ZW5MZWZ0ID0gMDsKKyAgICAgICAgICAgIGdyZWVuT2RkVG9wID0gMTsKKyAgICAgICAgICAgIGdyZWVuT2RkTGVmdCA9IDE7CisgICAgICAgICAgICBibHVlVG9wID0gMTsKKyAgICAgICAgICAgIGJsdWVMZWZ0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9HQlJHOgorICAgICAgICAgICAgcmVkVG9wID0gMTsKKyAgICAgICAgICAgIHJlZExlZnQgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlbkxlZnQgPSAwOworICAgICAgICAgICAgZ3JlZW5PZGRUb3AgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRMZWZ0ID0gMTsKKyAgICAgICAgICAgIGJsdWVUb3AgPSAwOworICAgICAgICAgICAgYmx1ZUxlZnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX0JHR1I6CisgICAgICAgICAgICByZWRUb3AgPSAxOworICAgICAgICAgICAgcmVkTGVmdCA9IDE7CisgICAgICAgICAgICBncmVlbkV2ZW5Ub3AgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuTGVmdCA9IDE7CisgICAgICAgICAgICBncmVlbk9kZFRvcCA9IDE7CisgICAgICAgICAgICBncmVlbk9kZExlZnQgPSAwOworICAgICAgICAgICAgYmx1ZVRvcCA9IDA7CisgICAgICAgICAgICBibHVlTGVmdCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBDRkEgbGF5b3V0ICVkIiwgX19GVU5DVElPTl9fLCBjZmEpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9yZWRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL3JlZExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9yZWRNYXApOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9ncmVlbkV2ZW5Ub3AsCisgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL2dyZWVuRXZlbkxlZnQsCisgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9ncmVlbkV2ZW5NYXApOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9ncmVlbk9kZFRvcCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovZ3JlZW5PZGRMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovZ3JlZW5PZGRNYXApOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9ibHVlVG9wLAorICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9ibHVlTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLypjb2xQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzViovbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNIKi9sc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ1YqL3NwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nSCovc3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpblYqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpbkgqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwR2FpbnMqL2JsdWVNYXApOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRHYWluTWFwKHVpbnQzMl90IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgcm93UGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xQaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBvaW50c1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcFNwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcFNwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpblYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFwT3JpZ2luSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBtYXBHYWlucykgeworCisgICAgdWludDMyX3Qgb3Bjb2RlSWQgPSBHQUlOX01BUF9JRDsKKworICAgIHN0YXR1c190IGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJm9wY29kZUlkLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgdWludDhfdCB2ZXJzaW9uW10gPSB7MSwgMywgMCwgMH07CisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSh2ZXJzaW9uLCAwLCBORUxFTVModmVyc2lvbikpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICAvLyBEbyBub3QgaW5jbHVkZSBvcHRpb25hbCBmbGFnIGZvciBwcmV2aWV3LCBhcyB0aGlzIGNhbiBoYXZlIGEgbGFyZ2UgZWZmZWN0IG9uIHRoZSBvdXRwdXQuCisgICAgdWludDMyX3QgZmxhZ3MgPSBGTEFHX09QVElPTkFMOworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmZmxhZ3MsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBjb25zdCB1aW50MzJfdCBOVU1CRVJfSU5UX0FSR1MgPSAxMTsKKyAgICBjb25zdCB1aW50MzJfdCBOVU1CRVJfRE9VQkxFX0FSR1MgPSA0OworCisgICAgdWludDMyX3QgdG90YWxTaXplID0gTlVNQkVSX0lOVF9BUkdTICogc2l6ZW9mKHVpbnQzMl90KSArIE5VTUJFUl9ET1VCTEVfQVJHUyAqIHNpemVvZihkb3VibGUpICsKKyAgICAgICAgICAgIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzICogc2l6ZW9mKGZsb2F0KTsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJnRvdGFsU2l6ZSwgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIC8vIEJhdGNoIHdyaXRlcyBhcyBtdWNoIGFzIHBvc3NpYmxlCisgICAgdWludDMyX3Qgc2V0dGluZ3MxW10gPSB7IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93UGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwUG9pbnRzViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQb2ludHNIIH07CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKHNldHRpbmdzMSwgMCwgTkVMRU1TKHNldHRpbmdzMSkpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBkb3VibGUgc2V0dGluZ3MyW10gPSB7IG1hcFNwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBTcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT3JpZ2luViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT3JpZ2luSCB9OworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZShzZXR0aW5nczIsIDAsIE5FTEVNUyhzZXR0aW5nczIpKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmbWFwUGxhbmVzLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZShtYXBHYWlucywgMCwgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBtQ291bnQrKzsKKworICAgIHJldHVybiBPSzsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRW5kaWFuVXRpbHMuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9FbmRpYW5VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4MWNiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRW5kaWFuVXRpbHMuY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0VuZGlhbk91dHB1dDo6RW5kaWFuT3V0cHV0KE91dHB1dCogb3V0LCBFbmRpYW5uZXNzIGVuZCkKKyAgICAgICAgOiBtT2Zmc2V0KDApLCBtT3V0cHV0KG91dCksIG1FbmRpYW4oZW5kKSB7fQorCitFbmRpYW5PdXRwdXQ6On5FbmRpYW5PdXRwdXQoKSB7fQorCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6Om9wZW4oKSB7CisgICAgbU9mZnNldCA9IDA7CisgICAgcmV0dXJuIG1PdXRwdXQtPm9wZW4oKTsKK30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0OjpjbG9zZSgpIHsKKyAgICByZXR1cm4gbU91dHB1dC0+Y2xvc2UoKTsKK30KKwordm9pZCBFbmRpYW5PdXRwdXQ6OnNldEVuZGlhbm5lc3MoRW5kaWFubmVzcyBlbmQpIHsKKyAgICBtRW5kaWFuID0gZW5kOworfQorCit1aW50MzJfdCBFbmRpYW5PdXRwdXQ6OmdldEN1cnJlbnRPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1PZmZzZXQ7Cit9CisKK0VuZGlhbm5lc3MgRW5kaWFuT3V0cHV0OjpnZXRFbmRpYW5uZXNzKCkgY29uc3QgeworICAgIHJldHVybiBtRW5kaWFuOworfQorCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYoKHJlcyA9IG1PdXRwdXQtPndyaXRlKGJ1Ziwgb2Zmc2V0LCBjb3VudCkpID09IE9LKSB7CisgICAgICAgIG1PZmZzZXQgKz0gY291bnQ7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6d3JpdGUoY29uc3QgaW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIHJldHVybiB3cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWYpLCBvZmZzZXQsIGNvdW50KTsKK30KKworI2RlZmluZSBERUZJTkVfV1JJVEUoX3R5cGVfKSBcCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6OndyaXRlKGNvbnN0IF90eXBlXyogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsgXAorICAgIHJldHVybiB3cml0ZUhlbHBlcjxfdHlwZV8+KGJ1Ziwgb2Zmc2V0LCBjb3VudCk7IFwKK30KKworREVGSU5FX1dSSVRFKHVpbnQxNl90KQorREVGSU5FX1dSSVRFKGludDE2X3QpCitERUZJTkVfV1JJVEUodWludDMyX3QpCitERUZJTkVfV1JJVEUoaW50MzJfdCkKK0RFRklORV9XUklURSh1aW50NjRfdCkKK0RFRklORV9XUklURShpbnQ2NF90KQorCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6OndyaXRlKGNvbnN0IGZsb2F0KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGFzc2VydChzaXplb2YoZmxvYXQpID09IHNpemVvZih1aW50MzJfdCkpOworICAgIHJldHVybiB3cml0ZUhlbHBlcjx1aW50MzJfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KGJ1ZiksIG9mZnNldCwgY291bnQpOworfQorCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6OndyaXRlKGNvbnN0IGRvdWJsZSogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBhc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgcmV0dXJuIHdyaXRlSGVscGVyPHVpbnQ2NF90PihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oYnVmKSwgb2Zmc2V0LCBjb3VudCk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVJbnB1dC5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVJbnB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4ZTcxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRmlsZUlucHV0LmNwcApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0ZpbGVJbnB1dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitGaWxlSW5wdXQ6OkZpbGVJbnB1dChTdHJpbmc4IHBhdGgpIDogbUZwKE5VTEwpLCBtUGF0aChwYXRoKSwgbU9wZW4oZmFsc2UpIHt9CisKK0ZpbGVJbnB1dDo6fkZpbGVJbnB1dCgpIHsKKyAgICBpZiAobU9wZW4pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGaWxlSW5wdXQgZGVzdHJveWVkIHdpdGhvdXQgY2FsbGluZyBjbG9zZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBjbG9zZSgpOworICAgIH0KKworfQorCitzdGF0dXNfdCBGaWxlSW5wdXQ6Om9wZW4oKSB7CisgICAgaWYgKG1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogT3BlbiBjYWxsZWQgd2hlbiBmaWxlICVzIGFscmVhZHkgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtRnAgPSA6OmZvcGVuKG1QYXRoLCAicmIiKTsKKyAgICBpZiAoIW1GcCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3NpemVfdCBGaWxlSW5wdXQ6OnJlYWQodWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBpZiAoIW1PcGVuKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHJlYWQgZmlsZSAlcywgZmlsZSBub3Qgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgYnl0ZXNSZWFkID0gOjpmcmVhZChidWYgKyBvZmZzZXQsIHNpemVvZih1aW50OF90KSwgY291bnQsIG1GcCk7CisgICAgaW50IGVycm9yID0gOjpmZXJyb3IobUZwKTsKKyAgICBpZiAoZXJyb3IgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yICVkIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgZmlsZSAlcy4iLCBfX0ZVTkNUSU9OX18sIGVycm9yLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRW5kIG9mIGZpbGUgcmVhY2hlZAorICAgIGlmICg6OmZlb2YobUZwKSAhPSAwICYmIGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzUmVhZDsKK30KKworc3RhdHVzX3QgRmlsZUlucHV0OjpjbG9zZSgpIHsKKyAgICBpZighbU9wZW4pIHsKKyAgICAgICAgQUxPR1coIiVzOiBDbG9zZSBjYWxsZWQgd2hlbiBmaWxlICVzIGFscmVhZHkgY2xvc2UuIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBpZig6OmZjbG9zZShtRnApICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY2xvc2UgZmlsZSAlcy4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtT3BlbiA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRmlsZU91dHB1dC5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVPdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzYzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVPdXRwdXQuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvRmlsZU91dHB1dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitGaWxlT3V0cHV0OjpGaWxlT3V0cHV0KFN0cmluZzggcGF0aCkgOiBtRnAoTlVMTCksIG1QYXRoKHBhdGgpLCBtT3BlbihmYWxzZSkge30KKworRmlsZU91dHB1dDo6fkZpbGVPdXRwdXQoKSB7CisgICAgaWYgKG1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogRGVzdHJ1Y3RvciBjYWxsZWQgd2l0aCAlcyBzdGlsbCBvcGVuLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICBjbG9zZSgpOworICAgIH0KK30KKworc3RhdHVzX3QgRmlsZU91dHB1dDo6b3BlbigpIHsKKyAgICBpZiAobU9wZW4pIHsKKyAgICAgICAgQUxPR1coIiVzOiBPcGVuIGNhbGxlZCB3aGVuIGZpbGUgJXMgYWxyZWFkeSBvcGVuLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1GcCA9IDo6Zm9wZW4obVBhdGgsICJ3YiIpOworICAgIGlmICghbUZwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtT3BlbiA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBGaWxlT3V0cHV0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGlmICghbU9wZW4pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgd3JpdGUgZmlsZSAlcywgZmlsZSBub3Qgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICA6OmZ3cml0ZShidWYgKyBvZmZzZXQsIHNpemVvZih1aW50OF90KSwgY291bnQsIG1GcCk7CisKKyAgICBpbnQgZXJyb3IgPSA6OmZlcnJvcihtRnApOworICAgIGlmIChlcnJvciAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgJWQgb2NjdXJyZWQgd2hpbGUgd3JpdGluZyBmaWxlICVzLiIsIF9fRlVOQ1RJT05fXywgZXJyb3IsIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBGaWxlT3V0cHV0OjpjbG9zZSgpIHsKKyAgICBpZighbU9wZW4pIHsKKyAgICAgICAgQUxPR1coIiVzOiBDbG9zZSBjYWxsZWQgd2hlbiBmaWxlICVzIGFscmVhZHkgY2xvc2UuIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBpZig6OmZjbG9zZShtRnApICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY2xvc2UgZmlsZSAlcy4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtT3BlbiA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvSW5wdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9JbnB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4MjAxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvSW5wdXQuY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvSW5wdXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0lucHV0Ojp+SW5wdXQoKSB7fQorCitzdGF0dXNfdCBJbnB1dDo6b3BlbigpIHsgcmV0dXJuIE9LOyB9CisKK3N0YXR1c190IElucHV0OjpjbG9zZSgpIHsgcmV0dXJuIE9LOyB9CisKK3NzaXplX3QgSW5wdXQ6OnNraXAoc2l6ZV90IGNvdW50KSB7CisgICAgY29uc3Qgc2l6ZV90IFNLSVBfQlVGX1NJWkUgPSAxMDI0OworICAgIHVpbnQ4X3Qgc2tpcEJ1ZltTS0lQX0JVRl9TSVpFXTsKKworICAgIHNpemVfdCByZW1haW5pbmcgPSBjb3VudDsKKyAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICBzaXplX3QgYW10ID0gKFNLSVBfQlVGX1NJWkUgPiByZW1haW5pbmcpID8gcmVtYWluaW5nIDogU0tJUF9CVUZfU0laRTsKKyAgICAgICAgc3NpemVfdCByZXQgPSByZWFkKHNraXBCdWYsIDAsIGFtdCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZihyZXQgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAgICAgLy8gRW5kIG9mIGZpbGUgZW5jb3VudGVyZWQKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgbm8gYnl0ZXMsIHJldHVybiBFT0YKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbnVtIGJ5dGVzIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50IC0gcmVtYWluaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJldHVybiBlcnJvciBjb2RlLgorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZW1haW5pbmcgLT0gcmV0OworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvT3JkZXJhYmxlLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvT3JkZXJhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBmMTIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9PcmRlcmFibGUuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3JkZXJhYmxlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKyNkZWZpbmUgQ09NUEFSRShvcCkgXAorYm9vbCBPcmRlcmFibGU6Om9wZXJhdG9yIG9wIChjb25zdCBPcmRlcmFibGUmIG9yZGVyYWJsZSkgY29uc3QgeyBcCisgICAgcmV0dXJuIGdldENvbXBhcmFibGVWYWx1ZSgpIG9wIG9yZGVyYWJsZS5nZXRDb21wYXJhYmxlVmFsdWUoKTsgXAorfQorCitDT01QQVJFKD4pCitDT01QQVJFKDwpCitDT01QQVJFKD49KQorQ09NUEFSRSg8PSkKK0NPTVBBUkUoPT0pCitDT01QQVJFKCE9KQorCitPcmRlcmFibGU6On5PcmRlcmFibGUoKSB7fQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9PdXRwdXQuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIG1lZGlhL2ltZ191dGlscy9zcmMvT3V0cHV0LmNwcAppbmRleCAxM2NhYzZkLi4wZTM5NWI5Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL091dHB1dC5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLworT3V0cHV0Ojp+T3V0cHV0KCkge30KK3N0YXR1c190IE91dHB1dDo6b3BlbigpIHsgcmV0dXJuIE9LOyB9CitzdGF0dXNfdCBPdXRwdXQ6OmNsb3NlKCkgeyByZXR1cm4gT0s7IH0KIAorfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvU29ydGVkRW50cnlWZWN0b3IuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9Tb3J0ZWRFbnRyeVZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlMWZhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvU29ydGVkRW50cnlWZWN0b3IuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvU29ydGVkRW50cnlWZWN0b3IuaD4KKworI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitTb3J0ZWRFbnRyeVZlY3Rvcjo6flNvcnRlZEVudHJ5VmVjdG9yKCkge30KKworc3NpemVfdCBTb3J0ZWRFbnRyeVZlY3Rvcjo6aW5kZXhPZlRhZyh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBVc2UgYmluYXJ5IHNlYXJjaCBoZXJlLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0VGFnKCkgPT0gdGFnKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBTb3J0ZWRFbnRyeVZlY3Rvcjo6ZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3QgeworICAgIGNvbnN0IHNwPFRpZmZFbnRyeT4qIGxFbnRyeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3A8VGlmZkVudHJ5Pio+KGxocyk7CisgICAgY29uc3Qgc3A8VGlmZkVudHJ5PiogckVudHJ5ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzcDxUaWZmRW50cnk+Kj4ocmhzKTsKKyAgICByZXR1cm4gY29tcGFyZV90eXBlKCoqbEVudHJ5LCAqKnJFbnRyeSk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1N0cmlwU291cmNlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9pbWdfdXRpbHMvc3JjL1N0cmlwU291cmNlLmNwcAppbmRleCAxM2NhYzZkLi41N2I2MDgyCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1N0cmlwU291cmNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpbmNsdWRlIDxpbWdfdXRpbHMvU3RyaXBTb3VyY2UuaD4KIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgewogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCitTdHJpcFNvdXJjZTo6flN0cmlwU291cmNlKCkge30KIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLwotCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnkuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjBlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZFbnRyeS5jcHAKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZklmZC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnkuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK1RpZmZFbnRyeTo6flRpZmZFbnRyeSgpIHt9CisKKy8qKgorICogU3BlY2lhbGl6ZSBmb3IgZWFjaCB2YWxpZCB0eXBlLCBpbmNsdWRpbmcgc3ViLUlGRHMuCisgKgorICogVmFsdWVzIHdpdGggdHlwZXMgb3RoZXIgdGhhbiB0aGUgb25lcyBnaXZlbiBoZXJlIHNob3VsZCBub3QgY29tcGlsZS4KKyAqLworCit0ZW1wbGF0ZTw+Citjb25zdCBzcDxUaWZmSWZkPiogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxzcDxUaWZmSWZkPiA+KFRhZ1R5cGUgdHlwZSwgY29uc3Qgc3A8VGlmZklmZD4qIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gTE9ORykgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnaWZkJyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgdWludDhfdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTx1aW50OF90PihUYWdUeXBlIHR5cGUsIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gQllURSB8fCB0eXBlID09IEFTQ0lJIHx8IHR5cGUgPT0gVU5ERUZJTkVEKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICd1aW50OF90JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgaW50OF90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPGludDhfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCBpbnQ4X3QqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gU0JZVEUgfHwgdHlwZSA9PSBBU0NJSSB8fCB0eXBlID09IFVOREVGSU5FRCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnaW50OF90JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgdWludDE2X3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8dWludDE2X3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgdWludDE2X3QqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gU0hPUlQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ3VpbnQxNl90JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgaW50MTZfdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxpbnQxNl90PihUYWdUeXBlIHR5cGUsIGNvbnN0IGludDE2X3QqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gU1NIT1JUKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICdpbnQxNl90JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgdWludDMyX3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8dWludDMyX3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgdWludDMyX3QqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gTE9ORyB8fCB0eXBlID09IFJBVElPTkFMKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICd1aW50MzJfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGludDMyX3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8aW50MzJfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCBpbnQzMl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNMT05HIHx8IHR5cGUgPT0gU1JBVElPTkFMKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICdpbnQzMl90JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgZG91YmxlKiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPGRvdWJsZT4oVGFnVHlwZSB0eXBlLCBjb25zdCBkb3VibGUqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gRE9VQkxFKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICdkb3VibGUnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBmbG9hdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxmbG9hdD4oVGFnVHlwZSB0eXBlLCBjb25zdCBmbG9hdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBGTE9BVCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnZmxvYXQnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCitTdHJpbmc4IFRpZmZFbnRyeTo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgU3RyaW5nOCBvdXRwdXQ7CisgICAgdWludDMyX3QgY291bnQgPSBnZXRDb3VudCgpOworICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIltpZDogJXgsIHR5cGU6ICVkLCBjb3VudDogJXUsIHZhbHVlOiAnIiwgZ2V0VGFnKCksIGdldFR5cGUoKSwgY291bnQpOworCisgICAgc2l6ZV90IGNhcHBlZENvdW50ID0gY291bnQ7CisgICAgaWYgKGNvdW50ID4gTUFYX1BSSU5UX1NUUklOR19MRU5HVEgpIHsKKyAgICAgICAgY2FwcGVkQ291bnQgPSBNQVhfUFJJTlRfU1RSSU5HX0xFTkdUSDsKKyAgICB9CisKKyAgICBUYWdUeXBlIHR5cGUgPSBnZXRUeXBlKCk7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVU5ERUZJTkVEOgorICAgICAgICBjYXNlIEJZVEU6IHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPHVpbnQ4X3Q+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIldSAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVNDSUk6IHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVkX2RhdGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihnZXREYXRhPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IGNvdW50OworICAgICAgICAgICAgaWYgKGNvdW50ID4gTUFYX1BSSU5UX1NUUklOR19MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgbGVuID0gTUFYX1BSSU5UX1NUUklOR19MRU5HVEg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHR5cGVkX2RhdGEsIGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNIT1JUOiB7CisgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8dWludDE2X3Q+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIldSAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTE9ORzogeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPHVpbnQzMl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFJBVElPTkFMOiB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8dWludDMyX3Q+KCk7CisgICAgICAgICAgICBjYXBwZWRDb3VudCA8PD0gMTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7IGkrPTIpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIldS8ldSAiLCB0eXBlZF9kYXRhW2ldLCB0eXBlZF9kYXRhW2kgKyAxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNCWVRFOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ4X3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPGludDhfdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVkICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTU0hPUlQ6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPGludDE2X3Q+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIlZCAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0xPTkc6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPGludDMyX3Q+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIlZCAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1JBVElPTkFMOiB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQzMl90PigpOworICAgICAgICAgICAgY2FwcGVkQ291bnQgPDw9IDE7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyBpKz0yKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWQvJWQgIiwgdHlwZWRfZGF0YVtpXSwgdHlwZWRfZGF0YVtpICsgMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGTE9BVDogeworICAgICAgICAgICAgY29uc3QgZmxvYXQqIHR5cGVkX2RhdGEgPSBnZXREYXRhPGZsb2F0PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWYgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERPVUJMRTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxkb3VibGU+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIlZiAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoInVua25vd24gdHlwZSAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvdW50ID4gTUFYX1BSSU5UX1NUUklOR19MRU5HVEgpIHsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiLi4uIik7CisgICAgfQorICAgIG91dHB1dC5hcHBlbmQoIiddIik7CisgICAgcmV0dXJuIG91dHB1dDsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5SW1wbC5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnlJbXBsLmNwcAppbmRleCAxM2NhYzZkLi4yNTdjMjY2Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZFbnRyeUltcGwuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnlJbXBsLmg+CiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgewogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCi0KK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZJZmQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmSWZkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmIwMGNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmSWZkLmNwcApAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUaWZmSWZkIgorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZIZWxwZXJzLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZJZmQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZldyaXRlci5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitUaWZmSWZkOjpUaWZmSWZkKHVpbnQzMl90IGlmZElkKQorICAgICAgICA6IG1OZXh0SWZkKCksIG1JZmRJZChpZmRJZCksIG1TdHJpcE9mZnNldHNJbml0aWFsaXplZChmYWxzZSkge30KKworVGlmZklmZDo6flRpZmZJZmQoKSB7fQorCitzdGF0dXNfdCBUaWZmSWZkOjphZGRFbnRyeShjb25zdCBzcDxUaWZmRW50cnk+JiBlbnRyeSkgeworICAgIHNpemVfdCBzaXplID0gbUVudHJpZXMuc2l6ZSgpOworICAgIGlmIChzaXplID49IE1BWF9JRkRfRU5UUklFUykgeworICAgICAgICBBTE9HVygiJXM6IEZhaWxlZCB0byBhZGQgZW50cnkgZm9yIHRhZyAweCV4IHRvIElGRCAldSwgdG9vIG1hbnkgZW50cmllcyBpbiBJRkQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVudHJ5LT5nZXRUYWcoKSwgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAobUVudHJpZXMuYWRkKGVudHJ5KSA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBGYWlsZWQgdG8gYWRkIGVudHJ5IGZvciB0YWcgMHgleCB0byBpZmQgJXUuIiwgX19GVU5DVElPTl9fLCBlbnRyeS0+Z2V0VGFnKCksCisgICAgICAgICAgICAgICAgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzcDxUaWZmRW50cnk+IFRpZmZJZmQ6OmdldEVudHJ5KHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSBtRW50cmllcy5pbmRleE9mVGFnKHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiJXM6IE5vIGVudHJ5IGZvciB0YWcgMHgleCBpbiBpZmQgJXUuIiwgX19GVU5DVElPTl9fLCB0YWcsIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbUVudHJpZXNbaW5kZXhdOworfQorCit2b2lkIFRpZmZJZmQ6OnJlbW92ZUVudHJ5KHVpbnQxNl90IHRhZykgeworICAgIHNzaXplX3QgaW5kZXggPSBtRW50cmllcy5pbmRleE9mVGFnKHRhZyk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgbUVudHJpZXMucmVtb3ZlQXQoaW5kZXgpOworICAgIH0KK30KKworCit2b2lkIFRpZmZJZmQ6OnNldE5leHRJZmQoY29uc3Qgc3A8VGlmZklmZD4mIGlmZCkgeworICAgIG1OZXh0SWZkID0gaWZkOworfQorCitzcDxUaWZmSWZkPiBUaWZmSWZkOjpnZXROZXh0SWZkKCkgY29uc3QgeworICAgIHJldHVybiBtTmV4dElmZDsKK30KKwordWludDMyX3QgVGlmZklmZDo6Y2hlY2tBbmRHZXRPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtRW50cmllcy5zaXplKCk7CisKKyAgICBpZiAoc2l6ZSA+IE1BWF9JRkRfRU5UUklFUykgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBjYWxjdWxhdGUgSUZEIG9mZnNldHMsIElGRCAldSBjb250YWlucyB0b28gbWFueSBlbnRyaWVzLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX09GRlNFVDsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogQ291bGQgbm90IGNhbGN1bGF0ZSBJRkQgb2Zmc2V0cywgSUZEICV1IGNvbnRhaW5zIG5vIGVudHJpZXMuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfT0ZGU0VUOworICAgIH0KKworICAgIGlmIChvZmZzZXQgPT0gQkFEX09GRlNFVCkgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBjYWxjdWxhdGUgSUZEIG9mZnNldHMsIElGRCAldSBoYWQgYSBiYWQgaW5pdGlhbCBvZmZzZXQuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfT0ZGU0VUOworICAgIH0KKworICAgIHVpbnQzMl90IGlmZFNpemUgPSBjYWxjdWxhdGVJZmRTaXplKHNpemUpOworICAgIFdPUkRfQUxJR04oaWZkU2l6ZSk7CisgICAgcmV0dXJuIG9mZnNldCArIGlmZFNpemU7Cit9CisKK3N0YXR1c190IFRpZmZJZmQ6OndyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgeworICAgIGFzc2VydCgob2Zmc2V0ICUgVElGRl9XT1JEX1NJWkUpID09IDApOworICAgIHN0YXR1c190IHJldCA9IE9LOworCisgICAgQUxPR1YoIiVzOiBJRkQgJXUgd3JpdHRlbiB0byBvZmZzZXQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCwgb2Zmc2V0ICk7CisgICAgdWludDMyX3QgdmFsdWVPZmZzZXQgPSBjaGVja0FuZEdldE9mZnNldChvZmZzZXQpOworICAgIGlmICh2YWx1ZU9mZnNldCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBtRW50cmllcy5zaXplKCk7CisKKyAgICAvLyBXcml0ZXIgSUZEIGhlYWRlciAoMiBieXRlcywgbnVtYmVyIG9mIGVudHJpZXMpLgorICAgIHVpbnQxNl90IGhlYWRlciA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihzaXplKTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmaGVhZGVyLCAwLCAxKSwgcmV0KTsKKworICAgIC8vIFdyaXRlIHRhZyBlbnRyaWVzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgQkFJTF9PTl9GQUlMKG1FbnRyaWVzW2ldLT53cml0ZVRhZ0luZm8odmFsdWVPZmZzZXQsIG91dCksIHJldCk7CisgICAgICAgIHZhbHVlT2Zmc2V0ICs9IG1FbnRyaWVzW2ldLT5nZXRTaXplKCk7CisgICAgfQorCisgICAgLy8gV3JpdGVyIElGRCBmb290ZXIgKDQgYnl0ZXMsIG9mZnNldCB0byBuZXh0IElGRCkuCisgICAgdWludDMyX3QgZm9vdGVyID0gKG1OZXh0SWZkICE9IE5VTEwpID8gb2Zmc2V0ICsgZ2V0U2l6ZSgpIDogMDsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmZm9vdGVyLCAwLCAxKSwgcmV0KTsKKworICAgIGFzc2VydChvdXQtPmdldEN1cnJlbnRPZmZzZXQoKSA9PSBvZmZzZXQgKyBjYWxjdWxhdGVJZmRTaXplKHNpemUpKTsKKworICAgIC8vIFdyaXRlIHplcm9lcyB0aWxsIHdvcmQgYWxpZ25lZAorICAgIFpFUk9fVElMTF9XT1JEKG91dCwgY2FsY3VsYXRlSWZkU2l6ZShzaXplKSwgcmV0KTsKKworICAgIC8vIFdyaXRlIHZhbHVlcyBmb3IgZWFjaCB0YWcgZW50cnkKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBzaXplX3QgbGFzdCA9IG91dC0+Z2V0Q3VycmVudE9mZnNldCgpOworICAgICAgICAvLyBPbmx5IHdyaXRlIHZhbHVlcyB0aGF0IGFyZSB0b28gbGFyZ2UgdG8gZml0IGluIHRoZSAxMi1ieXRlIFRJRkYgZW50cnkKKyAgICAgICAgaWYgKG1FbnRyaWVzW2ldLT5nZXRTaXplKCkgPiBPRkZTRVRfU0laRSkgeworICAgICAgICAgICAgQkFJTF9PTl9GQUlMKG1FbnRyaWVzW2ldLT53cml0ZURhdGEob3V0LT5nZXRDdXJyZW50T2Zmc2V0KCksIG91dCksIHJldCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG5leHQgPSBvdXQtPmdldEN1cnJlbnRPZmZzZXQoKTsKKyAgICAgICAgc2l6ZV90IGRpZmYgPSAobmV4dCAtIGxhc3QpOworICAgICAgICBzaXplX3QgYWN0dWFsID0gbUVudHJpZXNbaV0tPmdldFNpemUoKTsKKyAgICAgICAgaWYgKGRpZmYgIT0gYWN0dWFsKSB7CisgICAgICAgICAgICBBTE9HVygiU2l6ZXMgZG8gbm90IG1hdGNoIGZvciB0YWcgJXguIEV4cGVjdGVkICV6dSwgcmVjZWl2ZWQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbUVudHJpZXNbaV0tPmdldFRhZygpLCBhY3R1YWwsIGRpZmYpOworICAgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KG91dC0+Z2V0Q3VycmVudE9mZnNldCgpID09IG9mZnNldCArIGdldFNpemUoKSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzaXplX3QgVGlmZklmZDo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICB1aW50MzJfdCB0b3RhbCA9IGNhbGN1bGF0ZUlmZFNpemUoc2l6ZSk7CisgICAgV09SRF9BTElHTih0b3RhbCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgdG90YWwgKz0gbUVudHJpZXNbaV0tPmdldFNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCit1aW50MzJfdCBUaWZmSWZkOjpnZXRJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlmZElkOworfQorCit1aW50MzJfdCBUaWZmSWZkOjpnZXRDb21wYXJhYmxlVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JZmRJZDsKK30KKworc3RhdHVzX3QgVGlmZklmZDo6dmFsaWRhdGVBbmRTZXRTdHJpcFRhZ3MoKSB7CisgICAgc3A8VGlmZkVudHJ5PiB3aWR0aEVudHJ5ID0gZ2V0RW50cnkoVEFHX0lNQUdFV0lEVEgpOworICAgIGlmICh3aWR0aEVudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJRkQgJXUgZG9lc24ndCBoYXZlIGEgSW1hZ2VXaWR0aCB0YWcgc2V0IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gaGVpZ2h0RW50cnkgPSBnZXRFbnRyeShUQUdfSU1BR0VMRU5HVEgpOworICAgIGlmIChoZWlnaHRFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXNuJ3QgaGF2ZSBhIEltYWdlTGVuZ3RoIHRhZyBzZXQiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBzYW1wbGVzRW50cnkgPSBnZXRFbnRyeShUQUdfU0FNUExFU1BFUlBJWEVMKTsKKyAgICBpZiAoc2FtcGxlc0VudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJRkQgJXUgZG9lc24ndCBoYXZlIGEgU2FtcGxlc1BlclBpeGVsIHRhZyBzZXQiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBiaXRzRW50cnkgPSBnZXRFbnRyeShUQUdfQklUU1BFUlNBTVBMRSk7CisgICAgaWYgKGJpdHNFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXNuJ3QgaGF2ZSBhIEJpdHNQZXJTYW1wbGUgdGFnIHNldCIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCB3aWR0aCA9ICood2lkdGhFbnRyeS0+Z2V0RGF0YTx1aW50MzJfdD4oKSk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gKihoZWlnaHRFbnRyeS0+Z2V0RGF0YTx1aW50MzJfdD4oKSk7CisgICAgdWludDE2X3QgYml0c1BlclNhbXBsZSA9ICooYml0c0VudHJ5LT5nZXREYXRhPHVpbnQxNl90PigpKTsKKyAgICB1aW50MTZfdCBzYW1wbGVzUGVyUGl4ZWwgPSAqKHNhbXBsZXNFbnRyeS0+Z2V0RGF0YTx1aW50MTZfdD4oKSk7CisKKyAgICBpZiAoKGJpdHNQZXJTYW1wbGUgJSA4KSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQml0c1BlclNhbXBsZSAlZCBpbiBJRkQgJXUgaXMgbm90IGJ5dGUtYWxpZ25lZC4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSwgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBieXRlc1BlclNhbXBsZSA9IGJpdHNQZXJTYW1wbGUgLyA4OworCisgICAgLy8gQ2hvb3NlIHN0cmlwIHNpemUgYXMgY2xvc2UgdG8gOGtiIGFzIHBvc3NpYmxlIHdpdGhvdXQgc3BsaXR0aW5nIHJvd3MuCisgICAgLy8gSWYgdGhlIHJvdyBsZW5ndGggaXMgPjhrYiwgZWFjaCBzdHJpcCB3aWxsIG9ubHkgY29udGFpbiBhIHNpbmdsZSByb3cuCisgICAgY29uc3QgdWludDMyX3Qgcm93TGVuZ3RoQnl0ZXMgPSBieXRlc1BlclNhbXBsZSAqIHNhbXBsZXNQZXJQaXhlbCAqIHdpZHRoOworICAgIGNvbnN0IHVpbnQzMl90IGlkZWFsQ2h1bmtTaXplID0gKDEgPDwgMTMpOyAvLyA4a2IKKyAgICB1aW50MzJfdCByb3dzUGVyQ2h1bmsgPSBpZGVhbENodW5rU2l6ZSAvIHJvd0xlbmd0aEJ5dGVzOworICAgIHJvd3NQZXJDaHVuayA9IChyb3dzUGVyQ2h1bmsgPT0gMCkgPyAxIDogcm93c1BlckNodW5rOworICAgIGNvbnN0IHVpbnQzMl90IGFjdHVhbENodW5rU2l6ZSA9IHJvd0xlbmd0aEJ5dGVzICogcm93c1BlckNodW5rOworCisgICAgY29uc3QgdWludDMyX3QgbGFzdENodW5rUm93cyA9IGhlaWdodCAlIHJvd3NQZXJDaHVuazsKKyAgICBjb25zdCB1aW50MzJfdCBsYXN0Q2h1bmtTaXplID0gbGFzdENodW5rUm93cyAqIHJvd0xlbmd0aEJ5dGVzOworCisgICAgaWYgKGFjdHVhbENodW5rU2l6ZSA+IC8qbWF4IHN0cmlwIHNpemUgZm9yIFRJRkYvRVAqLzY1NTM2KSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyaXAgbGVuZ3RoIHRvbyBsb25nLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IG51bVN0cmlwcyA9IGhlaWdodCAvIHJvd3NQZXJDaHVuazsKKworICAgIC8vIEFkZCBhbm90aGVyIHN0cmlwIGZvciB0aGUgaW5jb21wbGV0ZSBjaHVuay4KKyAgICBpZiAobGFzdENodW5rUm93cyA+IDApIHsKKyAgICAgICAgbnVtU3RyaXBzICs9IDE7CisgICAgfQorCisgICAgLy8gUHV0IGVhY2ggcm93IGluIGl0J3Mgb3duIHN0cmlwCisgICAgdWludDMyX3Qgcm93c1BlclN0cmlwVmFsID0gcm93c1BlckNodW5rOworICAgIHNwPFRpZmZFbnRyeT4gcm93c1BlclN0cmlwID0gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeShUQUdfUk9XU1BFUlNUUklQLCBMT05HLCAxLAorICAgICAgICAgICAgVU5ERUZJTkVEX0VORElBTiwgJnJvd3NQZXJTdHJpcFZhbCk7CisKKyAgICBpZiAocm93c1BlclN0cmlwID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYnVpbGQgZW50cnkgZm9yIFJvd3NQZXJTdHJpcCB0YWcuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IGJ5dGVDb3VudHM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0cmlwczsgKytpKSB7CisgICAgICAgIGlmIChsYXN0Q2h1bmtSb3dzID4gMCAmJiBpID09IChudW1TdHJpcHMgLSAxKSkgeworICAgICAgICAgICAgYnl0ZUNvdW50cy5hZGQobGFzdENodW5rU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBieXRlQ291bnRzLmFkZChhY3R1YWxDaHVua1NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGJ5dGUgY291bnRzIGZvciBlYWNoIHN0cmlwCisgICAgc3A8VGlmZkVudHJ5PiBzdHJpcEJ5dGVDb3VudHMgPSBUaWZmV3JpdGVyOjp1bmNoZWNrZWRCdWlsZEVudHJ5KFRBR19TVFJJUEJZVEVDT1VOVFMsIExPTkcsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtU3RyaXBzKSwgVU5ERUZJTkVEX0VORElBTiwgYnl0ZUNvdW50cy5hcnJheSgpKTsKKworICAgIGlmIChzdHJpcEJ5dGVDb3VudHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBidWlsZCBlbnRyeSBmb3IgU3RyaXBCeXRlQ291bnRzIHRhZy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50MzJfdD4gc3RyaXBPZmZzZXRzVmVjdG9yOworICAgIHN0cmlwT2Zmc2V0c1ZlY3Rvci5yZXNpemUobnVtU3RyaXBzKTsKKworICAgIC8vIFNldCB1bmluaXRpYWxpemVkIG9mZnNldHMKKyAgICBzcDxUaWZmRW50cnk+IHN0cmlwT2Zmc2V0cyA9IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkoVEFHX1NUUklQT0ZGU0VUUywgTE9ORywKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1TdHJpcHMpLCBVTkRFRklORURfRU5ESUFOLCBzdHJpcE9mZnNldHNWZWN0b3IuYXJyYXkoKSk7CisKKyAgICBpZiAoc3RyaXBPZmZzZXRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYnVpbGQgZW50cnkgZm9yIFN0cmlwT2Zmc2V0cyB0YWcuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZihhZGRFbnRyeShzdHJpcEJ5dGVDb3VudHMpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGFkZCBlbnRyeSBmb3IgU3RyaXBCeXRlQ291bnRzIHRvIElGRCAldSIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZihhZGRFbnRyeShyb3dzUGVyU3RyaXApICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGFkZCBlbnRyeSBmb3IgU3RyaXBCeXRlQ291bnRzIHRvIElGRCAldSIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZihhZGRFbnRyeShzdHJpcE9mZnNldHMpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGFkZCBlbnRyeSBmb3IgU3RyaXBCeXRlQ291bnRzIHRvIElGRCAldSIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU3RyaXBPZmZzZXRzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBUaWZmSWZkOjp1bmluaXRpYWxpemVkT2Zmc2V0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0cmlwT2Zmc2V0c0luaXRpYWxpemVkOworfQorCitzdGF0dXNfdCBUaWZmSWZkOjpzZXRTdHJpcE9mZnNldCh1aW50MzJfdCBvZmZzZXQpIHsKKworICAgIC8vIEdldCBvbGQgb2Zmc2V0cyBhbmQgYnl0ZWNvdW50cworICAgIHNwPFRpZmZFbnRyeT4gb2xkT2Zmc2V0cyA9IGdldEVudHJ5KFRBR19TVFJJUE9GRlNFVFMpOworICAgIGlmIChvbGRPZmZzZXRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJRkQgJXUgZG9lcyBub3QgY29udGFpbiBTdHJpcE9mZnNldHMgZW50cnkuIiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gc3RyaXBCeXRlQ291bnRzID0gZ2V0RW50cnkoVEFHX1NUUklQQllURUNPVU5UUyk7CisgICAgaWYgKHN0cmlwQnl0ZUNvdW50cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXMgbm90IGNvbnRhaW4gU3RyaXBCeXRlQ291bnRzIGVudHJ5LiIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBvZmZzZXRzQ291bnQgPSBvbGRPZmZzZXRzLT5nZXRDb3VudCgpOworICAgIHVpbnQzMl90IGJ5dGVDb3VudCA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0Q291bnQoKTsKKyAgICBpZiAob2Zmc2V0c0NvdW50ICE9IGJ5dGVDb3VudCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmlwT2Zmc2V0cyBjb3VudCAoJXUpIGRvZXNuJ3QgbWF0Y2ggU3RyaXBCeXRlQ291bnRzIGNvdW50ICgldSkgaW4gSUZEICV1IiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb2Zmc2V0c0NvdW50LCBieXRlQ291bnQsIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3QgdWludDMyX3QqIHN0cmlwQnl0ZUNvdW50c0FycmF5ID0gc3RyaXBCeXRlQ291bnRzLT5nZXREYXRhPHVpbnQzMl90PigpOworCisgICAgc2l6ZV90IG51bVN0cmlwcyA9IG9mZnNldHNDb3VudDsKKworICAgIFZlY3Rvcjx1aW50MzJfdD4gc3RyaXBPZmZzZXRzOworCisgICAgLy8gQ2FsY3VsYXRlIHVwZGF0ZWQgYnl0ZSBvZmZzZXRzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJpcHM7ICsraSkgeworICAgICAgICBzdHJpcE9mZnNldHMuYWRkKG9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSBzdHJpcEJ5dGVDb3VudHNBcnJheVtpXTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IG5ld09mZnNldHMgPSBUaWZmV3JpdGVyOjp1bmNoZWNrZWRCdWlsZEVudHJ5KFRBR19TVFJJUE9GRlNFVFMsIExPTkcsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtU3RyaXBzKSwgVU5ERUZJTkVEX0VORElBTiwgc3RyaXBPZmZzZXRzLmFycmF5KCkpOworCisgICAgaWYgKG5ld09mZnNldHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWx0IG5vdCBidWlsZCB1cGRhdGVkIG9mZnNldHMgZW50cnkgaW4gSUZEICV1IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChhZGRFbnRyeShuZXdPZmZzZXRzKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgdXBkYXRlZCBvZmZzZXRzIGVudHJ5IGluIElGRCAldSIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit1aW50MzJfdCBUaWZmSWZkOjpnZXRTdHJpcFNpemUoKSBjb25zdCB7CisgICAgc3A8VGlmZkVudHJ5PiBzdHJpcEJ5dGVDb3VudHMgPSBnZXRFbnRyeShUQUdfU1RSSVBCWVRFQ09VTlRTKTsKKyAgICBpZiAoc3RyaXBCeXRlQ291bnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJRkQgJXUgZG9lcyBub3QgY29udGFpbiBTdHJpcEJ5dGVDb3VudHMgZW50cnkuIiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IGNvdW50ID0gc3RyaXBCeXRlQ291bnRzLT5nZXRDb3VudCgpOworICAgIGNvbnN0IHVpbnQzMl90KiBieXRlQ291bnRzID0gc3RyaXBCeXRlQ291bnRzLT5nZXREYXRhPHVpbnQzMl90PigpOworCisgICAgdWludDMyX3QgdG90YWwgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8c2l6ZV90Pihjb3VudCk7ICsraSkgeworICAgICAgICB0b3RhbCArPSBieXRlQ291bnRzW2ldOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK1N0cmluZzggVGlmZklmZDo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgc2l6ZV90IHMgPSBtRW50cmllcy5zaXplKCk7CisgICAgU3RyaW5nOCBvdXRwdXQ7CisgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiW2lmZDogJXgsIG51bV9lbnRyaWVzOiAlenUsIGVudHJpZXM6XG4iLCBnZXRJZCgpLCBzKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbUVudHJpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtRW50cmllc1tpXS0+dG9TdHJpbmcoKSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIG91dHB1dC5hcHBlbmQoIiwgbmV4dF9pZmQ6ICV4XSIsICgobU5leHRJZmQgIT0gTlVMTCkgPyBtTmV4dElmZC0+Z2V0SWQoKSA6IDApKTsKKyAgICByZXR1cm4gb3V0cHV0OworfQorCit2b2lkIFRpZmZJZmQ6OmxvZygpIGNvbnN0IHsKKyAgICBzaXplX3QgcyA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICBBTE9HSSgiW2lmZDogJXgsIG51bV9lbnRyaWVzOiAlenUsIGVudHJpZXM6XG4iLCBnZXRJZCgpLCBzKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgczsgKytpKSB7CisgICAgICAgIEFMT0dJKCJcdCVzIiwgbUVudHJpZXNbaV0tPnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIH0KKyAgICBBTE9HSSgiLCBuZXh0X2lmZDogJXhdIiwgKChtTmV4dElmZCAhPSBOVUxMKSA/IG1OZXh0SWZkLT5nZXRJZCgpIDogMCkpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGFibGUuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NCUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIG1lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRhYmxlLmNwcAppbmRleCAxM2NhYzZkLi5mOGQ3ZGU3Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0YWJsZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgewogCitUaWZmV3JpdGFibGU6OlRpZmZXcml0YWJsZSgpIHt9CisKK1RpZmZXcml0YWJsZTo6flRpZmZXcml0YWJsZSgpIHt9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzQxNzM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcApAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUaWZmV3JpdGVyIgorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZIZWxwZXJzLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0ZXIuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+IFRpZmZXcml0ZXI6OmJ1aWxkVGFnTWFwKAorICAgICAgICAgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9ucywgc2l6ZV90IGxlbmd0aCkgeworICAgIEtleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiBtYXA7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIG1hcC5hZGQoZGVmaW5pdGlvbnNbaV0udGFnSWQsIGRlZmluaXRpb25zICsgaSk7CisgICAgfQorICAgIHJldHVybiBtYXA7Cit9CisKKyNkZWZpbmUgQ09NUEFSRShvcCkgXAorYm9vbCBPcmRlcmFibGU6Om9wZXJhdG9yIG9wIChjb25zdCBPcmRlcmFibGUmIG9yZGVyYWJsZSkgY29uc3QgeyBcCisgICAgcmV0dXJuIGdldENvbXBhcmFibGVWYWx1ZSgpIG9wIG9yZGVyYWJsZS5nZXRDb21wYXJhYmxlVmFsdWUoKTsgXAorfQorCisjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIFwKKyAgICAoc2l6ZW9mKGFycmF5KSAvIHNpemVvZihhcnJheVswXSkpCisKK0tleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiBUaWZmV3JpdGVyOjpzVGFnTWFwc1tdID0geworICAgIGJ1aWxkVGFnTWFwKFRJRkZfRVBfVEFHX0RFRklOSVRJT05TLCBBUlJBWV9TSVpFKFRJRkZfRVBfVEFHX0RFRklOSVRJT05TKSksCisgICAgYnVpbGRUYWdNYXAoRE5HX1RBR19ERUZJTklUSU9OUywgQVJSQVlfU0laRShETkdfVEFHX0RFRklOSVRJT05TKSksCisgICAgYnVpbGRUYWdNYXAoRVhJRl8yXzNfVEFHX0RFRklOSVRJT05TLCBBUlJBWV9TSVpFKEVYSUZfMl8zX1RBR19ERUZJTklUSU9OUykpLAorICAgIGJ1aWxkVGFnTWFwKFRJRkZfNl9UQUdfREVGSU5JVElPTlMsIEFSUkFZX1NJWkUoVElGRl82X1RBR19ERUZJTklUSU9OUykpCit9OworCitUaWZmV3JpdGVyOjpUaWZmV3JpdGVyKCkgOiBtVGFnTWFwcyhzVGFnTWFwcyksIG1OdW1UYWdNYXBzKERFRkFVTFRfTlVNX1RBR19NQVBTKSB7fQorCitUaWZmV3JpdGVyOjpUaWZmV3JpdGVyKEtleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiogZW5hYmxlZERlZmluaXRpb25zLAorICAgICAgICBzaXplX3QgbGVuZ3RoKSA6IG1UYWdNYXBzKGVuYWJsZWREZWZpbml0aW9ucyksIG1OdW1UYWdNYXBzKGxlbmd0aCkge30KKworVGlmZldyaXRlcjo6flRpZmZXcml0ZXIoKSB7fQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjp3cml0ZShPdXRwdXQqIG91dCwgU3RyaXBTb3VyY2UqKiBzb3VyY2VzLCBzaXplX3Qgc291cmNlc0NvdW50LAorICAgICAgICBFbmRpYW5uZXNzIGVuZCkgeworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIEVuZGlhbk91dHB1dCBlbmRPdXQob3V0LCBlbmQpOworCisgICAgaWYgKG1JZmQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFRpZmYgaGVhZGVyIGlzIGVtcHR5LiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3QgdG90YWxTaXplID0gZ2V0VG90YWxTaXplKCk7CisKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgdWludDMyX3Q+IG9mZnNldFZlY3RvcjsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5hbWVkSWZkcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobU5hbWVkSWZkc1tpXS0+dW5pbml0aWFsaXplZE9mZnNldHMoKSkgeworICAgICAgICAgICAgdWludDMyX3Qgc3RyaXBTaXplID0gbU5hbWVkSWZkc1tpXS0+Z2V0U3RyaXBTaXplKCk7CisgICAgICAgICAgICBpZiAobU5hbWVkSWZkc1tpXS0+c2V0U3RyaXBPZmZzZXQodG90YWxTaXplKSAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHNldCBzdHJpcCBvZmZzZXRzLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBzdHJpcFNpemU7CisgICAgICAgICAgICBXT1JEX0FMSUdOKHRvdGFsU2l6ZSk7CisgICAgICAgICAgICBvZmZzZXRWZWN0b3IuYWRkKG1OYW1lZElmZHMua2V5QXQoaSksIHRvdGFsU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3Qgb2ZmVmVjU2l6ZSA9IG9mZnNldFZlY3Rvci5zaXplKCk7CisgICAgaWYgKG9mZlZlY1NpemUgIT0gc291cmNlc0NvdW50KSB7CisgICAgICAgIEFMT0dFKCIlczogTWlzbWF0Y2ggYmV0d2VlbiBudW1iZXIgb2YgSUZEcyB3aXRoIHVuaW5pdGlhbGl6ZWQgc3RyaXBzICglenUpIGFuZCIKKyAgICAgICAgICAgICAgICAiIHNvdXJjZXMgKCV6dSkuIiwgX19GVU5DVElPTl9fLCBvZmZWZWNTaXplLCBzb3VyY2VzQ291bnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEJBSUxfT05fRkFJTCh3cml0ZUZpbGVIZWFkZXIoZW5kT3V0KSwgcmV0KTsKKworICAgIHVpbnQzMl90IG9mZnNldCA9IEZJTEVfSEVBREVSX1NJWkU7CisgICAgc3A8VGlmZklmZD4gaWZkID0gbUlmZDsKKyAgICB3aGlsZShpZmQgIT0gTlVMTCkgeworICAgICAgICBCQUlMX09OX0ZBSUwoaWZkLT53cml0ZURhdGEob2Zmc2V0LCAmZW5kT3V0KSwgcmV0KTsKKyAgICAgICAgb2Zmc2V0ICs9IGlmZC0+Z2V0U2l6ZSgpOworICAgICAgICBpZmQgPSBpZmQtPmdldE5leHRJZmQoKTsKKyAgICB9CisKKyAgICBpZiAoTE9HX05ERUJVRyA9PSAwKSB7CisgICAgICAgIGxvZygpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2ZmVmVjU2l6ZTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IGlmZEtleSA9IG9mZnNldFZlY3Rvci5rZXlBdChpKTsKKyAgICAgICAgdWludDMyX3QgbmV4dE9mZnNldCA9IG9mZnNldFZlY3RvcltpXTsKKyAgICAgICAgdWludDMyX3Qgc2l6ZVRvV3JpdGUgPSBtTmFtZWRJZmRzW2lmZEtleV0tPmdldFN0cmlwU2l6ZSgpOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc291cmNlc0NvdW50OyArK2opIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2VzW2pdLT5nZXRJZmQoKSA9PSBpZmRLZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IHNvdXJjZXNbaV0tPndyaXRlVG9TdHJlYW0oZW5kT3V0LCBzaXplVG9Xcml0ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHdyaXRlIHRvIHN0cmVhbSwgcmVjZWl2ZWQgJWQuIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBaRVJPX1RJTExfV09SRCgmZW5kT3V0LCBzaXplVG9Xcml0ZSwgcmV0KTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBObyBzdHJlYW0gZm9yIGJ5dGUgc3RyaXBzIGZvciBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIGlmZEtleSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGFzc2VydChuZXh0T2Zmc2V0ID09IGVuZE91dC5nZXRDdXJyZW50T2Zmc2V0KCkpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OndyaXRlKE91dHB1dCogb3V0LCBFbmRpYW5uZXNzIGVuZCkgeworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIEVuZGlhbk91dHB1dCBlbmRPdXQob3V0LCBlbmQpOworCisgICAgaWYgKG1JZmQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFRpZmYgaGVhZGVyIGlzIGVtcHR5LiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEJBSUxfT05fRkFJTCh3cml0ZUZpbGVIZWFkZXIoZW5kT3V0KSwgcmV0KTsKKworICAgIHVpbnQzMl90IG9mZnNldCA9IEZJTEVfSEVBREVSX1NJWkU7CisgICAgc3A8VGlmZklmZD4gaWZkID0gbUlmZDsKKyAgICB3aGlsZShpZmQgIT0gTlVMTCkgeworICAgICAgICBCQUlMX09OX0ZBSUwoaWZkLT53cml0ZURhdGEob2Zmc2V0LCAmZW5kT3V0KSwgcmV0KTsKKyAgICAgICAgb2Zmc2V0ICs9IGlmZC0+Z2V0U2l6ZSgpOworICAgICAgICBpZmQgPSBpZmQtPmdldE5leHRJZmQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCitjb25zdCBUYWdEZWZpbml0aW9uX3QqIFRpZmZXcml0ZXI6Omxvb2t1cERlZmluaXRpb24odWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1UYWdNYXBzOyArK2kpIHsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1UYWdNYXBzW2ldLmluZGV4T2ZLZXkodGFnKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGRlZmluaXRpb24gPSBtVGFnTWFwc1tpXVtpbmRleF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBkZWZpbml0aW9uIGV4aXN0cyBmb3IgdGFnIHdpdGggaWQgJXguIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgIH0KKyAgICByZXR1cm4gZGVmaW5pdGlvbjsKK30KKworc3A8VGlmZkVudHJ5PiBUaWZmV3JpdGVyOjpnZXRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGlmZCkgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gSUZEICVkIHNldCBmb3IgdGhpcyB3cml0ZXIuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1OYW1lZElmZHNbaW5kZXhdLT5nZXRFbnRyeSh0YWcpOworfQorCit2b2lkIFRpZmZXcml0ZXI6OnJlbW92ZUVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgaWZkKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIG1OYW1lZElmZHNbaW5kZXhdLT5yZW1vdmVFbnRyeSh0YWcpOworICAgIH0KK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6YWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnksIHVpbnQzMl90IGlmZCkgeworICAgIHVpbnQxNl90IHRhZyA9IGVudHJ5LT5nZXRUYWcoKTsKKworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IGxvb2t1cERlZmluaXRpb24odGFnKTsKKworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBkZWZpbml0aW9uIGV4aXN0cyBmb3IgdGFnIDB4JXguIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKworICAgIC8vIEFkZCBhIG5ldyBJRkQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIElGRCAldSBleGlzdHMuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc3A8VGlmZklmZD4gc2VsZWN0ZWRJZmQgID0gbU5hbWVkSWZkc1tpbmRleF07CisgICAgcmV0dXJuIHNlbGVjdGVkSWZkLT5hZGRFbnRyeShlbnRyeSk7Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZFN0cmlwKHVpbnQzMl90IGlmZCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogSWZkICV1IGRvZXNuJ3QgZXhpc3QsIGNhbm5vdCBhZGQgc3RyaXAgZW50cmllcy4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPFRpZmZJZmQ+IHNlbGVjdGVkID0gbU5hbWVkSWZkc1tpbmRleF07CisgICAgcmV0dXJuIHNlbGVjdGVkLT52YWxpZGF0ZUFuZFNldFN0cmlwVGFncygpOworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjphZGRJZmQodWludDMyX3QgaWZkKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogSWZkIHdpdGggSUQgMHgleCBhbHJlYWR5IGV4aXN0cy4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZklmZD4gbmV3SWZkID0gbmV3IFRpZmZJZmQoaWZkKTsKKyAgICBpZiAobUlmZCA9PSBOVUxMKSB7CisgICAgICAgIG1JZmQgPSBuZXdJZmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8VGlmZklmZD4gbGFzdCA9IGZpbmRMYXN0SWZkKCk7CisgICAgICAgIGxhc3QtPnNldE5leHRJZmQobmV3SWZkKTsKKyAgICB9CisKKyAgICBpZihtTmFtZWRJZmRzLmFkZChpZmQsIG5ld0lmZCkgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGFkZCBuZXcgSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6YWRkU3ViSWZkKHVpbnQzMl90IHBhcmVudElmZCwgdWludDMyX3QgaWZkLCBTdWJJZmRUeXBlIHR5cGUpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJZmQgd2l0aCBJRCAweCV4IGFscmVhZHkgZXhpc3RzLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzc2l6ZV90IHBhcmVudEluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KHBhcmVudElmZCk7CisgICAgaWYgKHBhcmVudEluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFBhcmVudCBJRkQgd2l0aCBJRCAweCV4IGRvZXMgbm90IGV4aXN0LiIsIF9fRlVOQ1RJT05fXywgcGFyZW50SWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmSWZkPiBwYXJlbnQgPSBtTmFtZWRJZmRzW3BhcmVudEluZGV4XTsKKyAgICBzcDxUaWZmSWZkPiBuZXdJZmQgPSBuZXcgVGlmZklmZChpZmQpOworCisgICAgdWludDE2X3Qgc3ViSWZkVGFnOworICAgIGlmICh0eXBlID09IFNVQklGRCkgeworICAgICAgICBzdWJJZmRUYWcgPSBUQUdfU1VCSUZEUzsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gR1BTSU5GTykgeworICAgICAgICBzdWJJZmRUYWcgPSBUQUdfR1BTSU5GTzsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gU3ViSUZEIHR5cGUgJWQuIiwgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IHN1YklmZHMgPSBwYXJlbnQtPmdldEVudHJ5KHN1YklmZFRhZyk7CisgICAgaWYgKHN1YklmZHMgPT0gTlVMTCkgeworICAgICAgICBpZiAoYnVpbGRFbnRyeShzdWJJZmRUYWcsIDEsICZuZXdJZmQsICZzdWJJZmRzKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGJ1aWxkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gR1BTSU5GTykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgYWRkIEdQU0luZm8gU3ViSUZEIHRvIElGRCAldSwgb25lIGFscmVhZHkgZXhpc3RzLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaWZkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8c3A8VGlmZklmZD4gPiBzdWJJZmRMaXN0OworICAgICAgICBjb25zdCBzcDxUaWZmSWZkPiogb2xkSWZkQXJyYXkgPSBzdWJJZmRzLT5nZXREYXRhPHNwPFRpZmZJZmQ+ID4oKTsKKyAgICAgICAgaWYgKHN1YklmZExpc3QuYXBwZW5kQXJyYXkob2xkSWZkQXJyYXksIHN1YklmZHMtPmdldENvdW50KCkpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYnVpbGQgU3ViSWZkIGVudHJ5IGluIElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgcGFyZW50SWZkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ViSWZkTGlzdC5hZGQobmV3SWZkKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGJ1aWxkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgY291bnQgPSBzdWJJZmRMaXN0LnNpemUoKTsKKyAgICAgICAgaWYgKGJ1aWxkRW50cnkoc3ViSWZkVGFnLCBjb3VudCwgc3ViSWZkTGlzdC5hcnJheSgpLCAmc3ViSWZkcykgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBidWlsZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJlbnQtPmFkZEVudHJ5KHN1YklmZHMpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgU3ViSWZkIGVudHJ5IGluIElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgcGFyZW50SWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZihtTmFtZWRJZmRzLmFkZChpZmQsIG5ld0lmZCkgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGFkZCBuZXcgSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworVGFnVHlwZSBUaWZmV3JpdGVyOjpnZXREZWZhdWx0VHlwZSh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisgICAgaWYgKGRlZmluaXRpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBmaW5kIGRlZmluaXRpb24gZm9yIHRhZyAleCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fVEFHVFlQRTsKKyAgICB9CisgICAgcmV0dXJuIGRlZmluaXRpb24tPmRlZmF1bHRUeXBlOworfQorCit1aW50MzJfdCBUaWZmV3JpdGVyOjpnZXREZWZhdWx0Q291bnQodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZmluZCBkZWZpbml0aW9uIGZvciB0YWcgJXgiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gZGVmaW5pdGlvbi0+Zml4ZWRDb3VudDsKK30KKworYm9vbCBUaWZmV3JpdGVyOjpoYXNJZmQodWludDMyX3QgaWZkKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworICAgIHJldHVybiBpbmRleCA+PSAwOworfQorCitib29sIFRpZmZXcml0ZXI6OmNoZWNrSWZEZWZpbmVkKHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIHJldHVybiBsb29rdXBEZWZpbml0aW9uKHRhZykgIT0gTlVMTDsKK30KKworY29uc3QgY2hhciogVGlmZldyaXRlcjo6Z2V0VGFnTmFtZSh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisgICAgaWYgKGRlZmluaXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGRlZmluaXRpb24tPnRhZ05hbWU7Cit9CisKK3NwPFRpZmZJZmQ+IFRpZmZXcml0ZXI6OmZpbmRMYXN0SWZkKCkgeworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgc3A8VGlmZklmZD4gbmV4dElmZCA9IGlmZC0+Z2V0TmV4dElmZCgpOworICAgICAgICBpZiAobmV4dElmZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZmQgPSBuZXh0SWZkOworICAgIH0KKyAgICByZXR1cm4gaWZkOworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjp3cml0ZUZpbGVIZWFkZXIoRW5kaWFuT3V0cHV0JiBvdXQpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICB1aW50MTZfdCBlbmRNYXJrZXIgPSAob3V0LmdldEVuZGlhbm5lc3MoKSA9PSBCSUcpID8gQklHX0VORElBTl9NQVJLRVIgOiBMSVRUTEVfRU5ESUFOX01BUktFUjsKKyAgICBCQUlMX09OX0ZBSUwob3V0LndyaXRlKCZlbmRNYXJrZXIsIDAsIDEpLCByZXQpOworCisgICAgdWludDE2X3QgdGlmZk1hcmtlciA9IFRJRkZfRklMRV9NQVJLRVI7CisgICAgQkFJTF9PTl9GQUlMKG91dC53cml0ZSgmdGlmZk1hcmtlciwgMCwgMSksIHJldCk7CisKKyAgICB1aW50MzJfdCBvZmZzZXRNYXJrZXIgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIEJBSUxfT05fRkFJTChvdXQud3JpdGUoJm9mZnNldE1hcmtlciwgMCwgMSksIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordWludDMyX3QgVGlmZldyaXRlcjo6Z2V0VG90YWxTaXplKCkgY29uc3QgeworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IEZJTEVfSEVBREVSX1NJWkU7CisgICAgc3A8VGlmZklmZD4gaWZkID0gbUlmZDsKKyAgICB3aGlsZShpZmQgIT0gTlVMTCkgeworICAgICAgICB0b3RhbFNpemUgKz0gaWZkLT5nZXRTaXplKCk7CisgICAgICAgIGlmZCA9IGlmZC0+Z2V0TmV4dElmZCgpOworICAgIH0KKyAgICByZXR1cm4gdG90YWxTaXplOworfQorCit2b2lkIFRpZmZXcml0ZXI6OmxvZygpIGNvbnN0IHsKKyAgICBBTE9HSSgiJXM6IFRpZmZXcml0ZXI6IiwgX19GVU5DVElPTl9fKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gbU5hbWVkSWZkcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBtTmFtZWRJZmRzW2ldLT5sb2coKTsKKyAgICB9Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5tawppbmRleCBiNTA2MzUzLi5lZTI4M2E2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmNwdXN0YXRzL0FuZHJvaWQubWsKQEAgLTEsNCArMSw0IEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKQEAgLTgsNCArOCw2IEBACiAKIExPQ0FMX01PRFVMRSA6PSBsaWJjcHVzdGF0cwogCitMT0NBTF9DRkxBR1MgOj0gLXN0ZD1nbnUrKzExIC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCmluZGV4IDYzNzQwMmEuLmNmZGNiNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAorKysgYi9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KQEAgLTIxOCw3ICsyMTcsNyBAQAogI2RlZmluZSBGUkVRX1NJWkUgNjQKICAgICAgICAgICAgIGNoYXIgZnJlcV9wYXRoW0ZSRVFfU0laRV07CiAjZGVmaW5lIEZSRVFfRElHSVQgMjcKLSAgICAgICAgICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoTUFYX0NQVSA8PSAxMCk7CisgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KE1BWF9DUFUgPD0gMTAsICJNQVhfQ1BVIHRvbyBsYXJnZSIpOwogI2RlZmluZSBGUkVRX1BBVEggIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdT8vY3B1ZnJlcS9zY2FsaW5nX2N1cl9mcmVxIgogICAgICAgICAgICAgc3RybGNweShmcmVxX3BhdGgsIEZSRVFfUEFUSCwgc2l6ZW9mKGZyZXFfcGF0aCkpOwogICAgICAgICAgICAgZnJlcV9wYXRoW0ZSRVFfRElHSVRdID0gY3B1TnVtICsgJzAnOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tawppbmRleCAyYmI2ZGJlLi5lMGNhOGFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tawpAQCAtMTUsMTYgKzE1LDEwIEBACiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKIAotaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKLUxPQ0FMX0xETElCUyArPSAtbGRsCi1lbmRpZgotCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKLQogTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKaW5kZXggZDg0YmNhNi4uNGE0MTAzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCkBAIC0xNiw3ICsxNiw4IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0RG93bm1peCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgpAQCAtMjksMjUgKzMwLDEzIEBACiAKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgogCisvLyBzdWJzZXQgb2YgcG9zc2libGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdmFsdWVzLCBhbmQgQVVESU9fQ0hBTk5FTF9PVVRfKiByZW5hbWVkIHRvIENIQU5ORUxfTUFTS18qCiB0eXBlZGVmIGVudW0gewotICAgIENIQU5ORUxfTUFTS19TVVJST1VORCA9IEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAotICAgIENIQU5ORUxfTUFTS19RVUFEX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF9RVUFELAotICAgIC8vIGxpa2UgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCB3aXRoICpfU0lERV8qIGluc3RlYWQgb2YgKl9CQUNLXyosIHNhbWUgY2hhbm5lbCBvcmRlcgotICAgIENIQU5ORUxfTUFTS19RVUFEX1NJREUgPQotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVCwKLSAgICBDSEFOTkVMX01BU0tfNVBPSU5UMV9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKLSAgICAvLyBsaWtlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgd2l0aCAqX1NJREVfKiBpbnN0ZWFkIG9mICpfQkFDS18qLCBzYW1lIGNoYW5uZWwgb3JkZXIKLSAgICBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFID0KLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQsCi0gICAgQ0hBTk5FTF9NQVNLXzdQT0lOVDFfU0lERV9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKKyAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAorICAgIENIQU5ORUxfTUFTS19RVUFEX1NJREUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCisgICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKKyAgICBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgIENIQU5ORUxfTUFTS183UE9JTlQxID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKIH0gZG93bm1peF9pbnB1dF9jaGFubmVsX21hc2tfdDsKIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZG93bm1peCBlZmZlY3QKQEAgLTk5LDcgKzg4LDcgQEAKIC8vIHN0cmljdGx5IGZvciB0ZXN0aW5nLCBsb2dzIHRoZSBpbmRpY2VzIG9mIHRoZSBjaGFubmVscyBmb3IgYSBnaXZlbiBtYXNrLAogLy8gdXNlcyB0aGUgc2FtZSBjb2RlIGFzIERvd25taXhfZm9sZEdlbmVyaWMoKQogdm9pZCBEb3dubWl4X3Rlc3RJbmRleENvbXB1dGF0aW9uKHVpbnQzMl90IG1hc2spIHsKLSAgICBBTE9HSSgiVGVzdGluZyBpbmRleCBjb21wdXRhdGlvbiBmb3IgMHgleDoiLCBtYXNrKTsKKyAgICBBTE9HSSgiVGVzdGluZyBpbmRleCBjb21wdXRhdGlvbiBmb3IgMHglIiBQUkl4MzIgIjoiLCBtYXNrKTsKICAgICAvLyBjaGVjayBhZ2FpbnN0IHVuc3VwcG9ydGVkIGNoYW5uZWxzCiAgICAgaWYgKG1hc2sgJiBrVW5zdXBwb3J0ZWQpIHsKICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNoYW5uZWxzICh0b3Agb3IgZnJvbnQgbGVmdC9yaWdodCBvZiBjZW50ZXIpIik7CkBAIC0xMjksNyArMTE4LDcgQEAKICAgICAgICAgaGFzQmFja3MgPSB0cnVlOwogICAgIH0KIAotICAgIGNvbnN0IGludCBudW1DaGFuID0gcG9wY291bnQobWFzayk7CisgICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7CiAgICAgY29uc3QgYm9vbCBoYXNGQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKTsKICAgICBjb25zdCBib29sIGhhc0xGRSA9CiAgICAgICAgICAgICAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKTsKQEAgLTIyMCw3ICsyMDksNyBAQAogCiAgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KSBtb2R1bGU7CiAKLSAgICBBTE9HVigiRG93bm1peExpYl9DcmVhdGUoKSAlcCAsIHNpemUgJWQiLCBtb2R1bGUsIHNpemVvZihkb3dubWl4X21vZHVsZV90KSk7CisgICAgQUxPR1YoIkRvd25taXhMaWJfQ3JlYXRlKCkgJXAgLCBzaXplICV6dSIsIG1vZHVsZSwgc2l6ZW9mKGRvd25taXhfbW9kdWxlX3QpKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjU0LDcgKzI0Myw3IEBACiAgICAgICAgIEFMT0dWKCJEb3dubWl4TGliX0dldERlc2NyaXB0b3IoKSBpPSVkIiwgaSk7CiAgICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmdEZXNjcmlwdG9yc1tpXS0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsIGdEZXNjcmlwdG9yc1tpXSwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIGRvd25taXggdHlwZSAlZCwgVVVJRCA9ICV4IiwKKyAgICAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIGRvd25taXggdHlwZSAlZCwgVVVJRCA9ICUiIFBSSXgzMiwKICAgICAgICAgICAgICAgICAgaSwgZ0Rlc2NyaXB0b3JzW2ldLT51dWlkLnRpbWVMb3cpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTMyOCw3ICszMTcsNyBAQAogICAgICAgICAgIC8vIGJ5cGFzcyB0aGUgb3B0aW1pemVkIGRvd25taXggcm91dGluZXMgZm9yIHRoZSBjb21tb24gZm9ybWF0cwogICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrLCBwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpKSB7Ci0gICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCV4IGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCUiIFBSSXgzMiAiIGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKQEAgLTMzOSwyMCArMzI4LDE3IEBACiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1FVQURfU0lERToKICAgICAgICAgICAgIERvd25taXhfZm9sZEZyb21RdWFkKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfU1VSUk9VTkQ6Ci0gICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tU3Vycm91bmQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0s6CiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERToKICAgICAgICAgICAgIERvd25taXhfZm9sZEZyb201UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfN1BPSU5UMV9TSURFX0JBQ0s6CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzdQT0lOVDE6CiAgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrLCBwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JXggaXMgbm90IHN1cHBvcnRlZCIsIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0zODAsNyArMzY2LDcgQEAKIAogICAgIHBEb3dubWl4ZXIgPSAoZG93bm1peF9vYmplY3RfdCopICZwRHdtTW9kdWxlLT5jb250ZXh0OwogCi0gICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgY29tbWFuZCAlIiBQUkl1MzIgIiBjbWRTaXplICUiIFBSSXUzMiwgY21kQ29kZSwgY21kU2l6ZSk7CiAKICAgICBzd2l0Y2ggKGNtZENvZGUpIHsKICAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKQEAgLTQwNCw3ICszOTAsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06Ci0gICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGE6ICVwIiwKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBwQ21kRGF0YSAlcCwgKnJlcGx5U2l6ZSAlIiBQUkl1MzIgIiwgcFJlcGx5RGF0YTogJXAiLAogICAgICAgICAgICAgICAgIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CiAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8CkBAIC00MTMsNyArMzk5LDcgQEAKICAgICAgICAgfQogICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcmVwID0gKGVmZmVjdF9wYXJhbV90ICopIHBSZXBseURhdGE7CiAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcGFyYW0gJWQsIHJlcGx5U2l6ZSAlZCIsCisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcGFyYW0gJSIgUFJJZDMyICIsIHJlcGx5U2l6ZSAlIiBQUkl1MzIsCiAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcmVwLT5kYXRhLCByZXAtPnZzaXplKTsKICAgICAgICAgcmVwLT5zdGF0dXMgPSBEb3dubWl4X2dldFBhcmFtZXRlcihwRG93bm1peGVyLCAqKGludDMyX3QgKilyZXAtPmRhdGEsICZyZXAtPnZzaXplLAogICAgICAgICAgICAgICAgIHJlcC0+ZGF0YSArIHNpemVvZihpbnQzMl90KSk7CkBAIC00MjEsOCArNDA3LDggQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsICIgXAotICAgICAgICAgICAgICAgICJwUmVwbHlEYXRhICVwIiwgY21kU2l6ZSwgcENtZERhdGEsICpyZXBseVNpemUsIHBSZXBseURhdGEpOworICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgIiwgcFJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgKGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkKICAgICAgICAgICAgICAgICB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSAoaW50KXNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC00NzEsNyArNDU3LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAgICAgICAgIC8vIEZJWE1FIGNoYW5nZSB0eXBlIGlmIHBsYXlpbmcgb24gaGVhZHNldCB2cyBzcGVha2VyCi0gICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfREVWSUNFOiAweCUwOHgiLCAqKHVpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0RFVklDRTogMHglMDgiIFBSSXgzMiwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogewpAQCAtNDkxLDcgKzQ3Nyw3IEBACiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gKGludClzaXplb2YodWludDMyX3QpKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6ICVkIiwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOiAlIiBQUkl1MzIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRToKQEAgLTUwMCw3ICs0ODYsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJEb3dubWl4X0NvbW1hbmQgaW52YWxpZCBjb21tYW5kICVkIixjbWRDb2RlKTsKKyAgICAgICAgQUxPR1coIkRvd25taXhfQ29tbWFuZCBpbnZhbGlkIGNvbW1hbmQgJSIgUFJJdTMyLCBjbWRDb2RlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC02MjksNyArNjE1LDkgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgbWVtY3B5KCZwRHdtTW9kdWxlLT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKKyAgICBpZiAoJnBEd21Nb2R1bGUtPmNvbmZpZyAhPSBwQ29uZmlnKSB7CisgICAgICAgIG1lbWNweSgmcER3bU1vZHVsZS0+Y29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisgICAgfQogCiAgICAgaWYgKGluaXQpIHsKICAgICAgICAgcERvd25taXhlci0+dHlwZSA9IERPV05NSVhfVFlQRV9GT0xEOwpAQCAtNjQxLDcgKzYyOSw4IEBACiAgICAgICAgICAgICBBTE9HRSgiRG93bm1peF9Db25maWd1cmUgZXJyb3I6IGlucHV0IGNoYW5uZWwgbWFzayBjYW4ndCBiZSAwIik7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQotICAgICAgICBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50ID0gcG9wY291bnQocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworICAgICAgICBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50ID0KKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogICAgIH0KIAogICAgIERvd25taXhfUmVzZXQocERvd25taXhlciwgaW5pdCk7CkBAIC02OTcsMzEgKzY4NiwzMSBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi1pbnQgRG93bm1peF9zZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgc2l6ZV90IHNpemUsIHZvaWQgKnBWYWx1ZSkgeworaW50IERvd25taXhfc2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90IHNpemUsIHZvaWQgKnBWYWx1ZSkgewogCiAgICAgaW50MTZfdCB2YWx1ZTE2OwotICAgIEFMT0dWKCJEb3dubWl4X3NldFBhcmFtZXRlciwgY29udGV4dCAlcCwgcGFyYW0gJWQsIHZhbHVlMTYgJWQsIHZhbHVlMzIgJWQiLAorICAgIEFMT0dWKCJEb3dubWl4X3NldFBhcmFtZXRlciwgY29udGV4dCAlcCwgcGFyYW0gJSIgUFJJZDMyICIsIHZhbHVlMTYgJSIgUFJJZDE2ICIsIHZhbHVlMzIgJSIgUFJJZDMyLAogICAgICAgICAgICAgcERvd25taXhlciwgcGFyYW0sICooaW50MTZfdCAqKXBWYWx1ZSwgKihpbnQzMl90ICopcFZhbHVlKTsKIAogICAgIHN3aXRjaCAocGFyYW0pIHsKIAogICAgICAgY2FzZSBET1dOTUlYX1BBUkFNX1RZUEU6CiAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihkb3dubWl4X3R5cGVfdCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlcihET1dOTUlYX1BBUkFNX1RZUEUpIGludmFsaWQgc2l6ZSAlZCwgc2hvdWxkIGJlICVkIiwKKyAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlcihET1dOTUlYX1BBUkFNX1RZUEUpIGludmFsaWQgc2l6ZSAlIiBQUkl1MzIgIiwgc2hvdWxkIGJlICV6dSIsCiAgICAgICAgICAgICAgICAgICAgIHNpemUsIHNpemVvZihkb3dubWl4X3R5cGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgdmFsdWUxNiA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgQUxPR1YoInNldCBET1dOTUlYX1BBUkFNX1RZUEUsIHR5cGUgJWQiLCB2YWx1ZTE2KTsKKyAgICAgICAgQUxPR1YoInNldCBET1dOTUlYX1BBUkFNX1RZUEUsIHR5cGUgJSIgUFJJZDE2LCB2YWx1ZTE2KTsKICAgICAgICAgaWYgKCEoKHZhbHVlMTYgPiBET1dOTUlYX1RZUEVfSU5WQUxJRCkgJiYgKHZhbHVlMTYgPD0gRE9XTk1JWF9UWVBFX0xBU1QpKSkgewotICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyIGludmFsaWQgRE9XTk1JWF9QQVJBTV9UWVBFIHZhbHVlICVkIiwgdmFsdWUxNik7CisgICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIgaW52YWxpZCBET1dOTUlYX1BBUkFNX1RZUEUgdmFsdWUgJSIgUFJJZDE2LCB2YWx1ZTE2KTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcERvd25taXhlci0+dHlwZSA9IChkb3dubWl4X3R5cGVfdCkgdmFsdWUxNjsKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciB1bmtub3duIHBhcmFtZXRlciAlZCIsIHBhcmFtKTsKKyAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyIHVua25vd24gcGFyYW1ldGVyICUiIFBSSWQzMiwgcGFyYW0pOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiB9CkBAIC03NTMsMjQgKzc0MiwyNCBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi1pbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKSB7CitpbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLCB2b2lkICpwVmFsdWUpIHsKICAgICBpbnQxNl90ICpwVmFsdWUxNjsKIAogICAgIHN3aXRjaCAocGFyYW0pIHsKIAogICAgIGNhc2UgRE9XTk1JWF9QQVJBTV9UWVBFOgogICAgICAgaWYgKCpwU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgewotICAgICAgICAgIEFMT0dFKCJEb3dubWl4X2dldFBhcmFtZXRlciBpbnZhbGlkIHBhcmFtZXRlciBzaXplICVkIGZvciBET1dOTUlYX1BBUkFNX1RZUEUiLCAqcFNpemUpOworICAgICAgICAgIEFMT0dFKCJEb3dubWl4X2dldFBhcmFtZXRlciBpbnZhbGlkIHBhcmFtZXRlciBzaXplICUiIFBSSXUzMiAiIGZvciBET1dOTUlYX1BBUkFNX1RZUEUiLCAqcFNpemUpOwogICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgfQogICAgICAgcFZhbHVlMTYgPSAoaW50MTZfdCAqKXBWYWx1ZTsKICAgICAgICpwVmFsdWUxNiA9IChpbnQxNl90KSBwRG93bm1peGVyLT50eXBlOwogICAgICAgKnBTaXplID0gc2l6ZW9mKGludDE2X3QpOwotICAgICAgQUxPR1YoIkRvd25taXhfZ2V0UGFyYW1ldGVyIERPV05NSVhfUEFSQU1fVFlQRSBpcyAlZCIsICpwVmFsdWUxNik7CisgICAgICBBTE9HVigiRG93bm1peF9nZXRQYXJhbWV0ZXIgRE9XTk1JWF9QQVJBTV9UWVBFIGlzICUiIFBSSWQxNiwgKnBWYWx1ZTE2KTsKICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgIEFMT0dFKCJEb3dubWl4X2dldFBhcmFtZXRlciB1bmtub3duIHBhcmFtZXRlciAlZCIsIHBhcmFtKTsKKyAgICAgIEFMT0dFKCJEb3dubWl4X2dldFBhcmFtZXRlciB1bmtub3duIHBhcmFtZXRlciAlIiBQUklkMTYsIHBhcmFtKTsKICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtODI1LDY1ICs4MTQsNiBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggYSAic3Vycm91bmQgc291bmQiIChtb25vIHJlYXIpIHNpZ25hbCB0byBzdGVyZW8KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgcFNyYyAgICAgICBzdXJyb3VuZCBzaWduYWwgdG8gZG93bm1peAotICogIG51bUZyYW1lcyAgdGhlIG51bWJlciBvZiBzdXJyb3VuZCBmcmFtZXMgdG8gZG93bm1peAotICogIGFjY3VtdWxhdGUgd2hldGhlciB0byBtaXggKHdoZW4gdHJ1ZSkgdGhlIHJlc3VsdCBvZiB0aGUgZG93bm1peCB3aXRoIHRoZSBjb250ZW50cyBvZiBwRHN0LAotICogICAgICAgICAgICAgICBvciBvdmVyd3JpdGUgcERzdCAod2hlbiBmYWxzZSkKLSAqCi0gKiBPdXRwdXRzOgotICogIHBEc3QgICAgICAgZG93bm1peGVkIHN0ZXJlbyBhdWRpbyBzYW1wbGVzCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXZvaWQgRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7Ci0gICAgaW50MzJfdCBsdCwgcnQsIGNlbnRlclBsdXNSZWFyQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0Ci0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIEZDCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgUkMKLSAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKLSAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCi0gICAgaWYgKGFjY3VtdWxhdGUpIHsKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gY2VudGVyUGx1c1JlYXJDb250cmliID0gRkMoLTNkQikgKyBSQygtM2RCKQotICAgICAgICAgICAgY2VudGVyUGx1c1JlYXJDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c1JlYXJDb250cmliCi0gICAgICAgICAgICBsdCA9IChwU3JjWzBdIDw8IDEyKSArIGNlbnRlclBsdXNSZWFyQ29udHJpYjsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c1JlYXJDb250cmliCi0gICAgICAgICAgICBydCA9IChwU3JjWzFdIDw8IDEyKSArIGNlbnRlclBsdXNSZWFyQ29udHJpYjsKLSAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcDE2KHBEc3RbMF0gKyAobHQgPj4gMTMpKTsKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHBEc3RbMV0gKyAocnQgPj4gMTMpKTsKLSAgICAgICAgICAgIHBTcmMgKz0gNDsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gY2VudGVyUGx1c1JlYXJDb250cmliID0gRkMoLTNkQikgKyBSQygtM2RCKQotICAgICAgICAgICAgY2VudGVyUGx1c1JlYXJDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c1JlYXJDb250cmliCi0gICAgICAgICAgICBsdCA9IChwU3JjWzBdIDw8IDEyKSArIGNlbnRlclBsdXNSZWFyQ29udHJpYjsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c1JlYXJDb250cmliCi0gICAgICAgICAgICBydCA9IChwU3JjWzFdIDw8IDEyKSArIGNlbnRlclBsdXNSZWFyQ29udHJpYjsKLSAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihsdCA+PiAxMyk7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wMTYocnQgPj4gMTMpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBTcmMgKz0gNDsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRG93bm1peF9mb2xkRnJvbTVQb2ludDEoKQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBQdXJwb3NlOgpAQCAtMTA2OCw3ICs5OTgsNyBAQAogICAgICAgICBoYXNCYWNrcyA9IHRydWU7CiAgICAgfQogCi0gICAgY29uc3QgaW50IG51bUNoYW4gPSBwb3Bjb3VudChtYXNrKTsKKyAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtYXNrKTsKICAgICBjb25zdCBib29sIGhhc0ZDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpOwogICAgIGNvbnN0IGJvb2wgaGFzTEZFID0KICAgICAgICAgICAgICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKaW5kZXggY2I2Yjk1Ny4uMjM5OWFiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCkBAIC05MywxMSArOTMsMTAgQEAKIGludCBEb3dubWl4X0luaXQoZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSk7CiBpbnQgRG93bm1peF9Db25maWd1cmUoZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnLCBib29sIGluaXQpOwogaW50IERvd25taXhfUmVzZXQoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgYm9vbCBpbml0KTsKLWludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcFZhbHVlKTsKLWludCBEb3dubWl4X2dldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCBzaXplX3QgKnBTaXplLCB2b2lkICpwVmFsdWUpOworaW50IERvd25taXhfc2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90IHNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLCB2b2lkICpwVmFsdWUpOwogCiB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKLXZvaWQgRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLm1rCmluZGV4IDYwYTZjZTUuLmE5MzJhZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLm1rCkBAIC05LDcgKzksNiBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIGxpYmxvZwogCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykKIExPQ0FMX01PRFVMRTo9IGxpYmVmZmVjdHMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKaW5kZXggMzJjNGNlMC4uMzVlNWJjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfTlVMTEFERFJFU1MpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgJSBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5BbGlnbm1lbnQpIT0wKXsKKyAgICAgICAgICAgIGlmICgoKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgJSBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5BbGlnbm1lbnQpIT0wKXsKICAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfQUxJR05NRU5URVJST1IpOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwppbmRleCA3OTQyNzFiLi5mNWEwMWYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ2hlY2sgdGhlIGJ1ZmZlciBhbGlnbm1lbnQKICAgICAgICAgICovCi0gICAgICAgIGlmKCgoKExWTV9VSU5UMzIpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKExWTV9VSU5UMzIpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICAgICAgaWYoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuKExWTV9BTElHTk1FTlRFUlJPUik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvSW5zdEFsbG9jLmgKaW5kZXggYzY5NTRmMi4uN2Y3MjVmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvSW5zdEFsbG9jLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvSW5zdEFsbG9jLmgKQEAgLTI5LDcgKzI5LDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgVG90YWxTaXplOyAgICAgIC8qICBBY2N1bXVsYXRpdmUgdG90YWwgbWVtb3J5IHNpemUgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICBwTmV4dE1lbWJlcjsgICAgLyogIFBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdGFuY2UgbWVtYmVyIHRvIGJlIGFsbG9jYXRlZCAqLworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgIHBOZXh0TWVtYmVyOyAgICAvKiAgUG9pbnRlciB0byB0aGUgbmV4dCBpbnN0YW5jZSBtZW1iZXIgdG8gYmUgYWxsb2NhdGVkICovCiB9ICAgSU5TVF9BTExPQzsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCmluZGV4IDgxNjU1ZGQuLjBjNmZiMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC0yOSw2ICsyOSw3IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04NSwxNCArODYsMTQgQEAKIAogdHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fQ0hBUjsgICAgICAgICAgIC8qIEFTQ0lJIGNoYXJhY3RlciAqLwogCi10eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9JTlQ4OyAgICAgICAgICAgLyogU2lnbmVkIDgtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgTFZNX1VJTlQ4OyAgICAgICAgICAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCit0eXBlZGVmICAgICBpbnQ4X3QgICAgICAgICAgICAgIExWTV9JTlQ4OyAgICAgICAgICAgLyogU2lnbmVkIDgtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVpbnQ4X3QgICAgICAgICAgICAgTFZNX1VJTlQ4OyAgICAgICAgICAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCiAKLXR5cGVkZWYgICAgIHNob3J0ICAgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgaW50MTZfdCAgICAgICAgICAgICBMVk1fSU5UMTY7ICAgICAgICAgIC8qIFNpZ25lZCAxNi1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgdWludDE2X3QgICAgICAgICAgICBMVk1fVUlOVDE2OyAgICAgICAgIC8qIFVuc2lnbmVkIDE2LWJpdCB3b3JkICovCiAKLXR5cGVkZWYgICAgIGxvbmcgICAgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgaW50MzJfdCAgICAgICAgICAgICBMVk1fSU5UMzI7ICAgICAgICAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgdWludDMyX3QgICAgICAgICAgICBMVk1fVUlOVDMyOyAgICAgICAgIC8qIFVuc2lnbmVkIDMyLWJpdCB3b3JkICovCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jCmluZGV4IDQ4MWRmODQuLmE4OWE1YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKlN0YXJ0QWRkciApCiB7CiAgICAgcG1zLT5Ub3RhbFNpemUgPSAzOwotICAgIHBtcy0+cE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7LyogVGhpcyBjb2RlIHdpbGwgZmFpbCBpZiB0aGUgcGxhdGZvcm0gYWRkcmVzcyBzcGFjZSBpcyBtb3JlIHRoYW4gMzItYml0cyovCisgICAgcG1zLT5wTmV4dE1lbWJlciA9ICgoKHVpbnRwdHJfdClTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwogfQogCiAKQEAgLTUxLDcgKzUxLDcgQEAKICAgICB2b2lkICpOZXdNZW1iZXJBZGRyZXNzOyAvKiBWYXJpYWJsZSB0byB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlICovCiAgICAgTmV3TWVtYmVyQWRkcmVzcyA9ICh2b2lkKilwbXMtPnBOZXh0TWVtYmVyOwogCi0gICAgU2l6ZSA9ICgoU2l6ZSArIDMpICYgMHhGRkZGRkZGQyk7IC8qIENlaWwgdGhlIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBmb3VyICovCisgICAgU2l6ZSA9ICgoU2l6ZSArIDMpICYgKExWTV9VSU5UMzIpfjMpOyAvKiBDZWlsIHRoZSBzaXplIHRvIGEgbXVsdGlwbGUgb2YgZm91ciAqLwogCiAgICAgcG1zLT5Ub3RhbFNpemUgKz0gU2l6ZTsKICAgICBwbXMtPnBOZXh0TWVtYmVyICs9IFNpemU7CkBAIC04NCwzMCArODQsMzAgQEAKIHZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKnBtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlKQogewotICAgIExWTV9VSU5UMzIgU3RhcnRBZGRyOworICAgIHVpbnRwdHJfdCBTdGFydEFkZHI7CiAKLSAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKKyAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOwogCiAgICAgcG1zWzBdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzBdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworICAgIHBtc1swXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKIAogCi0gICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKIAogICAgIHBtc1sxXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1sxXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKyAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7CiAKIAotICAgIFN0YXJ0QWRkciA9IChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CiAKICAgICBwbXNbMl0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMl0ucE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7CisgICAgcG1zWzJdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwogCiAKLSAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKyAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOwogCiAgICAgcG1zWzNdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzNdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworICAgIHBtc1szXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKIAogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKaW5kZXggYzQ3NjdhOC4uZTAxYzFjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgIkxWRVFOQi5oIgogI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiSW5zdEFsbG9jLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8qIEZvciBtZW1zZXQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwppbmRleCBhYzNjNzQwLi41OGY1OGVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgfQogCiAgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBidWZmZXJzIGFyZSAzMi1iaXQgYWxpZ25lZCAqLwotICAgIGlmICgoKChMVk1fSU5UMzIpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKExWTV9JTlQzMilwT3V0RGF0YSAlIDQpICE9IDApKQorICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQogICAgIHsKICAgICAgICAgcmV0dXJuIExWRVFOQl9BTElHTk1FTlRFUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCBiNmFlYTZjLi5hYTQxMjUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG5ldz4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlICJFZmZlY3RCdW5kbGUuaCIKIAogCkBAIC0xMzgsMjIgKzE0MCwyMiBAQAogaW50ICBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOwogaW50ICBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpwVmFsdWUpOwogaW50ICBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOwogaW50ICBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpwVmFsdWUpOwogaW50ICBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOwogaW50ICBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwogaW50ICBWb2x1bWVfc2V0UGFyYW1ldGVyICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOwogaW50ICBWb2x1bWVfZ2V0UGFyYW1ldGVyICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwogaW50IEVmZmVjdF9zZXRFbmFibGVkKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBib29sIGVuYWJsZWQpOwogCkBAIC0xNjEsNyArMTYzLDcgQEAKIAogZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICpwSGFuZGxlKXsKICAgICBpbnQgcmV0ID0gMDsKICAgICBpbnQgc2Vzc2lvbk5vOwpAQCAtMjIxLDYgKzIyMyw4IEBACiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkICAgICAgICA9IExWTV9GQUxTRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCAgICAgID0gTFZNX0ZBTFNFOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQgICAgID0gMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCAgICAgID0gMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Zmlyc3RWb2x1bWUgICAgICAgICAgICAgID0gTFZNX1RSVUU7CkBAIC01NjAsMTEgKzU2NCwxMiBAQAogICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKIAogICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXVcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVkICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01NzYsMTEgKzU4MSwxMSBAQAogICAgIGlmKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKXsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CiAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCiAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KQEAgLTg4OSwxNiArODk0LDE2IEBACiAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIFNUQVJUIGZyZWVpbmcgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBFTkQgICBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExNjMsNiArMTE2OCwxNzcgQEAKICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuXG4iKTsKIH0gICAgLyogZW5kIHNldFN0cmVuZ3RoICovCiAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBDaGVjayBpZiBhbiBhdWRpbyBkZXZpY2UgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIElucHV0czoKKy8vICBkZXZpY2VUeXBlICAgdGhlIHR5cGUgb2YgZGV2aWNlIHRoYXQgYWZmZWN0cyB0aGUgcHJvY2Vzc2luZyAoZS5nLiBmb3IgYmluYXVyYWwgdnMgdHJhbnNhdXJhbCkKKy8vIE91dHB1dDoKKy8vICAtRUlOVkFMICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvciBpdCBpcyB1bmtub3duCisvLyAgMCAgICAgICAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgeworICAgIHN3aXRjaCAoZGV2aWNlVHlwZSkgeworICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CisgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQgOgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQ2hlY2sgaWYgYSBjaGFubmVsIG1hc2sgKyBhdWRpbyBkZXZpY2UgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIElucHV0czoKKy8vICBjaGFubmVsTWFzayAgdGhlIGNoYW5uZWwgbWFzayBvZiB0aGUgaW5wdXQgdG8gdmlydHVhbGl6ZQorLy8gIGRldmljZVR5cGUgICB0aGUgdHlwZSBvZiBkZXZpY2UgdGhhdCBhZmZlY3RzIHRoZSBwcm9jZXNzaW5nIChlLmcuIGZvciBiaW5hdXJhbCB2cyB0cmFuc2F1cmFsKQorLy8gT3V0cHV0OgorLy8gIC1FSU5WQUwgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9yIGl0IGlzIHVua25vd24KKy8vICAwICAgICAgICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIGlmICgoY2hhbm5lbENvdW50ID09IDApIHx8IChjaGFubmVsQ291bnQgPiAyKSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2VUeXBlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEZvcmNlIHRoZSB2aXJ0dWFsaXphdGlvbiBtb2RlIHRvIHRoYXQgb2YgdGhlIGdpdmVuIGF1ZGlvIGRldmljZQorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dCAgICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgZm9yY2VkRGV2aWNlIHRoZSB0eXBlIG9mIGRldmljZSB3aG9zZSB2aXJ0dWFsaXphdGlvbiBtb2RlIHdlJ2xsIGFsd2F5cyB1c2UKKy8vIE91dHB1dDoKKy8vICAtRUlOVkFMICAgICAgaWYgdGhlIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkIG9yIGlzIHVua25vd24KKy8vICAwICAgICAgICAgICAgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgYW5kIHRoZSB2aXJ0dWFsaXphdGlvbiBtb2RlIGZvcmNlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UpIHsKKyAgICBBTE9HVigiVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZTogZm9yY2VkRGV2PTB4JXggZW5hYmxlZD0lZCB0bXBEaXNhYmxlZD0lZCIsCisgICAgICAgICAgICBmb3JjZWREZXZpY2UsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQsCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQpOworICAgIGludCBzdGF0dXMgPSAwOworICAgIGJvb2wgdXNlVmlydHVhbGl6ZXIgPSBmYWxzZTsKKworICAgIGlmIChWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGZvcmNlZERldmljZSkgIT0gMCkgeworICAgICAgICAvLyBmb3JjZWQgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQsIG1ha2UgaXQgYmVoYXZlIGFzIGEgcmVzZXQgb2YgZm9yY2VkIG1vZGUKKyAgICAgICAgZm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIC8vIGJ1dCByZXR1cm4gYW4gZXJyb3IKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoZm9yY2VkRGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIGRpc2FibGluZyBmb3JjZWQgdmlydHVhbGl6YXRpb24gbW9kZToKKyAgICAgICAgLy8gdmVyaWZ5IHdoZXRoZXIgdGhlIHZpcnR1YWxpemF0aW9uIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkCisgICAgICAgIGlmIChWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UpID09IDApIHsKKyAgICAgICAgICAgIHVzZVZpcnR1YWxpemVyID0gKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZvcmNpbmcgdmlydHVhbGl6YXRpb24gbW9kZTogaGVyZSB3ZSBhbHJlYWR5IGtub3cgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7CisgICAgICAgIC8vIG9ubHkgZW5hYmxlIGZvciBhIHN1cHBvcnRlZCBtb2RlLCB3aGVuIHRoZSBlZmZlY3QgaXMgZW5hYmxlZAorICAgICAgICB1c2VWaXJ0dWFsaXplciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKTsKKyAgICB9CisKKyAgICBpZiAodXNlVmlydHVhbGl6ZXIpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgQUxPR1YoIlx0VmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZSByZS1lbmFibGUgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgbGVhdmluZyBMVk1fVklSVFVBTElaRVIgZW5hYmxlZCIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fRkFMU0UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9kaXNhYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9UUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIlx0VmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZSBsZWF2aW5nIExWTV9WSVJUVUFMSVpFUiBkaXNhYmxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIlx0YWZ0ZXIgVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZTogZW5hYmxlZD0lZCB0bXBEaXNhYmxlZD0lZCIsCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIHZpcnR1YWwgc3BlYWtlciBhbmdsZXMgZm9yIGEgY2hhbm5lbCBtYXNrICsgYXVkaW8gZGV2aWNlIHR5cGUKKy8vIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIElucHV0czoKKy8vICBjaGFubmVsTWFzazogICB0aGUgY2hhbm5lbCBtYXNrIG9mIHRoZSBpbnB1dCB0byB2aXJ0dWFsaXplCisvLyAgZGV2aWNlVHlwZSAgICAgdGhlIHR5cGUgb2YgZGV2aWNlIHRoYXQgYWZmZWN0cyB0aGUgcHJvY2Vzc2luZyAoZS5nLiBmb3IgYmluYXVyYWwgdnMgdHJhbnNhdXJhbCkKKy8vIElucHV0L091dHB1dDoKKy8vICBwU3BlYWtlckFuZ2xlcyB0aGUgYXJyYXkgb2YgaW50ZWdlciB3aGVyZSBlYWNoIHNwZWFrZXIgYW5nbGUgaXMgd3JpdHRlbiBhcyBhIHRyaXBsZXQgaW4gdGhlCisvLyAgICAgICAgICAgICAgICAgZm9sbG93aW5nIGZvcm1hdDoKKy8vICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGEgYml0IG1hc2sgd2l0aCBhIHNpbmdsZSB2YWx1ZSBzZWxlY3RlZCBmb3IgZWFjaCBzcGVha2VyLCBmb2xsb3dpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb252ZW50aW9uIG9mIHRoZSBhdWRpb19jaGFubmVsX21hc2tfdCB0eXBlCisvLyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhIHZhbHVlIGluIGRlZ3JlZXMgZXhwcmVzc2luZyB0aGUgc3BlYWtlciBhemltdXRoLCB3aGVyZSAwIGlzIGluIGZyb250CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdXNlciwgMTgwIGJlaGluZCwgLTkwIHRvIHRoZSBsZWZ0LCA5MCB0byB0aGUgcmlnaHQgb2YgdGhlIHVzZXIKKy8vICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGEgdmFsdWUgaW4gZGVncmVlcyBleHByZXNzaW5nIHRoZSBzcGVha2VyIGVsZXZhdGlvbiwgd2hlcmUgMCBpcyB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgcGxhbmUsICs5MCBpcyBkaXJlY3RseSBhYm92ZSB0aGUgdXNlciwgLTkwIGJlbG93CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayBfX3VudXNlZCwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgX191bnVzZWQsIGludDMyX3QgKnBTcGVha2VyQW5nbGVzKSB7CisgICAgLy8gdGhlIGNoYW5uZWwgY291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSAxIG9yIDIKKyAgICAvLyB0aGUgZGV2aWNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgb2YgdHlwZSBoZWFkcGhvbmUKKyAgICAvLyB0aGlzIHZpcnR1YWxpemVyIGlzIGFsd2F5cyAyaW4gd2l0aCBzcGVha2VycyBhdCAtOTAgYW5kIDkwZGVnIG9mIGF6aW11dGgsIDBkZWcgb2YgZWxldmF0aW9uCisgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdCkgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVDsKKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IC05MDsgLy8gYXppbXV0aAorICAgICpwU3BlYWtlckFuZ2xlcysrID0gMDsgICAvLyBlbGV2YXRpb24KKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IChpbnQzMl90KSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVDsKKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDkwOyAgLy8gYXppbXV0aAorICAgICpwU3BlYWtlckFuZ2xlcyAgID0gMDsgICAvLyBlbGV2YXRpb24KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCBkZXZpY2Ugd2hvc2UgcHJvY2Vzc2luZyBtb2RlIGlzIHVzZWQgYnkgdGhpcyBlZmZlY3QKKy8vCisvLyBPdXRwdXQ6CisvLyAgIEFVRElPX0RFVklDRV9OT05FIGlmIHRoZSBlZmZlY3QgaXMgbm90IHZpcnR1YWxpemluZworLy8gICBvciB0aGUgZGV2aWNlIHR5cGUgaWYgdGhlIGVmZmVjdCBpcyB2aXJ0dWFsaXppbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYXVkaW9fZGV2aWNlc190IFZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KSB7CisgICAgYXVkaW9fZGV2aWNlc190IHZpcnREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICAmJiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID09IExWTV9GQUxTRSkpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgLy8gdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQsIHJldHVybiB0aGF0IGRldmljZQorICAgICAgICAgICAgdmlydERldmljZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIGZvcmNlZCBtb2RlLCByZXR1cm4gdGhlIGN1cnJlbnQgZGV2aWNlCisgICAgICAgICAgICB2aXJ0RGV2aWNlID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUoKSByZXR1cm5pbmcgMHgleCIsIHZpcnREZXZpY2UpOworICAgIHJldHVybiB2aXJ0RGV2aWNlOworfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVxdWFsaXplckxpbWl0QmFuZExldmVscygpCkBAIC0xMzU3LDcgKzE1MzMsNyBAQAogLy8gIHBMb3c6ICAgICAgIGxvd2VyIGJhbmQgcmFuZ2UKIC8vICBwTG93OiAgICAgICB1cHBlciBiYW5kIHJhbmdlCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludDMyX3QgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBiYW5kLCB1aW50MzJfdCAqcExvdywKK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCBfX3VudXNlZCwgaW50MzJfdCBiYW5kLCB1aW50MzJfdCAqcExvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcEhpKXsKICAgICAqcExvdyA9IGJhbmRGcmVxUmFuZ2VbYmFuZF1bMF07CiAgICAgKnBIaSAgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzFdOwpAQCAtMTM4MSw3ICsxNTU3LDcgQEAKIC8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCiAvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldEJhbmQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IHRhcmdldEZyZXEpeworaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kKEVmZmVjdENvbnRleHQgKnBDb250ZXh0IF9fdW51c2VkLCB1aW50MzJfdCB0YXJnZXRGcmVxKXsKICAgICBpbnQgYmFuZCA9IDA7CiAKICAgICBpZih0YXJnZXRGcmVxIDwgYmFuZEZyZXFSYW5nZVswXVswXSl7CkBAIC0xNzU4LDcgKzE5MzQsNyBAQAogCiBpbnQgQmFzc0Jvb3N0X2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICAgICAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwVmFsdWUpewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKQEAgLTE4NzYsMTIgKzIwNTIsMTEgQEAKIAogaW50IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICAgICAgICAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOwogICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOwotICAgIGludDMyX3QgcGFyYW0yOwogICAgIGNoYXIgKm5hbWU7CiAKICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciBzdGFydCIpOwpAQCAtMTkwMSw3ICsyMDc2LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgICAgICAgIGJyZWFrOwotCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTF9TUEVBS0VSX0FOR0xFUzoKKyAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBzaXplIGNhbiBvbmx5IGJlIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIGlucHV0IHZhbHVlLAorICAgICAgICAgICAgLy8gZGVmZXJyaW5nIHZhbGlkaXR5IGNoZWNrIHRvIGJlbG93CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMSVpBVElPTl9NT0RFOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAlZCIsKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTIyLDEzICsyMTA3LDM2IEBACiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTF9TUEVBS0VSX0FOR0xFUzogeworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpICpwUGFyYW1UZW1wKys7CisgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IChhdWRpb19kZXZpY2VzX3QpICpwUGFyYW1UZW1wOworICAgICAgICAgICAgdWludDMyX3QgbmJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAzICogbmJDaGFubmVscyAqIHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplICVkIiwqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhlIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkCisgICAgICAgICAgICBzdGF0dXMgPSBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChjaGFubmVsTWFzaywgZGV2aWNlVHlwZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTF9TUEVBS0VSX0FOR0xFUyBzdXBwb3J0cyBtYXNrPTB4JXggZGV2aWNlPTB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOworICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkLCBnZXQgdGhlIGFuZ2xlcworICAgICAgICAgICAgICAgIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcyhjaGFubmVsTWFzaywgZGV2aWNlVHlwZSwgKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMSVpBVElPTl9NT0RFOgorICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSAgPSAodWludDMyX3QpIFZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyIGVuZCIpOworICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciBlbmQgcmV0dXJuaW5nIHN0YXR1cz0lZCIsIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0gLyogZW5kIFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciAqLwogCkBAIC0xOTYzLDYgKzIxNzEsMTUgQEAKICAgICAgICAgICAgIFZpcnR1YWxpemVyU2V0U3RyZW5ndGgocENvbnRleHQsIChpbnQzMl90KXN0cmVuZ3RoKTsKICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIHBWaXJ0dWFsaXplci0+c2V0U3RyZW5ndGgiKTsKICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9GT1JDRV9WSVJUVUFMSVpBVElPTl9NT0RFOiB7CisgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9ICooYXVkaW9fZGV2aWNlc190ICopIHBWYWx1ZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUocENvbnRleHQsIGRldmljZVR5cGUpOworICAgICAgICAgICAgLy9BTE9HVigiVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERSBkZXZpY2U9MHgleCByZXN1bHQ9JWQiLAorICAgICAgICAgICAgLy8gICAgICAgIGRldmljZVR5cGUsIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTk5NCw3ICsyMjExLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKXsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBpbnQgYk11dGUgPSAwOwpAQCAtMjI1Miw3ICsyNDY5LDcgQEAKIAogaW50IFZvbHVtZV9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKXsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBpbnQgYk11dGUgPSAwOwpAQCAtMjgyNyw3ICszMDQ0LDcgQEAKICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKICAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0QmFzc0Jvb3N0X2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLApAQCAtMjgzOCw4ICszMDU1LDggQEAKIAogICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKICAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKQEAgLTI4NjcsNyArMzA4NCw3IEBACiAgICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6Vm9sdW1lX2dldFBhcmFtZXRlcihwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCkBAIC0yOTE1LDYgKzMxMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgICAgICAgLy8gV2FybmluZyB0aGlzIGxvZyB3aWxsIGZhaWwgdG8gcHJvcGVybHkgcmVhZCBhbiBpbnQzMl90IHZhbHVlLCBhc3N1bWVzIGludDE2X3QKICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCIsCiAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAogICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKQEAgLTMwMjAsNiArMzIzOCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZSA9ICoodWludDMyX3QgKilwQ21kRGF0YTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KSBkZXZpY2U7CiAKICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewogICAgICAgICAgICAgICAgIGlmKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB8fApAQCAtMzA1NSwzNyArMzI3NCwzOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKLSAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUil8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKXx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHRlbXBvcmFyeSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBjYXNlIHVubGVzcyBjb25maWd1cmF0aW9uIGlzIGZvcmNlZAorICAgICAgICAgICAgICAgICAgICBpZiAoYW5kcm9pZDo6VmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2UpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgaW52YWxpZCBmb3IgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHRlbXBvcmFyeSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiIpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vSWYgYSBkZXZpY2UgZG9lc250IHN1cHBvcnQgdmlydHVhbGl6ZXIgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5IGRpc2FibGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlZmZlY3QgbXVzdCBzdGlsbCByZXBvcnQgaXRzIG9yaWdpbmFsIHN0YXRlIGFzIHRoaXMgY2FuIG9ubHkgYmUgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgRU5BQkxFL0RJU0FCTEUgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhIGRldmljZSBkb2VzbnQgc3VwcG9ydCB2aXJ0dWFsaXplciB0aGUgZWZmZWN0IG11c3QgYmUgdGVtcG9yYXJpbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkIHRoZSBlZmZlY3QgbXVzdCBzdGlsbCByZXBvcnQgaXRzIG9yaWdpbmFsIHN0YXRlIGFzIHRoaXMgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKIAotICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9kaXNhYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgdmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2Ugc3VwcG9ydHMgdmlydHVhbGl6ZXIgYW5kIHRoZSBlZmZlY3QgaGFzIGJlZW4gdGVtcG9yYXJpbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkIHByZXZpb3VzbHkgdGhlbiByZS1lbmFibGUgaXQKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fVklSVFVBTElaRVIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9lbmFibGUocENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9UUlVFOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgdmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRldmljZSBzdXBwb3J0cyB2aXJ0dWFsaXplciBhbmQgdGhlIGVmZmVjdCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBkaXNhYmxlZAotICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgcmUtZW5hYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gZWxzZSB2aXJ0dWFsaXphdGlvbiBtb2RlIGlzIGZvcmNlZCB0byBhIGNlcnRhaW4gZGV2aWNlLCBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX0RFVklDRSBlbmQiKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAppbmRleCAzMzBiYjMyLi40MjBmOTczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApAQCAtNzMsNiArNzMsOCBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJhc3NUZW1wRGlzYWJsZWQ7ICAgICAgICAvKiBGbGFnIGZvciBCYXNzIHRvIGJlIHJlLWVuYWJsZWQgKi8KICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXJ0dWFsaXplckVuYWJsZWQ7ICAgICAgLyogRmxhZyBmb3IgVmlydHVhbGl6ZXIgKi8KICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZDsgLyogRmxhZyBmb3IgZWZmZWN0IHRvIGJlIHJlLWVuYWJsZWQgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICAgIG5PdXRwdXREZXZpY2U7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSBmb3IgdGhlIGVmZmVjdCAqLworICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgICAgICAgICAgblZpcnR1YWxpemVyRm9yY2VkRGV2aWNlOyAvKiBGb3JjZWQgZGV2aWNlIHZpcnR1YWxpemF0aW9uIG1vZGUqLwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyRWZmZWN0c0VuYWJsZWQ7ICAgICAvKiBFZmZlY3RzIGluIHRoaXMgc2Vzc2lvbiAqLwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyRWZmZWN0c0NhbGxlZDsgICAgICAvKiBFZmZlY3RzIGNhbGxlZCBzbyBmYXIgKi8KICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vm9sdW1lOyAgICAgICAgICAgICAgLyogTm8gc21vb3RoaW5nIG9uIGZpcnN0IFZvbCBjaGFuZ2UgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCmluZGV4IGM5OGQ2MmIuLmE0OGE0ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtMTksMTEgKzE5LDEzIEBACiAjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YgYXJyYXkgLyBzaXplb2YgYXJyYXlbMF0pCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxuZXc+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bmV3PgorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgIkVmZmVjdFJldmVyYi5oIgogLy8gZnJvbSBSZXZlcmIvbGliCiAjaW5jbHVkZSAiTFZSRVYuaCIKQEAgLTE4MSw3ICsxODMsNyBAQAogaW50ICBSZXZlcmJfc2V0UGFyYW1ldGVyICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOwogaW50ICBSZXZlcmJfZ2V0UGFyYW1ldGVyICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwogaW50IFJldmVyYl9Mb2FkUHJlc2V0ICAgICAgIChSZXZlcmJDb250ZXh0ICAgKnBDb250ZXh0KTsKIApAQCAtMjY5LDcgKzI3MSw3IEBACiAgICAgcENvbnRleHQtPkluRnJhbWVzMzIgID0gKExWTV9JTlQzMiAqKW1hbGxvYyhMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMik7CiAgICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMik7CiAKLSAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgJXAsIHNpemUgJWQiLCBwQ29udGV4dCwgc2l6ZW9mKFJldmVyYkNvbnRleHQpKTsKKyAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgJXAsIHNpemUgJXp1IiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZFxuIik7CiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KQEAgLTU3MCwxNSArNTcyLDE1IEBACiAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBTVEFSVCBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdGZyZWUoKSAtIFNUQVJUIGZyZWVpbmcgJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogCiAgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBFTkQgICBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdGZyZWUoKSAtIEVORCAgIGZyZWVpbmcgJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogZnJlZSgpIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgJWxkIGJ5dGVzICIKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBmcmVlKCkgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlIiBQUkl1MzIgIiBieXRlcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQpAQCAtNzcxLDExICs3NzMsMTIgQEAKICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIGZvciByZWdpb24gJXVcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOwogICAgICAgICAgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7CiAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZSAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03ODcsMTEgKzc5MCwxMSBAQAogICAgIGlmKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKXsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IC0gTm90IGZyZWVpbmdcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IC0gTm90IGZyZWVpbmdcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CkBAIC0xNTM0LDcgKzE1MzcsNyBAQAogCiBpbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKXsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CkBAIC0xOTcxLDcgKzE5NzQsNyBAQAogCiAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpSZXZlcmJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCAgKikmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLm1rCmluZGV4IDllOGNiODMuLmVhM2M1OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLm1rCkBAIC0yNCwxMiArMjQsNyBAQAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cKIAotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotTE9DQUxfTERMSUJTICs9IC1sZGwKLWVsc2UKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCi0KIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcAppbmRleCBiZTRmYTdlLi42ZGQ0NDM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgdm9pZCAoKiBlbmFibGUpKHByZXByb2NfZWZmZWN0X3QgKmZ4KTsKICAgICB2b2lkICgqIGRpc2FibGUpKHByZXByb2NfZWZmZWN0X3QgKmZ4KTsKICAgICBpbnQgKCogc2V0X3BhcmFtZXRlcikocHJlcHJvY19lZmZlY3RfdCAqZngsIHZvaWQgKnBhcmFtLCB2b2lkICp2YWx1ZSk7Ci0gICAgaW50ICgqIGdldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgc2l6ZV90ICpzaXplLCB2b2lkICp2YWx1ZSk7CisgICAgaW50ICgqIGdldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgdWludDMyX3QgKnNpemUsIHZvaWQgKnZhbHVlKTsKICAgICBpbnQgKCogc2V0X2RldmljZSkocHJlcHJvY19lZmZlY3RfdCAqZngsIHVpbnQzMl90IGRldmljZSk7CiB9OwogCkBAIC0yOTEsNyArMjkxLDcgQEAKIAogaW50IEFnY0dldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFZhbHVlKQogewogICAgIGludCBzdGF0dXMgPSAwOwpAQCAtNDUyLDkgKzQ1Miw5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBBZWNHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAgICAgKmVmZmVjdCwKK2ludCBBZWNHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAgKmVmZmVjdCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKQogewogICAgIGludCBzdGF0dXMgPSAwOwpAQCAtODgxLDggKzg4MSw4IEBACiBpbnQgU2Vzc2lvbl9TZXRDb25maWcocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sIGVmZmVjdF9jb25maWdfdCAqY29uZmlnKQogewogICAgIHVpbnQzMl90IHNyOwotICAgIHVpbnQzMl90IGluQ25sID0gcG9wY291bnQoY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7Ci0gICAgdWludDMyX3Qgb3V0Q25sID0gcG9wY291bnQoY29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOworICAgIHVpbnQzMl90IGluQ25sID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworICAgIHVpbnQzMl90IG91dENubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAKICAgICBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gY29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlIHx8CiAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCB8fApAQCAtMTAzNyw3ICsxMDM3LDcgQEAKICAgICAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLSAgICB1aW50MzJfdCBpbkNubCA9IHBvcGNvdW50KGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworICAgIHVpbnQzMl90IGluQ25sID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogICAgIGludCBzdGF0dXMgPSBzZXNzaW9uLT5hcG0tPnNldF9udW1fcmV2ZXJzZV9jaGFubmVscyhpbkNubCk7CiAgICAgaWYgKHN0YXR1cyA8IDApIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjM1LDggKzEyMzUsOCBAQAogICAgICAgICAgICAgaWYgKHNlc3Npb24tPmZyYW1lc0luIDwgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgewogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2l6ZV90IGZySW4gPSBzZXNzaW9uLT5mcmFtZXNJbjsKLSAgICAgICAgICAgIHNpemVfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc0luOworICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZyT3V0ID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50KHNlc3Npb24tPmluUmVzYW1wbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLApAQCAtMTI5Miw4ICsxMjkyLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzZXNzaW9uLT5vdXRSZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc2l6ZV90IGZySW4gPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OwotICAgICAgICAgICAgc2l6ZV90IGZyT3V0ID0gc2Vzc2lvbi0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmckluID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5vdXRSZXNhbXBsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLApAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKIAogICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gZWZmZWN0LT5vcHMtPmdldF9wYXJhbWV0ZXIoZWZmZWN0LCBwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CiAgICAgICAgICAgICB9CkBAIC0xNzU3LDggKzE3NTcsOCBAQAogICAgICAgICAgICAgaWYgKHNlc3Npb24tPmZyYW1lc1JldiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzUmV2OwotICAgICAgICAgICAgc2l6ZV90IGZyT3V0ID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzUmV2OworICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZyT3V0ID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50KHNlc3Npb24tPnJldlJlc2FtcGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcAppbmRleCA4ZDAwMjA2Li4zY2IxM2YyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogaW50IEVxdWFsaXplcl9pbml0KEVxdWFsaXplckNvbnRleHQgKnBDb250ZXh0KTsKIGludCBFcXVhbGl6ZXJfc2V0Q29uZmlnKEVxdWFsaXplckNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOwotaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHNpemVfdCAqcFZhbHVlU2l6ZSwgdm9pZCAqcFZhbHVlKTsKK2ludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciwgaW50MzJfdCAqcFBhcmFtLCB1aW50MzJfdCAqcFZhbHVlU2l6ZSwgdm9pZCAqcFZhbHVlKTsKIGludCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciwgaW50MzJfdCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOwogCiAKQEAgLTM2MCw3ICszNjAsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgc2l6ZV90ICpwVmFsdWVTaXplLCB2b2lkICpwVmFsdWUpCitpbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgdWludDMyX3QgKnBWYWx1ZVNpemUsIHZvaWQgKnBWYWx1ZSkKIHsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbSsrOwpAQCAtNjYyLDggKzY2Miw4IEBACiAgICAgICAgIEVxdWFsaXplcl9zZXRDb25maWcocENvbnRleHQsICZwQ29udGV4dC0+Y29uZmlnKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTTogewotICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKLSAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgKGludCkgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKSB7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKKyAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOwpAQCAtNjgyLDcgKzY4Miw3IEBACiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTogewogICAgICAgICBBTE9HVigiRXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gY21kU2l6ZSAlZCBwQ21kRGF0YSAlcCwgKnJlcGx5U2l6ZSAlZCwgcFJlcGx5RGF0YSAlcCIsCiAgICAgICAgICAgICAgY21kU2l6ZSwgcENtZERhdGEsICpyZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAogICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKaW5kZXggYzM3ZjM5Mi4uZjA1NmQxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCkBAIC03NTAsNyArNzUwLDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCBzaXplX3QgKnBTaXplLAoraW50IFJldmVyYl9nZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsCiAgICAgICAgIHZvaWQgKnBWYWx1ZSkgewogICAgIGludDMyX3QgKnBWYWx1ZTMyOwogICAgIGludDE2X3QgKnBWYWx1ZTE2OwpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgaW50MzJfdCBpOwogICAgIGludDMyX3QgdGVtcDsKICAgICBpbnQzMl90IHRlbXAyOwotICAgIHNpemVfdCBzaXplOworICAgIHVpbnQzMl90IHNpemU7CiAKICAgICBpZiAocFJldmVyYi0+bV9QcmVzZXQpIHsKICAgICAgICAgaWYgKHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQgfHwgKnBTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CkBAIC0xMDMzLDcgKzEwMzMsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi1pbnQgUmV2ZXJiX3NldFBhcmFtZXRlcihyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHNpemVfdCBzaXplLAoraW50IFJldmVyYl9zZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLAogICAgICAgICB2b2lkICpwVmFsdWUpIHsKICAgICBpbnQzMl90IHZhbHVlMzI7CiAgICAgaW50MTZfdCB2YWx1ZTE2OwpAQCAtMTA0NCw3ICsxMDQ0LDcgQEAKICAgICByZXZlcmJfcHJlc2V0X3QgKnBQcmVzZXQ7CiAgICAgaW50IG1heFNhbXBsZXM7CiAgICAgaW50MzJfdCBhdmVyYWdlRGVsYXk7Ci0gICAgc2l6ZV90IHBhcmFtU2l6ZTsKKyAgICB1aW50MzJfdCBwYXJhbVNpemU7CiAKICAgICBBTE9HVigiUmV2ZXJiX3NldFBhcmFtZXRlciwgY29udGV4dCAlcCwgcGFyYW0gJWQsIHZhbHVlMTYgJWQsIHZhbHVlMzIgJWQiLAogICAgICAgICAgICAgcFJldmVyYiwgcGFyYW0sICooaW50MTZfdCAqKXBWYWx1ZSwgKihpbnQzMl90ICopcFZhbHVlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmggYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCmluZGV4IGU1MjQ4ZmUuLjc1NmM1ZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaApAQCAtMzMwLDggKzMzMCw4IEBACiB2b2lkIFJldmVyYl9nZXRDb25maWcocmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlLCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOwogdm9pZCBSZXZlcmJfUmVzZXQocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBib29sIGluaXQpOwogCi1pbnQgUmV2ZXJiX3NldFBhcmFtZXRlciAocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcFZhbHVlKTsKLWludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKK2ludCBSZXZlcmJfc2V0UGFyYW1ldGVyIChyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90IHNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBSZXZlcmJVcGRhdGVYZmFkZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCBkZDJkMzA2Li5jOTJjNTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtMTcsNyArMTcsNiBAQAogTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IDRiMzE4YzAuLjBjMzEwYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTE2LDggKzE2LDkgQEAKIAogI2RlZmluZSBMT0dfVEFHICJFZmZlY3RWaXN1YWxpemVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxuZXc+CkBAIC0yMDYsNyArMjA3LDggQEAKICAgICBwQ29udGV4dC0+bVNjYWxpbmdNb2RlID0gVklTVUFMSVpFUl9TQ0FMSU5HX01PREVfTk9STUFMSVpFRDsKIAogICAgIC8vIG1lYXN1cmVtZW50IGluaXRpYWxpemF0aW9uCi0gICAgcENvbnRleHQtPm1DaGFubmVsQ291bnQgPSBwb3Bjb3VudChwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CisgICAgcENvbnRleHQtPm1DaGFubmVsQ291bnQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSA9IE1FQVNVUkVNRU5UX01PREVfTk9ORTsKICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50V2luZG93U2l6ZUluQnVmZmVycyA9IE1FQVNVUkVNRU5UX1dJTkRPV19NQVhfU0laRV9JTl9CVUZGRVJTOwogICAgIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPSAwOwpAQCAtMjI2LDggKzIyOCw4IEBACiAvLwogCiBpbnQgVmlzdWFsaXplckxpYl9DcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKnNlc3Npb25JZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLyppb0lkKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKSB7CiAgICAgaW50IHJldDsKICAgICBpbnQgaTsKQEAgLTQxOCw3ICs0MjAsNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLS8vICAgIEFMT0dWKCJWaXN1YWxpemVyX2NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKy8vICAgIEFMT0dWKCJWaXN1YWxpemVyX2NvbW1hbmQgY29tbWFuZCAlIiBQUkl1MzIgIiBjbWRTaXplICUiIFBSSXUzMiwgY21kQ29kZSwgY21kU2l6ZSk7CiAKICAgICBzd2l0Y2ggKGNtZENvZGUpIHsKICAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKQEAgLTQ4NCwxOSArNDg2LDE5IEBACiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoICgqKHVpbnQzMl90ICopcC0+ZGF0YSkgewogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fQ0FQVFVSRV9TSVpFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtQ2FwdHVyZVNpemUgPSAlZCIsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAgICAgQUxPR1YoImdldCBtQ2FwdHVyZVNpemUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOwogICAgICAgICAgICAgKigodWludDMyX3QgKilwLT5kYXRhICsgMSkgPSBwQ29udGV4dC0+bUNhcHR1cmVTaXplOwogICAgICAgICAgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSArPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9TQ0FMSU5HX01PREU6Ci0gICAgICAgICAgICBBTE9HVigiZ2V0IG1TY2FsaW5nTW9kZSA9ICVkIiwgcENvbnRleHQtPm1TY2FsaW5nTW9kZSk7CisgICAgICAgICAgICBBTE9HVigiZ2V0IG1TY2FsaW5nTW9kZSA9ICUiIFBSSXUzMiwgcENvbnRleHQtPm1TY2FsaW5nTW9kZSk7CiAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXAtPmRhdGEgKyAxKSA9IHBDb250ZXh0LT5tU2NhbGluZ01vZGU7CiAgICAgICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICAqcmVwbHlTaXplICs9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX01FQVNVUkVNRU5UX01PREU6Ci0gICAgICAgICAgICBBTE9HVigiZ2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlZCIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXQgbU1lYXN1cmVtZW50TW9kZSA9ICUiIFBSSXUzMiwgcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGUpOwogICAgICAgICAgICAgKigodWludDMyX3QgKilwLT5kYXRhICsgMSkgPSBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZTsKICAgICAgICAgICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgICpyZXBseVNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKQEAgLTUyMCwxOSArNTIyLDE5IEBACiAgICAgICAgIHN3aXRjaCAoKih1aW50MzJfdCAqKXAtPmRhdGEpIHsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX0NBUFRVUkVfU0laRToKICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUgPSAqKCh1aW50MzJfdCAqKXAtPmRhdGEgKyAxKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbUNhcHR1cmVTaXplID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fU0NBTElOR19NT0RFOgogICAgICAgICAgICAgcENvbnRleHQtPm1TY2FsaW5nTW9kZSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtU2NhbGluZ01vZGUgPSAlZCIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOworICAgICAgICAgICAgQUxPR1YoInNldCBtU2NhbGluZ01vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9MQVRFTkNZOgogICAgICAgICAgICAgcENvbnRleHQtPm1MYXRlbmN5ID0gKigodWludDMyX3QgKilwLT5kYXRhICsgMSk7Ci0gICAgICAgICAgICBBTE9HVigic2V0IG1MYXRlbmN5ID0gJWQiLCBwQ29udGV4dC0+bUxhdGVuY3kpOworICAgICAgICAgICAgQUxPR1YoInNldCBtTGF0ZW5jeSA9ICUiIFBSSXUzMiwgcENvbnRleHQtPm1MYXRlbmN5KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fTUVBU1VSRU1FTlRfTU9ERToKICAgICAgICAgICAgIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlID0gKigodWludDMyX3QgKilwLT5kYXRhICsgMSk7Ci0gICAgICAgICAgICBBTE9HVigic2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlZCIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbU1lYXN1cmVtZW50TW9kZSA9ICUiIFBSSXUzMiwgcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAqKGludDMyX3QgKilwUmVwbHlEYXRhID0gLUVJTlZBTDsKQEAgLTU1Miw0OSArNTU0LDQ5IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSA9PSBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRSkgewotICAgICAgICAgICAgaW50MzJfdCBsYXRlbmN5TXMgPSBwQ29udGV4dC0+bUxhdGVuY3k7CiAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkZWx0YU1zID0gVmlzdWFsaXplcl9nZXREZWx0YVRpbWVNc0Zyb21VcGRhdGVkVGltZShwQ29udGV4dCk7Ci0gICAgICAgICAgICBsYXRlbmN5TXMgLT0gZGVsdGFNczsKLSAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbGF0ZW5jeU1zID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGRlbHRhU21wbCA9IHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAqIGxhdGVuY3lNcyAvIDEwMDA7Ci0KLSAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gcENvbnRleHQtPm1DYXB0dXJlU2l6ZSAtIGRlbHRhU21wbDsKLSAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVNpemUgPSBwQ29udGV4dC0+bUNhcHR1cmVTaXplOwotICAgICAgICAgICAgaWYgKGNhcHR1cmVQb2ludCA8IDApIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHNpemUgPSAtY2FwdHVyZVBvaW50OwotICAgICAgICAgICAgICAgIGlmIChzaXplID4gY2FwdHVyZVNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNhcHR1cmVTaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlQnVmICsgQ0FQVFVSRV9CVUZfU0laRSArIGNhcHR1cmVQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9IChjaGFyICopcFJlcGx5RGF0YSArIHNpemU7Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVNpemUgLT0gc2l6ZTsKLSAgICAgICAgICAgICAgICBjYXB0dXJlUG9pbnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCi0gICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlQnVmICsgY2FwdHVyZVBvaW50LAotICAgICAgICAgICAgICAgICAgIGNhcHR1cmVTaXplKTsKLQogCiAgICAgICAgICAgICAvLyBpZiBhdWRpbyBmcmFtZXdvcmsgaGFzIHN0b3BwZWQgcGxheWluZyBhdWRpbyBhbHRob3VnaCB0aGUgZWZmZWN0IGlzIHN0aWxsCiAgICAgICAgICAgICAvLyBhY3RpdmUgd2UgbXVzdCBjbGVhciB0aGUgY2FwdHVyZSBidWZmZXIgdG8gcmV0dXJuIHNpbGVuY2UKICAgICAgICAgICAgIGlmICgocENvbnRleHQtPm1MYXN0Q2FwdHVyZUlkeCA9PSBwQ29udGV4dC0+bUNhcHR1cmVJZHgpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQ29udGV4dC0+bUJ1ZmZlclVwZGF0ZVRpbWUudHZfc2VjICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhTXMgPiBNQVhfU1RBTExfVElNRV9NUykgeworICAgICAgICAgICAgICAgICAgICAocENvbnRleHQtPm1CdWZmZXJVcGRhdGVUaW1lLnR2X3NlYyAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGVsdGFNcyA+IE1BWF9TVEFMTF9USU1FX01TKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2FwdHVyZSBnb2luZyB0byBpZGxlIik7CiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQnVmZmVyVXBkYXRlVGltZS50dl9zZWMgPSAwOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQocFJlcGx5RGF0YSwgMHg4MCwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChwUmVwbHlEYXRhLCAweDgwLCBjYXB0dXJlU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zID0gcENvbnRleHQtPm1MYXRlbmN5OworICAgICAgICAgICAgICAgIGxhdGVuY3lNcyAtPSBkZWx0YU1zOworICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNcyA9IDA7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGRlbHRhU21wbCA9CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAqIGxhdGVuY3lNcyAvIDEwMDA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXB0dXJlUG9pbnQgPSBwQ29udGV4dC0+bUNhcHR1cmVJZHggLSBjYXB0dXJlU2l6ZSAtIGRlbHRhU21wbDsKKworICAgICAgICAgICAgICAgIGlmIChjYXB0dXJlUG9pbnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSAtY2FwdHVyZVBvaW50OworICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IGNhcHR1cmVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gY2FwdHVyZVNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVCdWYgKyBDQVBUVVJFX0JVRl9TSVpFICsgY2FwdHVyZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPSAoY2hhciAqKXBSZXBseURhdGEgKyBzaXplOworICAgICAgICAgICAgICAgICAgICBjYXB0dXJlU2l6ZSAtPSBzaXplOworICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUG9pbnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlQnVmICsgY2FwdHVyZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlU2l6ZSk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHBDb250ZXh0LT5tTGFzdENhcHR1cmVJZHggPSBwQ29udGV4dC0+bUNhcHR1cmVJZHg7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW1zZXQocFJlcGx5RGF0YSwgMHg4MCwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQocFJlcGx5RGF0YSwgMHg4MCwgY2FwdHVyZVNpemUpOwogICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfSBicmVhazsKIAogICAgIGNhc2UgVklTVUFMSVpFUl9DTURfTUVBU1VSRTogewogICAgICAgICB1aW50MTZfdCBwZWFrVTE2ID0gMDsKQEAgLTYwNCw3ICs2MDYsNyBAQAogICAgICAgICAvLyBtZWFzdXJlbWVudHMgYXJlbid0IHJlbGV2YW50IGFueW1vcmUgYW5kIHNob3VsZG4ndCBiaWFzIHRoZSBuZXcgb25lKQogICAgICAgICBjb25zdCBpbnQzMl90IGRlbGF5TXMgPSBWaXN1YWxpemVyX2dldERlbHRhVGltZU1zRnJvbVVwZGF0ZWRUaW1lKHBDb250ZXh0KTsKICAgICAgICAgaWYgKGRlbGF5TXMgPiBESVNDQVJEX01FQVNVUkVNRU5UU19USU1FX01TKSB7Ci0gICAgICAgICAgICBBTE9HVigiRGlzY2FyZGluZyBtZWFzdXJlbWVudHMsIGxhc3QgbWVhc3VyZW1lbnQgaXMgJWRtcyBvbGQiLCBkZWxheU1zKTsKKyAgICAgICAgICAgIEFMT0dWKCJEaXNjYXJkaW5nIG1lYXN1cmVtZW50cywgbGFzdCBtZWFzdXJlbWVudCBpcyAlIiBQUklkMzIgIm1zIG9sZCIsIGRlbGF5TXMpOwogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpPTAgOyBpPHBDb250ZXh0LT5tTWVhc3VyZW1lbnRXaW5kb3dTaXplSW5CdWZmZXJzIDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1QYXN0TWVhc3VyZW1lbnRzW2ldLm1Jc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1QYXN0TWVhc3VyZW1lbnRzW2ldLm1QZWFrVTE2ID0gMDsKQEAgLTYzOCwxNCArNjQwLDE0IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwSW50UmVwbHlEYXRhW01FQVNVUkVNRU5UX0lEWF9QRUFLXSA9IChpbnQzMl90KSAoMjAwMCAqIGxvZzEwKHBlYWtVMTYgLyAzMjc2Ny4wZikpOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJWSVNVQUxJWkVSX0NNRF9NRUFTVVJFIHBlYWs9JWQgKCVkbUIpLCBybXM9JS4xZiAoJWRtQikiLAorICAgICAgICBBTE9HVigiVklTVUFMSVpFUl9DTURfTUVBU1VSRSBwZWFrPSUiIFBSSXUxNiAiICglIiBQUklkMzIgIm1CKSwgcm1zPSUuMWYgKCUiIFBSSWQzMiAibUIpIiwKICAgICAgICAgICAgICAgICBwZWFrVTE2LCBwSW50UmVwbHlEYXRhW01FQVNVUkVNRU5UX0lEWF9QRUFLXSwKICAgICAgICAgICAgICAgICBybXMsIHBJbnRSZXBseURhdGFbTUVBU1VSRU1FTlRfSURYX1JNU10pOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIlZpc3VhbGl6ZXJfY29tbWFuZCBpbnZhbGlkIGNvbW1hbmQgJWQiLGNtZENvZGUpOworICAgICAgICBBTE9HVygiVmlzdWFsaXplcl9jb21tYW5kIGludmFsaWQgY29tbWFuZCAlIiBQUkl1MzIsIGNtZENvZGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCmluZGV4IDU2ZTc3ODcuLmUwMTIxMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawpAQCAtMjUsNiArMjUsOSBAQAogICAgIEF1ZGlvUmVjb3JkLmNwcCBcCiAgICAgQXVkaW9TeXN0ZW0uY3BwIFwKICAgICBtZWRpYXBsYXllci5jcHAgXAorICAgIElNZWRpYUNvZGVjTGlzdC5jcHAgXAorICAgIElNZWRpYUhUVFBDb25uZWN0aW9uLmNwcCBcCisgICAgSU1lZGlhSFRUUFNlcnZpY2UuY3BwIFwKICAgICBJTWVkaWFMb2dTZXJ2aWNlLmNwcCBcCiAgICAgSU1lZGlhUGxheWVyU2VydmljZS5jcHAgXAogICAgIElNZWRpYVBsYXllckNsaWVudC5jcHAgXApAQCAtMzQsNiArMzcsNyBAQAogICAgIElSZW1vdGVEaXNwbGF5LmNwcCBcCiAgICAgSVJlbW90ZURpc3BsYXlDbGllbnQuY3BwIFwKICAgICBJU3RyZWFtU291cmNlLmNwcCBcCisgICAgTWVkaWFDb2RlY0luZm8uY3BwIFwKICAgICBNZXRhZGF0YS5jcHAgXAogICAgIG1lZGlhcmVjb3JkZXIuY3BwIFwKICAgICBJTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgXApAQCAtNDIsOSArNDYsMTAgQEAKICAgICBKZXRQbGF5ZXIuY3BwIFwKICAgICBJT01YLmNwcCBcCiAgICAgSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgXAorICAgIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIFwKICAgICBNZWRpYVNjYW5uZXIuY3BwIFwKICAgICBNZWRpYVNjYW5uZXJDbGllbnQuY3BwIFwKLSAgICBhdXRvZGV0ZWN0LmNwcCBcCisgICAgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAgXAogICAgIElNZWRpYURlYXRoTm90aWZpZXIuY3BwIFwKICAgICBNZWRpYVByb2ZpbGVzLmNwcCBcCiAgICAgSUVmZmVjdC5jcHAgXApAQCAtNTgsMjYgKzYzLDM2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyArPSAuLi9saWJuYmFpby9yb3VuZHVwLmMKIAotIyBmb3IgPGN1dGlscy9hdG9taWMtaW5saW5lLmg+Ci1MT0NBTF9DRkxBR1MgKz0gLURBTkRST0lEX1NNUD0kKGlmICQoZmluZHN0cmluZyB0cnVlLCQoVEFSR0VUX0NQVV9TTVApKSwxLDApCi1MT0NBTF9TUkNfRklMRVMgKz0gU2luZ2xlU3RhdGVRdWV1ZS5jcHAKLUxPQ0FMX0NGTEFHUyArPSAtRFNJTkdMRV9TVEFURV9RVUVVRV9JTlNUQU5USUFUSU9OUz0nIlNpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAiJwotIyBDb25zaWRlciBhIHNlcGFyYXRlIGEgbGlicmFyeSBmb3IgU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLgotCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJ1aSBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzb25pdm94IGxpYmljdXVjIGxpYmV4cGF0IFwKKwlsaWJ1aSBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzb25pdm94IGxpYmljdXVjIGxpYmljdWkxOG4gbGliZXhwYXQgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJndWkgbGliZGwgbGliYXVkaW91dGlscworICAgICAgICBsaWJndWkgbGliZGwgbGliYXVkaW91dGlscyBsaWJuYmFpbwogCi1MT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSWSA6PSBsaWJtZWRpYV9oZWxwZXIKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliaW5zdGFudHNzcQorCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm1lZGlhX2hlbHBlcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYQogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgZXh0ZXJuYWwvaWN1NGMvY29tbW9uIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhLyBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiBcCisgICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvaTE4biBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgZm9yIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPgorTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9JChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFRBUkdFVF9DUFVfU01QKSksMSwwKQorTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCitMT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKKworTE9DQUxfTU9EVUxFIDo9IGxpYmluc3RhbnRzc3EKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAppbmRleCA4ZGZmZmIzLi4wZDVkN2U0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC0xNDUsMTUgKzE0NSwxOSBAQAogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CiAKLSAgICBtSUVmZmVjdCA9IGlFZmZlY3Q7CiAgICAgbUNibGtNZW1vcnkgPSBjYmxrOwogICAgIG1DYmxrID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X3BhcmFtX2NibGtfdCo+KGNibGstPnBvaW50ZXIoKSk7CiAgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CiAgICAgbUNibGstPmJ1ZmZlciA9ICh1aW50OF90ICopbUNibGsgKyBidWZPZmZzZXQ7CiAKICAgICBpRWZmZWN0LT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7Ci0gICAgQUxPR1YoInNldCgpICVwIE9LIGVmZmVjdDogJXMgaWQ6ICVkIHN0YXR1cyAlZCBlbmFibGVkICVkIiwgdGhpcywgbURlc2NyaXB0b3IubmFtZSwgbUlkLAotICAgICAgICAgICAgbVN0YXR1cywgbUVuYWJsZWQpOworICAgIG1DbGllbnRQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgQUxPR1YoInNldCgpICVwIE9LIGVmZmVjdDogJXMgaWQ6ICVkIHN0YXR1cyAlZCBlbmFibGVkICVkIHBpZCAlZCIsIHRoaXMsIG1EZXNjcmlwdG9yLm5hbWUsIG1JZCwKKyAgICAgICAgICAgIG1TdGF0dXMsIG1FbmFibGVkLCBtQ2xpZW50UGlkKTsKKworICAgIGlmIChtU2Vzc2lvbklkID4gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CisgICAgfQogCiAgICAgcmV0dXJuIG1TdGF0dXM7CiB9CkBAIC0xNjQsNiArMTY4LDkgQEAKICAgICBBTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwogCiAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IgfHwgbVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICBpZiAobVNlc3Npb25JZCA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUlFZmZlY3QgIT0gTlVMTCkgewogICAgICAgICAgICAgbUlFZmZlY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIG1JRWZmZWN0LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKQEAgLTM4MCw5ICszODcsOSBAQAogfQogCiB2b2lkIEF1ZGlvRWZmZWN0Ojpjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlcGx5RGF0YSkKIHsKICAgICBpZiAoY21kRGF0YSA9PSBOVUxMIHx8IHJlcGx5RGF0YSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKaW5kZXggY2NiYzVhMy4uOWU3YmE4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcApAQCAtMTgsNyArMTgsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1JlY29yZCIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNDEsMzcgKzQzLDMwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gZGVmYXVsdCB0byAwIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAqZnJhbWVDb3VudCA9IDA7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgc2l6ZV90IHNpemU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCAmc2l6ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZTsgc3RhdHVzICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbjogc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAlI3giLAorICAgIC8vIFdlIGRvdWJsZSB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgZm9yIHBpbmcgcG9uZyB1c2Ugb2YgcmVjb3JkIGJ1ZmZlci4KKyAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQorICAgIGlmICgoKmZyYW1lQ291bnQgPSAoc2l6ZSAqIDIpIC8gKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSAqCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAogICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gV2UgZG91YmxlIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgotICAgIHNpemUgPDw9IDE7Ci0KLSAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKLSAgICBzaXplIC89IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLQotICAgICpmcmFtZUNvdW50ID0gc2l6ZTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZCgwKSwKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKQogewogfQpAQCAtODEsMjAgKzc2LDIwIEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApLAorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKICAgICAgIG1Qcm94eShOVUxMKQogewogICAgIG1TdGF0dXMgPSBzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGNiZiwgdXNlciwKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzKTsKIH0KIAogQXVkaW9SZWNvcmQ6On5BdWRpb1JlY29yZCgpCkBAIC0xMTAsMTIgKzEwNSwxMiBAQAogICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvUmVjb3JkLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKLSAgICAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOwotICAgICAgICB9CisgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CisgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOworICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOworICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCAtMSk7CiAgICAgfQogfQogCkBAIC0xMjQsMTUgKzExOSwyMCBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgZnJhbWVDb3VudEludCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogeworICAgIEFMT0dWKCJzZXQoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncyk7CisKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHRocmVhZENhbkNhbGxKYXZhKSB7CkBAIC0xNTYsMjMgKzE1NiwxNSBAQAogICAgIH0KICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAKLSAgICAvLyBGSVhNRSAiaW50IiBoZXJlIGlzIGxlZ2FjeSBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSBzaXplX3QgbGF0ZXIKLSAgICBpZiAoZnJhbWVDb3VudEludCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgY291bnQgJWQiLCBmcmFtZUNvdW50SW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBmcmFtZUNvdW50SW50OwotCi0gICAgQUxPR1YoInNldCgpOiBzYW1wbGVSYXRlICV1LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXUiLCBzYW1wbGVSYXRlLCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIGZyYW1lQ291bnQpOwotCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgLy8gaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGZpcnN0LgogICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewogICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CiAgICAgfQpAQCAtMTkxLDEyICsxODMsMTIgQEAKIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlZCIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBUZW1wb3JhcnkgcmVzdHJpY3Rpb246IEF1ZGlvRmxpbmdlciBjdXJyZW50bHkgc3VwcG9ydHMgMTYtYml0IFBDTSBvbmx5CiAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3Qgc3VwcG9ydGVkIiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKQEAgLTIwNiw2MSArMTk4LDUwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAotICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCBlbHNlIHNpemVvZih1aW50OF90KQotICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBmcmFtZWNvdW50Ci0gICAgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSAwOwotICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvUmVjb3JkOjpnZXRNaW5GcmFtZUNvdW50KCZtaW5GcmFtZUNvdW50LAotICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0TWluRnJhbWVDb3VudCgpIGZhaWxlZDsgc3RhdHVzICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OF90KTsKICAgICB9Ci0gICAgQUxPR1YoIkF1ZGlvUmVjb3JkOjpzZXQoKSBtaW5GcmFtZUNvdW50ID0gJWQiLCBtaW5GcmFtZUNvdW50KTsKIAotICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7Ci0gICAgfSBlbHNlIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgewotICAgICAgICBBTE9HRSgiZnJhbWVDb3VudCAldSA8IG1pbkZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIC8vIG1GcmFtZUNvdW50IGlzIGluaXRpYWxpemVkIGluIG9wZW5SZWNvcmRfbAorICAgIG1SZXFGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKIAogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSBub3RpZmljYXRpb25GcmFtZXM7Ci0gICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7CisgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBvcGVuUmVjb3JkX2wKIAotICAgIGlmIChzZXNzaW9uSWQgPT0gMCApIHsKLSAgICAgICAgbVNlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpOworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgeworICAgICAgICBtU2Vzc2lvbklkID0gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KICAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKIAogICAgIG1GbGFncyA9IGZsYWdzOwotCi0gICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKLSAgICBzdGF0dXMgPSBvcGVuUmVjb3JkX2woMCAvKmVwb2NoKi8pOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9CisgICAgbUNiZiA9IGNiZjsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMsIHRocmVhZENhbkNhbGxKYXZhKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5ydW4oIkF1ZGlvUmVjb3JkIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgfQogCisgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuUmVjb3JkX2woMCAvKmVwb2NoKi8pOworCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1JlY29yZC5oCisgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKICAgICBtU3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICAvLyBVcGRhdGUgYnVmZmVyIHNpemUgaW4gY2FzZSBpdCBoYXMgYmVlbiBsaW1pdGVkIGJ5IEF1ZGlvRmxpbmdlciBkdXJpbmcgdHJhY2sgY3JlYXRpb24KLSAgICBtRnJhbWVDb3VudCA9IG1DYmxrLT5mcmFtZUNvdW50XzsKLQogICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICBtQ2JmID0gY2JmOwotICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIC8vIFRPRE86IGFkZCBhdWRpbyBoYXJkd2FyZSBpbnB1dCBsYXRlbmN5IGhlcmUKICAgICBtTGF0ZW5jeSA9ICgxMDAwKm1GcmFtZUNvdW50KSAvIHNhbXBsZVJhdGU7CkBAIC0yNjgsNyArMjQ5LDcgQEAKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogICAgIG1OZXdQb3NpdGlvbiA9IDA7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IDA7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xKTsKICAgICBtU2VxdWVuY2UgPSAxOwogICAgIG1PYnNlcnZlZFNlcXVlbmNlID0gbVNlcXVlbmNlOwogICAgIG1Jbk92ZXJydW4gPSBmYWxzZTsKQEAgLTI4OSw2ICsyNzAsOSBAQAogCiAgICAgLy8gcmVzZXQgY3VycmVudCBwb3NpdGlvbiBhcyBzZWVuIGJ5IGNsaWVudCB0byAwCiAgICAgbVByb3h5LT5zZXRFcG9jaChtUHJveHktPmdldEVwb2NoKCkgLSBtUHJveHktPmdldFBvc2l0aW9uKCkpOworICAgIC8vIGZvcmNlIHJlZnJlc2ggb2YgcmVtYWluaW5nIGZyYW1lcyBieSBwcm9jZXNzQXVkaW9CdWZmZXIoKSBhcyBsYXN0CisgICAgLy8gcmVhZCBiZWZvcmUgc3RvcCBjb3VsZCBiZSBwYXJ0aWFsLgorICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKIAogICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPm1GbGFncyk7CkBAIC0zNTIsNiArMzM2LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldE1hcmtlclBvc2l0aW9uKHVpbnQzMl90IG1hcmtlcikKIHsKKyAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgbWFya2VyIHBvc2l0aW9uIGlzIHRvIGdldCBhIGNhbGxiYWNrCiAgICAgaWYgKG1DYmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzc3LDYgKzM2Miw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CisgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIHBvc2l0aW9uIHVwZGF0ZSBwZXJpb2QgaXMgdG8gZ2V0IGEgY2FsbGJhY2sKICAgICBpZiAobUNiZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC00MTIsNyArMzk4LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXVuc2lnbmVkIGludCBBdWRpb1JlY29yZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3QKK3VpbnQzMl90IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdAogewogICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgbUFjdGl2ZSwgYmVjYXVzZSBpZiBpbmFjdGl2ZSB0aGlzIHdpbGwgcmV0dXJuIDAsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGdldElucHV0KCkpOwpAQCAtNDMwLDU2ICs0MTYsNzkgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCB0cmFja0ZsYWdzID0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVDsKLSAgICBwaWRfdCB0aWQgPSAtMTsKKyAgICAvLyBGYXN0IHRyYWNrcyBtdXN0IGJlIGF0IHRoZSBwcmltYXJ5IF9vdXRwdXRfIFtzaWNdIHNhbXBsaW5nIHJhdGUsCisgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBjdXJyZW50bHkgbm8gY29uY2VwdCBvZiBhIHByaW1hcnkgaW5wdXQgc2FtcGxpbmcgcmF0ZQorICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZSA9IEF1ZGlvU3lzdGVtOjpnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCk7CisgICAgaWYgKGFmU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlIGZhaWxlZCIpOworICAgIH0KIAogICAgIC8vIENsaWVudCBjYW4gb25seSBleHByZXNzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KLSAgICAvLyBUaGUgb25seSBzdXBwb3J0ZWQgdXNlIGNhc2UgZm9yIEZBU1QgaXMgY2FsbGJhY2sgdHJhbnNmZXIgbW9kZS4KKyAgICBpZiAoKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgJiYgISgKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlOiBjYWxsYmFjayB0cmFuc2ZlciBtb2RlCisgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLKSAmJgorICAgICAgICAgICAgLy8gbWF0Y2hpbmcgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpKSkgeworICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQiKTsKKyAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCisgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfQorCisgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCB0cmFja0ZsYWdzID0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVDsKKworICAgIHBpZF90IHRpZCA9IC0xOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgaWYgKChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfQ0FMTEJBQ0spIHx8IChtQXVkaW9SZWNvcmRUaHJlYWQgPT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCIpOwotICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCi0gICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOworICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CisgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgdGlkID0gbUF1ZGlvUmVjb3JkVGhyZWFkLT5nZXRUaWQoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwotCi0gICAgaWYgKCEobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSkgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSBvdmVycnVuCi0gICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IG1GcmFtZUNvdW50LzIpIHsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtRnJhbWVDb3VudC8yOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQobUlucHV0U291cmNlLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCk7Ci0gICAgaWYgKGlucHV0ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gaW5wdXQgZm9yIHJlY29yZCBzb3VyY2UgJWQiLCBtSW5wdXRTb3VyY2UpOworICAgICAgICAgICAgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOworICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBpbnB1dCBmb3IgcmVjb3JkIHNvdXJjZSAlZCwgc2FtcGxlIHJhdGUgJXUsIGZvcm1hdCAlI3gsICIKKyAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3gsIHNlc3Npb24gJWQsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwgbUZsYWdzKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAorICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KIAorICAgIHNpemVfdCBmcmFtZUNvdW50ID0gbVJlcUZyYW1lQ291bnQ7CisgICAgc2l6ZV90IHRlbXAgPSBmcmFtZUNvdW50OyAgIC8vIHRlbXAgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgcmV2aXNlZCB2YWx1ZSBvZiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbHNvCiAgICAgaW50IG9yaWdpbmFsU2Vzc2lvbklkID0gbVNlc3Npb25JZDsKKworICAgIC8vIFRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQgaXMgdGhlIHBlcmlvZCBiZXR3ZWVuIGNhbGxiYWNrcywgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7CisKKyAgICBzcDxJTWVtb3J5PiBpTWVtOyAgICAgICAgICAgLy8gZm9yIGNibGsKKyAgICBzcDxJTWVtb3J5PiBidWZmZXJNZW07CiAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPm9wZW5SZWNvcmQoaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotICAgIEFMT0dFX0lGKG9yaWdpbmFsU2Vzc2lvbklkICE9IDAgJiYgbVNlc3Npb25JZCAhPSBvcmlnaW5hbFNlc3Npb25JZCwKKyAgICBBTE9HRV9JRihvcmlnaW5hbFNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFICYmIG1TZXNzaW9uSWQgIT0gb3JpZ2luYWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAic2Vzc2lvbiBJRCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvcmlnaW5hbFNlc3Npb25JZCwgbVNlc3Npb25JZCk7CiAKLSAgICBpZiAocmVjb3JkID09IDAgfHwgc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChpbnB1dCk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9Ci0gICAgc3A8SU1lbW9yeT4gaU1lbSA9IHJlY29yZC0+Z2V0Q2JsaygpOworICAgIEFMT0dfQVNTRVJUKHJlY29yZCAhPSAwKTsKKworICAgIC8vIEF1ZGlvRmxpbmdlciBub3cgb3ducyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBJL08gaGFuZGxlLAorICAgIC8vIHNvIHdlIGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4KKwogICAgIGlmIChpTWVtID09IDApIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ4OSwzNyArNDk4LDY3IEBACiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOworCisgICAgLy8gU3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkuCisgICAgLy8gVGhlIGJ1ZmZlcnMgYXJlIGVpdGhlciBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udHJvbCBibG9jaywKKyAgICAvLyBvciBpbiBhIHNlcGFyYXRlIGFyZWEgYXQgZGlzY3JldGlvbiBvZiBzZXJ2ZXIuCisgICAgdm9pZCAqYnVmZmVyczsKKyAgICBpZiAoYnVmZmVyTWVtID09IDApIHsKKyAgICAgICAgYnVmZmVycyA9IGNibGsgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlcnMgPSBidWZmZXJNZW0tPnBvaW50ZXIoKTsKKyAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQotICAgIG1JbnB1dCA9IGlucHV0OwogICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKICAgICBtQ2Jsa01lbW9yeSA9IGlNZW07Ci0gICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOworICAgIG1CdWZmZXJNZW1vcnkgPSBidWZmZXJNZW07CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgbUNibGsgPSBjYmxrOwotICAgIC8vIEZJWE1FIG1pc3NpbmcgZmFzdCB0cmFjayBmcmFtZUNvdW50IGxvZ2ljCisgICAgLy8gbm90ZSB0aGF0IHRlbXAgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBmcmFtZUNvdW50CisgICAgaWYgKHRlbXAgPCBmcmFtZUNvdW50IHx8IChmcmFtZUNvdW50ID09IDAgJiYgdGVtcCA9PSAwKSkgeworICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQsIHRlbXApOworICAgIH0KKyAgICBmcmFtZUNvdW50ID0gdGVtcDsKKwogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAldSIsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUiLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIGRvdWJsZS1idWZmZXJpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBmYXN0IHRyYWNrcywgZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZwotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbUZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXUiLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBtRnJhbWVDb3VudC8yKSB7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG1GcmFtZUNvdW50LzI7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBzdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeQotICAgIHZvaWQgKmJ1ZmZlcnMgPSAoY2hhciopY2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4KKyAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVzID09IDAgfHwgbm90aWZpY2F0aW9uRnJhbWVzID4gZnJhbWVDb3VudCkgeworICAgICAgICBBTE9HVygiUmVjZWl2ZWQgbm90aWZpY2F0aW9uRnJhbWVzICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLCBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgIH0KKyAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbm90aWZpY2F0aW9uRnJhbWVzOworCisgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCisgICAgbUlucHV0ID0gaW5wdXQ7CisgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOworCisgICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIC8vIElmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CisgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCisgICAgaWYgKGZyYW1lQ291bnQgPiBtUmVxRnJhbWVDb3VudCkgeworICAgICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfQogCiAgICAgLy8gdXBkYXRlIHByb3h5CiAgICAgbVByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgbUZyYW1lQ291bnQsIG1GcmFtZVNpemUpOwpAQCAtNTMwLDYgKzU2OSwxNCBAQAogICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworcmVsZWFzZToKKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGlucHV0LCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKQEAgLTU4MCw2ICs2MjcsNyBAQAogICAgICAgICAvLyBrZWVwIHRoZW0gZnJvbSBnb2luZyBhd2F5IGlmIGFub3RoZXIgdGhyZWFkIHJlLWNyZWF0ZXMgdGhlIHRyYWNrIGR1cmluZyBvYnRhaW5CdWZmZXIoKQogICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudFByb3h5PiBwcm94eTsKICAgICAgICAgc3A8SU1lbW9yeT4gaU1lbTsKKyAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyTWVtOwogICAgICAgICB7CiAgICAgICAgICAgICAvLyBzdGFydCBvZiBsb2NrIHNjb3BlCiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC01OTEsNiArNjM5LDkgQEAKICAgICAgICAgICAgICAgICBpZiAobmV3U2VxdWVuY2UgPT0gb2xkU2VxdWVuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzdG9yZVJlY29yZF9sKCJvYnRhaW5CdWZmZXIiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLm1GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tUmF3ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tTm9uQ29udGlnID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNjAwLDYgKzY1MSw3IEBACiAgICAgICAgICAgICAvLyBLZWVwIHRoZSBleHRyYSByZWZlcmVuY2VzCiAgICAgICAgICAgICBwcm94eSA9IG1Qcm94eTsKICAgICAgICAgICAgIGlNZW0gPSBtQ2Jsa01lbW9yeTsKKyAgICAgICAgICAgIGJ1ZmZlck1lbSA9IG1CdWZmZXJNZW1vcnk7CiAKICAgICAgICAgICAgIC8vIE5vbi1ibG9ja2luZyBpZiB0cmFjayBpcyBzdG9wcGVkCiAgICAgICAgICAgICBpZiAoIW1BY3RpdmUpIHsKQEAgLTY2MCw3ICs3MTIsNyBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIHNhbml0eS1jaGVjay4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0ldSAoJWQpIiwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOworICAgICAgICBBTE9HRSgiQXVkaW9SZWNvcmQ6OnJlYWQoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTY5Miw3ICs3NDQsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW5zZWNzX3QgQXVkaW9SZWNvcmQ6OnByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1JlY29yZFRocmVhZD4mIHRocmVhZCkKK25zZWNzX3QgQXVkaW9SZWNvcmQ6OnByb2Nlc3NBdWRpb0J1ZmZlcigpCiB7CiAgICAgbUxvY2subG9jaygpOwogICAgIGlmIChtQXdhaXRCb29zdCkgewpAQCAtNzYwLDE3ICs4MTIsMTcgQEAKICAgICB9CiAKICAgICAvLyBDYWNoZSBvdGhlciBmaWVsZHMgdGhhdCB3aWxsIGJlIG5lZWRlZCBzb29uCi0gICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyID0gZmFsc2U7CiAgICAgfQogICAgIHNpemVfdCBtaXNhbGlnbm1lbnQgPSBtUHJveHktPmdldE1pc2FsaWdubWVudCgpOwotICAgIGludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CisgICAgdWludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAKICAgICAvLyBUaGVzZSBmaWVsZHMgZG9uJ3QgbmVlZCB0byBiZSBjYWNoZWQsIGJlY2F1c2UgdGhleSBhcmUgYXNzaWduZWQgb25seSBieSBzZXQoKToKLSAgICAvLyAgICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtU2FtcGxlUmF0ZQorICAgIC8vICAgICAgbVRyYW5zZmVyLCBtQ2JmLCBtVXNlckRhdGEsIG1TYW1wbGVSYXRlLCBtRnJhbWVTaXplCiAKICAgICBtTG9jay51bmxvY2soKTsKIApAQCAtODQxLDExICs4OTMsMTEgQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXUgPSAldSArICV1IiwKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnKTsKKyAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIpIHsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg3Miw4ICs5MjQsOCBAQAogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHJlYWRTaXplKSA8IDAgfHwgcmVhZFNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAldSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJWQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICByZXFTaXplLCAoaW50KSByZWFkU2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC05MzIsNyArOTg0LDcgQEAKICAgICBzdGF0dXNfdCByZXN1bHQ7CiAKICAgICAvLyBpZiB0aGUgbmV3IElBdWRpb1JlY29yZCBpcyBjcmVhdGVkLCBvcGVuUmVjb3JkX2woKSB3aWxsIG1vZGlmeSB0aGUKLSAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvUmVjb3JkLCBtQ2Jsa01lbW9yeSBhbmQgbUNibGsuCisgICAgLy8gZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXM6IG1BdWRpb1JlY29yZCwgbUNibGtNZW1vcnksIG1DYmxrLCBtQnVmZmVyTWVtb3J5LgogICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeQogICAgIHNpemVfdCBwb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CkBAIC05NTQsNyArMTAwNiw3IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotdm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPEF1ZGlvUmVjb3JkPiBhdWRpb1JlY29yZCA9IG1BdWRpb1JlY29yZC5wcm9tb3RlKCk7CiAgICAgaWYgKGF1ZGlvUmVjb3JkICE9IDApIHsKQEAgLTk2Niw3ICsxMDE4LDggQEAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhKQotICAgIDogVGhyZWFkKGJDYW5DYWxsSmF2YSksIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKQorICAgIDogVGhyZWFkKGJDYW5DYWxsSmF2YSksIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKSwKKyAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50KGZhbHNlKQogewogfQogCkBAIC05ODMsNiArMTAzNiwxMCBAQAogICAgICAgICAgICAgLy8gY2FsbGVyIHdpbGwgY2hlY2sgZm9yIGV4aXRQZW5kaW5nKCkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIGlmIChtSWdub3JlTmV4dFBhdXNlZEludCkgeworICAgICAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBpZiAobVBhdXNlZEludCkgewogICAgICAgICAgICAgaWYgKG1QYXVzZWROcyA+IDApIHsKICAgICAgICAgICAgICAgICAodm9pZCkgbU15Q29uZC53YWl0UmVsYXRpdmUobU15TG9jaywgbVBhdXNlZE5zKTsKQEAgLTk5Myw3ICsxMDUwLDcgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIG5zZWNzX3QgbnMgPSAgbVJlY2VpdmVyLnByb2Nlc3NBdWRpb0J1ZmZlcih0aGlzKTsKKyAgICBuc2Vjc190IG5zID0gIG1SZWNlaXZlci5wcm9jZXNzQXVkaW9CdWZmZXIoKTsKICAgICBzd2l0Y2ggKG5zKSB7CiAgICAgY2FzZSAwOgogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwMDcsNyArMTA2NCw3IEBACiAgICAgICAgIG5zID0gMTAwMDAwMDAwMExMOwogICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICVsbGQiLCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xMDE3LDEyICsxMDc0LDcgQEAKIHsKICAgICAvLyBtdXN0IGJlIGluIHRoaXMgb3JkZXIgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbgogICAgIFRocmVhZDo6cmVxdWVzdEV4aXQoKTsKLSAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7Ci0gICAgaWYgKG1QYXVzZWQgfHwgbVBhdXNlZEludCkgewotICAgICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKLSAgICAgICAgbU15Q29uZC5zaWduYWwoKTsKLSAgICB9CisgICAgcmVzdW1lKCk7CiB9CiAKIHZvaWQgQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpwYXVzZSgpCkBAIC0xMDM0LDYgKzEwODYsNyBAQAogdm9pZCBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6OnJlc3VtZSgpCiB7CiAgICAgQXV0b011dGV4IF9sKG1NeUxvY2spOworICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50ID0gdHJ1ZTsKICAgICBpZiAobVBhdXNlZCB8fCBtUGF1c2VkSW50KSB7CiAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICAgICAgbVBhdXNlZEludCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IDgwMzNjMmMuLmRkYTM2NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTM1LDE2ICszNSwxNyBAQAogc3A8SUF1ZGlvRmxpbmdlcj4gQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXI7CiBzcDxBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50PiBBdWRpb1N5c3RlbTo6Z0F1ZGlvRmxpbmdlckNsaWVudDsKIGF1ZGlvX2Vycm9yX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnQXVkaW9FcnJvckNhbGxiYWNrID0gTlVMTDsKLS8vIENhY2hlZCB2YWx1ZXMKIAotRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqPiBBdWRpb1N5c3RlbTo6Z091dHB1dHMoMCk7CisvLyBDYWNoZWQgdmFsdWVzIGZvciBvdXRwdXQgaGFuZGxlcworRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqPiBBdWRpb1N5c3RlbTo6Z091dHB1dHMoTlVMTCk7CiAKIC8vIENhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBxdWVyaWVzLCBhbGwgcHJvdGVjdGVkIGJ5IGdMb2NrCi11aW50MzJfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJblNhbXBsaW5nUmF0ZSA9IDE2MDAwOwotYXVkaW9fZm9ybWF0X3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLWF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvU3lzdGVtOjpnUHJldkluQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk87Ci1zaXplX3QgQXVkaW9TeXN0ZW06OmdJbkJ1ZmZTaXplID0gMDsKK3VpbnQzMl90IEF1ZGlvU3lzdGVtOjpnUHJldkluU2FtcGxpbmdSYXRlOworYXVkaW9fZm9ybWF0X3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQ7CithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkNoYW5uZWxNYXNrOworc2l6ZV90IEF1ZGlvU3lzdGVtOjpnSW5CdWZmU2l6ZSA9IDA7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKIAorc3A8QXVkaW9TeXN0ZW06OkF1ZGlvUG9ydENhbGxiYWNrPiBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9ydENhbGxiYWNrOwogCiAvLyBlc3RhYmxpc2ggYmluZGVyIGludGVyZmFjZSB0byBBdWRpb0ZsaW5nZXIgc2VydmljZQogY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpCkBAIC04NCwxMyArODUsMTUgQEAKICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjptdXRlTWljcm9waG9uZShib29sIHN0YXRlKSB7CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bXV0ZU1pY3JvcGhvbmUoYm9vbCBzdGF0ZSkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHJldHVybiBhZi0+c2V0TWljTXV0ZShzdGF0ZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjppc01pY3JvcGhvbmVNdXRlZChib29sKiBzdGF0ZSkgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmlzTWljcm9waG9uZU11dGVkKGJvb2wqIHN0YXRlKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgKnN0YXRlID0gYWYtPmdldE1pY011dGUoKTsKQEAgLTE3NSwxMyArMTc4LDE1IEBACiAgICAgcmV0dXJuIGFmLT5zZXRNb2RlKG1vZGUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldFBhcmFtZXRlcnMoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMpOwogfQogCi1TdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSB7CitTdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIFN0cmluZzggcmVzdWx0ID0gU3RyaW5nOCgiIik7CiAgICAgaWYgKGFmID09IDApIHJldHVybiByZXN1bHQ7CkBAIC0xOTAsNiArMTk1LDE2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKK3sKKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwga2V5VmFsdWVQYWlycyk7Cit9CisKK1N0cmluZzggQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKK3sKKyAgICByZXR1cm4gZ2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwga2V5cyk7Cit9CisKIC8vIGNvbnZlcnQgdm9sdW1lIHN0ZXBzIHRvIG5hdHVyYWwgbG9nIHNjYWxlCiAKIC8vIGNoYW5nZSB0aGlzIHZhbHVlIHRvIGNoYW5nZSB2b2x1bWUgc2NhbGluZwpAQCAtMjI3LDExICsyNDIsMjMgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzdHJlYW1UeXBlLCBzYW1wbGluZ1JhdGUpOworICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzYW1wbGluZ1JhdGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlRm9yQXR0cih1aW50MzJfdCogc2FtcGxpbmdSYXRlLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCit7CisgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRGb3JBdHRyKGF0dHIpOworICAgIGlmIChvdXRwdXQgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzYW1wbGluZ1JhdGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2FtcGxpbmdSYXRlKQogewogICAgIE91dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2M7CkBAIC0yNDksOSArMjc2LDEyIEBACiAgICAgICAgICpzYW1wbGluZ1JhdGUgPSBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGU7CiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KKyAgICBpZiAoKnNhbXBsaW5nUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlIGZhaWxlZCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLSAgICBBTE9HVigiZ2V0U2FtcGxpbmdSYXRlKCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBzYW1wbGluZyByYXRlICV1Iiwgc3RyZWFtVHlwZSwgb3V0cHV0LAotICAgICAgICAgICAgKnNhbXBsaW5nUmF0ZSk7CisgICAgQUxPR1YoImdldFNhbXBsaW5nUmF0ZSgpIG91dHB1dCAlZCwgc2FtcGxpbmcgcmF0ZSAldSIsIG91dHB1dCwgKnNhbXBsaW5nUmF0ZSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0yNjUsMTUgKzI5NSwxNCBAQAogICAgIH0KIAogICAgIG91dHB1dCA9IGdldE91dHB1dChzdHJlYW1UeXBlKTsKLSAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICByZXR1cm4gZ2V0RnJhbWVDb3VudChvdXRwdXQsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQpOworICAgIHJldHVybiBnZXRGcmFtZUNvdW50KG91dHB1dCwgZnJhbWVDb3VudCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMjg5LDkgKzMxOCwxMiBAQAogICAgICAgICAqZnJhbWVDb3VudCA9IG91dHB1dERlc2MtPmZyYW1lQ291bnQ7CiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KKyAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQgZmFpbGVkIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAotICAgIEFMT0dWKCJnZXRGcmFtZUNvdW50KCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBmcmFtZUNvdW50ICVkIiwgc3RyZWFtVHlwZSwgb3V0cHV0LAotICAgICAgICAgICAgKmZyYW1lQ291bnQpOworICAgIEFMT0dWKCJnZXRGcmFtZUNvdW50KCkgb3V0cHV0ICVkLCBmcmFtZUNvdW50ICV6dSIsIG91dHB1dCwgKmZyYW1lQ291bnQpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzA1LDE1ICszMzcsMTQgQEAKICAgICB9CiAKICAgICBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtVHlwZSk7Ci0gICAgaWYgKG91dHB1dCA9PSAwKSB7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGdldExhdGVuY3kob3V0cHV0LCBzdHJlYW1UeXBlLCBsYXRlbmN5KTsKKyAgICByZXR1cm4gZ2V0TGF0ZW5jeShvdXRwdXQsIGxhdGVuY3kpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMzMwLDcgKzM2MSw3IEBACiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KIAotICAgIEFMT0dWKCJnZXRMYXRlbmN5KCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBsYXRlbmN5ICVkIiwgc3RyZWFtVHlwZSwgb3V0cHV0LCAqbGF0ZW5jeSk7CisgICAgQUxPR1YoImdldExhdGVuY3koKSBvdXRwdXQgJWQsIGxhdGVuY3kgJWQiLCBvdXRwdXQsICpsYXRlbmN5KTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTM0OSw2ICszODAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgfQogICAgICAgICBpbkJ1ZmZTaXplID0gYWYtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgaWYgKGluQnVmZlNpemUgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCBjaGFubmVsTWFzayAleCIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvLyBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIGhlcmU6IHdlIGNvdWxkIG92ZXJ3cml0ZSBhIGZyZXNoZXIgY2FjaGUgZW50cnkKICAgICAgICAgZ0xvY2subG9jaygpOwogICAgICAgICAvLyBzYXZlIHRoZSByZXF1ZXN0IHBhcmFtcwogICAgICAgICBnUHJldkluU2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTM3MCw1NiArNDA3LDYwIEBACiAgICAgcmV0dXJuIGFmLT5zZXRWb2ljZVZvbHVtZSh2YWx1ZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHNpemVfdCAqaGFsRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqZHNwRnJhbWVzLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHVpbnQzMl90ICpoYWxGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRzcEZyYW1lcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICBzdHJlYW0gPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dCA9PSAwKSB7Ci0gICAgICAgIG91dHB1dCA9IGdldE91dHB1dChzdHJlYW0pOwotICAgIH0KLQogICAgIHJldHVybiBhZi0+Z2V0UmVuZGVyUG9zaXRpb24oaGFsRnJhbWVzLCBkc3BGcmFtZXMsIG91dHB1dCk7CiB9CiAKLXNpemVfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSB7Cit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgICAgaWYgKGFmID09IDApIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKGlvSGFuZGxlID09IDApIHJldHVybiByZXN1bHQ7CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm4gcmVzdWx0OwogCiAgICAgcmVzdWx0ID0gYWYtPmdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpIHsKK2F1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGFmLT5uZXdBdWRpb1Nlc3Npb25JZCgpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFOworICAgIHJldHVybiBhZi0+bmV3QXVkaW9VbmlxdWVJZCgpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikgewordm9pZCBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgIT0gMCkgewotICAgICAgICBhZi0+YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGFmLT5hY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uLCBwaWQpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmICE9IDApIHsKLSAgICAgICAgYWYtPnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICBhZi0+cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICB9CiB9CiAKK2F1ZGlvX2h3X3N5bmNfdCBBdWRpb1N5c3RlbTo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7CisgICAgcmV0dXJuIGFmLT5nZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oc2Vzc2lvbklkKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Cit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKK3sKICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKIAogICAgIEF1ZGlvU3lzdGVtOjpnQXVkaW9GbGluZ2VyLmNsZWFyKCk7CkBAIC00MzgsNyArNDc5LDcgQEAKICAgICBjb25zdCBPdXRwdXREZXNjcmlwdG9yICpkZXNjOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOwogCi0gICAgaWYgKGlvSGFuZGxlID09IDApIHJldHVybjsKKyAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwogCkBAIC00NTUsNyArNDk2LDcgQEAKIAogICAgICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gIG5ldyBPdXRwdXREZXNjcmlwdG9yKCpkZXNjKTsKICAgICAgICAgZ091dHB1dHMuYWRkKGlvSGFuZGxlLCBvdXRwdXREZXNjKTsKLSAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBvdXRwdXQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJWQgY2hhbm5lbCBtYXNrICUjeCBmcmFtZUNvdW50ICV1ICIKKyAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBvdXRwdXQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgIgogICAgICAgICAgICAgICAgICJsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGUsIG91dHB1dERlc2MtPmZvcm1hdCwgb3V0cHV0RGVzYy0+Y2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZnJhbWVDb3VudCwgb3V0cHV0RGVzYy0+bGF0ZW5jeSk7CkBAIC00NzksOCArNTIwLDggQEAKICAgICAgICAgaWYgKHBhcmFtMiA9PSBOVUxMKSBicmVhazsKICAgICAgICAgZGVzYyA9IChjb25zdCBPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwogCi0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJWQgY2hhbm5lbCBtYXNrICUjeCAiCi0gICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJWQgbGF0ZW5jeSAlZCIsCisgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgorICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBpb0hhbmRsZSwgZGVzYy0+c2FtcGxpbmdSYXRlLCBkZXNjLT5mb3JtYXQsCiAgICAgICAgICAgICAgICAgZGVzYy0+Y2hhbm5lbE1hc2ssIGRlc2MtPmZyYW1lQ291bnQsIGRlc2MtPmxhdGVuY3kpOwogICAgICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gZ091dHB1dHMudmFsdWVBdChpbmRleCk7CkBAIC00OTYsMTIgKzUzNywxNSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikgewordm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikKK3sKICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgIGdBdWRpb0Vycm9yQ2FsbGJhY2sgPSBjYjsKIH0KIAotYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeworCitib29sIEF1ZGlvU3lzdGVtOjpyb3V0ZWRUb0EyZHBPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorewogICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgewogICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgogICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CkBAIC01MzksNyArNTgzLDEyIEBACiAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7CiAgICAgICAgIGdBdWRpb1BvbGljeVNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPihiaW5kZXIpOwogICAgICAgICBnTG9jay51bmxvY2soKTsKKyAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGNsaWVudCB0YWtlcyB0aGUgQXVkaW9Qb2xpY3lTZXJ2aWNlIGxvY2suCisgICAgICAgIC8vIERvbid0IGhvbGQgdGhlIEF1ZGlvU3lzdGVtIGxvY2sgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgICAgZ0F1ZGlvUG9saWN5U2VydmljZS0+cmVnaXN0ZXJDbGllbnQoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUgZXhpc3RzIGEgYmVuaWduIHJhY2UgY29uZGl0aW9uIHdoZXJlIGdBdWRpb1BvbGljeVNlcnZpY2UKKyAgICAgICAgLy8gaXMgc2V0LCBidXQgZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuCiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KICAgICByZXR1cm4gZ0F1ZGlvUG9saWN5U2VydmljZTsKQEAgLTYwOCw2ICs2NTcsMTkgQEAKICAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7CiB9CiAKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgaWYgKGF0dHIgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiAwOworICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckF0dHIoYXR0ciwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQpAQCAtNjM3LDMyICs2OTksMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gMDsKLSAgICByZXR1cm4gYXBzLT5nZXRJbnB1dChpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uSWQpOworICAgIHJldHVybiBhcHMtPmdldElucHV0KGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHNlc3Npb25JZCwgZmxhZ3MpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KGlucHV0KTsKKyAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KGlucHV0LCBzZXNzaW9uKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RvcElucHV0KGlucHV0KTsKKyAgICByZXR1cm4gYXBzLT5zdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VJbnB1dChpbnB1dCk7CisgICAgYXBzLT5yZWxlYXNlSW5wdXQoaW5wdXQsIHNlc3Npb24pOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTcwMiwxNCArNzY4LDE1IEBACiBhdWRpb19kZXZpY2VzX3QgQXVkaW9TeXN0ZW06OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgcmV0dXJuIGFwcy0+Z2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQgaGVyZQorICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKIH0KIApAQCAtODAyLDEzICs4NjksMTEyIEBACiAgICAgcmV0dXJuIGFwcy0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCBudW1fcG9ydHMsIHBvcnRzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldEF1ZGlvUG9ydChwb3J0KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpzZXRBdWRpb1BvcnRDYWxsYmFjayhzcDxBdWRpb1BvcnRDYWxsYmFjaz4gY2FsbEJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICBnQXVkaW9Qb3J0Q2FsbGJhY2sgPSBjYWxsQmFjazsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOworfQorCithdWRpb19tb2RlX3QgQXVkaW9TeXN0ZW06OmdldFBob25lU3RhdGUoKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fTU9ERV9JTlZBTElEOworICAgIHJldHVybiBhcHMtPmdldFBob25lU3RhdGUoKTsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25TZXJ2aWNlRGllZCgpOworICAgIH0KICAgICBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9saWN5U2VydmljZS5jbGVhcigpOwogCiAgICAgQUxPR1coIkF1ZGlvUG9saWN5U2VydmljZSBzZXJ2ZXIgZGllZCEiKTsKIH0KIAordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKaW5kZXggZTI5MDYyNy4uMGE4OWZiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKQEAgLTE1LDE3ICsxNSwyMCBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCi0KIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9UcmFjayIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIAogI2RlZmluZSBXQUlUX1BFUklPRF9NUyAgICAgICAgICAgICAgICAgIDEwCiAjZGVmaW5lIFdBSVRfU1RSRUFNX0VORF9USU1FT1VUX1NFQyAgICAgMTIwCkBAIC0zNCw2ICszNywxOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBpbnQ2NF90IGNvbnZlcnRUaW1lc3BlY1RvVXMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICZ0dikKK3sKKyAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7Cit9CisKKy8vIGN1cnJlbnQgbW9ub3RvbmljIHRpbWUgaW4gbWljcm9zZWNvbmRzLgorc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0djsKKyAgICAodm9pZCkgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0dik7CisgICAgcmV0dXJuIGNvbnZlcnRUaW1lc3BlY1RvVXModHYpOworfQorCiAvLyBzdGF0aWMKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmdldE1pbkZyYW1lQ291bnQoCiAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTQ0LDkgKzYwLDYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAvLyBkZWZhdWx0IHRvIDAgaW4gY2FzZSBvZiBlcnJvcgotICAgICpmcmFtZUNvdW50ID0gMDsKLQogICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBjb2RlIGluIGNyZWF0ZVRyYWNrX2woKSwgZXhjZXB0IHdlJ3JlIG1pc3NpbmcKICAgICAvLyAgICAgICBzb21lIGluZm9ybWF0aW9uIGhlcmUgdGhhdCBpcyBhdmFpbGFibGUgaW4gY3JlYXRlVHJhY2tfbCgpOgogICAgIC8vICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dApAQCAtNTQsMTYgKzY3LDI2IEBACiAgICAgLy8gICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sKICAgICAvLyAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncwogICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICB1aW50MzJfdCBhZkxhdGVuY3k7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKQEAgLTczLDggKzk2LDE1IEBACiAgICAgfQogCiAgICAgKmZyYW1lQ291bnQgPSAoc2FtcGxlUmF0ZSA9PSAwKSA/IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50IDoKLSAgICAgICAgICAgIGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogc2FtcGxlUmF0ZSAvIGFmU2FtcGxlUmF0ZTsKLSAgICBBTE9HVigiZ2V0TWluRnJhbWVDb3VudD0lZDogYWZGcmFtZUNvdW50PSVkLCBtaW5CdWZDb3VudD0lZCwgYWZTYW1wbGVSYXRlPSVkLCBhZkxhdGVuY3k9JWQiLAorICAgICAgICAgICAgYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgKiB1aW50NjRfdChzYW1wbGVSYXRlKSAvIGFmU2FtcGxlUmF0ZTsKKyAgICAvLyBUaGUgZm9ybXVsYSBhYm92ZSBzaG91bGQgYWx3YXlzIHByb2R1Y2UgYSBub24temVybyB2YWx1ZSwgYnV0IHJldHVybiBhbiBlcnJvcgorICAgIC8vIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgorICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0lZCwgYWZMYXRlbmN5PSVkIiwKICAgICAgICAgICAgICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtODgsNiArMTE4LDEwIEBACiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCiAgICAgICBtUGF1c2VkUG9zaXRpb24oMCkKIHsKKyAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKKyAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1VOS05PV047CisgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSAweDA7CisgICAgc3RyY3B5KG1BdHRyaWJ1dGVzLnRhZ3MsICIiKTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTk1LDE1ICsxMjksMTcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKQEAgLTExMyw3ICsxNDksNyBAQAogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQpOworICAgICAgICAgICAgb2ZmbG9hZEluZm8sIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CiB9CiAKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCkBAIC0xMjUsMTEgKzE2MSwxMyBAQAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKQEAgLTEzOCw3ICsxNzYsOCBAQAogewogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIHVpZCk7CisgICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLAorICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzKTsKIH0KIAogQXVkaW9UcmFjazo6fkF1ZGlvVHJhY2soKQpAQCAtMTU2LDggKzE5NSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIG1BdWRpb1RyYWNrLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKKyAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgICAgIEFMT0dWKCJ+QXVkaW9UcmFjaywgcmVsZWFzaW5nIHNlc3Npb24gaWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgfQogfQogCkBAIC0xNjYsMTggKzIwOSwyNSBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgZnJhbWVDb3VudEludCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAotICAgICAgICBpbnQgdWlkKQorICAgICAgICBpbnQgdWlkLAorICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpCiB7CisgICAgQUxPR1YoInNldCgpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgICAgICAgImZsYWdzICMleCwgbm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCIsCisgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSk7CisKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CkBAIC0yMTEsMTkgKzI2MSwxMyBAQAogICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAKLSAgICAvLyBGSVhNRSAiaW50IiBoZXJlIGlzIGxlZ2FjeSBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSBzaXplX3QgbGF0ZXIKLSAgICBpZiAoZnJhbWVDb3VudEludCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgY291bnQgJWQiLCBmcmFtZUNvdW50SW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBmcmFtZUNvdW50SW50OwotCiAgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlZCIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAogICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCi0gICAgQUxPR1YoInNldCgpIHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAldSBmbGFncyAlMDR4Iiwgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOworICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAKQEAgLTIzMywxOSArMjc3LDM5IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBtT3V0cHV0ID0gMDsKLQogICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KICAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewogICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIH0KIAotICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKLSAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHVpbnQzMl90KHN0cmVhbVR5cGUpID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHNhbXBsZVJhdGUgPSBhZlNhbXBsZVJhdGU7CisgICAgICAgIHNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShzdHJlYW1UeXBlKTsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZXMocEF0dHJpYnV0ZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBwQXR0cmlidXRlcy0+dXNhZ2UsIHBBdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUsIHBBdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgICAgICBwQXR0cmlidXRlcy0+dGFncyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcworICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBzZXRTdHJlYW1UeXBlRnJvbUF0dHJpYnV0ZXMobUF0dHJpYnV0ZXMpOworICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlRm9yQXR0cigmc2FtcGxlUmF0ZSwgJm1BdHRyaWJ1dGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgfQogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKIApAQCAtMjUzLDE1ICszMTcsMjEgQEAKICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CiAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBpZiAoY2hhbm5lbE1hc2sgPT0gMCkgewotICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgbUZvcm1hdCA9IGZvcm1hdDsKKworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAogICAgIC8vIEF1ZGlvRmxpbmdlciBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCA4LWJpdCBkYXRhIGluIHNoYXJlZCBtZW1vcnkKICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYgc2hhcmVkQnVmZmVyICE9IDApIHsKQEAgLTI4MSw1MCArMzUxLDU2IEBACiAgICAgICAgICAgICAgICAgKChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQogICAgIC8vIG9ubHkgYWxsb3cgZGVlcCBidWZmZXJpbmcgZm9yIG11c2ljIHN0cmVhbSB0eXBlCi0gICAgaWYgKHN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgaWYgKG1TdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgewogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJn5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7CiAgICAgfQogCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwotICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0KLSAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0gICAgICAgIG1GcmFtZVNpemVBRiA9IGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKyAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBzaXplb2YodWludDhfdCk7CisgICAgICAgIH0KKyAgICAgICAgbUZyYW1lU2l6ZUFGID0gbUZyYW1lU2l6ZTsKICAgICB9IGVsc2UgewotICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOwotICAgICAgICBtRnJhbWVTaXplQUYgPSBzaXplb2YodWludDhfdCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSk7CisgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgIG1GcmFtZVNpemVBRiA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoCisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IGZvcm1hdCk7CisgICAgICAgIC8vIGNyZWF0ZVRyYWNrIHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmIFBDTSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIsCisgICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHNwZWNpZmljIFBDTSBmb3JtYXRzIGhlcmUKICAgICB9CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvKTsKLQotICAgIGlmIChvdXRwdXQgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBvdXRwdXQgZm9yIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgLy8gTWFrZSBjb3B5IG9mIGlucHV0IHBhcmFtZXRlciBvZmZsb2FkSW5mbyBzbyB0aGF0IGluIHRoZSBmdXR1cmU6CisgICAgLy8gIChhKSBjcmVhdGVUcmFja19sIGRvZXNuJ3QgbmVlZCBpdCBhcyBhbiBpbnB1dCBwYXJhbWV0ZXIKKyAgICAvLyAgKGIpIHdlIGNhbiBzdXBwb3J0IHJlLWNyZWF0aW9uIG9mIG9mZmxvYWRlZCB0cmFja3MKKyAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5ID0gKm9mZmxvYWRJbmZvOworICAgICAgICBtT2ZmbG9hZEluZm8gPSAmbU9mZmxvYWRJbmZvQ29weTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT2ZmbG9hZEluZm8gPSBOVUxMOwogICAgIH0KIAotICAgIG1Wb2x1bWVbTEVGVF0gPSAxLjBmOwotICAgIG1Wb2x1bWVbUklHSFRdID0gMS4wZjsKKyAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0gPSAxLjBmOworICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0gPSAxLjBmOwogICAgIG1TZW5kTGV2ZWwgPSAwLjBmOwotICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAvLyBtRnJhbWVDb3VudCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVUcmFja19sCiAgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSBub3RpZmljYXRpb25GcmFtZXM7CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7CiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICBpZiAodWlkID09IC0xIHx8IChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpKSB7CisgICAgaW50IGNhbGxpbmdwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IG15cGlkID0gZ2V0cGlkKCk7CisgICAgaWYgKHVpZCA9PSAtMSB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKICAgICAgICAgbUNsaWVudFVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQ2xpZW50VWlkID0gdWlkOwogICAgIH0KKyAgICBpZiAocGlkID09IC0xIHx8IChjYWxsaW5ncGlkICE9IG15cGlkKSkgeworICAgICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ3BpZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2xpZW50UGlkID0gcGlkOworICAgIH0KICAgICBtQXV4RWZmZWN0SWQgPSAwOwogICAgIG1GbGFncyA9IGZsYWdzOwogICAgIG1DYmYgPSBjYmY7CkBAIC0zMzUsMTQgKzQxMSw3IEBACiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawotICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKmVwb2NoKi8pOworICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsKQEAgLTM1MCwxNyArNDE5LDEwIEBACiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC5jbGVhcigpOwogICAgICAgICB9Ci0gICAgICAgIC8vVXNlIG9mIGRpcmVjdCBhbmQgb2ZmbG9hZGVkIG91dHB1dCBzdHJlYW1zIGlzIHJlZiBjb3VudGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgotICAgICAgICAvLyBBcyBnZXRPdXRwdXQgd2FzIGNhbGxlZCBhYm92ZSBhbmQgcmVzdWx0ZWQgaW4gYW4gb3V0cHV0IHN0cmVhbSB0byBiZSBvcGVuZWQsCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gcmVsZWFzZSBpdC4KLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICBtU3RhdHVzID0gTk9fRVJST1I7Ci0gICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogICAgIG1Vc2VyRGF0YSA9IHVzZXI7CiAgICAgbUxvb3BQZXJpb2QgPSAwOwpAQCAtMzY4LDExICs0MzAsMTQgQEAKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogICAgIG1OZXdQb3NpdGlvbiA9IDA7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IDA7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICBtU2VydmVyID0gMDsKKyAgICBtUG9zaXRpb24gPSAwOworICAgIG1SZWxlYXNlZCA9IDA7CisgICAgbVN0YXJ0VXMgPSAwOworICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgbVNlcXVlbmNlID0gMTsKICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKICAgICBtSW5VbmRlcnJ1biA9IGZhbHNlOwotICAgIG1PdXRwdXQgPSBvdXRwdXQ7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zOTUsMTQgKzQ2MCwyMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FDVElWRTsKICAgICB9CisgICAgKHZvaWQpIHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkgewogICAgICAgICAvLyByZXNldCBjdXJyZW50IHBvc2l0aW9uIGFzIHNlZW4gYnkgY2xpZW50IHRvIDAKLSAgICAgICAgbVByb3h5LT5zZXRFcG9jaChtUHJveHktPmdldEVwb2NoKCkgLSBtUHJveHktPmdldFBvc2l0aW9uKCkpOworICAgICAgICBtUG9zaXRpb24gPSAwOworICAgICAgICAvLyBGb3Igb2ZmbG9hZGVkIHRyYWNrcywgd2UgZG9uJ3Qga25vdyBpZiB0aGUgaGFyZHdhcmUgY291bnRlcnMgYXJlIHJlYWxseSB6ZXJvIGhlcmUsCisgICAgICAgIC8vIHNpbmNlIHRoZSBmbHVzaCBpcyBhc3luY2hyb25vdXMgYW5kIHN0b3AgbWF5IG5vdCBmdWxseSBkcmFpbi4KKyAgICAgICAgLy8gV2Ugc2F2ZSB0aGUgdGltZSB3aGVuIHRoZSB0cmFjayBpcyBzdGFydGVkIHRvIGxhdGVyIHZlcmlmeSB3aGV0aGVyCisgICAgICAgIC8vIHRoZSBjb3VudGVycyBhcmUgcmVhbGlzdGljIChpLmUuIHN0YXJ0IGZyb20gemVybyBhZnRlciB0aGlzIHRpbWUpLgorICAgICAgICBtU3RhcnRVcyA9IGdldE5vd1VzKCk7CisKICAgICAgICAgLy8gZm9yY2UgcmVmcmVzaCBvZiByZW1haW5pbmcgZnJhbWVzIGJ5IHByb2Nlc3NBdWRpb0J1ZmZlcigpIGFzIGxhc3QKICAgICAgICAgLy8gd3JpdGUgYmVmb3JlIHN0b3AgY291bGQgYmUgcGFydGlhbC4KICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogICAgIH0KLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOworICAgIG1OZXdQb3NpdGlvbiA9IG1Qb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJm1DYmxrLT5tRmxhZ3MpOwogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOwpAQCAtNDQ4LDE1ICs1MjAsMTUgQEAKIHZvaWQgQXVkaW9UcmFjazo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIC8vIEZJWE1FIHBhdXNlIHRoZW4gc3RvcCBzaG91bGQgbm90IGJlIGEgbm9wCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUpIHsKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0FDVElWRSAmJiBtU3RhdGUgIT0gU1RBVEVfUEFVU0VEKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBJTkc7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKICAgICBtUHJveHktPmludGVycnVwdCgpOwpAQCAtNDc1LDcgKzU0Nyw3IEBACiAKICAgICBzcDxBdWRpb1RyYWNrVGhyZWFkPiB0ID0gbUF1ZGlvVHJhY2tUaHJlYWQ7CiAgICAgaWYgKHQgIT0gMCkgewotICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkKCkpIHsKKyAgICAgICAgaWYgKCFpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgICAgIHQtPnBhdXNlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNTEzLDcgKzU4NSw4IEBACiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogCiAgICAgbVN0YXRlID0gU1RBVEVfRkxVU0hFRDsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIG1SZWxlYXNlZCA9IDA7CisgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgIH0KICAgICBtUHJveHktPmZsdXNoKCk7CkBAIC01MzMsMTEgKzYwNiwyMCBAQAogICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgewotICAgICAgICBpZiAobU91dHB1dCAhPSAwKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSkgeworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgLy8gQW4gb2ZmbG9hZCBvdXRwdXQgY2FuIGJlIHJlLXVzZWQgYmV0d2VlbiB0d28gYXVkaW8gdHJhY2tzIGhhdmluZworICAgICAgICAgICAgLy8gdGhlIHNhbWUgY29uZmlndXJhdGlvbi4gQSB0aW1lc3RhbXAgcXVlcnkgZm9yIGEgcGF1c2VkIHRyYWNrCisgICAgICAgICAgICAvLyB3aGlsZSB0aGUgb3RoZXIgaXMgcnVubmluZyB3b3VsZCByZXR1cm4gYW4gaW5jb3JyZWN0IHRpbWUuCisgICAgICAgICAgICAvLyBUbyBmaXggdGhpcywgY2FjaGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIG9uIGEgcGF1c2UoKSBhbmQgcmV0dXJuCisgICAgICAgICAgICAvLyB0aGlzIHRpbWUgd2hlbiByZXF1ZXN0ZWQgdW50aWwgdGhlIHRyYWNrIGlzIHJlc3VtZWQuCisKKyAgICAgICAgICAgIC8vIE9mZmxvYWRUaHJlYWQgc2VuZHMgSEFMIHBhdXNlIGluIGl0cyB0aHJlYWRMb29wLiBUaW1lIHNhdmVkCisgICAgICAgICAgICAvLyBoZXJlIGNhbiBiZSBzbGlnaHRseSBvZmYuCisKKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHJldHVybiBjb2RlIGZvciBnZXRSZW5kZXJQb3NpdGlvbi4KKwogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwotICAgICAgICAgICAgLy8gT2ZmbG9hZFRocmVhZCBzZW5kcyBIQUwgcGF1c2UgaW4gaXRzIHRocmVhZExvb3AuLiB0aW1lIHNhdmVkCi0gICAgICAgICAgICAvLyBoZXJlIGNhbiBiZSBzbGlnaHRseSBvZmYKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtT3V0cHV0LCAmaGFsRnJhbWVzLCAmbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgIEFMT0dWKCJBdWRpb1RyYWNrOjpwYXVzZSBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgIH0KQEAgLTU0NiwxNyArNjI4LDE5IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKIHsKLSAgICBpZiAobGVmdCA8IDAuMGYgfHwgbGVmdCA+IDEuMGYgfHwgcmlnaHQgPCAwLjBmIHx8IHJpZ2h0ID4gMS4wZikgeworICAgIC8vIFRoaXMgZHVwbGljYXRlcyBhIHRlc3QgYnkgQXVkaW9UcmFjayBKTkksIGJ1dCB0aGF0IGlzIG5vdCB0aGUgb25seSBjYWxsZXIKKyAgICBpZiAoaXNuYW5mKGxlZnQpIHx8IGxlZnQgPCBHQUlOX0ZMT0FUX1pFUk8gfHwgbGVmdCA+IEdBSU5fRkxPQVRfVU5JVFkgfHwKKyAgICAgICAgICAgIGlzbmFuZihyaWdodCkgfHwgcmlnaHQgPCBHQUlOX0ZMT0FUX1pFUk8gfHwgcmlnaHQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1Wb2x1bWVbTEVGVF0gPSBsZWZ0OwotICAgIG1Wb2x1bWVbUklHSFRdID0gcmlnaHQ7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdID0gbGVmdDsKKyAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdID0gcmlnaHQ7CiAKLSAgICBtUHJveHktPnNldFZvbHVtZUxSKCh1aW50MzJfdCh1aW50MTZfdChyaWdodCAqIDB4MTAwMCkpIDw8IDE2KSB8IHVpbnQxNl90KGxlZnQgKiAweDEwMDApKTsKKyAgICBtUHJveHktPnNldFZvbHVtZUxSKGdhaW5fbWluaWZsb2F0X3BhY2soZ2Fpbl9mcm9tX2Zsb2F0KGxlZnQpLCBnYWluX2Zyb21fZmxvYXQocmlnaHQpKSk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPnNpZ25hbCgpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01NjksNyArNjUzLDggQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKQogewotICAgIGlmIChsZXZlbCA8IDAuMGYgfHwgbGV2ZWwgPiAxLjBmKSB7CisgICAgLy8gVGhpcyBkdXBsaWNhdGVzIGEgdGVzdCBieSBBdWRpb1RyYWNrIEpOSSwgYnV0IHRoYXQgaXMgbm90IHRoZSBvbmx5IGNhbGxlcgorICAgIGlmIChpc25hbmYobGV2ZWwpIHx8IGxldmVsIDwgR0FJTl9GTE9BVF9aRVJPIHx8IGxldmVsID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNTg5LDE2ICs2NzQsMTUgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0U2FtcGxlUmF0ZSh1aW50MzJfdCByYXRlKQogewotICAgIGlmIChtSXNUaW1lZCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgdWludDMyX3QgYWZTYW1wbGluZ1JhdGU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxpbmdSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKKyAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIoJmFmU2FtcGxpbmdSYXRlLCAmbUF0dHJpYnV0ZXMpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgotICAgIGlmIChyYXRlID09IDAgfHwgcmF0ZSA+IGFmU2FtcGxpbmdSYXRlKjIgKSB7CisgICAgaWYgKHJhdGUgPT0gMCB8fCByYXRlID4gYWZTYW1wbGluZ1JhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTYyMCwxMCArNzA0LDEwIEBACiAgICAgLy8gc2FtcGxlIHJhdGUgY2FuIGJlIHVwZGF0ZWQgZHVyaW5nIHBsYXliYWNrIGJ5IHRoZSBvZmZsb2FkZWQgZGVjb2RlciBzbyB3ZSBuZWVkIHRvCiAgICAgLy8gcXVlcnkgdGhlIEhBTCBhbmQgdXBkYXRlIGlmIG5lZWRlZC4KIC8vIEZJWE1FIHVzZSBQcm94eSByZXR1cm4gY2hhbm5lbCB0byB1cGRhdGUgdGhlIHJhdGUgZnJvbSBzZXJ2ZXIgYW5kIGF2b2lkIHBvbGxpbmcgaGVyZQotICAgIGlmIChpc09mZmxvYWRlZCgpKSB7Ci0gICAgICAgIGlmIChtT3V0cHV0ICE9IDApIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShtT3V0cHV0LCBtU3RyZWFtVHlwZSwgJnNhbXBsZVJhdGUpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShtT3V0cHV0LCAmc2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwogICAgICAgICAgICAgfQpAQCAtNjM0LDcgKzcxOCw3IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldExvb3AodWludDMyX3QgbG9vcFN0YXJ0LCB1aW50MzJfdCBsb29wRW5kLCBpbnQgbG9vcENvdW50KQogewotICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTY2MCw3ICs3NDQsNyBAQAogewogICAgIC8vIEZJWE1FIElmIHNldHRpbmcgYSBsb29wIGFsc28gc2V0cyBwb3NpdGlvbiB0byBzdGFydCBvZiBsb29wLCB0aGVuCiAgICAgLy8gICAgICAgdGhpcyBpcyBjb3JyZWN0LiAgT3RoZXJ3aXNlIGl0IHNob3VsZCBiZSByZW1vdmVkLgotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CisgICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgbVVwZGF0ZVBlcmlvZDsKICAgICBtTG9vcFBlcmlvZCA9IGxvb3BDb3VudCAhPSAwID8gbG9vcEVuZCAtIGxvb3BTdGFydCA6IDA7CiAgICAgbVN0YXRpY1Byb3h5LT5zZXRMb29wKGxvb3BTdGFydCwgbG9vcEVuZCwgbG9vcENvdW50KTsKIH0KQEAgLTY2OCw3ICs3NTIsNyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgbWFya2VyKQogewogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBtYXJrZXIgcG9zaXRpb24gaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC02ODEsNyArNzY1LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgKm1hcmtlcikgY29uc3QKIHsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAobWFya2VyID09IE5VTEwpIHsKQEAgLTY5NywxOSArNzgxLDIwIEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CiAgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIHBvc2l0aW9uIHVwZGF0ZSBwZXJpb2QgaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIHVwZGF0ZVBlcmlvZDsKKyAgICBtTmV3UG9zaXRpb24gPSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkgKyB1cGRhdGVQZXJpb2Q7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IHVwZGF0ZVBlcmlvZDsKKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0UG9zaXRpb25VcGRhdGVQZXJpb2QodWludDMyX3QgKnVwZGF0ZVBlcmlvZCkgY29uc3QKIHsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAodXBkYXRlUGVyaW9kID09IE5VTEwpIHsKQEAgLTcyNCw3ICs4MDksNyBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQb3NpdGlvbih1aW50MzJfdCBwb3NpdGlvbikKIHsKLSAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmIChwb3NpdGlvbiA+IG1GcmFtZUNvdW50KSB7CkBAIC03NDEsNyArODI2LDcgQEAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CisgICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgbVVwZGF0ZVBlcmlvZDsKICAgICBtTG9vcFBlcmlvZCA9IDA7CiAgICAgLy8gRklYTUUgQ2hlY2sgd2hldGhlciBsb29wcyBhbmQgc2V0dGluZyBwb3NpdGlvbiBhcmUgaW5jb21wYXRpYmxlIGluIG9sZCBjb2RlLgogICAgIC8vIElmIHdlIHVzZSBzZXRMb29wIGZvciBib3RoIHB1cnBvc2VzIHdlIGxvc2UgdGhlIGNhcGFiaWxpdHkgdG8gc2V0IHRoZSBwb3NpdGlvbiB3aGlsZSBsb29waW5nLgpAQCAtNzUwLDM2ICs4MzUsMzggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikKIHsKICAgICBpZiAocG9zaXRpb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCi0gICAgICAgIGlmICgobVN0YXRlID09IFNUQVRFX1BBVVNFRCkgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSB7CisgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7CiAgICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgICAgICAqcG9zaXRpb24gPSBtUGF1c2VkUG9zaXRpb247CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobU91dHB1dCAhPSAwKSB7CisgICAgICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICB1aW50MzJfdCBoYWxGcmFtZXM7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24obU91dHB1dCwgJmhhbEZyYW1lcywgJmRzcEZyYW1lcyk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUU6IGRzcEZyYW1lcyBtYXkgbm90IGJlIHplcm8gaW4gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKQorICAgICAgICAvLyBkdWUgdG8gaGFyZHdhcmUgbGF0ZW5jeS4gV2UgbGVhdmUgdGhpcyBiZWhhdmlvciBmb3Igbm93LgogICAgICAgICAqcG9zaXRpb24gPSBkc3BGcmFtZXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gSUF1ZGlvVHJhY2s6OnN0b3AoKSBpc24ndCBzeW5jaHJvbm91czsgd2UgZG9uJ3Qga25vdyB3aGVuIHByZXNlbnRhdGlvbiBjb21wbGV0ZXMKLSAgICAgICAgKnBvc2l0aW9uID0gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKSA/IDAgOgotICAgICAgICAgICAgICAgIG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKKyAgICAgICAgKnBvc2l0aW9uID0gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKSA/CisgICAgICAgICAgICAgICAgMCA6IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRCdWZmZXJQb3NpdGlvbihzaXplX3QgKnBvc2l0aW9uKQorc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0QnVmZmVyUG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKQogewogICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNzk1LDcgKzg4Miw3IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlbG9hZCgpCiB7Ci0gICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtODEyLDIzICs4OTksMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvVHJhY2s6OmdldE91dHB1dCgpCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXQoKSBjb25zdAogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbU91dHB1dDsKIH0KIAotLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXRfbCgpCi17Ci0gICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIG1PdXRwdXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQobVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7Ci0gICAgfQotfQotCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTg0MiwxNSArOTE4LDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpjcmVhdGVUcmFja19sKAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgIHNpemVfdCBlcG9jaCkKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmNyZWF0ZVRyYWNrX2woKQogewogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CkBAIC04NTksNDEgKzkyNyw1NCBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbUF0dHJpYnV0ZXMsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LAorICAgICAgICAgICAgbUNoYW5uZWxNYXNrLCBtRmxhZ3MsIG1PZmZsb2FkSW5mbyk7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBvdXRwdXQgZm9yIHN0cmVhbSB0eXBlICVkLCB1c2FnZSAlZCwgc2FtcGxlIHJhdGUgJXUsIGZvcm1hdCAlI3gsIgorICAgICAgICAgICAgICAiIGNoYW5uZWwgbWFzayAlI3gsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtQXR0cmlidXRlcy51c2FnZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAorICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KKwogICAgIC8vIE5vdCBhbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBuZWVkZWQgdW5kZXIgYWxsIGNvbmRpdGlvbnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gZ2V0IHRoZW0gYWxsCiAKICAgICB1aW50MzJfdCBhZkxhdGVuY3k7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZMYXRlbmN5KTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShvdXRwdXQsICZhZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogCiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChvdXRwdXQsIHN0cmVhbVR5cGUsICZhZkZyYW1lQ291bnQpOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KG91dHB1dCwgJmFmRnJhbWVDb3VudCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChvdXRwdXQ9JWQsIHN0cmVhbVR5cGU9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RyZWFtVHlwZSwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJnZXRGcmFtZUNvdW50KG91dHB1dD0lZCkgc3RhdHVzICVkIiwgb3V0cHV0LCBzdGF0dXMpOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogCiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZTYW1wbGVSYXRlKTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgJmFmU2FtcGxlUmF0ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0U2FtcGxpbmdSYXRlKG91dHB1dD0lZCwgc3RyZWFtVHlwZT0lZCkgc3RhdHVzICVkIiwgb3V0cHV0LCBzdHJlYW1UeXBlLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAogICAgIC8vIENsaWVudCBkZWNpZGVzIHdoZXRoZXIgdGhlIHRyYWNrIGlzIFRJTUVEIChzZWUgYmVsb3cpLCBidXQgY2FuIG9ubHkgZXhwcmVzcyBhIHByZWZlcmVuY2UKICAgICAvLyBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KLSAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgJiYgISgKKyAgICBpZiAoKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICYmICEoKAogICAgICAgICAgICAgLy8gZWl0aGVyIG9mIHRoZXNlIHVzZSBjYXNlczoKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDE6IHNoYXJlZCBidWZmZXIKLSAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgfHwKLSAgICAgICAgICAgIC8vIHVzZSBjYXNlIDI6IGNhbGxiYWNrIGhhbmRsZXIKLSAgICAgICAgICAgIChtQ2JmICE9IE5VTEwpKSkgeworICAgICAgICAgICAgKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlIDI6IGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUKKyAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spKSAmJgorICAgICAgICAgICAgLy8gbWF0Y2hpbmcgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpKSkgewogICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50Iik7CiAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkCi0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOworICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQogICAgIEFMT0dWKCJjcmVhdGVUcmFja19sKCkgb3V0cHV0ICVkIGFmTGF0ZW5jeSAlZCIsIG91dHB1dCwgYWZMYXRlbmN5KTsKIApAQCAtOTA0LDY0ICs5ODUsNzAgQEAKICAgICAvLyAgbiA9IDMgICBub3JtYWwgdHJhY2ssIHdpdGggc2FtcGxlIHJhdGUgY29udmVyc2lvbgogICAgIC8vICAgICAgICAgIChwZXNzaW1pc3RpYzsgc29tZSBub24tMToxIGNvbnZlcnNpb24gcmF0aW9zIGRvbid0IGFjdHVhbGx5IG5lZWQgdHJpcGxlLWJ1ZmZlcmluZykKICAgICAvLyAgbiA+IDMgICB2ZXJ5IGhpZ2ggbGF0ZW5jeSBvciB2ZXJ5IHNtYWxsIG5vdGlmaWNhdGlvbiBpbnRlcnZhbDsgbkJ1ZmZlcmluZyBpcyBpZ25vcmVkCi0gICAgY29uc3QgdWludDMyX3QgbkJ1ZmZlcmluZyA9IChzYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkgPyAyIDogMzsKKyAgICBjb25zdCB1aW50MzJfdCBuQnVmZmVyaW5nID0gKG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkgPyAyIDogMzsKIAogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwogCi0gICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IG1SZXFGcmFtZUNvdW50OworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogCi0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgICAgICAvLyBTYW1lIGNvbW1lbnQgYXMgYmVsb3cgYWJvdXQgaWdub3JpbmcgZnJhbWVDb3VudCBwYXJhbWV0ZXIgZm9yIHNldCgpCi0gICAgICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gbVNoYXJlZEJ1ZmZlci0+c2l6ZSgpOwogICAgICAgICB9IGVsc2UgaWYgKGZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgZnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudDsKICAgICAgICAgfQogICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCAhPSBmcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudDsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICB9IGVsc2UgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogCiAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBhbGlnbm1lbnQgbWF0Y2hlcyBjaGFubmVsIGNvdW50CiAgICAgICAgIC8vIDgtYml0IGRhdGEgaW4gc2hhcmVkIG1lbW9yeSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IC8qIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8gMSA6ICovIDI7CisgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogbUZvcm1hdCk7CisgICAgICAgIGlmIChhbGlnbm1lbnQgJiAxKSB7CisgICAgICAgICAgICBhbGlnbm1lbnQgPSAxOworICAgICAgICB9CiAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID4gMSkgewogICAgICAgICAgICAgLy8gTW9yZSB0aGFuIDIgY2hhbm5lbHMgZG9lcyBub3QgcmVxdWlyZSBzdHJvbmdlciBhbGlnbm1lbnQgdGhhbiBzdGVyZW8KICAgICAgICAgICAgIGFsaWdubWVudCA8PD0gMTsKICAgICAgICAgfQotICAgICAgICBpZiAoKChzaXplX3Qpc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoYWxpZ25tZW50IC0gMSkpICE9IDApIHsKKyAgICAgICAgaWYgKCgodWludHB0cl90KW1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKSAmIChhbGlnbm1lbnQgLSAxKSkgIT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYnVmZmVyIGFsaWdubWVudDogYWRkcmVzcyAlcCwgY2hhbm5lbCBjb3VudCAldSIsCi0gICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBtQ2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBXaGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCBidWZmZXIgQXVkaW9UcmFjayB2aWEgY29uc3RydWN0b3JzLAogICAgICAgICAvLyB0aGVyZSdzIG5vIGZyYW1lQ291bnQgcGFyYW1ldGVyLgogICAgICAgICAvLyBCdXQgd2hlbiBpbml0aWFsaXppbmcgYSBzaGFyZWQgYnVmZmVyIEF1ZGlvVHJhY2sgdmlhIHNldCgpLAogICAgICAgICAvLyB0aGVyZSBfaXNfIGEgZnJhbWVDb3VudCBwYXJhbWV0ZXIuICBXZSBzaWxlbnRseSBpZ25vcmUgaXQuCi0gICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKS9tQ2hhbm5lbENvdW50L3NpemVvZihpbnQxNl90KTsKKyAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKSAvIG1GcmFtZVNpemVBRjsKIAotICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CisgICAgfSBlbHNlIGlmICghKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CiAKICAgICAgICAgLy8gRklYTUUgbW92ZSB0aGVzZSBjYWxjdWxhdGlvbnMgYW5kIGFzc29jaWF0ZWQgY2hlY2tzIHRvIHNlcnZlcgogCiAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBkZXB0aCBjb3ZlcnMgYXQgbGVhc3QgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeQogICAgICAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGFmTGF0ZW5jeSAvICgoMTAwMCAqIGFmRnJhbWVDb3VudCkvYWZTYW1wbGVSYXRlKTsKLSAgICAgICAgQUxPR1YoImFmRnJhbWVDb3VudD0lZCwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0ldSwgYWZMYXRlbmN5PSVkIiwKKyAgICAgICAgQUxPR1YoImFmRnJhbWVDb3VudD0lenUsIG1pbkJ1ZkNvdW50PSVkLCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0lZCIsCiAgICAgICAgICAgICAgICAgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwogICAgICAgICBpZiAobWluQnVmQ291bnQgPD0gbkJ1ZmZlcmluZykgewogICAgICAgICAgICAgbWluQnVmQ291bnQgPSBuQnVmZmVyaW5nOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSAoYWZGcmFtZUNvdW50KnNhbXBsZVJhdGUqbWluQnVmQ291bnQpL2FmU2FtcGxlUmF0ZTsKLSAgICAgICAgQUxPR1YoIm1pbkZyYW1lQ291bnQ6ICV1LCBhZkZyYW1lQ291bnQ9JWQsIG1pbkJ1ZkNvdW50PSVkLCBzYW1wbGVSYXRlPSV1LCBhZlNhbXBsZVJhdGU9JXUiCisgICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgKiB1aW50NjRfdChtU2FtcGxlUmF0ZSkgLyBhZlNhbXBsZVJhdGU7CisgICAgICAgIEFMT0dWKCJtaW5GcmFtZUNvdW50OiAlenUsIGFmRnJhbWVDb3VudD0lenUsIG1pbkJ1ZkNvdW50PSVkLCBzYW1wbGVSYXRlPSV1LCBhZlNhbXBsZVJhdGU9JXUiCiAgICAgICAgICAgICAgICAgIiwgYWZMYXRlbmN5PSVkIiwKLSAgICAgICAgICAgICAgICBtaW5GcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBzYW1wbGVSYXRlLCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CisgICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgbVNhbXBsZVJhdGUsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKIAogICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgewogICAgICAgICAgICAgLy8gbm90IEFMT0dXIGJlY2F1c2UgaXQgaGFwcGVucyBhbGwgdGhlIHRpbWUgd2hlbiBwbGF5aW5nIGtleSBjbGlja3Mgb3ZlciBBMkRQCi0gICAgICAgICAgICBBTE9HVigiTWluaW11bSBidWZmZXIgc2l6ZSBjb3JyZWN0ZWQgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICBBTE9HVigiTWluaW11bSBidWZmZXIgc2l6ZSBjb3JyZWN0ZWQgZnJvbSAlenUgdG8gJXp1IiwKICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7CiAgICAgICAgIH0KQEAgLTk4MCw0MiArMTA2Nyw1OCBAQAogICAgIH0KIAogICAgIHBpZF90IHRpZCA9IC0xOwotICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICB0aWQgPSBtQXVkaW9UcmFja1RocmVhZC0+Z2V0VGlkKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKICAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19PRkZMT0FEOwogICAgIH0KIAotICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjayA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlVHJhY2soc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RJUkVDVDsKKyAgICB9CisKKyAgICBzaXplX3QgdGVtcCA9IGZyYW1lQ291bnQ7ICAgLy8gdGVtcCBtYXkgYmUgcmVwbGFjZWQgYnkgYSByZXZpc2VkIHZhbHVlIG9mIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIHN0aWxsIG5lZWQgdGhlIG9yaWdpbmFsIHZhbHVlIGFsc28KKyAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVRyYWNrKG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgb25seSBzZWVzIDE2LWJpdCBQQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCi0gICAgaWYgKHRyYWNrID09IDApIHsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CisgICAgQUxPR19BU1NFUlQodHJhY2sgIT0gMCk7CisKKyAgICAvLyBBdWRpb0ZsaW5nZXIgbm93IG93bnMgdGhlIHJlZmVyZW5jZSB0byB0aGUgSS9PIGhhbmRsZSwKKyAgICAvLyBzbyB3ZSBhcmUgbm8gbG9uZ2VyIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQuCisKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOworICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewogICAgICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CkBAIC0xMDIzLDIyICsxMTI2LDI1IEBACiAgICAgfQogICAgIG1BdWRpb1RyYWNrID0gdHJhY2s7CiAgICAgbUNibGtNZW1vcnkgPSBpTWVtOwotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW0tPnBvaW50ZXIoKSk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOwogICAgIG1DYmxrID0gY2JsazsKLSAgICBzaXplX3QgdGVtcCA9IGNibGstPmZyYW1lQ291bnRfOworICAgIC8vIG5vdGUgdGhhdCB0ZW1wIGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgZnJhbWVDb3VudAogICAgIGlmICh0ZW1wIDwgZnJhbWVDb3VudCB8fCAoZnJhbWVDb3VudCA9PSAwICYmIHRlbXAgPT0gMCkpIHsKICAgICAgICAgLy8gSW4gY3VycmVudCBkZXNpZ24sIEF1ZGlvVHJhY2sgY2xpZW50IGNoZWNrcyBhbmQgZW5zdXJlcyBmcmFtZSBjb3VudCB2YWxpZGl0eSBiZWZvcmUKICAgICAgICAgLy8gcGFzc2luZyBpdCB0byBBdWRpb0ZsaW5nZXIgc28gQXVkaW9GbGluZ2VyIHNob3VsZCBub3QgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlIGV4Y2VwdAogICAgICAgICAvLyBmb3IgZmFzdCB0cmFjayBhcyBpdCB1c2VzIGEgc3BlY2lhbCBtZXRob2Qgb2YgYXNzaWduaW5nIGZyYW1lIGNvdW50LgotICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKKyAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKICAgICB9CiAgICAgZnJhbWVDb3VudCA9IHRlbXA7CisKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwotICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgICAgICAgICAvLyBUaGVvcmV0aWNhbGx5IGRvdWJsZS1idWZmZXJpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBmYXN0IHRyYWNrcywKICAgICAgICAgICAgICAgICAvLyBkdWUgdG8gdGlnaHRlciBzY2hlZHVsaW5nLiAgQnV0IGluIHByYWN0aWNlLCB0byBhY2NvbW1vZGF0ZSBrZXJuZWxzIHdpdGgKICAgICAgICAgICAgICAgICAvLyBzY2hlZHVsaW5nIGppdHRlciwgYW5kIGFwcHMgd2l0aCBjb21wdXRhdGlvbiBqaXR0ZXIsIHdlIHVzZSBkb3VibGUtYnVmZmVyaW5nLgpAQCAtMTA0NywyOCArMTE1MywzOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZAotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CisgICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gZnJhbWVDb3VudC9uQnVmZmVyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50L25CdWZmZXJpbmc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgewogICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX09GRkxPQUQpIHsKICAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19PRkZMT0FEIHN1Y2Nlc3NmdWwiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19PRkZMT0FEIGRlbmllZCBieSBzZXJ2ZXIiKTsKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyBhIHdhcm5pbmcsIG5vdCBhbiBlcnJvciwgc28gZG9uJ3QgcmV0dXJuIGVycm9yIHN0YXR1cworICAgICAgICAgICAgLy9yZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmICh0cmFja0ZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRElSRUNUKSB7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgZGVuaWVkIGJ5IHNlcnZlciIpOworICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIGEgd2FybmluZywgbm90IGFuIGVycm9yLCBzbyBkb24ndCByZXR1cm4gZXJyb3Igc3RhdHVzCisgICAgICAgICAgICAvL3JldHVybiBOT19JTklUOwogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCisgICAgbU91dHB1dCA9IG91dHB1dDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKICAgICAvLyBTdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeS4gIElmIHRoZXJlIGlzIGEgc2hhcmVkIGJ1ZmZlciwgYnVmZmVycwpAQCAtMTA3NiwxNSArMTE5MywxNiBAQAogICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb250cm9sIGJsb2NrLiAgVGhpcyBhZGRyZXNzIGlzIGZvciB0aGUgbWFwcGluZyB3aXRoaW4gY2xpZW50CiAgICAgLy8gYWRkcmVzcyBzcGFjZS4gIEF1ZGlvRmxpbmdlcjo6VHJhY2tCYXNlOjptQnVmZmVyIGlzIGZvciB0aGUgc2VydmVyIGFkZHJlc3Mgc3BhY2UuCiAgICAgdm9pZCogYnVmZmVyczsKLSAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgIGJ1ZmZlcnMgPSAoY2hhciopY2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlcnMgPSBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKKyAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICB9CiAKICAgICBtQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CiAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQotICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqZnJhbWVDb3VudCkgLyBzYW1wbGVSYXRlOworICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqZnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKKwogICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICAvLyBJZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CiAgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCkBAIC0xMDkzLDI0ICsxMjExLDMwIEBACiAgICAgfQogCiAgICAgLy8gdXBkYXRlIHByb3h5Ci0gICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICBtU3RhdGljUHJveHkuY2xlYXIoKTsKICAgICAgICAgbVByb3h5ID0gbmV3IEF1ZGlvVHJhY2tDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplQUYpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0aWNQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZUFGKTsKICAgICAgICAgbVByb3h5ID0gbVN0YXRpY1Byb3h5OwogICAgIH0KLSAgICBtUHJveHktPnNldFZvbHVtZUxSKCh1aW50MzJfdCh1aW50MTZfdChtVm9sdW1lW1JJR0hUXSAqIDB4MTAwMCkpIDw8IDE2KSB8Ci0gICAgICAgICAgICB1aW50MTZfdChtVm9sdW1lW0xFRlRdICogMHgxMDAwKSk7CisgICAgbVByb3h5LT5zZXRWb2x1bWVMUihHQUlOX01JTklGTE9BVF9QQUNLRURfVU5JVFkpOwogICAgIG1Qcm94eS0+c2V0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwogICAgIG1Qcm94eS0+c2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7Ci0gICAgbVByb3h5LT5zZXRFcG9jaChlcG9jaCk7CiAgICAgbVByb3h5LT5zZXRNaW5pbXVtKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QpOwogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworcmVsZWFzZToKKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGludDMyX3Qgd2FpdENvdW50KQpAQCAtMTIzMSw2ICsxMzU1LDcgQEAKICAgICBidWZmZXIubVJhdyA9IGF1ZGlvQnVmZmVyLT5yYXc7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgbVJlbGVhc2VkICs9IHN0ZXBDb3VudDsKICAgICBtSW5VbmRlcnJ1biA9IGZhbHNlOwogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKIApAQCAtMTIzOCw4ICsxMzYzLDcgQEAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKICAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJmNibGstPm1GbGFncykgJiBDQkxLX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIG5hbWU9JXMgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR1coInJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciLCB0aGlzKTsKICAgICAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwogICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgIH0KQEAgLTEyNDgsMTYgKzEzNzIsMjYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplKQorc3NpemVfdCBBdWRpb1RyYWNrOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCB1c2VyU2l6ZSwgYm9vbCBibG9ja2luZykKIHsKICAgICBpZiAobVRyYW5zZmVyICE9IFRSQU5TRkVSX1NZTkMgfHwgbUlzVGltZWQpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGlmIChpc0RpcmVjdCgpKSB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KENCTEtfVU5ERVJSVU4gfCBDQkxLX0xPT1BfQ1lDTEUgfCBDQkxLX0xPT1BfRklOQUwgfCBDQkxLX0JVRkZFUl9FTkQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgaWYgKGZsYWdzICYgQ0JMS19JTlZBTElEKSB7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoc3NpemVfdCh1c2VyU2l6ZSkgPCAwIHx8IChidWZmZXIgPT0gTlVMTCAmJiB1c2VyU2l6ZSAhPSAwKSkgewogICAgICAgICAvLyBTYW5pdHktY2hlY2s6IHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCi0gICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXUgKCVkKSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMjY3LDcgKzE0MDEsOCBAQAogICAgIHdoaWxlICh1c2VyU2l6ZSA+PSBtRnJhbWVTaXplKSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSB1c2VyU2l6ZSAvIG1GcmFtZVNpemU7CiAKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgJkNsaWVudFByb3h5OjprRm9yZXZlcik7CisgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsCisgICAgICAgICAgICAgICAgYmxvY2tpbmcgPyAmQ2xpZW50UHJveHk6OmtGb3JldmVyIDogJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmcpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewogICAgICAgICAgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzYzLDcgKzE0OTgsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW5zZWNzX3QgQXVkaW9UcmFjazo6cHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+JiB0aHJlYWQpCituc2Vjc190IEF1ZGlvVHJhY2s6OnByb2Nlc3NBdWRpb0J1ZmZlcigpCiB7CiAgICAgLy8gQ3VycmVudGx5IHRoZSBBdWRpb1RyYWNrIHRocmVhZCBpcyBub3QgY3JlYXRlZCBpZiB0aGVyZSBhcmUgbm8gY2FsbGJhY2tzLgogICAgIC8vIFdvdWxkIGl0IGV2ZXIgbWFrZSBzZW5zZSB0byBydW4gdGhlIHRocmVhZCwgZXZlbiB3aXRob3V0IGNhbGxiYWNrcz8KQEAgLTE0MDEsNyArMTUzNiw3IEBACiAgICAgICAgIC8vIGZvciBvZmZsb2FkZWQgdHJhY2tzIHJlc3RvcmVUcmFja19sKCkgd2lsbCBqdXN0IHVwZGF0ZSB0aGUgc2VxdWVuY2UgYW5kIGNsZWFyCiAgICAgICAgIC8vIEF1ZGlvU3lzdGVtIGNhY2hlLiBXZSBzaG91bGQgbm90IGV4aXQgaGVyZSBidXQgYWZ0ZXIgY2FsbGluZyB0aGUgY2FsbGJhY2sgc28KICAgICAgICAgLy8gdGhhdCB0aGUgdXBwZXIgbGF5ZXJzIGNhbiByZWNyZWF0ZSB0aGUgdHJhY2sKLSAgICAgICAgaWYgKCFpc09mZmxvYWRlZCgpIHx8IChtU2VxdWVuY2UgPT0gbU9ic2VydmVkU2VxdWVuY2UpKSB7CisgICAgICAgIGlmICghaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1TZXF1ZW5jZSA9PSBtT2JzZXJ2ZWRTZXF1ZW5jZSkpIHsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlc3RvcmVUcmFja19sKCJwcm9jZXNzQXVkaW9CdWZmZXIiKTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgLy8gUnVuIGFnYWluIGltbWVkaWF0ZWx5LCBidXQgd2l0aCBhIG5ldyBJQXVkaW9UcmFjawpAQCAtMTQzMyw3ICsxNTY4LDcgQEAKICAgICB9CiAKICAgICAvLyBHZXQgY3VycmVudCBwb3NpdGlvbiBvZiBzZXJ2ZXIKLSAgICBzaXplX3QgcG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCk7CisgICAgc2l6ZV90IHBvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpOwogCiAgICAgLy8gTWFuYWdlIG1hcmtlciBjYWxsYmFjawogICAgIGJvb2wgbWFya2VyUmVhY2hlZCA9IGZhbHNlOwpAQCAtMTQ1Niw3ICsxNTkxLDcgQEAKICAgICAvLyBDYWNoZSBvdGhlciBmaWVsZHMgdGhhdCB3aWxsIGJlIG5lZWRlZCBzb29uCiAgICAgdWludDMyX3QgbG9vcFBlcmlvZCA9IG1Mb29wUGVyaW9kOwogICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKKyAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OwogICAgIGlmIChtUmVmcmVzaFJlbWFpbmluZykgewogICAgICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IGZhbHNlOwogICAgICAgICBtUmVtYWluaW5nRnJhbWVzID0gbm90aWZpY2F0aW9uRnJhbWVzOwpAQCAtMTQ5MSw2ICsxNjI2LDcgQEAKICAgICAgICAgICAgICAgICB3YWl0U3RyZWFtRW5kID0gbVN0YXRlID09IFNUQVRFX1NUT1BQSU5HOwogICAgICAgICAgICAgICAgIGlmICh3YWl0U3RyZWFtRW5kKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHdhaXRTdHJlYW1FbmQgJiYgc3RhdHVzICE9IERFQURfT0JKRUNUKSB7CkBAIC0xNTI3LDcgKzE2NjMsNyBAQAogICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IHNlcXVlbmNlOwogICAgICAgICBtQ2JmKEVWRU5UX05FV19JQVVESU9UUkFDSywgbVVzZXJEYXRhLCBOVUxMKTsKICAgICAgICAgLy8gZm9yIG9mZmxvYWRlZCB0cmFja3MsIGp1c3Qgd2FpdCBmb3IgdGhlIHVwcGVyIGxheWVycyB0byByZWNyZWF0ZSB0aGUgdHJhY2sKLSAgICAgICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5TX0lOQUNUSVZFOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU4NSwxMCArMTcyMSwxMCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0ldSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nOwogICAgICAgICBzaXplX3QgYXZhaWwgPSBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ICsgbm9uQ29udGlnOwotICAgICAgICBBTE9HVigib2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAldSA9ICV1ICsgJXUgZXJyICVkIiwKKyAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCiAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKQEAgLTE2MjAsMTIgKzE3NTYsMTEgQEAKICAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBzaXplX3Qgd3JpdHRlbkZyYW1lcyA9IHdyaXR0ZW5TaXplIC8gbUZyYW1lU2l6ZTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdCh3cml0dGVuU2l6ZSkgPCAwIHx8IHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICVkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgKGludCkgd3JpdHRlblNpemUpOworICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHdyaXR0ZW5TaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTY4NiwzNyArMTgyMSwzMSBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6cmVzdG9yZVRyYWNrX2woY29uc3QgY2hhciAqZnJvbSkKIHsKICAgICBBTE9HVygiZGVhZCBJQXVkaW9UcmFjaywgJXMsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLAotICAgICAgICAgIGlzT2ZmbG9hZGVkKCkgPyAiT2ZmbG9hZGVkIiA6ICJQQ00iLCBmcm9tKTsKKyAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKICAgICArK21TZXF1ZW5jZTsKICAgICBzdGF0dXNfdCByZXN1bHQ7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwotICAgIC8vIG91dHB1dCBwYXJhbWV0ZXJzIGluIGdldE91dHB1dF9sKCkgYW5kIGNyZWF0ZVRyYWNrX2woKQorICAgIC8vIG91dHB1dCBwYXJhbWV0ZXJzIGluIGNyZWF0ZVRyYWNrX2woKQogICAgIEF1ZGlvU3lzdGVtOjpjbGVhckF1ZGlvQ29uZmlnQ2FjaGUoKTsKIAotICAgIGlmIChpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CisgICAgICAgIC8vIEZJWE1FIHJlLWNyZWF0aW9uIG9mIG9mZmxvYWRlZCB0cmFja3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZAogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogCi0gICAgLy8gZm9yY2UgbmV3IG91dHB1dCBxdWVyeSBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyOwotICAgIG1PdXRwdXQgPSAwOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dF9sKCk7CisgICAgLy8gc2F2ZSB0aGUgb2xkIHN0YXRpYyBidWZmZXIgcG9zaXRpb24KKyAgICBzaXplX3QgYnVmZmVyUG9zaXRpb24gPSBtU3RhdGljUHJveHkgIT0gTlVMTCA/IG1TdGF0aWNQcm94eS0+Z2V0QnVmZmVyUG9zaXRpb24oKSA6IDA7CiAKLSAgICAvLyBpZiB0aGUgbmV3IElBdWRpb1RyYWNrIGlzIGNyZWF0ZWQsIGNyZWF0ZVRyYWNrX2woKSB3aWxsIG1vZGlmeSB0aGUKKyAgICAvLyBJZiBhIG5ldyBJQXVkaW9UcmFjayBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgY3JlYXRlVHJhY2tfbCgpIHdpbGwgbW9kaWZ5IHRoZQogICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9UcmFjaywgbUNibGtNZW1vcnkgYW5kIG1DYmxrLgotICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1RyYWNrIGFuZCBJTWVtb3J5CisgICAgLy8gSXQgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgc3Ryb25nIHJlZmVyZW5jZXMgb24gcHJldmlvdXMgSUF1ZGlvVHJhY2sgYW5kIElNZW1vcnkuCisgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KKyAgICByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKICAgICAvLyB0YWtlIHRoZSBmcmFtZXMgdGhhdCB3aWxsIGJlIGxvc3QgYnkgdHJhY2sgcmVjcmVhdGlvbiBpbnRvIGFjY291bnQgaW4gc2F2ZWQgcG9zaXRpb24KLSAgICBzaXplX3QgcG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtUHJveHktPmdldEZyYW1lc0ZpbGxlZCgpOwotICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbiA9IG1TdGF0aWNQcm94eSAhPSBOVUxMID8gbVN0YXRpY1Byb3h5LT5nZXRCdWZmZXJQb3NpdGlvbigpIDogMDsKLSAgICByZXN1bHQgPSBjcmVhdGVUcmFja19sKG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsICAvLyBzbyB0aGF0IGZyYW1lIGNvdW50IG5ldmVyIGdvZXMgZG93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIC8qZXBvY2gqLyk7CisgICAgKHZvaWQpIHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKKyAgICBtUG9zaXRpb24gPSBtUmVsZWFzZWQ7CiAKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIGNvbnRpbnVlIHBsYXliYWNrIGZyb20gbGFzdCBrbm93biBwb3NpdGlvbiwgYnV0CkBAIC0xNzQ0LDE3ICsxODczLDM1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAvL1VzZSBvZiBkaXJlY3QgYW5kIG9mZmxvYWRlZCBvdXRwdXQgc3RyZWFtcyBpcyByZWYgY291bnRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KLSAgICAgICAgLy8gQXMgZ2V0T3V0cHV0IHdhcyBjYWxsZWQgYWJvdmUgYW5kIHJlc3VsdGVkIGluIGFuIG91dHB1dCBzdHJlYW0gdG8gYmUgb3BlbmVkLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQuCi0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgIEFMT0dXKCJyZXN0b3JlVHJhY2tfbCgpIGZhaWxlZCBzdGF0dXMgJWQiLCByZXN1bHQpOwogICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICBtUmVsZWFzZWQgPSAwOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3VpbnQzMl90IEF1ZGlvVHJhY2s6OnVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKQoreworICAgIC8vIFRoaXMgaXMgdGhlIHNvbGUgcGxhY2UgdG8gcmVhZCBzZXJ2ZXIgY29uc3VtZWQgZnJhbWVzCisgICAgdWludDMyX3QgbmV3U2VydmVyID0gbVByb3h5LT5nZXRQb3NpdGlvbigpOworICAgIGludDMyX3QgZGVsdGEgPSBuZXdTZXJ2ZXIgLSBtU2VydmVyOworICAgIG1TZXJ2ZXIgPSBuZXdTZXJ2ZXI7CisgICAgLy8gVE9ETyBUaGVyZSBpcyBjb250cm92ZXJzeSBhYm91dCB3aGV0aGVyIHRoZXJlIGNhbiBiZSAibmVnYXRpdmUgaml0dGVyIiBpbiBzZXJ2ZXIgcG9zaXRpb24uCisgICAgLy8gICAgICBUaGlzIHNob3VsZCBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlciwgYW5kIGlmIHBvc3NpYmxlLCBpdCBzaG91bGQgYmUgYWRkcmVzc2VkLgorICAgIC8vICAgICAgQSBtb3JlIGRlZmluaXRlIGZhaWx1cmUgbW9kZSBpcyBpbmZyZXF1ZW50IHBvbGxpbmcgYnkgY2xpZW50LgorICAgIC8vICAgICAgT25lIGNvdWxkIGNhbGwgKHZvaWQpZ2V0UG9zaXRpb25fbCgpIGluIHJlbGVhc2VCdWZmZXIoKSwKKyAgICAvLyAgICAgIHNvIG1SZWxlYXNlZCBhbmQgbVBvc2l0aW9uIGFyZSBhbHdheXMgbG9jay1zdGVwIGFzIGJlc3QgcG9zc2libGUuCisgICAgLy8gICAgICBUaGF0IHNob3VsZCBlbnN1cmUgZGVsdGEgbmV2ZXIgZ29lcyBuZWdhdGl2ZSBmb3IgaW5mcmVxdWVudCBwb2xsaW5nCisgICAgLy8gICAgICB1bmxlc3MgdGhlIHNlcnZlciBoYXMgbW9yZSB0aGFuIDJeMzEgZnJhbWVzIGluIGl0cyBidWZmZXIsCisgICAgLy8gICAgICBpbiB3aGljaCBjYXNlIHRoZSB1c2Ugb2YgdWludDMyX3QgZm9yIHRoZXNlIGNvdW50ZXJzIGhhcyBiaWdnZXIgaXNzdWVzLgorICAgIGlmIChkZWx0YSA8IDApIHsKKyAgICAgICAgQUxPR0UoImRldGVjdGVkIGlsbGVnYWwgcmV0cm9ncmFkZSBtb3Rpb24gYnkgdGhlIHNlcnZlcjogbVNlcnZlciBhZHZhbmNlZCBieSAlZCIsIGRlbHRhKTsKKyAgICAgICAgZGVsdGEgPSAwOworICAgIH0KKyAgICByZXR1cm4gbVBvc2l0aW9uICs9ICh1aW50MzJfdCkgZGVsdGE7Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC0xNzY4LDI2ICsxOTE1LDEyOCBAQAogICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUgJiYgbVN0YXRlICE9IFNUQVRFX1BBVVNFRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgIGNhc2UgU1RBVEVfQUNUSVZFOgorICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICBicmVhazsgLy8gaGFuZGxlIGJlbG93CisgICAgY2FzZSBTVEFURV9GTFVTSEVEOgorICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGNhc2UgU1RBVEVfU1RPUFBJTkc6CisgICAgY2FzZSBTVEFURV9QQVVTRURfU1RPUFBJTkc6CisgICAgICAgIGlmICghaXNPZmZsb2FkZWRfbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIG9mZmxvYWRlZCB0cmFja3MgaGFuZGxlZCBiZWxvdworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIGJyZWFrOwogICAgIH0KKworICAgIC8vIFRoZSBwcmVzZW50ZWQgZnJhbWUgY291bnQgbXVzdCBhbHdheXMgbGFnIGJlaGluZCB0aGUgY29uc3VtZWQgZnJhbWUgY291bnQuCisgICAgLy8gVG8gYXZvaWQgYSByYWNlLCByZWFkIHRoZSBwcmVzZW50ZWQgZnJhbWVzIGZpcnN0LiAgVGhpcyBlbnN1cmVzIHRoYXQgcHJlc2VudGVkIDw9IGNvbnN1bWVkLgogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gKz0gbVByb3h5LT5nZXRFcG9jaCgpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IFdPVUxEX0JMT0NLLCAiZ2V0VGltZXN0YW1wIGVycm9yOiUjeCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgeworICAgICAgICBpZiAoaXNPZmZsb2FkZWRfbCgpICYmIChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEIHx8IG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSB7CisgICAgICAgICAgICAvLyB1c2UgY2FjaGVkIHBhdXNlZCBwb3NpdGlvbiBpbiBjYXNlIGFub3RoZXIgb2ZmbG9hZGVkIHRyYWNrIGlzIHJ1bm5pbmcuCisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gbVBhdXNlZFBvc2l0aW9uOworICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhIHBlbmRpbmcgZmx1c2ggb3Igc3RvcCBoYXMgY29tcGxldGVkLCBhcyB0aG9zZSBjb21tYW5kcyBtYXkKKyAgICAgICAgLy8gYmUgYXN5bmNocm9ub3VzIG9yIHJldHVybiBuZWFyIGZpbmlzaC4KKyAgICAgICAgaWYgKG1TdGFydFVzICE9IDAgJiYgbVNhbXBsZVJhdGUgIT0gMCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBrVGltZUppdHRlclVzID0gMTAwMDAwOyAvLyAxMDAgbXMKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgazFTZWNVcyA9IDEwMDAwMDA7CisKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZU5vdyA9IGdldE5vd1VzKCk7CisKKyAgICAgICAgICAgIGlmICh0aW1lTm93IDwgbVN0YXJ0VXMgKyBrMVNlY1VzKSB7IC8vIHdpdGhpbiBmaXJzdCBzZWNvbmQgb2Ygc3RhcnRpbmcKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVzdGFtcFRpbWVVcyA9IGNvbnZlcnRUaW1lc3BlY1RvVXModGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wVGltZVVzIDwgbVN0YXJ0VXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOyAgLy8gc3RhbGUgdGltZXN0YW1wIHRpbWUsIG9jY3VycyBiZWZvcmUgc3RhcnQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFUaW1lVXMgPSB0aW1lc3RhbXBUaW1lVXMgLSBtU3RhcnRVczsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhUG9zaXRpb25CeVVzID0gdGltZXN0YW1wLm1Qb3NpdGlvbiAqIDEwMDAwMDBMTCAvIG1TYW1wbGVSYXRlOworCisgICAgICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb25CeVVzID4gZGVsdGFUaW1lVXMgKyBrVGltZUppdHRlclVzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb3VudGVyIGNhbid0IGNvdW50IGZhc3RlciB0aGFuIHRoZSBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhcnQgdGltZS4gIElmIGdyZWF0ZXIsIHRoZW4gdGhhdCBtZWFucyB3ZSBoYXZlIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICAvLyB0byBjb21wbGV0ZWx5IGZsdXNoIG9yIHN0b3AgdGhlIHByZXZpb3VzIHBsYXlpbmcgdHJhY2suCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpbmNvbXBsZXRlIGZsdXNoIG9yIHN0b3A6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVsdGFUaW1lVXMoJWxsZCkgZGVsdGFQb3NpdGlvblVzKCVsbGQpIHRzbVBvc2l0aW9uKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVRpbWVVcywgKGxvbmcgbG9uZylkZWx0YVBvc2l0aW9uQnlVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGFydFVzID0gMDsgLy8gbm8gbmVlZCB0byBjaGVjayBhZ2Fpbiwgc3RhcnQgdGltZXN0YW1wIGhhcyBlaXRoZXIgZXhwaXJlZCBvciB1bm5lZWRlZC4KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgbWFwcGluZyBiZXR3ZWVuIGxvY2FsIGNvbnN1bWVkIChtUG9zaXRpb24pIGFuZCBzZXJ2ZXIgY29uc3VtZWQgKG1TZXJ2ZXIpCisgICAgICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CisgICAgICAgIC8vIFNlcnZlciBjb25zdW1lZCAobVNlcnZlcikgYW5kIHByZXNlbnRlZCBib3RoIHVzZSB0aGUgc2FtZSBzZXJ2ZXIgdGltZSBiYXNlLAorICAgICAgICAvLyBhbmQgc2VydmVyIGNvbnN1bWVkIGlzIGFsd2F5cyA+PSBwcmVzZW50ZWQuCisgICAgICAgIC8vIFRoZSBkZWx0YSBiZXR3ZWVuIHRoZXNlIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIGJ1ZmZlciBwaXBlbGluZS4KKyAgICAgICAgLy8gSWYgdGhpcyBkZWx0YSBiZXR3ZWVuIHRoZXNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY2xpZW50IHBvc2l0aW9uLCBpdCBtZWFucyB0aGF0CisgICAgICAgIC8vIGFjdHVhbGx5IHByZXNlbnRlZCBpcyBzdGlsbCBzdHVjayBhdCB0aGUgc3RhcnRpbmcgbGluZSAoZmlndXJhdGl2ZWx5IHNwZWFraW5nKSwKKyAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGZpcnN0IGZyYW1lIHRvIGdvIGJ5LiAgU28gd2UgY2FuJ3QgcmVwb3J0IGEgdmFsaWQgdGltZXN0YW1wIHlldC4KKyAgICAgICAgaWYgKCh1aW50MzJfdCkgKG1TZXJ2ZXIgLSB0aW1lc3RhbXAubVBvc2l0aW9uKSA+IG1Qb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIC8vIENvbnZlcnQgdGltZXN0YW1wIHBvc2l0aW9uIGZyb20gc2VydmVyIHRpbWUgYmFzZSB0byBjbGllbnQgdGltZSBiYXNlLgorICAgICAgICAvLyBUT0RPIFRoZSBmb2xsb3dpbmcgY29kZSBzaG91bGQgd29yayBPSyBub3cgYmVjYXVzZSB0aW1lc3RhbXAubVBvc2l0aW9uIGlzIDMyLWJpdC4KKyAgICAgICAgLy8gQnV0IGlmIHdlIGNoYW5nZSBpdCB0byA2NC1iaXQgdGhlbiB0aGlzIGNvdWxkIGZhaWwuCisgICAgICAgIC8vIElmIChtUG9zaXRpb24gLSBtU2VydmVyKSBjYW4gYmUgbmVnYXRpdmUgdGhlbiBzaG91bGQgdXNlOgorICAgICAgICAvLyAgIChpbnQzMl90KShtUG9zaXRpb24gLSBtU2VydmVyKQorICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uICs9IG1Qb3NpdGlvbiAtIG1TZXJ2ZXI7CisgICAgICAgIC8vIEltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCB0byBnZXRQb3NpdGlvbl9sKCksIG1Qb3NpdGlvbiBhbmQKKyAgICAgICAgLy8gbVNlcnZlciBib3RoIHJlcHJlc2VudCB0aGUgc2FtZSBmcmFtZSBwb3NpdGlvbi4gIG1Qb3NpdGlvbiBpcworICAgICAgICAvLyBpbiBjbGllbnQncyBwb2ludCBvZiB2aWV3LCBhbmQgbVNlcnZlciBpcyBpbiBzZXJ2ZXIncyBwb2ludCBvZgorICAgICAgICAvLyB2aWV3LiAgU28gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIGlzIHRoZSAiZnVkZ2UgZmFjdG9yIgorICAgICAgICAvLyBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHZpZXdzIGR1ZSB0byBzdG9wKCkgYW5kL29yIG5ldworICAgICAgICAvLyBJQXVkaW9UcmFjay4gIEFuZCB0aW1lc3RhbXAubVBvc2l0aW9uIGlzIGluaXRpYWxseSBpbiBzZXJ2ZXIncworICAgICAgICAvLyBwb2ludCBvZiB2aWV3LCBzbyB3ZSBuZWVkIHRvIGFwcGx5IHRoZSBzYW1lIGZ1ZGdlIGZhY3RvciB0byBpdC4KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogU3RyaW5nOCBBdWRpb1RyYWNrOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCiB7Ci0gICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKG1PdXRwdXQsIGtleXMpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dCgpOworICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKG91dHB1dCwga2V5cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKK2Jvb2wgQXVkaW9UcmFjazo6aXNPZmZsb2FkZWQoKSBjb25zdAoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gaXNPZmZsb2FkZWRfbCgpOworfQorCitib29sIEF1ZGlvVHJhY2s6OmlzRGlyZWN0KCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGlzRGlyZWN0X2woKTsKK30KKworYm9vbCBBdWRpb1RyYWNrOjppc09mZmxvYWRlZE9yRGlyZWN0KCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpOworfQorCisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSBjb25zdAogewogCiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC0xNzk2LDkgKzIwNDUsOSBAQAogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvVHJhY2s6OmR1bXBcbiIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICBtVm9sdW1lWzBdLCBtVm9sdW1lWzFdKTsKKyAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBmb3JtYXQoJWQpLCBjaGFubmVsIGNvdW50KCVkKSwgZnJhbWUgY291bnQoJWQpXG4iLCBtRm9ybWF0LAorICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBmb3JtYXQoJWQpLCBjaGFubmVsIGNvdW50KCVkKSwgZnJhbWUgY291bnQoJXp1KVxuIiwgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHNhbXBsZSByYXRlKCV1KSwgc3RhdHVzKCVkKVxuIiwgbVNhbXBsZVJhdGUsIG1TdGF0dXMpOwpAQCAtMTgxNSw5ICsyMDY0LDE0NiBAQAogICAgIHJldHVybiBtUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCk7CiB9CiAKK3ZvaWQgQXVkaW9UcmFjazo6c2V0QXR0cmlidXRlc0Zyb21TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeworICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gMHgwOworCisgICAgc3dpdGNoKHN0cmVhbVR5cGUpIHsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9ERUZBVUxUOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgIHw9IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKKyAgICAgICAgLy8gaW50ZW5kZWQgZmFsbCB0aHJvdWdoLCBhdHRyaWJ1dGVzIGluIGNvbW1vbiB3aXRoIFNUUkVBTV9TWVNURU0KKyAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfQUxBUk07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgfD0gQVVESU9fRkxBR19TQ087CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiaW52YWxpZCBzdHJlYW0gdHlwZSAlZCB3aGVuIGNvbnZlcnRpbmcgdG8gYXR0cmlidXRlcyIsIHN0cmVhbVR5cGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1RyYWNrOjpzZXRTdHJlYW1UeXBlRnJvbUF0dHJpYnV0ZXMoYXVkaW9fYXR0cmlidXRlc190JiBhYSkgeworICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBpZiAoKGFhLmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKGFhLmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgc3dpdGNoIChhYS51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICAvLyBUT0RPIG9uY2UgQXVkaW9Qb2xpY3lNYW5hZ2VyIGZ1bGx5IHN1cHBvcnRzIGF1ZGlvX2F0dHJpYnV0ZXNfdCwKKyAgICAgICAgLy8gICByZW1vdmUgc3RyZWFtIGNoYW5nZSBiYXNlZCBvbiBwaG9uZSBzdGF0ZQorICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSB7CisgICAgICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9SSU5HOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8vIEZBTEwgVEhST1VHSAorICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RUTUY7CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0FMQVJNOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9SSU5HOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorCitib29sIEF1ZGlvVHJhY2s6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKSB7CisgICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyYXRlZ3k/CisgICAgaWYgKChwYWEtPmZsYWdzICYgKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCB8IEFVRElPX0ZMQUdfU0NPKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBoYXMga25vd24gdXNhZ2U/CisgICAgc3dpdGNoIChwYWEtPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi12b2lkIEF1ZGlvVHJhY2s6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3ZvaWQgQXVkaW9UcmFjazo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPEF1ZGlvVHJhY2s+IGF1ZGlvVHJhY2sgPSBtQXVkaW9UcmFjay5wcm9tb3RlKCk7CiAgICAgaWYgKGF1ZGlvVHJhY2sgIT0gMCkgewpAQCAtMTg2MSw3ICsyMjQ3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBuc2Vjc190IG5zID0gbVJlY2VpdmVyLnByb2Nlc3NBdWRpb0J1ZmZlcih0aGlzKTsKKyAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG5zZWNzX3QgbnMgPSBtUmVjZWl2ZXIucHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAgICAgc3dpdGNoIChucykgewogICAgIGNhc2UgMDoKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xODc1LDcgKzIyNjQsNyBAQAogICAgICAgICBucyA9IDEwMDAwMDAwMDBMTDsKICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlbGxkIiwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCBjYWE3OTAwLi5lZWMwMjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMTksMTUgKzE5LDE1IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIi4uL3ByaXZhdGUvYmlvbmljX2Z1dGV4LmgiCi19CisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogYXVkaW9fdHJhY2tfY2Jsa190OjphdWRpb190cmFja19jYmxrX3QoKQotICAgIDogbVNlcnZlcigwKSwgZnJhbWVDb3VudF8oMCksIG1GdXRleCgwKSwgbU1pbmltdW0oMCksCi0gICAgbVZvbHVtZUxSKDB4MTAwMDEwMDApLCBtU2FtcGxlUmF0ZSgwKSwgbVNlbmRMZXZlbCgwKSwgbUZsYWdzKDApCisgICAgOiBtU2VydmVyKDApLCBtRnV0ZXgoMCksIG1NaW5pbXVtKDApLAorICAgIG1Wb2x1bWVMUihHQUlOX01JTklGTE9BVF9QQUNLRURfVU5JVFkpLCBtU2FtcGxlUmF0ZSgwKSwgbVNlbmRMZXZlbCgwKSwgbUZsYWdzKDApCiB7CiAgICAgbWVtc2V0KCZ1LCAwLCBzaXplb2YodSkpOwogfQpAQCAtMTM0LDEwICsxMzQsMTcgQEAKICAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOwotICAgICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwotICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgaWYgKG1Jc091dCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCwgbUZyYW1lQ291bnQ9JXp1KTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNodXR0aW5nIGRvd24iLCBmaWxsZWQsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBtSXNTaHV0ZG93biA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZvciBpbnB1dCwgc3luYyB1cCBvbiBvdmVycnVuCisgICAgICAgICAgICBmaWxsZWQgPSAwOworICAgICAgICAgICAgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCA9IHJlYXI7CisgICAgICAgICAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19PVkVSUlVOLCAmY2Jsay0+bUZsYWdzKTsKICAgICAgICAgfQogICAgICAgICAvLyBkb24ndCBhbGxvdyBmaWxsaW5nIHBpcGUgYmV5b25kIHRoZSBub21pbmFsIHNpemUKICAgICAgICAgc2l6ZV90IGF2YWlsID0gbUlzT3V0ID8gbUZyYW1lQ291bnQgLSBmaWxsZWQgOiBmaWxsZWQ7CkBAIC0yMDAsMTggKzIwNywxOCBAQAogICAgICAgICAgICAgdHMgPSAmcmVtYWluaW5nOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoIm9idGFpbkJ1ZmZlcigpIHRpbWVvdXQ9JWQiLCB0aW1lb3V0KTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIm9idGFpbkJ1ZmZlcigpIHRpbWVvdXQ9JWQiLCB0aW1lb3V0KTsKICAgICAgICAgICAgIHRzID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7Ci0gICAgICAgICAgICBpbnQgcmM7CiAgICAgICAgICAgICBpZiAobWVhc3VyZSAmJiAhYmVmb3JlSXNWYWxpZCkgewogICAgICAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYmVmb3JlKTsKICAgICAgICAgICAgICAgICBiZWZvcmVJc1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCByZXQgPSBfX2Z1dGV4X3N5c2NhbGw0KCZjYmxrLT5tRnV0ZXgsCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAogICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUlUX1BSSVZBVEUgOiBGVVRFWF9XQUlULCBvbGQgJiB+Q0JMS19GVVRFWF9XQUtFLCB0cyk7CiAgICAgICAgICAgICAvLyB1cGRhdGUgdG90YWwgZWxhcHNlZCB0aW1lIHNwZW50IHdhaXRpbmcKICAgICAgICAgICAgIGlmIChtZWFzdXJlKSB7CkBAIC0yMzAsMTYgKzIzNywxNiBAQAogICAgICAgICAgICAgICAgIGJlZm9yZSA9IGFmdGVyOwogICAgICAgICAgICAgICAgIGJlZm9yZUlzVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChyZXQpIHsKLSAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQotICAgICAgICAgICAgY2FzZSAtRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKLSAgICAgICAgICAgIGNhc2UgLUVJTlRSOiAgICAgICAgLy8gd2FpdCB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIG9yIG90aGVyIHNwdXJpb3VzIHdha2V1cAotICAgICAgICAgICAgY2FzZSAtRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCisgICAgICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQorICAgICAgICAgICAgY2FzZSBFV09VTERCTE9DSzogIC8vIGJlbmlnbiByYWNlIGNvbmRpdGlvbiB3aXRoIHNlcnZlcgorICAgICAgICAgICAgY2FzZSBFSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKKyAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCiAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhlc2UgZXJyb3Ivbm9uLTAgc3RhdHVzIGFyZSBiZWluZyBkcm9wcGVkCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyB1bmV4cGVjdGVkIGVycm9yICVkIiwgX19mdW5jX18sIHJldCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLXJldDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihzdGF0dXMpKTsKICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjk1LDcgKzMwMiw3IEBACiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgaWYgKCEoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmY2Jsay0+bUZsYWdzKSAmIENCTEtfSU5WQUxJRCkpIHsKICAgICAgICAgLy8gaXQgc2VlbXMgdGhhdCBhIEZVVEVYX1dBS0VfUFJJVkFURSB3aWxsIG5vdCB3YWtlIGEgRlVURVhfV0FJVCwgZXZlbiB3aXRoaW4gc2FtZSBwcm9jZXNzCi0gICAgICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCisgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCiAgICAgICAgICAgICAgICAgMSk7CiAgICAgfQogfQpAQCAtMzA0LDcgKzMxMSw3IEBACiB7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgaWYgKCEoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlRFUlJVUFQsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19JTlRFUlJVUFQpKSB7Ci0gICAgICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCisgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCiAgICAgICAgICAgICAgICAgMSk7CiAgICAgfQogfQpAQCAtMzMxLDcgKzMzOCw3IEBACiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOworICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHVybiAoc2l6ZV90KWZpbGxlZDsKQEAgLTQyOSwyNCArNDM2LDI0IEBACiAgICAgICAgICAgICB0cyA9ICZyZW1haW5pbmc7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgid2FpdFN0cmVhbUVuZERvbmUoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJ3YWl0U3RyZWFtRW5kRG9uZSgpIHRpbWVvdXQ9JWQiLCB0aW1lb3V0KTsKICAgICAgICAgICAgIHRzID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7Ci0gICAgICAgICAgICBpbnQgcmM7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gX19mdXRleF9zeXNjYWxsNCgmY2Jsay0+bUZ1dGV4LAorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FJVF9QUklWQVRFIDogRlVURVhfV0FJVCwgb2xkICYgfkNCTEtfRlVURVhfV0FLRSwgdHMpOwotICAgICAgICAgICAgc3dpdGNoIChyZXQpIHsKLSAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQotICAgICAgICAgICAgY2FzZSAtRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKLSAgICAgICAgICAgIGNhc2UgLUVJTlRSOiAgICAgICAgLy8gd2FpdCB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIG9yIG90aGVyIHNwdXJpb3VzIHdha2V1cAotICAgICAgICAgICAgY2FzZSAtRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCisgICAgICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQorICAgICAgICAgICAgY2FzZSBFV09VTERCTE9DSzogIC8vIGJlbmlnbiByYWNlIGNvbmRpdGlvbiB3aXRoIHNlcnZlcgorICAgICAgICAgICAgY2FzZSBFSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKKyAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyB1bmV4cGVjdGVkIGVycm9yICVkIiwgX19mdW5jX18sIHJldCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLXJldDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihzdGF0dXMpKTsKICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDcwLDE0ICs0NzcsMTkgQEAKIAogdm9pZCBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmZsdXNoKCkKIHsKLSAgICBMT0dfRkFUQUwoInN0YXRpYyBmbHVzaCIpOworICAgIExPR19BTFdBWVNfRkFUQUwoInN0YXRpYyBmbHVzaCIpOwogfQogCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c2V0TG9vcChzaXplX3QgbG9vcFN0YXJ0LCBzaXplX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKIHsKKyAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBvbiBhIDY0LWJpdCBjbGllbnQKKyAgICBpZiAobG9vcFN0YXJ0ID4gVUlOVDMyX01BWCB8fCBsb29wRW5kID4gVUlOVDMyX01BWCkgeworICAgICAgICAvLyBGSVhNRSBTaG91bGQgcmV0dXJuIGFuIGVycm9yIHN0YXR1cworICAgICAgICByZXR1cm47CisgICAgfQogICAgIFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSBuZXdTdGF0ZTsKLSAgICBuZXdTdGF0ZS5tTG9vcFN0YXJ0ID0gbG9vcFN0YXJ0OwotICAgIG5ld1N0YXRlLm1Mb29wRW5kID0gbG9vcEVuZDsKKyAgICBuZXdTdGF0ZS5tTG9vcFN0YXJ0ID0gKHVpbnQzMl90KSBsb29wU3RhcnQ7CisgICAgbmV3U3RhdGUubUxvb3BFbmQgPSAodWludDMyX3QpIGxvb3BFbmQ7CiAgICAgbmV3U3RhdGUubUxvb3BDb3VudCA9IGxvb3BDb3VudDsKICAgICBtQnVmZmVyUG9zaXRpb24gPSBsb29wU3RhcnQ7CiAgICAgKHZvaWQpIG1NdXRhdG9yLnB1c2gobmV3U3RhdGUpOwpAQCAtNDg3LDcgKzQ5OSw3IEBACiB7CiAgICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uOwogICAgIGlmIChtTXV0YXRvci5hY2soKSkgewotICAgICAgICBidWZmZXJQb3NpdGlvbiA9IG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uOworICAgICAgICBidWZmZXJQb3NpdGlvbiA9IChzaXplX3QpIG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uOwogICAgICAgICBpZiAoYnVmZmVyUG9zaXRpb24gPiBtRnJhbWVDb3VudCkgewogICAgICAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBtRnJhbWVDb3VudDsKICAgICAgICAgfQpAQCAtNTMwLDcgKzU0Miw3IEBACiAgICAgICAgICAgICBpZiAoZnJvbnQgIT0gcmVhcikgewogICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTQzLDcgKzU1NSw3IEBACiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSVkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CisgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOwogICAgICAgICBtSXNTaHV0ZG93biA9IHRydWU7CiAgICAgfQogICAgIGlmIChtSXNTaHV0ZG93bikgewpAQCAtNjE2LDEzICs2MjgsMTMgQEAKICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShzdGVwQ291bnQgKyByZWFyLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKICAgICB9CiAKLSAgICBtQ2Jsay0+bVNlcnZlciArPSBzdGVwQ291bnQ7CisgICAgY2Jsay0+bVNlcnZlciArPSBzdGVwQ291bnQ7CiAKICAgICBzaXplX3QgaGFsZiA9IG1GcmFtZUNvdW50IC8gMjsKICAgICBpZiAoaGFsZiA9PSAwKSB7CiAgICAgICAgIGhhbGYgPSAxOwogICAgIH0KLSAgICBzaXplX3QgbWluaW11bSA9IGNibGstPm1NaW5pbXVtOworICAgIHNpemVfdCBtaW5pbXVtID0gKHNpemVfdCkgY2Jsay0+bU1pbmltdW07CiAgICAgaWYgKG1pbmltdW0gPT0gMCkgewogICAgICAgICBtaW5pbXVtID0gbUlzT3V0ID8gaGFsZiA6IDE7CiAgICAgfSBlbHNlIGlmIChtaW5pbXVtID4gaGFsZikgewpAQCAtNjMwLDEwICs2NDIsMTAgQEAKICAgICB9CiAgICAgLy8gRklYTUUgQXVkaW9SZWNvcmQgd2FrZXVwIG5lZWRzIHRvIGJlIG9wdGltaXplZDsgaXQgY3VycmVudGx5IHdha2VzIHVwIGNsaWVudCBldmVyeSB0aW1lCiAgICAgaWYgKCFtSXNPdXQgfHwgKG1BdmFpbFRvQ2xpZW50ICsgc3RlcENvdW50ID49IG1pbmltdW0pKSB7Ci0gICAgICAgIEFMT0dWKCJtQXZhaWxUb0NsaWVudD0ldSBzdGVwQ291bnQ9JXUgbWluaW11bT0ldSIsIG1BdmFpbFRvQ2xpZW50LCBzdGVwQ291bnQsIG1pbmltdW0pOworICAgICAgICBBTE9HVigibUF2YWlsVG9DbGllbnQ9JXp1IHN0ZXBDb3VudD0lenUgbWluaW11bT0lenUiLCBtQXZhaWxUb0NsaWVudCwgc3RlcENvdW50LCBtaW5pbXVtKTsKICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7Ci0gICAgICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LAorICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgMSk7CiAgICAgICAgIH0KICAgICB9CkBAIC02NjMsNyArNjc1LDcgQEAKICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOworICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC02NzQsMTAgKzY4NiwxMSBAQAogfQogCiBib29sICBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnNldFN0cmVhbUVuZERvbmUoKSB7CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgYm9vbCBvbGQgPQotICAgICAgICAgICAgKGFuZHJvaWRfYXRvbWljX29yKENCTEtfU1RSRUFNX0VORF9ET05FLCAmbUNibGstPm1GbGFncykgJiBDQkxLX1NUUkVBTV9FTkRfRE9ORSkgIT0gMDsKKyAgICAgICAgICAgIChhbmRyb2lkX2F0b21pY19vcihDQkxLX1NUUkVBTV9FTkRfRE9ORSwgJmNibGstPm1GbGFncykgJiBDQkxLX1NUUkVBTV9FTkRfRE9ORSkgIT0gMDsKICAgICBpZiAoIW9sZCkgewotICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmbUNibGstPm1GdXRleCwgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwKKyAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwKICAgICAgICAgICAgICAgICAxKTsKICAgICB9CiAgICAgcmV0dXJuIG9sZDsKQEAgLTY4NSwxMCArNjk4LDExIEBACiAKIHZvaWQgQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQpCiB7Ci0gICAgbUNibGstPnUubVN0cmVhbWluZy5tVW5kZXJydW5GcmFtZXMgKz0gZnJhbWVDb3VudDsKKyAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKKyAgICBjYmxrLT51Lm1TdHJlYW1pbmcubVVuZGVycnVuRnJhbWVzICs9IGZyYW1lQ291bnQ7CiAKICAgICAvLyBGSVhNRSBhbHNvIHdha2UgZnV0ZXggc28gdGhhdCB1bmRlcnJ1biBpcyBub3RpY2VkIG1vcmUgcXVpY2tseQotICAgICh2b2lkKSBhbmRyb2lkX2F0b21pY19vcihDQkxLX1VOREVSUlVOLCAmbUNibGstPm1GbGFncyk7CisgICAgKHZvaWQpIGFuZHJvaWRfYXRvbWljX29yKENCTEtfVU5ERVJSVU4sICZjYmxrLT5tRmxhZ3MpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc2MCwxMiArNzc0LDEzIEBACiAgICAgICAgICAgICBtSXNTaHV0ZG93biA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gKHNzaXplX3QpIE5PX0lOSVQ7CiAgICAgICAgIH0KLSAgICAgICAgbUNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgLy8gVGhpcyBtYXkgb3ZlcmZsb3csIGJ1dCBjbGllbnQgaXMgbm90IHN1cHBvc2VkIHRvIHJlbHkgb24gaXQKKyAgICAgICAgbUNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSAodWludDMyX3QpIHBvc2l0aW9uOwogICAgIH0KICAgICByZXR1cm4gKHNzaXplX3QpIHBvc2l0aW9uOwogfQogCi1zdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCkKK3N0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBib29sIGFja0ZsdXNoIF9fdW51c2VkKQogewogICAgIGlmIChtSXNTaHV0ZG93bikgewogICAgICAgICBidWZmZXItPm1GcmFtZUNvdW50ID0gMDsKQEAgLTgxOSw3ICs4MzQsNyBAQAogICAgIHNpemVfdCBuZXdQb3NpdGlvbiA9IHBvc2l0aW9uICsgc3RlcENvdW50OwogICAgIGludDMyX3Qgc2V0RmxhZ3MgPSAwOwogICAgIGlmICghKHBvc2l0aW9uIDw9IG5ld1Bvc2l0aW9uICYmIG5ld1Bvc2l0aW9uIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICBBTE9HVygiJXMgbmV3UG9zaXRpb24gJXUgb3V0c2lkZSBbJXUsICV1XSIsIF9fZnVuY19fLCBuZXdQb3NpdGlvbiwgcG9zaXRpb24sIG1GcmFtZUNvdW50KTsKKyAgICAgICAgQUxPR1coIiVzIG5ld1Bvc2l0aW9uICV6dSBvdXRzaWRlIFslenUsICV6dV0iLCBfX2Z1bmNfXywgbmV3UG9zaXRpb24sIHBvc2l0aW9uLCBtRnJhbWVDb3VudCk7CiAgICAgICAgIG5ld1Bvc2l0aW9uID0gbUZyYW1lQ291bnQ7CiAgICAgfSBlbHNlIGlmIChtU3RhdGUubUxvb3BDb3VudCAhPSAwICYmIG5ld1Bvc2l0aW9uID09IG1TdGF0ZS5tTG9vcEVuZCkgewogICAgICAgICBpZiAobVN0YXRlLm1Mb29wQ291bnQgPT0gLTEgfHwgLS1tU3RhdGUubUxvb3BDb3VudCAhPSAwKSB7CkBAIC04MzYsNyArODUxLDggQEAKICAgICBtUG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKIAogICAgIGNibGstPm1TZXJ2ZXIgKz0gc3RlcENvdW50OwotICAgIGNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKKyAgICAvLyBUaGlzIG1heSBvdmVyZmxvdywgYnV0IGNsaWVudCBpcyBub3Qgc3VwcG9zZWQgdG8gcmVseSBvbiBpdAorICAgIGNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSAodWludDMyX3QpIG5ld1Bvc2l0aW9uOwogICAgIGlmIChzZXRGbGFncyAhPSAwKSB7CiAgICAgICAgICh2b2lkKSBhbmRyb2lkX2F0b21pY19vcihzZXRGbGFncywgJmNibGstPm1GbGFncyk7CiAgICAgICAgIC8vIHRoaXMgd291bGQgYmUgYSBnb29kIHBsYWNlIHRvIHdha2UgYSBmdXRleApAQCAtODQ3LDcgKzg2Myw3IEBACiAgICAgYnVmZmVyLT5tTm9uQ29udGlnID0gMDsKIH0KIAotdm9pZCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXModWludDMyX3QgZnJhbWVDb3VudCkKK3ZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQgX191bnVzZWQpCiB7CiAgICAgLy8gVW5saWtlIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcygpIHVzZWQgZm9yIHN0cmVhbWluZyB0cmFja3MsCiAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhIGxvY2F0aW9uIHRvIGNvdW50IHVuZGVycnVuIGZyYW1lcy4gIFRoZSB1bmRlcnJ1biBmcmFtZSBjb3VudGVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTk0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2hhcmFjdGVyRW5jb2RpbmdEZWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CisjaW5jbHVkZSAiQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oIgorCisjaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCisjaW5jbHVkZSAiU3RyaW5nQXJyYXkuaCIKKworI2luY2x1ZGUgInVuaWNvZGUvdWNudi5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNzZGV0LmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvcjo6Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcigpIHsKKworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIG1VdGY4Q29udiA9IHVjbnZfb3BlbigiVVRGLTgiLCAmc3RhdHVzKTsKKyAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBjcmVhdGUgVUNvbnZlcnRlciBmb3IgVVRGLTgiKTsKKyAgICAgICAgbVV0ZjhDb252ID0gTlVMTDsKKyAgICB9Cit9CisKK0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6On5DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCkgeworICAgIHVjbnZfY2xvc2UobVV0ZjhDb252KTsKK30KKwordm9pZCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjphZGRUYWcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBtTmFtZXMucHVzaF9iYWNrKG5hbWUpOworICAgIG1WYWx1ZXMucHVzaF9iYWNrKHZhbHVlKTsKK30KKworc2l6ZV90IENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OnNpemUoKSB7CisgICAgcmV0dXJuIG1OYW1lcy5zaXplKCk7Cit9CisKK3N0YXR1c190IENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmdldFRhZyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyKip2YWx1ZSkgeworICAgIGlmIChpbmRleCA+PSBtTmFtZXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaW5kZXgpOworICAgICp2YWx1ZSA9IG1WYWx1ZXMuZ2V0RW50cnkoaW5kZXgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIGJvb2wgaXNQcmludGFibGVBc2NpaShjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IGxlbikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCh2YWx1ZVtpXSAmIDB4ODApIHx8IHZhbHVlW2ldIDwgMHgyMCB8fCB2YWx1ZVtpXSA9PSAweDdmKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvcjo6ZGV0ZWN0QW5kQ29udmVydCgpIHsKKworICAgIGludCBzaXplID0gbU5hbWVzLnNpemUoKTsKKyAgICBBTE9HVigiJWQgdGFncyBiZWZvcmUgY29udmVyc2lvbiIsIHNpemUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIlczogJXMiLCBtTmFtZXMuZ2V0RW50cnkoaSksIG1WYWx1ZXMuZ2V0RW50cnkoaSkpOworICAgIH0KKworICAgIGlmIChzaXplICYmIG1VdGY4Q29udikgeworCisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBVQ2hhcnNldERldGVjdG9yICpjc2QgPSB1Y3NkZXRfb3Blbigmc3RhdHVzKTsKKyAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCAqdWNtOworCisgICAgICAgIC8vIHRyeSBjb21iaW5lZCBkZXRlY3Rpb24gb2YgYXJ0aXN0L2FsYnVtL3RpdGxlIGV0Yy4KKyAgICAgICAgY2hhciBidWZbMTAyNF07CisgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIGJvb2wgYWxscHJpbnRhYmxlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSA9IG1WYWx1ZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICBpZiAoIWlzUHJpbnRhYmxlQXNjaWkodmFsdWUsIHN0cmxlbih2YWx1ZSkpICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJjb21wb3NlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJnZW5yZSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJ0aXRsZSIpKSkgeworICAgICAgICAgICAgICAgIHN0cmxjYXQoYnVmLCB2YWx1ZSwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIHRhZ3MgYnkgc3BhY2Ugc28gSUNVJ3MgbmdyYW0gZGV0ZWN0b3IgY2FuIGRvIGl0cyBqb2IKKyAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgIiAiLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgYWxscHJpbnRhYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpjb21iaW5lZGVuYyA9ICJVVEYtOCI7CisgICAgICAgIGlmIChhbGxwcmludGFibGUpIHsKKyAgICAgICAgICAgIC8vIHNpbmNlICdidWYnIGlzIGVtcHR5LCBJQ1Ugd291bGQgcmV0dXJuIGEgVVRGLTggbWF0Y2hlciB3aXRoIGxvdyBjb25maWRlbmNlLCBzbworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBldmVuIGNhbGwgaXQKKyAgICAgICAgICAgIEFMT0dWKCJhbGwgdGFncyBhcmUgcHJpbnRhYmxlLCBhc3N1bWluZyBhc2NpaSAoJXp1KSIsIHN0cmxlbihidWYpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVjc2RldF9zZXRUZXh0KGNzZCwgYnVmLCBzdHJsZW4oYnVmKSwgJnN0YXR1cyk7CisgICAgICAgICAgICBpbnQzMl90IG1hdGNoZXM7CisgICAgICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoKiogdWNtYSA9IHVjc2RldF9kZXRlY3RBbGwoY3NkLCAmbWF0Y2hlcywgJnN0YXR1cyk7CisgICAgICAgICAgICBib29sIGdvb2RtYXRjaCA9IHRydWU7CisgICAgICAgICAgICBpbnQgaGlnaGVzdCA9IDA7CisgICAgICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoKiBiZXN0Q29tYmluZWRNYXRjaCA9IGdldFByZWZlcnJlZChidWYsIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICB1Y21hLCBtYXRjaGVzLCAmZ29vZG1hdGNoLCAmaGlnaGVzdCk7CisKKyAgICAgICAgICAgIEFMT0dWKCJnb29kbWF0Y2g6ICVzLCBoaWdoZXN0OiAlZCIsIGdvb2RtYXRjaCA/ICJ0cnVlIiA6ICJmYWxzZSIsIGhpZ2hlc3QpOworICAgICAgICAgICAgaWYgKCFnb29kbWF0Y2ggJiYgKGhpZ2hlc3QgPCAxNSB8fCBzdHJsZW4oYnVmKSA8IDIwKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJub3QgYSBnb29kIG1hdGNoLCB0cnlpbmcgd2l0aCBtb3JlIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHN0cmluZyBtaWdodCBiZSB0b28gc2hvcnQgZm9yIElDVSB0byBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aC4KKyAgICAgICAgICAgICAgICAvLyAocmVhbCB3b3JsZCBleGFtcGxlOiAiQmrDtnJrIiBpbiBJU08tODg1OS0xIG1pZ2h0IGJlIGRldGVjdGVkIGFzIEdCMTgwMzAsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyAgdGhlIElTTyBkZXRlY3RvciByZXBvcnRzIGEgY29uZmlkZW5jZSBvZiAwLCB3aGlsZSB0aGUgR0IxODAzMCBkZXRlY3RvciByZXBvcnRzCisgICAgICAgICAgICAgICAgLy8gIGEgY29uZmlkZW5jZSBvZiAxMCB3aXRoIG5vIGludmFsaWQgY2hhcmFjdGVycykKKyAgICAgICAgICAgICAgICAvLyBBcHBlbmQgYXJ0aXN0LCBhbGJ1bSBhbmQgdGl0bGUgaWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgb21pdHRlZCBiZWNhdXNlIHRoZXkKKyAgICAgICAgICAgICAgICAvLyB3ZXJlIHByaW50YWJsZSBhc2NpaS4KKyAgICAgICAgICAgICAgICBib29sIGFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1OYW1lcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUgPSBtVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcmludGFibGVBc2NpaSh2YWx1ZSwgc3RybGVuKHZhbHVlKSkgJiYgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgInRpdGxlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgdmFsdWUsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoYnVmLCAiICIsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdWNzZGV0X3NldFRleHQoY3NkLCBidWYsIHN0cmxlbihidWYpLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgdWNtYSA9IHVjc2RldF9kZXRlY3RBbGwoY3NkLCAmbWF0Y2hlcywgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGJlc3RDb21iaW5lZE1hdGNoID0gZ2V0UHJlZmVycmVkKGJ1Ziwgc3RybGVuKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNtYSwgbWF0Y2hlcywgJmdvb2RtYXRjaCwgJmhpZ2hlc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWdvb2RtYXRjaCAmJiBoaWdoZXN0IDw9IDE1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RpbGwgbm90IGEgZ29vZCBtYXRjaCBhZnRlciBhZGRpbmcgcHJpbnRhYmxlIHRhZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RDb21iaW5lZE1hdGNoID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJubyBwcmludGFibGUgdGFncyB0byBhZGQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiZXN0Q29tYmluZWRNYXRjaCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29tYmluZWRlbmMgPSB1Y3NkZXRfZ2V0TmFtZShiZXN0Q29tYmluZWRNYXRjaCwgJnN0YXR1cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbWJpbmVkZW5jID0gIklTTy04ODU5LTEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICB1aW50OF90KiBzcmMgPSAodWludDhfdCAqKW1WYWx1ZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICBpbnQgbGVuID0gc3RybGVuKChjaGFyICopc3JjKTsKKyAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QgPSBzcmM7CisKKyAgICAgICAgICAgIEFMT0dWKCJAQEAgY2hlY2tpbmcgJXMiLCBuYW1lKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBtVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgaW50MzJfdCBpbnB1dExlbmd0aCA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuYzsKKworICAgICAgICAgICAgaWYgKCFhbGxwcmludGFibGUgJiYgKCFzdHJjbXAobmFtZSwgImFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFsYnVtYXJ0aXN0IikgfHwKKyAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiY29tcG9zZXIiKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJnZW5yZSIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFsYnVtIikgfHwKKyAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAidGl0bGUiKSkpIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgZW5jb2RpbmcgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjb21iaW5hdGlvbiBvZiBhcnRpc3QvYWxidW0vdGl0bGUgZXRjLgorICAgICAgICAgICAgICAgIGVuYyA9IGNvbWJpbmVkZW5jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNQcmludGFibGVBc2NpaShzLCBpbnB1dExlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jID0gIlVURi04IjsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkBAQEAgJXMgaXMgYXNjaWkiLCBtTmFtZXMuZ2V0RW50cnkoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVjc2RldF9zZXRUZXh0KGNzZCwgcywgaW5wdXRMZW5ndGgsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB1Y20gPSB1Y3NkZXRfZGV0ZWN0KGNzZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghdWNtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVzLnNldEVudHJ5KGksICI/Pz8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVuYyA9IHVjc2RldF9nZXROYW1lKHVjbSwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJAQEBAIHJlY29nbml6ZWQgY2hhcnNldDogJXMgZm9yICVzIGNvbmZpZGVuY2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYywgbU5hbWVzLmdldEVudHJ5KGkpLCB1Y3NkZXRfZ2V0Q29uZmlkZW5jZSh1Y20sICZzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZW5jLCJVVEYtOCIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IGNvbnZlcnQgaWYgdGhlIHNvdXJjZSBlbmNvZGluZyBpc24ndCBhbHJlYWR5IFVURi04CisgICAgICAgICAgICAgICAgQUxPR1YoIkBAQCB1c2luZyBjb252ZXJ0ZXIgJXMgZm9yICVzIiwgZW5jLCBtTmFtZXMuZ2V0RW50cnkoaSkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgICAgICBVQ29udmVydGVyICpjb252ID0gdWNudl9vcGVuKGVuYywgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yICVzICglZCksIGZhbGxpbmcgYmFjayB0byBJU08tODg1OS0xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgY29udiA9IHVjbnZfb3BlbigiSVNPLTg4NTktMSIsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yIElTTy04ODU5LTEgZWl0aGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBuYXRpdmUgZW5jb2RpbmcgdG8gVVRGLTgKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzb3VyY2UgPSBtVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgICAgIGludCB0YXJnZXRMZW5ndGggPSBsZW4gKiAzICsgMTsKKyAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSBuZXcgY2hhclt0YXJnZXRMZW5ndGhdOworICAgICAgICAgICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNoZWNrIGZvciBOVUxMLCBidXQgaW4gdGhpcyBjYXNlIHRhcmdldExlbmd0aCBtYXkgYmUgbGFyZ2UKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2hhciogdGFyZ2V0ID0gYnVmZmVyOworCisgICAgICAgICAgICAgICAgdWNudl9jb252ZXJ0RXgobVV0ZjhDb252LCBjb252LCAmdGFyZ2V0LCB0YXJnZXQgKyB0YXJnZXRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlLCBzb3VyY2UgKyBzdHJsZW4oc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIFRSVUUsIFRSVUUsICZzdGF0dXMpOworCisgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1Y252X2NvbnZlcnRFeCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVZhbHVlcy5zZXRFbnRyeShpLCAiPz8/Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gemVybyB0ZXJtaW5hdGUKKyAgICAgICAgICAgICAgICAgICAgKnRhcmdldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIHRyYWlsaW5nIHNwYWNlcworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS10YXJnZXQgPiBidWZmZXIgJiYgKnRhcmdldCA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICp0YXJnZXQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgbGVhZGluZyBzcGFjZXMKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RhcnQgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqc3RhcnQgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1WYWx1ZXMuc2V0RW50cnkoaSwgc3RhcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIHVjbnZfY2xvc2UoY29udik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAoc3RybGVuKG1WYWx1ZXMuZ2V0RW50cnkoaSkpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZXJhc2luZyAlcyBiZWNhdXNlIGVudHJ5IGlzIGVtcHR5IiwgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICBtTmFtZXMuZXJhc2UoaSk7CisgICAgICAgICAgICAgICAgbVZhbHVlcy5lcmFzZShpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVjc2RldF9jbG9zZShjc2QpOworICAgIH0KK30KKworLyoKKyAqIFdoZW4gSUNVIGRldGVjdHMgbXVsdGlwbGUgZW5jb2RpbmcgbWF0Y2hlcywgYXBwbHkgYWRkaXRpb25hbCBoZXVyaXN0aWNzIHRvIGRldGVybWluZQorICogd2hpY2ggb25lIGlzIHRoZSBiZXN0IG1hdGNoLCBzaW5jZSBJQ1UgY2FuJ3QgYWx3YXlzIGJlIHRydXN0ZWQgdG8gbWFrZSB0aGUgcmlnaHQgY2hvaWNlLgorICoKKyAqIFdoYXQgdGhpcyBtZXRob2QgZG9lcyBpczoKKyAqIC0gZGVjb2RlIHRoZSBpbnB1dCB1c2luZyBlYWNoIG9mIHRoZSBtYXRjaGVzIGZvdW5kCisgKiAtIHJlY2FsY3VsYXRlIHRoZSBzdGFydGluZyBjb25maWRlbmNlIGxldmVsIGZvciBtdWx0aWJ5dGUgZW5jb2RpbmdzIHVzaW5nIGEgZGlmZmVyZW50CisgKiAgIGFsZ29yaXRobSBhbmQgbGFyZ2VyIGZyZXF1ZW50IGNoYXJhY3RlciBsaXN0cyB0aGFuIElDVQorICogLSBkZXZhbHVlIGVuY29kaW5nIHdoZXJlIHRoZSBjb252ZXJzaW9uIGNvbnRhaW5zIHVubGlrZWx5IGNoYXJhY3RlcnMgKHN5bWJvbHMsIHJlc2VydmVkLCBldGMpCisgKiAtIHBpY2sgdGhlIGhpZ2hlc3QgbWF0Y2gKKyAqIC0gc2lnbmFsIHRvIHRoZSBjYWxsZXIgd2hldGhlciB0aGlzIG1hdGNoIGlzIGNvbnNpZGVyZWQgZ29vZDogY29uZmlkZW5jZSA+IDE1LCBhbmQgY29uZmlkZW5jZQorICogICBkZWx0YSB3aXRoIHRoZSBuZXh0IHJ1bm5lciB1cCA+IDE1CisgKi8KK2NvbnN0IFVDaGFyc2V0TWF0Y2ggKkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmdldFByZWZlcnJlZCgKKyAgICAgICAgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBsZW4sCisgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hLCBzaXplX3QgbnVtbWF0Y2hlcywKKyAgICAgICAgYm9vbCAqZ29vZG1hdGNoLCBpbnQgKmhpZ2hlc3RtYXRjaCkgeworCisgICAgKmdvb2RtYXRjaCA9IGZhbHNlOworICAgIFZlY3Rvcjxjb25zdCBVQ2hhcnNldE1hdGNoKj4gbWF0Y2hlczsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKworICAgIEFMT0dWKCIlenUgbWF0Y2hlcyIsIG51bW1hdGNoZXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtbWF0Y2hlczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmVuY25hbWUgPSB1Y3NkZXRfZ2V0TmFtZSh1Y21hW2ldLCAmc3RhdHVzKTsKKyAgICAgICAgaW50IGNvbmZpZGVuY2UgPSB1Y3NkZXRfZ2V0Q29uZmlkZW5jZSh1Y21hW2ldLCAmc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIiV6dTogJXMgJWQiLCBpLCBlbmNuYW1lLCBjb25maWRlbmNlKTsKKyAgICAgICAgbWF0Y2hlcy5wdXNoX2JhY2sodWNtYVtpXSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bSA9IG1hdGNoZXMuc2l6ZSgpOworICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG51bSA9PSAxKSB7CisgICAgICAgIGludCBjb25maWRlbmNlID0gdWNzZGV0X2dldENvbmZpZGVuY2UobWF0Y2hlc1swXSwgJnN0YXR1cyk7CisgICAgICAgIGlmIChjb25maWRlbmNlID4gMTUpIHsKKyAgICAgICAgICAgICpnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaGVzWzBdOworICAgIH0KKworICAgIEFMT0dWKCJjb25zaWRlcmluZyAlenUgbWF0Y2hlcyIsIG51bSk7CisKKyAgICAvLyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55ICJzcGVjaWFsIiBjaGFyYWN0ZXJzIHJlc3VsdCB3aGVuIGNvbnZlcnRpbmcgdGhlIGlucHV0IHVzaW5nIGVhY2gKKyAgICAvLyBlbmNvZGluZworICAgIFZlY3RvcjxpbnQ+IG5ld2NvbmZpZGVuY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqZnJlcWRhdGEgPSBOVUxMOworICAgICAgICBmbG9hdCBmcmVxY292ZXJhZ2UgPSAwOworICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIGNvbnN0IGNoYXIgKmVuY25hbWUgPSB1Y3NkZXRfZ2V0TmFtZShtYXRjaGVzW2ldLCAmc3RhdHVzKTsKKyAgICAgICAgaW50IGNvbmZpZGVuY2UgPSB1Y3NkZXRfZ2V0Q29uZmlkZW5jZShtYXRjaGVzW2ldLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKCFzdHJjbXAoIkdCMTgwMzAiLCBlbmNuYW1lKSkgeworICAgICAgICAgICAgZnJlcWRhdGEgPSBmcmVxdWVudF96aENOOworICAgICAgICAgICAgZnJlcWNvdmVyYWdlID0gZnJlcXVlbnRfemhDTl9jb3ZlcmFnZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJCaWc1IiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfemhUVzsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X3poVFdfY292ZXJhZ2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiRVVDLUtSIiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfa287CisgICAgICAgICAgICBmcmVxY292ZXJhZ2UgPSBmcmVxdWVudF9rb19jb3ZlcmFnZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJFVUMtSlAiLCBlbmNuYW1lKSkgeworICAgICAgICAgICAgZnJlcWRhdGEgPSBmcmVxdWVudF9qYTsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X2phX2NvdmVyYWdlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlNoaWZ0X0pJUyIsIGVuY25hbWUpKSB7CisgICAgICAgICAgICBmcmVxZGF0YSA9IGZyZXF1ZW50X2phOworICAgICAgICAgICAgZnJlcWNvdmVyYWdlID0gZnJlcXVlbnRfamFfY292ZXJhZ2U7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiJXp1OiAlcyAlZCIsIGksIGVuY25hbWUsIGNvbmZpZGVuY2UpOworICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIFVDb252ZXJ0ZXIgKmNvbnYgPSB1Y252X29wZW4oZW5jbmFtZSwgJnN0YXR1cyk7CisgICAgICAgIGludCBkZW1lcml0ID0gMDsKKyAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIG9wZW4gJXM6ICVkIiwgZW5jbmFtZSwgc3RhdHVzKTsKKyAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAwOworICAgICAgICAgICAgZGVtZXJpdCArPSAxMDAwOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKnNvdXJjZSA9IGlucHV0OworICAgICAgICBjb25zdCBjaGFyICpzb3VyY2VMaW1pdCA9IGlucHV0ICsgbGVuOworICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIGludCBmcmVxdWVudGNoYXJzID0gMDsKKyAgICAgICAgaW50IHRvdGFsY2hhcnMgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgLy8gZGVtZXJpdCB0aGUgY3VycmVudCBlbmNvZGluZyBmb3IgZWFjaCAic3BlY2lhbCIgY2hhcmFjdGVyIGZvdW5kIGFmdGVyIGNvbnZlcnNpb24uCisgICAgICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRlbWVyaXQgaXMgc29tZXdoYXQgYXJiaXRyYXJpbHkgY2hvc2VuLgorICAgICAgICAgICAgaW50IGluY2hhcjsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gc291cmNlTGltaXQpIHsKKyAgICAgICAgICAgICAgICBpbmNoYXIgPSAoc291cmNlWzBdIDw8IDgpICsgc291cmNlWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVUNoYXIzMiBjID0gdWNudl9nZXROZXh0VUNoYXIoY29udiwgJnNvdXJjZSwgc291cmNlTGltaXQsICZzdGF0dXMpOworICAgICAgICAgICAgaWYgKCFVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPCAweDIwIHx8IChjID49IDB4N2YgJiYgYyA8PSAweDAwOWYpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvbnRyb2wgY2hhcmFjdGVyICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAxMDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChjID09IDB4YTApICAgICAgICAgICAgICAgICAgICAgIC8vIG5vLWJyZWFrIHNwYWNlCisgICAgICAgICAgICAgICAgICAgIHx8IChjID49IDB4YTIgJiYgYyA8PSAweGJlKSAgICAgICAgIC8vIHN5bWJvbHMsIHN1cGVyc2NyaXB0cworICAgICAgICAgICAgICAgICAgICB8fCAoYyA9PSAweGQ3KSB8fCAoYyA9PSAweGY3KSAgICAgICAvLyBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gc2lnbnMKKyAgICAgICAgICAgICAgICAgICAgfHwgKGMgPj0gMHgyMDAwICYmIGMgPD0gMHgyMDlmKSkgeyAgLy8gcHVuY3R1YXRpb24sIHN1cGVyc2NyaXB0cworICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmxpa2VseSBjaGFyYWN0ZXIgJXgiLCBjKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDEwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4ZTAwMCAmJiBjIDw9IDB4ZjhmZikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJwcml2YXRlIHVzZSBjaGFyYWN0ZXIgJXgiLCBjKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDMwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4MjE5MCAmJiBjIDw9IDB4MmJmZikgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmFuZ2UgY29tcHJpc2VzIHZhcmlvdXMgc3ltYm9sIHJhbmdlcyB0aGF0IGFyZSB1bmxpa2VseSB0byBhcHBlYXIgaW4KKyAgICAgICAgICAgICAgICAvLyBtdXNpYyBmaWxlIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgIEFMT0dWKCJzeW1ib2wgJXgiLCBjKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDEwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IDB4ZmZmZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZXBsYWNlbWVudCBjaGFyYWN0ZXIiKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDUwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4ZmZmMCAmJiBjIDw9IDB4ZmZmYykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmljb2RlIHNwZWNpYWwgJXgiLCBjKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDUwOworICAgICAgICAgICAgfSBlbHNlIGlmIChmcmVxZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdG90YWxjaGFycysrOworICAgICAgICAgICAgICAgIGlmIChpc0ZyZXF1ZW50KGZyZXFkYXRhLCBjKSkgeworICAgICAgICAgICAgICAgICAgICBmcmVxdWVudGNoYXJzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmcmVxZGF0YSAhPSBOVUxMICYmIHRvdGFsY2hhcnMgIT0gMCkgeworICAgICAgICAgICAgaW50IG15Y29uZmlkZW5jZSA9IDEwICsgZmxvYXQoKDEwMCAqIGZyZXF1ZW50Y2hhcnMpIC8gdG90YWxjaGFycykgLyBmcmVxY292ZXJhZ2U7CisgICAgICAgICAgICBBTE9HVigiSUNVIGNvbmZpZGVuY2U6ICVkLCBteSBjb25maWRlbmNlOiAlZCAoJWQgJWQpIiwgY29uZmlkZW5jZSwgbXljb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICB0b3RhbGNoYXJzLCBmcmVxdWVudGNoYXJzKTsKKyAgICAgICAgICAgIGlmIChteWNvbmZpZGVuY2UgPiAxMDApIG15Y29uZmlkZW5jZSA9IDEwMDsKKyAgICAgICAgICAgIGlmIChteWNvbmZpZGVuY2UgPCAwKSBteWNvbmZpZGVuY2UgPSAwOworICAgICAgICAgICAgY29uZmlkZW5jZSA9IG15Y29uZmlkZW5jZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJWQtJWQ9JWQiLCBjb25maWRlbmNlLCBkZW1lcml0LCBjb25maWRlbmNlIC0gZGVtZXJpdCk7CisgICAgICAgIG5ld2NvbmZpZGVuY2UucHVzaF9iYWNrKGNvbmZpZGVuY2UgLSBkZW1lcml0KTsKKyAgICAgICAgdWNudl9jbG9zZShjb252KTsKKyAgICAgICAgaWYgKGkgPT0gMCAmJiAoY29uZmlkZW5jZSAtIGRlbWVyaXQpID09IDEwMCkgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnkgZnVydGhlciwgd2UnbGwgZW5kIHVwIHVzaW5nIHRoaXMgbWF0Y2ggYW55d2F5CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGZpbmQgbWF0Y2ggd2l0aCBoaWdoZXN0IGNvbmZpZGVuY2UgYWZ0ZXIgYWRqdXN0aW5nIGZvciB1bmxpa2VseSBjaGFyYWN0ZXJzCisgICAgaW50IGhpZ2hlc3QgPSBuZXdjb25maWRlbmNlWzBdOworICAgIHNpemVfdCBoaWdoZXN0aWR4ID0gMDsKKyAgICBpbnQgcnVubmVydXAgPSAtMTAwMDA7CisgICAgaW50IHJ1bm5lcnVwaWR4ID0gLTEwMDAwOworICAgIG51bSA9IG5ld2NvbmZpZGVuY2Uuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgaWYgKG5ld2NvbmZpZGVuY2VbaV0gPiBoaWdoZXN0KSB7CisgICAgICAgICAgICBydW5uZXJ1cCA9IGhpZ2hlc3Q7CisgICAgICAgICAgICBydW5uZXJ1cGlkeCA9IGhpZ2hlc3RpZHg7CisgICAgICAgICAgICBoaWdoZXN0ID0gbmV3Y29uZmlkZW5jZVtpXTsKKyAgICAgICAgICAgIGhpZ2hlc3RpZHggPSBpOworICAgICAgICB9IGVsc2UgaWYgKG5ld2NvbmZpZGVuY2VbaV0gPiBydW5uZXJ1cCl7CisgICAgICAgICAgICBydW5uZXJ1cCA9IG5ld2NvbmZpZGVuY2VbaV07CisgICAgICAgICAgICBydW5uZXJ1cGlkeCA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIEFMT0dWKCJzZWxlY3Rpbmc6ICclcycgdy8gJWQgY29uZmlkZW5jZSIsCisgICAgICAgICAgICB1Y3NkZXRfZ2V0TmFtZShtYXRjaGVzW2hpZ2hlc3RpZHhdLCAmc3RhdHVzKSwgaGlnaGVzdCk7CisgICAgaWYgKHJ1bm5lcnVwaWR4IDwgMCkgeworICAgICAgICBBTE9HVigibm8gcnVubmVyIHVwIik7CisgICAgICAgIGlmIChoaWdoZXN0ID4gMTUpIHsKKyAgICAgICAgICAgICpnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJ1bm5lciB1cDogJyVzJyB3LyAlZCBjb25maWRlbmNlIiwKKyAgICAgICAgICAgICAgICB1Y3NkZXRfZ2V0TmFtZShtYXRjaGVzW3J1bm5lcnVwaWR4XSwgJnN0YXR1cyksIHJ1bm5lcnVwKTsKKyAgICAgICAgaWYgKHJ1bm5lcnVwIDwgMCkgeworICAgICAgICAgICAgcnVubmVydXAgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICgoaGlnaGVzdCAtIHJ1bm5lcnVwKSA+IDE1KSB7CisgICAgICAgICAgICAqZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqaGlnaGVzdG1hdGNoID0gaGlnaGVzdDsKKyAgICByZXR1cm4gbWF0Y2hlc1toaWdoZXN0aWR4XTsKK30KKworCitib29sIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmlzRnJlcXVlbnQoY29uc3QgdWludDE2X3QgKnZhbHVlcywgdWludDMyX3QgYykgeworCisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICBpbnQgZW5kID0gNTExOyAvLyBBbGwgdGhlIHRhYmxlcyBoYXZlIDUxMiBlbnRyaWVzCisgICAgaW50IG1pZCA9IChzdGFydCtlbmQpLzI7CisKKyAgICB3aGlsZShzdGFydCA8PSBlbmQpIHsKKyAgICAgICAgaWYoYyA9PSB2YWx1ZXNbbWlkXSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+IHZhbHVlc1ttaWRdKSB7CisgICAgICAgICAgICBzdGFydCA9IG1pZCArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmQgPSBtaWQgLSAxOworICAgICAgICB9CisKKyAgICAgICAgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDI7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmggYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlMTEzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3JUYWJsZXMuaApAQCAtMCwwICsxLDIwOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGUgNTEyIG1vc3QgZnJlcXVlbnRseSBvY2N1cmluZyBjaGFyYWN0ZXJzIGZvciB0aGUgemhDTiBsYW5ndWFnZSBpbiBhIHNhbXBsZSBvZiB0aGUgSW50ZXJuZXQuCisvLyBPcmRlcmVkIGJ5IGNvZGVwb2ludCwgY29tbWVudCBzaG93cyBjaGFyYWN0ZXIgYW5kIHJhbmtpbmcgYnkgZnJlcXVlbmN5Citjb25zdCB1aW50MTZfdCBmcmVxdWVudF96aENOW10gPSB7CisgICAgMHg0RTAwLCAvLyDkuIAsICMyCisgICAgMHg0RTA3LCAvLyDkuIcsICMzMDYKKyAgICAweDRFMDksIC8vIOS4iSwgIzEzOAorICAgIDB4NEUwQSwgLy8g5LiKLCAjMTYKKyAgICAweDRFMEIsIC8vIOS4iywgIzI1CisgICAgMHg0RTBELCAvLyDkuI0sICM3CisgICAgMHg0RTBFLCAvLyDkuI4sICMxMzMKKyAgICAweDRFMTMsIC8vIOS4kywgIzE1MQorICAgIDB4NEUxNiwgLy8g5LiWLCAjMzQ2CisgICAgMHg0RTFBLCAvLyDkuJosICMzOQorICAgIDB4NEUxQywgLy8g5LicLCAjMTk3CisgICAgMHg0RTI0LCAvLyDkuKQsICMzNzYKKyAgICAweDRFMkEsIC8vIOS4qiwgIzIzCisgICAgMHg0RTJELCAvLyDkuK0sICM0CisgICAgMHg0RTNBLCAvLyDkuLosICMzMQorICAgIDB4NEUzQiwgLy8g5Li7LCAjOTUKKyAgICAweDRFM0UsIC8vIOS4viwgIzQxOAorICAgIDB4NEU0OCwgLy8g5LmILCAjOTMKKyAgICAweDRFNEIsIC8vIOS5iywgIzEzMQorICAgIDB4NEU1MCwgLy8g5LmQLCAjMTMwCisgICAgMHg0RTVGLCAvLyDkuZ8sICMxNDUKKyAgICAweDRFNjYsIC8vIOS5piwgIzI4MworICAgIDB4NEU3MCwgLy8g5LmwLCAjNDgzCisgICAgMHg0RTg2LCAvLyDkuoYsICMxMworICAgIDB4NEU4QiwgLy8g5LqLLCAjMTY4CisgICAgMHg0RThDLCAvLyDkuowsICMyMTgKKyAgICAweDRFOEUsIC8vIOS6jiwgIzY0CisgICAgMHg0RTk0LCAvLyDkupQsICM0MzAKKyAgICAweDRFOUEsIC8vIOS6miwgIzQ2OAorICAgIDB4NEU5QiwgLy8g5LqbLCAjMzY2CisgICAgMHg0RUE0LCAvLyDkuqQsICMyNDMKKyAgICAweDRFQTcsIC8vIOS6pywgIzg2CisgICAgMHg0RUFCLCAvLyDkuqssICMzNDUKKyAgICAweDRFQUMsIC8vIOS6rCwgIzIwNgorICAgIDB4NEVCQSwgLy8g5Lq6LCAjMworICAgIDB4NEVDMCwgLy8g5LuALCAjMjg3CisgICAgMHg0RUNCLCAvLyDku4ssICM0NzgKKyAgICAweDRFQ0UsIC8vIOS7jiwgIzM4MQorICAgIDB4NEVENiwgLy8g5LuWLCAjMTI5CisgICAgMHg0RUUzLCAvLyDku6MsICMyNDEKKyAgICAweDRFRTUsIC8vIOS7pSwgIzUxCisgICAgMHg0RUVDLCAvLyDku6wsICM4MworICAgIDB4NEVGNiwgLy8g5Lu2LCAjMTQxCisgICAgMHg0RUY3LCAvLyDku7csICMxNDAKKyAgICAweDRFRkIsIC8vIOS7uywgIzM4MworICAgIDB4NEYwMSwgLy8g5LyBLCAjNDM5CisgICAgMHg0RjE4LCAvLyDkvJgsICMzNzQKKyAgICAweDRGMUEsIC8vIOS8miwgIzI5CisgICAgMHg0RjIwLCAvLyDkvKAsICMyMjIKKyAgICAweDRGNDYsIC8vIOS9hiwgIzQ1MQorICAgIDB4NEY0RCwgLy8g5L2NLCAjMjA4CisgICAgMHg0RjUzLCAvLyDkvZMsICM5OAorICAgIDB4NEY1NSwgLy8g5L2VLCAjMzM5CisgICAgMHg0RjVDLCAvLyDkvZwsICM0NAorICAgIDB4NEY2MCwgLy8g5L2gLCAjNzYKKyAgICAweDRGN0YsIC8vIOS9vywgIzI3MgorICAgIDB4NEY5QiwgLy8g5L6bLCAjMzc1CisgICAgMHg0RkRELCAvLyDkv50sICMxODAKKyAgICAweDRGRTEsIC8vIOS/oSwgIzg0CisgICAgMHg0RkVFLCAvLyDkv64sICM0MzcKKyAgICAweDUwM0MsIC8vIOWAvCwgIzQ1MAorICAgIDB4NTA1QSwgLy8g5YGaLCAjMzY4CisgICAgMHg1MDY1LCAvLyDlgaUsICM0ODQKKyAgICAweDUwQ0YsIC8vIOWDjywgIzQ4NworICAgIDB4NTEzRiwgLy8g5YS/LCAjMzI2CisgICAgMHg1MTQzLCAvLyDlhYMsICMyMDIKKyAgICAweDUxNDgsIC8vIOWFiCwgIzQ4NQorICAgIDB4NTE0OSwgLy8g5YWJLCAjMjU0CisgICAgMHg1MTRCLCAvLyDlhYssICM1MDMKKyAgICAweDUxNEQsIC8vIOWFjSwgIzM0OQorICAgIDB4NTE2NSwgLy8g5YWlLCAjMTU2CisgICAgMHg1MTY4LCAvLyDlhagsICM0NworICAgIDB4NTE2QywgLy8g5YWsLCAjMzUKKyAgICAweDUxNzEsIC8vIOWFsSwgIzQ0OAorICAgIDB4NTE3MywgLy8g5YWzLCAjNDkKKyAgICAweDUxNzYsIC8vIOWFtiwgIzE5NQorICAgIDB4NTE3NywgLy8g5YW3LCAjMzI5CisgICAgMHg1MTg1LCAvLyDlhoUsICMxMDkKKyAgICAweDUxOEMsIC8vIOWGjCwgIzIyNQorICAgIDB4NTE5QiwgLy8g5YabLCAjNDY2CisgICAgMHg1MUZBLCAvLyDlh7osICM1MworICAgIDB4NTFGQiwgLy8g5Ye7LCAjMzU5CisgICAgMHg1MjA2LCAvLyDliIYsICMyMgorICAgIDB4NTIxNywgLy8g5YiXLCAjNDEwCisgICAgMHg1MjFCLCAvLyDliJssICMzOTkKKyAgICAweDUyMjksIC8vIOWIqSwgIzI5NgorICAgIDB4NTIyQiwgLy8g5YirLCAjMzcyCisgICAgMHg1MjMwLCAvLyDliLAsICMzMworICAgIDB4NTIzNiwgLy8g5Yi2LCAjMTkyCisgICAgMHg1MjRELCAvLyDliY0sICMxMTcKKyAgICAweDUyOUIsIC8vIOWKmywgIzE3MworICAgIDB4NTI5RSwgLy8g5YqeLCAjNDM2CisgICAgMHg1MjlGLCAvLyDlip8sICM0NTUKKyAgICAweDUyQTAsIC8vIOWKoCwgIzk3CisgICAgMHg1MkExLCAvLyDliqEsICMxMDAKKyAgICAweDUyQTgsIC8vIOWKqCwgIzQ2CisgICAgMHg1MkE5LCAvLyDliqksICMzNjUKKyAgICAweDUzMDUsIC8vIOWMhSwgIzMzMQorICAgIDB4NTMxNiwgLy8g5YyWLCAjMTU1CisgICAgMHg1MzE3LCAvLyDljJcsICMxOTQKKyAgICAweDUzM0EsIC8vIOWMuiwgIzEwNQorICAgIDB4NTMzQiwgLy8g5Yy7LCAjMjM0CisgICAgMHg1MzQxLCAvLyDljYEsICMyOTQKKyAgICAweDUzNEUsIC8vIOWNjiwgIzIwNQorICAgIDB4NTM1NSwgLy8g5Y2VLCAjMjU5CisgICAgMHg1MzU3LCAvLyDljZcsICMxODIKKyAgICAweDUzNUEsIC8vIOWNmiwgIzE1MworICAgIDB4NTM2MSwgLy8g5Y2hLCAjMzMyCisgICAgMHg1MzlGLCAvLyDljp8sICMyNzEKKyAgICAweDUzQkIsIC8vIOWOuywgIzI4MgorICAgIDB4NTNDMiwgLy8g5Y+CLCAjNTAwCisgICAgMHg1M0NBLCAvLyDlj4osICMyNTUKKyAgICAweDUzQ0IsIC8vIOWPiywgIzE4NgorICAgIDB4NTNDRCwgLy8g5Y+NLCAjNDIyCisgICAgMHg1M0QxLCAvLyDlj5EsICMxNQorICAgIDB4NTNENywgLy8g5Y+XLCAjNTA3CisgICAgMHg1M0Q4LCAvLyDlj5gsICMzOTUKKyAgICAweDUzRTMsIC8vIOWPoywgIzI5MworICAgIDB4NTNFQSwgLy8g5Y+qLCAjMzQwCisgICAgMHg1M0VGLCAvLyDlj68sICM0NQorICAgIDB4NTNGMCwgLy8g5Y+wLCAjMjY3CisgICAgMHg1M0Y3LCAvLyDlj7csICMxMjEKKyAgICAweDUzRjgsIC8vIOWPuCwgIzE1MAorICAgIDB4NTQwNCwgLy8g5ZCELCAjNDkxCisgICAgMHg1NDA4LCAvLyDlkIgsICMxMTUKKyAgICAweDU0MEMsIC8vIOWQjCwgIzE4OQorICAgIDB4NTQwRCwgLy8g5ZCNLCAjMTI3CisgICAgMHg1NDBFLCAvLyDlkI4sICM3NQorICAgIDB4NTQxMSwgLy8g5ZCRLCAjNDU5CisgICAgMHg1NDI3LCAvLyDlkKcsICMzNTMKKyAgICAweDU0NEEsIC8vIOWRiiwgIzMxOAorICAgIDB4NTQ1OCwgLy8g5ZGYLCAjMjMyCisgICAgMHg1NDY4LCAvLyDlkagsICMzNDcKKyAgICAweDU0OEMsIC8vIOWSjCwgIzQzCisgICAgMHg1NEMxLCAvLyDlk4EsICMzNgorICAgIDB4NTU0NiwgLy8g5ZWGLCAjMTQ4CisgICAgMHg1NjY4LCAvLyDlmagsICMyMjgKKyAgICAweDU2REIsIC8vIOWbmywgIzM1MgorICAgIDB4NTZERSwgLy8g5ZueLCAjMzgKKyAgICAweDU2RTAsIC8vIOWboCwgIzM1NQorICAgIDB4NTZFMiwgLy8g5ZuiLCAjNDEyCisgICAgMHg1NkVELCAvLyDlm60sICM0NzAKKyAgICAweDU2RkQsIC8vIOWbvSwgIzEyCisgICAgMHg1NkZFLCAvLyDlm74sICMzMgorICAgIDB4NTcyOCwgLy8g5ZyoLCAjMTAKKyAgICAweDU3MzAsIC8vIOWcsCwgIzMwCisgICAgMHg1NzNBLCAvLyDlnLosICMxNzcKKyAgICAweDU3NUIsIC8vIOWdmywgIzM2NAorICAgIDB4NTc4QiwgLy8g5Z6LLCAjMjc0CisgICAgMHg1N0NFLCAvLyDln44sICMxNzIKKyAgICAweDU3RkEsIC8vIOWfuiwgIzMxNQorICAgIDB4NThFQiwgLy8g5aOrLCAjNDM0CisgICAgMHg1OEYwLCAvLyDlo7AsICMzOTcKKyAgICAweDU5MDQsIC8vIOWkhCwgIzQxNgorICAgIDB4NTkwNywgLy8g5aSHLCAjMjcwCisgICAgMHg1OTBELCAvLyDlpI0sICMxMjIKKyAgICAweDU5MTYsIC8vIOWkliwgIzE5MAorICAgIDB4NTkxQSwgLy8g5aSaLCAjNDAKKyAgICAweDU5MjcsIC8vIOWkpywgIzgKKyAgICAweDU5MjksIC8vIOWkqSwgIzUyCisgICAgMHg1OTJBLCAvLyDlpKosICM0NTYKKyAgICAweDU5MzQsIC8vIOWktCwgIzI1OAorICAgIDB4NTk3MywgLy8g5aWzLCAjNjUKKyAgICAweDU5N0QsIC8vIOWlvSwgIzYyCisgICAgMHg1OTgyLCAvLyDlpoIsICMxMzUKKyAgICAweDVBMzEsIC8vIOWosSwgIzQ1MgorICAgIDB4NUI1MCwgLy8g5a2QLCAjMzcKKyAgICAweDVCNTcsIC8vIOWtlywgIzI4NQorICAgIDB4NUI2NiwgLy8g5a2mLCAjMTkKKyAgICAweDVCODksIC8vIOWuiSwgIzE0NAorICAgIDB4NUI4QywgLy8g5a6MLCAjNDY5CisgICAgMHg1QjlBLCAvLyDlrposICMxNzkKKyAgICAweDVCOUQsIC8vIOWunSwgIzE4OAorICAgIDB4NUI5RSwgLy8g5a6eLCAjMTU0CisgICAgMHg1QkEyLCAvLyDlrqIsICMxNzQKKyAgICAweDVCQjYsIC8vIOWutiwgIzI2CisgICAgMHg1QkI5LCAvLyDlrrksICMzMDcKKyAgICAweDVCQzYsIC8vIOWvhiwgIzQ3MQorICAgIDB4NUJGOSwgLy8g5a+5LCAjOTAKKyAgICAweDVCRkMsIC8vIOWvvCwgIzM0OAorICAgIDB4NUMwNiwgLy8g5bCGLCAjMjY1CisgICAgMHg1QzBGLCAvLyDlsI8sICMyOAorICAgIDB4NUMxMSwgLy8g5bCRLCAjMzc5CisgICAgMHg1QzE0LCAvLyDlsJQsICM0OTAKKyAgICAweDVDMzEsIC8vIOWwsSwgIzEwMQorICAgIDB4NUM1NSwgLy8g5bGVLCAjMjkxCisgICAgMHg1QzcxLCAvLyDlsbEsICMyMzkKKyAgICAweDVEREUsIC8vIOW3niwgIzIyNworICAgIDB4NURFNSwgLy8g5belLCAjNzMKKyAgICAweDVERjEsIC8vIOW3sSwgIzQ4MAorICAgIDB4NURGMiwgLy8g5beyLCAjMzEwCisgICAgMHg1RTAyLCAvLyDluIIsICM3OAorICAgIDB4NUUwMywgLy8g5biDLCAjMzUwCisgICAgMHg1RTA4LCAvLyDluIgsICMyNzcKKyAgICAweDVFMTYsIC8vIOW4liwgIzM5NgorICAgIDB4NUUyNiwgLy8g5bimLCAjNDQ5CisgICAgMHg1RTJFLCAvLyDluK4sICM0NjEKKyAgICAweDVFMzgsIC8vIOW4uCwgIzMxOQorICAgIDB4NUU3MywgLy8g5bmzLCAjMjE3CisgICAgMHg1RTc0LCAvLyDlubQsICMyMAorICAgIDB4NUU3NiwgLy8g5bm2LCAjNDQwCisgICAgMHg1RTdGLCAvLyDlub8sICMxNjYKKyAgICAweDVFOTMsIC8vIOW6kywgIzQ0NgorICAgIDB4NUU5NCwgLy8g5bqULCAjMTg3CisgICAgMHg1RTk3LCAvLyDlupcsICMzMjAKKyAgICAweDVFQTYsIC8vIOW6piwgIzExNAorICAgIDB4NUVCNywgLy8g5bq3LCAjNDk5CisgICAgMHg1RUZBLCAvLyDlu7osICMyMTEKKyAgICAweDVGMDAsIC8vIOW8gCwgIzcyCisgICAgMHg1RjBGLCAvLyDlvI8sICMyMDcKKyAgICAweDVGMTUsIC8vIOW8lSwgIzQ5NQorICAgIDB4NUYyMCwgLy8g5bygLCAjMzg1CisgICAgMHg1RjNBLCAvLyDlvLosICM0MDQKKyAgICAweDVGNTMsIC8vIOW9kywgIzIzMworICAgIDB4NUY1NSwgLy8g5b2VLCAjMTQ2CisgICAgMHg1RjYyLCAvLyDlvaIsICM0OTQKKyAgICAweDVGNjksIC8vIOW9qSwgIzM1NgorICAgIDB4NUY3MSwgLy8g5b2xLCAjMjE0CisgICAgMHg1Rjg4LCAvLyDlvogsICMzMDAKKyAgICAweDVGOTcsIC8vIOW+lywgIzE5MworICAgIDB4NUZBRSwgLy8g5b6uLCAjMjQ1CisgICAgMHg1RkMzLCAvLyDlv4MsICM3MAorICAgIDB4NUZFQiwgLy8g5b+rLCAjMzI0CisgICAgMHg2MDAxLCAvLyDmgIEsICM1MDgKKyAgICAweDYwMEUsIC8vIOaAjiwgIzM3MAorICAgIDB4NjAyNywgLy8g5oCnLCAjOTkKKyAgICAweDYwM0IsIC8vIOaAuywgIzM5OAorICAgIDB4NjA2RiwgLy8g5oGvLCAjMTc2CisgICAgMHg2MEE4LCAvLyDmgqgsICMyNTEKKyAgICAweDYwQzUsIC8vIOaDhSwgIzg3CisgICAgMHg2MEYzLCAvLyDmg7MsICMyOTAKKyAgICAweDYxMEYsIC8vIOaEjywgIzE4NAorICAgIDB4NjExRiwgLy8g5oSfLCAjMjUzCisgICAgMHg2MjBGLCAvLyDmiI8sICMyMzcKKyAgICAweDYyMTAsIC8vIOaIkCwgIzcxCisgICAgMHg2MjExLCAvLyDmiJEsICMxMQorICAgIDB4NjIxNiwgLy8g5oiWLCAjMzIxCisgICAgMHg2MjE4LCAvLyDmiJgsICMzNjkKKyAgICAweDYyMzcsIC8vIOaItywgIzIxNQorICAgIDB4NjIzRiwgLy8g5oi/LCAjMjM2CisgICAgMHg2MjQwLCAvLyDmiYAsICMxNDcKKyAgICAweDYyNEIsIC8vIOaJiywgIzU1CisgICAgMHg2MjRELCAvLyDmiY0sICM0MDcKKyAgICAweDYyNTMsIC8vIOaJkywgIzI4MQorICAgIDB4NjI4MCwgLy8g5oqALCAjMjAzCisgICAgMHg2Mjk1LCAvLyDmipUsICM0MDgKKyAgICAweDYyQTQsIC8vIOaKpCwgIzUwMgorICAgIDB4NjJBNSwgLy8g5oqlLCAjMTEzCisgICAgMHg2MkRCLCAvLyDmi5ssICMzNjMKKyAgICAweDYzMDEsIC8vIOaMgSwgIzQwMworICAgIDB4NjMwNywgLy8g5oyHLCAjNDE0CisgICAgMHg2MzZFLCAvLyDmja4sICM0MDkKKyAgICAweDYzOTIsIC8vIOaOkiwgIzM3NworICAgIDB4NjNBNSwgLy8g5o6lLCAjMjY2CisgICAgMHg2M0E4LCAvLyDmjqgsICMyNDQKKyAgICAweDYzRDAsIC8vIOaPkCwgIzE4MQorICAgIDB4NjQxQywgLy8g5pCcLCAjMzAxCisgICAgMHg2NEFELCAvLyDmkq0sICM0MDEKKyAgICAweDY1MkYsIC8vIOaUrywgIzQwMAorICAgIDB4NjUzNiwgLy8g5pS2LCAjMTU4CisgICAgMHg2NTNFLCAvLyDmlL4sICMzMTcKKyAgICAweDY1M0YsIC8vIOaUvywgIzM4MAorICAgIDB4NjU0OCwgLy8g5pWILCAjNDk2CisgICAgMHg2NTU5LCAvLyDmlZksICMxNzAKKyAgICAweDY1NzAsIC8vIOaVsCwgIzEzNgorICAgIDB4NjU4NywgLy8g5paHLCAjMjEKKyAgICAweDY1OTksIC8vIOaWmSwgIzI5NQorICAgIDB4NjVBRiwgLy8g5pavLCAjNDczCisgICAgMHg2NUIwLCAvLyDmlrAsICMxNAorICAgIDB4NjVCOSwgLy8g5pa5LCAjNjgKKyAgICAweDY1QzUsIC8vIOaXhSwgIzQ1NworICAgIDB4NjVFMCwgLy8g5pegLCAjMTY0CisgICAgMHg2NUU1LCAvLyDml6UsICM1MAorICAgIDB4NjVGNiwgLy8g5pe2LCAjMTgKKyAgICAweDY2MEUsIC8vIOaYjiwgIzEzMgorICAgIDB4NjYxMywgLy8g5piTLCAjNDI4CisgICAgMHg2NjFGLCAvLyDmmJ8sICMyNDAKKyAgICAweDY2MkYsIC8vIOaYrywgIzYKKyAgICAweDY2M0UsIC8vIOaYviwgIzQ4NgorICAgIDB4NjZGNCwgLy8g5pu0LCAjMTAzCisgICAgMHg2NzAwLCAvLyDmnIAsICM2MQorICAgIDB4NjcwOCwgLy8g5pyILCAjODAKKyAgICAweDY3MDksIC8vIOaciSwgIzUKKyAgICAweDY3MEQsIC8vIOacjSwgIzk0CisgICAgMHg2NzFGLCAvLyDmnJ8sICMxMzkKKyAgICAweDY3MkMsIC8vIOacrCwgIzU2CisgICAgMHg2NzJGLCAvLyDmnK8sICMyMTYKKyAgICAweDY3M0EsIC8vIOacuiwgIzI3CisgICAgMHg2NzQzLCAvLyDmnYMsICMyNTAKKyAgICAweDY3NjEsIC8vIOadoSwgIzMwOQorICAgIDB4Njc2NSwgLy8g5p2lLCAjNDIKKyAgICAweDY3N0YsIC8vIOadvywgIzUwNQorICAgIDB4Njc5NywgLy8g5p6XLCAjNDc1CisgICAgMHg2NzlDLCAvLyDmnpwsICMyMTIKKyAgICAweDY3RTUsIC8vIOafpSwgIzE2NQorICAgIDB4NjgwNywgLy8g5qCHLCAjMjY5CisgICAgMHg2ODIxLCAvLyDmoKEsICM0NjIKKyAgICAweDY4MzcsIC8vIOagtywgIzMxNAorICAgIDB4NjgzQywgLy8g5qC8LCAjMjM4CisgICAgMHg2ODQ4LCAvLyDmoYgsICMzNzgKKyAgICAweDY5N0MsIC8vIOalvCwgIzM0MgorICAgIDB4NkEyMSwgLy8g5qihLCAjNDEzCisgICAgMHg2QjIxLCAvLyDmrKEsICMyNjMKKyAgICAweDZCMjIsIC8vIOasoiwgIzQ0MworICAgIDB4NkIzRSwgLy8g5qy+LCAjMzU4CisgICAgMHg2QjYzLCAvLyDmraMsICMyMTkKKyAgICAweDZCNjQsIC8vIOatpCwgIzM2MgorICAgIDB4NkJENCwgLy8g5q+ULCAjMjk4CisgICAgMHg2QzExLCAvLyDmsJEsICMyNzkKKyAgICAweDZDMTQsIC8vIOawlCwgIzMwMworICAgIDB4NkMzNCwgLy8g5rC0LCAjMTYzCisgICAgMHg2QzQyLCAvLyDmsYIsICMzNzMKKyAgICAweDZDNUYsIC8vIOaxnywgIzMzNgorICAgIDB4NkNBMSwgLy8g5rKhLCAjMjI5CisgICAgMHg2Q0JCLCAvLyDmsrssICM0MjUKKyAgICAweDZDRDUsIC8vIOazlSwgIzg1CisgICAgMHg2Q0U4LCAvLyDms6gsICMxMTkKKyAgICAweDZEM0IsIC8vIOa0uywgIzIzMQorICAgIDB4NkQ0MSwgLy8g5rWBLCAjMjgwCisgICAgMHg2RDRCLCAvLyDmtYssICM0NjAKKyAgICAweDZENzcsIC8vIOa1tywgIzEyNAorICAgIDB4NkQ4OCwgLy8g5raILCAjNDE1CisgICAgMHg2REYxLCAvLyDmt7EsICM0NzcKKyAgICAweDZFMDUsIC8vIOa4hSwgIzMxMQorICAgIDB4NkUzOCwgLy8g5ri4LCAjODEKKyAgICAweDZFOTAsIC8vIOa6kCwgIzMyNQorICAgIDB4NzA2QiwgLy8g54GrLCAjNDk4CisgICAgMHg3MEI5LCAvLyDngrksICM1OAorICAgIDB4NzBFRCwgLy8g54OtLCAjMTgzCisgICAgMHg3MTM2LCAvLyDnhLYsICMzMDgKKyAgICAweDcxNjcsIC8vIOeFpywgIzQzMQorICAgIDB4NzIzMSwgLy8g54ixLCAjMjIzCisgICAgMHg3MjQ3LCAvLyDniYcsICMxMjgKKyAgICAweDcyNDgsIC8vIOeJiCwgIzkxCisgICAgMHg3MjRDLCAvLyDniYwsICM0MjkKKyAgICAweDcyNjksIC8vIOeJqSwgIzE2OQorICAgIDB4NzI3OSwgLy8g54m5LCAjMjI0CisgICAgMHg3MzhCLCAvLyDnjossICMzNTEKKyAgICAweDczQTksIC8vIOeOqSwgIzQ3NgorICAgIDB4NzNCMCwgLy8g546wLCAjMTI1CisgICAgMHg3NDAzLCAvLyDnkIMsICMzNjcKKyAgICAweDc0MDYsIC8vIOeQhiwgIzY5CisgICAgMHg3NTFGLCAvLyDnlJ8sICMyNAorICAgIDB4NzUyOCwgLy8g55SoLCAjMTcKKyAgICAweDc1MzEsIC8vIOeUsSwgIzQ0MQorICAgIDB4NzUzNSwgLy8g55S1LCAjMzQKKyAgICAweDc1MzcsIC8vIOeUtywgIzI3NQorICAgIDB4NzU0QywgLy8g55WMLCAjNDE5CisgICAgMHg3NUM1LCAvLyDnl4UsICMzNzEKKyAgICAweDc2N0IsIC8vIOeZuywgIzIwNAorICAgIDB4NzY3RCwgLy8g55m9LCAjMzM4CisgICAgMHg3NjdFLCAvLyDnmb4sICMxNTcKKyAgICAweDc2ODQsIC8vIOeahCwgIzEKKyAgICAweDc2RDgsIC8vIOebmCwgIzQ5MworICAgIDB4NzZFRSwgLy8g55uuLCAjMjYxCisgICAgMHg3NkY0LCAvLyDnm7QsICMzOTEKKyAgICAweDc2RjgsIC8vIOebuCwgIzE0MworICAgIDB4NzcwMSwgLy8g55yBLCAjNDY0CisgICAgMHg3NzBCLCAvLyDnnIssICM1NAorICAgIDB4NzcxRiwgLy8g55yfLCAjMjQ5CisgICAgMHg3NzQwLCAvLyDnnYAsICMzMDIKKyAgICAweDc3RTUsIC8vIOefpSwgIzE0MgorICAgIDB4NzgwMSwgLy8g56CBLCAjMjU3CisgICAgMHg3ODE0LCAvLyDnoJQsICMzODcKKyAgICAweDc5M0EsIC8vIOekuiwgIzMzNAorICAgIDB4NzkzRSwgLy8g56S+LCAjMzQzCisgICAgMHg3OTVFLCAvLyDnpZ4sICMzMzAKKyAgICAweDc5OEYsIC8vIOemjywgIzUwOQorICAgIDB4NzlCQiwgLy8g56a7LCAjNDU0CisgICAgMHg3OUNELCAvLyDnp40sICMyNzgKKyAgICAweDc5RDEsIC8vIOenkSwgIzEyNgorICAgIDB4NzlFRiwgLy8g56evLCAjMzkwCisgICAgMHg3QTBCLCAvLyDnqIssICMyMDkKKyAgICAweDdBNzYsIC8vIOeptiwgIzUwNAorICAgIDB4N0E3QSwgLy8g56m6LCAjMzEyCisgICAgMHg3QUNCLCAvLyDnq4ssICMzOTMKKyAgICAweDdBRDksIC8vIOermSwgIzEwNworICAgIDB4N0FFMCwgLy8g56ugLCAjMzA0CisgICAgMHg3QjJDLCAvLyDnrKwsICM5NgorICAgIDB4N0I0OSwgLy8g562JLCAjMjEwCisgICAgMHg3QjU0LCAvLyDnrZQsICMyNTYKKyAgICAweDdCODAsIC8vIOeugCwgIzQ3NAorICAgIDB4N0JBMSwgLy8g566hLCAjMjIxCisgICAgMHg3QzdCLCAvLyDnsbssICMyNDYKKyAgICAweDdDQkUsIC8vIOeyviwgIzIyNgorICAgIDB4N0NGQiwgLy8g57O7LCAjODkKKyAgICAweDdEMjIsIC8vIOe0oiwgIzM1NAorICAgIDB4N0VBMiwgLy8g57qiLCAjNDE3CisgICAgMHg3RUE3LCAvLyDnuqcsICMxNzgKKyAgICAweDdFQkYsIC8vIOe6vywgIzEwOAorICAgIDB4N0VDNCwgLy8g57uELCAjMzg5CisgICAgMHg3RUM2LCAvLyDnu4YsICM0NDIKKyAgICAweDdFQ0YsIC8vIOe7jywgIzc0CisgICAgMHg3RUQzLCAvLyDnu5MsICMzMzMKKyAgICAweDdFRDksIC8vIOe7mSwgIzM4NAorICAgIDB4N0VEQywgLy8g57ucLCAjNDcyCisgICAgMHg3RURGLCAvLyDnu58sICMzNDQKKyAgICAweDdGMTYsIC8vIOe8liwgIzQyNAorICAgIDB4N0Y1MSwgLy8g572RLCAjOQorICAgIDB4N0Y2RSwgLy8g572uLCAjNDExCisgICAgMHg3RjhFLCAvLyDnvo4sICM2MAorICAgIDB4ODAwMSwgLy8g6ICBLCAjMjkyCisgICAgMHg4MDAzLCAvLyDogIMsICMyODgKKyAgICAweDgwMDUsIC8vIOiAhSwgIzEwNgorICAgIDB4ODAwQywgLy8g6ICMLCAjMjk3CisgICAgMHg4MDU0LCAvLyDogZQsICMxNTkKKyAgICAweDgwQjIsIC8vIOiCsiwgIzMyNworICAgIDB4ODBGRCwgLy8g6IO9LCAjNTkKKyAgICAweDgxRUEsIC8vIOiHqiwgIzc3CisgICAgMHg4MjcyLCAvLyDoibIsICMxOTgKKyAgICAweDgyODIsIC8vIOiKgiwgIzM2MQorICAgIDB4ODJCMSwgLy8g6IqxLCAjMjk5CisgICAgMHg4MkYxLCAvLyDoi7EsICMzMTYKKyAgICAweDgzNTAsIC8vIOiNkCwgIzQwMgorICAgIDB4ODM2RiwgLy8g6I2vLCAjNDgxCisgICAgMHg4NDI1LCAvLyDokKUsICMzOTQKKyAgICAweDg1Q0YsIC8vIOiXjywgIzMzNworICAgIDB4ODg0QywgLy8g6KGMLCAjNDEKKyAgICAweDg4NjgsIC8vIOihqCwgIzEwNAorICAgIDB4ODhBQiwgLy8g6KKrLCAjMjg5CisgICAgMHg4OEM1LCAvLyDoo4UsICMxNjEKKyAgICAweDg5N0YsIC8vIOilvywgIzE5OQorICAgIDB4ODk4MSwgLy8g6KaBLCAjNDgKKyAgICAweDg5QzEsIC8vIOingSwgIzM2MAorICAgIDB4ODlDMiwgLy8g6KeCLCAjNDIzCisgICAgMHg4OUM0LCAvLyDop4QsICM0NTMKKyAgICAweDg5QzYsIC8vIOinhiwgIzEyMAorICAgIDB4ODlFMywgLy8g6KejLCAjMjY0CisgICAgMHg4QTAwLCAvLyDoqIAsICM0MzMKKyAgICAweDhCQTEsIC8vIOiuoSwgIzE5MQorICAgIDB4OEJBNCwgLy8g6K6kLCAjNDgyCisgICAgMHg4QkE5LCAvLyDorqksICM0MjEKKyAgICAweDhCQUUsIC8vIOiuriwgIzQyNworICAgIDB4OEJBRiwgLy8g6K6vLCAjMzg4CisgICAgMHg4QkIwLCAvLyDorrAsICMyNzMKKyAgICAweDhCQkEsIC8vIOiuuiwgIzY2CisgICAgMHg4QkJFLCAvLyDorr4sICMxNjIKKyAgICAweDhCQzEsIC8vIOivgSwgIzIwMQorICAgIDB4OEJDNCwgLy8g6K+ELCAjMTExCisgICAgMHg4QkM2LCAvLyDor4YsICM0NjMKKyAgICAweDhCRDUsIC8vIOivlSwgIzMyMworICAgIDB4OEJERCwgLy8g6K+dLCAjMjQ3CisgICAgMHg4QkUyLCAvLyDor6IsICM0MzIKKyAgICAweDhCRTUsIC8vIOivpSwgIzQ0NworICAgIDB4OEJFNiwgLy8g6K+mLCAjNDk3CisgICAgMHg4QkVELCAvLyDor60sICMyNjgKKyAgICAweDhCRjQsIC8vIOivtCwgIzExMgorICAgIDB4OEJGNywgLy8g6K+3LCAjMjEzCisgICAgMHg4QkZCLCAvLyDor7ssICMzNDEKKyAgICAweDhDMDMsIC8vIOiwgywgIzQzOAorICAgIDB4OEQyMiwgLy8g6LSiLCAjNDg4CisgICAgMHg4RDI4LCAvLyDotKgsICMzODYKKyAgICAweDhEMkQsIC8vIOi0rSwgIzI2MAorICAgIDB4OEQzNCwgLy8g6LS0LCAjNTEwCisgICAgMHg4RDM5LCAvLyDotLksICMyNDIKKyAgICAweDhENDQsIC8vIOi1hCwgIzExNgorICAgIDB4OEQ3NywgLy8g6LW3LCAjMjIwCisgICAgMHg4RDg1LCAvLyDotoUsICM0MDYKKyAgICAweDhERUYsIC8vIOi3rywgIzIzNQorICAgIDB4OEVBQiwgLy8g6LqrLCAjMjYyCisgICAgMHg4RjY2LCAvLyDovaYsICM4MgorICAgIDB4OEY2QywgLy8g6L2sLCAjMzIyCisgICAgMHg4RjdELCAvLyDovb0sICMxNzUKKyAgICAweDhGQkUsIC8vIOi+viwgIzQzNQorICAgIDB4OEZDNywgLy8g6L+HLCAjMTE4CisgICAgMHg4RkQwLCAvLyDov5AsICMzNTcKKyAgICAweDhGRDEsIC8vIOi/kSwgIzQ5MgorICAgIDB4OEZEOCwgLy8g6L+YLCAjMTcxCisgICAgMHg4RkQ5LCAvLyDov5ksICM1NworICAgIDB4OEZEQiwgLy8g6L+bLCAjMTYwCisgICAgMHg4RkRFLCAvLyDov54sICM0ODkKKyAgICAweDkwMDksIC8vIOmAiSwgIzMyOAorICAgIDB4OTAxQSwgLy8g6YCaLCAjMTM3CisgICAgMHg5MDFGLCAvLyDpgJ8sICM0NTgKKyAgICAweDkwMjAsIC8vIOmAoCwgIzUxMQorICAgIDB4OTA1MywgLy8g6YGTLCAjNzkKKyAgICAweDkwQTMsIC8vIOmCoywgIzMwNQorICAgIDB4OTBFOCwgLy8g6YOoLCAjMTAyCisgICAgMHg5MEZELCAvLyDpg70sICMxNjcKKyAgICAweDkxNEQsIC8vIOmFjSwgIzQ3OQorICAgIDB4OTE1MiwgLy8g6YWSLCAjNDQ0CisgICAgMHg5MUNDLCAvLyDph4wsICMxOTYKKyAgICAweDkxQ0QsIC8vIOmHjSwgIzIzMAorICAgIDB4OTFDRiwgLy8g6YePLCAjMjQ4CisgICAgMHg5MUQxLCAvLyDph5EsICMxMzQKKyAgICAweDk1MDAsIC8vIOmUgCwgIzQ2NQorICAgIDB4OTU3RiwgLy8g6ZW/LCAjMTUyCisgICAgMHg5NUU4LCAvLyDpl6gsICMxODUKKyAgICAweDk1RUUsIC8vIOmXriwgIzkyCisgICAgMHg5NUY0LCAvLyDpl7QsICM4OAorICAgIDB4OTVGQiwgLy8g6Ze7LCAjMzEzCisgICAgMHg5NjA1LCAvLyDpmIUsICM0NjcKKyAgICAweDk2MzMsIC8vIOmYsywgIzQyMAorICAgIDB4OTY0NSwgLy8g6ZmFLCAjNTAxCisgICAgMHg5NjUwLCAvLyDpmZAsICMyODYKKyAgICAweDk2NjIsIC8vIOmZoiwgIzI3NgorICAgIDB4OTZDNiwgLy8g6ZuGLCAjMjg0CisgICAgMHg5NzAwLCAvLyDpnIAsICM0MDUKKyAgICAweDk3NjIsIC8vIOmdoiwgIzEyMworICAgIDB4OTdGMywgLy8g6Z+zLCAjMzM1CisgICAgMHg5ODc1LCAvLyDpobUsICM2MworICAgIDB4OTg3OSwgLy8g6aG5LCAjNTA2CisgICAgMHg5ODkxLCAvLyDpopEsICMyMDAKKyAgICAweDk4OTgsIC8vIOmimCwgIzExMAorICAgIDB4OThDRSwgLy8g6aOOLCAjMjUyCisgICAgMHg5OERGLCAvLyDpo58sICM0NDUKKyAgICAweDk5OTYsIC8vIOmmliwgIzE0OQorICAgIDB4OTk5OSwgLy8g6aaZLCAjNTEyCisgICAgMHg5QTZDLCAvLyDpqawsICMzOTIKKyAgICAweDlBOEMsIC8vIOmqjCwgIzM4MgorICAgIDB4OUFEOCwgLy8g6auYLCAjNjcKKyAgICAweDlGOTksIC8vIOm+mSwgIzQyNgorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X3poQ05fY292ZXJhZ2U9MC43MTg5NTAzNjkzMzk5NzM7CisKKy8vIFRoZSA1MTIgbW9zdCBmcmVxdWVudGx5IG9jY3VyaW5nIGNoYXJhY3RlcnMgZm9yIHRoZSB6aFRXIGxhbmd1YWdlIGluIGEgc2FtcGxlIG9mIHRoZSBJbnRlcm5ldC4KKy8vIE9yZGVyZWQgYnkgY29kZXBvaW50LCBjb21tZW50IHNob3dzIGNoYXJhY3RlciBhbmQgcmFua2luZyBieSBmcmVxdWVuY3kKK2NvbnN0IHVpbnQxNl90IGZyZXF1ZW50X3poVFdbXSA9IHsKKyAgICAweDRFMDAsIC8vIOS4gCwgIzIKKyAgICAweDRFMDksIC8vIOS4iSwgIzEzMQorICAgIDB4NEUwQSwgLy8g5LiKLCAjMTIKKyAgICAweDRFMEIsIC8vIOS4iywgIzM3CisgICAgMHg0RTBELCAvLyDkuI0sICM2CisgICAgMHg0RTE2LCAvLyDkuJYsICMzMTIKKyAgICAweDRFMjYsIC8vIOS4piwgIzQzNAorICAgIDB4NEUyRCwgLy8g5LitLCAjOQorICAgIDB4NEUzQiwgLy8g5Li7LCAjOTcKKyAgICAweDRFNEIsIC8vIOS5iywgIzU1CisgICAgMHg0RTVGLCAvLyDkuZ8sICM5NQorICAgIDB4NEU4NiwgLy8g5LqGLCAjMTkKKyAgICAweDRFOEIsIC8vIOS6iywgIzEyOAorICAgIDB4NEU4QywgLy8g5LqMLCAjMTg3CisgICAgMHg0RTk0LCAvLyDkupQsICMzMzkKKyAgICAweDRFOUIsIC8vIOS6mywgIzQzNQorICAgIDB4NEU5RSwgLy8g5LqeLCAjNDMyCisgICAgMHg0RUE0LCAvLyDkuqQsICMyNjQKKyAgICAweDRFQUIsIC8vIOS6qywgIzE2MAorICAgIDB4NEVCQSwgLy8g5Lq6LCAjMworICAgIDB4NEVDMCwgLy8g5LuALCAjNDgzCisgICAgMHg0RUNBLCAvLyDku4osICMzODAKKyAgICAweDRFQ0IsIC8vIOS7iywgIzQ2OAorICAgIDB4NEVENiwgLy8g5LuWLCAjNjUKKyAgICAweDRFRTMsIC8vIOS7oywgIzI4NAorICAgIDB4NEVFNSwgLy8g5LulLCAjMjYKKyAgICAweDRFRjYsIC8vIOS7tiwgIzIzNAorICAgIDB4NEVGQiwgLy8g5Lu7LCAjMzgxCisgICAgMHg0RUZELCAvLyDku70sICM0NDcKKyAgICAweDRGNDYsIC8vIOS9hiwgIzI4MQorICAgIDB4NEY0RCwgLy8g5L2NLCAjMjAyCisgICAgMHg0RjRGLCAvLyDkvY8sICM0NzEKKyAgICAweDRGNTUsIC8vIOS9lSwgIzMzNAorICAgIDB4NEY1QywgLy8g5L2cLCAjNTYKKyAgICAweDRGNjAsIC8vIOS9oCwgIzY0CisgICAgMHg0RjdGLCAvLyDkvb8sICMyMzYKKyAgICAweDRGODYsIC8vIOS+hiwgIzM4CisgICAgMHg0RjlCLCAvLyDkvpssICMzOTcKKyAgICAweDRGQkYsIC8vIOS+vywgIzQ0MAorICAgIDB4NEZDMiwgLy8g5L+CLCAjNTA2CisgICAgMHg0RkRELCAvLyDkv50sICMxNjEKKyAgICAweDRGRTEsIC8vIOS/oSwgIzI2OAorICAgIDB4NEZFRSwgLy8g5L+uLCAjNDczCisgICAgMHg1MDBCLCAvLyDlgIssICMyNworICAgIDB4NTAxMSwgLy8g5YCRLCAjMTA5CisgICAgMHg1MDVBLCAvLyDlgZosICMzODMKKyAgICAweDUwNjUsIC8vIOWBpSwgIzQxNQorICAgIDB4NTA5OSwgLy8g5YKZLCAjNDYxCisgICAgMHg1MEIzLCAvLyDlgrMsICMyNzcKKyAgICAweDUwQ0YsIC8vIOWDjywgIzQwMworICAgIDB4NTBGOSwgLy8g5YO5LCAjOTMKKyAgICAweDUxMkEsIC8vIOWEqiwgIzM5NgorICAgIDB4NTE0MywgLy8g5YWDLCAjMTU4CisgICAgMHg1MTQ4LCAvLyDlhYgsICMzODIKKyAgICAweDUxNDksIC8vIOWFiSwgIzIxNgorICAgIDB4NTE0RCwgLy8g5YWNLCAjMzIxCisgICAgMHg1MTUyLCAvLyDlhZIsICMzNzQKKyAgICAweDUxNjUsIC8vIOWFpSwgIzU4CisgICAgMHg1MTY3LCAvLyDlhacsICMxMDYKKyAgICAweDUxNjgsIC8vIOWFqCwgIzY3CisgICAgMHg1MTY5LCAvLyDlhaksICMzMjIKKyAgICAweDUxNkMsIC8vIOWFrCwgIzUzCisgICAgMHg1MTZELCAvLyDlha0sICM0OTMKKyAgICAweDUxNzEsIC8vIOWFsSwgIzQ1NgorICAgIDB4NTE3NiwgLy8g5YW2LCAjMTQ4CisgICAgMHg1MTc3LCAvLyDlhbcsICMzMjgKKyAgICAweDUxOEEsIC8vIOWGiiwgIzM2MAorICAgIDB4NTE4RCwgLy8g5YaNLCAjMzExCisgICAgMHg1MUZBLCAvLyDlh7osICM0NAorICAgIDB4NTIwNiwgLy8g5YiGLCAjMTUKKyAgICAweDUyMTcsIC8vIOWIlywgIzI1OQorICAgIDB4NTIyNSwgLy8g5YilLCAjMzYxCisgICAgMHg1MjI5LCAvLyDliKksICMyNTEKKyAgICAweDUyMzAsIC8vIOWIsCwgIzI5CisgICAgMHg1MjQ3LCAvLyDliYcsICM1MTEKKyAgICAweDUyNEQsIC8vIOWJjSwgIzgyCisgICAgMHg1Mjc1LCAvLyDlibUsICM0MDkKKyAgICAweDUyOUIsIC8vIOWKmywgIzE3NgorICAgIDB4NTI5RiwgLy8g5YqfLCAjNDMwCisgICAgMHg1MkEwLCAvLyDliqAsICM4NworICAgIDB4NTJBOSwgLy8g5YqpLCAjNDY1CisgICAgMHg1MkQ1LCAvLyDli5UsICM0OAorICAgIDB4NTJEOSwgLy8g5YuZLCAjMTAyCisgICAgMHg1MzA1LCAvLyDljIUsICMyNDgKKyAgICAweDUzMTYsIC8vIOWMliwgIzIyMworICAgIDB4NTMxNywgLy8g5YyXLCAjMTQ1CisgICAgMHg1MzQwLCAvLyDljYAsICM2MAorICAgIDB4NTM0MSwgLy8g5Y2BLCAjMjQyCisgICAgMHg1MzU3LCAvLyDljZcsICMyNjEKKyAgICAweDUzNUEsIC8vIOWNmiwgIzQ4NAorICAgIDB4NTM2MSwgLy8g5Y2hLCAjMzI3CisgICAgMHg1MzcwLCAvLyDljbAsICM0OTgKKyAgICAweDUzNzMsIC8vIOWNsywgIzM1MQorICAgIDB4NTM5RiwgLy8g5Y6fLCAjMjM3CisgICAgMHg1M0JCLCAvLyDljrssICMxOTAKKyAgICAweDUzQzMsIC8vIOWPgywgIzQ0NAorICAgIDB4NTNDOCwgLy8g5Y+ILCAjNDI2CisgICAgMHg1M0NBLCAvLyDlj4osICMxMzYKKyAgICAweDUzQ0IsIC8vIOWPiywgIzE0MgorICAgIDB4NTNENiwgLy8g5Y+WLCAjNDIyCisgICAgMHg1M0Q3LCAvLyDlj5csICM0MTAKKyAgICAweDUzRTMsIC8vIOWPoywgIzM1NworICAgIDB4NTNFQSwgLy8g5Y+qLCAjMjUwCisgICAgMHg1M0VGLCAvLyDlj68sICMzNQorICAgIDB4NTNGMCwgLy8g5Y+wLCAjMzQKKyAgICAweDUzRjgsIC8vIOWPuCwgIzIyNgorICAgIDB4NTQwMywgLy8g5ZCDLCAjMzYyCisgICAgMHg1NDA0LCAvLyDlkIQsICM0NTQKKyAgICAweDU0MDgsIC8vIOWQiCwgIzE0NworICAgIDB4NTQwQywgLy8g5ZCMLCAjMTczCisgICAgMHg1NDBELCAvLyDlkI0sICMxMDgKKyAgICAweDU0NEEsIC8vIOWRiiwgIzE4NgorICAgIDB4NTQ4QywgLy8g5ZKMLCAjMTMwCisgICAgMHg1NEMxLCAvLyDlk4EsICMyMworICAgIDB4NTRFMSwgLy8g5ZOhLCAjMTUwCisgICAgMHg1NTQ2LCAvLyDllYYsICM3NQorICAgIDB4NTU0RiwgLy8g5ZWPLCAjMTIwCisgICAgMHg1NTlDLCAvLyDllpwsICM1MDIKKyAgICAweDU1QUUsIC8vIOWWriwgIzIxMAorICAgIDB4NTVDRSwgLy8g5ZeOLCAjNDQzCisgICAgMHg1NjY4LCAvLyDlmagsICMzMDUKKyAgICAweDU2REIsIC8vIOWbmywgIzMxOAorICAgIDB4NTZERSwgLy8g5ZueLCAjNTkKKyAgICAweDU2RTAsIC8vIOWboCwgIzI1MworICAgIDB4NTcwQiwgLy8g5ZyLLCAjMjEKKyAgICAweDU3MTIsIC8vIOWckiwgIzM0NQorICAgIDB4NTcxNiwgLy8g5ZyWLCAjNzMKKyAgICAweDU3MTgsIC8vIOWcmCwgIzMzOAorICAgIDB4NTcyOCwgLy8g5ZyoLCAjMTEKKyAgICAweDU3MzAsIC8vIOWcsCwgIzUwCisgICAgMHg1NzhCLCAvLyDlnossICMyNzAKKyAgICAweDU3Q0UsIC8vIOWfjiwgIzQ2NgorICAgIDB4NTdGQSwgLy8g5Z+6LCAjMzQ5CisgICAgMHg1ODMxLCAvLyDloLEsICMxMjcKKyAgICAweDU4MzQsIC8vIOWgtCwgIzE2NQorICAgIDB4NThFQiwgLy8g5aOrLCAjMzcyCisgICAgMHg1OTE2LCAvLyDlpJYsICMxNTIKKyAgICAweDU5MUEsIC8vIOWkmiwgIzU0CisgICAgMHg1OTI3LCAvLyDlpKcsICM4CisgICAgMHg1OTI5LCAvLyDlpKksICM0MworICAgIDB4NTkyQSwgLy8g5aSqLCAjMzQzCisgICAgMHg1OTQ3LCAvLyDlpYcsICMzMjUKKyAgICAweDU5NzMsIC8vIOWlsywgIzg1CisgICAgMHg1OTc5LCAvLyDlpbksICM0MjAKKyAgICAweDU5N0QsIC8vIOWlvSwgIzIyCisgICAgMHg1OTgyLCAvLyDlpoIsICMxNDQKKyAgICAweDVCNTAsIC8vIOWtkCwgIzQ2CisgICAgMHg1QjU3LCAvLyDlrZcsICMyNzUKKyAgICAweDVCNzgsIC8vIOWtuCwgIzQ5CisgICAgMHg1Qjg5LCAvLyDlroksICMyMzkKKyAgICAweDVCOEMsIC8vIOWujCwgIzMyMAorICAgIDB4NUI5QSwgLy8g5a6aLCAjMTU5CisgICAgMHg1QkEyLCAvLyDlrqIsICMxODgKKyAgICAweDVCQjYsIC8vIOWutiwgIzMxCisgICAgMHg1QkI5LCAvLyDlrrksICMyNDQKKyAgICAweDVCRTYsIC8vIOWvpiwgIzE5OAorICAgIDB4NUJGNiwgLy8g5a+2LCAjMzY3CisgICAgMHg1QzA3LCAvLyDlsIcsICMyMzIKKyAgICAweDVDMDgsIC8vIOWwiCwgIzEzMworICAgIDB4NUMwQiwgLy8g5bCLLCAjMzUyCisgICAgMHg1QzBELCAvLyDlsI0sICMxMjYKKyAgICAweDVDMEUsIC8vIOWwjiwgIzQxOAorICAgIDB4NUMwRiwgLy8g5bCPLCAjMjAKKyAgICAweDVDMTEsIC8vIOWwkSwgIzM2OAorICAgIDB4NUMzMSwgLy8g5bCxLCAjNjMKKyAgICAweDVDNTUsIC8vIOWxlSwgIzM0MQorICAgIDB4NUM3MSwgLy8g5bGxLCAjMjczCisgICAgMHg1REU1LCAvLyDlt6UsICMxMjEKKyAgICAweDVERjEsIC8vIOW3sSwgIzQwMgorICAgIDB4NURGMiwgLy8g5beyLCAjMjk5CisgICAgMHg1RTAyLCAvLyDluIIsICM4MQorICAgIDB4NUUyQiwgLy8g5birLCAjMjYyCisgICAgMHg1RTM2LCAvLyDluLYsICM0NzAKKyAgICAweDVFMzgsIC8vIOW4uCwgIzMwMworICAgIDB4NUU3MywgLy8g5bmzLCAjMjk3CisgICAgMHg1RTc0LCAvLyDlubQsICMzMAorICAgIDB4NUU5NywgLy8g5bqXLCAjMTcxCisgICAgMHg1RUE2LCAvLyDluqYsICMyMjAKKyAgICAweDVFQjcsIC8vIOW6tywgIzQ0MQorICAgIDB4NUVFMywgLy8g5bujLCAjMjc5CisgICAgMHg1RUZBLCAvLyDlu7osICMyNTQKKyAgICAweDVGMEYsIC8vIOW8jywgIzE1NQorICAgIDB4NUYxNSwgLy8g5byVLCAjMzQ2CisgICAgMHg1RjM1LCAvLyDlvLUsICMzNjYKKyAgICAweDVGMzcsIC8vIOW8tywgIzQzNworICAgIDB4NUY3MSwgLy8g5b2xLCAjOTQKKyAgICAweDVGODgsIC8vIOW+iCwgIzE3NworICAgIDB4NUY4QywgLy8g5b6MLCAjNjYKKyAgICAweDVGOTcsIC8vIOW+lywgIzExMworICAgIDB4NUY5RSwgLy8g5b6eLCAjNDM2CisgICAgMHg1RkMzLCAvLyDlv4MsICM1NworICAgIDB4NUZFQiwgLy8g5b+rLCAjMjkyCisgICAgMHg2MDI3LCAvLyDmgKcsICMxNzUKKyAgICAweDYwNkYsIC8vIOaBrywgIzM3OAorICAgIDB4NjBBOCwgLy8g5oKoLCAjMjUyCisgICAgMHg2MEM1LCAvLyDmg4UsICMxMjMKKyAgICAweDYwRjMsIC8vIOaDsywgIzE3OAorICAgIDB4NjEwRiwgLy8g5oSPLCAjMTY4CisgICAgMHg2MTFCLCAvLyDmhJssICMxMjUKKyAgICAweDYxMUYsIC8vIOaEnywgIzIxMQorICAgIDB4NjFDOSwgLy8g5oeJLCAjMTY0CisgICAgMHg2MjEwLCAvLyDmiJAsICM4NgorICAgIDB4NjIxMSwgLy8g5oiRLCAjNworICAgIDB4NjIxNiwgLy8g5oiWLCAjMTk5CisgICAgMHg2MjMwLCAvLyDmiLAsICM0MzgKKyAgICAweDYyMzIsIC8vIOaIsiwgIzMwOQorICAgIDB4NjIzNiwgLy8g5oi2LCAjNDk3CisgICAgMHg2MjNGLCAvLyDmiL8sICMyNzQKKyAgICAweDYyNDAsIC8vIOaJgCwgIzc5CisgICAgMHg2MjRCLCAvLyDmiYssICM2OAorICAgIDB4NjI0RCwgLy8g5omNLCAjNDAwCisgICAgMHg2MjUzLCAvLyDmiZMsICMyNzgKKyAgICAweDYyN0UsIC8vIOaJviwgIzQ0OQorICAgIDB4NjI4MCwgLy8g5oqALCAjMzMyCisgICAgMHg2Mjk1LCAvLyDmipUsICM0MjUKKyAgICAweDYyQzksIC8vIOaLiSwgIzUwMAorICAgIDB4NjJDRCwgLy8g5ouNLCAjMzk4CisgICAgMHg2MzA3LCAvLyDmjIcsICM0MDcKKyAgICAweDYzOTIsIC8vIOaOkiwgIzQ1OAorICAgIDB4NjNBNSwgLy8g5o6lLCAjMzI2CisgICAgMHg2M0E4LCAvLyDmjqgsICMxNTMKKyAgICAweDYzRDAsIC8vIOaPkCwgIzIzNQorICAgIDB4NjQxQywgLy8g5pCcLCAjMzE0CisgICAgMHg2NDY5LCAvLyDmkaksICM0NzIKKyAgICAweDY1MzYsIC8vIOaUtiwgIzI0OQorICAgIDB4NjUzOSwgLy8g5pS5LCAjNTA4CisgICAgMHg2NTNFLCAvLyDmlL4sICMzMzEKKyAgICAweDY1M0YsIC8vIOaUvywgIzI5NQorICAgIDB4NjU1OSwgLy8g5pWZLCAjMTg0CisgICAgMHg2NTc0LCAvLyDmlbQsICMzOTQKKyAgICAweDY1NzgsIC8vIOaVuCwgIzEzNAorICAgIDB4NjU4NywgLy8g5paHLCAjMTYKKyAgICAweDY1OTksIC8vIOaWmSwgIzE2NworICAgIDB4NjVBRiwgLy8g5pavLCAjNDc2CisgICAgMHg2NUIwLCAvLyDmlrAsICMxMAorICAgIDB4NjVCOSwgLy8g5pa5LCAjOTYKKyAgICAweDY1QkMsIC8vIOaWvCwgIzcwCisgICAgMHg2NUM1LCAvLyDml4UsICMyODkKKyAgICAweDY1RTUsIC8vIOaXpSwgIzE4CisgICAgMHg2NjBFLCAvLyDmmI4sICMxMTgKKyAgICAweDY2MTMsIC8vIOaYkywgIzQ4MgorICAgIDB4NjYxRiwgLy8g5pifLCAjMjA1CisgICAgMHg2NjJGLCAvLyDmmK8sICM1CisgICAgMHg2NjQyLCAvLyDmmYIsICMxMworICAgIDB4NjZGNCwgLy8g5pu0LCAjMTQ5CisgICAgMHg2NkY4LCAvLyDmm7gsICMyMDkKKyAgICAweDY3MDAsIC8vIOacgCwgIzUxCisgICAgMHg2NzAzLCAvLyDmnIMsICMxNAorICAgIDB4NjcwOCwgLy8g5pyILCAjMjUKKyAgICAweDY3MDksIC8vIOaciSwgIzQKKyAgICAweDY3MEQsIC8vIOacjSwgIzk5CisgICAgMHg2NzFGLCAvLyDmnJ8sICMxMzkKKyAgICAweDY3MkEsIC8vIOacqiwgIzQwNAorICAgIDB4NjcyQywgLy8g5pysLCAjNDUKKyAgICAweDY3NzEsIC8vIOadsSwgIzIyMQorICAgIDB4Njc3RiwgLy8g5p2/LCAjMzY0CisgICAgMHg2Nzk3LCAvLyDmnpcsICMzMzAKKyAgICAweDY3OUMsIC8vIOaenCwgIzE3OQorICAgIDB4NjdFNSwgLy8g5p+lLCAjMjgzCisgICAgMHg2ODNDLCAvLyDmoLwsICMxNTcKKyAgICAweDY4NDgsIC8vIOahiCwgIzM5MgorICAgIDB4Njg5RCwgLy8g5qKdLCAjNDA2CisgICAgMHg2OTZELCAvLyDmpa0sICMxMDMKKyAgICAweDZBMDIsIC8vIOaogiwgIzExNgorICAgIDB4NkExMywgLy8g5qiTLCAjNDExCisgICAgMHg2QTE5LCAvLyDmqJksICMzODQKKyAgICAweDZBMjMsIC8vIOaooywgIzMwNgorICAgIDB4NkE1RiwgLy8g5qmfLCAjNDAKKyAgICAweDZBQTIsIC8vIOaqoiwgIzM1OQorICAgIDB4NkIwQSwgLy8g5qyKLCAjMjI4CisgICAgMHg2QjIxLCAvLyDmrKEsICMyMjcKKyAgICAweDZCM0UsIC8vIOasviwgIzI3NgorICAgIDB4NkI0QywgLy8g5q2MLCAjNDk2CisgICAgMHg2QjYxLCAvLyDmraEsICM0MjcKKyAgICAweDZCNjMsIC8vIOatoywgIzIwNgorICAgIDB4NkI2NCwgLy8g5q2kLCAjMjQ3CisgICAgMHg2QkNGLCAvLyDmr48sICMzOTEKKyAgICAweDZCRDQsIC8vIOavlCwgIzI1NworICAgIDB4NkMxMSwgLy8g5rCRLCAjMjMwCisgICAgMHg2QzIzLCAvLyDmsKMsICMyMDAKKyAgICAweDZDMzQsIC8vIOawtCwgIzE0MAorICAgIDB4NkM0MiwgLy8g5rGCLCAjNTAxCisgICAgMHg2QzkyLCAvLyDmspIsICMxNjIKKyAgICAweDZDRDUsIC8vIOazlSwgIzg5CisgICAgMHg2RDNCLCAvLyDmtLssICMxMjQKKyAgICAweDZENDEsIC8vIOa1gSwgIzMxNQorICAgIDB4NkQ3NywgLy8g5rW3LCAjMjU4CisgICAgMHg2RDg4LCAvLyDmtogsICMzNDIKKyAgICAweDZFMDUsIC8vIOa4hSwgIzMyOQorICAgIDB4NkUyRiwgLy8g5rivLCAjMjkzCisgICAgMHg2RjE0LCAvLyDmvJQsICM0OTEKKyAgICAweDcwNjMsIC8vIOeBoywgIzE5NQorICAgIDB4NzBCQSwgLy8g54K6LCAjMzkKKyAgICAweDcxMjEsIC8vIOeEoSwgIzEwNworICAgIDB4NzEzNiwgLy8g54S2LCAjMjE1CisgICAgMHg3MTY3LCAvLyDnhacsICMzNzYKKyAgICAweDcxQjEsIC8vIOeGsSwgIzI0NQorICAgIDB4NzI0NywgLy8g54mHLCAjOTAKKyAgICAweDcyNDgsIC8vIOeJiCwgIzExMgorICAgIDB4NzI0QywgLy8g54mMLCAjNDY3CisgICAgMHg3MjY5LCAvLyDniaksICMxMTAKKyAgICAweDcyNzksIC8vIOeJuSwgIzE4MworICAgIDB4NzM4QiwgLy8g546LLCAjMjg3CisgICAgMHg3M0E5LCAvLyDnjqksICMzNTQKKyAgICAweDczRkUsIC8vIOePviwgIzE0MworICAgIDB4NzQwMywgLy8g55CDLCAjMzUwCisgICAgMHg3NDA2LCAvLyDnkIYsICMxMDUKKyAgICAweDc1MUYsIC8vIOeUnywgIzI0CisgICAgMHg3NTIyLCAvLyDnlKIsICMyMDEKKyAgICAweDc1MjgsIC8vIOeUqCwgIzE3CisgICAgMHg3NTMxLCAvLyDnlLEsICMyODgKKyAgICAweDc1MzcsIC8vIOeUtywgIzI5OAorICAgIDB4NzU0QywgLy8g55WMLCAjMzk5CisgICAgMHg3NTU5LCAvLyDnlZksICMyMTgKKyAgICAweDc1NkIsIC8vIOeVqywgIzQxMgorICAgIDB4NzU3NiwgLy8g55W2LCAjMTg1CisgICAgMHg3NjdCLCAvLyDnmbssICMxMzgKKyAgICAweDc2N0MsIC8vIOeZvCwgIzI4CisgICAgMHg3NjdELCAvLyDnmb0sICMzNzcKKyAgICAweDc2N0UsIC8vIOeZviwgIzM5MworICAgIDB4NzY4NCwgLy8g55qELCAjMQorICAgIDB4NzZFRSwgLy8g55uuLCAjMjcxCisgICAgMHg3NkY0LCAvLyDnm7QsICMzNzkKKyAgICAweDc2RjgsIC8vIOebuCwgIzk4CisgICAgMHg3NzBCLCAvLyDnnIssICM1MgorICAgIDB4NzcxRiwgLy8g55yfLCAjMTgwCisgICAgMHg3NzNDLCAvLyDnnLwsICM0MzMKKyAgICAweDc3RTUsIC8vIOefpSwgIzE3MAorICAgIDB4NzhCQywgLy8g56K8LCAjNDgxCisgICAgMHg3OTNBLCAvLyDnpLosICMzNTMKKyAgICAweDc5M0UsIC8vIOekviwgIzMzMworICAgIDB4Nzk1RSwgLy8g56WeLCAjMzA0CisgICAgMHg3OTY4LCAvLyDnpagsICM0NzcKKyAgICAweDc5OEYsIC8vIOemjywgIzQ5NAorICAgIDB4NzlDMSwgLy8g56eBLCAjNTA3CisgICAgMHg3OUQxLCAvLyDnp5EsICMyODAKKyAgICAweDdBMEIsIC8vIOeoiywgIzI3MgorICAgIDB4N0EyRSwgLy8g56iuLCAjMzM3CisgICAgMHg3QTRELCAvLyDnqY0sICMzODUKKyAgICAweDdBN0EsIC8vIOepuiwgIzMyNAorICAgIDB4N0FDQiwgLy8g56uLLCAjMjg2CisgICAgMHg3QUQ5LCAvLyDnq5ksICMxMTcKKyAgICAweDdBRTAsIC8vIOeroCwgIzE0MQorICAgIDB4N0IyQywgLy8g56ysLCAjMTM1CisgICAgMHg3QjQ5LCAvLyDnrYksICMyNDAKKyAgICAweDdCQTEsIC8vIOeuoSwgIzM0MAorICAgIDB4N0JDMCwgLy8g56+ALCAjNDMxCisgICAgMHg3QkM3LCAvLyDnr4csICM0NzkKKyAgICAweDdDMjEsIC8vIOewoSwgIzQ5OQorICAgIDB4N0NCRSwgLy8g57K+LCAjMjEzCisgICAgMHg3Q0ZCLCAvLyDns7ssICMyMTIKKyAgICAweDdEMDQsIC8vIOe0hCwgIzQ2MgorICAgIDB4N0QwNSwgLy8g57SFLCAjNDUyCisgICAgMHg3RDFBLCAvLyDntJosICMyNjcKKyAgICAweDdEMzAsIC8vIOe0sCwgIzQ4NgorICAgIDB4N0Q0NCwgLy8g57WELCAjMzM1CisgICAgMHg3RDUwLCAvLyDntZAsICMyNDMKKyAgICAweDdENjYsIC8vIOe1piwgIzM1NQorICAgIDB4N0Q3MSwgLy8g57WxLCAjMzc1CisgICAgMHg3RDkzLCAvLyDntpMsICMxMTEKKyAgICAweDdEQjIsIC8vIOe2siwgIzMyCisgICAgMHg3RERBLCAvLyDnt5osICMxNTEKKyAgICAweDdFMjMsIC8vIOe4oywgIzQzOQorICAgIDB4N0UzRCwgLy8g57i9LCAjMzcwCisgICAgMHg3RjhFLCAvLyDnvo4sICM0MQorICAgIDB4N0ZBOSwgLy8g576pLCAjNTA0CisgICAgMHg4MDAxLCAvLyDogIEsICMyOTAKKyAgICAweDgwMDMsIC8vIOiAgywgIzQyOAorICAgIDB4ODAwNSwgLy8g6ICFLCAjOTIKKyAgICAweDgwMEMsIC8vIOiAjCwgIzIxNworICAgIDB4ODA1RSwgLy8g6IGeLCAjMTgxCisgICAgMHg4MDZGLCAvLyDoga8sICMzMTAKKyAgICAweDgwNzIsIC8vIOiBsiwgIzQxMworICAgIDB4ODBBMSwgLy8g6IKhLCAjMzkwCisgICAgMHg4MEIyLCAvLyDogrIsICM0NTMKKyAgICAweDgwRkQsIC8vIOiDvSwgIzcxCisgICAgMHg4MTY2LCAvLyDohaYsICM0MDgKKyAgICAweDgxRUEsIC8vIOiHqiwgIzYxCisgICAgMHg4MUYzLCAvLyDoh7MsICMzNDQKKyAgICAweDgyMDcsIC8vIOiIhywgIzg0CisgICAgMHg4MjA5LCAvLyDoiIksICM0NjMKKyAgICAweDgyNzIsIC8vIOiJsiwgIzE5MgorICAgIDB4ODJCMSwgLy8g6IqxLCAjMjU1CisgICAgMHg4MkYxLCAvLyDoi7EsICMzNDgKKyAgICAweDgzRUYsIC8vIOiPrywgIzE5NgorICAgIDB4ODQyQywgLy8g6JCsLCAjMzE2CisgICAgMHg4NDNELCAvLyDokL0sICMzMDgKKyAgICAweDg0NTcsIC8vIOiRlywgIzIzMworICAgIDB4ODVBNiwgLy8g6JamLCAjNDAxCisgICAgMHg4NUNGLCAvLyDol48sICM1MDMKKyAgICAweDg1REQsIC8vIOiXnSwgIzQ4OAorICAgIDB4ODY1NSwgLy8g6JmVLCAjNDE5CisgICAgMHg4NjVGLCAvLyDomZ8sICMxOTEKKyAgICAweDg4NEMsIC8vIOihjCwgIzQ3CisgICAgMHg4ODUzLCAvLyDooZMsICMzOTUKKyAgICAweDg4NjgsIC8vIOihqCwgIzc3CisgICAgMHg4OEFCLCAvLyDooqssICMyOTEKKyAgICAweDg4REQsIC8vIOijnSwgIzI1NgorICAgIDB4ODhFMSwgLy8g6KOhLCAjMzY5CisgICAgMHg4OEZELCAvLyDoo70sICM1MTAKKyAgICAweDg5N0YsIC8vIOilvywgIzMwMAorICAgIDB4ODk4MSwgLy8g6KaBLCAjMzYKKyAgICAweDg5OEIsIC8vIOimiywgIzMwNworICAgIDB4ODk5NiwgLy8g6KaWLCAjMjA0CisgICAgMHg4OUJBLCAvLyDoprosICM0NTAKKyAgICAweDg5QkQsIC8vIOimvSwgIzM4NworICAgIDB4ODlDMCwgLy8g6KeALCAjMzY1CisgICAgMHg4OUUzLCAvLyDop6MsICMzMjMKKyAgICAweDhBMDAsIC8vIOiogCwgIzE2OQorICAgIDB4OEEwMiwgLy8g6KiCLCAjNDIzCisgICAgMHg4QTA4LCAvLyDoqIgsICMyMjUKKyAgICAweDhBMEEsIC8vIOioiiwgIzE1NgorICAgIDB4OEEwRSwgLy8g6KiOLCAjMzczCisgICAgMHg4QTE4LCAvLyDoqJgsICMyMjIKKyAgICAweDhBMkQsIC8vIOiorSwgIzE3NAorICAgIDB4OEEzQiwgLy8g6Ki7LCAjMzU2CisgICAgMHg4QTU1LCAvLyDoqZUsICMyNDYKKyAgICAweDhBNjYsIC8vIOippiwgIzQ0OAorICAgIDB4OEE3MSwgLy8g6KmxLCAjMjI5CisgICAgMHg4QTcyLCAvLyDoqbIsICM0NDYKKyAgICAweDhBOEQsIC8vIOiqjSwgIzQ2NAorICAgIDB4OEE5RSwgLy8g6KqeLCAjMzcxCisgICAgMHg4QUFBLCAvLyDoqqosICM5MQorICAgIDB4OEFCRiwgLy8g6Kq/LCAjNTA5CisgICAgMHg4QUNCLCAvLyDoq4ssICMxMTkKKyAgICAweDhBRDYsIC8vIOirliwgIzExNAorICAgIDB4OEIxRCwgLy8g6KydLCAjMzg5CisgICAgMHg4QjQ5LCAvLyDorYksICM0MjkKKyAgICAweDhCNTgsIC8vIOitmCwgIzQxNgorICAgIDB4OEI3MCwgLy8g6K2wLCAjNDg1CisgICAgMHg4Qjc3LCAvLyDorbcsICM0NzUKKyAgICAweDhCODAsIC8vIOiugCwgIzM4NgorICAgIDB4OEI4QSwgLy8g6K6KLCAjMzg4CisgICAgMHg4QjkzLCAvLyDorpMsICMzMzYKKyAgICAweDhDQTgsIC8vIOiyqCwgIzMxMworICAgIDB4OENCNywgLy8g6LK3LCAjMjYwCisgICAgMHg4Q0JCLCAvLyDosrssICMyMDMKKyAgICAweDhDQzcsIC8vIOizhywgIzYyCisgICAgMHg4Q0UzLCAvLyDos6MsICMyOTQKKyAgICAweDhDRUEsIC8vIOizqiwgIzQ1NworICAgIDB4OENGQywgLy8g6LO8LCAjMTg5CisgICAgMHg4RDc3LCAvLyDotbcsICMyMTQKKyAgICAweDhEODUsIC8vIOi2hSwgIzI5NgorICAgIDB4OERERiwgLy8g6LefLCAjNDg5CisgICAgMHg4REVGLCAvLyDot68sICMxMzcKKyAgICAweDhFQUIsIC8vIOi6qywgIzE5NworICAgIDB4OEVDQSwgLy8g6LuKLCAjNzYKKyAgICAweDhGMDksIC8vIOi8iSwgIzMwMQorICAgIDB4OEY0OSwgLy8g6L2JLCAjMjgyCisgICAgMHg4RkQxLCAvLyDov5EsICM0MTQKKyAgICAweDkwMDEsIC8vIOmAgSwgIzM2MworICAgIDB4OTAxOSwgLy8g6YCZLCAjNDIKKyAgICAweDkwMUEsIC8vIOmAmiwgIzIwNworICAgIDB4OTAxRiwgLy8g6YCfLCAjNDk1CisgICAgMHg5MDIwLCAvLyDpgKAsICM0NTUKKyAgICAweDkwMjMsIC8vIOmAoywgIzI4NQorICAgIDB4OTAzMiwgLy8g6YCyLCAjMjMxCisgICAgMHg5MDRBLCAvLyDpgYosICMxMzIKKyAgICAweDkwNEIsIC8vIOmBiywgIzIxOQorICAgIDB4OTA0RSwgLy8g6YGOLCAjMTAxCisgICAgMHg5MDUzLCAvLyDpgZMsICMxNDYKKyAgICAweDkwNTQsIC8vIOmBlCwgIzQxNworICAgIDB4OTA3OCwgLy8g6YG4LCAjMTgyCisgICAgMHg5MDg0LCAvLyDpgoQsICMxNTQKKyAgICAweDkwOEEsIC8vIOmCiiwgIzQ4NworICAgIDB4OTBBMywgLy8g6YKjLCAjMjY5CisgICAgMHg5MEU4LCAvLyDpg6gsICM3OAorICAgIDB4OTBGRCwgLy8g6YO9LCAjMTA0CisgICAgMHg5MTRELCAvLyDphY0sICM0MjEKKyAgICAweDkxNTIsIC8vIOmFkiwgIzUxMgorICAgIDB4OTFBQiwgLy8g6YarLCAjMzU4CisgICAgMHg5MUNELCAvLyDph40sICMyMjQKKyAgICAweDkxQ0YsIC8vIOmHjywgIzMxOQorICAgIDB4OTFEMSwgLy8g6YeRLCAjMTE1CisgICAgMHg5MzA0LCAvLyDpjIQsICMzMDIKKyAgICAweDk1NzcsIC8vIOmVtywgIzE3MgorICAgIDB4OTU4MCwgLy8g6ZaALCAjMTkzCisgICAgMHg5NThCLCAvLyDplossICM3MgorICAgIDB4OTU5MywgLy8g6ZaTLCAjODAKKyAgICAweDk1QjEsIC8vIOmWsSwgIzQwNQorICAgIDB4OTVEQywgLy8g6ZecLCAjNzQKKyAgICAweDk2M0YsIC8vIOmYvywgIzQ2MAorICAgIDB4OTY1MCwgLy8g6ZmQLCAjMjY1CisgICAgMHg5NjYyLCAvLyDpmaIsICM0NzQKKyAgICAweDk2NjQsIC8vIOmZpCwgIzQ3OAorICAgIDB4OTY5QiwgLy8g6ZqbLCAjNDU5CisgICAgMHg5NkM2LCAvLyDpm4YsICMzNDcKKyAgICAweDk2RTIsIC8vIOmboiwgIzQ0MgorICAgIDB4OTZGQiwgLy8g6Zu7LCAjMzMKKyAgICAweDk3MDAsIC8vIOmcgCwgIzQ0NQorICAgIDB4OTc1RSwgLy8g6Z2eLCAjNDUxCisgICAgMHg5NzYyLCAvLyDpnaIsICMxMjkKKyAgICAweDk3RjMsIC8vIOmfsywgIzE5NAorICAgIDB4OTgwMSwgLy8g6aCBLCAjODMKKyAgICAweDk4MkQsIC8vIOmgrSwgIzIzOAorICAgIDB4OTg0QywgLy8g6aGMLCAjMTIyCisgICAgMHg5ODVFLCAvLyDpoZ4sICMxNjMKKyAgICAweDk4QTgsIC8vIOmiqCwgIzI2NgorICAgIDB4OThERiwgLy8g6aOfLCAjMjA4CisgICAgMHg5OTEwLCAvLyDppJAsICM0NjkKKyAgICAweDk5MjgsIC8vIOmkqCwgIzQyNAorICAgIDB4OTk5NiwgLy8g6aaWLCAjMTY2CisgICAgMHg5OTk5LCAvLyDpppksICMyNjMKKyAgICAweDk5QUMsIC8vIOmmrCwgIzMxNworICAgIDB4OUE1NywgLy8g6amXLCAjNDkyCisgICAgMHg5QUQ0LCAvLyDpq5QsICMxMDAKKyAgICAweDlBRDgsIC8vIOmrmCwgIzg4CisgICAgMHg5RUJDLCAvLyDpurwsICMyNDEKKyAgICAweDlFQzMsIC8vIOm7gywgIzQ4MAorICAgIDB4OUVEMSwgLy8g6buRLCAjNDkwCisgICAgMHg5RURFLCAvLyDpu54sICM2OQorICAgIDB4OUY4RCwgLy8g6b6NLCAjNTA1Cit9OworLy8gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNhbXBsZSBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjaGFyYWN0ZXJzCitzdGF0aWMgY29uc3QgZmxvYXQgZnJlcXVlbnRfemhUV19jb3ZlcmFnZT0wLjcwNDg0MTIwMDAyNjg3NzsKKworLy8gVGhlIDUxMiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgY2hhcmFjdGVycyBmb3IgdGhlIGphIGxhbmd1YWdlIGluIGEgc2FtcGxlIG9mIHRoZSBJbnRlcm5ldC4KKy8vIE9yZGVyZWQgYnkgY29kZXBvaW50LCBjb21tZW50IHNob3dzIGNoYXJhY3RlciBhbmQgcmFua2luZyBieSBmcmVxdWVuY3kKK2NvbnN0IHVpbnQxNl90IGZyZXF1ZW50X2phW10gPSB7CisgICAgMHgzMDA1LCAvLyDjgIUsICMzNTIKKyAgICAweDMwNDEsIC8vIOOBgSwgIzQ4NgorICAgIDB4MzA0MiwgLy8g44GCLCAjNTAKKyAgICAweDMwNDQsIC8vIOOBhCwgIzIKKyAgICAweDMwNDYsIC8vIOOBhiwgIzMzCisgICAgMHgzMDQ4LCAvLyDjgYgsICM4MworICAgIDB4MzA0QSwgLy8g44GKLCAjMzcKKyAgICAweDMwNEIsIC8vIOOBiywgIzIxCisgICAgMHgzMDRDLCAvLyDjgYwsICMxNworICAgIDB4MzA0RCwgLy8g44GNLCAjNTEKKyAgICAweDMwNEUsIC8vIOOBjiwgIzMyNAorICAgIDB4MzA0RiwgLy8g44GPLCAjMzgKKyAgICAweDMwNTAsIC8vIOOBkCwgIzMzNAorICAgIDB4MzA1MSwgLy8g44GRLCAjNjAKKyAgICAweDMwNTIsIC8vIOOBkiwgIzI5NgorICAgIDB4MzA1MywgLy8g44GTLCAjMzQKKyAgICAweDMwNTQsIC8vIOOBlCwgIzEwMAorICAgIDB4MzA1NSwgLy8g44GVLCAjMzEKKyAgICAweDMwNTYsIC8vIOOBliwgIzM3OAorICAgIDB4MzA1NywgLy8g44GXLCAjNAorICAgIDB4MzA1OCwgLy8g44GYLCAjMTIxCisgICAgMHgzMDU5LCAvLyDjgZksICMxMgorICAgIDB4MzA1QSwgLy8g44GaLCAjMjE1CisgICAgMHgzMDVCLCAvLyDjgZssICM4NgorICAgIDB4MzA1RCwgLy8g44GdLCAjNjgKKyAgICAweDMwNUYsIC8vIOOBnywgIzExCisgICAgMHgzMDYwLCAvLyDjgaAsICM0MgorICAgIDB4MzA2MSwgLy8g44GhLCAjNjcKKyAgICAweDMwNjMsIC8vIOOBoywgIzIzCisgICAgMHgzMDY0LCAvLyDjgaQsICM3MworICAgIDB4MzA2NiwgLy8g44GmLCAjNworICAgIDB4MzA2NywgLy8g44GnLCAjNgorICAgIDB4MzA2OCwgLy8g44GoLCAjMTQKKyAgICAweDMwNjksIC8vIOOBqSwgIzc1CisgICAgMHgzMDZBLCAvLyDjgaosICM4CisgICAgMHgzMDZCLCAvLyDjgassICM1CisgICAgMHgzMDZELCAvLyDjga0sICMxMjMKKyAgICAweDMwNkUsIC8vIOOBriwgIzEKKyAgICAweDMwNkYsIC8vIOOBrywgIzE2CisgICAgMHgzMDcwLCAvLyDjgbAsICMxNTAKKyAgICAweDMwNzEsIC8vIOOBsSwgIzI1OQorICAgIDB4MzA3MiwgLy8g44GyLCAjMzY0CisgICAgMHgzMDczLCAvLyDjgbMsICMyNjYKKyAgICAweDMwNzUsIC8vIOOBtSwgIzQ4NAorICAgIDB4MzA3NiwgLy8g44G2LCAjMzMwCisgICAgMHgzMDc4LCAvLyDjgbgsICMxNDYKKyAgICAweDMwNzksIC8vIOOBuSwgIzIwNworICAgIDB4MzA3QiwgLy8g44G7LCAjMjU0CisgICAgMHgzMDdFLCAvLyDjgb4sICMxOAorICAgIDB4MzA3RiwgLy8g44G/LCAjNzQKKyAgICAweDMwODAsIC8vIOOCgCwgIzI4NQorICAgIDB4MzA4MSwgLy8g44KBLCAjNzgKKyAgICAweDMwODIsIC8vIOOCgiwgIzMyCisgICAgMHgzMDgzLCAvLyDjgoMsICMxMTEKKyAgICAweDMwODQsIC8vIOOChCwgIzg1CisgICAgMHgzMDg2LCAvLyDjgoYsICMzOTIKKyAgICAweDMwODcsIC8vIOOChywgIzIyNAorICAgIDB4MzA4OCwgLy8g44KILCAjNjMKKyAgICAweDMwODksIC8vIOOCiSwgIzI5CisgICAgMHgzMDhBLCAvLyDjgoosICMyOAorICAgIDB4MzA4QiwgLy8g44KLLCAjOQorICAgIDB4MzA4QywgLy8g44KMLCAjMzUKKyAgICAweDMwOEQsIC8vIOOCjSwgIzEyNworICAgIDB4MzA4RiwgLy8g44KPLCAjODgKKyAgICAweDMwOTIsIC8vIOOCkiwgIzE5CisgICAgMHgzMDkzLCAvLyDjgpMsICMyMgorICAgIDB4MzBBMSwgLy8g44KhLCAjMTkzCisgICAgMHgzMEEyLCAvLyDjgqIsICMyNworICAgIDB4MzBBMywgLy8g44KjLCAjNzAKKyAgICAweDMwQTQsIC8vIOOCpCwgIzE1CisgICAgMHgzMEE2LCAvLyDjgqYsICM4OQorICAgIDB4MzBBNywgLy8g44KnLCAjMTM0CisgICAgMHgzMEE4LCAvLyDjgqgsICM4MQorICAgIDB4MzBBOSwgLy8g44KpLCAjMjI1CisgICAgMHgzMEFBLCAvLyDjgqosICM3NgorICAgIDB4MzBBQiwgLy8g44KrLCAjNTIKKyAgICAweDMwQUMsIC8vIOOCrCwgIzE0NworICAgIDB4MzBBRCwgLy8g44KtLCAjNjYKKyAgICAweDMwQUUsIC8vIOOCriwgIzI0NgorICAgIDB4MzBBRiwgLy8g44KvLCAjMjUKKyAgICAweDMwQjAsIC8vIOOCsCwgIzM5CisgICAgMHgzMEIxLCAvLyDjgrEsICMxMzcKKyAgICAweDMwQjIsIC8vIOOCsiwgIzIwMAorICAgIDB4MzBCMywgLy8g44KzLCAjNDYKKyAgICAweDMwQjQsIC8vIOOCtCwgIzE4MworICAgIDB4MzBCNSwgLy8g44K1LCAjNjQKKyAgICAweDMwQjYsIC8vIOOCtiwgIzIyMQorICAgIDB4MzBCNywgLy8g44K3LCAjNDgKKyAgICAweDMwQjgsIC8vIOOCuCwgIzU1CisgICAgMHgzMEI5LCAvLyDjgrksICMxMworICAgIDB4MzBCQSwgLy8g44K6LCAjMTAzCisgICAgMHgzMEJCLCAvLyDjgrssICMxMDkKKyAgICAweDMwQkMsIC8vIOOCvCwgIzQ5OQorICAgIDB4MzBCRCwgLy8g44K9LCAjMTc1CisgICAgMHgzMEJGLCAvLyDjgr8sICM0NQorICAgIDB4MzBDMCwgLy8g44OALCAjMTA0CisgICAgMHgzMEMxLCAvLyDjg4EsICM3MQorICAgIDB4MzBDMywgLy8g44ODLCAjMjAKKyAgICAweDMwQzQsIC8vIOODhCwgIzExOQorICAgIDB4MzBDNiwgLy8g44OGLCAjNTkKKyAgICAweDMwQzcsIC8vIOODhywgIzgyCisgICAgMHgzMEM4LCAvLyDjg4gsICMxMAorICAgIDB4MzBDOSwgLy8g44OJLCAjNDQKKyAgICAweDMwQ0EsIC8vIOODiiwgIzEwMgorICAgIDB4MzBDQiwgLy8g44OLLCAjNzIKKyAgICAweDMwQ0QsIC8vIOODjSwgIzExNworICAgIDB4MzBDRSwgLy8g44OOLCAjMTkyCisgICAgMHgzMENGLCAvLyDjg48sICMxNjQKKyAgICAweDMwRDAsIC8vIOODkCwgIzYyCisgICAgMHgzMEQxLCAvLyDjg5EsICM5MAorICAgIDB4MzBEMiwgLy8g44OSLCAjMzk4CisgICAgMHgzMEQzLCAvLyDjg5MsICM3NworICAgIDB4MzBENCwgLy8g44OULCAjMTM1CisgICAgMHgzMEQ1LCAvLyDjg5UsICM0NworICAgIDB4MzBENiwgLy8g44OWLCAjNTYKKyAgICAweDMwRDcsIC8vIOODlywgIzQzCisgICAgMHgzMEQ4LCAvLyDjg5gsICMyNjgKKyAgICAweDMwRDksIC8vIOODmSwgIzE1NworICAgIDB4MzBEQSwgLy8g44OaLCAjMTI1CisgICAgMHgzMERCLCAvLyDjg5ssICMxNTUKKyAgICAweDMwREMsIC8vIOODnCwgIzE2OAorICAgIDB4MzBERCwgLy8g44OdLCAjMTE0CisgICAgMHgzMERFLCAvLyDjg54sICM1NworICAgIDB4MzBERiwgLy8g44OfLCAjOTcKKyAgICAweDMwRTAsIC8vIOODoCwgIzY5CisgICAgMHgzMEUxLCAvLyDjg6EsICM1MworICAgIDB4MzBFMiwgLy8g44OiLCAjMTQyCisgICAgMHgzMEUzLCAvLyDjg6MsICM5MworICAgIDB4MzBFNCwgLy8g44OkLCAjMjU4CisgICAgMHgzMEU1LCAvLyDjg6UsICM3OQorICAgIDB4MzBFNiwgLy8g44OmLCAjNDA1CisgICAgMHgzMEU3LCAvLyDjg6csICM5OAorICAgIDB4MzBFOSwgLy8g44OpLCAjMjYKKyAgICAweDMwRUEsIC8vIOODqiwgIzMwCisgICAgMHgzMEVCLCAvLyDjg6ssICMyNAorICAgIDB4MzBFQywgLy8g44OsLCAjNDEKKyAgICAweDMwRUQsIC8vIOODrSwgIzQwCisgICAgMHgzMEVGLCAvLyDjg68sICMxNDQKKyAgICAweDMwRjMsIC8vIOODsywgIzMKKyAgICAweDMwRjQsIC8vIOODtCwgIzQ4MworICAgIDB4MzBGRCwgLy8g44O9LCAjNTAxCisgICAgMHg0RTAwLCAvLyDkuIAsICM4NAorICAgIDB4NEUwNywgLy8g5LiHLCAjMzM3CisgICAgMHg0RTA5LCAvLyDkuIksICMzMjMKKyAgICAweDRFMEEsIC8vIOS4iiwgIzEzMworICAgIDB4NEUwQiwgLy8g5LiLLCAjMTgwCisgICAgMHg0RTBELCAvLyDkuI0sICMyNzcKKyAgICAweDRFMTYsIC8vIOS4liwgIzM4NQorICAgIDB4NEUyRCwgLy8g5LitLCAjODcKKyAgICAweDRFM0IsIC8vIOS4uywgIzQzMgorICAgIDB4NEU4OCwgLy8g5LqILCAjMzI2CisgICAgMHg0RThCLCAvLyDkuossICM5NQorICAgIDB4NEU4QywgLy8g5LqMLCAjMzk0CisgICAgMHg0RTk1LCAvLyDkupUsICM0NjgKKyAgICAweDRFQTQsIC8vIOS6pCwgIzQxMAorICAgIDB4NEVBQywgLy8g5LqsLCAjMjYwCisgICAgMHg0RUJBLCAvLyDkurosICM2MQorICAgIDB4NEVDQSwgLy8g5LuKLCAjMTg0CisgICAgMHg0RUNCLCAvLyDku4ssICMzNTgKKyAgICAweDRFRDUsIC8vIOS7lSwgIzM5MQorICAgIDB4NEVENiwgLy8g5LuWLCAjMjU2CisgICAgMHg0RUQ4LCAvLyDku5gsICMyNDMKKyAgICAweDRFRTMsIC8vIOS7oywgIzI4MAorICAgIDB4NEVFNSwgLy8g5LulLCAjMjE2CisgICAgMHg0RUY2LCAvLyDku7YsICMxOTAKKyAgICAweDRGMUEsIC8vIOS8miwgIzEwNQorICAgIDB4NEY0RCwgLy8g5L2NLCAjMTc3CisgICAgMHg0RjRGLCAvLyDkvY8sICMzNzYKKyAgICAweDRGNTMsIC8vIOS9kywgIzIyMworICAgIDB4NEY1NSwgLy8g5L2VLCAjMjk0CisgICAgMHg0RjVDLCAvLyDkvZwsICMxNTQKKyAgICAweDRGN0YsIC8vIOS9vywgIzIzMworICAgIDB4NEY5QiwgLy8g5L6bLCAjNTAzCisgICAgMHg0RkExLCAvLyDkvqEsICMyMTcKKyAgICAweDRGQkYsIC8vIOS+vywgIzUxMQorICAgIDB4NEZERCwgLy8g5L+dLCAjMjc5CisgICAgMHg0RkUxLCAvLyDkv6EsICMyNzEKKyAgICAweDUwMEIsIC8vIOWAiywgIzQxNQorICAgIDB4NTBDRiwgLy8g5YOPLCAjMTc4CisgICAgMHg1MTJBLCAvLyDlhKosICM0MDMKKyAgICAweDUxNDMsIC8vIOWFgywgIzM4NAorICAgIDB4NTE0OCwgLy8g5YWILCAjMzExCisgICAgMHg1MTQ5LCAvLyDlhYksICM0ODgKKyAgICAweDUxNjUsIC8vIOWFpSwgIzExNQorICAgIDB4NTE2OCwgLy8g5YWoLCAjMTczCisgICAgMHg1MTZDLCAvLyDlhawsICMyODcKKyAgICAweDUxNzcsIC8vIOWFtywgIzQ0NworICAgIDB4NTE4NSwgLy8g5YaFLCAjMTY5CisgICAgMHg1MTg2LCAvLyDlhoYsICMxMzEKKyAgICAweDUxOTksIC8vIOWGmSwgIzI3NQorICAgIDB4NTFGQSwgLy8g5Ye6LCAjMTEwCisgICAgMHg1MjA2LCAvLyDliIYsICMxMzAKKyAgICAweDUyMDcsIC8vIOWIhywgIzQwMQorICAgIDB4NTIxRCwgLy8g5YidLCAjMzE5CisgICAgMHg1MjI1LCAvLyDliKUsICMyOTAKKyAgICAweDUyMjksIC8vIOWIqSwgIzIyNgorICAgIDB4NTIzNiwgLy8g5Yi2LCAjNTA3CisgICAgMHg1MjRELCAvLyDliY0sICMxMjQKKyAgICAweDUyOUIsIC8vIOWKmywgIzI3MgorICAgIDB4NTJBMCwgLy8g5YqgLCAjMjQ5CisgICAgMHg1MkQ1LCAvLyDli5UsICMxMjAKKyAgICAweDUyRDksIC8vIOWLmSwgIzQyMQorICAgIDB4NTJERiwgLy8g5YufLCAjNDc2CisgICAgMHg1MzE2LCAvLyDljJYsICMzMDgKKyAgICAweDUzMTcsIC8vIOWMlywgIzM0MQorICAgIDB4NTMzQSwgLy8g5Yy6LCAjMzQ4CisgICAgMHg1MzlGLCAvLyDljp8sICMzMjEKKyAgICAweDUzQzIsIC8vIOWPgiwgIzQ1MgorICAgIDB4NTNDQiwgLy8g5Y+LLCAjNDUxCisgICAgMHg1M0Q2LCAvLyDlj5YsICMyMzcKKyAgICAweDUzRDcsIC8vIOWPlywgIzM1NAorICAgIDB4NTNFMywgLy8g5Y+jLCAjMjg5CisgICAgMHg1M0U0LCAvLyDlj6QsICMzMzkKKyAgICAweDUzRUYsIC8vIOWPrywgIzI5OAorICAgIDB4NTNGMCwgLy8g5Y+wLCAjNDM5CisgICAgMHg1M0Y3LCAvLyDlj7csICMzNjEKKyAgICAweDU0MDgsIC8vIOWQiCwgIzExOAorICAgIDB4NTQwQywgLy8g5ZCMLCAjMjYzCisgICAgMHg1NDBELCAvLyDlkI0sICM2NQorICAgIDB4NTQxMSwgLy8g5ZCRLCAjNDM0CisgICAgMHg1NDRBLCAvLyDlkYosICMzODYKKyAgICAweDU0NjgsIC8vIOWRqCwgIzM5MworICAgIDB4NTQ3MywgLy8g5ZGzLCAjMjk5CisgICAgMHg1NDhDLCAvLyDlkowsICMzNTAKKyAgICAweDU0QzEsIC8vIOWTgSwgIzk2CisgICAgMHg1NEUxLCAvLyDlk6EsICMyOTMKKyAgICAweDU1NDYsIC8vIOWVhiwgIzE5OAorICAgIDB4NTU0RiwgLy8g5ZWPLCAjMTU4CisgICAgMHg1NUI2LCAvLyDllrYsICM0MzgKKyAgICAweDU2NjgsIC8vIOWZqCwgIzM2NgorICAgIDB4NTZERSwgLy8g5ZueLCAjMTQzCisgICAgMHg1NkYzLCAvLyDlm7MsICM0NDQKKyAgICAweDU2RkQsIC8vIOWbvSwgIzE1MworICAgIDB4NTcxMiwgLy8g5ZySLCAjNDM1CisgICAgMHg1NzFGLCAvLyDlnJ8sICMyMzkKKyAgICAweDU3MjgsIC8vIOWcqCwgIzM1MQorICAgIDB4NTczMCwgLy8g5ZywLCAjMTYzCisgICAgMHg1NzhCLCAvLyDlnossICM0MzAKKyAgICAweDU4MzEsIC8vIOWgsSwgIzExMgorICAgIDB4NTgzNCwgLy8g5aC0LCAjMTM5CisgICAgMHg1OEYyLCAvLyDlo7IsICMyMzIKKyAgICAweDU5MDksIC8vIOWkiSwgIzMwNgorICAgIDB4NTkxNiwgLy8g5aSWLCAjMjIyCisgICAgMHg1OTFBLCAvLyDlpJosICMzMzYKKyAgICAweDU5MjcsIC8vIOWkpywgIzgwCisgICAgMHg1OTI5LCAvLyDlpKksICMyNzgKKyAgICAweDU5NzMsIC8vIOWlsywgIzE2MQorICAgIDB4NTk3RCwgLy8g5aW9LCAjMzQ5CisgICAgMHg1QTVBLCAvLyDlqZosICM0NzkKKyAgICAweDVCNTAsIC8vIOWtkCwgIzExMworICAgIDB4NUI1NywgLy8g5a2XLCAjNDkyCisgICAgMHg1QjY2LCAvLyDlraYsICMxMzIKKyAgICAweDVCODksIC8vIOWuiSwgIzI5NQorICAgIDB4NUI5QSwgLy8g5a6aLCAjMTQ1CisgICAgMHg1QjlGLCAvLyDlrp8sICMyMjAKKyAgICAweDVCQTQsIC8vIOWupCwgIzQ4MgorICAgIDB4NUJBRSwgLy8g5a6uLCAjNDg3CisgICAgMHg1QkI2LCAvLyDlrrYsICMyMTEKKyAgICAweDVCQjksIC8vIOWuuSwgIzMzMworICAgIDB4NUJGRSwgLy8g5a++LCAjMjUyCisgICAgMHg1QzAyLCAvLyDlsIIsICM0NzQKKyAgICAweDVDMEYsIC8vIOWwjywgIzIxMgorICAgIDB4NUMxMSwgLy8g5bCRLCAjMzc3CisgICAgMHg1QzRCLCAvLyDlsYssICMyODQKKyAgICAweDVDNzEsIC8vIOWxsSwgIzIwNgorICAgIDB4NUNBMSwgLy8g5bKhLCAjNDI5CisgICAgMHg1Q0Y2LCAvLyDls7YsICMyOTcKKyAgICAweDVEREQsIC8vIOW3nSwgIzI1MworICAgIDB4NURFNSwgLy8g5belLCAjMzc0CisgICAgMHg1RTAyLCAvLyDluIIsICMxNTkKKyAgICAweDVFMkYsIC8vIOW4rywgIzQxNgorICAgIDB4NUUzOCwgLy8g5bi4LCAjNDM3CisgICAgMHg1RTczLCAvLyDlubMsICMzOTAKKyAgICAweDVFNzQsIC8vIOW5tCwgIzU0CisgICAgMHg1RTgzLCAvLyDluoMsICMzNjcKKyAgICAweDVFOTcsIC8vIOW6lywgIzE0OQorICAgIDB4NUVBNiwgLy8g5bqmLCAjMjY5CisgICAgMHg1RUFCLCAvLyDluqssICMzODAKKyAgICAweDVGMEYsIC8vIOW8jywgIzI2NQorICAgIDB4NUYxNSwgLy8g5byVLCAjMzQ1CisgICAgMHg1RjM3LCAvLyDlvLcsICM0NDYKKyAgICAweDVGNTMsIC8vIOW9kywgIzI0MAorICAgIDB4NUY2MiwgLy8g5b2iLCAjNTAyCisgICAgMHg1RjhDLCAvLyDlvowsICMyMzAKKyAgICAweDVGOTcsIC8vIOW+lywgIzQ5MAorICAgIDB4NUZDMywgLy8g5b+DLCAjMzA3CisgICAgMHg1RkM1LCAvLyDlv4UsICM0MjIKKyAgICAweDVGREMsIC8vIOW/nCwgIzM1NgorICAgIDB4NjAxRCwgLy8g5oCdLCAjMTg5CisgICAgMHg2MDI3LCAvLyDmgKcsICMyMDEKKyAgICAweDYwNzUsIC8vIOaBtSwgIzQwMAorICAgIDB4NjBDNSwgLy8g5oOFLCAjMTQwCisgICAgMHg2MEYzLCAvLyDmg7MsICM0NzcKKyAgICAweDYxMEYsIC8vIOaEjywgIzMwNQorICAgIDB4NjExQiwgLy8g5oSbLCAjMjczCisgICAgMHg2MTFGLCAvLyDmhJ8sICMyNTcKKyAgICAweDYyMTAsIC8vIOaIkCwgIzI2MgorICAgIDB4NjIyNiwgLy8g5oimLCAjMzY1CisgICAgMHg2MjQwLCAvLyDmiYAsICMyMzYKKyAgICAweDYyNEIsIC8vIOaJiywgIzE2MAorICAgIDB4NjI5NSwgLy8g5oqVLCAjMTI5CisgICAgMHg2MzAxLCAvLyDmjIEsICMzNTUKKyAgICAweDYzMDcsIC8vIOaMhywgIzQyNQorICAgIDB4NjNBMiwgLy8g5o6iLCAjMzY5CisgICAgMHg2M0IyLCAvLyDmjrIsICMzOTkKKyAgICAweDY0M0EsIC8vIOaQuiwgIzQ1OQorICAgIDB4NjUyRiwgLy8g5pSvLCAjNTEyCisgICAgMHg2NTNFLCAvLyDmlL4sICM0NjkKKyAgICAweDY1NTksIC8vIOaVmSwgIzI3MAorICAgIDB4NjU3MCwgLy8g5pWwLCAjMTgxCisgICAgMHg2NTg3LCAvLyDmlocsICMyMDIKKyAgICAweDY1OTksIC8vIOaWmSwgIzEwNgorICAgIDB4NjVCMCwgLy8g5pawLCAjOTkKKyAgICAweDY1QjksIC8vIOaWuSwgIzEyNgorICAgIDB4NjVDNSwgLy8g5peFLCAjNDQ1CisgICAgMHg2NUU1LCAvLyDml6UsICMzNgorICAgIDB4NjYwRSwgLy8g5piOLCAjMzAwCisgICAgMHg2NjIwLCAvLyDmmKAsICM0MTgKKyAgICAweDY2NDIsIC8vIOaZgiwgIzEwNworICAgIDB4NjZGNCwgLy8g5pu0LCAjMzU5CisgICAgMHg2NkY4LCAvLyDmm7gsICMxNzQKKyAgICAweDY3MDAsIC8vIOacgCwgIzE1MgorICAgIDB4NjcwOCwgLy8g5pyILCAjNDkKKyAgICAweDY3MDksIC8vIOaciSwgIzMwMgorICAgIDB4NjcxRiwgLy8g5pyfLCAjMzMyCisgICAgMHg2NzI4LCAvLyDmnKgsICMyMDMKKyAgICAweDY3MkMsIC8vIOacrCwgIzkyCisgICAgMHg2NzUwLCAvLyDmnZAsICM0ODkKKyAgICAweDY3NTEsIC8vIOadkSwgIzQ2NgorICAgIDB4Njc2NSwgLy8g5p2lLCAjMjY3CisgICAgMHg2NzcxLCAvLyDmnbEsICMxOTEKKyAgICAweDY3N0YsIC8vIOadvywgIzQxMQorICAgIDB4Njc5QywgLy8g5p6cLCAjNDQxCisgICAgMHg2ODIxLCAvLyDmoKEsICMzMjcKKyAgICAweDY4MkEsIC8vIOagqiwgIzQxMgorICAgIDB4NjgzQywgLy8g5qC8LCAjMjI4CisgICAgMHg2OTFDLCAvLyDmpJwsICMxNzkKKyAgICAweDY5NkQsIC8vIOalrSwgIzE2NgorICAgIDB4Njk3RCwgLy8g5qW9LCAjMTcyCisgICAgMHg2OUQ4LCAvLyDmp5gsICMyNTUKKyAgICAweDZBNUYsIC8vIOapnywgIzIzNQorICAgIDB4NkIyMSwgLy8g5qyhLCAjMzE4CisgICAgMHg2QjYyLCAvLyDmraIsICM0NzUKKyAgICAweDZCNjMsIC8vIOatoywgIzMxMgorICAgIDB4NkMxNywgLy8g5rCXLCAjMTE2CisgICAgMHg2QzM0LCAvLyDmsLQsICMxNjUKKyAgICAweDZDNDIsIC8vIOaxgiwgIzQ2NQorICAgIDB4NkM3QSwgLy8g5rG6LCAjMzcwCisgICAgMHg2Q0JCLCAvLyDmsrssICM1MDUKKyAgICAweDZDQzEsIC8vIOazgSwgIzQ2MgorICAgIDB4NkNENSwgLy8g5rOVLCAjMjI3CisgICAgMHg2Q0U4LCAvLyDms6gsICMzNzIKKyAgICAweDZEM0IsIC8vIOa0uywgIzMwMworICAgIDB4NkQ0MSwgLy8g5rWBLCAjNDgwCisgICAgMHg2RDc3LCAvLyDmtbcsICMyNzQKKyAgICAweDZFMDgsIC8vIOa4iCwgIzQxNworICAgIDB4NkYxNCwgLy8g5ryULCAjNTA0CisgICAgMHg3MDZCLCAvLyDngassICMyNjQKKyAgICAweDcwQjksIC8vIOeCuSwgIzMzMQorICAgIDB4NzEyMSwgLy8g54ShLCAjNTgKKyAgICAweDcyNDgsIC8vIOeJiCwgIzQwOQorICAgIDB4NzI2OSwgLy8g54mpLCAjMTcwCisgICAgMHg3Mjc5LCAvLyDnibksICMyNDIKKyAgICAweDcyQjYsIC8vIOeKtiwgIzQ1OAorICAgIDB4NzNGRSwgLy8g54++LCAjMzIyCisgICAgMHg3NDA2LCAvLyDnkIYsICMxNjIKKyAgICAweDc1MUYsIC8vIOeUnywgIzEyMgorICAgIDB4NzUyMywgLy8g55SjLCAjMzIwCisgICAgMHg3NTI4LCAvLyDnlKgsICM5NAorICAgIDB4NzUzMCwgLy8g55SwLCAjMTk1CisgICAgMHg3NTM3LCAvLyDnlLcsICMzNzMKKyAgICAweDc1M0EsIC8vIOeUuiwgIzMxNAorICAgIDB4NzUzQiwgLy8g55S7LCAjOTEKKyAgICAweDc1NEMsIC8vIOeVjCwgIzQzNgorICAgIDB4NzU2QSwgLy8g55WqLCAjMjYxCisgICAgMHg3NUM1LCAvLyDnl4UsICM0MjgKKyAgICAweDc2N0EsIC8vIOeZuiwgIzE5NAorICAgIDB4NzY3QiwgLy8g55m7LCAjMjMxCisgICAgMHg3NjdELCAvLyDnmb0sICM0MTkKKyAgICAweDc2ODQsIC8vIOeahCwgIzI1MQorICAgIDB4NzZFRSwgLy8g55uuLCAjMTk3CisgICAgMHg3NkY0LCAvLyDnm7QsICM0OTcKKyAgICAweDc2RjgsIC8vIOebuCwgIzI4NgorICAgIDB4NzcwQywgLy8g55yMLCAjMTk5CisgICAgMHg3NzFGLCAvLyDnnJ8sICMyMTkKKyAgICAweDc3NDAsIC8vIOedgCwgIzI4MworICAgIDB4NzdFNSwgLy8g55+lLCAjMTg1CisgICAgMHg3N0YzLCAvLyDnn7MsICM1MDAKKyAgICAweDc4QkEsIC8vIOeiuiwgIzM4MworICAgIDB4NzkzQSwgLy8g56S6LCAjMjQxCisgICAgMHg3OTNFLCAvLyDnpL4sICMxNjcKKyAgICAweDc5NUUsIC8vIOelniwgIzMxNQorICAgIDB4Nzk4RiwgLy8g56aPLCAjNDIzCisgICAgMHg3OUMxLCAvLyDnp4EsICMzNDcKKyAgICAweDc5RDEsIC8vIOenkSwgIzQyMAorICAgIDB4N0EwRSwgLy8g56iOLCAjMzY4CisgICAgMHg3QTJFLCAvLyDnqK4sICM0NTUKKyAgICAweDdBM0YsIC8vIOeovywgIzE0OAorICAgIDB4N0E3QSwgLy8g56m6LCAjNDI3CisgICAgMHg3QUNCLCAvLyDnq4ssICMzMDkKKyAgICAweDdCMTEsIC8vIOeskSwgIzQ1NAorICAgIDB4N0IyQywgLy8g56ysLCAjMzE3CisgICAgMHg3QjQ5LCAvLyDnrYksICM0NTcKKyAgICAweDdCNTQsIC8vIOetlCwgIzQyNgorICAgIDB4N0JBMSwgLy8g566hLCAjNDgxCisgICAgMHg3Q0ZCLCAvLyDns7ssICM0MDgKKyAgICAweDdEMDQsIC8vIOe0hCwgIzI3NgorICAgIDB4N0QyMCwgLy8g57SgLCAjNDA3CisgICAgMHg3RDIyLCAvLyDntKIsICMyMTQKKyAgICAweDdEMzAsIC8vIOe0sCwgIzM4MQorICAgIDB4N0QzOSwgLy8g57S5LCAjNDcxCisgICAgMHg3RDQyLCAvLyDntYIsICM0NTYKKyAgICAweDdENDQsIC8vIOe1hCwgIzQyNAorICAgIDB4N0Q0QywgLy8g57WMLCAjMzYwCisgICAgMHg3RDUwLCAvLyDntZAsICMyOTEKKyAgICAweDdEOUEsIC8vIOe2miwgIzM1NworICAgIDB4N0RDRiwgLy8g57ePLCAjNDY3CisgICAgMHg3RERBLCAvLyDnt5osICMzMzgKKyAgICAweDdERTgsIC8vIOe3qCwgIzQ1MworICAgIDB4N0Y4RSwgLy8g576OLCAjMjA0CisgICAgMHg4MDAzLCAvLyDogIMsICMzODcKKyAgICAweDgwMDUsIC8vIOiAhSwgIzE1MQorICAgIDB4ODA1RSwgLy8g6IGeLCAjNDYzCisgICAgMHg4MDc3LCAvLyDogbcsICMzNjMKKyAgICAweDgwQjIsIC8vIOiCsiwgIzQzMworICAgIDB4ODBGRCwgLy8g6IO9LCAjMjUwCisgICAgMHg4MTc5LCAvLyDohbksICMzOTYKKyAgICAweDgxRUEsIC8vIOiHqiwgIzE1NgorICAgIDB4ODI2RiwgLy8g6ImvLCAjMzI5CisgICAgMHg4MjcyLCAvLyDoibIsICM0MDIKKyAgICAweDgyQjEsIC8vIOiKsSwgIzQ0MAorICAgIDB4ODJCOCwgLy8g6Iq4LCAjNDEzCisgICAgMHg4MkYxLCAvLyDoi7EsICM0ODUKKyAgICAweDg0NDksIC8vIOiRiSwgIzQ3MgorICAgIDB4ODg0QywgLy8g6KGMLCAjMTI4CisgICAgMHg4ODUzLCAvLyDooZMsICM0NjAKKyAgICAweDg4NjgsIC8vIOihqCwgIzIwOQorICAgIDB4ODhGRCwgLy8g6KO9LCAjNDMxCisgICAgMHg4OTdGLCAvLyDopb8sICM0MDYKKyAgICAweDg5ODEsIC8vIOimgSwgIzMxMworICAgIDB4ODk4QiwgLy8g6KaLLCAjMTAxCisgICAgMHg4OThGLCAvLyDopo8sICMzNzUKKyAgICAweDg5QTcsIC8vIOimpywgIzE3MQorICAgIDB4ODlFMywgLy8g6KejLCAjMzg4CisgICAgMHg4QTAwLCAvLyDoqIAsICMyMTAKKyAgICAweDhBMDgsIC8vIOioiCwgIzM0MworICAgIDB4OEExOCwgLy8g6KiYLCAjMTM2CisgICAgMHg4QTJELCAvLyDoqK0sICMyOTIKKyAgICAweDhBNzEsIC8vIOipsSwgIzIxMworICAgIDB4OEE3MywgLy8g6KmzLCAjMzcxCisgICAgMHg4QThELCAvLyDoqo0sICM0MDQKKyAgICAweDhBOUUsIC8vIOiqniwgIzIzNAorICAgIDB4OEFBQywgLy8g6KqsLCAjNDk0CisgICAgMHg4QUFELCAvLyDoqq0sICMzMDEKKyAgICAweDhBQkYsIC8vIOiqvywgIzQ0MworICAgIDB4OEFDNywgLy8g6KuHLCAjNDQ4CisgICAgMHg4Qjc3LCAvLyDorbcsICM1MDkKKyAgICAweDhDMzcsIC8vIOiwtywgIzUwNgorICAgIDB4OENBOSwgLy8g6LKpLCAjMzYyCisgICAgMHg4Q0I3LCAvLyDosrcsICMzNDYKKyAgICAweDhDQzcsIC8vIOizhywgIzQ3MworICAgIDB4OENFQSwgLy8g6LOqLCAjMjgxCisgICAgMHg4Q0ZDLCAvLyDos7wsICM0OTUKKyAgICAweDhFQUIsIC8vIOi6qywgIzQ3MAorICAgIDB4OEVDQSwgLy8g6LuKLCAjMjA1CisgICAgMHg4RUUyLCAvLyDou6IsICMzMzUKKyAgICAweDhGMDksIC8vIOi8iSwgIzM0MgorICAgIDB4OEZCQywgLy8g6L68LCAjMjI5CisgICAgMHg4RkQxLCAvLyDov5EsICMzMDQKKyAgICAweDhGRDQsIC8vIOi/lCwgIzQ2MQorICAgIDB4OEZGRCwgLy8g6L+9LCAjMzc5CisgICAgMHg5MDAxLCAvLyDpgIEsICMxODYKKyAgICAweDkwMUEsIC8vIOmAmiwgIzE4MgorICAgIDB4OTAxRiwgLy8g6YCfLCAjMzQwCisgICAgMHg5MDIzLCAvLyDpgKMsICMyNDQKKyAgICAweDkwNEIsIC8vIOmBiywgIzM4MgorICAgIDB4OTA0RSwgLy8g6YGOLCAjNDk4CisgICAgMHg5MDUzLCAvLyDpgZMsICMyODIKKyAgICAweDkwNTQsIC8vIOmBlCwgIzQ1MAorICAgIDB4OTA1NSwgLy8g6YGVLCAjNDE0CisgICAgMHg5MDc4LCAvLyDpgbgsICMyODgKKyAgICAweDkwRTgsIC8vIOmDqCwgIzIwOAorICAgIDB4OTBGRCwgLy8g6YO9LCAjMzQ0CisgICAgMHg5MTRELCAvLyDphY0sICMzODkKKyAgICAweDkxQ0QsIC8vIOmHjSwgIzQ3OAorICAgIDB4OTFDRSwgLy8g6YeOLCAjMjQ1CisgICAgMHg5MUQxLCAvLyDph5EsICMxMzgKKyAgICAweDkzMzIsIC8vIOmMsiwgIzIzOAorICAgIDB4OTU3NywgLy8g6ZW3LCAjMjQ3CisgICAgMHg5NTgwLCAvLyDploAsICM1MDgKKyAgICAweDk1OEIsIC8vIOmWiywgIzI0OAorICAgIDB4OTU5MywgLy8g6ZaTLCAjMTQxCisgICAgMHg5NUEyLCAvLyDplqIsICMxODgKKyAgICAweDk2MkEsIC8vIOmYqiwgIzQ5NgorICAgIDB4OTY1MCwgLy8g6ZmQLCAjMzk1CisgICAgMHg5NjYyLCAvLyDpmaIsICM0NDkKKyAgICAweDk2NjQsIC8vIOmZpCwgIzUxMAorICAgIDB4OTY5QiwgLy8g6ZqbLCAjNDkzCisgICAgMHg5NkM2LCAvLyDpm4YsICMxOTYKKyAgICAweDk2RDEsIC8vIOmbkSwgIzQ0MgorICAgIDB4OTZGQiwgLy8g6Zu7LCAjMTg3CisgICAgMHg5NzYyLCAvLyDpnaIsICMzMjgKKyAgICAweDk3RjMsIC8vIOmfsywgIzMyNQorICAgIDB4OTg0QywgLy8g6aGMLCAjMzEwCisgICAgMHg5ODVFLCAvLyDpoZ4sICM0OTEKKyAgICAweDk4QTgsIC8vIOmiqCwgIzM1MworICAgIDB4OThERiwgLy8g6aOfLCAjMjE4CisgICAgMHg5OTI4LCAvLyDppKgsICM0NjQKKyAgICAweDk5QzUsIC8vIOmnhSwgIzMxNgorICAgIDB4OUExMywgLy8g6aiTLCAjMzk3CisgICAgMHg5QUQ4LCAvLyDpq5gsICMxNzYKKyAgICAweEZGNTcsIC8vIO+9lywgIzEwOAorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X2phX2NvdmVyYWdlPTAuODgwNTY5NTg5MTIwMTYyOworCisvLyBUaGUgNTEyIG1vc3QgZnJlcXVlbnRseSBvY2N1cmluZyBjaGFyYWN0ZXJzIGZvciB0aGUga28gbGFuZ3VhZ2UgaW4gYSBzYW1wbGUgb2YgdGhlIEludGVybmV0LgorLy8gT3JkZXJlZCBieSBjb2RlcG9pbnQsIGNvbW1lbnQgc2hvd3MgY2hhcmFjdGVyIGFuZCByYW5raW5nIGJ5IGZyZXF1ZW5jeQorY29uc3QgdWludDE2X3QgZnJlcXVlbnRfa29bXSA9IHsKKyAgICAweDMxNEIsIC8vIOOFiywgIzE0OAorICAgIDB4MzE0RSwgLy8g44WOLCAjMzkwCisgICAgMHgzMTYwLCAvLyDjhaAsICMzNTQKKyAgICAweDMxOEQsIC8vIOOGjSwgIzQzOQorICAgIDB4QUMwMCwgLy8g6rCALCAjNgorICAgIDB4QUMwMSwgLy8g6rCBLCAjMjMxCisgICAgMHhBQzA0LCAvLyDqsIQsICMxMDYKKyAgICAweEFDMDgsIC8vIOqwiCwgIzM2MgorICAgIDB4QUMxMCwgLy8g6rCQLCAjMTIyCisgICAgMHhBQzExLCAvLyDqsJEsICM0OTMKKyAgICAweEFDMTUsIC8vIOqwlSwgIzE1NQorICAgIDB4QUMxOSwgLy8g6rCZLCAjMjY0CisgICAgMHhBQzFDLCAvLyDqsJwsICM4NworICAgIDB4QUMxRCwgLy8g6rCdLCAjMTk4CisgICAgMHhBQzI0LCAvLyDqsKQsICM0NTcKKyAgICAweEFDNzAsIC8vIOqxsCwgIzkxCisgICAgMHhBQzc0LCAvLyDqsbQsICMxNjEKKyAgICAweEFDNzgsIC8vIOqxuCwgIzMzOAorICAgIDB4QUM4MCwgLy8g6rKALCAjMTg0CisgICAgMHhBQzgzLCAvLyDqsoMsICMxMTYKKyAgICAweEFDOEMsIC8vIOqyjCwgIzM2CisgICAgMHhBQ0EwLCAvLyDqsqAsICMyMzMKKyAgICAweEFDQTgsIC8vIOqyqCwgIzM0MQorICAgIDB4QUNBOSwgLy8g6rKpLCAjMjQ1CisgICAgMHhBQ0FDLCAvLyDqsqwsICM0MTMKKyAgICAweEFDQjAsIC8vIOqysCwgIzIwMgorICAgIDB4QUNCRCwgLy8g6rK9LCAjNjIKKyAgICAweEFDQzQsIC8vIOqzhCwgIzE0MgorICAgIDB4QUNFMCwgLy8g6rOgLCAjMTIKKyAgICAweEFDRTEsIC8vIOqzoSwgIzQ0NAorICAgIDB4QUNFOCwgLy8g6rOoLCAjMzc5CisgICAgMHhBQ0YzLCAvLyDqs7MsICMzODgKKyAgICAweEFDRjUsIC8vIOqztSwgIzU5CisgICAgMHhBQ0ZDLCAvLyDqs7wsICM2OQorICAgIDB4QUQwMCwgLy8g6rSALCAjOTUKKyAgICAweEFEMTEsIC8vIOq0kSwgIzIzNQorICAgIDB4QUQ1MCwgLy8g6rWQLCAjMTI4CisgICAgMHhBRDZDLCAvLyDqtawsICM1MgorICAgIDB4QUQ2RCwgLy8g6rWtLCAjODUKKyAgICAweEFENzAsIC8vIOq1sCwgIzI5MworICAgIDB4QUQ3NCwgLy8g6rW0LCAjNDg3CisgICAgMHhBRDgxLCAvLyDqtoEsICM0NDEKKyAgICAweEFEOEMsIC8vIOq2jCwgIzE5MgorICAgIDB4QURDMCwgLy8g6reALCAjMzg2CisgICAgMHhBRERDLCAvLyDqt5wsICMzNjcKKyAgICAweEFERjgsIC8vIOq3uCwgIzMwCisgICAgMHhBREY5LCAvLyDqt7ksICM0MjQKKyAgICAweEFERkMsIC8vIOq3vCwgIzI0MQorICAgIDB4QUUwMCwgLy8g6riALCAjNjEKKyAgICAweEFFMDgsIC8vIOq4iCwgIzEzOAorICAgIDB4QUUwOSwgLy8g6riJLCAjMjY5CisgICAgMHhBRTMwLCAvLyDquLAsICMzCisgICAgMHhBRTM0LCAvLyDquLQsICM0NjUKKyAgICAweEFFMzgsIC8vIOq4uCwgIzI5NworICAgIDB4QUU0MCwgLy8g6rmALCAjMjA1CisgICAgMHhBRTRDLCAvLyDquYwsICMxNzEKKyAgICAweEFFRDgsIC8vIOq7mCwgIzI3MworICAgIDB4QUY0MywgLy8g6r2DLCAjNDc1CisgICAgMHhCMDVELCAvLyDrgZ0sICM1MDUKKyAgICAweEIwN0MsIC8vIOuBvCwgIzQ5MAorICAgIDB4QjA5OCwgLy8g64KYLCAjMzkKKyAgICAweEIwOUMsIC8vIOuCnCwgIzI3NAorICAgIDB4QjBBMCwgLy8g64KgLCAjMjkyCisgICAgMHhCMEE4LCAvLyDrgqgsICMxMzkKKyAgICAweEIwQjQsIC8vIOuCtCwgIzU2CisgICAgMHhCMTA4LCAvLyDrhIgsICMyNzIKKyAgICAweEIxMTAsIC8vIOuEkCwgIzQ3NgorICAgIDB4QjExOCwgLy8g64SYLCAjNDkyCisgICAgMHhCMTI0LCAvLyDrhKQsICMxMDAKKyAgICAweEIxMzcsIC8vIOuEtywgIzMyOQorICAgIDB4QjE0MCwgLy8g64WALCAjMjg4CisgICAgMHhCMTQ0LCAvLyDrhYQsICMxNTEKKyAgICAweEIxNzgsIC8vIOuFuCwgIzE0OQorICAgIDB4QjE3QywgLy8g64W8LCAjNDkxCisgICAgMHhCMTgwLCAvLyDrhoAsICM0NjQKKyAgICAweEIxOEQsIC8vIOuGjSwgIzQ0MgorICAgIDB4QjIwNCwgLy8g64iELCAjMzE5CisgICAgMHhCMjA4LCAvLyDriIgsICMzODMKKyAgICAweEIyNzQsIC8vIOuJtCwgIzE3MworICAgIDB4QjI5MCwgLy8g64qQLCAjMzY4CisgICAgMHhCMjk0LCAvLyDripQsICM1CisgICAgMHhCMjk4LCAvLyDripgsICMzMjIKKyAgICAweEIyQTUsIC8vIOuKpSwgIzE5MAorICAgIDB4QjJDOCwgLy8g64uILCAjMTYKKyAgICAweEIyRDgsIC8vIOuLmCwgIzE1MworICAgIDB4QjJFNCwgLy8g64ukLCAjMgorICAgIDB4QjJFOCwgLy8g64uoLCAjMTM0CisgICAgMHhCMkVCLCAvLyDri6ssICMxOTUKKyAgICAweEIyRUMsIC8vIOuLrCwgIzI0MworICAgIDB4QjJGNCwgLy8g64u0LCAjMjU0CisgICAgMHhCMkY1LCAvLyDri7UsICMyODcKKyAgICAweEIyRjksIC8vIOuLuSwgIzE1OQorICAgIDB4QjMwMCwgLy8g64yALCAjMzMKKyAgICAweEIzMTMsIC8vIOuMkywgIzMwMworICAgIDB4QjM1NCwgLy8g642ULCAjMTQwCisgICAgMHhCMzU4LCAvLyDrjZgsICMyNTIKKyAgICAweEIzNjcsIC8vIOuNpywgIzQ2MworICAgIDB4QjM3MCwgLy8g642wLCAjMTA0CisgICAgMHhCMzc4LCAvLyDrjbgsICM0MjkKKyAgICAweEIzQzQsIC8vIOuPhCwgIzI1CisgICAgMHhCM0M1LCAvLyDrj4UsICMzMDEKKyAgICAweEIzQ0MsIC8vIOuPjCwgIzMwOQorICAgIDB4QjNEOSwgLy8g64+ZLCAjNTgKKyAgICAweEI0MTgsIC8vIOuQmCwgIzgyCisgICAgMHhCNDFDLCAvLyDrkJwsICMxODkKKyAgICAweEI0MjAsIC8vIOuQoCwgIzQwOAorICAgIDB4QjQyOSwgLy8g65CpLCAjMzMyCisgICAgMHhCNDUwLCAvLyDrkZAsICMxOTkKKyAgICAweEI0QTQsIC8vIOuSpCwgIzQ5NgorICAgIDB4QjREQywgLy8g65OcLCAjNDAKKyAgICAweEI0RTAsIC8vIOuToCwgIzI4MworICAgIDB4QjRFNCwgLy8g65OkLCAjNTQKKyAgICAweEI0RUYsIC8vIOuTrywgIzQ3OAorICAgIDB4QjRGMSwgLy8g65OxLCAjOTAKKyAgICAweEI1MTQsIC8vIOuUlCwgIzEzMworICAgIDB4QjUyOSwgLy8g65SpLCAjNDYyCisgICAgMHhCNTMwLCAvLyDrlLAsICMzMzMKKyAgICAweEI1NEMsIC8vIOuVjCwgIzI0MAorICAgIDB4QjYxMCwgLy8g65iQLCAjMzEzCisgICAgMHhCNzdDLCAvLyDrnbwsICM0MgorICAgIDB4Qjc3RCwgLy8g6529LCAjMzU1CisgICAgMHhCNzgwLCAvLyDrnoAsICMyOTAKKyAgICAweEI3OEMsIC8vIOuejCwgIzI0NgorICAgIDB4Qjc4RCwgLy8g656NLCAjNDIwCisgICAgMHhCNzkxLCAvLyDrnpEsICMyNzAKKyAgICAweEI3OTgsIC8vIOuemCwgIzE3NAorICAgIDB4Qjc5OSwgLy8g656ZLCAjMzgxCisgICAgMHhCNzlDLCAvLyDrnpwsICMzNTcKKyAgICAweEI3QTgsIC8vIOueqCwgIzM1OQorICAgIDB4QjdBOSwgLy8g656pLCAjNDAyCisgICAgMHhCN0M5LCAvLyDrn4ksICMzNDYKKyAgICAweEI3RUMsIC8vIOufrCwgIzEzMAorICAgIDB4QjdGMCwgLy8g65+wLCAjMzEyCisgICAgMHhCN0ZDLCAvLyDrn7wsICMzMjcKKyAgICAweEI3RkQsIC8vIOufvSwgIzQ0NworICAgIDB4QjgwNywgLy8g66CHLCAjNDEyCisgICAgMHhCODA4LCAvLyDroIgsICMxMTQKKyAgICAweEI4MEMsIC8vIOugjCwgIzM5NQorICAgIDB4QjgyNCwgLy8g66CkLCAjMTU4CisgICAgMHhCODI1LCAvLyDroKUsICMxOTQKKyAgICAweEI4MjgsIC8vIOugqCwgIzMyNgorICAgIDB4QjgzOSwgLy8g66C5LCAjMzg5CisgICAgMHhCODVDLCAvLyDroZwsICM0CisgICAgMHhCODVELCAvLyDroZ0sICM4NAorICAgIDB4Qjg2MCwgLy8g66GgLCAjMzY2CisgICAgMHhCOENDLCAvLyDro4wsICMxNTQKKyAgICAweEI4RTgsIC8vIOujqCwgIzIzNgorICAgIDB4Qjk1OCwgLy8g66WYLCAjMjY1CisgICAgMHhCOTc0LCAvLyDrpbQsICMyMTIKKyAgICAweEI5NzgsIC8vIOuluCwgIzI1MAorICAgIDB4Qjk3QywgLy8g66W8LCAjMzUKKyAgICAweEI5ODQsIC8vIOumhCwgIzI3NgorICAgIDB4QjlBQywgLy8g66asLCAjMTkKKyAgICAweEI5QUQsIC8vIOumrSwgIzM5NAorICAgIDB4QjlCMCwgLy8g66awLCAjMjU5CisgICAgMHhCOUI0LCAvLyDrprQsICM0ODUKKyAgICAweEI5QkMsIC8vIOumvCwgIzMwNQorICAgIDB4QjlCRCwgLy8g66a9LCAjMjE3CisgICAgMHhCOUMxLCAvLyDrp4EsICMzNTEKKyAgICAweEI5QzgsIC8vIOuniCwgIzY3CisgICAgMHhCOUM5LCAvLyDrp4ksICMzMTAKKyAgICAweEI5Q0MsIC8vIOunjCwgIzY1CisgICAgMHhCOUNFLCAvLyDrp44sICMyNTcKKyAgICAweEI5RDAsIC8vIOunkCwgIzE4OAorICAgIDB4QjlEQiwgLy8g66ebLCAjMzk3CisgICAgMHhCOURELCAvLyDrp50sICMzNzAKKyAgICAweEI5REUsIC8vIOunniwgIzM5OQorICAgIDB4QjlFNCwgLy8g66ekLCAjMTI1CisgICAgMHhCOUU4LCAvLyDrp6gsICM0MjIKKyAgICAweEJBMzgsIC8vIOuouCwgIzMxMQorICAgIDB4QkEzOSwgLy8g66i5LCAjMzc3CisgICAgMHhCQTNDLCAvLyDrqLwsICM0NjkKKyAgICAweEJBNTQsIC8vIOuplCwgIzE0NworICAgIDB4QkE3MCwgLy8g66mwLCAjMTkxCisgICAgMHhCQTc0LCAvLyDrqbQsICM3MgorICAgIDB4QkE4NSwgLy8g66qFLCAjMTMxCisgICAgMHhCQUE4LCAvLyDrqqgsICM3MworICAgIDB4QkFBOSwgLy8g66qpLCAjMTU3CisgICAgMHhCQUIwLCAvLyDrqrAsICM0MDEKKyAgICAweEJBQjgsIC8vIOuquCwgIzQzNworICAgIDB4QkFCQiwgLy8g66q7LCAjMzM2CisgICAgMHhCQjM0LCAvLyDrrLQsICM4MAorICAgIDB4QkIzOCwgLy8g66y4LCAjNTcKKyAgICAweEJCM0MsIC8vIOusvCwgIzk0CisgICAgMHhCQkE0LCAvLyDrrqQsICM0MzEKKyAgICAweEJCRjgsIC8vIOuvuCwgIzc2CisgICAgMHhCQkZDLCAvLyDrr7wsICMyMDAKKyAgICAweEJDMDAsIC8vIOuwgCwgIzMwOAorICAgIDB4QkMwRiwgLy8g67CPLCAjMjQ5CisgICAgMHhCQzE0LCAvLyDrsJQsICM4OQorICAgIDB4QkMxNSwgLy8g67CVLCAjMjI2CisgICAgMHhCQzE4LCAvLyDrsJgsICMxNzUKKyAgICAweEJDMUIsIC8vIOuwmywgIzI0OAorICAgIDB4QkMxQywgLy8g67CcLCAjMTY0CisgICAgMHhCQzI5LCAvLyDrsKksICM5MgorICAgIDB4QkMzMCwgLy8g67CwLCAjMTYyCisgICAgMHhCQzMxLCAvLyDrsLEsICMyNTYKKyAgICAweEJDODQsIC8vIOuyhCwgIzExMQorICAgIDB4QkM4OCwgLy8g67KILCAjMTY3CisgICAgMHhCQzhDLCAvLyDrsowsICM0MjMKKyAgICAweEJDOTQsIC8vIOuylCwgIzQyNworICAgIDB4QkM5NSwgLy8g67KVLCAjMjA3CisgICAgMHhCQ0EwLCAvLyDrsqAsICMyODEKKyAgICAweEJDQTQsIC8vIOuypCwgIzM3OAorICAgIDB4QkNBOCwgLy8g67KoLCAjMzg3CisgICAgMHhCQ0MwLCAvLyDrs4AsICMyNTMKKyAgICAweEJDQzQsIC8vIOuzhCwgIzI2MgorICAgIDB4QkNEMSwgLy8g67ORLCAjMzQwCisgICAgMHhCQ0Y0LCAvLyDrs7QsICMyMAorICAgIDB4QkNGNSwgLy8g67O1LCAjMjA0CisgICAgMHhCQ0Y4LCAvLyDrs7gsICMxODIKKyAgICAweEJDRkMsIC8vIOuzvCwgIzM4NQorICAgIDB4QkQwOSwgLy8g67SJLCAjNDA1CisgICAgMHhCRDgwLCAvLyDrtoAsICM0NgorICAgIDB4QkQ4MSwgLy8g67aBLCAjMjYxCisgICAgMHhCRDg0LCAvLyDrtoQsICMxMDUKKyAgICAweEJEODgsIC8vIOu2iCwgIzIyNQorICAgIDB4QkRGMCwgLy8g67ewLCAjMzUwCisgICAgMHhCRTBDLCAvLyDruIwsICMyMTQKKyAgICAweEJFMTQsIC8vIOu4lCwgIzk5CisgICAgMHhCRTQ0LCAvLyDruYQsICM1NQorICAgIDB4QkU0QywgLy8g67mMLCAjNTEwCisgICAgMHhCRTYwLCAvLyDruaAsICMzOTgKKyAgICAweEMwQUMsIC8vIOyCrCwgIzE0CisgICAgMHhDMEFELCAvLyDsgq0sICMzNDIKKyAgICAweEMwQjAsIC8vIOyCsCwgIzEyMQorICAgIDB4QzBCNCwgLy8g7IK0LCAjMjc5CisgICAgMHhDMEJDLCAvLyDsgrwsICMzNDgKKyAgICAweEMwQzEsIC8vIOyDgSwgIzQxCisgICAgMHhDMEM4LCAvLyDsg4gsICMyODIKKyAgICAweEMwQzksIC8vIOyDiSwgIzE4MQorICAgIDB4QzBERCwgLy8g7IOdLCAjMTA5CisgICAgMHhDMTFDLCAvLyDshJwsICMyMQorICAgIDB4QzExRCwgLy8g7ISdLCAjMjM0CisgICAgMHhDMTIwLCAvLyDshKAsICMxMDcKKyAgICAweEMxMjQsIC8vIOyEpCwgIzE3MAorICAgIDB4QzEzMSwgLy8g7ISxLCAjNTAKKyAgICAweEMxMzgsIC8vIOyEuCwgIzYwCisgICAgMHhDMTM5LCAvLyDshLksICM0NTYKKyAgICAweEMxM0MsIC8vIOyEvCwgIzI2NworICAgIDB4QzE1NCwgLy8g7IWULCAjNDU1CisgICAgMHhDMTU4LCAvLyDshZgsICMyMzcKKyAgICAweEMxNUMsIC8vIOyFnCwgIzQ0OAorICAgIDB4QzE2OCwgLy8g7IWoLCAjNDIxCisgICAgMHhDMThDLCAvLyDshowsICM1MQorICAgIDB4QzE4RCwgLy8g7IaNLCAjMjE5CisgICAgMHhDMTkwLCAvLyDshpAsICMzMjMKKyAgICAweEMxQTEsIC8vIOyGoSwgIzIwMworICAgIDB4QzFDNCwgLy8g7IeELCAjNTAxCisgICAgMHhDMUZDLCAvLyDsh7wsICMzNjQKKyAgICAweEMyMTgsIC8vIOyImCwgIzI3CisgICAgMHhDMjE5LCAvLyDsiJksICM0NjcKKyAgICAweEMyMUMsIC8vIOyInCwgIzI1OAorICAgIDB4QzIyMCwgLy8g7IigLCAjMzAyCisgICAgMHhDMjZDLCAvLyDsiawsICM1MTEKKyAgICAweEMyODgsIC8vIOyKiCwgIzM4NAorICAgIDB4QzJBNCwgLy8g7IqkLCAjMTEKKyAgICAweEMyQUMsIC8vIOyKrCwgIzQzOAorICAgIDB4QzJCNCwgLy8g7Iq0LCAjNTA0CisgICAgMHhDMkI1LCAvLyDsirUsICM3NworICAgIDB4QzJCOSwgLy8g7Iq5LCAjMjk5CisgICAgMHhDMkRDLCAvLyDsi5wsICMxMworICAgIDB4QzJERCwgLy8g7IudLCAjMTM3CisgICAgMHhDMkUwLCAvLyDsi6AsICM0NworICAgIDB4QzJFNCwgLy8g7IukLCAjMTMyCisgICAgMHhDMkVDLCAvLyDsi6wsICMxOTYKKyAgICAweEMyRUQsIC8vIOyLrSwgIzQ4MgorICAgIDB4QzJGNiwgLy8g7Iu2LCAjMzUyCisgICAgMHhDMkY4LCAvLyDsi7gsICM0MTkKKyAgICAweEM0RjAsIC8vIOyTsCwgIzI3OAorICAgIDB4QzUyOCwgLy8g7JSoLCAjMzYwCisgICAgMHhDNTQ0LCAvLyDslYQsICMyMworICAgIDB4QzU0NSwgLy8g7JWFLCAjMjk2CisgICAgMHhDNTQ4LCAvLyDslYgsICM3MQorICAgIDB4QzU0QSwgLy8g7JWKLCAjMjA5CisgICAgMHhDNTRDLCAvLyDslYwsICMyMjIKKyAgICAweEM1NTQsIC8vIOyVlCwgIzQ2MAorICAgIDB4QzU1OCwgLy8g7JWYLCAjMzQ5CisgICAgMHhDNTU5LCAvLyDslZksICM0NzMKKyAgICAweEM1NUUsIC8vIOyVniwgIzQzNAorICAgIDB4QzU2MCwgLy8g7JWgLCAjMjcxCisgICAgMHhDNTYxLCAvLyDslaEsICM0MTUKKyAgICAweEM1NzEsIC8vIOyVsSwgIzQ3NworICAgIDB4QzU3QywgLy8g7JW8LCAjMTI0CisgICAgMHhDNTdELCAvLyDslb0sICMyMjkKKyAgICAweEM1OTEsIC8vIOyWkSwgIzE3NworICAgIDB4QzVCNCwgLy8g7Ja0LCAjMjQKKyAgICAweEM1QjUsIC8vIOyWtSwgIzQwNworICAgIDB4QzVCOCwgLy8g7Ja4LCAjMjk0CisgICAgMHhDNUJDLCAvLyDslrwsICMzNTYKKyAgICAweEM1QzQsIC8vIOyXhCwgIzQyNgorICAgIDB4QzVDNSwgLy8g7JeFLCAjMTE4CisgICAgMHhDNUM2LCAvLyDsl4YsICMxNzgKKyAgICAweEM1QzgsIC8vIOyXiCwgIzE2NQorICAgIDB4QzVEMCwgLy8g7JeQLCAjOQorICAgIDB4QzVENCwgLy8g7JeULCAjMzc1CisgICAgMHhDNUQ4LCAvLyDsl5gsICM1MDYKKyAgICAweEM1RUMsIC8vIOyXrCwgIzY2CisgICAgMHhDNUVELCAvLyDsl60sICMxODYKKyAgICAweEM1RUUsIC8vIOyXriwgIzQ4OAorICAgIDB4QzVGMCwgLy8g7JewLCAjOTYKKyAgICAweEM1RjQsIC8vIOyXtCwgIzI2NgorICAgIDB4QzVGQywgLy8g7Je8LCAjNDQ5CisgICAgMHhDNjAwLCAvLyDsmIAsICMzNzQKKyAgICAweEM2MDEsIC8vIOyYgSwgIzgzCisgICAgMHhDNjA4LCAvLyDsmIgsICMxNjgKKyAgICAweEM2MjQsIC8vIOyYpCwgIzc1CisgICAgMHhDNjI4LCAvLyDsmKgsICMzMDAKKyAgICAweEM2MkMsIC8vIOyYrCwgIzMwNgorICAgIDB4QzY0MCwgLy8g7JmALCAjMTE5CisgICAgMHhDNjQ0LCAvLyDsmYQsICMzNjEKKyAgICAweEM2NTQsIC8vIOyZlCwgIzQ4OQorICAgIDB4QzY1NSwgLy8g7JmVLCAjNDE4CisgICAgMHhDNjc4LCAvLyDsmbgsICMyMTgKKyAgICAweEM2OTQsIC8vIOyalCwgIzQzCisgICAgMHhDNjk1LCAvLyDsmpUsICM0NzkKKyAgICAweEM2QTksIC8vIOyaqSwgIzQ4CisgICAgMHhDNkIwLCAvLyDsmrAsICM2NAorICAgIDB4QzZCMSwgLy8g7JqxLCAjNTAzCisgICAgMHhDNkI0LCAvLyDsmrQsICMxMDgKKyAgICAweEM2QjgsIC8vIOyauCwgIzIyMworICAgIDB4QzZDMCwgLy8g7JuALCAjMzE3CisgICAgMHhDNkMzLCAvLyDsm4MsICM0MDQKKyAgICAweEM2Q0MsIC8vIOybjCwgIzI4MAorICAgIDB4QzZEMCwgLy8g7JuQLCAjNDUKKyAgICAweEM2RDQsIC8vIOyblCwgIzE1MAorICAgIDB4QzZFOCwgLy8g7JuoLCAjNDQ2CisgICAgMHhDNkY5LCAvLyDsm7ksICM1MDAKKyAgICAweEM3MDQsIC8vIOychCwgIzc4CisgICAgMHhDNzIwLCAvLyDsnKAsICM4MQorICAgIDB4QzcyMSwgLy8g7JyhLCAjMzIxCisgICAgMHhDNzI0LCAvLyDsnKQsICM0MTYKKyAgICAweEM3M0MsIC8vIOycvCwgIzQ5CisgICAgMHhDNzQwLCAvLyDsnYAsICMzMQorICAgIDB4Qzc0NCwgLy8g7J2ELCAjMTcKKyAgICAweEM3NEMsIC8vIOydjCwgIzExMgorICAgIDB4Qzc1MSwgLy8g7J2RLCAjNDYxCisgICAgMHhDNzU4LCAvLyDsnZgsICM4CisgICAgMHhDNzc0LCAvLyDsnbQsICMxCisgICAgMHhDNzc1LCAvLyDsnbUsICM0MDMKKyAgICAweEM3NzgsIC8vIOyduCwgIzE4CisgICAgMHhDNzdDLCAvLyDsnbwsICMyOAorICAgIDB4Qzc4NCwgLy8g7J6ELCAjMTYwCisgICAgMHhDNzg1LCAvLyDsnoUsICM5MworICAgIDB4Qzc4OCwgLy8g7J6ILCAjNDQKKyAgICAweEM3OTAsIC8vIOyekCwgIzIyCisgICAgMHhDNzkxLCAvLyDsnpEsICM4OAorICAgIDB4Qzc5OCwgLy8g7J6YLCAjMzQ3CisgICAgMHhDN0ExLCAvLyDsnqEsICMzNzIKKyAgICAweEM3QTUsIC8vIOyepSwgIzUzCisgICAgMHhDN0FDLCAvLyDsnqwsICMxMjAKKyAgICAweEM3QzEsIC8vIOyfgSwgIzQ4MworICAgIDB4QzgwMCwgLy8g7KCALCAjOTgKKyAgICAweEM4MDEsIC8vIOyggSwgIzk3CisgICAgMHhDODA0LCAvLyDsoIQsICMzNAorICAgIDB4QzgwOCwgLy8g7KCILCAjMzIwCisgICAgMHhDODEwLCAvLyDsoJAsICMyMDEKKyAgICAweEM4MTEsIC8vIOygkSwgIzMzMQorICAgIDB4QzgxNSwgLy8g7KCVLCAjMjYKKyAgICAweEM4MUMsIC8vIOygnCwgIzI5CisgICAgMHhDODM4LCAvLyDsoLgsICM0MTQKKyAgICAweEM4NzAsIC8vIOyhsCwgIzg2CisgICAgMHhDODcxLCAvLyDsobEsICMzNzMKKyAgICAweEM4NzQsIC8vIOyhtCwgIzQzMgorICAgIDB4Qzg4MCwgLy8g7KKALCAjNDcwCisgICAgMHhDODg1LCAvLyDsooUsICMyMDgKKyAgICAweEM4OEIsIC8vIOyiiywgIzIzOQorICAgIDB4QzhFMCwgLy8g7KOgLCAjNDUxCisgICAgMHhDOEZDLCAvLyDso7wsICMzOAorICAgIDB4QzhGRCwgLy8g7KO9LCAjNDcxCisgICAgMHhDOTAwLCAvLyDspIAsICMyODYKKyAgICAweEM5MDQsIC8vIOykhCwgIzM5MgorICAgIDB4QzkxMSwgLy8g7KSRLCAjMTAzCisgICAgMHhDOTg4LCAvLyDspogsICMyNTUKKyAgICAweEM5OEMsIC8vIOymjCwgIzUwNworICAgIDB4Qzk5MCwgLy8g7KaQLCAjMzcxCisgICAgMHhDOTlELCAvLyDspp0sICMyNjAKKyAgICAweEM5QzAsIC8vIOyngCwgIzEwCisgICAgMHhDOUMxLCAvLyDsp4EsICMyMTYKKyAgICAweEM5QzQsIC8vIOynhCwgIzc5CisgICAgMHhDOUM4LCAvLyDsp4gsICMyMzgKKyAgICAweEM5RDEsIC8vIOynkSwgIzIwNgorICAgIDB4QzlEQywgLy8g7KecLCAjNDExCisgICAgMHhDOUY4LCAvLyDsp7gsICM0OTQKKyAgICAweENBQkQsIC8vIOyqvSwgIzQzNQorICAgIDB4Q0MyOCwgLy8g7LCoLCAjMTQ2CisgICAgMHhDQzI5LCAvLyDssKksICM0NDMKKyAgICAweENDMkMsIC8vIOywrCwgIzQ4MQorICAgIDB4Q0MzMCwgLy8g7LCwLCAjNDQwCisgICAgMHhDQzM4LCAvLyDssLgsICMzNDMKKyAgICAweENDM0QsIC8vIOywvSwgIzMwNAorICAgIDB4Q0MzRSwgLy8g7LC+LCAjMzM1CisgICAgMHhDQzQ0LCAvLyDssYQsICMyODQKKyAgICAweENDNDUsIC8vIOyxhSwgIzI5OAorICAgIDB4Q0M5OCwgLy8g7LKYLCAjMjQyCisgICAgMHhDQzlDLCAvLyDsspwsICMxNDMKKyAgICAweENDQTAsIC8vIOyyoCwgIzM4MAorICAgIDB4Q0NBOCwgLy8g7LKoLCAjNDUyCisgICAgMHhDQ0FCLCAvLyDssqssICM0ODQKKyAgICAweENDQUQsIC8vIOyyrSwgIzE5NworICAgIDB4Q0NCNCwgLy8g7LK0LCAjMTI2CisgICAgMHhDQ0QwLCAvLyDss5AsICM0NzIKKyAgICAweENEMDgsIC8vIOy0iCwgIzIyMAorICAgIDB4Q0QxRCwgLy8g7LSdLCAjNDA2CisgICAgMHhDRDVDLCAvLyDstZwsICMxNzkKKyAgICAweENEOTQsIC8vIOy2lCwgIzEzNgorICAgIDB4Q0Q5NSwgLy8g7LaVLCAjMzM3CisgICAgMHhDRDlDLCAvLyDstpwsICMxNjYKKyAgICAweENEQTksIC8vIOy2qSwgIzM2OQorICAgIDB4Q0RFOCwgLy8g7LeoLCAjMjEwCisgICAgMHhDRTIwLCAvLyDsuKAsICMyMTUKKyAgICAweENFMjEsIC8vIOy4oSwgIzQ2OAorICAgIDB4Q0UzNSwgLy8g7Li1LCAjNTEyCisgICAgMHhDRTU4LCAvLyDsuZgsICMxMDIKKyAgICAweENFNUMsIC8vIOy5nCwgIzMyNQorICAgIDB4Q0U2OCwgLy8g7LmoLCAjMjYzCisgICAgMHhDRTc0LCAvLyDsubQsICMxMTUKKyAgICAweENFN0MsIC8vIOy5vCwgIzQ2NgorICAgIDB4Q0U5MCwgLy8g7LqQLCAjNDU0CisgICAgMHhDRUU0LCAvLyDsu6QsICMyODUKKyAgICAweENFRTgsIC8vIOy7qCwgIzMyOAorICAgIDB4Q0VGNCwgLy8g7Lu0LCAjNDE3CisgICAgMHhDRjAwLCAvLyDsvIAsICMzMzkKKyAgICAweENGMTMsIC8vIOy8kywgIzUwOQorICAgIDB4Q0YxQywgLy8g7LycLCAjNTA4CisgICAgMHhDRjU0LCAvLyDsvZQsICMxOTMKKyAgICAweENGNTgsIC8vIOy9mCwgIzM5MQorICAgIDB4Q0ZFMCwgLy8g7L+gLCAjMzkzCisgICAgMHhEMDM1LCAvLyDtgLUsICM0NTMKKyAgICAweEQwNkMsIC8vIO2BrCwgIzEwMQorICAgIDB4RDA3MCwgLy8g7YGwLCAjNDk1CisgICAgMHhEMDc0LCAvLyDtgbQsICMyODkKKyAgICAweEQwQTQsIC8vIO2CpCwgIzIzMAorICAgIDB4RDBDMCwgLy8g7YOALCAjMTI3CisgICAgMHhEMEMxLCAvLyDtg4EsICMzMTQKKyAgICAweEQwQzQsIC8vIO2DhCwgIzQ1MAorICAgIDB4RDBDOCwgLy8g7YOILCAjNDM2CisgICAgMHhEMERDLCAvLyDtg5wsICMyMjEKKyAgICAweEQwREQsIC8vIO2DnSwgIzI3NQorICAgIDB4RDEzMCwgLy8g7YSwLCAjNzAKKyAgICAweEQxNEMsIC8vIO2FjCwgIzIxMworICAgIDB4RDE1MCwgLy8g7YWQLCAjMzI0CisgICAgMHhEMTU0LCAvLyDthZQsICM0MzAKKyAgICAweEQxNUMsIC8vIO2FnCwgIzM4MgorICAgIDB4RDFBMCwgLy8g7YagLCAjMTQ1CisgICAgMHhEMUI1LCAvLyDthrUsICMxNTYKKyAgICAweEQyMkMsIC8vIO2IrCwgIzIyNworICAgIDB4RDJCOCwgLy8g7Yq4LCAjMzcKKyAgICAweEQyQjksIC8vIO2KuSwgIzI0NworICAgIDB4RDJGMCwgLy8g7YuwLCAjMTg3CisgICAgMHhEMzA1LCAvLyDtjIUsICM0MTAKKyAgICAweEQzMEMsIC8vIO2MjCwgIzE0MQorICAgIDB4RDMxMCwgLy8g7YyQLCAjMTYzCisgICAgMHhEMzE0LCAvLyDtjJQsICM0OTkKKyAgICAweEQzMjgsIC8vIO2MqCwgIzMwNworICAgIDB4RDMyQywgLy8g7YysLCAjNDU5CisgICAgMHhEMzM4LCAvLyDtjLgsICM0MzMKKyAgICAweEQzN0MsIC8vIO2NvCwgIzM0NAorICAgIDB4RDM5OCwgLy8g7Y6YLCAjMTcyCisgICAgMHhEM0I4LCAvLyDtjrgsICMyNTEKKyAgICAweEQzQzksIC8vIO2PiSwgIzI5MQorICAgIDB4RDNFQywgLy8g7Y+sLCAjNjgKKyAgICAweEQzRUQsIC8vIO2PrSwgIzQ0NQorICAgIDB4RDNGMCwgLy8g7Y+wLCAjMzE4CisgICAgMHhENDVDLCAvLyDtkZwsICMyMzIKKyAgICAweEQ0ODAsIC8vIO2SgCwgIzQ5NworICAgIDB4RDQ4OCwgLy8g7ZKILCAjMTEzCisgICAgMHhENDhELCAvLyDtko0sICM0MjUKKyAgICAweEQ1MDQsIC8vIO2UhCwgIzExMAorICAgIDB4RDUwOCwgLy8g7ZSILCAjNDk4CisgICAgMHhENTBDLCAvLyDtlIwsICMyMTEKKyAgICAweEQ1M0MsIC8vIO2UvCwgIzE2OQorICAgIDB4RDU0NCwgLy8g7ZWELCAjMjk1CisgICAgMHhENTUxLCAvLyDtlZEsICMzNzYKKyAgICAweEQ1NTgsIC8vIO2VmCwgIzcKKyAgICAweEQ1NTksIC8vIO2VmSwgIzEyOQorICAgIDB4RDU1QywgLy8g7ZWcLCAjMTUKKyAgICAweEQ1NjAsIC8vIO2VoCwgIzE0NAorICAgIDB4RDU2OCwgLy8g7ZWoLCAjMTUyCisgICAgMHhENTY5LCAvLyDtlaksICMxMjMKKyAgICAweEQ1NkQsIC8vIO2VrSwgIzI2OAorICAgIDB4RDU3NCwgLy8g7ZW0LCAjMzIKKyAgICAweEQ1ODgsIC8vIO2WiCwgIzE4MAorICAgIDB4RDU4OSwgLy8g7ZaJLCAjMTM1CisgICAgMHhENUE1LCAvLyDtlqUsICMzNDUKKyAgICAweEQ1QzgsIC8vIO2XiCwgIzM5NgorICAgIDB4RDVEOCwgLy8g7ZeYLCAjMzE2CisgICAgMHhENUU0LCAvLyDtl6QsICM0NzQKKyAgICAweEQ2MDQsIC8vIO2YhCwgIzE4NQorICAgIDB4RDYxMSwgLy8g7ZiRLCAjMzE1CisgICAgMHhENjE1LCAvLyDtmJUsICMyNDQKKyAgICAweEQ2MUMsIC8vIO2YnCwgIzQyOAorICAgIDB4RDYzOCwgLy8g7Zi4LCAjMTE3CisgICAgMHhENjNDLCAvLyDtmLwsICMzNTgKKyAgICAweEQ2NDgsIC8vIO2ZiCwgIzMzMAorICAgIDB4RDY0RCwgLy8g7ZmNLCAjMzYzCisgICAgMHhENjU0LCAvLyDtmZQsICM2MworICAgIDB4RDY1NSwgLy8g7ZmVLCAjMTgzCisgICAgMHhENjU4LCAvLyDtmZgsICMyMjQKKyAgICAweEQ2NUMsIC8vIO2ZnCwgIzI3NworICAgIDB4RDY2OSwgLy8g7ZmpLCAjMzUzCisgICAgMHhENjhDLCAvLyDtmowsICM3NAorICAgIDB4RDY4RCwgLy8g7ZqNLCAjNDU4CisgICAgMHhENjlGLCAvLyDtmp8sICM0MDkKKyAgICAweEQ2QTgsIC8vIO2aqCwgIzQwMAorICAgIDB4RDZDNCwgLy8g7ZuELCAjMTc2CisgICAgMHhENkM4LCAvLyDtm4gsICM0ODYKKyAgICAweEQ3MzQsIC8vIO2ctCwgIzM2NQorICAgIDB4RDc1NCwgLy8g7Z2ULCAjNDgwCisgICAgMHhENzZDLCAvLyDtnawsICMzMzQKKyAgICAweEQ3ODgsIC8vIO2eiCwgIzIyOAorICAgIDB4RDc5OCwgLy8g7Z6YLCAjNTAyCit9OworLy8gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNhbXBsZSBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjaGFyYWN0ZXJzCitzdGF0aWMgY29uc3QgZmxvYXQgZnJlcXVlbnRfa29fY292ZXJhZ2U9MC45NDgxNTcwMjE0NjQxODQ7CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggOThkM2RlZS4uYWMyZDFjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBSRVNUT1JFX09VVFBVVCwKICAgICBPUEVOX0lOUFVULAogICAgIENMT1NFX0lOUFVULAotICAgIFNFVF9TVFJFQU1fT1VUUFVULAorICAgIElOVkFMSURBVEVfU1RSRUFNLAogICAgIFNFVF9WT0lDRV9WT0xVTUUsCiAgICAgR0VUX1JFTkRFUl9QT1NJVElPTiwKICAgICBHRVRfSU5QVVRfRlJBTUVTX0xPU1QsCkBAIC03NCw4ICs3NCwxNyBAQAogICAgIEdFVF9QUklNQVJZX09VVFBVVF9TQU1QTElOR19SQVRFLAogICAgIEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCwKICAgICBTRVRfTE9XX1JBTV9ERVZJQ0UsCisgICAgTElTVF9BVURJT19QT1JUUywKKyAgICBHRVRfQVVESU9fUE9SVCwKKyAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCisgICAgUkVMRUFTRV9BVURJT19QQVRDSCwKKyAgICBMSVNUX0FVRElPX1BBVENIRVMsCisgICAgU0VUX0FVRElPX1BPUlRfQ09ORklHLAorICAgIEdFVF9BVURJT19IV19TWU5DCiB9OwogCisjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CisKIGNsYXNzIEJwQXVkaW9GbGluZ2VyIDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb0ZsaW5nZXI+CiB7CiBwdWJsaWM6CkBAIC04OSwxMyArOTgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewpAQCAtMTA2LDkgKzExNCwxMSBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVDb3VudCk7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gcEZyYW1lQ291bnQgIT0gTlVMTCA/ICpwRnJhbWVDb3VudCA6IDA7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgdHJhY2tfZmxhZ3NfdCBsRmxhZ3MgPSBmbGFncyAhPSBOVUxMID8gKmZsYWdzIDogKHRyYWNrX2ZsYWdzX3QpIFRSQUNLX0RFRkFVTFQ7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihsRmxhZ3MpOworICAgICAgICAvLyBoYXZlU2hhcmVkQnVmZmVyCiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHRydWUpOwogICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWRCdWZmZXItPmFzQmluZGVyKCkpOwpAQCAtMTE3LDcgKzEyNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHRpZCk7Ci0gICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKKyAgICAgICAgaW50IGxTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFOwogICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9CkBAIC0xMjcsNiArMTM3LDEwIEBACiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLWxTdGF0dXMpKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSByZXBseS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGlmIChwRnJhbWVDb3VudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxGbGFncyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKGZsYWdzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqZmxhZ3MgPSBsRmxhZ3M7CkBAIC0xMzUsMTEgKzE0OSwyMSBAQAogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gcmVwbHkucmVhZFN0cmluZzgoKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHRyYWNrID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvVHJhY2s+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmICh0cmFjayA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBJQXVkaW9UcmFjayIpOworICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayByZXR1cm5lZCBhbiBJQXVkaW9UcmFjayBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2suY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cmFjazsKQEAgLTE1MCwxMCArMTc0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTE2MywxOSArMTkwLDI3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBwRnJhbWVDb3VudCAhPSBOVUxMID8gKnBGcmFtZUNvdW50IDogMDsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KGZyYW1lQ291bnQpOwogICAgICAgICB0cmFja19mbGFnc190IGxGbGFncyA9IGZsYWdzICE9IE5VTEwgPyAqZmxhZ3MgOiAodHJhY2tfZmxhZ3NfdCkgVFJBQ0tfREVGQVVMVDsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGxGbGFncyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdGlkKTsKLSAgICAgICAgaW50IGxTZXNzaW9uSWQgPSAwOworICAgICAgICBpbnQgbFNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUludDMyKGxTZXNzaW9uSWQpOworICAgICAgICBkYXRhLndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVzICE9IE5VTEwgPyAqbm90aWZpY2F0aW9uRnJhbWVzIDogMCk7CisgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgYnVmZmVycy5jbGVhcigpOwogICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fUkVDT1JELCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLWxTdGF0dXMpKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSByZXBseS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGlmIChwRnJhbWVDb3VudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxGbGFncyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKGZsYWdzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqZmxhZ3MgPSBsRmxhZ3M7CkBAIC0xODQsMjEgKzIxOSw0MiBAQAogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3QgbE5vdGlmaWNhdGlvbkZyYW1lcyA9IChzaXplX3QpIHJlcGx5LnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm5vdGlmaWNhdGlvbkZyYW1lcyA9IGxOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZWNvcmQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9SZWNvcmQ+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChjYmxrICE9IDAgJiYgY2Jsay0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjYmxrLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJzID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJzICE9IDAgJiYgYnVmZmVycy0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBJQXVkaW9SZWNvcmQiKTsKICAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBjYmxrIik7CisgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgaXMgcGVybWl0dGVkIHRvIGJlIDAKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHJldHVybmVkIGFuIElBdWRpb1JlY29yZCBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZCAhPSAwIHx8IGNibGsgIT0gMCB8fCBidWZmZXJzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgcmV0dXJuZWQgYW4gSUF1ZGlvUmVjb3JkLCBjYmxrLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBidWZmZXJzIGJ1dCB3aXRoIHN0YXR1cyAlZCIsIGxTdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlY29yZDsKQEAgLTIyOCw3ICsyODQsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRlJBTUVfQ09VTlQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOwogICAgIH0KIAogICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0CkBAIC0zNzgsNTMgKzQzNCw0MyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVEJVRkZFUlNJWkUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogICAgIHsKKyAgICAgICAgaWYgKG91dHB1dCA9PSBOVUxMIHx8IGNvbmZpZyA9PSBOVUxMIHx8IGRldmljZXMgPT0gTlVMTCB8fCBsYXRlbmN5TXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gcERldmljZXMgIT0gTlVMTCA/ICpwRGV2aWNlcyA6IChhdWRpb19kZXZpY2VzX3QpMDsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gcFNhbXBsaW5nUmF0ZSAhPSBOVUxMID8gKnBTYW1wbGluZ1JhdGUgOiAwOwotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwRm9ybWF0ICE9IE5VTEwgPyAqcEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHBDaGFubmVsTWFzayAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAqcENoYW5uZWxNYXNrIDogKGF1ZGlvX2NoYW5uZWxfbWFza190KTA7Ci0gICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSBwTGF0ZW5jeU1zICE9IE5VTEwgPyAqcExhdGVuY3lNcyA6IDA7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobW9kdWxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRldmljZXMpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihsYXRlbmN5KTsKKyAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKmRldmljZXMpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChhZGRyZXNzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBmbGFncyk7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlKG9mZmxvYWRJbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fT1VUUFVULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSByZXR1cm5lZCBvdXRwdXQsICVkIiwgb3V0cHV0KTsKLSAgICAgICAgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRGV2aWNlcyAhPSBOVUxMKSAqcERldmljZXMgPSBkZXZpY2VzOwotICAgICAgICBzYW1wbGluZ1JhdGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgKnBTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgICAgIGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpICpwRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBDaGFubmVsTWFzayAhPSBOVUxMKSAqcENoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgIGxhdGVuY3kgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBMYXRlbmN5TXMgIT0gTlVMTCkgKnBMYXRlbmN5TXMgPSBsYXRlbmN5OwotICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKm91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSByZXR1cm5lZCBvdXRwdXQsICVkIiwgKm91dHB1dCk7CisgICAgICAgIHJlcGx5LnJlYWQoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgKmRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqbGF0ZW5jeU1zID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKQEAgLTQ2NSwzNiArNTExLDQwIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgeworICAgICAgICBpZiAoaW5wdXQgPT0gTlVMTCB8fCBjb25maWcgPT0gTlVMTCB8fCBkZXZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gcERldmljZXMgIT0gTlVMTCA/ICpwRGV2aWNlcyA6IChhdWRpb19kZXZpY2VzX3QpMDsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gcFNhbXBsaW5nUmF0ZSAhPSBOVUxMID8gKnBTYW1wbGluZ1JhdGUgOiAwOwotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwRm9ybWF0ICE9IE5VTEwgPyAqcEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHBDaGFubmVsTWFzayAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAqcENoYW5uZWxNYXNrIDogKGF1ZGlvX2NoYW5uZWxfbWFza190KTA7Ci0KICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2R1bGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZGV2aWNlcyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fSU5QVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRGV2aWNlcyAhPSBOVUxMKSAqcERldmljZXMgPSBkZXZpY2VzOwotICAgICAgICBzYW1wbGluZ1JhdGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgKnBTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgICAgIGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpICpwRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBDaGFubmVsTWFzayAhPSBOVUxMKSAqcENoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCppbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpkZXZpY2UpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChhZGRyZXNzKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNvdXJjZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0lOUFVULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKmlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICpkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGludCBpbnB1dCkKQEAgLTUwNiwxMyArNTU2LDEyIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1NUUkVBTV9PVVRQVVQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJTlZBTElEQVRFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIApAQCAtNTI1LDcgKzU3NCw3IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsCiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0CiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC01MzUsNTEgKzU4NCw1NiBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgdWludDMyX3QgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaGFsRnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaGFsRnJhbWVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqaGFsRnJhbWVzID0gdG1wOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoZHNwRnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoZHNwRnJhbWVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gdG1wOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAorICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBpb0hhbmRsZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRfRlJBTUVTX0xPU1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVF9GUkFNRVNfTE9TVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKQorICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTkVXX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGludCBpZCA9IDA7CisgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgaWQgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gaWQ7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgaW50IHBpZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFDUVVJUkVfQVVESU9fU0VTU0lPTl9JRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBpbnQgcGlkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19TRVNTSU9OX0lELCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtNjU3LDcgKzcxMSw3IEBACiAKICAgICAgICAgaWYgKHBEZXNjID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBlZmZlY3Q7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02NzUsNyArNzI5LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChpZCkgeworICAgICAgICAgICAgaWYgKGlkICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqaWQgPSB0bXA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTY4NSw3ICs3MzksNyBAQAogICAgICAgICAgICAgZWZmZWN0ID0gaW50ZXJmYWNlX2Nhc3Q8SUVmZmVjdD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIHJlcGx5LnJlYWQocERlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgICAgICB9CiAKQEAgLTcyNiw3ICs3ODAsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BSSU1BUllfT1VUUFVUX0ZSQU1FX0NPVU5ULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKQpAQCAtNzM3LDcgKzc5MSwxMTIgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9MT1dfUkFNX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KLQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpCisgICAgeworICAgICAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKm51bV9wb3J0cyA9PSAwIHx8IHBvcnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpudW1fcG9ydHMpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QT1JUUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpudW1fcG9ydHMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXBseS5yZWFkKHBvcnRzLCAqbnVtX3BvcnRzICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQorICAgIHsKKyAgICAgICAgaWYgKHBvcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX1BPUlQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCisgICAgeworICAgICAgICBpZiAocGF0Y2ggPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgIGRhdGEud3JpdGUoaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlcGx5LnJlYWQoaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpCisgICAgeworICAgICAgICBpZiAobnVtX3BhdGNoZXMgPT0gTlVMTCB8fCAqbnVtX3BhdGNoZXMgPT0gMCB8fCBwYXRjaGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpudW1fcGF0Y2hlcyk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BBVENIRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbnVtX3BhdGNoZXMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXBseS5yZWFkKHBhdGNoZXMsICpudW1fcGF0Y2hlcyAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCisgICAgeworICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19QT1JUX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb25JZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVESU9fSFdfU1lOQywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0hXX1NZTkNfSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGF1ZGlvX2h3X3N5bmNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9GbGluZ2VyLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9GbGluZ2VyIik7CkBAIC03NTQsNyArOTEzLDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCBmbGFncyA9ICh0cmFja19mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYm9vbCBoYXZlU2hhcmVkQnVmZmVyID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyOwpAQCAtNzY1LDcgKzkyNCw2IEBACiAgICAgICAgICAgICBwaWRfdCB0aWQgPSAocGlkX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBjbGllbnRVaWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgU3RyaW5nOCBuYW1lOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2s7CiAgICAgICAgICAgICBpZiAoKGhhdmVTaGFyZWRCdWZmZXIgJiYgKGJ1ZmZlciA9PSAwKSkgfHwKQEAgLTc3NSwxMiArOTMzLDEzIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRyYWNrID0gY3JlYXRlVHJhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsICZmbGFncywgYnVmZmVyLCBvdXRwdXQsIHRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsIG5hbWUsIGNsaWVudFVpZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgJmZyYW1lQ291bnQsICZmbGFncywgYnVmZmVyLCBvdXRwdXQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsIGNsaWVudFVpZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigodHJhY2sgIT0gMCkgIT0gKHN0YXR1cyA9PSBOT19FUlJPUikpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoZnJhbWVDb3VudCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXNzaW9uSWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChuYW1lKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIodHJhY2stPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNzkxLDE4ICs5NTAsMjcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCBmbGFncyA9ICh0cmFja19mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gZGF0YS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXJzOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICBzcDxJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IG9wZW5SZWNvcmQoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsICZmbGFncywgdGlkLCAmc2Vzc2lvbklkLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJmZyYW1lQ291bnQsICZmbGFncywgdGlkLCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICBjYmxrLCBidWZmZXJzLCAmc3RhdHVzKTsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHJlY29yZCAhPSAwKSAhPSAoc3RhdHVzID09IE5PX0VSUk9SKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb25JZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihyZWNvcmQtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNibGstPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGJ1ZmZlcnMtPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNBTVBMRV9SQVRFOiB7CkBAIC04MTcsNyArOTg1LDcgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBGUkFNRV9DT1VOVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBmcmFtZUNvdW50KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkgKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCBmcmFtZUNvdW50KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBMQVRFTkNZOiB7CkBAIC05MTYsMzggKzEwODQsMzEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKSApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoIGdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE9QRU5fT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYm9vbCBoYXNPZmZsb2FkSW5mbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvOwotICAgICAgICAgICAgaWYgKGhhc09mZmxvYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZWFkKCZvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gb3Blbk91dHB1dChtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPZmZsb2FkSW5mbyA/ICZvZmZsb2FkSW5mbyA6IE5VTEwpOwotICAgICAgICAgICAgQUxPR1YoIk9QRU5fT1VUUFVUIG91dHB1dCwgJXAiLCBvdXRwdXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2VzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGF0ZW5jeSk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyhkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5TXMgPSAwOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuT3V0cHV0KG1vZHVsZSwgJm91dHB1dCwgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZXMsIGFkZHJlc3MsICZsYXRlbmN5TXMsIGZsYWdzKTsKKyAgICAgICAgICAgIEFMT0dWKCJPUEVOX09VVFBVVCBvdXRwdXQsICVkIiwgb3V0cHV0KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpb3V0cHV0KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlcyk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGF0ZW5jeU1zKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBPUEVOX0RVUExJQ0FURV9PVVRQVVQ6IHsKQEAgLTk3NSwyMSArMTEzNiwyNCBAQAogICAgICAgICBjYXNlIE9QRU5fSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlID0gKGF1ZGlvX21vZHVsZV9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyhkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gb3BlbklucHV0KG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGlucHV0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjaGFubmVsTWFzayk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuSW5wdXQobW9kdWxlLCAmaW5wdXQsICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwgYWRkcmVzcywgc291cmNlLCBmbGFncyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgaW5wdXQpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2UpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENMT1NFX0lOUFVUOiB7CkBAIC05OTcsMTEgKzExNjEsMTAgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNsb3NlSW5wdXQoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1NUUkVBTV9PVVRQVVQ6IHsKKyAgICAgICAgY2FzZSBJTlZBTElEQVRFX1NUUkVBTTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRTdHJlYW1PdXRwdXQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgb3V0cHV0KSk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CkBAIC0xMDEzLDggKzExNzYsOCBAQAogICAgICAgICBjYXNlIEdFVF9SRU5ERVJfUE9TSVRJT046IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzaXplX3QgaGFsRnJhbWVzID0gMDsKLSAgICAgICAgICAgIHNpemVfdCBkc3BGcmFtZXMgPSAwOworICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IGRzcEZyYW1lcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRSZW5kZXJQb3NpdGlvbigmaGFsRnJhbWVzLCAmZHNwRnJhbWVzLCBvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTEwMjYsMjQgKzExODksMjYgQEAKICAgICAgICAgY2FzZSBHRVRfSU5QVVRfRlJBTUVTX0xPU1Q6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE5FV19BVURJT19TRVNTSU9OX0lEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobmV3QXVkaW9TZXNzaW9uSWQoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihuZXdBdWRpb1VuaXF1ZUlkKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFDUVVJUkVfQVVESU9fU0VTU0lPTl9JRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19TRVNTSU9OX0lEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgICAgIGludCBwaWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBRVUVSWV9OVU1fRUZGRUNUUzogewpAQCAtMTEyMSw3ICsxMjg2LDcgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBHRVRfUFJJTUFSWV9PVVRQVVRfRlJBTUVfQ09VTlQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9MT1dfUkFNX0RFVklDRTogewpAQCAtMTEzMCw2ICsxMjk1LDEwOSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TG93UmFtRGV2aWNlKGlzTG93UmFtRGV2aWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTElTVF9BVURJT19QT1JUUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Qb3J0c1JlcSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAobnVtUG9ydHNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBudW1Qb3J0c1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Qb3J0cyA9IG51bVBvcnRzUmVxOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzID0KKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBhdWRpb19wb3J0ICopY2FsbG9jKG51bVBvcnRzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIGlmIChwb3J0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Qb3J0cygmbnVtUG9ydHMsIHBvcnRzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1Qb3J0cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gbnVtUG9ydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBudW1Qb3J0czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHBvcnRzLCBudW1Qb3J0c1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwb3J0cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0FVRElPX1BPUlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBwb3J0ID0ge307CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTA1OTUxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvcnQoJnBvcnQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJnBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmcGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTA1OTUxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTElTVF9BVURJT19QQVRDSEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBudW1QYXRjaGVzUmVxID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXMgPSBudW1QYXRjaGVzUmVxOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzID0KKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBhdWRpb19wYXRjaCAqKWNhbGxvYyhudW1QYXRjaGVzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGlmIChwYXRjaGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1BhdGNoZXMoJm51bVBhdGNoZXMsIHBhdGNoZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bVBhdGNoZXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1QYXRjaGVzUmVxID4gbnVtUGF0Y2hlcykgeworICAgICAgICAgICAgICAgICAgICBudW1QYXRjaGVzUmVxID0gbnVtUGF0Y2hlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHBhdGNoZXMsIG51bVBhdGNoZXNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBhdGNoZXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9BVURJT19QT1JUX0NPTkZJRzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWc7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWcpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfQVVESU9fSFdfU1lOQzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbigoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcAppbmRleCAzYzBkNGNmLi4xYzI5OWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcApAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPnNhbXBsaW5nUmF0ZSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+Zm9ybWF0KTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5jaGFubmVsTWFzayk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+ZnJhbWVDb3VudCk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50NjQoZGVzYy0+ZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+bGF0ZW5jeSk7CiAgICAgICAgIH0KICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElPX0NPTkZJR19DSEFOR0VELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAgICAgICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICAgICAgZGVzYy5mb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICAgICAgZGVzYy5jaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgICAgICAgICAgZGVzYy5sYXRlbmN5ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICAgICBwYXJhbTIgPSAmZGVzYzsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggMGRhYjdlMy4uZTg0MDk1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTU4LDkgKzU4LDIyIEBACiAgICAgUVVFUllfREVGQVVMVF9QUkVfUFJPQ0VTU0lORywKICAgICBTRVRfRUZGRUNUX0VOQUJMRUQsCiAgICAgSVNfU1RSRUFNX0FDVElWRV9SRU1PVEVMWSwKLSAgICBJU19PRkZMT0FEX1NVUFBPUlRFRAorICAgIElTX09GRkxPQURfU1VQUE9SVEVELAorICAgIExJU1RfQVVESU9fUE9SVFMsCisgICAgR0VUX0FVRElPX1BPUlQsCisgICAgQ1JFQVRFX0FVRElPX1BBVENILAorICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCisgICAgTElTVF9BVURJT19QQVRDSEVTLAorICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRywKKyAgICBSRUdJU1RFUl9DTElFTlQsCisgICAgR0VUX09VVFBVVF9GT1JfQVRUUiwKKyAgICBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLAorICAgIFJFTEVBU0VfU09VTkRUUklHR0VSX1NFU1NJT04sCisgICAgR0VUX1BIT05FX1NUQVRFCiB9OwogCisjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CisKIGNsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2U+CiB7CiBwdWJsaWM6CkBAIC0xMzgsNiArMTUxLDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZm9ybWF0KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZsYWdzKSk7CisgICAgICAgIC8vIGhhc09mZmxvYWRJbmZvCiAgICAgICAgIGlmIChvZmZsb2FkSW5mbyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDgsNiArMTYyLDM2IEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICBpZiAoYXR0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIldyaXRpbmcgTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIC0gc2hvdWxkbid0IGhhcHBlbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAoYXVkaW9faW9faGFuZGxlX3QpIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZm9ybWF0KSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZmxhZ3MpKTsKKyAgICAgICAgICAgIC8vIGhhc09mZmxvYWRJbmZvCisgICAgICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOworICAgICAgICAgICAgICAgIGRhdGEud3JpdGUob2ZmbG9hZEluZm8sIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PVVRQVVRfRk9SX0FUVFIsIGRhdGEsICZyZXBseSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCkBAIC0xODcsNyArMjMxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTE5NiwzMyArMjQxLDQwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGlucHV0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCkBAIC0zOTAsNyArNDQyLDE4NiBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSgmaW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJU19PRkZMT0FEX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOyAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCisgICAgeworICAgICAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKCpudW1fcG9ydHMgIT0gMCAmJiBwb3J0cyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSAocG9ydHMgPT0gTlVMTCkgPyAwIDogKm51bV9wb3J0czsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHJvbGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1Qb3J0c1JlcSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BPUlRTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqbnVtX3BvcnRzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobnVtUG9ydHNSZXEgPiAqbnVtX3BvcnRzKSB7CisgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSAqbnVtX3BvcnRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gMCkgeworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQocG9ydHMsIG51bVBvcnRzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCisgICAgeworICAgICAgICBpZiAocG9ydCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUocG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVESU9fUE9SVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlcGx5LnJlYWQocG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgIHsKKyAgICAgICAgaWYgKHBhdGNoID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICBkYXRhLndyaXRlKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wYXRjaGVzID09IE5VTEwgfHwgKCpudW1fcGF0Y2hlcyAhPSAwICYmIHBhdGNoZXMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXNSZXEgPSAocGF0Y2hlcyA9PSBOVUxMKSA/IDAgOiAqbnVtX3BhdGNoZXM7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1QYXRjaGVzUmVxKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUEFUQ0hFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKm51bV9wYXRjaGVzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+ICpudW1fcGF0Y2hlcykgeworICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSAqbnVtX3BhdGNoZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKHBhdGNoZXMsIG51bVBhdGNoZXNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCisgICAgeworICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19QT1JUX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9DTElFTlQsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCisgICAgeworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMIHx8IGlvSGFuZGxlID09IE5VTEwgfHwgZGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BIT05FX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9JTlZBTElEOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYXVkaW9fbW9kZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKQEAgLTQ3NCwxMyArNzA1LDM4IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9BVFRSOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICphdHRyID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgZGF0YS5yZWFkKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBib29sIGhhc09mZmxvYWRJbmZvID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOworICAgICAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm87CisgICAgICAgICAgICBpZiAoaGFzT2ZmbG9hZEluZm8pIHsKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWQoJm9mZmxvYWRJbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dEZvckF0dHIoYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgaGFzT2ZmbG9hZEluZm8gPyAmb2ZmbG9hZEluZm8gOiBOVUxMKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KG91dHB1dCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTQ4OCwxMCArNzQ0LDExIEBACiAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaW50IHNlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wT3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC01MTAsMTEgKzc2NywxMyBAQAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGdldElucHV0KGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludD4oaW5wdXQpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTUyMiwyMSArNzgxLDI0IEBACiAgICAgICAgIGNhc2UgU1RBUlRfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0SW5wdXQoaW5wdXQpKSk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IHN0YXRpY19jYXN0IDxhdWRpb19zZXNzaW9uX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydElucHV0KGlucHV0LCBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9JTlBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcElucHV0KGlucHV0KSkpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcElucHV0KGlucHV0LCBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgUkVMRUFTRV9JTlBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlbGVhc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IHN0YXRpY19jYXN0IDxhdWRpb19zZXNzaW9uX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVsZWFzZUlucHV0KGlucHV0LCBzZXNzaW9uKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtNjM0LDcgKzg5Niw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gKHVpbnQzMl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgaW5QYXN0TXMpICk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcykgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtNjQyLDcgKzkwNCw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gKHVpbnQzMl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmVSZW1vdGVseSgoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtLCBpblBhc3RNcykgKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTY4Nyw2ICs5NDksMTU3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlID0gKGF1ZGlvX3BvcnRfcm9sZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlID0gKGF1ZGlvX3BvcnRfdHlwZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHMgPSBudW1Qb3J0c1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcG9ydCAqKWNhbGxvYyhudW1Qb3J0c1JlcSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICBpZiAocG9ydHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCAmbnVtUG9ydHMsIHBvcnRzLCAmZ2VuZXJhdGlvbik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUG9ydHMpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gbnVtUG9ydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBudW1Qb3J0czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHBvcnRzLCBudW1Qb3J0c1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdlbmVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwb3J0cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkxMjIwMiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb3J0KCZwb3J0KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgZGF0YS5yZWFkKCZwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0ge307CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MTIyMDIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExJU1RfQVVESU9fUEFUQ0hFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1QYXRjaGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzID0gbnVtUGF0Y2hlc1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcGF0Y2ggKiljYWxsb2MobnVtUGF0Y2hlc1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICBpZiAocGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1BhdGNoZXMoJm51bVBhdGNoZXMsIHBhdGNoZXMsICZnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1QYXRjaGVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IG51bVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IG51bVBhdGNoZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwYXRjaGVzLCBudW1QYXRjaGVzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdlbmVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwYXRjaGVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0FVRElPX1BPUlRfQ09ORklHOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZzsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRUdJU1RFUl9DTElFTlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PigKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVnaXN0ZXJDbGllbnQoY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PigKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSB7fTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0ge307CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigmc2Vzc2lvbiwgJmlvSGFuZGxlLCAmZGV2aWNlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW9IYW5kbGUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCisgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX1BIT05FX1NUQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpZ2V0UGhvbmVTdGF0ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBQT1JUX0xJU1RfVVBEQVRFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBQQVRDSF9MSVNUX1VQREFURQorfTsKKworY2xhc3MgQnBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4KK3sKK3B1YmxpYzoKKyAgICBCcEF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUE9SVF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorCisgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQQVRDSF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgImFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgY2FzZSBQT1JUX0xJU1RfVVBEQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgY2FzZSBQQVRDSF9MSVNUX1VQREFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKaW5kZXggNGE3ZGU2NS4uOGE0YTM4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gewotICAgIEdFVF9DQkxLID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBVTlVTRURfV0FTX0dFVF9DQkxLID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBTVEFSVCwKICAgICBTVE9QCiB9OwpAQCAtNDIsMTggKzQyLDYgQEAKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1JlY29yZDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DQkxLLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2JsazsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwgaW50IHRyaWdnZXJTZXNzaW9uKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtODYsMTEgKzc0LDYgQEAKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogewogICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIEdFVF9DQkxLOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUmVjb3JkLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZ2V0Q2JsaygpLT5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTVEFSVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1JlY29yZCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50ID0gZGF0YS5yZWFkSW50MzIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcAppbmRleCAzY2Q5Y2ZkLi4yNjViYjFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCkBAIC02MCw2ICs2MCw5IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYmxrOwogICAgIH0KQEAgLTExNSwxMyArMTE4LDE2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZVRpbWVkQnVmZmVyKHNpemVfdCBzaXplLCBzcDxJTWVtb3J5PiogYnVmZmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DQVRFX1RJTUVEX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICpidWZmZXIgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyICE9IDAgJiYgKCpidWZmZXIpLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAoKmJ1ZmZlcikuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTIzMiw3ICsyMzgsNyBAQAogICAgICAgICBjYXNlIEFMTE9DQVRFX1RJTUVEX0JVRkZFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXI7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhbGxvY2F0ZVRpbWVkQnVmZmVyKGRhdGEucmVhZEludDMyKCksICZidWZmZXIpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWxsb2NhdGVUaW1lZEJ1ZmZlcihkYXRhLnJlYWRJbnQ2NCgpLCAmYnVmZmVyKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGJ1ZmZlci0+YXNCaW5kZXIoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lDcnlwdG8uY3BwCmluZGV4IDkxOGQ3MjUuLjE4MzI1YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lDcnlwdG8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lDcnlwdG8uY3BwCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgZGF0YS53cml0ZShzdWJTYW1wbGVzLCBzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpICogbnVtU3ViU2FtcGxlcyk7CiAKICAgICAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3QpZHN0UHRyKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGRzdFB0cikpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERUNSWVBULCBkYXRhLCAmcmVwbHkpOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAKICAgICAgICAgICAgIHZvaWQgKnNlY3VyZUJ1ZmZlcklkLCAqZHN0UHRyOwogICAgICAgICAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICAgICAgICAgIHNlY3VyZUJ1ZmZlcklkID0gKHZvaWQgKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgICAgICBzZWN1cmVCdWZmZXJJZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGRhdGEucmVhZEludDY0KCkpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZHN0UHRyID0gbWFsbG9jKHRvdGFsU2l6ZSk7CiAgICAgICAgICAgICAgICAgbWVtc2V0KGRzdFB0ciwgMCwgdG90YWxTaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKaW5kZXggZjFhNmE5Zi4uMTkwNDgzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKQEAgLTUzLDcgKzUzLDggQEAKICAgICBTSUdOLAogICAgIFNJR05fUlNBLAogICAgIFZFUklGWSwKLSAgICBTRVRfTElTVEVORVIKKyAgICBTRVRfTElTVEVORVIsCisgICAgVU5QUk9WSVNJT05fREVWSUNFCiB9OwogCiBzdHJ1Y3QgQnBEcm0gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybT4gewpAQCAtMjI5LDYgKzIzMCwxNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVU5QUk9WSVNJT05fREVWSUNFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC02MTksNiArNjI5LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIFVOUFJPVklTSU9OX0RFVklDRToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHVucHJvdmlzaW9uRGV2aWNlKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBHRVRfU0VDVVJFX1NUT1BTOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAppbmRleCAxZTU0Y2E4Li44Y2QxNThkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcApAQCAtMTE5LDYgKzExOSw5IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYmxrOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjTGlzdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmN2M1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gIC8vIGZvciBzdGF0dXNfdAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIENSRUFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgQ09VTlRfQ09ERUNTLAorICAgIEdFVF9DT0RFQ19JTkZPLAorICAgIEZJTkRfQ09ERUNfQllfVFlQRSwKKyAgICBGSU5EX0NPREVDX0JZX05BTUUsCit9OworCitjbGFzcyBCcE1lZGlhQ29kZWNMaXN0OiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhQ29kZWNMaXN0PgoreworcHVibGljOgorICAgIEJwTWVkaWFDb2RlY0xpc3QoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SU1lZGlhQ29kZWNMaXN0PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0CisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFDb2RlY0xpc3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT1VOVF9DT0RFQ1MsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPE1lZGlhQ29kZWNJbmZvPiBnZXRDb2RlY0luZm8oc2l6ZV90IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPREVDX0lORk8sIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gTWVkaWFDb2RlY0luZm86OkZyb21QYXJjZWwocmVwbHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0CisgICAgeworICAgICAgICBpZiAoc3RhcnRJbmRleCA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyh0eXBlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGVuY29kZXIpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhcnRJbmRleCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSU5EX0NPREVDX0JZX1RZUEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhuYW1lKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZJTkRfQ09ERUNfQllfTkFNRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFDb2RlY0xpc3QsICJhbmRyb2lkLm1lZGlhLklNZWRpYUNvZGVjTGlzdCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuTWVkaWFDb2RlY0xpc3Q6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBDT1VOVF9DT0RFQ1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFDb2RlY0xpc3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IGNvdW50Q29kZWNzKCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IElOVDMyX01BWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9DT0RFQ19JTkZPOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBnZXRDb2RlY0luZm8oaW5kZXgpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE9LKTsKKyAgICAgICAgICAgICAgICBpbmZvLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoLUVSQU5HRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGSU5EX0NPREVDX0JZX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFDb2RlY0xpc3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBib29sIGlzRW5jb2RlciA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc2l6ZV90IHN0YXJ0SW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGZpbmRDb2RlY0J5VHlwZSh0eXBlLCBpc0VuY29kZXIsIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgaWYgKGluZGV4ID4gSU5UMzJfTUFYIHx8IGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGSU5EX0NPREVDX0JZX05BTUU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFDb2RlY0xpc3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gZmluZENvZGVjQnlOYW1lKG5hbWUpOworICAgICAgICAgICAgaWYgKGluZGV4ID4gSU5UMzJfTUFYIHx8IGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCmluZGV4IDlkYjViMWIuLjEwYjQ5MzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCkBAIC03NSw3ICs3NSw3IEBACiB9CiAKIHZvaWQKLUlNZWRpYURlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgeworSU1lZGlhRGVhdGhOb3RpZmllcjo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CiAgICAgQUxPR1coIm1lZGlhIHNlcnZlciBkaWVkIik7CiAKICAgICAvLyBOZWVkIHRvIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBoZWxkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhMzcxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSU1lZGlhSFRUUENvbm5lY3Rpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBESVNDT05ORUNULAorICAgIFJFQURfQVQsCisgICAgR0VUX1NJWkUsCisgICAgR0VUX01JTUVfVFlQRSwKKyAgICBHRVRfVVJJCit9OworCitzdHJ1Y3QgQnBNZWRpYUhUVFBDb25uZWN0aW9uIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUhUVFBDb25uZWN0aW9uPiB7CisgICAgQnBNZWRpYUhUVFBDb25uZWN0aW9uKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUhUVFBDb25uZWN0aW9uPihpbXBsKSB7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIFN0cmluZzE2IHRtcCh1cmkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYodG1wKTsKKworICAgICAgICB0bXAgPSBTdHJpbmcxNigiIik7CisgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcxNiBrZXkoaGVhZGVycy0+a2V5QXQoaSkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIFN0cmluZzE2IHZhbChoZWFkZXJzLT52YWx1ZUF0KGkpLnN0cmluZygpKTsKKworICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoa2V5KTsKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzE2KCI6ICIpKTsKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKHZhbCk7CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmcxNigiXHJcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYodG1wKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgbU1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGJpbmRlcik7CisKKyAgICAgICAgcmV0dXJuIG1NZW1vcnkgIT0gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50NjQob2Zmc2V0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUFEX0FULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgicmVtb3RlIHJlYWRBdCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbGVuID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgaWYgKGxlbiA+IHNpemUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZXF1ZXN0ZWQgJXp1LCBnb3QgJXp1Iiwgc2l6ZSwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiA+IG1NZW1vcnktPnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoImdvdCAlenUsIGJ1dCBtZW1vcnkgaGFzICV6dSIsIGxlbiwgbU1lbW9yeS0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoYnVmZmVyLCBtTWVtb3J5LT5wb2ludGVyKCksIGxlbik7CisKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TSVpFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpIHsKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOCgiIik7CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NSU1FX1RZUEUsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqbWltZVR5cGUgPSBTdHJpbmc4KHJlcGx5LnJlYWRTdHJpbmcxNigpKTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSB7CisgICAgICAgICp1cmkgPSBTdHJpbmc4KCIiKTsKKworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1VSSSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgICp1cmkgPSBTdHJpbmc4KHJlcGx5LnJlYWRTdHJpbmcxNigpKTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoCisgICAgICAgIE1lZGlhSFRUUENvbm5lY3Rpb24sICJhbmRyb2lkLm1lZGlhLklNZWRpYUhUVFBDb25uZWN0aW9uIik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjYwNTgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklNZWRpYUhUVFBTZXJ2aWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIE1BS0VfSFRUUCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCit9OworCitzdHJ1Y3QgQnBNZWRpYUhUVFBTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUhUVFBTZXJ2aWNlPiB7CisgICAgQnBNZWRpYUhUVFBTZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUhUVFBTZXJ2aWNlPihpbXBsKSB7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUFLRV9IVFRQLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBDb25uZWN0aW9uPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRSgKKyAgICAgICAgTWVkaWFIVFRQU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhSFRUUFNlcnZpY2UiKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCAzMzIzOWE3Li44YTY2YzdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcApAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFMb2dTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZC0+YXNCaW5kZXIoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NCgoaW50NjRfdCkgc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG5hbWUpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfV1JJVEVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICAvLyBGSVhNRSBpZ25vcmVzIHN0YXR1cwpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICBjYXNlIFJFR0lTVEVSX1dSSVRFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUxvZ1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IHNoYXJlZCA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdCkgZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICByZWdpc3RlcldyaXRlcihzaGFyZWQsIHNpemUsIG5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IGJiMDY2YTAuLjM4ZjcxN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTE1LDkgKzE1LDEyIEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTg0LDE3ICs4NywyMyBAQAogICAgIH0KIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihodHRwU2VydmljZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGh0dHBTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaHR0cFNlcnZpY2UtPmFzQmluZGVyKCkpOworICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHNyY1VybCk7CiAKICAgICAgICAgaWYgKGhlYWRlcnMgPT0gTlVMTCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gc2VyaWFsaXplIHRoZSBoZWFkZXJzCi0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoaGVhZGVycy0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChoZWFkZXJzLT5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFkZXJzLT5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGhlYWRlcnMtPmtleUF0KGkpKTsKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChoZWFkZXJzLT52YWx1ZUF0KGkpKTsKQEAgLTExOCw3ICsxMjcsNyBAQAogCiAgICAgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pCiAgICAgewotICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglbGxkIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVVcyk7CkBAIC0xOTUsMTggKzIwNCwyNiBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSkgeworICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY29uc3QgY2hhciogc3JjVXJsID0gZGF0YS5yZWFkQ1N0cmluZygpOwogCiAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOwotICAgICAgICAgICAgaW50MzJfdCBudW1IZWFkZXJzID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSGVhZGVyczsgKytpKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtSGVhZGVycyA9IChzaXplX3QpIGRhdGEucmVhZEludDY0KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUhlYWRlcnM7ICsraSkgewogICAgICAgICAgICAgICAgIFN0cmluZzgga2V5ID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKAotICAgICAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKHNyY1VybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlLCBzcmNVcmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTIyMiw3ICsyMzksNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgICAgICBpbnQgb3B0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCVsbGQgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOworICAgICAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwogI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKICAgICAgICAgICAgIHNldFNjaGVkUG9saWN5KGRhdGEpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCAyYTVjN2E3Li5hMjlhN2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogCkBAIC03NSwxMSArNzYsMTcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiB1cmwsCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGh0dHBTZXJ2aWNlICE9IE5VTEwpOworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihodHRwU2VydmljZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodXJsKTsKICAgICAgICAgaWYgKGhlYWRlcnMgPT0gTlVMTCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwpAQCAtMzU1LDYgKzM2MiwxMyBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CiAgICAgICAgICAgICBpbnQzMl90IG51bUhlYWRlcnMgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMzYzLDcgKzM3Nyw4IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2UodXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlLCB1cmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0RBVEFfU09VUkNFX0ZEOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDNjMjJiNGMuLjJlMDJkMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lEcm0uaD4KICNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgpAQCAtNDgsNyArNTAsNyBAQAogICAgIEFERF9CQVRURVJZX0RBVEEsCiAgICAgUFVMTF9CQVRURVJZX0RBVEEsCiAgICAgTElTVEVOX0ZPUl9SRU1PVEVfRElTUExBWSwKLSAgICBVUERBVEVfUFJPWFlfQ09ORklHLAorICAgIEdFVF9DT0RFQ19MSVNULAogfTsKIAogY2xhc3MgQnBNZWRpYVBsYXllclNlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFQbGF5ZXJTZXJ2aWNlPgpAQCAtODYsMTIgKzg4LDIxIEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFSZWNvcmRlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICBzaXplX3QgKnBTaXplKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGh0dHBTZXJ2aWNlICE9IE5VTEwpOworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihodHRwU2VydmljZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodXJsKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihoZWFwLT5hc0JpbmRlcigpKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KERFQ09ERV9VUkwsIGRhdGEsICZyZXBseSk7CkBAIC0xODMsMjMgKzE5NCwxMSBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVJlbW90ZURpc3BsYXk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgeworICAgIHZpcnR1YWwgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRDb2RlY0xpc3QoKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLQogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKGhvc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoaG9zdCk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydCk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhleGNsdXNpb25MaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVUERBVEVfUFJPWFlfQ09ORklHLCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT0RFQ19MSVNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhQ29kZWNMaXN0PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIH07CiAKQEAgLTIyMiwxMyArMjIxLDI1IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgREVDT0RFX1VSTDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpKSB7CisgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY29uc3QgY2hhciogdXJsID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGludCBudW1DaGFubmVsczsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKICAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVjb2RlKHVybCwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmZvcm1hdCwgaGVhcCwgJnNpemUpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBkZWNvZGUoaHR0cFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKQEAgLTMxNiwyNCArMzI3LDEyIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZGlzcGxheS0+YXNCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgVVBEQVRFX1BST1hZX0NPTkZJRzoKLSAgICAgICAgeworICAgICAgICBjYXNlIEdFVF9DT0RFQ19MSVNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0ID0gTlVMTDsKLSAgICAgICAgICAgIGludDMyX3QgcG9ydCA9IDA7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0ID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKLSAgICAgICAgICAgICAgICBob3N0ID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgICAgIHBvcnQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGV4Y2x1c2lvbkxpc3QgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpKTsKLQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IG1jbCA9IGdldENvZGVjTGlzdCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKG1jbC0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCA4ZTU4MTYyLi45NWFmMDA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC0xNyw2ICsxNywxMCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIklNZWRpYVJlY29yZGVyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgpAQCAtMjQsOCArMjgsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTY3LDcgKzE2OSw3IEBACiAgICAgfQogCiAgICAgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCAxMDc0N2YzLi4wZmY0N2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtNTQsNiArNTQsNyBAQAogICAgIEdFVF9HUkFQSElDX0JVRkZFUl9VU0FHRSwKICAgICBTRVRfSU5URVJOQUxfT1BUSU9OLAogICAgIFVQREFURV9HUkFQSElDX0JVRkZFUl9JTl9NRVRBLAorICAgIENPTkZJR1VSRV9WSURFT19UVU5ORUxfTU9ERSwKIH07CiAKIGNsYXNzIEJwT01YIDogcHVibGljIEJwSW50ZXJmYWNlPElPTVg+IHsKQEAgLTY1LDcgKzY2LDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgbGl2ZXNMb2NhbGx5KG5vZGVfaWQgbm9kZSwgcGlkX3QgcGlkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTElWRVNfTE9DQUxMWSwgZGF0YSwgJnJlcGx5KTsKIApAQCAtMTA0LDcgKzEwNSw3IEBACiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICpub2RlID0gKHZvaWQqKXJlcGx5LnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgICpub2RlID0gKG5vZGVfaWQpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqbm9kZSA9IDA7CiAgICAgICAgIH0KQEAgLTExNSw3ICsxMTYsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJlZU5vZGUobm9kZV9pZCBub2RlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGUkVFX05PREUsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMTI1LDcgKzEyNiw3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNtZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwYXJhbSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRU5EX0NPTU1BTkQsIGRhdGEsICZyZXBseSk7CkBAIC0xMzgsOSArMTM5LDkgQEAKICAgICAgICAgICAgIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGUocGFyYW1zLCBzaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QQVJBTUVURVIsIGRhdGEsICZyZXBseSk7CiAKQEAgLTE1OSw5ICsxNjAsOSBAQAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgZGF0YS53cml0ZShwYXJhbXMsIHNpemUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BBUkFNRVRFUiwgZGF0YSwgJnJlcGx5KTsKIApAQCAtMTczLDkgKzE3NCw5IEBACiAgICAgICAgICAgICB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOwogICAgICAgICBkYXRhLndyaXRlKHBhcmFtcywgc2l6ZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ09ORklHLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0xOTQsOSArMTk1LDkgQEAKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGUocGFyYW1zLCBzaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DT05GSUcsIGRhdGEsICZyZXBseSk7CiAKQEAgLTIwNyw3ICsyMDgsNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfU1RBVEVUWVBFKiBzdGF0ZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgICpzdGF0ZSA9IHN0YXRpY19jYXN0PE9NWF9TVEFURVRZUEU+KHJlcGx5LnJlYWRJbnQzMigpKTsKQEAgLTIxOCw3ICsyMTksNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpZW5hYmxlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVOQUJMRV9HUkFQSElDX0JVRkZFUlMsIGRhdGEsICZyZXBseSk7CkBAIC0yMzEsNyArMjMyLDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfR1JBUEhJQ19CVUZGRVJfVVNBR0UsIGRhdGEsICZyZXBseSk7CiAKQEAgLTI0NSw3ICsyNDYsNyBAQAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHBhcmFtcy0+YXNCaW5kZXIoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVU0VfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwpAQCAtMjU3LDcgKzI1OCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgKmJ1ZmZlciA9ICh2b2lkKilyZXBseS5yZWFkSW50UHRyKCk7CisgICAgICAgICpidWZmZXIgPSAoYnVmZmVyX2lkKXJlcGx5LnJlYWRJbnQzMigpOwogCiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMjY4LDcgKzI2OSw3IEBACiAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgYnVmZmVyX2lkICpidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlKCpncmFwaGljQnVmZmVyKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVTRV9HUkFQSElDX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKQEAgLTI4MCw3ICsyODEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgICpidWZmZXIgPSAodm9pZCopcmVwbHkucmVhZEludFB0cigpOworICAgICAgICAqYnVmZmVyID0gKGJ1ZmZlcl9pZClyZXBseS5yZWFkSW50MzIoKTsKIAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTI5MCwxMCArMjkxLDEwIEBACiAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgYnVmZmVyX2lkIGJ1ZmZlcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGUoKmdyYXBoaWNCdWZmZXIpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVQREFURV9HUkFQSElDX0JVRkZFUl9JTl9NRVRBLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMzA2LDcgKzMwNyw3IEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0lOUFVUX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTMyOSw3ICszMzAsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTSUdOQUxfRU5EX09GX0lOUFVUX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR1coImJpbmRlciB0cmFuc2FjdGlvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKQEAgLTM0Myw3ICszNDQsNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpZW5hYmxlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1JFX01FVEFfREFUQV9JTl9CVUZGRVJTLCBkYXRhLCAmcmVwbHkpOwpAQCAtMzU3LDcgKzM1OCw3IEBACiAgICAgICAgICAgICBPTVhfVTMyIG1heF93aWR0aCwgT01YX1UzMiBtYXhfaGVpZ2h0KSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWVuYWJsZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtYXhfd2lkdGgpOwpAQCAtMzY4LDE0ICszNjksMzMgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUgKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCl0dW5uZWxlZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb0h3U3luYyk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT05GSUdVUkVfVklERU9fVFVOTkVMX01PREUsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzaWRlYmFuZEhhbmRsZSkgeworICAgICAgICAgICAgKnNpZGViYW5kSGFuZGxlID0gKG5hdGl2ZV9oYW5kbGVfdCAqKXJlcGx5LnJlYWROYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCB2b2lkICoqYnVmZmVyX2RhdGEpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTM4NSw4ICs0MDUsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgICpidWZmZXIgPSAodm9pZCAqKXJlcGx5LnJlYWRJbnRQdHIoKTsKLSAgICAgICAgKmJ1ZmZlcl9kYXRhID0gKHZvaWQgKilyZXBseS5yZWFkSW50UHRyKCk7CisgICAgICAgICpidWZmZXIgPSAoYnVmZmVyX2lkKXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqYnVmZmVyX2RhdGEgPSAodm9pZCAqKXJlcGx5LnJlYWRJbnQ2NCgpOwogCiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMzk2LDcgKzQxNiw3IEBACiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocGFyYW1zLT5hc0JpbmRlcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DX0JVRkZFUl9XSVRIX0JBQ0tVUCwgZGF0YSwgJnJlcGx5KTsKQEAgLTQwOCw3ICs0MjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgICpidWZmZXIgPSAodm9pZCopcmVwbHkucmVhZEludFB0cigpOworICAgICAgICAqYnVmZmVyID0gKGJ1ZmZlcl9pZClyZXBseS5yZWFkSW50MzIoKTsKIAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTQxNyw5ICs0MzcsOSBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZSRUVfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTQyOCw4ICs0NDgsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSUxMX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC00NDIsOCArNDYyLDggQEAKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihyYW5nZV9vZmZzZXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocmFuZ2VfbGVuZ3RoKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKQEAgLTQ1OSw3ICs0NzksNyBAQAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcocGFyYW1ldGVyX25hbWUpOwogCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRVhURU5TSU9OX0lOREVYLCBkYXRhLCAmcmVwbHkpOwpAQCAtNDgyLDkgKzUwMiw5IEBACiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOwogICAgICAgICBkYXRhLndyaXRlKG9wdGlvbkRhdGEsIHNpemUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIodHlwZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfSU5URVJOQUxfT1BUSU9OLCBkYXRhLCAmcmVwbHkpOwpAQCAtNTA5LDcgKzUyOSw3IEBACiAgICAgICAgIGNhc2UgTElWRVNfTE9DQUxMWToKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCAqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGl2ZXNMb2NhbGx5KG5vZGUsIHBpZCkpOwogCkBAIC01NTMsNyArNTczLDcgQEAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGFsbG9jYXRlTm9kZShuYW1lLCBvYnNlcnZlciwgJm5vZGUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01NjMsNyArNTgzLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZyZWVOb2RlKG5vZGUpKTsKIApAQCAtNTc0LDcgKzU5NCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQ09NTUFORFRZUEU+KGRhdGEucmVhZEludDMyKCkpOwpAQCAtNTkzLDEwICs2MTMsMTAgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4ID0gc3RhdGljX2Nhc3Q8T01YX0lOREVYVFlQRT4oZGF0YS5yZWFkSW50MzIoKSk7CiAKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50NjQoKTsKIAogICAgICAgICAgICAgdm9pZCAqcGFyYW1zID0gbWFsbG9jKHNpemUpOwogICAgICAgICAgICAgZGF0YS5yZWFkKHBhcmFtcywgc2l6ZSk7CkBAIC02NDQsNyArNjY0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfU1RBVEVUWVBFIHN0YXRlID0gT01YX1N0YXRlSW52YWxpZDsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0U3RhdGUobm9kZSwgJnN0YXRlKTsKQEAgLTY1OCw3ICs2NzgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSAoT01YX0JPT0wpZGF0YS5yZWFkSW50MzIoKTsKIApAQCAtNjcyLDcgKzY5Miw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgT01YX1UzMiB1c2FnZSA9IDA7CkBAIC02ODcsNyArNzA3LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gcGFyYW1zID0KICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CkBAIC02OTcsNyArNzE3LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNzA3LDcgKzcyNyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOwogICAgICAgICAgICAgZGF0YS5yZWFkKCpncmFwaGljQnVmZmVyKTsKQEAgLTcxOCw3ICs3MzgsNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC03MjgsMTEgKzc0OCwxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKICAgICAgICAgICAgIGRhdGEucmVhZCgqZ3JhcGhpY0J1ZmZlcik7Ci0gICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9IChidWZmZXJfaWQpZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YSgKICAgICAgICAgICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgZ3JhcGhpY0J1ZmZlciwgYnVmZmVyKTsKQEAgLTc0NSw3ICs3NjUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOwpAQCAtNzY1LDcgKzc4NSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzaWduYWxFbmRPZklucHV0U3RyZWFtKG5vZGUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKQEAgLTc3Nyw3ICs3OTcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSAoT01YX0JPT0wpZGF0YS5yZWFkSW50MzIoKTsKIApAQCAtNzkxLDcgKzgxMSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9CT09MIGVuYWJsZSA9IChPTVhfQk9PTClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBtYXhfd2lkdGggPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtODA0LDExICs4MjQsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQ09ORklHVVJFX1ZJREVPX1RVTk5FTF9NT0RFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBPTVhfQk9PTCB0dW5uZWxlZCA9IChPTVhfQk9PTClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgT01YX1UzMiBhdWRpb19od19zeW5jID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpzaWRlYmFuZF9oYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHR1bm5lbGVkLCBhdWRpb19od19zeW5jLCAmc2lkZWJhbmRfaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVOYXRpdmVIYW5kbGUoc2lkZWJhbmRfaGFuZGxlKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBBTExPQ19CVUZGRVI6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmICghaXNTZWN1cmUobm9kZSkgfHwgcG9ydF9pbmRleCAhPSAwIC8qIGtQb3J0SW5kZXhJbnB1dCAqLykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI0MzEwNDIzIik7CkBAIC04MTYsNyArODU0LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50NjQoKTsKIAogICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlcjsKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlcl9kYXRhOwpAQCAtODI1LDggKzg2Myw4IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyX2RhdGEpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoKHVpbnRwdHJfdClidWZmZXJfZGF0YSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTgzNiw3ICs4NzQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBwYXJhbXMgPQogICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKQEAgLTg0OCw3ICs4ODYsNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC04NTgsOSArODk2LDkgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAoYnVmZmVyX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmcmVlQnVmZmVyKG5vZGUsIHBvcnRfaW5kZXgsIGJ1ZmZlcikpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC04NzAsOCArOTA4LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9IChidWZmZXJfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZpbGxCdWZmZXIobm9kZSwgYnVmZmVyKSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTg4MSw4ICs5MTksOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOwotICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKGJ1ZmZlcl9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiByYW5nZV9vZmZzZXQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiByYW5nZV9sZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBmbGFncyA9IGRhdGEucmVhZEludDMyKCk7CkBAIC05MDAsNyArOTM4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSA9IGRhdGEucmVhZENTdHJpbmcoKTsKIAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKQEAgLTkzMyw2ICs5NzEsOCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWE9ic2VydmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKCZtc2csIHNpemVvZihtc2cpKTsKIAorICAgICAgICBBTE9HVigib25NZXNzYWdlIHdyaXRpbmcgbWVzc2FnZSAlZCwgc2l6ZSAlenUiLCBtc2cudHlwZSwgc2l6ZW9mKG1zZykpOworCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPQlNFUlZFUl9PTl9NU0csIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC05NDksNiArOTg5LDggQEAKICAgICAgICAgICAgIG9teF9tZXNzYWdlIG1zZzsKICAgICAgICAgICAgIGRhdGEucmVhZCgmbXNnLCBzaXplb2YobXNnKSk7CiAKKyAgICAgICAgICAgIEFMT0dWKCJvblRyYW5zYWN0IHJlYWRpbmcgbWVzc2FnZSAlZCwgc2l6ZSAlenUiLCBtc2cudHlwZSwgc2l6ZW9mKG1zZykpOworCiAgICAgICAgICAgICAvLyBYWFggQ291bGQgdXNlIHJlYWRJbnBsYWNlIG1heWJlPwogICAgICAgICAgICAgb25NZXNzYWdlKG1zZyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKaW5kZXggNjhmZmNhOC4uZmUyY2M2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8c3A8SU1lbW9yeT4gPiAmYnVmZmVycykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3RyZWFtU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYnVmZmVycy5zaXplKCkpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGJ1ZmZlcnMuc2l6ZSgpKSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVycy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXJzLml0ZW1BdChpKS0+YXNCaW5kZXIoKSk7CiAgICAgICAgIH0KQEAgLTcyLDcgKzcyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJBdmFpbGFibGUoc2l6ZV90IGluZGV4KSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdHJlYW1Tb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihpbmRleCkpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oaW5kZXgpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KAogICAgICAgICAgICAgICAgIE9OX0JVRkZFUl9BVkFJTEFCTEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KQEAgLTEwMiw3ICsxMDIsNyBAQAogICAgICAgICBjYXNlIFNFVF9CVUZGRVJTOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN0cmVhbVNvdXJjZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc2l6ZV90IG4gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc2l6ZV90IG4gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDY0KCkpOwogICAgICAgICAgICAgVmVjdG9yPHNwPElNZW1vcnk+ID4gYnVmZmVyczsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0KQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICBjYXNlIE9OX0JVRkZFUl9BVkFJTEFCTEU6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3RyZWFtU291cmNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBvbkJ1ZmZlckF2YWlsYWJsZShzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgIG9uQnVmZmVyQXZhaWxhYmxlKHN0YXRpY19jYXN0PHNpemVfdD4oZGF0YS5yZWFkSW50NjQoKSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ1LDggKzE0NSw4IEBACiAgICAgdmlydHVhbCB2b2lkIHF1ZXVlQnVmZmVyKHNpemVfdCBpbmRleCwgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN0cmVhbUxpc3RlbmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5kZXgpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHNpemUpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGluZGV4KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihzaXplKSk7CiAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFFVRVVFX0JVRkZFUiwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQpAQCAtMTc3LDggKzE3Nyw4IEBACiAgICAgICAgIGNhc2UgUVVFVUVfQlVGRkVSOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN0cmVhbUxpc3RlbmVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQ2NCgpKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQ2NCgpKTsKIAogICAgICAgICAgICAgcXVldWVCdWZmZXIoaW5kZXgsIHNpemUpOwogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAppbmRleCBlOTE0YjM0Li5mMGYxODMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgIHBMaWJDb25maWctPnNhbXBsZVJhdGUsCiAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChwTGliQ29uZmlnLT5udW1DaGFubmVscyksCi0gICAgICAgICAgICBtVHJhY2tCdWZmZXJTaXplLAorICAgICAgICAgICAgKHNpemVfdCkgbVRyYWNrQnVmZmVyU2l6ZSwKICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwogCiAgICAgLy8gY3JlYXRlIHJlbmRlciBhbmQgcGxheWJhY2sgdGhyZWFkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0YzRlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjSW5mbyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygKKyAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0IHsKKyAgICBwcm9maWxlTGV2ZWxzLT5jbGVhcigpOworICAgIHByb2ZpbGVMZXZlbHMtPmFwcGVuZFZlY3RvcihtUHJvZmlsZUxldmVscyk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKAorICAgICAgICBWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMpIGNvbnN0IHsKKyAgICBjb2xvckZvcm1hdHMtPmNsZWFyKCk7CisgICAgY29sb3JGb3JtYXRzLT5hcHBlbmRWZWN0b3IobUNvbG9yRm9ybWF0cyk7Cit9CisKK3VpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBtRmxhZ3M7Cit9CisKK2NvbnN0IHNwPEFNZXNzYWdlPiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKCkgY29uc3QgeworICAgIHJldHVybiBtRGV0YWlsczsKK30KKworTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkKKyAgOiBtRmxhZ3MoMCkgeworICAgIG1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOworfQorCisvLyBzdGF0aWMKK3NwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwoCisgICAgICAgIGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IG5ldyBDYXBhYmlsaXRpZXMoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOworICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcHJvZmlsZUxldmVsLm1MZXZlbCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgICAgICBpZiAoY2FwcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYXBzLT5tUHJvZmlsZUxldmVscy5wdXNoX2JhY2socHJvZmlsZUxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IGNvbG9yID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChjYXBzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNhcHMtPm1Db2xvckZvcm1hdHMucHVzaF9iYWNrKGNvbG9yKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCBmbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gQU1lc3NhZ2U6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAoY2FwcyAhPSBOVUxMKSB7CisgICAgICAgIGNhcHMtPm1GbGFncyA9IGZsYWdzOworICAgICAgICBjYXBzLT5tRGV0YWlscyA9IGRldGFpbHM7CisgICAgfQorICAgIHJldHVybiBjYXBzOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgQ0hFQ0tfTEUobVByb2ZpbGVMZXZlbHMuc2l6ZSgpLCBJTlQzMl9NQVgpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUHJvZmlsZUxldmVscy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2ZpbGVMZXZlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Qcm9maWxlTGV2ZWxzLml0ZW1BdChpKS5tUHJvZmlsZSk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUHJvZmlsZUxldmVscy5pdGVtQXQoaSkubUxldmVsKTsKKyAgICB9CisgICAgQ0hFQ0tfTEUobUNvbG9yRm9ybWF0cy5zaXplKCksIElOVDMyX01BWCk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1Db2xvckZvcm1hdHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2xvckZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Db2xvckZvcm1hdHMuaXRlbUF0KGkpKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1GbGFncyk7CisgICAgbURldGFpbHMtPndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTWVkaWFDb2RlY0luZm86OmlzRW5jb2RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlzRW5jb2RlcjsKK30KKworYm9vbCBNZWRpYUNvZGVjSW5mbzo6aGFzUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtUXVpcmtzLnNpemUoKTsgaXgrKykgeworICAgICAgICBpZiAobVF1aXJrcy5pdGVtQXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3QgeworICAgIG1pbWVzLT5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgbWltZXMtPnB1c2hfYmFjayhtQ2Fwcy5rZXlBdChpeCkpOworICAgIH0KK30KKworY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4KK01lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3QgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIG1DYXBzLnZhbHVlQXQoaXgpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqTWVkaWFDb2RlY0luZm86OmdldENvZGVjTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5hbWUuY19zdHIoKTsKK30KKworLy8gc3RhdGljCitzcDxNZWRpYUNvZGVjSW5mbz4gTWVkaWFDb2RlY0luZm86OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICBBU3RyaW5nIG5hbWUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihwYXJjZWwucmVhZEludDMyKCkpOworICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGlzRW5jb2RlciwgTlVMTCk7CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBxdWlyayA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgaW5mby0+bVF1aXJrcy5wdXNoX2JhY2socXVpcmspOworICAgICAgICB9CisgICAgfQorICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBzcDxDYXBhYmlsaXRpZXM+IGNhcHMgPSBDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1pbWUsIGNhcHMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmZvOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIG1OYW1lLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUlzRW5jb2Rlcik7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1RdWlya3Muc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1RdWlya3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVF1aXJrcy5pdGVtQXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIH0KKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUNhcHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYXBzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1DYXBzLmtleUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgbUNhcHMudmFsdWVBdChpKS0+d3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgeworICAgICAgICBpZiAobUNhcHMua2V5QXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK01lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbyhBU3RyaW5nIG5hbWUsIGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbWltZSkKKyAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgbUlzRW5jb2RlcihlbmNvZGVyKSwKKyAgICAgIG1IYXNTb2xlTWltZShmYWxzZSkgeworICAgIGlmIChtaW1lICE9IE5VTEwpIHsKKyAgICAgICAgYWRkTWltZShtaW1lKTsKKyAgICAgICAgbUhhc1NvbGVNaW1lID0gdHJ1ZTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNJbmZvOjphZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBpZiAobUhhc1NvbGVNaW1lKSB7CisgICAgICAgIEFMT0dFKCJDb2RlYyAnJXMnIGFscmVhZHkgaGFkIGl0cyB0eXBlIHNwZWNpZmllZCIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKKyAgICBpZiAoaXggPj0gMCkgeworICAgICAgICBtQ3VycmVudENhcHMgPSBtQ2Fwcy52YWx1ZUF0KGl4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ3VycmVudENhcHMgPSBuZXcgQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgIG1DYXBzLmFkZChBU3RyaW5nKG1pbWUpLCBtQ3VycmVudENhcHMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OnJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgICAgbUNhcHMucmVtb3ZlSXRlbXNBdChpeCk7CisgICAgICAgIC8vIG1DdXJyZW50Q2FwcyB3aWxsIGJlIHJlbW92ZWQgd2hlbiBjb21wbGV0ZWQKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNJbmZvOjppbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNvbnN0IENvZGVjQ2FwYWJpbGl0aWVzICZjYXBzKSB7CisgICAgbUN1cnJlbnRDYXBzLT5tUHJvZmlsZUxldmVscy5jbGVhcigpOworICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5jbGVhcigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZzcmMgPSBjYXBzLm1Qcm9maWxlTGV2ZWxzLml0ZW1BdChpKTsKKworICAgICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOworICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBzcmMubVByb2ZpbGU7CisgICAgICAgIHByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBzcmMubUxldmVsOworICAgICAgICBtQ3VycmVudENhcHMtPm1Qcm9maWxlTGV2ZWxzLnB1c2hfYmFjayhwcm9maWxlTGV2ZWwpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tQ29sb3JGb3JtYXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoX2JhY2soY2Fwcy5tQ29sb3JGb3JtYXRzLml0ZW1BdChpKSk7CisgICAgfQorCisgICAgbUN1cnJlbnRDYXBzLT5tRmxhZ3MgPSBjYXBzLm1GbGFnczsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRRdWlyayhjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaWYgKCFoYXNRdWlyayhuYW1lKSkgeworICAgICAgICBtUXVpcmtzLnB1c2gobmFtZSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpjb21wbGV0ZSgpIHsKKyAgICBtQ3VycmVudENhcHMgPSBOVUxMOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGREZXRhaWwoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBBU3RyaW5nICZ2YWx1ZSkgeworICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyhrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKSB7CisgICAgQVN0cmluZyB0YWcgPSAiZmVhdHVyZS0iOworICAgIHRhZy5hcHBlbmQoa2V5KTsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRJbnQzMih0YWcuY19zdHIoKSwgdmFsdWUpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBBU3RyaW5nIHRhZyA9ICJmZWF0dXJlLSI7CisgICAgdGFnLmFwcGVuZChrZXkpOworICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyh0YWcuY19zdHIoKSwgdmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCA4MzE5Y2Q3Li5lMmU2MDQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtNjksNiArNjksNyBAQAogICAgIHsiNDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzQ4MFB9LAogICAgIHsiNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzcyMFB9LAogICAgIHsiMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV8xMDgwUH0sCisgICAgeyIyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQfSwKICAgICB7InF2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9RVkdBfSwKIAogICAgIHsidGltZWxhcHNlbG93IiwgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XfSwKQEAgLTc4LDExICs3OSwyNSBAQAogICAgIHsidGltZWxhcHNlNDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNDgwUH0sCiAgICAgeyJ0aW1lbGFwc2U3MjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV83MjBQfSwKICAgICB7InRpbWVsYXBzZTEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUH0sCisgICAgeyJ0aW1lbGFwc2UyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMjE2MFB9LAogICAgIHsidGltZWxhcHNlcXZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUVZHQX0sCisKKyAgICB7ImhpZ2hzcGVlZGxvdyIsICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xPV30sCisgICAgeyJoaWdoc3BlZWRoaWdoIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9ISUdIfSwKKyAgICB7ImhpZ2hzcGVlZDQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzQ4MFB9LAorICAgIHsiaGlnaHNwZWVkNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUH0sCisgICAgeyJoaWdoc3BlZWQxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMTA4MFB9LAorICAgIHsiaGlnaHNwZWVkMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQfSwKIH07CiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRCBfX3VudXNlZAorI2Vsc2UKKyNkZWZpbmUgVU5VU0VECisjZW5kaWYKKwogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMmIGNvZGVjKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjJiBjb2RlYyBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvIGNvZGVjOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY29kZWMubUNvZGVjKTsKQEAgLTkzLDcgKzEwOCw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjJiBjb2RlYykKK01lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyYgY29kZWMgVU5VU0VEKQogewogICAgIEFMT0dWKCJhdWRpbyBjb2RlYzoiKTsKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNvZGVjLm1Db2RlYyk7CkBAIC0xMDMsNyArMTE4LDcgQEAKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VuY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwJiBjYXApCitNZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VuY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJ2aWRlbyBlbmNvZGVyIGNhcDoiKTsKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNhcC5tQ29kZWMpOwpAQCAtMTE0LDcgKzEyOSw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gZW5jb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKQEAgLTEyNCwyMSArMTM5LDIxIEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gZGVjb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0RlY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwJiBjYXApCitNZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0RlY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJhdWRpbyBjb2RlYyBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VkaXRvckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0VkaXRvckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FZGl0b3JDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvZWRpdG9yIGNhcDoiKTsKICAgICBBTE9HVigibU1heElucHV0RnJhbWVXaWR0aCA9ICVkIiwgY2FwLm1NYXhJbnB1dEZyYW1lV2lkdGgpOwpAQCAtNDY2LDggKzQ4MSwxMyBAQAogICAgICAgICAgICBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9FTkQ7CiB9CiAKK3N0YXRpYyBib29sIGlzSGlnaFNwZWVkUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSB7CisgICAgcmV0dXJuIHF1YWxpdHkgPj0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX1NUQVJUICYmCisgICAgICAgICAgIHF1YWxpdHkgPD0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORDsKK30KKwogdm9pZCBNZWRpYVByb2ZpbGVzOjppbml0UmVxdWlyZWRQcm9maWxlUmVmcyhjb25zdCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKSB7Ci0gICAgQUxPR1YoIk51bWJlciBvZiBjYW1lcmEgaWRzOiAlZCIsIGNhbWVyYUlkcy5zaXplKCkpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgY2FtZXJhIGlkczogJXp1IiwgY2FtZXJhSWRzLnNpemUoKSk7CiAgICAgQ0hFQ0soY2FtZXJhSWRzLnNpemUoKSA+IDApOwogICAgIG1SZXF1aXJlZFByb2ZpbGVSZWZzID0gbmV3IFJlcXVpcmVkUHJvZmlsZXNbY2FtZXJhSWRzLnNpemUoKV07CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBjYW1lcmFJZHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CkBAIC01MTMsMTQgKzUzMywxNyBAQAogICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSByZWZRdWFsaXR5OwogICAgICAgICBWaWRlb0NvZGVjICpjb2RlYyA9IE5VTEw7CiAKLSAgICAgICAgLy8gQ2hlY2sgaGlnaCBhbmQgbG93IGZyb20gZWl0aGVyIGNhbWNvcmRlciBwcm9maWxlIG9yIHRpbWVsYXBzZSBwcm9maWxlCi0gICAgICAgIC8vIGJ1dCBub3QgYm90aC4gRGVmYXVsdCwgY2hlY2sgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgICAgLy8gQ2hlY2sgaGlnaCBhbmQgbG93IGZyb20gZWl0aGVyIGNhbWNvcmRlciBwcm9maWxlLCB0aW1lbGFwc2UgcHJvZmlsZQorICAgICAgICAvLyBvciBoaWdoIHNwZWVkIHByb2ZpbGUsIGJ1dCBub3QgYWxsIG9mIHRoZW0uIERlZmF1bHQsIGNoZWNrIGNhbWNvcmRlciBwcm9maWxlCiAgICAgICAgIHNpemVfdCBqID0gMDsKICAgICAgICAgc2l6ZV90IG8gPSAyOwogICAgICAgICBpZiAoaXNUaW1lbGFwc2VQcm9maWxlKHF1YWxpdHkpKSB7CiAgICAgICAgICAgICAvLyBDaGVjayB0aW1lbGFwc2UgcHJvZmlsZSBpbnN0ZWFkLgogICAgICAgICAgICAgaiA9IDI7CiAgICAgICAgICAgICBvID0ga051bVJlcXVpcmVkUHJvZmlsZXM7CisgICAgICAgIH0gZWxzZSBpZiAoaXNIaWdoU3BlZWRQcm9maWxlKHF1YWxpdHkpKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBjaGVjayBmb3IgaGlnaCBzcGVlZCBwcm9maWxlLgorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBNdXN0IGJlIGNhbWNvcmRlciBwcm9maWxlLgogICAgICAgICAgICAgQ0hFQ0soaXNDYW1jb3JkZXJQcm9maWxlKHF1YWxpdHkpKTsKQEAgLTU5NCwxNCArNjE3LDE0IEBACiAKICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRDYW1jb3JkZXJQcm9maWxlSW5kZXgoY2FtZXJhSWQsIHByb2ZpbGUtPm1RdWFsaXR5KTsKICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlByb2ZpbGUgcXVhbGl0eSAlZCBmb3IgY2FtZXJhICVkIGFscmVhZHkgZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlByb2ZpbGUgcXVhbGl0eSAlZCBmb3IgY2FtZXJhICV6dSBhbHJlYWR5IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tUXVhbGl0eSwgY2FtZXJhSWQpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhpbmRleCA9PSByZWZJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IHByb2ZpbGUKLSAgICAgICAgICAgICAgICBBTE9HVigiQWRkIGEgcHJvZmlsZTogcXVhbGl0eSAlZD0+JWQgZm9yIGNhbWVyYSAlZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIkFkZCBhIHByb2ZpbGU6IHF1YWxpdHkgJWQ9PiVkIGZvciBjYW1lcmEgJXp1IiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlc1tpbmZvLT5tUmVmUHJvZmlsZUluZGV4XS0+bVF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tUXVhbGl0eSwgY2FtZXJhSWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAppbmRleCAyOGI1YWE3Li5kY2JiNzY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKQEAgLTIzNyw0ICsyMzcsMjQgQEAKICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfT0s7CiB9CiAKK01lZGlhQWxidW1BcnQgKk1lZGlhQWxidW1BcnQ6OmNsb25lKCkgeworICAgIHNpemVfdCBieXRlX3NpemUgPSB0aGlzLT5zaXplKCkgKyBzaXplb2YoTWVkaWFBbGJ1bUFydCk7CisgICAgTWVkaWFBbGJ1bUFydCAqcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxNZWRpYUFsYnVtQXJ0ICo+KG1hbGxvYyhieXRlX3NpemUpKTsKKyAgICByZXN1bHQtPm1TaXplID0gdGhpcy0+c2l6ZSgpOworICAgIG1lbWNweSgmcmVzdWx0LT5tRGF0YVswXSwgJnRoaXMtPm1EYXRhWzBdLCB0aGlzLT5zaXplKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTWVkaWFBbGJ1bUFydDo6aW5pdChNZWRpYUFsYnVtQXJ0ICppbnN0YW5jZSwgaW50MzJfdCBkYXRhU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSkgeworICAgIGluc3RhbmNlLT5tU2l6ZSA9IGRhdGFTaXplOworICAgIG1lbWNweSgmaW5zdGFuY2UtPm1EYXRhWzBdLCBkYXRhLCBkYXRhU2l6ZSk7Cit9CisKK01lZGlhQWxidW1BcnQgKk1lZGlhQWxidW1BcnQ6OmZyb21EYXRhKGludDMyX3QgZGF0YVNpemUsIGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgICBzaXplX3QgYnl0ZV9zaXplID0gc2l6ZW9mKE1lZGlhQWxidW1BcnQpICsgZGF0YVNpemU7CisgICAgTWVkaWFBbGJ1bUFydCAqcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxNZWRpYUFsYnVtQXJ0ICo+KG1hbGxvYyhieXRlX3NpemUpKTsKKyAgICBpbml0KHJlc3VsdCwgZGF0YVNpemUsIGRhdGEpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAppbmRleCA5M2E0YTRjLi45ZjgwM2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKQEAgLTE0LDIxNyArMTQsMzggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTY2FubmVyQ2xpZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFzY2FubmVyLmg+CiAKKyNpbmNsdWRlICJDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgiCiAjaW5jbHVkZSAiU3RyaW5nQXJyYXkuaCIKIAotI2luY2x1ZGUgImF1dG9kZXRlY3QuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3VzdHJpbmcuaCIKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1NZWRpYVNjYW5uZXJDbGllbnQ6Ok1lZGlhU2Nhbm5lckNsaWVudCgpCi0gICAgOiAgIG1OYW1lcyhOVUxMKSwKLSAgICAgICAgbVZhbHVlcyhOVUxMKSwKLSAgICAgICAgbUxvY2FsZUVuY29kaW5nKGtFbmNvZGluZ05vbmUpCi17CitNZWRpYVNjYW5uZXJDbGllbnQ6Ok1lZGlhU2Nhbm5lckNsaWVudCgpIHsKIH0KIAotTWVkaWFTY2FubmVyQ2xpZW50Ojp+TWVkaWFTY2FubmVyQ2xpZW50KCkKLXsKLSAgICBkZWxldGUgbU5hbWVzOwotICAgIGRlbGV0ZSBtVmFsdWVzOworTWVkaWFTY2FubmVyQ2xpZW50Ojp+TWVkaWFTY2FubmVyQ2xpZW50KCkgewogfQogCiB2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6c2V0TG9jYWxlKGNvbnN0IGNoYXIqIGxvY2FsZSkKIHsKLSAgICBpZiAoIWxvY2FsZSkgcmV0dXJuOwotCi0gICAgaWYgKCFzdHJuY21wKGxvY2FsZSwgImphIiwgMikpCi0gICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ1NoaWZ0SklTOwotICAgIGVsc2UgaWYgKCFzdHJuY21wKGxvY2FsZSwgImtvIiwgMikpCi0gICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0VVQ0tSOwotICAgIGVsc2UgaWYgKCFzdHJuY21wKGxvY2FsZSwgInpoIiwgMikpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAobG9jYWxlLCAiemhfQ04iKSkgewotICAgICAgICAgICAgLy8gc2ltcGxpZmllZCBjaGluZXNlIGZvciBtYWlubGFuZCBDaGluYQotICAgICAgICAgICAgbUxvY2FsZUVuY29kaW5nID0ga0VuY29kaW5nR0JLOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXNzdW1lIHRyYWRpdGlvbmFsIGZvciBub24tbWFpbmxhbmQgQ2hpbmVzZSBsb2NhbGVzIChUYWl3YW4sIEhvbmcgS29uZywgU2luZ2Fwb3JlKQotICAgICAgICAgICAgbUxvY2FsZUVuY29kaW5nID0ga0VuY29kaW5nQmlnNTsKLSAgICAgICAgfQotICAgIH0KKyAgICBtTG9jYWxlID0gbG9jYWxlOyAvLyBub3QgY3VycmVudGx5IHVzZWQKIH0KIAotdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmJlZ2luRmlsZSgpCi17Ci0gICAgbU5hbWVzID0gbmV3IFN0cmluZ0FycmF5OwotICAgIG1WYWx1ZXMgPSBuZXcgU3RyaW5nQXJyYXk7Cit2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6YmVnaW5GaWxlKCkgewogfQogCiBzdGF0dXNfdCBNZWRpYVNjYW5uZXJDbGllbnQ6OmFkZFN0cmluZ1RhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKIHsKLSAgICBpZiAobUxvY2FsZUVuY29kaW5nICE9IGtFbmNvZGluZ05vbmUpIHsKLSAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGNhY2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBhbGwgQVNDSUkuCi0gICAgICAgIC8vIGNhbGwgaGFuZGxlU3RyaW5nVGFnIGRpcmVjdGx5IGluc3RlYWQuCi0gICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB2YWx1ZSAod2hpY2ggc2hvdWxkIGJlIHV0ZjgpIGhhcyBhbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKLSAgICAgICAgYm9vbCBub25Bc2NpaSA9IGZhbHNlOwotICAgICAgICBjb25zdCBjaGFyKiBjaHAgPSB2YWx1ZTsKLSAgICAgICAgY2hhciBjaDsKLSAgICAgICAgd2hpbGUgKChjaCA9ICpjaHArKykpIHsKLSAgICAgICAgICAgIGlmIChjaCAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICBub25Bc2NpaSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobm9uQXNjaWkpIHsKLSAgICAgICAgICAgIC8vIHNhdmUgdGhlIHN0cmluZ3MgZm9yIGxhdGVyIHNvIHRoZXkgY2FuIGJlIHVzZWQgZm9yIG5hdGl2ZSBlbmNvZGluZyBkZXRlY3Rpb24KLSAgICAgICAgICAgIG1OYW1lcy0+cHVzaF9iYWNrKG5hbWUpOwotICAgICAgICAgICAgbVZhbHVlcy0+cHVzaF9iYWNrKHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIGZhbGwgdGhyb3VnaAotICAgIH0KLQotICAgIC8vIGF1dG9kZXRlY3Rpb24gaXMgbm90IG5lY2Vzc2FyeSwgc28gbm8gbmVlZCB0byBjYWNoZSB0aGUgdmFsdWVzCi0gICAgLy8gcGFzcyBkaXJlY3RseSB0byB0aGUgY2xpZW50IGluc3RlYWQKLSAgICByZXR1cm4gaGFuZGxlU3RyaW5nVGFnKG5hbWUsIHZhbHVlKTsKKyAgICBoYW5kbGVTdHJpbmdUYWcobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdGljIHVpbnQzMl90IHBvc3NpYmxlRW5jb2RpbmdzKGNvbnN0IGNoYXIqIHMpCi17Ci0gICAgdWludDMyX3QgcmVzdWx0ID0ga0VuY29kaW5nQWxsOwotICAgIC8vIGlmIHMgY29udGFpbnMgYSBuYXRpdmUgZW5jb2RpbmcsIHRoZW4gaXQgd2FzIG1pc3Rha2VubHkgZW5jb2RlZCBpbiB1dGY4IGFzIGlmIGl0IHdlcmUgbGF0aW4tMQotICAgIC8vIHNvIHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUgbGF0aW4tMSAtPiB1dGY4IGNvbnZlcnNpb24gdG8gZ2V0IHRoZSBuYXRpdmUgY2hhcnMgYmFjawotICAgIHVpbnQ4X3QgY2gxLCBjaDI7Ci0gICAgdWludDhfdCogY2hwID0gKHVpbnQ4X3QgKilzOwotCi0gICAgd2hpbGUgKChjaDEgPSAqY2hwKyspKSB7Ci0gICAgICAgIGlmIChjaDEgJiAweDgwKSB7Ci0gICAgICAgICAgICBjaDIgPSAqY2hwKys7Ci0gICAgICAgICAgICBjaDEgPSAoKGNoMSA8PCA2KSAmIDB4QzApIHwgKGNoMiAmIDB4M0YpOwotICAgICAgICAgICAgLy8gY2gxIGlzIG5vdyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcG90ZW50aWFsIG5hdGl2ZSBjaGFyCi0KLSAgICAgICAgICAgIGNoMiA9ICpjaHArKzsKLSAgICAgICAgICAgIGlmIChjaDIgJiAweDgwKQotICAgICAgICAgICAgICAgIGNoMiA9ICgoY2gyIDw8IDYpICYgMHhDMCkgfCAoKmNocCsrICYgMHgzRik7Ci0gICAgICAgICAgICAvLyBjaDIgaXMgbm93IHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgcG90ZW50aWFsIG5hdGl2ZSBjaGFyCi0gICAgICAgICAgICBpbnQgY2ggPSAoaW50KWNoMSA8PCA4IHwgKGludCljaDI7Ci0gICAgICAgICAgICByZXN1bHQgJj0gZmluZFBvc3NpYmxlRW5jb2RpbmdzKGNoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIEFTQ0lJIGNoYXJhY3Rlciwgd2hpY2ggY291bGQgYmUgYW55dGhpbmcKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6Y29udmVydFZhbHVlcyh1aW50MzJfdCBlbmNvZGluZykKLXsKLSAgICBjb25zdCBjaGFyKiBlbmMgPSBOVUxMOwotICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKLSAgICAgICAgY2FzZSBrRW5jb2RpbmdTaGlmdEpJUzoKLSAgICAgICAgICAgIGVuYyA9ICJzaGlmdC1qaXMiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nR0JLOgotICAgICAgICAgICAgZW5jID0gImdiayI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrRW5jb2RpbmdCaWc1OgotICAgICAgICAgICAgZW5jID0gIkJpZzUiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nRVVDS1I6Ci0gICAgICAgICAgICBlbmMgPSAiRVVDLUtSIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChlbmMpIHsKLSAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0KLSAgICAgICAgVUNvbnZlcnRlciAqY29udiA9IHVjbnZfb3BlbihlbmMsICZzdGF0dXMpOwotICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yICVzIiwgZW5jKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBVQ29udmVydGVyICp1dGY4Q29udiA9IHVjbnZfb3BlbigiVVRGLTgiLCAmc3RhdHVzKTsKLSAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciBVVEYtOCIpOwotICAgICAgICAgICAgdWNudl9jbG9zZShjb252KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZvciBlYWNoIHZhbHVlIHN0cmluZywgY29udmVydCBmcm9tIG5hdGl2ZSBlbmNvZGluZyB0byBVVEYtOAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OYW1lcy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIGZpcnN0IHdlIG5lZWQgdG8gdW50YW5nbGUgdGhlIHV0ZjggYW5kIGNvbnZlcnQgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgYnl0ZXMKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSByZWR1Y2luZyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIHdlIGNhbiBkbyB0aGlzIGluIHBsYWNlCi0gICAgICAgICAgICB1aW50OF90KiBzcmMgPSAodWludDhfdCAqKW1WYWx1ZXMtPmdldEVudHJ5KGkpOwotICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXNyYyk7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0ID0gc3JjOwotCi0gICAgICAgICAgICB1aW50OF90IHVjaDsKLSAgICAgICAgICAgIHdoaWxlICgodWNoID0gKnNyYysrKSkgewotICAgICAgICAgICAgICAgIGlmICh1Y2ggJiAweDgwKQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKCh1Y2ggPDwgNikgJiAweEMwKSB8ICgqc3JjKysgJiAweDNGKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSB1Y2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZGVzdCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIG5vdyBjb252ZXJ0IGZyb20gbmF0aXZlIGVuY29kaW5nIHRvIFVURi04Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBzb3VyY2UgPSBtVmFsdWVzLT5nZXRFbnRyeShpKTsKLSAgICAgICAgICAgIGludCB0YXJnZXRMZW5ndGggPSBsZW4gKiAzICsgMTsKLSAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciA9IG5ldyBjaGFyW3RhcmdldExlbmd0aF07Ci0gICAgICAgICAgICAvLyBkb24ndCBub3JtYWxseSBjaGVjayBmb3IgTlVMTCwgYnV0IGluIHRoaXMgY2FzZSB0YXJnZXRMZW5ndGggbWF5IGJlIGxhcmdlCi0gICAgICAgICAgICBpZiAoIWJ1ZmZlcikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNoYXIqIHRhcmdldCA9IGJ1ZmZlcjsKLQotICAgICAgICAgICAgdWNudl9jb252ZXJ0RXgodXRmOENvbnYsIGNvbnYsICZ0YXJnZXQsIHRhcmdldCArIHRhcmdldExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgJnNvdXJjZSwgKGNvbnN0IGNoYXIgKilkZXN0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCAmc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJ1Y252X2NvbnZlcnRFeCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBtVmFsdWVzLT5zZXRFbnRyeShpLCAiPz8/Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHplcm8gdGVybWluYXRlCi0gICAgICAgICAgICAgICAgKnRhcmdldCA9IDA7Ci0gICAgICAgICAgICAgICAgbVZhbHVlcy0+c2V0RW50cnkoaSwgYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgdWNudl9jbG9zZShjb252KTsKLSAgICAgICAgdWNudl9jbG9zZSh1dGY4Q29udik7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6ZW5kRmlsZSgpCi17Ci0gICAgaWYgKG1Mb2NhbGVFbmNvZGluZyAhPSBrRW5jb2RpbmdOb25lKSB7Ci0gICAgICAgIGludCBzaXplID0gbU5hbWVzLT5zaXplKCk7Ci0gICAgICAgIHVpbnQzMl90IGVuY29kaW5nID0ga0VuY29kaW5nQWxsOwotCi0gICAgICAgIC8vIGNvbXB1dGUgYSBiaXQgbWFzayBjb250YWluaW5nIGFsbCBwb3NzaWJsZSBlbmNvZGluZ3MKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmFtZXMtPnNpemUoKTsgaSsrKQotICAgICAgICAgICAgZW5jb2RpbmcgJj0gcG9zc2libGVFbmNvZGluZ3MobVZhbHVlcy0+Z2V0RW50cnkoaSkpOwotCi0gICAgICAgIC8vIGlmIHRoZSBsb2NhbGUgZW5jb2RpbmcgbWF0Y2hlcywgdGhlbiBhc3N1bWUgd2UgaGF2ZSBhIG5hdGl2ZSBlbmNvZGluZy4KLSAgICAgICAgaWYgKGVuY29kaW5nICYgbUxvY2FsZUVuY29kaW5nKQotICAgICAgICAgICAgY29udmVydFZhbHVlcyhtTG9jYWxlRW5jb2RpbmcpOwotCi0gICAgICAgIC8vIGZpbmFsbHksIHB1c2ggYWxsIG5hbWUvdmFsdWUgcGFpcnMgdG8gdGhlIGNsaWVudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OYW1lcy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbmRsZVN0cmluZ1RhZyhtTmFtZXMtPmdldEVudHJ5KGkpLCBtVmFsdWVzLT5nZXRFbnRyeShpKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gZWxzZSBhZGRTdHJpbmdUYWcoKSBoYXMgZG9uZSBhbGwgdGhlIHdvcmsgc28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvCi0KLSAgICBkZWxldGUgbU5hbWVzOwotICAgIGRlbGV0ZSBtVmFsdWVzOwotICAgIG1OYW1lcyA9IE5VTEw7Ci0gICAgbVZhbHVlcyA9IE5VTEw7Cit2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6ZW5kRmlsZSgpIHsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKaW5kZXggZjAwNGNhNC4uNjZmNzE2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwIGIvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcAppbmRleCAyMmU5ZmFkLi5kMmUzODFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAKQEAgLTE2LDE0ICsxNiwxOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlNvdW5kUG9vbCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2RlZmluZSBVU0VfU0hBUkVEX01FTV9CVUZGRVIKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvU291bmRQb29sLmg+CiAjaW5jbHVkZSAiU291bmRQb29sVGhyZWFkLmgiCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQKIHsKQEAgLTM1LDEwICs0MCwxMCBAQAogc2l6ZV90IGtEZWZhdWx0SGVhcFNpemUgPSAxMDI0ICogMTAyNDsgLy8gMU1CCiAKIAotU291bmRQb29sOjpTb3VuZFBvb2woaW50IG1heENoYW5uZWxzLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGludCBzcmNRdWFsaXR5KQorU291bmRQb29sOjpTb3VuZFBvb2woaW50IG1heENoYW5uZWxzLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogewotICAgIEFMT0dWKCJTb3VuZFBvb2wgY29uc3RydWN0b3I6IG1heENoYW5uZWxzPSVkLCBzdHJlYW1UeXBlPSVkLCBzcmNRdWFsaXR5PSVkIiwKLSAgICAgICAgICAgIG1heENoYW5uZWxzLCBzdHJlYW1UeXBlLCBzcmNRdWFsaXR5KTsKKyAgICBBTE9HVigiU291bmRQb29sIGNvbnN0cnVjdG9yOiBtYXhDaGFubmVscz0lZCwgYXR0ci51c2FnZT0lZCwgYXR0ci5mbGFncz0weCV4LCBhdHRyLnRhZ3M9JXMiLAorICAgICAgICAgICAgbWF4Q2hhbm5lbHMsIHBBdHRyaWJ1dGVzLT51c2FnZSwgcEF0dHJpYnV0ZXMtPmZsYWdzLCBwQXR0cmlidXRlcy0+dGFncyk7CiAKICAgICAvLyBjaGVjayBsaW1pdHMKICAgICBtTWF4Q2hhbm5lbHMgPSBtYXhDaGFubmVsczsKQEAgLTUyLDggKzU3LDcgQEAKIAogICAgIG1RdWl0ID0gZmFsc2U7CiAgICAgbURlY29kZVRocmVhZCA9IDA7Ci0gICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIG1TcmNRdWFsaXR5ID0gc3JjUXVhbGl0eTsKKyAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgIG1BbGxvY2F0ZWQgPSAwOwogICAgIG1OZXh0U2FtcGxlSUQgPSAwOwogICAgIG1OZXh0Q2hhbm5lbElEID0gMDsKQEAgLTE5OSw3ICsyMDMsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1pbnQgU291bmRQb29sOjpsb2FkKGNvbnN0IGNoYXIqIHBhdGgsIGludCBwcmlvcml0eSkKK2ludCBTb3VuZFBvb2w6OmxvYWQoY29uc3QgY2hhciogcGF0aCwgaW50IHByaW9yaXR5IF9fdW51c2VkKQogewogICAgIEFMT0dWKCJsb2FkOiBwYXRoPSVzLCBwcmlvcml0eT0lZCIsIHBhdGgsIHByaW9yaXR5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwpAQCAtMjA5LDkgKzIxMyw5IEBACiAgICAgcmV0dXJuIHNhbXBsZS0+c2FtcGxlSUQoKTsKIH0KIAotaW50IFNvdW5kUG9vbDo6bG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5KQoraW50IFNvdW5kUG9vbDo6bG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5IF9fdW51c2VkKQogewotICAgIEFMT0dWKCJsb2FkOiBmZD0lZCwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkLCBwcmlvcml0eT0lZCIsCisgICAgQUxPR1YoImxvYWQ6IGZkPSVkLCBvZmZzZXQ9JSIgUFJJZDY0ICIsIGxlbmd0aD0lIiBQUklkNjQgIiwgcHJpb3JpdHk9JWQiLAogICAgICAgICAgICAgZmQsIG9mZnNldCwgbGVuZ3RoLCBwcmlvcml0eSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJm1Mb2NrKTsKICAgICBzcDxTYW1wbGU+IHNhbXBsZSA9IG5ldyBTYW1wbGUoKyttTmV4dFNhbXBsZUlELCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwpAQCAtNDYxLDcgKzQ2NSw4IEBACiAgICAgbUZkID0gZHVwKGZkKTsKICAgICBtT2Zmc2V0ID0gb2Zmc2V0OwogICAgIG1MZW5ndGggPSBsZW5ndGg7Ci0gICAgQUxPR1YoImNyZWF0ZSBzYW1wbGVJRD0lZCwgZmQ9JWQsIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsIG1TYW1wbGVJRCwgbUZkLCBtTGVuZ3RoLCBtT2Zmc2V0KTsKKyAgICBBTE9HVigiY3JlYXRlIHNhbXBsZUlEPSVkLCBmZD0lZCwgb2Zmc2V0PSUiIFBSSWQ2NCAiIGxlbmd0aD0lIiBQUklkNjQsCisgICAgICAgIG1TYW1wbGVJRCwgbUZkLCBtTGVuZ3RoLCBtT2Zmc2V0KTsKIH0KIAogdm9pZCBTYW1wbGU6OmluaXQoKQpAQCAtNDk2LDcgKzUwMSwxNCBAQAogCiAgICAgQUxPR1YoIlN0YXJ0IGRlY29kZSIpOwogICAgIGlmIChtVXJsKSB7Ci0gICAgICAgIHN0YXR1cyA9IE1lZGlhUGxheWVyOjpkZWNvZGUobVVybCwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmZvcm1hdCwgbUhlYXAsICZtU2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IE1lZGlhUGxheWVyOjpkZWNvZGUoCisgICAgICAgICAgICAgICAgTlVMTCAvKiBodHRwU2VydmljZSAqLywKKyAgICAgICAgICAgICAgICBtVXJsLAorICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAmZm9ybWF0LAorICAgICAgICAgICAgICAgIG1IZWFwLAorICAgICAgICAgICAgICAgICZtU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzID0gTWVkaWFQbGF5ZXI6OmRlY29kZShtRmQsIG1PZmZzZXQsIG1MZW5ndGgsICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMsICZmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYXAsICZtU2l6ZSk7CkBAIC01MDgsNyArNTIwLDcgQEAKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2FkIHNhbXBsZTogJXMiLCBtVXJsKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9Ci0gICAgQUxPR1YoInBvaW50ZXIgPSAlcCwgc2l6ZSA9ICV1LCBzYW1wbGVSYXRlID0gJXUsIG51bUNoYW5uZWxzID0gJWQiLAorICAgIEFMT0dWKCJwb2ludGVyID0gJXAsIHNpemUgPSAlenUsIHNhbXBsZVJhdGUgPSAldSwgbnVtQ2hhbm5lbHMgPSAlZCIsCiAgICAgICAgICAgbUhlYXAtPmdldEJhc2UoKSwgbVNpemUsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKIAogICAgIGlmIChzYW1wbGVSYXRlID4ga01heFNhbXBsZVJhdGUpIHsKQEAgLTU2OCw3ICs1ODAsNyBAQAogICAgICAgICAvLyBpbml0aWFsaXplIHRyYWNrCiAgICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7CiAgICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbVNvdW5kUG9vbC0+c3RyZWFtVHlwZSgpOworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKG1Tb3VuZFBvb2wtPmF0dHJpYnV0ZXMoKSk7CiAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgYWZGcmFtZUNvdW50ID0ga0RlZmF1bHRGcmFtZUNvdW50OwogICAgICAgICB9CkBAIC01NzksNyArNTkxLDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHVpbnQzMl90KGZsb2F0KHNhbXBsZS0+c2FtcGxlUmF0ZSgpKSAqIHJhdGUgKyAwLjUpOwogICAgICAgICB1aW50MzJfdCB0b3RhbEZyYW1lcyA9IChrRGVmYXVsdEJ1ZmZlckNvdW50ICogYWZGcmFtZUNvdW50ICogc2FtcGxlUmF0ZSkgLyBhZlNhbXBsZVJhdGU7CiAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckZyYW1lcyA9ICh0b3RhbEZyYW1lcyArIChrRGVmYXVsdEJ1ZmZlckNvdW50IC0gMSkpIC8ga0RlZmF1bHRCdWZmZXJDb3VudDsKLSAgICAgICAgdWludDMyX3QgZnJhbWVDb3VudCA9IDA7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMDsKIAogICAgICAgICBpZiAobG9vcCkgewogICAgICAgICAgICAgZnJhbWVDb3VudCA9IHNhbXBsZS0+c2l6ZSgpL251bUNoYW5uZWxzLwpAQCAtNjAwLDE2ICs2MTIsMTUgQEAKICAgICAgICAgLy8gd3JvbmcgYXVkaW8gYXVkaW8gYnVmZmVyIHNpemUgIChtQXVkaW9CdWZmZXJTaXplKQogICAgICAgICB1bnNpZ25lZCBsb25nIHRvZ2dsZSA9IG1Ub2dnbGUgXiAxOwogICAgICAgICB2b2lkICp1c2VyRGF0YSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXRoaXMgfCB0b2dnbGUpOwotICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IChudW1DaGFubmVscyA9PSAyKSA/Ci0gICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIDogQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobnVtQ2hhbm5lbHMpOwogCiAgICAgICAgIC8vIGRvIG5vdCBjcmVhdGUgYSBuZXcgYXVkaW8gdHJhY2sgaWYgY3VycmVudCB0cmFjayBpcyBjb21wYXRpYmxlIHdpdGggc2FtcGxlIHBhcmFtZXRlcnMKICNpZmRlZiBVU0VfU0hBUkVEX01FTV9CVUZGRVIKICAgICAgICAgbmV3VHJhY2sgPSBuZXcgQXVkaW9UcmFjayhzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBzYW1wbGUtPmZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGNoYW5uZWxzLCBzYW1wbGUtPmdldElNZW1vcnkoKSwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgc2FtcGxlLT5nZXRJTWVtb3J5KCksIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsIGNhbGxiYWNrLCB1c2VyRGF0YSk7CiAjZWxzZQogICAgICAgICBuZXdUcmFjayA9IG5ldyBBdWRpb1RyYWNrKHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIHNhbXBsZS0+Zm9ybWF0KCksCi0gICAgICAgICAgICAgICAgY2hhbm5lbHMsIGZyYW1lQ291bnQsIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsIGNhbGxiYWNrLCB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhLAogICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lcyk7CiAjZW5kaWYKICAgICAgICAgb2xkVHJhY2sgPSBtQXVkaW9UcmFjazsKQEAgLTczMCw3ICs3NDEsOCBAQAogICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGItPnNpemU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1lbWNweShxLCBwLCBjb3VudCk7Ci0vLyAgICAgICAgICAgICAgQUxPR1YoImZpbGw6IHE9JXAsIHA9JXAsIG1Qb3M9JXUsIGItPnNpemU9JXUsIGNvdW50PSVkIiwgcSwgcCwgbVBvcywgYi0+c2l6ZSwgY291bnQpOworLy8gICAgICAgICAgICAgIEFMT0dWKCJmaWxsOiBxPSVwLCBwPSVwLCBtUG9zPSV1LCBiLT5zaXplPSV1LCBjb3VudD0lZCIsIHEsIHAsIG1Qb3MsIGItPnNpemUsCisvLyAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Qb3MgPCBtQXVkaW9CdWZmZXJTaXplKSB7CiAgICAgICAgICAgICAgICAgY291bnQgPSBtQXVkaW9CdWZmZXJTaXplIC0gbVBvczsKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBiLT5zaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IGFkZWYzYmUuLjYxYjZkMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIDAsICAgIC8vIG5vdGlmaWNhdGlvbkZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgIDAsICAgIC8vIHNoYXJlZEJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRDYW5DYWxsSmF2YSwKLSAgICAgICAgICAgICAgICAgICAgICAwLCAgICAvLyBzZXNzaW9uSWQKKyAgICAgICAgICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLKTsKIAogICAgIGlmIChtcEF1ZGlvVHJhY2stPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVjM2IyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYXV0b2RldGVjdC5oIgotCi1zdHJ1Y3QgQ2hhclJhbmdlIHsKLSAgICB1aW50MTZfdCBmaXJzdDsKLSAgICB1aW50MTZfdCBsYXN0OwotfTsKLQotI2RlZmluZSBBUlJBWV9TSVpFKHgpICAgKHNpemVvZih4KSAvIHNpemVvZigqeCkpCi0KLS8vIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDkzMi5UWFQKLXN0YXRpYyBjb25zdCBDaGFyUmFuZ2Uga1NoaWZ0SklTUmFuZ2VzW10gPSB7Ci0gICAgeyAweDgxNDAsIDB4ODE3RSB9LAotICAgIHsgMHg4MTgwLCAweDgxQUMgfSwKLSAgICB7IDB4ODFCOCwgMHg4MUJGIH0sCi0gICAgeyAweDgxQzgsIDB4ODFDRSB9LAotICAgIHsgMHg4MURBLCAweDgxRTggfSwKLSAgICB7IDB4ODFGMCwgMHg4MUY3IH0sCi0gICAgeyAweDgxRkMsIDB4ODFGQyB9LAotICAgIHsgMHg4MjRGLCAweDgyNTggfSwKLSAgICB7IDB4ODI2MCwgMHg4Mjc5IH0sCi0gICAgeyAweDgyODEsIDB4ODI5QSB9LAotICAgIHsgMHg4MjlGLCAweDgyRjEgfSwKLSAgICB7IDB4ODM0MCwgMHg4MzdFIH0sCi0gICAgeyAweDgzODAsIDB4ODM5NiB9LAotICAgIHsgMHg4MzlGLCAweDgzQjYgfSwKLSAgICB7IDB4ODNCRiwgMHg4M0Q2IH0sCi0gICAgeyAweDg0NDAsIDB4ODQ2MCB9LAotICAgIHsgMHg4NDcwLCAweDg0N0UgfSwKLSAgICB7IDB4ODQ4MCwgMHg4NDkxIH0sCi0gICAgeyAweDg0OUYsIDB4ODRCRSB9LAotICAgIHsgMHg4NzQwLCAweDg3NUQgfSwKLSAgICB7IDB4ODc1RiwgMHg4Nzc1IH0sCi0gICAgeyAweDg3N0UsIDB4ODc3RSB9LAotICAgIHsgMHg4NzgwLCAweDg3OUMgfSwKLSAgICB7IDB4ODg5RiwgMHg4OEZDIH0sCi0gICAgeyAweDg5NDAsIDB4ODk3RSB9LAotICAgIHsgMHg4OTgwLCAweDg5RkMgfSwKLSAgICB7IDB4OEE0MCwgMHg4QTdFIH0sCi0gICAgeyAweDhBODAsIDB4OEFGQyB9LAotICAgIHsgMHg4QjQwLCAweDhCN0UgfSwKLSAgICB7IDB4OEI4MCwgMHg4QkZDIH0sCi0gICAgeyAweDhDNDAsIDB4OEM3RSB9LAotICAgIHsgMHg4QzgwLCAweDhDRkMgfSwKLSAgICB7IDB4OEQ0MCwgMHg4RDdFIH0sCi0gICAgeyAweDhEODAsIDB4OERGQyB9LAotICAgIHsgMHg4RTQwLCAweDhFN0UgfSwKLSAgICB7IDB4OEU4MCwgMHg4RUZDIH0sCi0gICAgeyAweDhGNDAsIDB4OEY3RSB9LAotICAgIHsgMHg4RjgwLCAweDhGRkMgfSwKLSAgICB7IDB4OTA0MCwgMHg5MDdFIH0sCi0gICAgeyAweDkwODAsIDB4OTBGQyB9LAotICAgIHsgMHg5MTQwLCAweDkxN0UgfSwKLSAgICB7IDB4OTE4MCwgMHg5MUZDIH0sCi0gICAgeyAweDkyNDAsIDB4OTI3RSB9LAotICAgIHsgMHg5MjgwLCAweDkyRkMgfSwKLSAgICB7IDB4OTM0MCwgMHg5MzdFIH0sCi0gICAgeyAweDkzODAsIDB4OTNGQyB9LAotICAgIHsgMHg5NDQwLCAweDk0N0UgfSwKLSAgICB7IDB4OTQ4MCwgMHg5NEZDIH0sCi0gICAgeyAweDk1NDAsIDB4OTU3RSB9LAotICAgIHsgMHg5NTgwLCAweDk1RkMgfSwKLSAgICB7IDB4OTY0MCwgMHg5NjdFIH0sCi0gICAgeyAweDk2ODAsIDB4OTZGQyB9LAotICAgIHsgMHg5NzQwLCAweDk3N0UgfSwKLSAgICB7IDB4OTc4MCwgMHg5N0ZDIH0sCi0gICAgeyAweDk4NDAsIDB4OTg3MiB9LAotICAgIHsgMHg5ODlGLCAweDk4RkMgfSwKLSAgICB7IDB4OTk0MCwgMHg5OTdFIH0sCi0gICAgeyAweDk5ODAsIDB4OTlGQyB9LAotICAgIHsgMHg5QTQwLCAweDlBN0UgfSwKLSAgICB7IDB4OUE4MCwgMHg5QUZDIH0sCi0gICAgeyAweDlCNDAsIDB4OUI3RSB9LAotICAgIHsgMHg5QjgwLCAweDlCRkMgfSwKLSAgICB7IDB4OUM0MCwgMHg5QzdFIH0sCi0gICAgeyAweDlDODAsIDB4OUNGQyB9LAotICAgIHsgMHg5RDQwLCAweDlEN0UgfSwKLSAgICB7IDB4OUQ4MCwgMHg5REZDIH0sCi0gICAgeyAweDlFNDAsIDB4OUU3RSB9LAotICAgIHsgMHg5RTgwLCAweDlFRkMgfSwKLSAgICB7IDB4OUY0MCwgMHg5RjdFIH0sCi0gICAgeyAweDlGODAsIDB4OUZGQyB9LAotICAgIHsgMHhFMDQwLCAweEUwN0UgfSwKLSAgICB7IDB4RTA4MCwgMHhFMEZDIH0sCi0gICAgeyAweEUxNDAsIDB4RTE3RSB9LAotICAgIHsgMHhFMTgwLCAweEUxRkMgfSwKLSAgICB7IDB4RTI0MCwgMHhFMjdFIH0sCi0gICAgeyAweEUyODAsIDB4RTJGQyB9LAotICAgIHsgMHhFMzQwLCAweEUzN0UgfSwKLSAgICB7IDB4RTM4MCwgMHhFM0ZDIH0sCi0gICAgeyAweEU0NDAsIDB4RTQ3RSB9LAotICAgIHsgMHhFNDgwLCAweEU0RkMgfSwKLSAgICB7IDB4RTU0MCwgMHhFNTdFIH0sCi0gICAgeyAweEU1ODAsIDB4RTVGQyB9LAotICAgIHsgMHhFNjQwLCAweEU2N0UgfSwKLSAgICB7IDB4RTY4MCwgMHhFNkZDIH0sCi0gICAgeyAweEU3NDAsIDB4RTc3RSB9LAotICAgIHsgMHhFNzgwLCAweEU3RkMgfSwKLSAgICB7IDB4RTg0MCwgMHhFODdFIH0sCi0gICAgeyAweEU4ODAsIDB4RThGQyB9LAotICAgIHsgMHhFOTQwLCAweEU5N0UgfSwKLSAgICB7IDB4RTk4MCwgMHhFOUZDIH0sCi0gICAgeyAweEVBNDAsIDB4RUE3RSB9LAotICAgIHsgMHhFQTgwLCAweEVBQTQgfSwKLSAgICB7IDB4RUQ0MCwgMHhFRDdFIH0sCi0gICAgeyAweEVEODAsIDB4RURGQyB9LAotICAgIHsgMHhFRTQwLCAweEVFN0UgfSwKLSAgICB7IDB4RUU4MCwgMHhFRUVDIH0sCi0gICAgeyAweEVFRUYsIDB4RUVGQyB9LAotICAgIHsgMHhGQTQwLCAweEZBN0UgfSwKLSAgICB7IDB4RkE4MCwgMHhGQUZDIH0sCi0gICAgeyAweEZCNDAsIDB4RkI3RSB9LAotICAgIHsgMHhGQjgwLCAweEZCRkMgfSwKLSAgICB7IDB4RkM0MCwgMHhGQzRCIH0sCi19OwotCi0vLyBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5MzYuVFhUCi1zdGF0aWMgY29uc3QgQ2hhclJhbmdlIGtHQktSYW5nZXNbXSA9IHsKLSAgICB7IDB4ODE0MCwgMHg4MTdFIH0sCi0gICAgeyAweDgxODAsIDB4ODFGRSB9LAotICAgIHsgMHg4MjQwLCAweDgyN0UgfSwKLSAgICB7IDB4ODI4MCwgMHg4MkZFIH0sCi0gICAgeyAweDgzNDAsIDB4ODM3RSB9LAotICAgIHsgMHg4MzgwLCAweDgzRkUgfSwKLSAgICB7IDB4ODQ0MCwgMHg4NDdFIH0sCi0gICAgeyAweDg0ODAsIDB4ODRGRSB9LAotICAgIHsgMHg4NTQwLCAweDg1N0UgfSwKLSAgICB7IDB4ODU4MCwgMHg4NUZFIH0sCi0gICAgeyAweDg2NDAsIDB4ODY3RSB9LAotICAgIHsgMHg4NjgwLCAweDg2RkUgfSwKLSAgICB7IDB4ODc0MCwgMHg4NzdFIH0sCi0gICAgeyAweDg3ODAsIDB4ODdGRSB9LAotICAgIHsgMHg4ODQwLCAweDg4N0UgfSwKLSAgICB7IDB4ODg4MCwgMHg4OEZFIH0sCi0gICAgeyAweDg5NDAsIDB4ODk3RSB9LAotICAgIHsgMHg4OTgwLCAweDg5RkUgfSwKLSAgICB7IDB4OEE0MCwgMHg4QTdFIH0sCi0gICAgeyAweDhBODAsIDB4OEFGRSB9LAotICAgIHsgMHg4QjQwLCAweDhCN0UgfSwKLSAgICB7IDB4OEI4MCwgMHg4QkZFIH0sCi0gICAgeyAweDhDNDAsIDB4OEM3RSB9LAotICAgIHsgMHg4QzgwLCAweDhDRkUgfSwKLSAgICB7IDB4OEQ0MCwgMHg4RDdFIH0sCi0gICAgeyAweDhEODAsIDB4OERGRSB9LAotICAgIHsgMHg4RTQwLCAweDhFN0UgfSwKLSAgICB7IDB4OEU4MCwgMHg4RUZFIH0sCi0gICAgeyAweDhGNDAsIDB4OEY3RSB9LAotICAgIHsgMHg4RjgwLCAweDhGRkUgfSwKLSAgICB7IDB4OTA0MCwgMHg5MDdFIH0sCi0gICAgeyAweDkwODAsIDB4OTBGRSB9LAotICAgIHsgMHg5MTQwLCAweDkxN0UgfSwKLSAgICB7IDB4OTE4MCwgMHg5MUZFIH0sCi0gICAgeyAweDkyNDAsIDB4OTI3RSB9LAotICAgIHsgMHg5MjgwLCAweDkyRkUgfSwKLSAgICB7IDB4OTM0MCwgMHg5MzdFIH0sCi0gICAgeyAweDkzODAsIDB4OTNGRSB9LAotICAgIHsgMHg5NDQwLCAweDk0N0UgfSwKLSAgICB7IDB4OTQ4MCwgMHg5NEZFIH0sCi0gICAgeyAweDk1NDAsIDB4OTU3RSB9LAotICAgIHsgMHg5NTgwLCAweDk1RkUgfSwKLSAgICB7IDB4OTY0MCwgMHg5NjdFIH0sCi0gICAgeyAweDk2ODAsIDB4OTZGRSB9LAotICAgIHsgMHg5NzQwLCAweDk3N0UgfSwKLSAgICB7IDB4OTc4MCwgMHg5N0ZFIH0sCi0gICAgeyAweDk4NDAsIDB4OTg3RSB9LAotICAgIHsgMHg5ODgwLCAweDk4RkUgfSwKLSAgICB7IDB4OTk0MCwgMHg5OTdFIH0sCi0gICAgeyAweDk5ODAsIDB4OTlGRSB9LAotICAgIHsgMHg5QTQwLCAweDlBN0UgfSwKLSAgICB7IDB4OUE4MCwgMHg5QUZFIH0sCi0gICAgeyAweDlCNDAsIDB4OUI3RSB9LAotICAgIHsgMHg5QjgwLCAweDlCRkUgfSwKLSAgICB7IDB4OUM0MCwgMHg5QzdFIH0sCi0gICAgeyAweDlDODAsIDB4OUNGRSB9LAotICAgIHsgMHg5RDQwLCAweDlEN0UgfSwKLSAgICB7IDB4OUQ4MCwgMHg5REZFIH0sCi0gICAgeyAweDlFNDAsIDB4OUU3RSB9LAotICAgIHsgMHg5RTgwLCAweDlFRkUgfSwKLSAgICB7IDB4OUY0MCwgMHg5RjdFIH0sCi0gICAgeyAweDlGODAsIDB4OUZGRSB9LAotICAgIHsgMHhBMDQwLCAweEEwN0UgfSwKLSAgICB7IDB4QTA4MCwgMHhBMEZFIH0sCi0gICAgeyAweEExQTEsIDB4QTFGRSB9LAotICAgIHsgMHhBMkExLCAweEEyQUEgfSwKLSAgICB7IDB4QTJCMSwgMHhBMkUyIH0sCi0gICAgeyAweEEyRTUsIDB4QTJFRSB9LAotICAgIHsgMHhBMkYxLCAweEEyRkMgfSwKLSAgICB7IDB4QTNBMSwgMHhBM0ZFIH0sCi0gICAgeyAweEE0QTEsIDB4QTRGMyB9LAotICAgIHsgMHhBNUExLCAweEE1RjYgfSwKLSAgICB7IDB4QTZBMSwgMHhBNkI4IH0sCi0gICAgeyAweEE2QzEsIDB4QTZEOCB9LAotICAgIHsgMHhBNkUwLCAweEE2RUIgfSwKLSAgICB7IDB4QTZFRSwgMHhBNkYyIH0sCi0gICAgeyAweEE2RjQsIDB4QTZGNSB9LAotICAgIHsgMHhBN0ExLCAweEE3QzEgfSwKLSAgICB7IDB4QTdEMSwgMHhBN0YxIH0sCi0gICAgeyAweEE4NDAsIDB4QTg3RSB9LAotICAgIHsgMHhBODgwLCAweEE4OTUgfSwKLSAgICB7IDB4QThBMSwgMHhBOEJCIH0sCi0gICAgeyAweEE4QkQsIDB4QThCRSB9LAotICAgIHsgMHhBOEMwLCAweEE4QzAgfSwKLSAgICB7IDB4QThDNSwgMHhBOEU5IH0sCi0gICAgeyAweEE5NDAsIDB4QTk1NyB9LAotICAgIHsgMHhBOTU5LCAweEE5NUEgfSwKLSAgICB7IDB4QTk1QywgMHhBOTVDIH0sCi0gICAgeyAweEE5NjAsIDB4QTk3RSB9LAotICAgIHsgMHhBOTgwLCAweEE5ODggfSwKLSAgICB7IDB4QTk5NiwgMHhBOTk2IH0sCi0gICAgeyAweEE5QTQsIDB4QTlFRiB9LAotICAgIHsgMHhBQTQwLCAweEFBN0UgfSwKLSAgICB7IDB4QUE4MCwgMHhBQUEwIH0sCi0gICAgeyAweEFCNDAsIDB4QUI3RSB9LAotICAgIHsgMHhBQjgwLCAweEFCQTAgfSwKLSAgICB7IDB4QUM0MCwgMHhBQzdFIH0sCi0gICAgeyAweEFDODAsIDB4QUNBMCB9LAotICAgIHsgMHhBRDQwLCAweEFEN0UgfSwKLSAgICB7IDB4QUQ4MCwgMHhBREEwIH0sCi0gICAgeyAweEFFNDAsIDB4QUU3RSB9LAotICAgIHsgMHhBRTgwLCAweEFFQTAgfSwKLSAgICB7IDB4QUY0MCwgMHhBRjdFIH0sCi0gICAgeyAweEFGODAsIDB4QUZBMCB9LAotICAgIHsgMHhCMDQwLCAweEIwN0UgfSwKLSAgICB7IDB4QjA4MCwgMHhCMEZFIH0sCi0gICAgeyAweEIxNDAsIDB4QjE3RSB9LAotICAgIHsgMHhCMTgwLCAweEIxRkUgfSwKLSAgICB7IDB4QjI0MCwgMHhCMjdFIH0sCi0gICAgeyAweEIyODAsIDB4QjJGRSB9LAotICAgIHsgMHhCMzQwLCAweEIzN0UgfSwKLSAgICB7IDB4QjM4MCwgMHhCM0ZFIH0sCi0gICAgeyAweEI0NDAsIDB4QjQ3RSB9LAotICAgIHsgMHhCNDgwLCAweEI0RkUgfSwKLSAgICB7IDB4QjU0MCwgMHhCNTdFIH0sCi0gICAgeyAweEI1ODAsIDB4QjVGRSB9LAotICAgIHsgMHhCNjQwLCAweEI2N0UgfSwKLSAgICB7IDB4QjY4MCwgMHhCNkZFIH0sCi0gICAgeyAweEI3NDAsIDB4Qjc3RSB9LAotICAgIHsgMHhCNzgwLCAweEI3RkUgfSwKLSAgICB7IDB4Qjg0MCwgMHhCODdFIH0sCi0gICAgeyAweEI4ODAsIDB4QjhGRSB9LAotICAgIHsgMHhCOTQwLCAweEI5N0UgfSwKLSAgICB7IDB4Qjk4MCwgMHhCOUZFIH0sCi0gICAgeyAweEJBNDAsIDB4QkE3RSB9LAotICAgIHsgMHhCQTgwLCAweEJBRkUgfSwKLSAgICB7IDB4QkI0MCwgMHhCQjdFIH0sCi0gICAgeyAweEJCODAsIDB4QkJGRSB9LAotICAgIHsgMHhCQzQwLCAweEJDN0UgfSwKLSAgICB7IDB4QkM4MCwgMHhCQ0ZFIH0sCi0gICAgeyAweEJENDAsIDB4QkQ3RSB9LAotICAgIHsgMHhCRDgwLCAweEJERkUgfSwKLSAgICB7IDB4QkU0MCwgMHhCRTdFIH0sCi0gICAgeyAweEJFODAsIDB4QkVGRSB9LAotICAgIHsgMHhCRjQwLCAweEJGN0UgfSwKLSAgICB7IDB4QkY4MCwgMHhCRkZFIH0sCi0gICAgeyAweEMwNDAsIDB4QzA3RSB9LAotICAgIHsgMHhDMDgwLCAweEMwRkUgfSwKLSAgICB7IDB4QzE0MCwgMHhDMTdFIH0sCi0gICAgeyAweEMxODAsIDB4QzFGRSB9LAotICAgIHsgMHhDMjQwLCAweEMyN0UgfSwKLSAgICB7IDB4QzI4MCwgMHhDMkZFIH0sCi0gICAgeyAweEMzNDAsIDB4QzM3RSB9LAotICAgIHsgMHhDMzgwLCAweEMzRkUgfSwKLSAgICB7IDB4QzQ0MCwgMHhDNDdFIH0sCi0gICAgeyAweEM0ODAsIDB4QzRGRSB9LAotICAgIHsgMHhDNTQwLCAweEM1N0UgfSwKLSAgICB7IDB4QzU4MCwgMHhDNUZFIH0sCi0gICAgeyAweEM2NDAsIDB4QzY3RSB9LAotICAgIHsgMHhDNjgwLCAweEM2RkUgfSwKLSAgICB7IDB4Qzc0MCwgMHhDNzdFIH0sCi0gICAgeyAweEM3ODAsIDB4QzdGRSB9LAotICAgIHsgMHhDODQwLCAweEM4N0UgfSwKLSAgICB7IDB4Qzg4MCwgMHhDOEZFIH0sCi0gICAgeyAweEM5NDAsIDB4Qzk3RSB9LAotICAgIHsgMHhDOTgwLCAweEM5RkUgfSwKLSAgICB7IDB4Q0E0MCwgMHhDQTdFIH0sCi0gICAgeyAweENBODAsIDB4Q0FGRSB9LAotICAgIHsgMHhDQjQwLCAweENCN0UgfSwKLSAgICB7IDB4Q0I4MCwgMHhDQkZFIH0sCi0gICAgeyAweENDNDAsIDB4Q0M3RSB9LAotICAgIHsgMHhDQzgwLCAweENDRkUgfSwKLSAgICB7IDB4Q0Q0MCwgMHhDRDdFIH0sCi0gICAgeyAweENEODAsIDB4Q0RGRSB9LAotICAgIHsgMHhDRTQwLCAweENFN0UgfSwKLSAgICB7IDB4Q0U4MCwgMHhDRUZFIH0sCi0gICAgeyAweENGNDAsIDB4Q0Y3RSB9LAotICAgIHsgMHhDRjgwLCAweENGRkUgfSwKLSAgICB7IDB4RDA0MCwgMHhEMDdFIH0sCi0gICAgeyAweEQwODAsIDB4RDBGRSB9LAotICAgIHsgMHhEMTQwLCAweEQxN0UgfSwKLSAgICB7IDB4RDE4MCwgMHhEMUZFIH0sCi0gICAgeyAweEQyNDAsIDB4RDI3RSB9LAotICAgIHsgMHhEMjgwLCAweEQyRkUgfSwKLSAgICB7IDB4RDM0MCwgMHhEMzdFIH0sCi0gICAgeyAweEQzODAsIDB4RDNGRSB9LAotICAgIHsgMHhENDQwLCAweEQ0N0UgfSwKLSAgICB7IDB4RDQ4MCwgMHhENEZFIH0sCi0gICAgeyAweEQ1NDAsIDB4RDU3RSB9LAotICAgIHsgMHhENTgwLCAweEQ1RkUgfSwKLSAgICB7IDB4RDY0MCwgMHhENjdFIH0sCi0gICAgeyAweEQ2ODAsIDB4RDZGRSB9LAotICAgIHsgMHhENzQwLCAweEQ3N0UgfSwKLSAgICB7IDB4RDc4MCwgMHhEN0Y5IH0sCi0gICAgeyAweEQ4NDAsIDB4RDg3RSB9LAotICAgIHsgMHhEODgwLCAweEQ4RkUgfSwKLSAgICB7IDB4RDk0MCwgMHhEOTdFIH0sCi0gICAgeyAweEQ5ODAsIDB4RDlGRSB9LAotICAgIHsgMHhEQTQwLCAweERBN0UgfSwKLSAgICB7IDB4REE4MCwgMHhEQUZFIH0sCi0gICAgeyAweERCNDAsIDB4REI3RSB9LAotICAgIHsgMHhEQjgwLCAweERCRkUgfSwKLSAgICB7IDB4REM0MCwgMHhEQzdFIH0sCi0gICAgeyAweERDODAsIDB4RENGRSB9LAotICAgIHsgMHhERDQwLCAweEREN0UgfSwKLSAgICB7IDB4REQ4MCwgMHhEREZFIH0sCi0gICAgeyAweERFNDAsIDB4REU3RSB9LAotICAgIHsgMHhERTgwLCAweERFRkUgfSwKLSAgICB7IDB4REY0MCwgMHhERjdFIH0sCi0gICAgeyAweERGODAsIDB4REZGRSB9LAotICAgIHsgMHhFMDQwLCAweEUwN0UgfSwKLSAgICB7IDB4RTA4MCwgMHhFMEZFIH0sCi0gICAgeyAweEUxNDAsIDB4RTE3RSB9LAotICAgIHsgMHhFMTgwLCAweEUxRkUgfSwKLSAgICB7IDB4RTI0MCwgMHhFMjdFIH0sCi0gICAgeyAweEUyODAsIDB4RTJGRSB9LAotICAgIHsgMHhFMzQwLCAweEUzN0UgfSwKLSAgICB7IDB4RTM4MCwgMHhFM0ZFIH0sCi0gICAgeyAweEU0NDAsIDB4RTQ3RSB9LAotICAgIHsgMHhFNDgwLCAweEU0RkUgfSwKLSAgICB7IDB4RTU0MCwgMHhFNTdFIH0sCi0gICAgeyAweEU1ODAsIDB4RTVGRSB9LAotICAgIHsgMHhFNjQwLCAweEU2N0UgfSwKLSAgICB7IDB4RTY4MCwgMHhFNkZFIH0sCi0gICAgeyAweEU3NDAsIDB4RTc3RSB9LAotICAgIHsgMHhFNzgwLCAweEU3RkUgfSwKLSAgICB7IDB4RTg0MCwgMHhFODdFIH0sCi0gICAgeyAweEU4ODAsIDB4RThGRSB9LAotICAgIHsgMHhFOTQwLCAweEU5N0UgfSwKLSAgICB7IDB4RTk4MCwgMHhFOUZFIH0sCi0gICAgeyAweEVBNDAsIDB4RUE3RSB9LAotICAgIHsgMHhFQTgwLCAweEVBRkUgfSwKLSAgICB7IDB4RUI0MCwgMHhFQjdFIH0sCi0gICAgeyAweEVCODAsIDB4RUJGRSB9LAotICAgIHsgMHhFQzQwLCAweEVDN0UgfSwKLSAgICB7IDB4RUM4MCwgMHhFQ0ZFIH0sCi0gICAgeyAweEVENDAsIDB4RUQ3RSB9LAotICAgIHsgMHhFRDgwLCAweEVERkUgfSwKLSAgICB7IDB4RUU0MCwgMHhFRTdFIH0sCi0gICAgeyAweEVFODAsIDB4RUVGRSB9LAotICAgIHsgMHhFRjQwLCAweEVGN0UgfSwKLSAgICB7IDB4RUY4MCwgMHhFRkZFIH0sCi0gICAgeyAweEYwNDAsIDB4RjA3RSB9LAotICAgIHsgMHhGMDgwLCAweEYwRkUgfSwKLSAgICB7IDB4RjE0MCwgMHhGMTdFIH0sCi0gICAgeyAweEYxODAsIDB4RjFGRSB9LAotICAgIHsgMHhGMjQwLCAweEYyN0UgfSwKLSAgICB7IDB4RjI4MCwgMHhGMkZFIH0sCi0gICAgeyAweEYzNDAsIDB4RjM3RSB9LAotICAgIHsgMHhGMzgwLCAweEYzRkUgfSwKLSAgICB7IDB4RjQ0MCwgMHhGNDdFIH0sCi0gICAgeyAweEY0ODAsIDB4RjRGRSB9LAotICAgIHsgMHhGNTQwLCAweEY1N0UgfSwKLSAgICB7IDB4RjU4MCwgMHhGNUZFIH0sCi0gICAgeyAweEY2NDAsIDB4RjY3RSB9LAotICAgIHsgMHhGNjgwLCAweEY2RkUgfSwKLSAgICB7IDB4Rjc0MCwgMHhGNzdFIH0sCi0gICAgeyAweEY3ODAsIDB4RjdGRSB9LAotICAgIHsgMHhGODQwLCAweEY4N0UgfSwKLSAgICB7IDB4Rjg4MCwgMHhGOEEwIH0sCi0gICAgeyAweEY5NDAsIDB4Rjk3RSB9LAotICAgIHsgMHhGOTgwLCAweEY5QTAgfSwKLSAgICB7IDB4RkE0MCwgMHhGQTdFIH0sCi0gICAgeyAweEZBODAsIDB4RkFBMCB9LAotICAgIHsgMHhGQjQwLCAweEZCN0UgfSwKLSAgICB7IDB4RkI4MCwgMHhGQkEwIH0sCi0gICAgeyAweEZDNDAsIDB4RkM3RSB9LAotICAgIHsgMHhGQzgwLCAweEZDQTAgfSwKLSAgICB7IDB4RkQ0MCwgMHhGRDdFIH0sCi0gICAgeyAweEZEODAsIDB4RkRBMCB9LAotICAgIHsgMHhGRTQwLCAweEZFNEYgfSwKLX07Ci0KLS8vIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDk0OS5UWFQKLXN0YXRpYyBjb25zdCBDaGFyUmFuZ2Uga0VVQ0tSUmFuZ2VzW10gPSB7Ci0gICAgeyAweDgxNDEsIDB4ODE1QSB9LAotICAgIHsgMHg4MTYxLCAweDgxN0EgfSwKLSAgICB7IDB4ODE4MSwgMHg4MUZFIH0sCi0gICAgeyAweDgyNDEsIDB4ODI1QSB9LAotICAgIHsgMHg4MjYxLCAweDgyN0EgfSwKLSAgICB7IDB4ODI4MSwgMHg4MkZFIH0sCi0gICAgeyAweDgzNDEsIDB4ODM1QSB9LAotICAgIHsgMHg4MzYxLCAweDgzN0EgfSwKLSAgICB7IDB4ODM4MSwgMHg4M0ZFIH0sCi0gICAgeyAweDg0NDEsIDB4ODQ1QSB9LAotICAgIHsgMHg4NDYxLCAweDg0N0EgfSwKLSAgICB7IDB4ODQ4MSwgMHg4NEZFIH0sCi0gICAgeyAweDg1NDEsIDB4ODU1QSB9LAotICAgIHsgMHg4NTYxLCAweDg1N0EgfSwKLSAgICB7IDB4ODU4MSwgMHg4NUZFIH0sCi0gICAgeyAweDg2NDEsIDB4ODY1QSB9LAotICAgIHsgMHg4NjYxLCAweDg2N0EgfSwKLSAgICB7IDB4ODY4MSwgMHg4NkZFIH0sCi0gICAgeyAweDg3NDEsIDB4ODc1QSB9LAotICAgIHsgMHg4NzYxLCAweDg3N0EgfSwKLSAgICB7IDB4ODc4MSwgMHg4N0ZFIH0sCi0gICAgeyAweDg4NDEsIDB4ODg1QSB9LAotICAgIHsgMHg4ODYxLCAweDg4N0EgfSwKLSAgICB7IDB4ODg4MSwgMHg4OEZFIH0sCi0gICAgeyAweDg5NDEsIDB4ODk1QSB9LAotICAgIHsgMHg4OTYxLCAweDg5N0EgfSwKLSAgICB7IDB4ODk4MSwgMHg4OUZFIH0sCi0gICAgeyAweDhBNDEsIDB4OEE1QSB9LAotICAgIHsgMHg4QTYxLCAweDhBN0EgfSwKLSAgICB7IDB4OEE4MSwgMHg4QUZFIH0sCi0gICAgeyAweDhCNDEsIDB4OEI1QSB9LAotICAgIHsgMHg4QjYxLCAweDhCN0EgfSwKLSAgICB7IDB4OEI4MSwgMHg4QkZFIH0sCi0gICAgeyAweDhDNDEsIDB4OEM1QSB9LAotICAgIHsgMHg4QzYxLCAweDhDN0EgfSwKLSAgICB7IDB4OEM4MSwgMHg4Q0ZFIH0sCi0gICAgeyAweDhENDEsIDB4OEQ1QSB9LAotICAgIHsgMHg4RDYxLCAweDhEN0EgfSwKLSAgICB7IDB4OEQ4MSwgMHg4REZFIH0sCi0gICAgeyAweDhFNDEsIDB4OEU1QSB9LAotICAgIHsgMHg4RTYxLCAweDhFN0EgfSwKLSAgICB7IDB4OEU4MSwgMHg4RUZFIH0sCi0gICAgeyAweDhGNDEsIDB4OEY1QSB9LAotICAgIHsgMHg4RjYxLCAweDhGN0EgfSwKLSAgICB7IDB4OEY4MSwgMHg4RkZFIH0sCi0gICAgeyAweDkwNDEsIDB4OTA1QSB9LAotICAgIHsgMHg5MDYxLCAweDkwN0EgfSwKLSAgICB7IDB4OTA4MSwgMHg5MEZFIH0sCi0gICAgeyAweDkxNDEsIDB4OTE1QSB9LAotICAgIHsgMHg5MTYxLCAweDkxN0EgfSwKLSAgICB7IDB4OTE4MSwgMHg5MUZFIH0sCi0gICAgeyAweDkyNDEsIDB4OTI1QSB9LAotICAgIHsgMHg5MjYxLCAweDkyN0EgfSwKLSAgICB7IDB4OTI4MSwgMHg5MkZFIH0sCi0gICAgeyAweDkzNDEsIDB4OTM1QSB9LAotICAgIHsgMHg5MzYxLCAweDkzN0EgfSwKLSAgICB7IDB4OTM4MSwgMHg5M0ZFIH0sCi0gICAgeyAweDk0NDEsIDB4OTQ1QSB9LAotICAgIHsgMHg5NDYxLCAweDk0N0EgfSwKLSAgICB7IDB4OTQ4MSwgMHg5NEZFIH0sCi0gICAgeyAweDk1NDEsIDB4OTU1QSB9LAotICAgIHsgMHg5NTYxLCAweDk1N0EgfSwKLSAgICB7IDB4OTU4MSwgMHg5NUZFIH0sCi0gICAgeyAweDk2NDEsIDB4OTY1QSB9LAotICAgIHsgMHg5NjYxLCAweDk2N0EgfSwKLSAgICB7IDB4OTY4MSwgMHg5NkZFIH0sCi0gICAgeyAweDk3NDEsIDB4OTc1QSB9LAotICAgIHsgMHg5NzYxLCAweDk3N0EgfSwKLSAgICB7IDB4OTc4MSwgMHg5N0ZFIH0sCi0gICAgeyAweDk4NDEsIDB4OTg1QSB9LAotICAgIHsgMHg5ODYxLCAweDk4N0EgfSwKLSAgICB7IDB4OTg4MSwgMHg5OEZFIH0sCi0gICAgeyAweDk5NDEsIDB4OTk1QSB9LAotICAgIHsgMHg5OTYxLCAweDk5N0EgfSwKLSAgICB7IDB4OTk4MSwgMHg5OUZFIH0sCi0gICAgeyAweDlBNDEsIDB4OUE1QSB9LAotICAgIHsgMHg5QTYxLCAweDlBN0EgfSwKLSAgICB7IDB4OUE4MSwgMHg5QUZFIH0sCi0gICAgeyAweDlCNDEsIDB4OUI1QSB9LAotICAgIHsgMHg5QjYxLCAweDlCN0EgfSwKLSAgICB7IDB4OUI4MSwgMHg5QkZFIH0sCi0gICAgeyAweDlDNDEsIDB4OUM1QSB9LAotICAgIHsgMHg5QzYxLCAweDlDN0EgfSwKLSAgICB7IDB4OUM4MSwgMHg5Q0ZFIH0sCi0gICAgeyAweDlENDEsIDB4OUQ1QSB9LAotICAgIHsgMHg5RDYxLCAweDlEN0EgfSwKLSAgICB7IDB4OUQ4MSwgMHg5REZFIH0sCi0gICAgeyAweDlFNDEsIDB4OUU1QSB9LAotICAgIHsgMHg5RTYxLCAweDlFN0EgfSwKLSAgICB7IDB4OUU4MSwgMHg5RUZFIH0sCi0gICAgeyAweDlGNDEsIDB4OUY1QSB9LAotICAgIHsgMHg5RjYxLCAweDlGN0EgfSwKLSAgICB7IDB4OUY4MSwgMHg5RkZFIH0sCi0gICAgeyAweEEwNDEsIDB4QTA1QSB9LAotICAgIHsgMHhBMDYxLCAweEEwN0EgfSwKLSAgICB7IDB4QTA4MSwgMHhBMEZFIH0sCi0gICAgeyAweEExNDEsIDB4QTE1QSB9LAotICAgIHsgMHhBMTYxLCAweEExN0EgfSwKLSAgICB7IDB4QTE4MSwgMHhBMUZFIH0sCi0gICAgeyAweEEyNDEsIDB4QTI1QSB9LAotICAgIHsgMHhBMjYxLCAweEEyN0EgfSwKLSAgICB7IDB4QTI4MSwgMHhBMkU3IH0sCi0gICAgeyAweEEzNDEsIDB4QTM1QSB9LAotICAgIHsgMHhBMzYxLCAweEEzN0EgfSwKLSAgICB7IDB4QTM4MSwgMHhBM0ZFIH0sCi0gICAgeyAweEE0NDEsIDB4QTQ1QSB9LAotICAgIHsgMHhBNDYxLCAweEE0N0EgfSwKLSAgICB7IDB4QTQ4MSwgMHhBNEZFIH0sCi0gICAgeyAweEE1NDEsIDB4QTU1QSB9LAotICAgIHsgMHhBNTYxLCAweEE1N0EgfSwKLSAgICB7IDB4QTU4MSwgMHhBNUFBIH0sCi0gICAgeyAweEE1QjAsIDB4QTVCOSB9LAotICAgIHsgMHhBNUMxLCAweEE1RDggfSwKLSAgICB7IDB4QTVFMSwgMHhBNUY4IH0sCi0gICAgeyAweEE2NDEsIDB4QTY1QSB9LAotICAgIHsgMHhBNjYxLCAweEE2N0EgfSwKLSAgICB7IDB4QTY4MSwgMHhBNkU0IH0sCi0gICAgeyAweEE3NDEsIDB4QTc1QSB9LAotICAgIHsgMHhBNzYxLCAweEE3N0EgfSwKLSAgICB7IDB4QTc4MSwgMHhBN0VGIH0sCi0gICAgeyAweEE4NDEsIDB4QTg1QSB9LAotICAgIHsgMHhBODYxLCAweEE4N0EgfSwKLSAgICB7IDB4QTg4MSwgMHhBOEE0IH0sCi0gICAgeyAweEE4QTYsIDB4QThBNiB9LAotICAgIHsgMHhBOEE4LCAweEE4QUYgfSwKLSAgICB7IDB4QThCMSwgMHhBOEZFIH0sCi0gICAgeyAweEE5NDEsIDB4QTk1QSB9LAotICAgIHsgMHhBOTYxLCAweEE5N0EgfSwKLSAgICB7IDB4QTk4MSwgMHhBOUZFIH0sCi0gICAgeyAweEFBNDEsIDB4QUE1QSB9LAotICAgIHsgMHhBQTYxLCAweEFBN0EgfSwKLSAgICB7IDB4QUE4MSwgMHhBQUYzIH0sCi0gICAgeyAweEFCNDEsIDB4QUI1QSB9LAotICAgIHsgMHhBQjYxLCAweEFCN0EgfSwKLSAgICB7IDB4QUI4MSwgMHhBQkY2IH0sCi0gICAgeyAweEFDNDEsIDB4QUM1QSB9LAotICAgIHsgMHhBQzYxLCAweEFDN0EgfSwKLSAgICB7IDB4QUM4MSwgMHhBQ0MxIH0sCi0gICAgeyAweEFDRDEsIDB4QUNGMSB9LAotICAgIHsgMHhBRDQxLCAweEFENUEgfSwKLSAgICB7IDB4QUQ2MSwgMHhBRDdBIH0sCi0gICAgeyAweEFEODEsIDB4QURBMCB9LAotICAgIHsgMHhBRTQxLCAweEFFNUEgfSwKLSAgICB7IDB4QUU2MSwgMHhBRTdBIH0sCi0gICAgeyAweEFFODEsIDB4QUVBMCB9LAotICAgIHsgMHhBRjQxLCAweEFGNUEgfSwKLSAgICB7IDB4QUY2MSwgMHhBRjdBIH0sCi0gICAgeyAweEFGODEsIDB4QUZBMCB9LAotICAgIHsgMHhCMDQxLCAweEIwNUEgfSwKLSAgICB7IDB4QjA2MSwgMHhCMDdBIH0sCi0gICAgeyAweEIwODEsIDB4QjBGRSB9LAotICAgIHsgMHhCMTQxLCAweEIxNUEgfSwKLSAgICB7IDB4QjE2MSwgMHhCMTdBIH0sCi0gICAgeyAweEIxODEsIDB4QjFGRSB9LAotICAgIHsgMHhCMjQxLCAweEIyNUEgfSwKLSAgICB7IDB4QjI2MSwgMHhCMjdBIH0sCi0gICAgeyAweEIyODEsIDB4QjJGRSB9LAotICAgIHsgMHhCMzQxLCAweEIzNUEgfSwKLSAgICB7IDB4QjM2MSwgMHhCMzdBIH0sCi0gICAgeyAweEIzODEsIDB4QjNGRSB9LAotICAgIHsgMHhCNDQxLCAweEI0NUEgfSwKLSAgICB7IDB4QjQ2MSwgMHhCNDdBIH0sCi0gICAgeyAweEI0ODEsIDB4QjRGRSB9LAotICAgIHsgMHhCNTQxLCAweEI1NUEgfSwKLSAgICB7IDB4QjU2MSwgMHhCNTdBIH0sCi0gICAgeyAweEI1ODEsIDB4QjVGRSB9LAotICAgIHsgMHhCNjQxLCAweEI2NUEgfSwKLSAgICB7IDB4QjY2MSwgMHhCNjdBIH0sCi0gICAgeyAweEI2ODEsIDB4QjZGRSB9LAotICAgIHsgMHhCNzQxLCAweEI3NUEgfSwKLSAgICB7IDB4Qjc2MSwgMHhCNzdBIH0sCi0gICAgeyAweEI3ODEsIDB4QjdGRSB9LAotICAgIHsgMHhCODQxLCAweEI4NUEgfSwKLSAgICB7IDB4Qjg2MSwgMHhCODdBIH0sCi0gICAgeyAweEI4ODEsIDB4QjhGRSB9LAotICAgIHsgMHhCOTQxLCAweEI5NUEgfSwKLSAgICB7IDB4Qjk2MSwgMHhCOTdBIH0sCi0gICAgeyAweEI5ODEsIDB4QjlGRSB9LAotICAgIHsgMHhCQTQxLCAweEJBNUEgfSwKLSAgICB7IDB4QkE2MSwgMHhCQTdBIH0sCi0gICAgeyAweEJBODEsIDB4QkFGRSB9LAotICAgIHsgMHhCQjQxLCAweEJCNUEgfSwKLSAgICB7IDB4QkI2MSwgMHhCQjdBIH0sCi0gICAgeyAweEJCODEsIDB4QkJGRSB9LAotICAgIHsgMHhCQzQxLCAweEJDNUEgfSwKLSAgICB7IDB4QkM2MSwgMHhCQzdBIH0sCi0gICAgeyAweEJDODEsIDB4QkNGRSB9LAotICAgIHsgMHhCRDQxLCAweEJENUEgfSwKLSAgICB7IDB4QkQ2MSwgMHhCRDdBIH0sCi0gICAgeyAweEJEODEsIDB4QkRGRSB9LAotICAgIHsgMHhCRTQxLCAweEJFNUEgfSwKLSAgICB7IDB4QkU2MSwgMHhCRTdBIH0sCi0gICAgeyAweEJFODEsIDB4QkVGRSB9LAotICAgIHsgMHhCRjQxLCAweEJGNUEgfSwKLSAgICB7IDB4QkY2MSwgMHhCRjdBIH0sCi0gICAgeyAweEJGODEsIDB4QkZGRSB9LAotICAgIHsgMHhDMDQxLCAweEMwNUEgfSwKLSAgICB7IDB4QzA2MSwgMHhDMDdBIH0sCi0gICAgeyAweEMwODEsIDB4QzBGRSB9LAotICAgIHsgMHhDMTQxLCAweEMxNUEgfSwKLSAgICB7IDB4QzE2MSwgMHhDMTdBIH0sCi0gICAgeyAweEMxODEsIDB4QzFGRSB9LAotICAgIHsgMHhDMjQxLCAweEMyNUEgfSwKLSAgICB7IDB4QzI2MSwgMHhDMjdBIH0sCi0gICAgeyAweEMyODEsIDB4QzJGRSB9LAotICAgIHsgMHhDMzQxLCAweEMzNUEgfSwKLSAgICB7IDB4QzM2MSwgMHhDMzdBIH0sCi0gICAgeyAweEMzODEsIDB4QzNGRSB9LAotICAgIHsgMHhDNDQxLCAweEM0NUEgfSwKLSAgICB7IDB4QzQ2MSwgMHhDNDdBIH0sCi0gICAgeyAweEM0ODEsIDB4QzRGRSB9LAotICAgIHsgMHhDNTQxLCAweEM1NUEgfSwKLSAgICB7IDB4QzU2MSwgMHhDNTdBIH0sCi0gICAgeyAweEM1ODEsIDB4QzVGRSB9LAotICAgIHsgMHhDNjQxLCAweEM2NTIgfSwKLSAgICB7IDB4QzZBMSwgMHhDNkZFIH0sCi0gICAgeyAweEM3QTEsIDB4QzdGRSB9LAotICAgIHsgMHhDOEExLCAweEM4RkUgfSwKLSAgICB7IDB4Q0FBMSwgMHhDQUZFIH0sCi0gICAgeyAweENCQTEsIDB4Q0JGRSB9LAotICAgIHsgMHhDQ0ExLCAweENDRkUgfSwKLSAgICB7IDB4Q0RBMSwgMHhDREZFIH0sCi0gICAgeyAweENFQTEsIDB4Q0VGRSB9LAotICAgIHsgMHhDRkExLCAweENGRkUgfSwKLSAgICB7IDB4RDBBMSwgMHhEMEZFIH0sCi0gICAgeyAweEQxQTEsIDB4RDFGRSB9LAotICAgIHsgMHhEMkExLCAweEQyRkUgfSwKLSAgICB7IDB4RDNBMSwgMHhEM0ZFIH0sCi0gICAgeyAweEQ0QTEsIDB4RDRGRSB9LAotICAgIHsgMHhENUExLCAweEQ1RkUgfSwKLSAgICB7IDB4RDZBMSwgMHhENkZFIH0sCi0gICAgeyAweEQ3QTEsIDB4RDdGRSB9LAotICAgIHsgMHhEOEExLCAweEQ4RkUgfSwKLSAgICB7IDB4RDlBMSwgMHhEOUZFIH0sCi0gICAgeyAweERBQTEsIDB4REFGRSB9LAotICAgIHsgMHhEQkExLCAweERCRkUgfSwKLSAgICB7IDB4RENBMSwgMHhEQ0ZFIH0sCi0gICAgeyAweEREQTEsIDB4RERGRSB9LAotICAgIHsgMHhERUExLCAweERFRkUgfSwKLSAgICB7IDB4REZBMSwgMHhERkZFIH0sCi0gICAgeyAweEUwQTEsIDB4RTBGRSB9LAotICAgIHsgMHhFMUExLCAweEUxRkUgfSwKLSAgICB7IDB4RTJBMSwgMHhFMkZFIH0sCi0gICAgeyAweEUzQTEsIDB4RTNGRSB9LAotICAgIHsgMHhFNEExLCAweEU0RkUgfSwKLSAgICB7IDB4RTVBMSwgMHhFNUZFIH0sCi0gICAgeyAweEU2QTEsIDB4RTZGRSB9LAotICAgIHsgMHhFN0ExLCAweEU3RkUgfSwKLSAgICB7IDB4RThBMSwgMHhFOEZFIH0sCi0gICAgeyAweEU5QTEsIDB4RTlGRSB9LAotICAgIHsgMHhFQUExLCAweEVBRkUgfSwKLSAgICB7IDB4RUJBMSwgMHhFQkZFIH0sCi0gICAgeyAweEVDQTEsIDB4RUNGRSB9LAotICAgIHsgMHhFREExLCAweEVERkUgfSwKLSAgICB7IDB4RUVBMSwgMHhFRUZFIH0sCi0gICAgeyAweEVGQTEsIDB4RUZGRSB9LAotICAgIHsgMHhGMEExLCAweEYwRkUgfSwKLSAgICB7IDB4RjFBMSwgMHhGMUZFIH0sCi0gICAgeyAweEYyQTEsIDB4RjJGRSB9LAotICAgIHsgMHhGM0ExLCAweEYzRkUgfSwKLSAgICB7IDB4RjRBMSwgMHhGNEZFIH0sCi0gICAgeyAweEY1QTEsIDB4RjVGRSB9LAotICAgIHsgMHhGNkExLCAweEY2RkUgfSwKLSAgICB7IDB4RjdBMSwgMHhGN0ZFIH0sCi0gICAgeyAweEY4QTEsIDB4RjhGRSB9LAotICAgIHsgMHhGOUExLCAweEY5RkUgfSwKLSAgICB7IDB4RkFBMSwgMHhGQUZFIH0sCi0gICAgeyAweEZCQTEsIDB4RkJGRSB9LAotICAgIHsgMHhGQ0ExLCAweEZDRkUgfSwKLSAgICB7IDB4RkRBMSwgMHhGREZFIH0sCi19OwotCi0vLyBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5NTAuVFhUCi1zdGF0aWMgY29uc3QgQ2hhclJhbmdlIGtCaWc1UmFuZ2VzW10gPSB7Ci0gICAgeyAweEExNDAsIDB4QTE3RSB9LAotICAgIHsgMHhBMUExLCAweEExRkUgfSwKLSAgICB7IDB4QTI0MCwgMHhBMjdFIH0sCi0gICAgeyAweEEyQTEsIDB4QTJGRSB9LAotICAgIHsgMHhBMzQwLCAweEEzN0UgfSwKLSAgICB7IDB4QTNBMSwgMHhBM0JGIH0sCi0gICAgeyAweEEzRTEsIDB4QTNFMSB9LAotICAgIHsgMHhBNDQwLCAweEE0N0UgfSwKLSAgICB7IDB4QTRBMSwgMHhBNEZFIH0sCi0gICAgeyAweEE1NDAsIDB4QTU3RSB9LAotICAgIHsgMHhBNUExLCAweEE1RkUgfSwKLSAgICB7IDB4QTY0MCwgMHhBNjdFIH0sCi0gICAgeyAweEE2QTEsIDB4QTZGRSB9LAotICAgIHsgMHhBNzQwLCAweEE3N0UgfSwKLSAgICB7IDB4QTdBMSwgMHhBN0ZFIH0sCi0gICAgeyAweEE4NDAsIDB4QTg3RSB9LAotICAgIHsgMHhBOEExLCAweEE4RkUgfSwKLSAgICB7IDB4QTk0MCwgMHhBOTdFIH0sCi0gICAgeyAweEE5QTEsIDB4QTlGRSB9LAotICAgIHsgMHhBQTQwLCAweEFBN0UgfSwKLSAgICB7IDB4QUFBMSwgMHhBQUZFIH0sCi0gICAgeyAweEFCNDAsIDB4QUI3RSB9LAotICAgIHsgMHhBQkExLCAweEFCRkUgfSwKLSAgICB7IDB4QUM0MCwgMHhBQzdFIH0sCi0gICAgeyAweEFDQTEsIDB4QUNGRSB9LAotICAgIHsgMHhBRDQwLCAweEFEN0UgfSwKLSAgICB7IDB4QURBMSwgMHhBREZFIH0sCi0gICAgeyAweEFFNDAsIDB4QUU3RSB9LAotICAgIHsgMHhBRUExLCAweEFFRkUgfSwKLSAgICB7IDB4QUY0MCwgMHhBRjdFIH0sCi0gICAgeyAweEFGQTEsIDB4QUZGRSB9LAotICAgIHsgMHhCMDQwLCAweEIwN0UgfSwKLSAgICB7IDB4QjBBMSwgMHhCMEZFIH0sCi0gICAgeyAweEIxNDAsIDB4QjE3RSB9LAotICAgIHsgMHhCMUExLCAweEIxRkUgfSwKLSAgICB7IDB4QjI0MCwgMHhCMjdFIH0sCi0gICAgeyAweEIyQTEsIDB4QjJGRSB9LAotICAgIHsgMHhCMzQwLCAweEIzN0UgfSwKLSAgICB7IDB4QjNBMSwgMHhCM0ZFIH0sCi0gICAgeyAweEI0NDAsIDB4QjQ3RSB9LAotICAgIHsgMHhCNEExLCAweEI0RkUgfSwKLSAgICB7IDB4QjU0MCwgMHhCNTdFIH0sCi0gICAgeyAweEI1QTEsIDB4QjVGRSB9LAotICAgIHsgMHhCNjQwLCAweEI2N0UgfSwKLSAgICB7IDB4QjZBMSwgMHhCNkZFIH0sCi0gICAgeyAweEI3NDAsIDB4Qjc3RSB9LAotICAgIHsgMHhCN0ExLCAweEI3RkUgfSwKLSAgICB7IDB4Qjg0MCwgMHhCODdFIH0sCi0gICAgeyAweEI4QTEsIDB4QjhGRSB9LAotICAgIHsgMHhCOTQwLCAweEI5N0UgfSwKLSAgICB7IDB4QjlBMSwgMHhCOUZFIH0sCi0gICAgeyAweEJBNDAsIDB4QkE3RSB9LAotICAgIHsgMHhCQUExLCAweEJBRkUgfSwKLSAgICB7IDB4QkI0MCwgMHhCQjdFIH0sCi0gICAgeyAweEJCQTEsIDB4QkJGRSB9LAotICAgIHsgMHhCQzQwLCAweEJDN0UgfSwKLSAgICB7IDB4QkNBMSwgMHhCQ0ZFIH0sCi0gICAgeyAweEJENDAsIDB4QkQ3RSB9LAotICAgIHsgMHhCREExLCAweEJERkUgfSwKLSAgICB7IDB4QkU0MCwgMHhCRTdFIH0sCi0gICAgeyAweEJFQTEsIDB4QkVGRSB9LAotICAgIHsgMHhCRjQwLCAweEJGN0UgfSwKLSAgICB7IDB4QkZBMSwgMHhCRkZFIH0sCi0gICAgeyAweEMwNDAsIDB4QzA3RSB9LAotICAgIHsgMHhDMEExLCAweEMwRkUgfSwKLSAgICB7IDB4QzE0MCwgMHhDMTdFIH0sCi0gICAgeyAweEMxQTEsIDB4QzFGRSB9LAotICAgIHsgMHhDMjQwLCAweEMyN0UgfSwKLSAgICB7IDB4QzJBMSwgMHhDMkZFIH0sCi0gICAgeyAweEMzNDAsIDB4QzM3RSB9LAotICAgIHsgMHhDM0ExLCAweEMzRkUgfSwKLSAgICB7IDB4QzQ0MCwgMHhDNDdFIH0sCi0gICAgeyAweEM0QTEsIDB4QzRGRSB9LAotICAgIHsgMHhDNTQwLCAweEM1N0UgfSwKLSAgICB7IDB4QzVBMSwgMHhDNUZFIH0sCi0gICAgeyAweEM2NDAsIDB4QzY3RSB9LAotICAgIHsgMHhDOTQwLCAweEM5N0UgfSwKLSAgICB7IDB4QzlBMSwgMHhDOUZFIH0sCi0gICAgeyAweENBNDAsIDB4Q0E3RSB9LAotICAgIHsgMHhDQUExLCAweENBRkUgfSwKLSAgICB7IDB4Q0I0MCwgMHhDQjdFIH0sCi0gICAgeyAweENCQTEsIDB4Q0JGRSB9LAotICAgIHsgMHhDQzQwLCAweENDN0UgfSwKLSAgICB7IDB4Q0NBMSwgMHhDQ0ZFIH0sCi0gICAgeyAweENENDAsIDB4Q0Q3RSB9LAotICAgIHsgMHhDREExLCAweENERkUgfSwKLSAgICB7IDB4Q0U0MCwgMHhDRTdFIH0sCi0gICAgeyAweENFQTEsIDB4Q0VGRSB9LAotICAgIHsgMHhDRjQwLCAweENGN0UgfSwKLSAgICB7IDB4Q0ZBMSwgMHhDRkZFIH0sCi0gICAgeyAweEQwNDAsIDB4RDA3RSB9LAotICAgIHsgMHhEMEExLCAweEQwRkUgfSwKLSAgICB7IDB4RDE0MCwgMHhEMTdFIH0sCi0gICAgeyAweEQxQTEsIDB4RDFGRSB9LAotICAgIHsgMHhEMjQwLCAweEQyN0UgfSwKLSAgICB7IDB4RDJBMSwgMHhEMkZFIH0sCi0gICAgeyAweEQzNDAsIDB4RDM3RSB9LAotICAgIHsgMHhEM0ExLCAweEQzRkUgfSwKLSAgICB7IDB4RDQ0MCwgMHhENDdFIH0sCi0gICAgeyAweEQ0QTEsIDB4RDRGRSB9LAotICAgIHsgMHhENTQwLCAweEQ1N0UgfSwKLSAgICB7IDB4RDVBMSwgMHhENUZFIH0sCi0gICAgeyAweEQ2NDAsIDB4RDY3RSB9LAotICAgIHsgMHhENkExLCAweEQ2RkUgfSwKLSAgICB7IDB4RDc0MCwgMHhENzdFIH0sCi0gICAgeyAweEQ3QTEsIDB4RDdGRSB9LAotICAgIHsgMHhEODQwLCAweEQ4N0UgfSwKLSAgICB7IDB4RDhBMSwgMHhEOEZFIH0sCi0gICAgeyAweEQ5NDAsIDB4RDk3RSB9LAotICAgIHsgMHhEOUExLCAweEQ5RkUgfSwKLSAgICB7IDB4REE0MCwgMHhEQTdFIH0sCi0gICAgeyAweERBQTEsIDB4REFGRSB9LAotICAgIHsgMHhEQjQwLCAweERCN0UgfSwKLSAgICB7IDB4REJBMSwgMHhEQkZFIH0sCi0gICAgeyAweERDNDAsIDB4REM3RSB9LAotICAgIHsgMHhEQ0ExLCAweERDRkUgfSwKLSAgICB7IDB4REQ0MCwgMHhERDdFIH0sCi0gICAgeyAweEREQTEsIDB4RERGRSB9LAotICAgIHsgMHhERTQwLCAweERFN0UgfSwKLSAgICB7IDB4REVBMSwgMHhERUZFIH0sCi0gICAgeyAweERGNDAsIDB4REY3RSB9LAotICAgIHsgMHhERkExLCAweERGRkUgfSwKLSAgICB7IDB4RTA0MCwgMHhFMDdFIH0sCi0gICAgeyAweEUwQTEsIDB4RTBGRSB9LAotICAgIHsgMHhFMTQwLCAweEUxN0UgfSwKLSAgICB7IDB4RTFBMSwgMHhFMUZFIH0sCi0gICAgeyAweEUyNDAsIDB4RTI3RSB9LAotICAgIHsgMHhFMkExLCAweEUyRkUgfSwKLSAgICB7IDB4RTM0MCwgMHhFMzdFIH0sCi0gICAgeyAweEUzQTEsIDB4RTNGRSB9LAotICAgIHsgMHhFNDQwLCAweEU0N0UgfSwKLSAgICB7IDB4RTRBMSwgMHhFNEZFIH0sCi0gICAgeyAweEU1NDAsIDB4RTU3RSB9LAotICAgIHsgMHhFNUExLCAweEU1RkUgfSwKLSAgICB7IDB4RTY0MCwgMHhFNjdFIH0sCi0gICAgeyAweEU2QTEsIDB4RTZGRSB9LAotICAgIHsgMHhFNzQwLCAweEU3N0UgfSwKLSAgICB7IDB4RTdBMSwgMHhFN0ZFIH0sCi0gICAgeyAweEU4NDAsIDB4RTg3RSB9LAotICAgIHsgMHhFOEExLCAweEU4RkUgfSwKLSAgICB7IDB4RTk0MCwgMHhFOTdFIH0sCi0gICAgeyAweEU5QTEsIDB4RTlGRSB9LAotICAgIHsgMHhFQTQwLCAweEVBN0UgfSwKLSAgICB7IDB4RUFBMSwgMHhFQUZFIH0sCi0gICAgeyAweEVCNDAsIDB4RUI3RSB9LAotICAgIHsgMHhFQkExLCAweEVCRkUgfSwKLSAgICB7IDB4RUM0MCwgMHhFQzdFIH0sCi0gICAgeyAweEVDQTEsIDB4RUNGRSB9LAotICAgIHsgMHhFRDQwLCAweEVEN0UgfSwKLSAgICB7IDB4RURBMSwgMHhFREZFIH0sCi0gICAgeyAweEVFNDAsIDB4RUU3RSB9LAotICAgIHsgMHhFRUExLCAweEVFRkUgfSwKLSAgICB7IDB4RUY0MCwgMHhFRjdFIH0sCi0gICAgeyAweEVGQTEsIDB4RUZGRSB9LAotICAgIHsgMHhGMDQwLCAweEYwN0UgfSwKLSAgICB7IDB4RjBBMSwgMHhGMEZFIH0sCi0gICAgeyAweEYxNDAsIDB4RjE3RSB9LAotICAgIHsgMHhGMUExLCAweEYxRkUgfSwKLSAgICB7IDB4RjI0MCwgMHhGMjdFIH0sCi0gICAgeyAweEYyQTEsIDB4RjJGRSB9LAotICAgIHsgMHhGMzQwLCAweEYzN0UgfSwKLSAgICB7IDB4RjNBMSwgMHhGM0ZFIH0sCi0gICAgeyAweEY0NDAsIDB4RjQ3RSB9LAotICAgIHsgMHhGNEExLCAweEY0RkUgfSwKLSAgICB7IDB4RjU0MCwgMHhGNTdFIH0sCi0gICAgeyAweEY1QTEsIDB4RjVGRSB9LAotICAgIHsgMHhGNjQwLCAweEY2N0UgfSwKLSAgICB7IDB4RjZBMSwgMHhGNkZFIH0sCi0gICAgeyAweEY3NDAsIDB4Rjc3RSB9LAotICAgIHsgMHhGN0ExLCAweEY3RkUgfSwKLSAgICB7IDB4Rjg0MCwgMHhGODdFIH0sCi0gICAgeyAweEY4QTEsIDB4RjhGRSB9LAotICAgIHsgMHhGOTQwLCAweEY5N0UgfSwKLSAgICB7IDB4RjlBMSwgMHhGOUZFIH0sCi19OwotCi1zdGF0aWMgYm9vbCBjaGFyTWF0Y2hlc0VuY29kaW5nKGludCBjaCwgY29uc3QgQ2hhclJhbmdlKiBlbmNvZGluZ1JhbmdlcywgaW50IHJhbmdlQ291bnQpIHsKLSAgICAvLyBVc2UgYmluYXJ5IHNlYXJjaCB0byBzZWUgaWYgdGhlIGNoYXJhY3RlciBpcyBjb250YWluZWQgaW4gdGhlIGVuY29kaW5nCi0gICAgaW50IGxvdyA9IDA7Ci0gICAgaW50IGhpZ2ggPSByYW5nZUNvdW50OwotCi0gICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHsKLSAgICAgICAgaW50IGkgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgICBjb25zdCBDaGFyUmFuZ2UqIHJhbmdlID0gJmVuY29kaW5nUmFuZ2VzW2ldOwotICAgICAgICBpZiAoY2ggPj0gcmFuZ2UtPmZpcnN0ICYmIGNoIDw9IHJhbmdlLT5sYXN0KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjaCA+IHJhbmdlLT5sYXN0KQotICAgICAgICAgICAgbG93ID0gaSArIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhpZ2ggPSBpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotZXh0ZXJuIHVpbnQzMl90IGZpbmRQb3NzaWJsZUVuY29kaW5ncyhpbnQgY2gpCi17Ci0gICAgLy8gQVNDSUkgbWF0Y2hlcyBldmVyeXRoaW5nCi0gICAgaWYgKGNoIDwgMjU2KSByZXR1cm4ga0VuY29kaW5nQWxsOwotCi0gICAgaW50IHJlc3VsdCA9IGtFbmNvZGluZ05vbmU7Ci0KLSAgICBpZiAoY2hhck1hdGNoZXNFbmNvZGluZyhjaCwga1NoaWZ0SklTUmFuZ2VzLCBBUlJBWV9TSVpFKGtTaGlmdEpJU1JhbmdlcykpKQotICAgICAgICByZXN1bHQgfD0ga0VuY29kaW5nU2hpZnRKSVM7Ci0gICAgaWYgKGNoYXJNYXRjaGVzRW5jb2RpbmcoY2gsIGtHQktSYW5nZXMsIEFSUkFZX1NJWkUoa0dCS1JhbmdlcykpKQotICAgICAgICByZXN1bHQgfD0ga0VuY29kaW5nR0JLOwotICAgIGlmIChjaGFyTWF0Y2hlc0VuY29kaW5nKGNoLCBrQmlnNVJhbmdlcywgQVJSQVlfU0laRShrQmlnNVJhbmdlcykpKQotICAgICAgICByZXN1bHQgfD0ga0VuY29kaW5nQmlnNTsKLSAgICBpZiAoY2hhck1hdGNoZXNFbmNvZGluZyhjaCwga0VVQ0tSUmFuZ2VzLCBBUlJBWV9TSVpFKGtFVUNLUlJhbmdlcykpKQotICAgICAgICByZXN1bHQgfD0ga0VuY29kaW5nRVVDS1I7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5oIGIvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njc1ZGIzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFVVE9ERVRFQ1RfSAotI2RlZmluZSBBVVRPREVURUNUX0gKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLS8vIGZsYWdzIHVzZWQgZm9yIG5hdGl2ZSBlbmNvZGluZyBkZXRlY3Rpb24KLWVudW0gewotICAgIGtFbmNvZGluZ05vbmUgICAgICAgICAgICAgICA9IDAsCi0gICAga0VuY29kaW5nU2hpZnRKSVMgICAgICAgICAgID0gKDEgPDwgMCksCi0gICAga0VuY29kaW5nR0JLICAgICAgICAgICAgICAgID0gKDEgPDwgMSksCi0gICAga0VuY29kaW5nQmlnNSAgICAgICAgICAgICAgID0gKDEgPDwgMiksCi0gICAga0VuY29kaW5nRVVDS1IgICAgICAgICAgICAgID0gKDEgPDwgMyksCi0KLSAgICBrRW5jb2RpbmdBbGwgICAgICAgICAgICAgICAgPSAoa0VuY29kaW5nU2hpZnRKSVMgfCBrRW5jb2RpbmdHQksgfCBrRW5jb2RpbmdCaWc1IHwga0VuY29kaW5nRVVDS1IpLAotfTsKLQotCi0vLyByZXR1cm5zIGEgYml0ZmllbGQgY29udGFpbmluZyB0aGUgcG9zc2libGUgbmF0aXZlIGVuY29kaW5ncyBmb3IgdGhlIGdpdmVuIGNoYXJhY3RlcgotZXh0ZXJuIHVpbnQzMl90IGZpbmRQb3NzaWJsZUVuY29kaW5ncyhpbnQgY2gpOwotCi0jZW5kaWYgLy8gQVVUT0RFVEVDVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCmluZGV4IDExMGI5NGMuLjM5YTIzOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCkBAIC0xOCw5ICsxOCwxMiBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYU1ldGFkYXRhUmV0cmlldmVyIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KQEAgLTkzLDcgKzk2LDkgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMDYsMTIgKzExMSwxMiBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAgICAgQUxPR1YoImRhdGEgc291cmNlICglcykiLCBzcmNVcmwpOwotICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHNyY1VybCwgaGVhZGVycyk7CisgICAgcmV0dXJuIG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHNyY1VybCwgaGVhZGVycyk7CiB9CiAKIHN0YXR1c190IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVJldHJpZXZlciA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CkBAIC0xMjYsNyArMTMxLDcgQEAKIAogc3A8SU1lbW9yeT4gTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pCiB7Ci0gICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCVsbGQgdXMpIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1SZXRyaWV2ZXIgPT0gMCkgewogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwpAQCAtMTU3LDcgKzE2Miw3IEBACiAgICAgcmV0dXJuIG1SZXRyaWV2ZXItPmV4dHJhY3RBbGJ1bUFydCgpOwogfQogCi12b2lkIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzU2VydmljZUxvY2spOwogICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNTZXJ2aWNlLmNsZWFyKCk7CiAgICAgQUxPR1coIk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgc2VydmVyIGRpZWQhIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggMGY2ZDg5Ny4uOTYxMWFjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtMTcsMTIgKzE3LDE0IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC00OCw2ICs1MCw3IEBACiAgICAgbUxpc3RlbmVyID0gTlVMTDsKICAgICBtQ29va2llID0gTlVMTDsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKICAgICBtQ3VycmVudFBvc2l0aW9uID0gLTE7CiAgICAgbVNlZWtQb3NpdGlvbiA9IC0xOwogICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfSURMRTsKQEAgLTU3LDggKzYwLDggQEAKICAgICBtTGVmdFZvbHVtZSA9IG1SaWdodFZvbHVtZSA9IDEuMDsKICAgICBtVmlkZW9XaWR0aCA9IG1WaWRlb0hlaWdodCA9IDA7CiAgICAgbUxvY2tUaHJlYWRJZCA9IDA7Ci0gICAgbUF1ZGlvU2Vzc2lvbklkID0gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvU2Vzc2lvbklkKCk7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQpOworICAgIG1BdWRpb1Nlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCk7CisgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBtU2VuZExldmVsID0gMDsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQgPSBmYWxzZTsKIH0KQEAgLTY2LDcgKzY5LDExIEBACiBNZWRpYVBsYXllcjo6fk1lZGlhUGxheWVyKCkKIHsKICAgICBBTE9HVigiZGVzdHJ1Y3RvciIpOwotICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkKTsKKyAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOworICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKKyAgICB9CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBkaXNjb25uZWN0KCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogfQpAQCAtMTM2LDYgKzE0Myw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVybCk7CkBAIC0xNDUsNyArMTUzLDcgQEAKICAgICAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewogICAgICAgICAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIoc2VydmljZS0+Y3JlYXRlKHRoaXMsIG1BdWRpb1Nlc3Npb25JZCkpOwogICAgICAgICAgICAgaWYgKChOT19FUlJPUiAhPSBkb1NldFJldHJhbnNtaXRFbmRwb2ludChwbGF5ZXIpKSB8fAotICAgICAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKSkpIHsKKyAgICAgICAgICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpKSkgewogICAgICAgICAgICAgICAgIHBsYXllci5jbGVhcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gYXR0YWNoTmV3UGxheWVyKHBsYXllcik7CkBAIC0xNTYsNyArMTY0LDcgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZShnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewpAQCAtMTkzLDcgKzIwMSw3IEBACiAgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVJfU1RBVEVfRVJST1IpICYmCiAgICAgICAgICAgICAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVJfSURMRSkgIT0gTUVESUFfUExBWUVSX0lETEUpOwogICAgIGlmICgobVBsYXllciAhPSBOVUxMKSAmJiBoYXNCZWVuSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgQUxPR1YoImludm9rZSAlZCIsIHJlcXVlc3QuZGF0YVNpemUoKSk7CisgICAgICAgIEFMT0dWKCJpbnZva2UgJXp1IiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKICAgICAgICAgcmV0dXJuICBtUGxheWVyLT5pbnZva2UocmVxdWVzdCwgcmVwbHkpOwogICAgIH0KICAgICBBTE9HRSgiaW52b2tlIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgiLCBtQ3VycmVudFN0YXRlKTsKQEAgLTIzNCw2ICsyNDIsOSBAQAogewogICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCkgKSApIHsKICAgICAgICAgbVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgbVBsYXllci0+c2V0UGFyYW1ldGVyKEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUywgKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfUFJFUEFSSU5HOwogICAgICAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CiAgICAgfQpAQCAtMjgwLDE2ICsyOTEsMjEgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CisKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX1NUQVJURUQpCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSX1BSRVBBUkVEIHwKKworICAgIG1Mb2NrVGhyZWFkSWQgPSBnZXRUaHJlYWRJZCgpOworCisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVJfU1RBUlRFRCkgeworICAgICAgICByZXQgPSBOT19FUlJPUjsKKyAgICB9IGVsc2UgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8CiAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSB8IE1FRElBX1BMQVlFUl9QQVVTRUQgKSApICkgewogICAgICAgICBtUGxheWVyLT5zZXRMb29waW5nKG1Mb29wKTsKICAgICAgICAgbVBsYXllci0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwogICAgICAgICBtUGxheWVyLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfU1RBUlRFRDsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9TVEFURV9FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI5NywxMCArMzEzLDE0IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgc3RhcnQoKSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0IGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXQgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgQUxPR0UoInN0YXJ0IGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIG1Mb2NrVGhyZWFkSWQgPSAwOworCisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnN0b3AoKQpAQCAtNTMwLDYgKzU1MCwxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKQoreworICAgIEFMT0dWKCJnZXRBdWRpb1N0cmVhbVR5cGUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICp0eXBlID0gbVN0cmVhbVR5cGU7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0TG9vcGluZyhpbnQgbG9vcCkKIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXI6OnNldExvb3BpbmciKTsKQEAgLTU3NSw4ICs2MDMsOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoc2Vzc2lvbklkICE9IG1BdWRpb1Nlc3Npb25JZCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIC0xKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC02MTMsMTUgKzY0MSw0NiBAQAogICAgIHJldHVybiBtUGxheWVyLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwogfQogCisvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KQoreworICAgIHN3aXRjaChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUl9TVEFSVEVEIHwKKyAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVJfUEFVU0VEIHwgTUVESUFfUExBWUVSX1BMQVlCQUNLX0NPTVBMRVRFKSApIHsKKyAgICAgICAgICAgIC8vIENhbid0IGNoYW5nZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBhZnRlciBwcmVwYXJlCisgICAgICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIHBhcmFtZXRlciBkb2Vzbid0IHJlcXVpcmUgcGxheWVyIHN0YXRlIGNoZWNrCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KQogewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KICAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CiAgICAgfQotICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgLy8gbm8gcGxheWVyLCBzYXZlIHRoZSBtYXJzaGFsbGVkIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeyBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsgfTsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IG5ldyBQYXJjZWwoKTsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+YXBwZW5kRnJvbSgmcmVxdWVzdCwgMCwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KQpAQCAtNjU0LDcgKzcxMyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbWVtc2V0KCZtUmV0cmFuc21pdEVuZHBvaW50LCAwLCBzaXplb2YoJm1SZXRyYW5zbWl0RW5kcG9pbnQpKTsKKyAgICBtZW1zZXQoJm1SZXRyYW5zbWl0RW5kcG9pbnQsIDAsIHNpemVvZihtUmV0cmFuc21pdEVuZHBvaW50KSk7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50LnNpbl9hZGRyICAgPSBzYWRkcjsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50LnNpbl9wb3J0ICAgPSBodG9ucyhwb3J0KTsKQEAgLTY3Myw4ICs3MzIsOCBAQAogICAgIC8vIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUgbWVkaWEgc2VydmVyLiBJbiB0aGF0IGNhc2UsCiAgICAgLy8gdGhpcyB3aWxsIGRlYWRsb2NrLgogICAgIC8vCi0gICAgLy8gVGhlIHRocmVhZElkIGhhY2sgYmVsb3cgd29ya3MgYXJvdW5kIHRoaXMgZm9yIHRoZSBjYXJlIG9mIHByZXBhcmUKLSAgICAvLyBhbmQgc2Vla1RvIHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgIC8vIFRoZSB0aHJlYWRJZCBoYWNrIGJlbG93IHdvcmtzIGFyb3VuZCB0aGlzIGZvciB0aGUgY2FyZSBvZiBwcmVwYXJlLAorICAgIC8vIHNlZWtUbyBhbmQgc3RhcnQgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCiAgICAgLy8gRklYTUU6IFJlbWVtYmVyLCB0aGlzIGlzIGEgaGFjaywgaXQncyBub3QgZXZlbiBhIGhhY2sgdGhhdCBpcyBhcHBsaWVkCiAgICAgLy8gY29uc2lzdGVudGx5IGZvciBhbGwgdXNlLWNhc2VzLCB0aGlzIG5lZWRzIHRvIGJlIHJldmlzaXRlZC4KICAgICBpZiAobUxvY2tUaHJlYWRJZCAhPSBnZXRUaHJlYWRJZCgpKSB7CkBAIC03NzYsMTUgKzgzNSwyMCBAQAogICAgIH0KIH0KIAotLypzdGF0aWMqLyBzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCisvKnN0YXRpYyovIHN0YXR1c190IE1lZGlhUGxheWVyOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLT5kZWNvZGUodXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IHNlcnZpY2UtPmRlY29kZShodHRwU2VydmljZSwgdXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2NhdGUgbWVkaWEgc2VydmljZSIpOwogICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKQEAgLTgwNCw3ICs4NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkKIHsKLSAgICBBTE9HVigiZGVjb2RlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoImRlY29kZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewpAQCAtODMyLDE1ICs4OTYsNCBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXROZXh0UGxheWVyKG5leHQgPT0gTlVMTCA/IE5VTEwgOiBuZXh0LT5tUGxheWVyKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSA9IGdldE1lZGlhUGxheWVyU2VydmljZSgpOwotCi0gICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc2VydmljZS0+dXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCAzNzEwZTQ2Li4xOTUyYjg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtMTcsNiArMTcsOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhUmVjb3JkZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTE4Myw4ICsxODYsMTEgQEAKICAgICAgICAgQUxPR0UoInNldE91dHB1dEZvcm1hdCBjYWxsZWQgaW4gYW4gaW52YWxpZCBzdGF0ZTogJWQiLCBtQ3VycmVudFN0YXRlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAobUlzVmlkZW9Tb3VyY2VTZXQgJiYgb2YgPj0gT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX1NUQVJUICYmIG9mICE9IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCAmJiBvZiAhPSBPVVRQVVRfRk9STUFUX01QRUcyVFMpIHsgLy9maXJzdCBub24tdmlkZW8gb3V0cHV0IGZvcm1hdAotICAgICAgICBBTE9HRSgib3V0cHV0IGZvcm1hdCAoJWQpIGlzIG1lYW50IGZvciBhdWRpbyByZWNvcmRpbmcgb25seSBhbmQgaW5jb21wYXRpYmxlIHdpdGggdmlkZW8gcmVjb3JkaW5nIiwgb2YpOworICAgIGlmIChtSXNWaWRlb1NvdXJjZVNldAorICAgICAgICAgICAgJiYgb2YgPj0gT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX1NUQVJUIC8vZmlyc3Qgbm9uLXZpZGVvIG91dHB1dCBmb3JtYXQKKyAgICAgICAgICAgICYmIG9mIDwgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCkgeworICAgICAgICBBTE9HRSgib3V0cHV0IGZvcm1hdCAoJWQpIGlzIG1lYW50IGZvciBhdWRpbyByZWNvcmRpbmcgb25seSIKKyAgICAgICAgICAgICAgIiBhbmQgaW5jb21wYXRpYmxlIHdpdGggdmlkZW8gcmVjb3JkaW5nIiwgb2YpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0yODYsNyArMjkyLDcgQEAKIAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKLSAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDhmMjE2MzIuLjJjZjU3MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCkBAIC0yMiwxMSArMjIsMTQgQEAKICAgICBTdGFnZWZyaWdodFBsYXllci5jcHAgICAgICAgXAogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwICAgICBcCiAgICAgVGVzdFBsYXllclN0dWIuY3BwICAgICAgICAgIFwKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCAgICAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgXAogICAgIGxpYmNhbWVyYV9jbGllbnQgICAgICAgICAgICBcCisgICAgbGliY3J5cHRvICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgICAgXAorICAgIGxpYmRybWZyYW1ld29yayAgICAgICAgICAgICBcCiAgICAgbGlibG9nICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJkbCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgICBcCkBAIC00NSwxNSArNDgsMTcgQEAKICAgICBsaWJzdGFnZWZyaWdodF9ydHNwICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkgICAgICAgICAgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0gICAgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYXBsYXllcnNlcnZpY2UKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKaW5kZXggZDUwMDM3Zi4uZDIyMjMxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKQEAgLTQxNyw2ICs0MTcsMjMgQEAKICAgICByZXR1cm4gbVBsdWdpbi0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKHJlc3BvbnNlLCBjZXJ0aWZpY2F0ZSwgd3JhcHBlZEtleSk7CiB9CiAKK3N0YXR1c190IERybTo6dW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5SRU1PVkVfRFJNX0NFUlRJRklDQVRFUyIpKSB7CisgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgfQorCisgICAgcmV0dXJuIG1QbHVnaW4tPnVucHJvdmlzaW9uRGV2aWNlKCk7Cit9CiAKIHN0YXR1c190IERybTo6Z2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oCmluZGV4IDNkNGIwZmMuLjllMjNlMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmgKQEAgLTc1LDYgKzc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVucHJvdmlzaW9uRGV2aWNlKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcAppbmRleCBjMmFjMWEzLi5hZmUzOTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwCkBAIC0xMDcsMTEgKzEwNyw3IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAotICAgIC8vIFRPLURPOgotICAgIC8vIE9ubHkgc3VwcG9ydCBIRENQX0NBUFNfRU5DUllQVCAoYnl0ZS1hcnJheSB0byBieXRlLWFycmF5KSBmb3Igbm93LgotICAgIC8vIHVzZSBtSERDUE1vZHVsZS0+Z2V0Q2FwcygpIHdoZW4gdGhlIEhEQ1AgbGlicmFyaWVzIGdldCB1cGRhdGVkLgotICAgIC8vcmV0dXJuIG1IRENQTW9kdWxlLT5nZXRDYXBzKCk7Ci0gICAgcmV0dXJuIEhEQ1BNb2R1bGU6OkhEQ1BfQ0FQU19FTkNSWVBUOworICAgIHJldHVybiBtSERDUE1vZHVsZS0+Z2V0Q2FwcygpOwogfQogCiBzdGF0dXNfdCBIRENQOjplbmNyeXB0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAppbmRleCA5MGFlZDM5Li4zZTBmYzBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcApAQCAtNjAsMTQgKzYwLDIwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1wbGF5ZXJfdHlwZSBNZWRpYVBsYXllckZhY3Rvcnk6OmdldERlZmF1bHRQbGF5ZXJUeXBlKCkgeworc3RhdGljIHBsYXllcl90eXBlIGdldERlZmF1bHRQbGF5ZXJUeXBlKCkgewogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtbnVwbGF5ZXIiLCB2YWx1ZSwgTlVMTCkKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtYXdlc29tZSIsIHZhbHVlLCBOVUxMKQogICAgICAgICAgICAgJiYgKCFzdHJjbXAoIjEiLCB2YWx1ZSkgfHwgIXN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkpKSB7Ci0gICAgICAgIHJldHVybiBOVV9QTEFZRVI7CisgICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7CiAgICAgfQogCi0gICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBFWFBFUklNRU5UQUwgZGV2ZWxvcGVyIHNldHRpbmdzIHByb3BlcnR5CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMubWVkaWEudXNlLWF3ZXNvbWUiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgICAgICYmICFzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpKSB7CisgICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7CisgICAgfQorCisgICAgcmV0dXJuIE5VX1BMQVlFUjsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJGYWN0b3J5OjpyZWdpc3RlckZhY3RvcnkoSUZhY3RvcnkqIGZhY3RvcnksCkBAIC0xNzAsMjEgKzE3NiwyNCBAQAogY2xhc3MgU3RhZ2VmcmlnaHRQbGF5ZXJGYWN0b3J5IDoKICAgICBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsKLSAgICAgICAgY2hhciBidWZbMjBdOwotICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKmxlbmd0aCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgeworICAgICAgICBpZiAoZ2V0RGVmYXVsdFBsYXllclR5cGUoKQorICAgICAgICAgICAgICAgID09IFNUQUdFRlJJR0hUX1BMQVlFUikgeworICAgICAgICAgICAgY2hhciBidWZbMjBdOworICAgICAgICAgICAgbHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CiAKLSAgICAgICAgbG9uZyBpZGVudCA9ICooKGxvbmcqKWJ1Zik7CisgICAgICAgICAgICB1aW50MzJfdCBpZGVudCA9ICooKHVpbnQzMl90KilidWYpOwogCi0gICAgICAgIC8vIE9nZyB2b3JiaXM/Ci0gICAgICAgIGlmIChpZGVudCA9PSAweDUzNjc2NzRmKSAvLyAnT2dnUycKLSAgICAgICAgICAgIHJldHVybiAxLjA7CisgICAgICAgICAgICAvLyBPZ2cgdm9yYmlzPworICAgICAgICAgICAgaWYgKGlkZW50ID09IDB4NTM2NzY3NGYpIC8vICdPZ2dTJworICAgICAgICAgICAgICAgIHJldHVybiAxLjA7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KQEAgLTE5Nyw3ICsyMDYsNyBAQAogCiBjbGFzcyBOdVBsYXllckZhY3RvcnkgOiBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsKICAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IGtPdXJTY29yZSA9IDAuODsKQEAgLTIyOSw5ICsyMzgsOSBAQAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KIAotICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7CisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiYgLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsKICAgICAgICAgcmV0dXJuIDEuMDsKICAgICB9CiAKQEAgLTI0Myw3ICsyNTIsNyBAQAogCiBjbGFzcyBTb25pdm94UGxheWVyRmFjdG9yeSA6IHB1YmxpYyBNZWRpYVBsYXllckZhY3Rvcnk6OklGYWN0b3J5IHsKICAgcHVibGljOgotICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKKyAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgewogICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga091clNjb3JlID0gMC40OwpAQCAtMjc0LDcgKzI4Myw3IEBACiAgICAgICAgIHJldHVybiAwLjA7CiAgICAgfQogCi0gICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAorICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLApAQCAtMzEyLDkgKzMyMSw5IEBACiAKIGNsYXNzIFRlc3RQbGF5ZXJGYWN0b3J5IDogcHVibGljIE1lZGlhUGxheWVyRmFjdG9yeTo6SUZhY3RvcnkgewogICBwdWJsaWM6Ci0gICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAorICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7CiAgICAgICAgIGlmIChUZXN0UGxheWVyU3R1Yjo6Y2FuQmVVc2VkKHVybCkpIHsKICAgICAgICAgICAgIHJldHVybiAxLjA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaAppbmRleCBmZTg5NzJiLi41NWZmOTE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oCkBAIC0yOSwxOSArMjksMTkgQEAKICAgICAgIHB1YmxpYzoKICAgICAgICAgdmlydHVhbCB+SUZhY3RvcnkoKSB7IH0KIAotICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsgcmV0dXJuIDAuMDsgfQorICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKnVybCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQogCi0gICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7IHJldHVybiAwLjA7IH0KKyAgICAgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZmQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKm9mZnNldCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IC8qbGVuZ3RoKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgeyByZXR1cm4gMC4wOyB9CiAKLSAgICAgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgeyByZXR1cm4gMC4wOyB9CisgICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICYvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQogCiAgICAgICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIoKSA9IDA7CiAgICAgfTsKQEAgLTcxLDcgKzcxLDYgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlckZhY3RvcnlfbChJRmFjdG9yeSogZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyX3R5cGUgdHlwZSk7Ci0gICAgc3RhdGljIHBsYXllcl90eXBlIGdldERlZmF1bHRQbGF5ZXJUeXBlKCk7CiAKICAgICBzdGF0aWMgTXV0ZXggICAgICAgc0xvY2s7CiAgICAgc3RhdGljIHRGYWN0b3J5TWFwIHNGYWN0b3J5TWFwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCA5YWM5MTA1Li44ZWIxMjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCisjaW5jbHVkZSA8YmluZGVyL0lCYXR0ZXJ5U3RhdHMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CkBAIC00Miw4ICs0MywxMCBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgpAQCAtNTIsNiArNTUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMTg1LDYgKzE4OSw2MyBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiAKK25hbWVzcGFjZSB7Cit1c2luZyBhbmRyb2lkOjpQYXJjZWw7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKKworLy8gbWFyc2hhbGxpbmcgdGFnIGluZGljYXRpbmcgZmxhdHRlbmVkIHV0ZjE2IHRhZ3MKKy8vIGtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmphdmEKK2NvbnN0IGludDMyX3Qga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgPSAxOworCisvLyBBdWRpbyBhdHRyaWJ1dGVzIGZvcm1hdCBpbiBhIHBhcmNlbDoKKy8vCisvLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyAgfCAvLyBpZ25vcmUgdGFncyBpZiBub3QgZm91bmQKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQgdGFncyBpbiBVVEYxNiAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLworLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgY29udGFpbnMgYXVkaW8gYXR0cmlidXRlcy4KKy8vIEBwYXJhbVtvdXRdIGF0dHJpYnV0ZXMgT24gZXhpdCBwb2ludHMgdG8gYW4gaW5pdGlhbGl6ZWQgYXVkaW9fYXR0cmlidXRlc190IHN0cnVjdHVyZQorLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgordm9pZCB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IFBhcmNlbCYgcGFyY2VsLCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMpCit7CisgICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7CisgICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgeworICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAorICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOworICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOworICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgeworICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgorICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKKyAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KKyAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOworICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJ1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKCkgcmVjZWl2ZWQgdW5mbGF0dGVuZWQgdGFncywgaWdub3JpbmcgdGFnIHZhbHVlcyIpOworICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOworICAgIH0KK30KK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGJvb2wgY2hlY2tQZXJtaXNzaW9uKGNvbnN0IGNoYXIqIHBlcm1pc3Npb25TdHJpbmcpIHsKQEAgLTIyMCw2ICsyODEsMjAgQEAKICAgICAvLyBzcGVha2VyIGlzIG9uIGJ5IGRlZmF1bHQKICAgICBtQmF0dGVyeUF1ZGlvLmRldmljZU9uW1NQRUFLRVJdID0gMTsKIAorICAgIC8vIHJlc2V0IGJhdHRlcnkgc3RhdHMKKyAgICAvLyBpZiB0aGUgbWVkaWFzZXJ2ZXIgaGFzIGNyYXNoZWQsIGJhdHRlcnkgc3RhdHMgY291bGQgYmUgbGVmdAorICAgIC8vIGluIGJhZCBzdGF0ZSwgcmVzZXQgdGhlIHN0YXRlIHVwb24gc2VydmljZSBzdGFydC4KKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gTlVMTCkgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVN0YXRzID0KKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Z2V0U2VydmljZShuYW1lKSk7CisgICAgICAgIGlmIChiYXR0ZXJ5U3RhdHMgIT0gTlVMTCkgeworICAgICAgICAgICAgYmF0dGVyeVN0YXRzLT5ub3RlUmVzZXRWaWRlbygpOworICAgICAgICAgICAgYmF0dGVyeVN0YXRzLT5ub3RlUmVzZXRBdWRpbygpOworICAgICAgICB9CisgICAgfQorCiAgICAgTWVkaWFQbGF5ZXJGYWN0b3J5OjpyZWdpc3RlckJ1aWx0aW5GYWN0b3JpZXMoKTsKIH0KIApAQCAtMjc1LDYgKzM1MCwxMCBAQAogICAgIHJldHVybiBjOwogfQogCitzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhUGxheWVyU2VydmljZTo6Z2V0Q29kZWNMaXN0KCkgY29uc3QgeworICAgIHJldHVybiBNZWRpYUNvZGVjTGlzdDo6Z2V0TG9jYWxJbnN0YW5jZSgpOworfQorCiBzcDxJT01YPiBNZWRpYVBsYXllclNlcnZpY2U6OmdldE9NWCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC0zMDYsMTIgKzM4NSw3IEBACiAgICAgcmV0dXJuIG5ldyBSZW1vdGVEaXNwbGF5KGNsaWVudCwgaWZhY2Uuc3RyaW5nKCkpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OnVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICByZXR1cm4gSFRUUEJhc2U6OlVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0CiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0zMTksNyArMzkzLDcgQEAKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb0NhY2hlXG4iKTsKICAgICBpZiAobUhlYXAgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgaGVhcCBiYXNlKCVwKSwgc2l6ZSglZCksIGZsYWdzKCVkKVxuIiwKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGhlYXAgYmFzZSglcCksIHNpemUoJXp1KSwgZmxhZ3MoJWQpXG4iLAogICAgICAgICAgICAgICAgIG1IZWFwLT5nZXRCYXNlKCksIG1IZWFwLT5nZXRTaXplKCksIG1IZWFwLT5nZXRGbGFncygpKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KQEAgLTUxMiw2ICs1ODYsNyBAQAogICAgIG1BdWRpb1Nlc3Npb25JZCA9IGF1ZGlvU2Vzc2lvbklkOwogICAgIG1VSUQgPSB1aWQ7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkID0gZmFsc2U7CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CiAKICNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgogICAgIEFMT0dEKCJjcmVhdGUgQW50YWdvbml6ZXIiKTsKQEAgLTUyNiw2ICs2MDEsOSBAQAogICAgIHdwPENsaWVudD4gY2xpZW50KHRoaXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGNsaWVudCk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpCkBAIC01OTAsNyArNjY4LDggQEAKICAgICB9CiAKICAgICBpZiAoIXAtPmhhcmR3YXJlT3V0cHV0KCkpIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAorICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMpOwogICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVBsYXllckludGVyZmFjZSo+KHAuZ2V0KCkpLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKICAgICB9CiAKQEAgLTYyMiw3ICs3MDEsOSBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwogICAgIGlmICh1cmwgPT0gTlVMTCkKQEAgLTY1Nyw3ICs3MzgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KIAotICAgICAgICBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpKTsKKyAgICAgICAgc2V0RGF0YVNvdXJjZV9wb3N0KHAsIHAtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycykpOwogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CiB9CkBAIC02NzQsOCArNzU1LDggQEAKIAogICAgIEFMT0dWKCJzdF9kZXYgID0gJWxsdSIsIHNiLnN0X2Rldik7CiAgICAgQUxPR1YoInN0X21vZGUgPSAldSIsIHNiLnN0X21vZGUpOwotICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc2Iuc3RfdWlkKTsKLSAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHNiLnN0X2dpZCk7CisgICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF91aWQpKTsKKyAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X2dpZCkpOwogICAgIEFMT0dWKCJzdF9zaXplID0gJWxsdSIsIHNiLnN0X3NpemUpOwogCiAgICAgaWYgKG9mZnNldCA+PSBzYi5zdF9zaXplKSB7CkBAIC04MDQsNyArODg1LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmdldE1ldGFkYXRhKAotICAgICAgICBib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICpyZXBseSkKKyAgICAgICAgYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKmFwcGx5X2ZpbHRlciovLCBQYXJjZWwgKnJlcGx5KQogewogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcGxheWVyID0gZ2V0UGxheWVyKCk7CiAgICAgaWYgKHBsYXllciA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTk2OSw2ICsxMDUwLDIyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZwYXJjZWwpCit7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeyBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOyB9CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7CisKKyAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOworCisgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRMb29waW5nKGludCBsb29wKQogewogICAgIEFMT0dWKCJbJWRdIHNldExvb3BpbmcoJWQpIiwgbUNvbm5JZCwgbG9vcCk7CkBAIC0xMDE3LDkgKzExMTQsMTcgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKICAgICBBTE9HVigiWyVkXSBzZXRQYXJhbWV0ZXIoJWQpIiwgbUNvbm5JZCwga2V5KTsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKLSAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICByZXR1cm4gcC0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICAgICAgaWYgKHAgPT0gMCkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgICAgICByZXR1cm4gcC0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgfQogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKQEAgLTExNzYsOSArMTI4MSwxNCBAQAogfQogI2VuZGlmCiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwbGF5ZXI7CkBAIC0xMjA2LDcgKzEzMTYsNyBAQAogICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocGxheWVyLmdldCgpKS0+c2V0QXVkaW9TaW5rKGNhY2hlKTsKIAogICAgIC8vIHNldCBkYXRhIHNvdXJjZQotICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UodXJsKSAhPSBOT19FUlJPUikgZ290byBFeGl0OworICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCkgIT0gTk9fRVJST1IpIGdvdG8gRXhpdDsKIAogICAgIEFMT0dWKCJwcmVwYXJlIik7CiAgICAgcGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKQEAgLTEyOTYsMTMgKzE0MDYsMTUgQEAKIAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TaW5rIgotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCkKK01lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQsIGludCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cikKICAgICA6IG1DYWxsYmFjayhOVUxMKSwKICAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKICAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCiAgICAgICBtQnl0ZXNXcml0dGVuKDApLAogICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpLAogICAgICAgbVVpZCh1aWQpLAorICAgICAgbVBpZChwaWQpLAogICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKICAgICBBTE9HVigiQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKQEAgLTEzMTQsNiArMTQyNiw3IEBACiAgICAgbUF1eEVmZmVjdElkID0gMDsKICAgICBtU2VuZExldmVsID0gMC4wOwogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgbUF0dHJpYnV0ZXMgPSBhdHRyOwogfQogCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp+QXVkaW9PdXRwdXQoKQpAQCAtMTM4NCw2ICsxNDk3LDEyIEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdAoreworICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QKIHsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwpAQCAtMTQwMyw2ICsxNTIyLDEwIEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKIH0KIAordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcykgeworICAgIG1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKK30KKwogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpkZWxldGVSZWN5Y2xlZFRyYWNrKCkKIHsKICAgICBBTE9HVigiZGVsZXRlUmVjeWNsZWRUcmFjayIpOwpAQCAtMTQ1MCw3ICsxNTczLDcgQEAKICAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7CiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgdWludDMyX3QgZnJhbWVDb3VudDsKKyAgICBzaXplX3QgZnJhbWVDb3VudDsKIAogICAgIC8vIG9mZmxvYWRpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2FsbGJhY2sgbW9kZSBmb3Igbm93LgogICAgIC8vIG9mZmxvYWRJbmZvIG11c3QgYmUgcHJlc2VudCBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0CkBAIC0xNTUxLDcgKzE2NzQsOSBAQAogICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSywKICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgICAgIG1VaWQpOworICAgICAgICAgICAgICAgICAgICBtVWlkLAorICAgICAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLApAQCAtMTU2NiwxMyArMTY5MSwxOSBAQAogICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICBOVUxMLCAvLyBvZmZsb2FkIGluZm8KLSAgICAgICAgICAgICAgICAgICAgbVVpZCk7CisgICAgICAgICAgICAgICAgICAgIG1VaWQsCisgICAgICAgICAgICAgICAgICAgIG1QaWQsCisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CiAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwogICAgICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCBBdWRpb1RyYWNrIGluaXRpYWxpemF0aW9uIGltcGxpZXMgYSBsZWdhY3kgc3RyZWFtIHR5cGUgd2FzIGdlbmVyYXRlZAorICAgICAgICAgICAgLy8gZnJvbSB0aGUgYXVkaW8gYXR0cmlidXRlcworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSB0LT5zdHJlYW1UeXBlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NzIsMTIgKzE4MDMsMTQgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIExPR19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CiAKICAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKICAgICBpZiAobVRyYWNrICE9IDApIHsKICAgICAgICAgc3NpemVfdCByZXQgPSBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtMTc3Nyw3ICsxOTEwLDggQEAKICAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKICAgICAgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CiAKLSAgICAgICAgaWYgKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIGlmICgobWUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDAgJiYKKyAgICAgICAgICAgIGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIEVPUyBidXQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldCwKICAgICAgICAgICAgIC8vIGtlZXAgcGxheWluZyBzaWxlbmNlLgogCkBAIC0xODIzLDcgKzE5NTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb0NhY2hlIgogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpBdWRpb0NhY2hlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgOgogICAgIG1IZWFwKGhlYXApLCBtQ2hhbm5lbENvdW50KDApLCBtRnJhbWVDb3VudCgxMDI0KSwgbVNhbXBsZVJhdGUoMCksIG1TaXplKDApLAotICAgIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQorICAgIG1GcmFtZVNpemUoMSksIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQogewogfQogCkBAIC0xODQwLDE0ICsxOTc0LDIzIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QKIHsKICAgICBpZiAocG9zaXRpb24gPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqcG9zaXRpb24gPSBtU2l6ZTsKKyAgICAqcG9zaXRpb24gPSBtU2l6ZSAvIG1GcmFtZVNpemU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0Cit7CisgICAgdHMubVBvc2l0aW9uID0gbVNpemUgLyBtRnJhbWVTaXplOworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIHRzLm1UaW1lLnR2X3NlYyA9IG5vdyAvIDEwMDAwMDAwMDBMTDsKKyAgICB0cy5tVGltZS50dl9uc2VjID0gbm93IC0gKDEwMDAwMDAwMDBMTCAqIHRzLm1UaW1lLnR2X3NlYyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKndyaXR0ZW4pIGNvbnN0CiB7CiAgICAgaWYgKHdyaXR0ZW4gPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqd3JpdHRlbiA9IG1TaXplOworICAgICp3cml0dGVuID0gbVNpemUgLyBtRnJhbWVTaXplOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTkwOSw2ICsyMDUyLDggQEAKIAogICAgIGlmIChhY3R1YWxTaXplID4gMCkgewogICAgICAgICBzaW5rLT53cml0ZShtQnVmZmVyLCBhY3R1YWxTaXplKTsKKyAgICAgICAgLy8gQ291bGQgcmV0dXJuIGZhbHNlIG9uIHNpbmstPndyaXRlKCkgZXJyb3Igb3Igc2hvcnQgY291bnQuCisgICAgICAgIC8vIE5vdCBuZWNlc3NhcmlseSBhcHByb3ByaWF0ZSBidXQgd291bGQgd29yayBmb3IgQXVkaW9DYWNoZSBiZWhhdmlvci4KICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE5MTksOCArMjA2NCw4IEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6Om9wZW4oCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLywKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QqIC8qb2ZmbG9hZEluZm8qLykKIHsKICAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKICAgICBpZiAobUhlYXAtPmdldEhlYXBJRCgpIDwgMCkgewpAQCAtMTkzMSw2ICsyMDc2LDkgQEAKICAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KWNoYW5uZWxDb3VudDsKICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIG1Nc2Vjc1BlckZyYW1lID0gMS5lMyAvIChmbG9hdCkgc2FtcGxlUmF0ZTsKKyAgICBtRnJhbWVTaXplID0gIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkKKyAgICAgICAgICAgID8gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCkgOiAxOworICAgIG1GcmFtZUNvdW50ID0gbUhlYXAtPmdldFNpemUoKSAvIG1GcmFtZVNpemU7CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewogICAgICAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcywgY2IsIGNvb2tpZSk7CkBAIC0xOTYwLDEyICsyMTA4LDI2IEBACiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcCArPSBtU2l6ZTsKICAgICBBTE9HVigibWVtY3B5KCVwLCAlcCwgJXUpIiwgcCwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAobVNpemUgKyBzaXplID4gbUhlYXAtPmdldFNpemUoKSkgeworCisgICAgYm9vbCBvdmVyZmxvdyA9IG1TaXplICsgc2l6ZSA+IG1IZWFwLT5nZXRTaXplKCk7CisgICAgaWYgKG92ZXJmbG93KSB7CiAgICAgICAgIEFMT0dFKCJIZWFwIHNpemUgb3ZlcmZsb3chIHJlcSBzaXplOiAlZCwgbWF4IHNpemU6ICVkIiwgKG1TaXplICsgc2l6ZSksIG1IZWFwLT5nZXRTaXplKCkpOwogICAgICAgICBzaXplID0gbUhlYXAtPmdldFNpemUoKSAtIG1TaXplOwogICAgIH0KKyAgICBzaXplIC09IHNpemUgJSBtRnJhbWVTaXplOyAvLyBjb25zdW1lIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBmcmFtZSBzaXplCiAgICAgbWVtY3B5KHAsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgbVNpemUgKz0gc2l6ZTsKKworICAgIGlmIChvdmVyZmxvdykgeworICAgICAgICAvLyBTaWduYWwgaGVhcCBmaWxsZWQgaGVyZSAobGFzdCBmcmFtZSBtYXkgYmUgdHJ1bmNhdGVkKS4KKyAgICAgICAgLy8gQWZ0ZXIgdGhpcyBwb2ludCwgbm8gbW9yZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZQorICAgICAgICAvLyBoZWFwIGlzIGZpbGxlZCBhbmQgdGhlIEF1ZGlvQ2FjaGUgc2hvdWxkIGJlIGVmZmVjdGl2ZWx5CisgICAgICAgIC8vIGltbXV0YWJsZSB3aXRoIHJlc3BlY3QgdG8gZnV0dXJlIHdyaXRlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSXQgaXMgdGh1cyBzYWZlIGZvciBhbm90aGVyIHRocmVhZCB0byByZWFkIHRoZSBBdWRpb0NhY2hlLgorICAgICAgICBtQ29tbWFuZENvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgbVNpZ25hbC5zaWduYWwoKTsKKyAgICB9CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKQEAgLTE5ODcsNyArMjE0OSw3IEBACiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpub3RpZnkoCi0gICAgICAgIHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKKyAgICAgICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCogLypvYmoqLykKIHsKICAgICBBTE9HVigibm90aWZ5KCVwLCAlZCwgJWQsICVkKSIsIGNvb2tpZSwgbXNnLCBleHQxLCBleHQyKTsKICAgICBBdWRpb0NhY2hlKiBwID0gc3RhdGljX2Nhc3Q8QXVkaW9DYWNoZSo+KGNvb2tpZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggOWMwODRlMS4uM2I5NmU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNzIsNyArNzIsOCBAQAogICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCwgaW50IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQpAQCAtODQsNiArODUsNyBAQAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwpAQCAtMTA0LDYgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsgfQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOwogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKTsKQEAgLTEzMyw2ICsxMzYsNyBAQAogICAgICAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOwogICAgICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICptQXR0cmlidXRlczsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVBsYXliYWNrUmF0ZVBlcm1pbGxlOwpAQCAtMTQwLDYgKzE0NCw3IEBACiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CkBAIC0xOTAsMTAgKzE5NSwxMSBAQAogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gZnJhbWVTaXplKCkgKiBtRnJhbWVDb3VudDsgfQogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUNoYW5uZWxDb3VudDsgfQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBzc2l6ZV90KG1DaGFubmVsQ291bnQgKiAoKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpP3NpemVvZihpbnQxNl90KTpzaXplb2YodV9pbnQ4X3QpKSk7IH0KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUZyYW1lU2l6ZTsgfQogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwpAQCAtMjExLDEyICsyMTcsMTIgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZmx1c2goKSB7fQogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpIHt9CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGNsb3NlKCkge30KLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkge30KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSBfX3VudXNlZCkge30KICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gdHlwZSBpcyBub3QgdXNlZCBmb3IgQXVkaW9DYWNoZQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gQVVESU9fU1RSRUFNX0RFRkFVTFQ7IH0KIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHt9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCBfX3VudXNlZCwgZmxvYXQgcmlnaHQgX191bnVzZWQpIHt9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlIF9fdW51c2VkKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KQEAgLTI0MCw2ICsyNDYsNyBAQAogICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1TYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1TaXplOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG1GcmFtZVNpemU7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUVycm9yOwogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1Db21tYW5kQ29tcGxldGU7CiAKQEAgLTI1NiwxMyArMjYzLDIwIEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgICAgIHNpemVfdCAqcFNpemUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKTsKICAgICB2aXJ0dWFsIHNwPElDcnlwdG8+ICAgICAgICAgbWFrZUNyeXB0bygpOwogICAgIHZpcnR1YWwgc3A8SURybT4gICAgICAgICAgICBtYWtlRHJtKCk7CkBAIC0yNzIsOSArMjg2LDYgQEAKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGlmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlbW92ZUNsaWVudCh3cDxDbGllbnQ+IGNsaWVudCk7CiAKICAgICAvLyBGb3IgYmF0dGVyeSB1c2FnZSB0cmFja2luZyBwdXJwb3NlCkBAIC0zNTYsNiArMzY3LDcgQEAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgY3JlYXRlUGxheWVyKHBsYXllcl90eXBlIHBsYXllclR5cGUpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC00MDUsNiArNDE3LDggQEAKICAgICAgICAgLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIEFOYXRpdmVXaW5kb3cuCiAgICAgICAgIHZvaWQgZGlzY29ubmVjdE5hdGl2ZVdpbmRvdygpOwogCisgICAgICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisKICAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICAgICAgbVBsYXllcjsKICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiAgICAgIG1TZXJ2aWNlOwpAQCAtNDE1LDYgKzQyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcDsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1Db25uSWQ7CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVJRDsKICAgICAgICAgICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICAgICAgIG1Db25uZWN0ZWRXaW5kb3c7CiAgICAgICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkV2luZG93QmluZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IGE5ODIwZTAuLjE5NGFiYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTk1LDcgKzk1LDggQEAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFZpZGVvU291cmNlKGludCB2cykKIHsKICAgICBBTE9HVigic2V0VmlkZW9Tb3VyY2UoJWQpIiwgdnMpOwotICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKGNhbWVyYVBlcm1pc3Npb24pKSB7CisgICAgLy8gQ2hlY2sgY2FtZXJhIHBlcm1pc3Npb24gZm9yIHNvdXJjZXMgb3RoZXIgdGhhbiBTVVJGQUNFCisgICAgaWYgKHZzICE9IFZJREVPX1NPVVJDRV9TVVJGQUNFICYmICFjaGVja1Blcm1pc3Npb24oY2FtZXJhUGVybWlzc2lvbikpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAppbmRleCAzNDg5NTdmLi5mYTI4NDUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KQEAgLTU2LDcgKzU3LDcgQEAKICAgICBkaXNjb25uZWN0KCk7CiB9CiAKLXN0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKK3N0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0CiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0xMDYsNyArMTA3LDkgQEAKIH0KIAogc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJsKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xMjcsNyArMTMwLDcgQEAKICAgICBBTE9HVigicGxheWVyIHR5cGUgPSAlZCIsIHBsYXllclR5cGUpOwogICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlPiBwID0gY3JlYXRlUmV0cmlldmVyKHBsYXllclR5cGUpOwogICAgIGlmIChwID09IE5VTEwpIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHJldCA9IHAtPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIG1SZXRyaWV2ZXIgPSBwOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xNDQsOCArMTQ3LDggQEAKICAgICB9CiAgICAgQUxPR1YoInN0X2RldiAgPSAlbGx1Iiwgc2Iuc3RfZGV2KTsKICAgICBBTE9HVigic3RfbW9kZSA9ICV1Iiwgc2Iuc3RfbW9kZSk7Ci0gICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzYi5zdF91aWQpOwotICAgIEFMT0dWKCJzdF9naWQgID0gJWx1Iiwgc2Iuc3RfZ2lkKTsKKyAgICBBTE9HVigic3RfdWlkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X3VpZCkpOworICAgIEFMT0dWKCJzdF9naWQgID0gJWx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oc2Iuc3RfZ2lkKSk7CiAgICAgQUxPR1YoInN0X3NpemUgPSAlbGx1Iiwgc2Iuc3Rfc2l6ZSk7CiAKICAgICBpZiAob2Zmc2V0ID49IHNiLnN0X3NpemUpIHsKQEAgLTIzMCw3ICsyMzMsNyBAQAogICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGV4dHJhY3QgYW4gYWxidW0gYXJ0Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihNZWRpYUFsYnVtQXJ0KSArIGFsYnVtQXJ0LT5tU2l6ZTsKKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihNZWRpYUFsYnVtQXJ0KSArIGFsYnVtQXJ0LT5zaXplKCk7CiAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50Iik7CiAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBNZW1vcnlEZWFsZXIgb2JqZWN0Iik7CkBAIC0yNDMsMTEgKzI0Niw5IEBACiAgICAgICAgIGRlbGV0ZSBhbGJ1bUFydDsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIE1lZGlhQWxidW1BcnQgKmFsYnVtQXJ0Q29weSA9IHN0YXRpY19jYXN0PE1lZGlhQWxidW1BcnQgKj4obUFsYnVtQXJ0LT5wb2ludGVyKCkpOwotICAgIGFsYnVtQXJ0Q29weS0+bVNpemUgPSBhbGJ1bUFydC0+bVNpemU7Ci0gICAgYWxidW1BcnRDb3B5LT5tRGF0YSA9ICh1aW50OF90ICopYWxidW1BcnRDb3B5ICsgc2l6ZW9mKE1lZGlhQWxidW1BcnQpOwotICAgIG1lbWNweShhbGJ1bUFydENvcHktPm1EYXRhLCBhbGJ1bUFydC0+bURhdGEsIGFsYnVtQXJ0LT5tU2l6ZSk7Ci0gICAgZGVsZXRlIGFsYnVtQXJ0OyAgLy8gRml4IG1lbW9yeSBsZWFrYWdlCisgICAgTWVkaWFBbGJ1bUFydDo6aW5pdCgoTWVkaWFBbGJ1bUFydCAqKSBtQWxidW1BcnQtPnBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtQXJ0LT5zaXplKCksIGFsYnVtQXJ0LT5kYXRhKCkpOworICAgIGRlbGV0ZSBhbGJ1bUFydDsgIC8vIFdlJ3ZlIHRha2VuIG91ciBjb3B5LgogICAgIHJldHVybiBtQWxidW1BcnQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKaW5kZXggZjA4ZjkzMy4uOWQzZmJlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFQbGF5ZXJTZXJ2aWNlOwogY2xhc3MgTWVtb3J5RGVhbGVyOwogCkBAIC00Myw3ICs0NCw5IEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKaW5kZXggMGE2YWE5MC4uNzQ5ZWY5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCkBAIC0xMTQsNyArMTE0LDkgQEAKIH0KIAogc3RhdHVzX3QgTWlkaUZpbGU6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICopIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICYgLypodHRwU2VydmljZSovLAorICAgICAgICBjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqKSB7CiAgICAgQUxPR1YoIk1pZGlGaWxlOjpzZXREYXRhU291cmNlIHVybD0lcyIsIHBhdGgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKaW5kZXggMjRkNTliNC4uODJlNGU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKQEAgLTMyLDExICszMiwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiAvKmJ1ZmZlclByb2R1Y2VyKi8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCk7CkBAIC01MSwxMyArNTMsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlc2V0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICB2aXJ0dWFsIHBsYXllcl90eXBlIHBsYXllclR5cGUoKSB7IHJldHVybiBTT05JVk9YX1BMQVlFUjsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgLypyZXF1ZXN0Ki8sIFBhcmNlbCogLypyZXBseSovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXIoaW50IC8qa2V5Ki8sIGNvbnN0IFBhcmNlbCAmLypyZXF1ZXN0Ki8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQYXJhbWV0ZXIoaW50IC8qa2V5Ki8sIFBhcmNlbCogLypyZXBseSovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggNDY1MjA5Zi4uZjNjZjZlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlICJNaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBzdGF0dXNfdCBFUlJPUl9OT1RfT1BFTiA9IC0xOwpAQCAtMzYsNyArMzgsOSBAQAogfQogCiBzdGF0dXNfdCBNaWRpTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2U6ICVzIiwgdXJsPyB1cmw6ICJOVUxMIHBvaW50ZXIiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC00NCw3ICs0OCw3IEBACiAgICAgaWYgKG1NaWRpUGxheWVyID09IDApIHsKICAgICAgICAgbU1pZGlQbGF5ZXIgPSBuZXcgTWlkaUZpbGUoKTsKICAgICB9Ci0gICAgcmV0dXJuIG1NaWRpUGxheWVyLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CisgICAgcmV0dXJuIG1NaWRpUGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogfQogCiBzdGF0dXNfdCBNaWRpTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggNGNlZTQyZC4uYjgyMTRlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMzIsNyArMzIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TWlkaU1ldGFkYXRhUmV0cmlldmVyKCkge30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggZGU2MWQ5Yi4uYjM3YWVlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC01NCw4ICs1NCwxMCBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewotICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKIH0KIAogLy8gV2FybmluZzogVGhlIGZpbGVkZXNjcmlwdG9yIHBhc3NlZCBpbnRvIHRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSB2YWxpZCB1bnRpbApAQCAtMTg3LDcgKzE4OSw3IEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpnZXRNZXRhZGF0YSgKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgewogICAgIHVzaW5nIG1lZGlhOjpNZXRhZGF0YTsKIAogICAgIHVpbnQzMl90IGZsYWdzID0gbVBsYXllci0+ZmxhZ3MoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKaW5kZXggNjAwOTQ1ZS4uZTZjMzBmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKQEAgLTM0LDcgKzM0LDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGY5ZDkwMjAuLmNhZGQ2OTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTE2LDE2ICsxNiwyMSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0UmVjb3JkZXIiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgIldlYm1Xcml0ZXIuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodFJlY29yZGVyLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oPgpAQCAtMzUsMTMgKzQwLDEyIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtNzEsOCArNzUsNyBAQAogICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9DTlQpLAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCiAgICAgICBtQ2FwdHVyZVRpbWVMYXBzZShmYWxzZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtU3VyZmFjZU1lZGlhU291cmNlKE5VTEwpIHsKKyAgICAgIG1TdGFydGVkKGZhbHNlKSB7CiAKICAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKICAgICByZXNldCgpOwpAQCAtODEsMTAgKzg0LDE5IEBACiBTdGFnZWZyaWdodFJlY29yZGVyOjp+U3RhZ2VmcmlnaHRSZWNvcmRlcigpIHsKICAgICBBTE9HVigiRGVzdHJ1Y3RvciIpOwogICAgIHN0b3AoKTsKKworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgIH0KIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6aW5pdCgpIHsKICAgICBBTE9HVigiaW5pdCIpOworCisgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Mb29wZXItPnNldE5hbWUoInJlY29yZGVyX2xvb3BlciIpOworICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTkzLDcgKzEwNSw3IEBACiAvLyB3aGlsZSBlbmNvZGluZyBHTCBGcmFtZXMKIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCkgY29uc3QgewogICAgIEFMT0dWKCJHZXQgU3VyZmFjZU1lZGlhU291cmNlIik7Ci0gICAgcmV0dXJuIG1TdXJmYWNlTWVkaWFTb3VyY2UtPmdldEJ1ZmZlclF1ZXVlKCk7CisgICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldEF1ZGlvU291cmNlKGF1ZGlvX3NvdXJjZV90IGFzKSB7CkBAIC0xNzIsMTEgKzE4NCw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKHZlID09IFZJREVPX0VOQ09ERVJfREVGQVVMVCkgewotICAgICAgICBtVmlkZW9FbmNvZGVyID0gVklERU9fRU5DT0RFUl9IMjYzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1WaWRlb0VuY29kZXIgPSB2ZTsKLSAgICB9CisgICAgbVZpZGVvRW5jb2RlciA9IHZlOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjMzLDcgKzI0MSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqIC8qIHBhdGggKi8pIHsKICAgICBBTE9HRSgic2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKikgbXVzdCBub3QgYmUgY2FsbGVkIik7CiAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCB0aGlzIGF0IGFsbCwgYXMgdGhlIG1lZGlhX3NlcnZlciBwcm9jZXNzCiAgICAgLy8gbm8gbG9uZ2VyIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgZmlsZXMuCkBAIC02ODAsMTAgKzY4OCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKHRpbWVMYXBzZUVuYWJsZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZSIpIHsKLSAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zOwotICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpKSB7CisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSkgewogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoCi0gICAgICAgICAgICAgICAgICAgIDEwMDBMTCAqIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpOworICAgICAgICAgICAgICAgICAgICB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CkBAIC03MzgsMTkgKzc0NiwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cHJlcGFyZSgpIHsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0KCkgewotICAgIENIRUNLX0dFKG1PdXRwdXRGZCwgMCk7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwcmVwYXJlSW50ZXJuYWwoKSB7CisgICAgQUxPR1YoInByZXBhcmUiKTsKKyAgICBpZiAobU91dHB1dEZkIDwgMCkgeworICAgICAgICBBTE9HRSgiT3V0cHV0IGZpbGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAKICAgICAvLyBHZXQgVUlEIGhlcmUgZm9yIHBlcm1pc3Npb24gY2hlY2tpbmcKICAgICBtQ2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZpbGUgd3JpdGVyIGlzIG5vdCBhdmFpYWxibGUiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7CiAKQEAgLTc1OCwyNSArNzYyLDI2IEBACiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9ERUZBVUxUOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFR180OgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRNUEVHNFJlY29yZGluZygpOworICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfV0VCTToKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwTVBFRzRvcldFQk1SZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfTkI6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfV0I6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydEFNUlJlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBBTVJSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRjoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTOgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRBQUNSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwQUFDUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0UlRQUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cFJUUFJlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUcyVFM6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydE1QRUcyVFNSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTc4NSw2ICs3OTAsNzcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnByZXBhcmUoKSB7CisgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfU1VSRkFDRSkgeworICAgICAgICByZXR1cm4gcHJlcGFyZUludGVybmFsKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnQoKSB7CisgICAgQUxPR1YoInN0YXJ0Iik7CisgICAgaWYgKG1PdXRwdXRGZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIk91dHB1dCBmaWxlIGRlc2NyaXB0b3IgaXMgaW52YWxpZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7CisKKyAgICBpZiAobVZpZGVvU291cmNlICE9IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgIHN0YXR1cyA9IHByZXBhcmVJbnRlcm5hbCgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Xcml0ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmlsZSB3cml0ZXIgaXMgbm90IGF2YWlhbGJsZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHXzQ6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9XRUJNOgorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzTVBFRzQgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgICAgICAgICAgaXNNUEVHNCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICBzZXR1cE1QRUc0b3JXRUJNTWV0YURhdGEoJm1ldGEpOworICAgICAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfTkI6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfV0I6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRjoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUcyVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQ6ICVkIiwgbU91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKKyAgICAgICAgbVdyaXRlciA9IE5VTEw7CisgICAgfQorCiAgICAgaWYgKChzdGF0dXMgPT0gT0spICYmICghbVN0YXJ0ZWQpKSB7CiAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKIApAQCAtODE2LDU4ICs4OTIsNTggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IGVuY01ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIHN3aXRjaCAobUF1ZGlvRW5jb2RlcikgewogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX05COgogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfREVGQVVMVDoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FNUl9XQjoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5QUFDUHJvZmlsZSwgT01YX0FVRElPX0FBQ09iamVjdExDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgT01YX0FVRElPX0FBQ09iamVjdExDKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfSEVfQUFDOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlBQUNQcm9maWxlLCBPTVhfQVVESU9fQUFDT2JqZWN0SEUpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0SEUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BQUNfRUxEOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlBQUNQcm9maWxlLCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgT01YX0FVRElPX0FBQ09iamVjdEVMRCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVua25vd24gYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBlbmNNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKICAgICBDSEVDSyhhdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICBrS2V5TWF4SW5wdXRTaXplLCAmbWF4SW5wdXRTaXplKSk7CiAKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhJbnB1dFNpemUpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1BdWRpb0NoYW5uZWxzKTsKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtQXVkaW9CaXRSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIG1heElucHV0U2l6ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG1BdWRpb0NoYW5uZWxzKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIG1TYW1wbGVSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgbUF1ZGlvQml0UmF0ZSk7CiAgICAgaWYgKG1BdWRpb1RpbWVTY2FsZSA+IDApIHsKLSAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbUF1ZGlvVGltZVNjYWxlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigidGltZS1zY2FsZSIsIG1BdWRpb1RpbWVTY2FsZSk7CiAgICAgfQogCi0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOwogICAgIHNwPE1lZGlhU291cmNlPiBhdWRpb0VuY29kZXIgPQotICAgICAgICBPTVhDb2RlYzo6Q3JlYXRlKGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jTWV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGF1ZGlvU291cmNlKTsKKyAgICAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShtTG9vcGVyLCBmb3JtYXQsIGF1ZGlvU291cmNlKTsKICAgICBtQXVkaW9Tb3VyY2VOb2RlID0gYXVkaW9Tb3VyY2U7CiAKKyAgICBpZiAoYXVkaW9FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgYXVkaW8gZW5jb2RlciIpOworICAgIH0KKwogICAgIHJldHVybiBhdWRpb0VuY29kZXI7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0QUFDUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBBQUNSZWNvcmRpbmcoKSB7CiAgICAgLy8gRklYTUU6CiAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIE9VVFBVVF9GT1JNQVRfQUFDX0FESUYKICAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX0FBQ19BRFRTKTsKQEAgLTg3OCwxNiArOTU0LDEwIEBACiAgICAgQ0hFQ0sobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpOwogCiAgICAgbVdyaXRlciA9IG5ldyBBQUNXcml0ZXIobU91dHB1dEZkKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBtV3JpdGVyLmNsZWFyKCk7Ci0gICAgICAgIG1Xcml0ZXIgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRBTVJSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEFNUlJlY29yZGluZygpIHsKICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8CiAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQik7CiAKQEAgLTkwNywxNSArOTc3LDEwIEBACiAgICAgfQogCiAgICAgbVdyaXRlciA9IG5ldyBBTVJXcml0ZXIobU91dHB1dEZkKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBtV3JpdGVyLmNsZWFyKCk7Ci0gICAgICAgIG1Xcml0ZXIgPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCkgewogICAgIGlmIChtQXVkaW9Tb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICBBTE9HRSgiSW52YWxpZCBhdWRpbyBzb3VyY2U6ICVkIiwgbUF1ZGlvU291cmNlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTk0MSwxMiArMTAwNiwxMSBAQAogICAgICAgICBtV3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQogICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgbVdyaXRlci0+c3RhcnQoKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRSVFBSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFJUUFJlY29yZGluZygpIHsKICAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX1JUUF9BVlApOwogCiAgICAgaWYgKChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVApAQCAtOTY2LDYgKzEwMzAsNyBAQAogICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICBzb3VyY2UgPSBjcmVhdGVBdWRpb1NvdXJjZSgpOwogICAgIH0gZWxzZSB7CisgICAgICAgIHNldERlZmF1bHRWaWRlb0VuY29kZXJJZk5lY2Vzc2FyeSgpOwogCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBNZWRpYVNvdXJjZSgmbWVkaWFTb3VyY2UpOwpAQCAtOTczLDcgKzEwMzgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmc291cmNlKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsICZzb3VyY2UpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC05ODMsMTAgKzEwNDgsMTAgQEAKICAgICBtV3JpdGVyLT5hZGRTb3VyY2Uoc291cmNlKTsKICAgICBtV3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwogCi0gICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUcyVFNSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTKTsKIAogICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzJUU1dyaXRlcihtT3V0cHV0RmQpOwpAQCAtMTAwNyw2ICsxMDcyLDcgQEAKIAogICAgIGlmIChtVmlkZW9Tb3VyY2UgPCBWSURFT19TT1VSQ0VfTElTVF9FTkQpIHsKICAgICAgICAgaWYgKG1WaWRlb0VuY29kZXIgIT0gVklERU9fRU5DT0RFUl9IMjY0KSB7CisgICAgICAgICAgICBBTE9HRSgiTVBFRzJUUyByZWNvcmRpbmcgb25seSBzdXBwb3J0cyBILjI2NCBlbmNvZGluZyEiKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQogCkBAIC0xMDE3LDcgKzEwODMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXI7Ci0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmZW5jb2Rlcik7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCAmZW5jb2Rlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTEwMzYsMTEgKzExMDIsMTcgQEAKIAogICAgIG1Xcml0ZXIgPSB3cml0ZXI7CiAKLSAgICByZXR1cm4gbVdyaXRlci0+c3RhcnQoKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y2xpcFZpZGVvRnJhbWVSYXRlKCkgewogICAgIEFMT0dWKCJjbGlwVmlkZW9GcmFtZVJhdGU6IGVuY29kZXIgJWQiLCBtVmlkZW9FbmNvZGVyKTsKKyAgICBpZiAobUZyYW1lUmF0ZSA9PSAtMSkgeworICAgICAgICBtRnJhbWVSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICJ2aWQuZnBzIiwgbUNhbWVyYUlkLCBDQU1DT1JERVJfUVVBTElUWV9MT1cpOworICAgICAgICBBTE9HVygiVXNpbmcgZGVmYXVsdCB2aWRlbyBmcHMgJWQiLCBtRnJhbWVSYXRlKTsKKyAgICB9CisKICAgICBpbnQgbWluRnJhbWVSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5mcHMubWluIiwgbVZpZGVvRW5jb2Rlcik7CiAgICAgaW50IG1heEZyYW1lUmF0ZSA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKApAQCAtMTEwMCw2ICsxMTcyLDcgQEAKICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwKICAgICAgICAgICAgIChtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfSDI2MyA/IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgOgogICAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPT0gVklERU9fRU5DT0RFUl9NUEVHXzRfU1AgPyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA6CisgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX1ZQOCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA6CiAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX0gyNjQgPyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgOiAiIiksCiAgICAgICAgICAgICBmYWxzZSAvKiBkZWNvZGVyICovLCB0cnVlIC8qIGh3Q29kZWMgKi8sICZjb2RlY3MpOwogICAgICpzdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZSA9IGNvZGVjcy5zaXplKCkgPiAwOwpAQCAtMTE3Miw2ICsxMjQ1LDMxIEBACiAgICAgICAgIGlmICh2aWRlb0NvZGVjID09IFZJREVPX0VOQ09ERVJfSDI2NCkgewogICAgICAgICAgICAgQUxPR0koIkZvcmNlIHRvIHVzZSBBVkMgYmFzZWxpbmUgcHJvZmlsZSIpOwogICAgICAgICAgICAgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpOworICAgICAgICAgICAgLy8gc2V0IDAgZm9yIGludmFsaWQgbGV2ZWxzIC0gdGhpcyB3aWxsIGJlIHJlamVjdGVkIGJ5IHRoZQorICAgICAgICAgICAgLy8gY29kZWMgaWYgaXQgY2Fubm90IGhhbmRsZSBpdCBkdXJpbmcgY29uZmlndXJlCisgICAgICAgICAgICBzZXRQYXJhbVZpZGVvRW5jb2RlckxldmVsKEFDb2RlYzo6Z2V0QVZDTGV2ZWxGb3IoCisgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWVXaWR0aCwgdmlkZW9GcmFtZUhlaWdodCwgdmlkZW9GcmFtZVJhdGUsIHZpZGVvQml0UmF0ZSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldERlZmF1bHRWaWRlb0VuY29kZXJJZk5lY2Vzc2FyeSgpIHsKKyAgICBpZiAobVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX0RFRkFVTFQpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFZQOCBmb3IgV0VCTSByZWNvcmRpbmcKKyAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPSBWSURFT19FTkNPREVSX1ZQODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHBpY2sgdGhlIGRlZmF1bHQgZW5jb2RlciBmb3IgQ0FNQ09SREVSX1FVQUxJVFlfTE9XCisgICAgICAgICAgICBpbnQgdmlkZW9Db2RlYyA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgInZpZC5jb2RlYyIsIG1DYW1lcmFJZCwgQ0FNQ09SREVSX1FVQUxJVFlfTE9XKTsKKworICAgICAgICAgICAgaWYgKHZpZGVvQ29kZWMgPiBWSURFT19FTkNPREVSX0RFRkFVTFQgJiYKKyAgICAgICAgICAgICAgICB2aWRlb0NvZGVjIDwgVklERU9fRU5DT0RFUl9MSVNUX0VORCkgeworICAgICAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPSAodmlkZW9fZW5jb2Rlcil2aWRlb0NvZGVjOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIEguMjY0IGlmIGNhbWNvcmRlciBwcm9maWxlIG5vdCBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID0gVklERU9fRU5DT0RFUl9IMjY0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTI3Nyw0OSArMTM3NSwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICAqbWVkaWFTb3VyY2UgPSBjYW1lcmFTb3VyY2U7Ci0gICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0dSQUxMT0NfQlVGRkVSKSB7Ci0gICAgICAgIC8vIElmIHVzaW5nIEdSQWxsb2MgYnVmZmVycywgc2V0dXAgc3VyZmFjZW1lZGlhc291cmNlLgotICAgICAgICAvLyBMYXRlciBhIGhhbmRsZSB0byB0aGF0IHdpbGwgYmUgcGFzc2VkCi0gICAgICAgIC8vIHRvIHRoZSBjbGllbnQgc2lkZSB3aGVuIHF1ZXJpZWQKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAqbWVkaWFTb3VyY2UgPSBtU3VyZmFjZU1lZGlhU291cmNlOworICAgIH0gZWxzZSBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgICptZWRpYVNvdXJjZSA9IE5VTEw7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLS8vIHNldHVwU3VyZmFjZU1lZGlhU291cmNlIGNyZWF0ZXMgYSBzb3VyY2Ugd2l0aCB0aGUgZ2l2ZW4KLS8vIHdpZHRoIGFuZCBoZWlnaHQgYW5kIGZyYW1lcmF0ZS4KLS8vIFRPRE86IFRoaXMgY291bGQgZ28gaW4gYSBzdGF0aWMgZnVuY3Rpb24gaW5zaWRlIFN1cmZhY2VNZWRpYVNvdXJjZQotLy8gc2ltaWxhciB0byB0aGF0IGluIENhbWVyYVNvdXJjZQotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgbVN1cmZhY2VNZWRpYVNvdXJjZSA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7Ci0gICAgaWYgKG1TdXJmYWNlTWVkaWFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBpZiAobUZyYW1lUmF0ZSA9PSAtMSkgewotICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IDA7Ci0gICAgICAgIENIRUNLIChtU3VyZmFjZU1lZGlhU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlGcmFtZVJhdGUsICZmcmFtZVJhdGUpKTsKLSAgICAgICAgQUxPR0koIkZyYW1lIHJhdGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0LiBVc2UgdGhlIGN1cnJlbnQgZnJhbWUgIgotICAgICAgICAgICAgICJyYXRlICglZCBmcHMpIiwgZnJhbWVSYXRlKTsKLSAgICAgICAgbUZyYW1lUmF0ZSA9IGZyYW1lUmF0ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBtU3VyZmFjZU1lZGlhU291cmNlLT5zZXRGcmFtZVJhdGUobUZyYW1lUmF0ZSk7Ci0gICAgfQotICAgIENIRUNLKG1GcmFtZVJhdGUgIT0gLTEpOwotCi0gICAgbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyA9Ci0gICAgICAgIG1TdXJmYWNlTWVkaWFTb3VyY2UtPmlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKAogICAgICAgICBzcDxDYW1lcmFTb3VyY2U+ICpjYW1lcmFTb3VyY2UpIHsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKQEAgLTEzODMsMjUgKzE0NDYsMjYgQEAKIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCi0gICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSkgewogICAgIHNvdXJjZS0+Y2xlYXIoKTsKIAotICAgIHNwPE1ldGFEYXRhPiBlbmNfbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHZpZGVvQml0UmF0ZSk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlGcmFtZVJhdGUsIG1GcmFtZVJhdGUpOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKIAogICAgIHN3aXRjaCAobVZpZGVvRW5jb2RlcikgewogICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfSDI2MzoKLSAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX01QRUdfNF9TUDoKLSAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfSDI2NDoKLSAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9WUDg6CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMTQwOSw1OSArMTQ3Myw4MCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBjYW1lcmFTb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGlmIChjYW1lcmFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGNhbWVyYVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc2xpY2VIZWlnaHQsIGNvbG9yRm9ybWF0OwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZzdHJpZGUpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNsaWNlSGVpZ2h0LCAmc2xpY2VIZWlnaHQpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpKTsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNsaWNlSGVpZ2h0LCBjb2xvckZvcm1hdDsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAmc3RyaWRlKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZzbGljZUhlaWdodCkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpKTsKIAotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgbUlGcmFtZXNJbnRlcnZhbFNlYyk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTdHJpZGUsIHN0cmlkZSk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgc2xpY2VIZWlnaHQpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInN0cmlkZSIsIHN0cmlkZSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIHNsaWNlSGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgY29sb3JGb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgbVZpZGVvV2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBtVmlkZW9IZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzdHJpZGUiLCBtVmlkZW9XaWR0aCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIG1WaWRlb1dpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOworCisgICAgICAgIC8vIHNldCB1cCB0aW1lIGxhcHNlL3Nsb3cgbW90aW9uIGZvciBzdXJmYWNlIHNvdXJjZQorICAgICAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgICAgIGlmIChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgdmFsdWU6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoInRpbWUtbGFwc2UiLAorICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgbVZpZGVvQml0UmF0ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIG1GcmFtZVJhdGUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCBtSUZyYW1lc0ludGVydmFsU2VjKTsKKwogICAgIGlmIChtVmlkZW9UaW1lU2NhbGUgPiAwKSB7Ci0gICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtVmlkZW9UaW1lU2NhbGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ0aW1lLXNjYWxlIiwgbVZpZGVvVGltZVNjYWxlKTsKICAgICB9CiAgICAgaWYgKG1WaWRlb0VuY29kZXJQcm9maWxlICE9IC0xKSB7Ci0gICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBtVmlkZW9FbmNvZGVyUHJvZmlsZSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBtVmlkZW9FbmNvZGVyUHJvZmlsZSk7CiAgICAgfQogICAgIGlmIChtVmlkZW9FbmNvZGVyTGV2ZWwgIT0gLTEpIHsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBtVmlkZW9FbmNvZGVyTGV2ZWwpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIG1WaWRlb0VuY29kZXJMZXZlbCk7CiAgICAgfQogCi0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgdWludDMyX3QgZW5jb2Rlcl9mbGFncyA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgIGlmIChtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKSB7Ci0gICAgICAgIGVuY29kZXJfZmxhZ3MgfD0gT01YQ29kZWM6OmtTdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnM7CisgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWNTb3VyY2U6OkZMQUdfVVNFX01FVEFEQVRBX0lOUFVUOwogICAgIH0KIAotICAgIC8vIERvIG5vdCB3YWl0IGZvciBhbGwgdGhlIGlucHV0IGJ1ZmZlcnMgdG8gYmVjb21lIGF2YWlsYWJsZS4KLSAgICAvLyBUaGlzIGdpdmUgdGltZWxhcHNlIHZpZGVvIHJlY29yZGluZyBmYXN0ZXIgcmVzcG9uc2UgaW4KLSAgICAvLyByZWNlaXZpbmcgb3V0cHV0IGZyb20gdmlkZW8gZW5jb2RlciBjb21wb25lbnQuCi0gICAgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7Ci0gICAgICAgIGVuY29kZXJfZmxhZ3MgfD0gT01YQ29kZWM6OmtPbmx5U3VibWl0T25lSW5wdXRCdWZmZXJBdE9uZVRpbWU7CisgICAgaWYgKGNhbWVyYVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWNTb3VyY2U6OkZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQ7CiAgICAgfQogCi0gICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgY2xpZW50LmludGVyZmFjZSgpLCBlbmNfbWV0YSwKLSAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgY2FtZXJhU291cmNlLAotICAgICAgICAgICAgTlVMTCwgZW5jb2Rlcl9mbGFncyk7CisgICAgc3A8TWVkaWFDb2RlY1NvdXJjZT4gZW5jb2RlciA9CisgICAgICAgICAgICBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUobUxvb3BlciwgZm9ybWF0LCBjYW1lcmFTb3VyY2UsIGZsYWdzKTsKICAgICBpZiAoZW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBlbmNvZGVyIik7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHZpZGVvIGVuY29kZXIiKTsKICAgICAgICAgLy8gV2hlbiB0aGUgZW5jb2RlciBmYWlscyB0byBiZSBjcmVhdGVkLCB3ZSBuZWVkCiAgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNhbWVyYSBzb3VyY2UgZHVlIHRvIHRoZSBjYW1lcmEncyBsb2NrCiAgICAgICAgIC8vIGFuZCB1bmxvY2sgbWVjaGFuaXNtLgotICAgICAgICBjYW1lcmFTb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgaWYgKGNhbWVyYVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYW1lcmFTb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBpZiAoY2FtZXJhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgbUdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGVuY29kZXItPmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgIH0KKwogICAgICpzb3VyY2UgPSBlbmNvZGVyOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTQ5NSwxOCArMTU4MCwyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNFJlY29yZGluZygKLSAgICAgICAgaW50IG91dHB1dEZkLAotICAgICAgICBpbnQzMl90IHZpZGVvV2lkdGgsIGludDMyX3QgdmlkZW9IZWlnaHQsCi0gICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAotICAgICAgICBpbnQzMl90ICp0b3RhbEJpdFJhdGUsCi0gICAgICAgIHNwPE1lZGlhV3JpdGVyPiAqbWVkaWFXcml0ZXIpIHsKLSAgICBtZWRpYVdyaXRlci0+Y2xlYXIoKTsKLSAgICAqdG90YWxCaXRSYXRlID0gMDsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRvcldFQk1SZWNvcmRpbmcoKSB7CisgICAgbVdyaXRlci5jbGVhcigpOworICAgIG1Ub3RhbEJpdFJhdGUgPSAwOworCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihvdXRwdXRGZCk7CisgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlcjsKKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgd3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIobU91dHB1dEZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIobU91dHB1dEZkKTsKKyAgICB9CiAKICAgICBpZiAobVZpZGVvU291cmNlIDwgVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgICAgIHNldERlZmF1bHRWaWRlb0VuY29kZXJJZk5lY2Vzc2FyeSgpOwogCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKICAgICAgICAgZXJyID0gc2V0dXBNZWRpYVNvdXJjZSgmbWVkaWFTb3VyY2UpOwpAQCAtMTUxNSwzMSArMTYwMiwzNCBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXI7Ci0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCB2aWRlb0JpdFJhdGUsICZlbmNvZGVyKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsICZlbmNvZGVyKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCiAgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOwotICAgICAgICAqdG90YWxCaXRSYXRlICs9IHZpZGVvQml0UmF0ZTsKKyAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIC8vIEF1ZGlvIHNvdXJjZSBpcyBhZGRlZCBhdCB0aGUgZW5kIGlmIGl0IGV4aXN0cy4KLSAgICAvLyBUaGlzIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhlICJyZWNvZGluZyIgc291bmQgaXMgc3VwcHJlc3NlZCBmb3IKLSAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkpIHsKLSAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKLSAgICAgICAgKnRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgIH0KKyAgICBpZiAobU91dHB1dEZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgorICAgICAgICAvLyBUaGlzIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhlICJyZWNvZGluZyIgc291bmQgaXMgc3VwcHJlc3NlZCBmb3IKKyAgICAgICAgLy8gY2FtY29yZGVyIGFwcGxpY2F0aW9ucyBpbiB0aGUgcmVjb3JkZWQgZmlsZXMuCisgICAgICAgIC8vIFRPRE8gQXVkaW8gc291cmNlIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmb3Igd2VibSBvdXRwdXQ7IHZvcmJpcyBlbmNvZGVyIG5lZWRlZC4KKyAgICAgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSAmJiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpKSB7CisgICAgICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKKyAgICAgICAgfQogCi0gICAgaWYgKG1JbnRlcmxlYXZlRHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KLSAgICAgICAgICAgIHNldEludGVybGVhdmVEdXJhdGlvbihtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOwotICAgIH0KLSAgICBpZiAobUxvbmdpdHVkZXgxMDAwMCA+IC0zNjAwMDAwICYmIG1MYXRpdHVkZXgxMDAwMCA+IC0zNjAwMDAwKSB7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+Ci0gICAgICAgICAgICBzZXRHZW9EYXRhKG1MYXRpdHVkZXgxMDAwMCwgbUxvbmdpdHVkZXgxMDAwMCk7CisgICAgICAgIGlmIChtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPiAwKSB7CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgorICAgICAgICAgICAgICAgIHNldEludGVybGVhdmVEdXJhdGlvbihtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9uZ2l0dWRleDEwMDAwID4gLTM2MDAwMDAgJiYgbUxhdGl0dWRleDEwMDAwID4gLTM2MDAwMDApIHsKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CisgICAgICAgICAgICAgICAgc2V0R2VvRGF0YShtTGF0aXR1ZGV4MTAwMDAsIG1Mb25naXR1ZGV4MTAwMDApOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChtTWF4RmlsZUR1cmF0aW9uVXMgIT0gMCkgewogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihtTWF4RmlsZUR1cmF0aW9uVXMpOwpAQCAtMTU0Nyw1NCArMTYzNywzOSBAQAogICAgIGlmIChtTWF4RmlsZVNpemVCeXRlcyAhPSAwKSB7CiAgICAgICAgIHdyaXRlci0+c2V0TWF4RmlsZVNpemUobU1heEZpbGVTaXplQnl0ZXMpOwogICAgIH0KLQotICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFN0YXJ0VGltZU9mZnNldE1zKG1DYW1lcmFJZCk7CisgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfREVGQVVMVAorICAgICAgICAgICAgfHwgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9DQU1FUkEpIHsKKyAgICAgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0U3RhcnRUaW1lT2Zmc2V0TXMobUNhbWVyYUlkKTsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfU1VSRkFDRSkgeworICAgICAgICAvLyBzdXJmYWNlIHNvdXJjZSBkb2Vzbid0IG5lZWQgbGFyZ2UgaW5pdGlhbCBkZWxheQorICAgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSAyMDA7CisgICAgfQogICAgIGlmIChtU3RhcnRUaW1lT2Zmc2V0TXMgPiAwKSB7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+Ci0gICAgICAgICAgICBzZXRTdGFydFRpbWVPZmZzZXRNcyhtU3RhcnRUaW1lT2Zmc2V0TXMpOworICAgICAgICB3cml0ZXItPnNldFN0YXJ0VGltZU9mZnNldE1zKG1TdGFydFRpbWVPZmZzZXRNcyk7CiAgICAgfQogCiAgICAgd3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwotICAgICptZWRpYVdyaXRlciA9IHdyaXRlcjsKKyAgICBtV3JpdGVyID0gd3JpdGVyOwogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0TWV0YURhdGEoaW50NjRfdCBzdGFydFRpbWVVcywgaW50MzJfdCB0b3RhbEJpdFJhdGUsCi0gICAgICAgIHNwPE1ldGFEYXRhPiAqbWV0YSkgewordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0b3JXRUJNTWV0YURhdGEoc3A8TWV0YURhdGE+ICptZXRhKSB7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CiAgICAgKCptZXRhKS0+c2V0SW50NjQoa0tleVRpbWUsIHN0YXJ0VGltZVVzKTsKICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG1PdXRwdXRGb3JtYXQpOwotICAgICgqbWV0YSktPnNldEludDMyKGtLZXlCaXRSYXRlLCB0b3RhbEJpdFJhdGUpOwotICAgICgqbWV0YSktPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOworICAgICgqbWV0YSktPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVG90YWxCaXRSYXRlKTsKICAgICBpZiAobU1vdmllVGltZVNjYWxlID4gMCkgewogICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtTW92aWVUaW1lU2NhbGUpOwogICAgIH0KLSAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgKCptZXRhKS0+c2V0SW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOworICAgICAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgICgqbWV0YSktPnNldEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtUm90YXRpb25EZWdyZWVzICE9IDApIHsKKyAgICAgICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXlSb3RhdGlvbiwgbVJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1Sb3RhdGlvbkRlZ3JlZXMgIT0gMCkgewotICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIG1Sb3RhdGlvbkRlZ3JlZXMpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRNUEVHNFJlY29yZGluZygpIHsKLSAgICBpbnQzMl90IHRvdGFsQml0UmF0ZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE1QRUc0UmVjb3JkaW5nKAotICAgICAgICAgICAgbU91dHB1dEZkLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgbVZpZGVvQml0UmF0ZSwgJnRvdGFsQml0UmF0ZSwgJm1Xcml0ZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzZXR1cE1QRUc0TWV0YURhdGEoc3RhcnRUaW1lVXMsIHRvdGFsQml0UmF0ZSwgJm1ldGEpOwotCi0gICAgZXJyID0gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cGF1c2UoKSB7CkBAIC0xNjM2LDYgKzE3MTEsOCBAQAogICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CiAgICAgfQogCisgICAgbUdyYXBoaWNCdWZmZXJQcm9kdWNlci5jbGVhcigpOworCiAgICAgaWYgKG1PdXRwdXRGZCA+PSAwKSB7CiAgICAgICAgIDo6Y2xvc2UobU91dHB1dEZkKTsKICAgICAgICAgbU91dHB1dEZkID0gLTE7CkBAIC0xNjU1LDcgKzE3MzIsNiBAQAogICAgICAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwogICAgIH0KIAotCiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMTY3Nyw3ICsxNzUzLDcgQEAKICAgICAvLyBEZWZhdWx0IHBhcmFtZXRlcnMKICAgICBtT3V0cHV0Rm9ybWF0ICA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOwogICAgIG1BdWRpb0VuY29kZXIgID0gQVVESU9fRU5DT0RFUl9BTVJfTkI7Ci0gICAgbVZpZGVvRW5jb2RlciAgPSBWSURFT19FTkNPREVSX0gyNjM7CisgICAgbVZpZGVvRW5jb2RlciAgPSBWSURFT19FTkNPREVSX0RFRkFVTFQ7CiAgICAgbVZpZGVvV2lkdGggICAgPSAxNzY7CiAgICAgbVZpZGVvSGVpZ2h0ICAgPSAxNDQ7CiAgICAgbUZyYW1lUmF0ZSAgICAgPSAtMTsKQEAgLTE3MDcsNiArMTc4Myw3IEBACiAgICAgbVJvdGF0aW9uRGVncmVlcyA9IDA7CiAgICAgbUxhdGl0dWRleDEwMDAwID0gLTM2MDAwMDA7CiAgICAgbUxvbmdpdHVkZXgxMDAwMCA9IC0zNjAwMDAwOworICAgIG1Ub3RhbEJpdFJhdGUgPSAwOwogCiAgICAgbU91dHB1dEZkID0gLTE7CiAKQEAgLTE3NDcsMTUgKzE4MjQsMTUgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGaWxlIGZvcm1hdDogJWRcbiIsIG1PdXRwdXRGb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIHNpemUgKGJ5dGVzKTogJWxsZFxuIiwgbU1heEZpbGVTaXplQnl0ZXMpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgc2l6ZSAoYnl0ZXMpOiAlIiBQUklkNjQgIlxuIiwgbU1heEZpbGVTaXplQnl0ZXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIGR1cmF0aW9uICh1cyk6ICVsbGRcbiIsIG1NYXhGaWxlRHVyYXRpb25Vcyk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBkdXJhdGlvbiAodXMpOiAlIiBQUklkNjQgIlxuIiwgbU1heEZpbGVEdXJhdGlvblVzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGaWxlIG9mZnNldCBsZW5ndGggKGJpdHMpOiAlZFxuIiwgbVVzZTY0Qml0RmlsZU9mZnNldD8gNjQ6IDMyKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBJbnRlcmxlYXZlIGR1cmF0aW9uICh1cyk6ICVkXG4iLCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIFByb2dyZXNzIG5vdGlmaWNhdGlvbjogJWxsZCB1c1xuIiwgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBQcm9ncmVzcyBub3RpZmljYXRpb246ICUiIFBSSWQ2NCAiIHVzXG4iLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgQXVkaW9cbiIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCmluZGV4IDMxZjA5ZTAuLjU0YzM4ZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaApAQCAtMzcsNiArMzcsNyBAQAogY2xhc3MgTWVkaWFQcm9maWxlczsKIGNsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiBjbGFzcyBTdXJmYWNlTWVkaWFTb3VyY2U7CitjbGFzcyBBTG9vcGVyOwogCiBzdHJ1Y3QgU3RhZ2VmcmlnaHRSZWNvcmRlciA6IHB1YmxpYyBNZWRpYVJlY29yZGVyQmFzZSB7CiAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlcigpOwpAQCAtMTA2LDYgKzEwNyw3IEBACiAgICAgaW50MzJfdCBtTGF0aXR1ZGV4MTAwMDA7CiAgICAgaW50MzJfdCBtTG9uZ2l0dWRleDEwMDAwOwogICAgIGludDMyX3QgbVN0YXJ0VGltZU9mZnNldE1zOworICAgIGludDMyX3QgbVRvdGFsQml0UmF0ZTsKIAogICAgIGJvb2wgbUNhcHR1cmVUaW1lTGFwc2U7CiAgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKQEAgLTEyMiwyMiArMTI0LDE3IEBACiAgICAgLy8gQW4gPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHBvaW50ZXIKICAgICAvLyB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCBzaWRlIHVzaW5nIHdoaWNoIHRoZQogICAgIC8vIGZyYW1lIGJ1ZmZlcnMgd2lsbCBiZSBxdWV1ZWQgYW5kIGRlcXVldWVkCi0gICAgc3A8U3VyZmFjZU1lZGlhU291cmNlPiBtU3VyZmFjZU1lZGlhU291cmNlOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKIAotICAgIHN0YXR1c190IHNldHVwTVBFRzRSZWNvcmRpbmcoCi0gICAgICAgIGludCBvdXRwdXRGZCwKLSAgICAgICAgaW50MzJfdCB2aWRlb1dpZHRoLCBpbnQzMl90IHZpZGVvSGVpZ2h0LAotICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKLSAgICAgICAgaW50MzJfdCAqdG90YWxCaXRSYXRlLAotICAgICAgICBzcDxNZWRpYVdyaXRlcj4gKm1lZGlhV3JpdGVyKTsKLSAgICB2b2lkIHNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKTsKLSAgICBzdGF0dXNfdCBzdGFydE1QRUc0UmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRBTVJSZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydEFBQ1JlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydFJUUFJlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0TVBFRzJUU1JlY29yZGluZygpOworICAgIHN0YXR1c190IHByZXBhcmVJbnRlcm5hbCgpOworICAgIHN0YXR1c190IHNldHVwTVBFRzRvcldFQk1SZWNvcmRpbmcoKTsKKyAgICB2b2lkIHNldHVwTVBFRzRvcldFQk1NZXRhRGF0YShzcDxNZXRhRGF0YT4gKm1ldGEpOworICAgIHN0YXR1c190IHNldHVwQU1SUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBBQUNSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBSVFBSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKTsKICAgICBzcDxNZWRpYVNvdXJjZT4gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKICAgICBzdGF0dXNfdCBjaGVja1ZpZGVvRW5jb2RlckNhcGFiaWxpdGllcygKICAgICAgICAgICAgIGJvb2wgKnN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlKTsKQEAgLTE0NywxNCArMTQ0LDggQEAKICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHZpZGVvc291cmNlIHR5cGUKICAgICBzdGF0dXNfdCBzZXR1cE1lZGlhU291cmNlKHNwPE1lZGlhU291cmNlPiAqbWVkaWFTb3VyY2UpOwogICAgIHN0YXR1c190IHNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSk7Ci0gICAgLy8gc2V0dXAgdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBmb3IgdGhlIGVuY29kZXIKLSAgICBzdGF0dXNfdCBzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpOwotCiAgICAgc3RhdHVzX3Qgc2V0dXBBdWRpb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpOwotICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKAotICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwKLSAgICAgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAotICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpOworICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsIHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKIAogICAgIC8vIEVuY29kaW5nIHBhcmFtZXRlciBoYW5kbGluZyB1dGlsaXRpZXMKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CkBAIC0xODcsNiArMTc4LDcgQEAKICAgICB2b2lkIGNsaXBBdWRpb1NhbXBsZVJhdGUoKTsKICAgICB2b2lkIGNsaXBOdW1iZXJPZkF1ZGlvQ2hhbm5lbHMoKTsKICAgICB2b2lkIHNldERlZmF1bHRQcm9maWxlSWZOZWNlc3NhcnkoKTsKKyAgICB2b2lkIHNldERlZmF1bHRWaWRlb0VuY29kZXJJZk5lY2Vzc2FyeSgpOwogCiAKICAgICBTdGFnZWZyaWdodFJlY29yZGVyKGNvbnN0IFN0YWdlZnJpZ2h0UmVjb3JkZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcAppbmRleCA1ZDk3MjhhLi41Nzk1NzczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAKQEAgLTExMyw3ICsxMTMsOSBAQAogLy8gQ3JlYXRlIHRoZSB0ZXN0IHBsYXllci4KIC8vIENhbGwgc2V0RGF0YVNvdXJjZSBvbiB0aGUgdGVzdCBwbGF5ZXIgd2l0aCB0aGUgdXJsIGluIHBhcmFtLgogc3RhdHVzX3QgVGVzdFBsYXllclN0dWI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIGlmICghaXNUZXN0VXJsKHVybCkgfHwgTlVMTCAhPSBtSGFuZGxlKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0xNjIsNyArMTY0LDcgQEAKICAgICB9CiAKICAgICBtUGxheWVyID0gKCptTmV3UGxheWVyKSgpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKG1Db250ZW50VXJsLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgbUNvbnRlbnRVcmwsIGhlYWRlcnMpOwogfQogCiAvLyBJbnRlcm5hbCBjbGVhbnVwLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAppbmRleCBhMzgwMmViLi41NWJmMmM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaApAQCAtNjYsNyArNjYsOSBAQAogCiAgICAgLy8gQHBhcmFtIHVybCBTaG91bGQgYmUgYSB0ZXN0IHVybC4gU2VlIGNsYXNzIGNvbW1lbnQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgLy8gVGVzdCBwbGF5ZXIgZm9yIGEgZmlsZSBkZXNjcmlwdG9yIHNvdXJjZSBpcyBub3Qgc3VwcG9ydGVkLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQsIGludDY0X3QsIGludDY0X3QpICB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1ZjVmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApAQCAtMCwwICsxLDQ4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9GcmFtZVNjaGVkdWxlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KKyNpbmNsdWRlIDx1aS9EaXNwbGF5U3RhdEluZm8uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgIlZpZGVvRnJhbWVTY2hlZHVsZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUICpsaHMsIGNvbnN0IFQgKnJocykgeworICAgIGlmICgqbGhzIDwgKnJocykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICgqbGhzID4gKnJocykgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAvLyAyNSUKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgIC8vIDElCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IGtOYW5vc0luMXM7ICAgICAvLyAxIHNlYworc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IGtOYW5vc0luMXMgLyAxMjA7ICAgICAgICAgLy8gMTIwSHoKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtSZWZpdFJlZnJlc2hQZXJpb2QgPSAxMCAqIGtOYW5vc0luMXM7IC8vIDEwIHNlYworCitWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OlBMTCgpCisgICAgOiBtUGVyaW9kKC0xKSwKKyAgICAgIG1QaGFzZSgwKSwKKyAgICAgIG1QcmltZWQoZmFsc2UpLAorICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKKyAgICAgIG1MYXN0VGltZSgtMSksCisgICAgICBtTnVtU2FtcGxlcygwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXNldChmbG9hdCBmcHMpIHsKKyAgICAvL3Rlc3QoKTsKKworICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOworICAgIG1MYXN0VGltZSA9IC0xOworCisgICAgLy8gc2V0IHVwIG9yIHJlc2V0IHZpZGVvIFBMTAorICAgIGlmIChmcHMgPD0gMC5mKSB7CisgICAgICAgIG1QZXJpb2QgPSAtMTsKKyAgICAgICAgbVByaW1lZCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJyZXNldCBhdCAlLjFmIGZwcyIsIGZwcyk7CisgICAgICAgIG1QZXJpb2QgPSAobnNlY3NfdCkoMWU5IC8gZnBzICsgMC41KTsKKyAgICAgICAgbVByaW1lZCA9IHRydWU7CisgICAgfQorCisgICAgcmVzdGFydCgpOworfQorCisvLyByZXNldCBQTEwgYnV0IGtlZXAgcHJldmlvdXMgcGVyaW9kIGVzdGltYXRlCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzdGFydCgpIHsKKyAgICBtTnVtU2FtcGxlcyA9IDA7CisgICAgbVBoYXNlID0gLTE7Cit9CisKKyNpZiAwCisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjp0ZXN0KCkgeworICAgIG5zZWNzX3QgcGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOworICAgIG1UaW1lc1swXSA9IDA7CisgICAgbVRpbWVzWzFdID0gcGVyaW9kOworICAgIG1UaW1lc1syXSA9IHBlcmlvZCAqIDM7CisgICAgbVRpbWVzWzNdID0gcGVyaW9kICogNDsKKyAgICBtVGltZXNbNF0gPSBwZXJpb2QgKiA3OworICAgIG1UaW1lc1s1XSA9IHBlcmlvZCAqIDg7CisgICAgbVRpbWVzWzZdID0gcGVyaW9kICogMTA7CisgICAgbVRpbWVzWzddID0gcGVyaW9kICogMTI7CisgICAgbU51bVNhbXBsZXMgPSA4OworICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgIGZpdCgwLCBwZXJpb2QgKiAxMiAvIDcsIDgsICZhLCAmYiwgJmVycik7CisgICAgLy8gYSA9IDAuOCg1KSsKKyAgICAvLyBiID0gLTAuMTQwOTcoMikrCisgICAgLy8gZXJyID0gMC4yNzUwNTc4KDcwMykrCisgICAgQUxPR0QoImE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICAobG9uZyBsb25nKWEsIChhIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYiwgKGIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyllcnIsIChlcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKK30KKworI2VuZGlmCisKK2Jvb2wgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpmaXQoCisgICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorCisgICAgaW50NjRfdCBzdW1YID0gMDsKKyAgICBpbnQ2NF90IHN1bVhYID0gMDsKKyAgICBpbnQ2NF90IHN1bVhZID0gMDsKKyAgICBpbnQ2NF90IHN1bVlZID0gMDsKKyAgICBpbnQ2NF90IHN1bVkgPSAwOworCisgICAgaW50NjRfdCB4ID0gMDsgLy8geCB1c3VhbGx5IGlzIGluIFswLi5udW1TYW1wbGVzVG9Vc2UpCisgICAgbnNlY3NfdCBsYXN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBpeCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIHggKz0gZGl2Um91bmQodGltZSAtIGxhc3RUaW1lLCBwZXJpb2QpOworICAgICAgICB9CisgICAgICAgIC8vIHkgaXMgdXN1YWxseSBpbiBbLW51bVNhbXBsZXNUb1VzZS4ubnVtU2FtcGxlc1RvVXNlK2tSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZCkgPDwga1ByZWNpc2lvbgorICAgICAgICAvLyAgIGlkZWFsbHkgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSksIGJ1dCBzaGlmdGVkIGJ5IC1udW1TYW1wbGVzVG9Vc2UgZHVyaW5nCisgICAgICAgIC8vICAgcHJpbWluZywgYW5kIHBvc3NpYmx5IHNoaWZ0ZWQgYnkgdXAgdG8ga1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kCisgICAgICAgIC8vICAgd2hpbGUgd2UgYXJlIG5vdCByZWZpdHRpbmcuCisgICAgICAgIGludDY0X3QgeSA9IGRpdlJvdW5kKHRpbWUgLSBwaGFzZSwgcGVyaW9kID4+IGtQcmVjaXNpb24pOworICAgICAgICBzdW1YICs9IHg7CisgICAgICAgIHN1bVkgKz0geTsKKyAgICAgICAgc3VtWFggKz0geCAqIHg7CisgICAgICAgIHN1bVhZICs9IHggKiB5OworICAgICAgICBzdW1ZWSArPSB5ICogeTsKKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKworICAgIGludDY0X3QgZGl2ICAgPSBudW1TYW1wbGVzVG9Vc2UgKiBzdW1YWCAtIHN1bVggKiBzdW1YOworICAgIGlmIChkaXYgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBhX25vbSA9IG51bVNhbXBsZXNUb1VzZSAqIHN1bVhZIC0gc3VtWCAqIHN1bVk7CisgICAgaW50NjRfdCBiX25vbSA9IHN1bVhYICogc3VtWSAgICAgICAgICAgIC0gc3VtWCAqIHN1bVhZOworICAgICphID0gZGl2Um91bmQoYV9ub20sIGRpdik7CisgICAgKmIgPSBkaXZSb3VuZChiX25vbSwgZGl2KTsKKyAgICAvLyBkb24ndCB1c2UgYSBhbmQgYiBkaXJlY3RseSBhcyB0aGUgcm91bmRpbmcgZXJyb3IgaXMgc2lnbmlmaWNhbnQKKyAgICAqZXJyID0gc3VtWVkgLSBkaXZSb3VuZChhX25vbSAqIHN1bVhZICsgYl9ub20gKiBzdW1ZLCBkaXYpOworICAgIEFMT0dWKCJmaXR0aW5nWyV6dV0gYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmEsICAgKCphIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmIsICAgKCpiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmVyciwgKCplcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnByaW1lKHNpemVfdCBudW1TYW1wbGVzVG9Vc2UpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorICAgIENIRUNLKG51bVNhbXBsZXNUb1VzZSA+PSAzKTsgIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCAzIHNhbXBsZXMKKworICAgIC8vIGVzdGltYXRlIHZpZGVvIGZyYW1lcmF0ZSBmcm9tIGRlbHRhcyBiZXR3ZWVuIHRpbWVzdGFtcHMsIGFuZAorICAgIC8vIDJuZCBvcmRlciBkZWx0YXMKKyAgICBWZWN0b3I8bnNlY3NfdD4gZGVsdGFzOworICAgIG5zZWNzX3QgbGFzdFRpbWUsIGZpcnN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgKytpKSB7CisgICAgICAgIHNpemVfdCBpbmRleCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaW5kZXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIGlmICh0aW1lIC0gbGFzdFRpbWUgPiBrTWluUGVyaW9kKSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGE6ICVsbGQiLCAobG9uZyBsb25nKSh0aW1lIC0gbGFzdFRpbWUpKTsKKyAgICAgICAgICAgICAgICBkZWx0YXMucHVzaCh0aW1lIC0gbGFzdFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlyc3RUaW1lID0gdGltZTsKKyAgICAgICAgfQorICAgICAgICBsYXN0VGltZSA9IHRpbWU7CisgICAgfQorICAgIGRlbHRhcy5zb3J0KGNvbXBhcmU8bnNlY3NfdD4pOworICAgIHNpemVfdCBudW1EZWx0YXMgPSBkZWx0YXMuc2l6ZSgpOworICAgIGlmIChudW1EZWx0YXMgPiAxKSB7CisgICAgICAgIG5zZWNzX3QgZGVsdGFNaW5MaW1pdCA9IG1heChkZWx0YXNbMF0gLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2LCBrTWluUGVyaW9kKTsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1heExpbWl0ID0gZGVsdGFzW251bURlbHRhcyAvIDJdICoga011bHRpcGxlc1RocmVzaG9sZERpdjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG51bURlbHRhcyAvIDIgKyAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChkZWx0YXNbaV0gPiBkZWx0YU1heExpbWl0KSB7CisgICAgICAgICAgICAgICAgZGVsdGFzLnJlc2l6ZShpKTsKKyAgICAgICAgICAgICAgICBudW1EZWx0YXMgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEybmQgPSBkZWx0YXNbaV0gLSBkZWx0YXNbaSAtIDFdOworICAgICAgICAgICAgaWYgKGRlbHRhMm5kID49IGRlbHRhTWluTGltaXQpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTI6ICVsbGQiLCAobG9uZyBsb25nKShkZWx0YTJuZCkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKGRlbHRhMm5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVzZSB0aGUgb25lIHRoYXQgeWllbGRzIHRoZSBiZXN0IG1hdGNoCisgICAgaW50NjRfdCBiZXN0U2NvcmU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWx0YXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YSA9IGRlbHRhc1tpXTsKKyAgICAgICAgaW50NjRfdCBzY29yZSA9IDA7CisjaWYgMQorICAgICAgICAvLyBzaW1wbGVzdCBzY29yZTogbnVtYmVyIG9mIGRlbHRhcyB0aGF0IGFyZSBuZWFyIG11bHRpcGxlcworICAgICAgICBzaXplX3QgbWF0Y2hlcyA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGVsdGFzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICBuc2Vjc190IGVyciA9IHBlcmlvZGljRXJyb3IoZGVsdGFzW2pdLCBkZWx0YSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgZGVsdGEgLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2KSB7CisgICAgICAgICAgICAgICAgKyttYXRjaGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNjb3JlID0gbWF0Y2hlczsKKyNpZiAwCisgICAgICAgIC8vIGNvdWxkIGJlIHdlaWdoZWQgYnkgdGhlICgxIC0gbm9ybWFsaXplZCBlcnJvcikKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIGVyciA9ICgxIDw8ICgyICoga1ByZWNpc2lvbikpIC0gZXJyOworICAgICAgICAgICAgc2NvcmUgKj0gbWF4KDAsIGVycik7CisgICAgICAgIH0KKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgLy8gb3IgdXNlIHRoZSBlcnJvciBhcyBhIG5lZ2F0aXZlIHNjb3JlCisgICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7CisgICAgICAgICAgICBzY29yZSA9IC1kZWx0YSAqIGVycjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChpID09IDAgfHwgc2NvcmUgPiBiZXN0U2NvcmUpIHsKKyAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOworICAgICAgICAgICAgbVBlcmlvZCA9IGRlbHRhOworICAgICAgICAgICAgbVBoYXNlID0gZmlyc3RUaW1lOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJwcmltaW5nWyV6dV0gcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIG51bVNhbXBsZXNUb1VzZSwgbVBoYXNlLCBtUGVyaW9kKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmFkZFNhbXBsZShuc2Vjc190IHRpbWUpIHsKKyAgICBpZiAobUxhc3RUaW1lID49IDAKKyAgICAgICAgICAgIC8vIGlmIHRpbWUgZ29lcyBiYWNrd2FyZCwgb3Igd2Ugc2tpcHBlZCByZW5kZXJpbmcKKyAgICAgICAgICAgICYmICh0aW1lID4gbUxhc3RUaW1lICsga01heEFsbG93ZWRGcmFtZVNraXAgfHwgdGltZSA8IG1MYXN0VGltZSkpIHsKKyAgICAgICAgcmVzdGFydCgpOworICAgIH0KKworICAgIG1MYXN0VGltZSA9IHRpbWU7CisgICAgbVRpbWVzW21OdW1TYW1wbGVzICUga0hpc3RvcnlTaXplXSA9IHRpbWU7CisgICAgKyttTnVtU2FtcGxlczsKKworICAgIGJvb2wgZG9GaXQgPSB0aW1lID4gbVJlZml0QXQ7CisgICAgaWYgKChtUGVyaW9kIDw9IDAgfHwgIW1QcmltZWQpICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lKSB7CisgICAgICAgIHByaW1lKGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpOworICAgICAgICArK21TYW1wbGVzVXNlZEZvclByaW1pbmc7CisgICAgICAgIGRvRml0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1QZXJpb2QgPiAwICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICBpZiAobVBoYXNlIDwgMCkgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwaGFzZSB0byB0aGUgY3VycmVudCByZW5kZXIgdGltZQorICAgICAgICAgICAgbVBoYXNlID0gdGltZTsKKyAgICAgICAgICAgIGRvRml0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghZG9GaXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZXJyID0gcGVyaW9kaWNFcnJvcih0aW1lIC0gbVBoYXNlLCBtUGVyaW9kKTsKKyAgICAgICAgICAgIGRvRml0ID0gZXJyID4gbVBlcmlvZCAvIGtSZUZpdFRocmVzaG9sZERpdjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBpZiAoIWZpdChtUGhhc2UsIG1QZXJpb2QsIGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCwgJmEsICZiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgZml0dGluZy4gIHRoaXMgbWVhbnMgdGhleSBhcmUKKyAgICAgICAgICAgICAgICAvLyBhbHNvIG5vdCBzdWl0YWJsZSBmb3IgcHJpbWluZy4KKyAgICAgICAgICAgICAgICBBTE9HVigiY291bGQgbm90IGZpdCAtIGtlZXBpbmcgb2xkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGVyaW9kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVBlcmlvZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlZml0QXQgPSB0aW1lICsga1JlZml0UmVmcmVzaFBlcmlvZDsKKworICAgICAgICAgICAgbVBoYXNlICs9IChtUGVyaW9kICogYikgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIG1QZXJpb2QgPSAobVBlcmlvZCAqIGEpID4+IGtQcmVjaXNpb247CisgICAgICAgICAgICBBTE9HVigibmV3IHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKKworICAgICAgICAgICAgaWYgKGVyciA8IGtFcnJvclRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmICghbVByaW1lZCAmJiBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID49IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1QZXJpb2Q7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRWc3luY1BlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsgIC8vIDYwSHoKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYworCitWaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkKKyAgICA6IG1Wc3luY1RpbWUoMCksCisgICAgICBtVnN5bmNQZXJpb2QoMCksCisgICAgICBtVnN5bmNSZWZyZXNoQXQoMCksCisgICAgICBtTGFzdFZzeW5jVGltZSgtMSksCisgICAgICBtVGltZUNvcnJlY3Rpb24oMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnVwZGF0ZVZzeW5jKCkgeworICAgIG1Wc3luY1JlZnJlc2hBdCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSArIGtWc3luY1JlZnJlc2hQZXJpb2Q7CisgICAgbVZzeW5jUGVyaW9kID0gMDsKKyAgICBtVnN5bmNUaW1lID0gMDsKKworICAgIC8vIFRPRE86IHNjaGVkdWxlIGZyYW1lcyBmb3IgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UKKyAgICAvLyBGb3Igbm93LCBzdXJmYWNlIGZsaW5nZXIgb25seSBzY2hlZHVsZXMgZnJhbWVzIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkKKyAgICBpZiAobUNvbXBvc2VyID09IE5VTEwpIHsKKyAgICAgICAgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBtQ29tcG9zZXIgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZUNvbXBvc2VyPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICB9CisgICAgaWYgKG1Db21wb3NlciAhPSBOVUxMKSB7CisgICAgICAgIERpc3BsYXlTdGF0SW5mbyBzdGF0czsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbUNvbXBvc2VyLT5nZXREaXNwbGF5U3RhdHMoTlVMTCAvKiBkaXNwbGF5ICovLCAmc3RhdHMpOworICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICBBTE9HVigidnN5bmMgdGltZTolbGxkIHBlcmlvZDolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdGF0cy52c3luY1RpbWUsIChsb25nIGxvbmcpc3RhdHMudnN5bmNQZXJpb2QpOworICAgICAgICAgICAgbVZzeW5jVGltZSA9IHN0YXRzLnZzeW5jVGltZTsKKyAgICAgICAgICAgIG1Wc3luY1BlcmlvZCA9IHN0YXRzLnZzeW5jUGVyaW9kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImdldERpc3BsYXlTdGF0cyByZXR1cm5lZCAlZCIsIHJlcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCBzdXJmYWNlIG1Db21wb3NlciBzZXJ2aWNlIik7CisgICAgfQorfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OmluaXQoZmxvYXQgdmlkZW9GcHMpIHsKKyAgICB1cGRhdGVWc3luYygpOworCisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXNldCh2aWRlb0Zwcyk7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6cmVzdGFydCgpIHsKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc3RhcnQoKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpnZXRWc3luY1BlcmlvZCgpIHsKKyAgICBpZiAobVZzeW5jUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gbVZzeW5jUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4ga0RlZmF1bHRWc3luY1BlcmlvZDsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKKyAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7CisgICAgICAgIHVwZGF0ZVZzeW5jKCk7CisgICAgfQorCisgICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCisgICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQorICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKKyAgICAgICAgbVZzeW5jVGltZSAtPQorICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKKyAgICB9CisKKyAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCisgICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKKyAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisKKyAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKKyAgICAgICAgc2l6ZV90IE4gPSAxMjsKKyAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQorICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7CisgICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCisgICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCisgICAgICAgICAgICBOID0gMjA7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7CisgICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgeworICAgICAgICAgICAgb2Zmc2V0ICs9CisgICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyBOOworICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKKyAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKKyAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gTiAtIG1Wc3luY1BlcmlvZCAvIDIpOworICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7CisgICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKKyAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KKyAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7CisgICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7CisgICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7CisgICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQorICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7CisKKyAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgLS12c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID09IG1pblZzeW5jc1BlckZyYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCBhIFZTWU5DCisgICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgKz0gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgICAgICsrdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVRSQUNFX0lOVCgiRlJBTUVfVlNZTkNTIiwgdnN5bmNzRm9yTGFzdEZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdFZzeW5jVGltZSA9IG5leHRWc3luY1RpbWU7CisgICAgfQorCisgICAgLy8gYWxpZ24gcmVuZGVydGltZSB0byB0aGUgY2VudGVyIGJldHdlZW4gVlNZTkMgZWRnZXMKKyAgICByZW5kZXJUaW1lIC09IChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgIEFMT0dWKCJhZGp1c3RpbmcgcmVuZGVyOiAlbGxkID0+ICVsbGQiLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgIEFUUkFDRV9JTlQoIkZSQU1FX0ZMSVBfSU4obXMpIiwgKHJlbmRlclRpbWUgLSBub3cpIC8gMTAwMDAwMCk7CisgICAgcmV0dXJuIHJlbmRlclRpbWU7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6cmVsZWFzZSgpIHsKKyAgICBtQ29tcG9zZXIuY2xlYXIoKTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlcjo6flZpZGVvRnJhbWVTY2hlZHVsZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjI3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCisjZGVmaW5lIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBJU3VyZmFjZUNvbXBvc2VyOworCitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisKKyAgICAvLyAocmUpaW5pdGlhbGl6ZSBzY2hlZHVsZXIKKyAgICB2b2lkIGluaXQoZmxvYXQgdmlkZW9GcHMgPSAtMSk7CisgICAgLy8gdXNlIGluIGNhc2Ugb2YgdmlkZW8gcmVuZGVyLXRpbWUgZGlzY29udGludWl0eSwgZS5nLiBzZWVrCisgICAgdm9pZCByZXN0YXJ0KCk7CisgICAgLy8gZ2V0IGFkanVzdGVkIG5hbm90aW1lIGZvciBhIHZpZGVvIGZyYW1lIHJlbmRlciBhdCByZW5kZXJUaW1lCisgICAgbnNlY3NfdCBzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpOworCisgICAgLy8gcmV0dXJucyB0aGUgdnN5bmMgcGVyaW9kIGZvciB0aGUgbWFpbiBkaXNwbGF5CisgICAgbnNlY3NfdCBnZXRWc3luY1BlcmlvZCgpOworCisgICAgdm9pZCByZWxlYXNlKCk7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFBMTCB7CisgICAgICAgIFBMTCgpOworCisgICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCisgICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOworICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCisgICAgICAgIHZvaWQgcmVzdGFydCgpOworICAgICAgICAvLyByZXR1cm5zIHBlcmlvZAorICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbnNlY3NfdCBtUGVyaW9kOworICAgICAgICBuc2Vjc190IG1QaGFzZTsKKworICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCisgICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKworICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKKyAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAorCisgICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQorICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOworCisgICAgICAgIHZvaWQgdGVzdCgpOworICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOworICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKKyAgICB9OworCisgICAgdm9pZCB1cGRhdGVWc3luYygpOworCisgICAgbnNlY3NfdCBtVnN5bmNUaW1lOyAgICAgICAgLy8gdnN5bmMgdGltaW5nIGZyb20gZGlzcGxheQorICAgIG5zZWNzX3QgbVZzeW5jUGVyaW9kOworICAgIG5zZWNzX3QgbVZzeW5jUmVmcmVzaEF0OyAgIC8vIG5leHQgdGltZSB0byByZWZyZXNoIHRpbWluZyBpbmZvCisKKyAgICBuc2Vjc190IG1MYXN0VnN5bmNUaW1lOyAgICAvLyBlc3RpbWF0ZWQgdnN5bmMgdGltZSBmb3IgbGFzdCBmcmFtZQorICAgIG5zZWNzX3QgbVRpbWVDb3JyZWN0aW9uOyAgIC8vIHJ1bm5pbmcgYWRqdXN0bWVudAorCisgICAgUExMIG1QbGw7ICAgICAgICAgICAgICAgICAgLy8gUExMIGZvciB2aWRlbyBmcmFtZSByYXRlIGJhc2VkIG9uIHJlbmRlciB0aW1lCisKKyAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKaW5kZXggZjk0NmMxYy4uNjc2YzBhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKQEAgLTYsMTggKzYsMjAgQEAKICAgICAgICAgSFRUUExpdmVTb3VyY2UuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE51UGxheWVyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBOdVBsYXllckRlY29kZXIuY3BwICAgICAgICAgICAgIFwKKyAgICAgICAgTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwICBcCiAgICAgICAgIE51UGxheWVyRHJpdmVyLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBOdVBsYXllclJlbmRlcmVyLmNwcCAgICAgICAgICAgIFwKICAgICAgICAgTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAgICAgICBcCiAgICAgICAgIFJUU1BTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBTdHJlYW1pbmdTb3VyY2UuY3BwICAgICAgICAgICAgIFwKLSAgICAgICAgbXA0L01QNFNvdXJjZS5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCAgICAgICAgICAgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSAgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCBiMDRlN2E2Li5iNmYzYTlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0xNCwxMCArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiR2VuZXJpY1NvdXJjZSIKKwogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UuaCIKIAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yOCw1NyArMzIsMTU4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaCIKKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkdlbmVyaWNTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAogICAgICAgICBib29sIHVpZFZhbGlkLAogICAgICAgICB1aWRfdCB1aWQpCiAgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1EdXJhdGlvblVzKDBsbCksCi0gICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSkgeworICAgICAgbUF1ZGlvSXNWb3JiaXMoZmFsc2UpLAorICAgICAgbUlzV2lkZXZpbmUoZmFsc2UpLAorICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKKyAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAorICAgICAgbU1ldGFEYXRhU2l6ZSgtMWxsKSwKKyAgICAgIG1CaXRyYXRlKC0xbGwpLAorICAgICAgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKDApLAorICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMoMCkgeworICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmwsIGhlYWRlcnMpOwotICAgIENIRUNLKGRhdGFTb3VyY2UgIT0gTlVMTCk7Ci0KLSAgICBpbml0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CiB9CiAKLU51UGxheWVyOjpHZW5lcmljU291cmNlOjpHZW5lcmljU291cmNlKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi0gICAgOiBTb3VyY2Uobm90aWZ5KSwKLSAgICAgIG1EdXJhdGlvblVzKDBsbCksCi0gICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSkgewotICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZHVwKGZkKSwgb2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgaW5pdEZyb21EYXRhU291cmNlKGRhdGFTb3VyY2UpOwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVzZXREYXRhU291cmNlKCkgeworICAgIG1BdWRpb1RpbWVVcyA9IDA7CisgICAgbVZpZGVvVGltZVVzID0gMDsKKyAgICBtSFRUUFNlcnZpY2UuY2xlYXIoKTsKKyAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgIG1VcmkuY2xlYXIoKTsKKyAgICBtVXJpSGVhZGVycy5jbGVhcigpOworICAgIG1GZCA9IC0xOworICAgIG1PZmZzZXQgPSAwOworICAgIG1MZW5ndGggPSAwOworICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUT1AsIDApOworICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU3RvcFJlYWQgPSB0cnVlOwogfQogCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjppbml0RnJvbURhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKSB7Ci0gICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogCi0gICAgQ0hFQ0soZXh0cmFjdG9yICE9IE5VTEwpOworICAgIG1IVFRQU2VydmljZSA9IGh0dHBTZXJ2aWNlOworICAgIG1VcmkgPSB1cmw7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgKytpKSB7CisgICAgaWYgKGhlYWRlcnMpIHsKKyAgICAgICAgbVVyaUhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9CisKKyAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZworICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZXREYXRhU291cmNlKAorICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgbUZkID0gZHVwKGZkKTsKKyAgICBtT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1MZW5ndGggPSBsZW5ndGg7CisKKyAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZworICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlTWV0YTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmluaXRGcm9tRGF0YVNvdXJjZSgpIHsKKyAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yOworCisgICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCk7CisKKyAgICBpZiAobUlzV2lkZXZpbmUpIHsKKyAgICAgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICAgICAgZmxvYXQgY29uZmlkZW5jZTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGR1bW15OworICAgICAgICBib29sIHN1Y2Nlc3M7CisKKyAgICAgICAgc3VjY2VzcyA9IFNuaWZmV1ZNKG1EYXRhU291cmNlLCAmbWltZVR5cGUsICZjb25maWRlbmNlLCAmZHVtbXkpOworICAgICAgICBpZiAoIXN1Y2Nlc3MKKyAgICAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKAorICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZS5zdHJpbmcoKSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dWTSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCB3aWRldmluZSBtaW1lOiAlcyIsIG1pbWVUeXBlLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbVdWTUV4dHJhY3RvciA9IG5ldyBXVk1FeHRyYWN0b3IobURhdGFTb3VyY2UpOworICAgICAgICBtV1ZNRXh0cmFjdG9yLT5zZXRBZGFwdGl2ZVN0cmVhbWluZ01vZGUodHJ1ZSk7CisgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKKyAgICAgICAgICAgIG1XVk1FeHRyYWN0b3ItPnNldFVJRChtVUlEKTsKKyAgICAgICAgfQorICAgICAgICBleHRyYWN0b3IgPSBtV1ZNRXh0cmFjdG9yOworICAgIH0gZWxzZSB7CisgICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobURhdGFTb3VyY2UsCisgICAgICAgICAgICAgICAgbVNuaWZmZWRNSU1FLmVtcHR5KCkgPyBOVUxMOiBtU25pZmZlZE1JTUUuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChleHRyYWN0b3ItPmdldERybUZsYWcoKSkgeworICAgICAgICBjaGVja0RybVN0YXR1cyhtRGF0YVNvdXJjZSk7CisgICAgfQorCisgICAgbUZpbGVNZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworICAgIGlmIChtRmlsZU1ldGEgIT0gTlVMTCkgeworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgICAgICBpZiAobUZpbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CisgICAgICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCB0b3RhbEJpdHJhdGUgPSAwOworCisgICAgc2l6ZV90IG51bXRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBpZiAobnVtdHJhY2tzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgeworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworCiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gdHJhY2s7Ci0KKyAgICAgICAgLy8gRG8gdGhlIHN0cmluZyBjb21wYXJlIGltbWVkaWF0ZWx5IHdpdGggIm1pbWUiLAorICAgICAgICAvLyB3ZSBjYW4ndCBhc3N1bWUgIm1pbWUiIHdvdWxkIHN0YXkgdmFsaWQgYWZ0ZXIgYW5vdGhlcgorICAgICAgICAvLyBleHRyYWN0b3Igb3BlcmF0aW9uLCBzb21lIGV4dHJhY3RvcnMgbWlnaHQgbW9kaWZ5IG1ldGEKKyAgICAgICAgLy8gZHVyaW5nIGdldFRyYWNrKCkgYW5kIG1ha2UgaXQgaW52YWxpZC4KICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tU291cmNlID0gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subVNvdXJjZSA9IHRyYWNrOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1QYWNrZXRzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobUF1ZGlvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvSXNWb3JiaXMgPSB0cnVlOwpAQCAtODgsMzcgKzE5MywxNzUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CiAgICAgICAgICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVNvdXJjZSA9IHRyYWNrID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tSW5kZXggPSBpOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1Tb3VyY2UgPSB0cmFjazsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tUGFja2V0cyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1WaWRlb1RyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzb3VyY2UgcmVxdWlyZXMgc2VjdXJlIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNlY3VyZTsKKyAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlSZXF1aXJlc1NlY3VyZUJ1ZmZlcnMsICZzZWN1cmUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZWN1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlzV2lkZXZpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3ItPnNldFVJRChtVUlEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmICh0cmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICBtU291cmNlcy5wdXNoKHRyYWNrKTsKICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IG1EdXJhdGlvblVzKSB7CiAgICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgICAgIGlmICh0b3RhbEJpdHJhdGUgPj0gMCAmJiBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRyYXRlKSkgeworICAgICAgICAgICAgICAgIHRvdGFsQml0cmF0ZSArPSBiaXRyYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b3RhbEJpdHJhdGUgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1CaXRyYXRlID0gdG90YWxCaXRyYXRlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpjaGVja0RybVN0YXR1cyhjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSkgeworICAgIGRhdGFTb3VyY2UtPmdldERybUluZm8obURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOworICAgICAgICBpZiAoUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQgIT0gbURlY3J5cHRIYW5kbGUtPnN0YXR1cykgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RHJtTm9MaWNlbnNlKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgICAgICB9CiAgICAgfQogfQogCitpbnQ2NF90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRMYXN0UmVhZFBvc2l0aW9uKCkgeworICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1RpbWVVczsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVZpZGVvVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldEJ1ZmZlcnMoCisgICAgICAgIGJvb2wgYXVkaW8sIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmYnVmZmVycykgeworICAgIGlmIChtSXNXaWRldmluZSAmJiAhYXVkaW8pIHsKKyAgICAgICAgcmV0dXJuIG1WaWRlb1RyYWNrLm1Tb3VyY2UtPnNldEJ1ZmZlcnMoYnVmZmVycyk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6On5HZW5lcmljU291cmNlKCkgeworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ2VuZXJpYyIpOworICAgICAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCBpZCgpKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25QcmVwYXJlQXN5bmMoKSB7CisgICAgLy8gZGVsYXllZCBkYXRhIHNvdXJjZSBjcmVhdGlvbgorICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghbVVyaS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkgPSBtVXJpLmNfc3RyKCk7CisgICAgICAgICAgICBtSXNXaWRldmluZSA9ICFzdHJuY2FzZWNtcCh1cmksICJ3aWRldmluZTovLyIsIDExKTsKKworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykKKyAgICAgICAgICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUlzV2lkZXZpbmUpIHsKKyAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZU1lZGlhSFRUUChtSFRUUFNlcnZpY2UpOworICAgICAgICAgICAgICAgIGlmIChtSHR0cFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGh0dHAgc291cmNlISIpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmbUNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXQgdG8gZmFsc2UgZmlyc3QsIGlmIHRoZSBleHRyYWN0b3IKKyAgICAgICAgICAgIC8vIGNvbWVzIGJhY2sgYXMgc2VjdXJlLCBzZXQgaXQgdG8gdHJ1ZSB0aGVuLgorICAgICAgICAgICAgbUlzV2lkZXZpbmUgPSBmYWxzZTsKKworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShtRmQsIG1PZmZzZXQsIG1MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc1dpZGV2aW5lIHx8IG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGVjayBpbml0aWFsIGNhY2hpbmcgc3RhdHVzCisgICAgc3RhdHVzX3QgZXJyID0gcHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVBc3luYywgaWQoKSkpLT5wb3N0KDIwMDAwMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByZWZpbGwgZGF0YSBjYWNoZSEiKTsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdCBleHRyYXRvciBmcm9tIGRhdGEgc291cmNlCisgICAgZXJyID0gaW5pdEZyb21EYXRhU291cmNlKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBmcm9tIGRhdGEgc291cmNlISIpOworICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmIChtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQod2lkdGgsIGhlaWdodCk7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZG9HZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgZXJyID0gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpOworICAgICAgICBpZihlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQobXNnKTsKICAgICB9CiAKICAgICBub3RpZnlGbGFnc0NoYW5nZWQoCi0gICAgICAgICAgICBGTEFHX0NBTl9QQVVTRQorICAgICAgICAgICAgKG1Jc1dpZGV2aW5lID8gRkxBR19TRUNVUkUgOiAwKQorICAgICAgICAgICAgfCBGTEFHX0NBTl9QQVVTRQogICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJECiAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRAogICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLKTsKQEAgLTEyNiwzMyArMzY5LDQ3MCBAQAogICAgIG5vdGlmeVByZXBhcmVkKCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1NZXRhRGF0YVNpemUgPSAtMWxsOworICAgICAgICBtQ29udGVudFR5cGUgPSAiIjsKKyAgICAgICAgbVNuaWZmZWRNSU1FID0gIiI7CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICAgICAgICAgIHNwPE51Q2FjaGVkU291cmNlMj4gY2FjaGVkU291cmNlID0gbUNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURpc2Nvbm5lY3RMb2NrKTsKKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2FuY2VsUG9sbEJ1ZmZlcmluZygpOworICAgIH0KKyAgICBub3RpZnlQcmVwYXJlZChlcnIpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKSB7CisgICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCk7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIG5vIHByZWZpbGwgaWYgdGhlIGRhdGEgc291cmNlIGlzIG5vdCBjYWNoZWQKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIFdlJ3JlIG5vdCBkb2luZyB0aGlzIGZvciBzdHJlYW1zIHRoYXQgYXBwZWFyIHRvIGJlIGF1ZGlvLW9ubHkKKyAgICAvLyBzdHJlYW1zIHRvIGVuc3VyZSB0aGF0IGV2ZW4gbG93IGJhbmR3aWR0aCBzdHJlYW1zIHN0YXJ0CisgICAgLy8gcGxheWluZyBiYWNrIGZhaXJseSBpbnN0YW50bHkuCisgICAgaWYgKCFzdHJuY2FzZWNtcChtQ29udGVudFR5cGUuc3RyaW5nKCksICJhdWRpby8iLCA2KSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gV2UncmUgZ29pbmcgdG8gcHJlZmlsbCB0aGUgY2FjaGUgYmVmb3JlIHRyeWluZyB0byBpbnN0YW50aWF0ZQorICAgIC8vIHRoZSBleHRyYWN0b3IgYmVsb3csIGFzIHRoZSBsYXR0ZXIgaXMgYW4gb3BlcmF0aW9uIHRoYXQgb3RoZXJ3aXNlCisgICAgLy8gY291bGQgYmxvY2sgb24gdGhlIGRhdGFzb3VyY2UgZm9yIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUuCisgICAgLy8gRHVyaW5nIHRoYXQgdGltZSB3ZSdkIGJlIHVuYWJsZSB0byBhYm9ydCB0aGUgcHJlcGFyYXRpb24gcGhhc2UKKyAgICAvLyB3aXRob3V0IHRoaXMgcHJlZmlsbC4KKworICAgIC8vIEluaXRpYWxseSBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCAxOTIgS0IgZm9yIHRoZSBzbmlmZgorICAgIC8vIHRvIGNvbXBsZXRlIHdpdGhvdXQgYmxvY2tpbmcuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWluQnl0ZXNGb3JTbmlmZmluZyA9IDE5MiAqIDEwMjQ7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdE1ldGFTaXplID0gMjAwMDAwOworCisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7CisKKyAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9CisgICAgICAgICAgICBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7CisKKyAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0sgfHwgKG1NZXRhRGF0YVNpemUgPj0gMAorICAgICAgICAgICAgJiYgKG9mZjY0X3QpY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBtTWV0YURhdGFTaXplKSkgeworICAgICAgICBBTE9HVigic3RvcCBjYWNoaW5nLCBzdGF0dXMgJWQsICIKKyAgICAgICAgICAgICAgICAibWV0YURhdGFTaXplICVsbGQsIGNhY2hlZERhdGFSZW1haW5pbmcgJXp1IiwKKyAgICAgICAgICAgICAgICBmaW5hbFN0YXR1cywgbU1ldGFEYXRhU2l6ZSwgY2FjaGVkRGF0YVJlbWFpbmluZyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HVigibm93IGNhY2hlZCAlenUgYnl0ZXMgb2YgZGF0YSIsIGNhY2hlZERhdGFSZW1haW5pbmcpOworCisgICAgaWYgKG1NZXRhRGF0YVNpemUgPCAwCisgICAgICAgICAgICAmJiBjYWNoZWREYXRhUmVtYWluaW5nID49IGtNaW5CeXRlc0ZvclNuaWZmaW5nKSB7CisgICAgICAgIFN0cmluZzggdG1wOworICAgICAgICBmbG9hdCBjb25maWRlbmNlOworICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKKyAgICAgICAgaWYgKCFtQ2FjaGVkU291cmNlLT5zbmlmZigmdG1wLCAmY29uZmlkZW5jZSwgJm1ldGEpKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIHRoZSBmaWxlJ3MgZXh0cmFjdG9yIHRvCisgICAgICAgIC8vIGJlLCByZW1lbWJlciB0aGlzIG1pbWUgdHlwZSBzbyB3ZSBkb24ndCBoYXZlIHRvCisgICAgICAgIC8vIHNuaWZmIGl0IGFnYWluIHdoZW4gd2UgY2FsbCBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKCkKKyAgICAgICAgbVNuaWZmZWRNSU1FID0gdG1wLnN0cmluZygpOworCisgICAgICAgIGlmIChtZXRhID09IE5VTEwKKyAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KCJtZXRhLWRhdGEtc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDY0X3QqPigmbU1ldGFEYXRhU2l6ZSkpKSB7CisgICAgICAgICAgICBtTWV0YURhdGFTaXplID0ga0RlZmF1bHRNZXRhU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTWV0YURhdGFTaXplIDwgMGxsKSB7CisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBtZXRhRGF0YVNpemUgPSAlbGxkIGJ5dGVzIiwgbU1ldGFEYXRhU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtRUFHQUlOOworfQorCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzdGFydCgpIHsKICAgICBBTE9HSSgic3RhcnQiKTsKIAorICAgIG1TdG9wUmVhZCA9IGZhbHNlOwogICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvVHJhY2subVNvdXJjZS0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKIAotICAgICAgICBtQXVkaW9UcmFjay5tUGFja2V0cyA9Ci0gICAgICAgICAgICBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtQXVkaW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgcmVhZEJ1ZmZlcih0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7CiAgICAgfQogCiAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBDSEVDS19FUShtVmlkZW9UcmFjay5tU291cmNlLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzID0KLSAgICAgICAgICAgIG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1WaWRlb1RyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLQotICAgICAgICByZWFkQnVmZmVyKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CiAgICAgfQorCisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RBUlQsIGdldExhc3RSZWFkUG9zaXRpb24oKSAvIDEwMDApOworICAgIG1TdGFydGVkID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c3RvcCgpIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvLCBqdXN0IGFjY291bnQgZm9yIERSTSBwbGF5YmFjayBzdGF0dXMKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVE9QLCAwKTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIGlmIChtSXNXaWRldmluZSkgeworICAgICAgICAvLyBGb3IgYSB3aWRldmluZSBzb3VyY2Ugd2UgbmVlZCB0byBwcmV2ZW50IGFueSBmdXJ0aGVyIHJlYWRzLgorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcFdpZGV2aW5lLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgICAgICAodm9pZCkgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cGF1c2UoKSB7CisgICAgLy8gbm90aGluZyB0byBkbywganVzdCBhY2NvdW50IGZvciBEUk0gcGxheWJhY2sgc3RhdHVzCisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6UEFVU0UsIDApOworICAgIG1TdGFydGVkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnJlc3VtZSgpIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvLCBqdXN0IGFjY291bnQgZm9yIERSTSBwbGF5YmFjayBzdGF0dXMKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVEFSVCwgZ2V0TGFzdFJlYWRQb3NpdGlvbigpIC8gMTAwMCk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkaXNjb25uZWN0KCkgeworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UsIGh0dHBTb3VyY2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURpc2Nvbm5lY3RMb2NrKTsKKyAgICAgICAgZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOworICAgICAgICBodHRwU291cmNlID0gbUh0dHBTb3VyY2U7CisgICAgfQorCisgICAgaWYgKGRhdGFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBkaXNjb25uZWN0IGRhdGEgc291cmNlCisgICAgICAgIGlmIChkYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihkYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChodHRwU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4oaHR0cFNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgIH0KKyAgICBtU3VidGl0bGVUcmFjay5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpOworICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZmVlZE1vcmVUU0RhdGEoKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpjYW5jZWxQb2xsQnVmZmVyaW5nKCkgeworICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50IHBlcmNlbnRhZ2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gZHVwTm90aWZ5KCk7CisgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QnVmZmVyaW5nVXBkYXRlKTsKKyAgICBtc2ctPnNldEludDMyKCJwZXJjZW50YWdlIiwgcGVyY2VudGFnZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gMGxsOworCisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9CisgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworCisgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgb2ZmNjRfdCBzaXplOworICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlID0gMGxsOworICAgICAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMCAmJiBtQ2FjaGVkU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBzaXplICogODAwMDAwMGxsIC8gbUR1cmF0aW9uVXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1CaXRyYXRlID4gMCkgeworICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBtQml0cmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaXRyYXRlID4gMCkgeworICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVdWTUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIGNhY2hlZER1cmF0aW9uVXMKKyAgICAgICAgICAgID0gbVdWTUV4dHJhY3Rvci0+Z2V0Q2FjaGVkRHVyYXRpb25VcygmZmluYWxTdGF0dXMpOworICAgIH0KKworICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOworICAgICAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGNhY2hlZER1cmF0aW9uVXMgPiAwbGwgJiYgbUR1cmF0aW9uVXMgPiAwbGwpIHsKKyAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIGNhY2hlZER1cmF0aW9uVXMgLyBtRHVyYXRpb25VczsKKyAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKKyAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CisgICAgICAgIH0KKworICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUocGVyY2VudGFnZSk7CisgICAgfQorCisgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7Cit9CisKKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICBjYXNlIGtXaGF0UHJlcGFyZUFzeW5jOgorICAgICAgeworICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CisgICAgICB7CisgICAgICAgICAgZmV0Y2hUZXh0RGF0YShrV2hhdFNlbmRTdWJ0aXRsZURhdGEsIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uLCBtU3VidGl0bGVUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdEZldGNoVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBmZXRjaFRleHREYXRhKGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhULAorICAgICAgICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24sIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlbmRTdWJ0aXRsZURhdGE6CisgICAgICB7CisgICAgICAgICAgc2VuZFRleHREYXRhKGtXaGF0U3VidGl0bGVEYXRhLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFLAorICAgICAgICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwgbVN1YnRpdGxlVHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZW5kVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBzZW5kVGV4dERhdGEoa1doYXRUaW1lZFRleHREYXRhLCBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uLCBtVGltZWRUZXh0VHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRDaGFuZ2VBVlNvdXJjZToKKyAgICAgIHsKKyAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXg7CisgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtU291cmNlcy5pdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICAgICAgICBUcmFjayogdHJhY2s7CisgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgY291bnRlcnBhcnRUeXBlOworICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICAgICAgICB0cmFjayA9ICZtQXVkaW9UcmFjazsKKyAgICAgICAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICAgICAgICAgICAgY291bnRlcnBhcnRUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTzs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgQ0hFQ0soIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSk7CisgICAgICAgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOworICAgICAgICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgICAgICAgICAgICBjb3VudGVycGFydFR5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOzsKKyAgICAgICAgICB9CisKKworICAgICAgICAgIGlmICh0cmFjay0+bVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHRyYWNrLT5tU291cmNlID0gc291cmNlOworICAgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdGFydCgpOworICAgICAgICAgIHRyYWNrLT5tSW5kZXggPSB0cmFja0luZGV4OworCisgICAgICAgICAgc3RhdHVzX3QgYXZhaWw7CisgICAgICAgICAgaWYgKCF0cmFjay0+bVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmYXZhaWwpKSB7CisgICAgICAgICAgICAgIC8vIHN5bmMgZnJvbSBvdGhlciBzb3VyY2UKKyAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGFjdHVhbFRpbWVVczsKKyAgICAgICAgICBjb25zdCBib29sIGZvcm1hdENoYW5nZSA9IHRydWU7CisgICAgICAgICAgc3A8QU1lc3NhZ2U+IGxhdGVzdE1ldGEgPSB0cmFjay0+bVBhY2tldHMtPmdldExhdGVzdEVucXVldWVkTWV0YSgpOworICAgICAgICAgIENIRUNLKGxhdGVzdE1ldGEgIT0gTlVMTCAmJiBsYXRlc3RNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgICByZWFkQnVmZmVyKHRyYWNrVHlwZSwgdGltZVVzLCAmYWN0dWFsVGltZVVzLCBmb3JtYXRDaGFuZ2UpOworICAgICAgICAgIHJlYWRCdWZmZXIoY291bnRlcnBhcnRUeXBlLCAtMSwgTlVMTCwgZm9ybWF0Q2hhbmdlKTsKKyAgICAgICAgICBBTE9HVigidGltZVVzICVsbGQgYWN0dWFsVGltZVVzICVsbGQiLCB0aW1lVXMsIGFjdHVhbFRpbWVVcyk7CisKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgorICAgICAgeworICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgIG9uUG9sbEJ1ZmZlcmluZygpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdEdldEZvcm1hdDoKKyAgICAgIHsKKyAgICAgICAgICBvbkdldEZvcm1hdE1ldGEobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CisgICAgICB7CisgICAgICAgICAgb25HZXRTZWxlY3RlZFRyYWNrKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZWxlY3RUcmFjazoKKyAgICAgIHsKKyAgICAgICAgICBvblNlbGVjdFRyYWNrKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZWVrOgorICAgICAgeworICAgICAgICAgIG9uU2Vlayhtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0UmVhZEJ1ZmZlcjoKKyAgICAgIHsKKyAgICAgICAgICBvblJlYWRCdWZmZXIobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFN0b3BXaWRldmluZToKKyAgICAgIHsKKyAgICAgICAgICAvLyBtU3RvcFJlYWQgaXMgb25seSB1c2VkIGZvciBXaWRldmluZSB0byBwcmV2ZW50IHRoZSB2aWRlbyBzb3VyY2UKKyAgICAgICAgICAvLyBmcm9tIGJlaW5nIHJlYWQgd2hpbGUgdGhlIGFzc29jaWF0ZWQgdmlkZW8gZGVjb2RlciBpcyBzaHV0dGluZyBkb3duLgorICAgICAgICAgIG1TdG9wUmVhZCA9IHRydWU7CisgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICAgIFNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmZldGNoVGV4dERhdGEoCisgICAgICAgIHVpbnQzMl90IHNlbmRXaGF0LAorICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRzLAorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCBtc2dHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJm1zZ0dlbmVyYXRpb24pKTsKKyAgICBpZiAobXNnR2VuZXJhdGlvbiAhPSBjdXJHZW4pIHsKKyAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgYXZhaWw7CisgICAgaWYgKHBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmYXZhaWwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaW50NjRfdCBzdWJUaW1lVXM7CisgICAgcmVhZEJ1ZmZlcih0eXBlLCB0aW1lVXMsICZzdWJUaW1lVXMpOworCisgICAgaW50NjRfdCBkZWxheVVzID0gc3ViVGltZVVzIC0gdGltZVVzOworICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdEZldGNoU3VidGl0bGVEYXRhKSB7CisgICAgICAgIGNvbnN0IGludDY0X3Qgb25lU2VjVXMgPSAxMDAwMDAwbGw7CisgICAgICAgIGRlbGF5VXMgLT0gb25lU2VjVXM7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBtc2cyID0gbmV3IEFNZXNzYWdlKHNlbmRXaGF0LCBpZCgpKTsKKyAgICBtc2cyLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1zZ0dlbmVyYXRpb24pOworICAgIG1zZzItPnBvc3QoZGVsYXlVcyA8IDAgPyAwIDogZGVsYXlVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNlbmRUZXh0RGF0YSgKKyAgICAgICAgdWludDMyX3Qgd2hhdCwKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICBpbnQzMl90IGN1ckdlbiwKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0cywKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDMyX3QgbXNnR2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZtc2dHZW5lcmF0aW9uKSk7CisgICAgaWYgKG1zZ0dlbmVyYXRpb24gIT0gY3VyR2VuKSB7CisgICAgICAgIC8vIHN0YWxlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN1YlRpbWVVczsKKyAgICBpZiAocGFja2V0cy0+bmV4dEJ1ZmZlclRpbWUoJnN1YlRpbWVVcykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgbmV4dFN1YlRpbWVVczsKKyAgICByZWFkQnVmZmVyKHR5cGUsIC0xLCAmbmV4dFN1YlRpbWVVcyk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgc3RhdHVzX3QgZGVxdWV1ZVN0YXR1cyA9IHBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgIGlmIChkZXF1ZXVlU3RhdHVzID09IE9LKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHdoYXQpOworICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgY29uc3QgaW50NjRfdCBkZWxheVVzID0gbmV4dFN1YlRpbWVVcyAtIHN1YlRpbWVVczsKKyAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPCAwID8gMCA6IGRlbGF5VXMpOworICAgIH0KK30KKwogc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0Rm9ybWF0LCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICB2b2lkICpmb3JtYXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZFBvaW50ZXIoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIChNZXRhRGF0YSAqKWZvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uR2V0Rm9ybWF0TWV0YShzcDxBTWVzc2FnZT4gbXNnKSBjb25zdCB7CisgICAgaW50MzJfdCBhdWRpbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gZG9HZXRGb3JtYXRNZXRhKGF1ZGlvKTsKKyAgICByZXNwb25zZS0+c2V0UG9pbnRlcigiZm9ybWF0IiwgZm9ybWF0LmdldCgpKTsKKworICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9HZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIGNvbnN0IHsKICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gYXVkaW8gPyBtQXVkaW9UcmFjay5tU291cmNlIDogbVZpZGVvVHJhY2subVNvdXJjZTsKIAogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewpAQCAtMTcwLDE0ICs4NTAsNTMgQEAKICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICB9CiAKKyAgICBpZiAobUlzV2lkZXZpbmUgJiYgIWF1ZGlvKSB7CisgICAgICAgIC8vIHRyeSB0byByZWFkIGEgYnVmZmVyIGFzIHdlIG1heSBub3QgaGF2ZSBiZWVuIGFibGUgdG8gdGhlIGxhc3QgdGltZQorICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICB9CisKICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKICAgICBpZiAoIXRyYWNrLT5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKLSAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0ID09IE9LID8gLUVXT1VMREJMT0NLIDogZmluYWxSZXN1bHQ7CisgICAgICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT0gT0sgPyAtRVdPVUxEQkxPQ0sgOiBmaW5hbFJlc3VsdCk7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdHJhY2stPm1QYWNrZXRzLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKIAotICAgIHJlYWRCdWZmZXIoYXVkaW8sIC0xbGwpOworICAgIGlmICghdHJhY2stPm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihhdWRpbz8gTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA6IE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgIH0KKworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaW1lZFRleHRUcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBzdGF0dXNfdCBlb3NSZXN1bHQ7IC8vIGlnbm9yZWQKKyAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTAorICAgICAgICAgICAgJiYgIW1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24pOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTAorICAgICAgICAgICAgJiYgIW1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFRpbWVkVGV4dERhdGEsIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24pOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTg3LDI1ICs5MDYsMzg3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Tb3VyY2VzLnNpemUoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1Tb3VyY2VzLnNpemUoKTsKKyAgICBpZiAodHJhY2tJbmRleCA+PSB0cmFja0NvdW50KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2VzLml0ZW1BdCh0cmFja0luZGV4KS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIGludDMyX3QgdHJhY2tUeXBlOworICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTjsKKyAgICB9CisgICAgZm9ybWF0LT5zZXRJbnQzMigidHlwZSIsIHRyYWNrVHlwZSk7CisKKyAgICBjb25zdCBjaGFyICpsYW5nOworICAgIGlmICghbWV0YS0+ZmluZENTdHJpbmcoa0tleU1lZGlhTGFuZ3VhZ2UsICZsYW5nKSkgeworICAgICAgICBsYW5nID0gInVuZCI7CisgICAgfQorICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsIGxhbmcpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7CisKKyAgICAgICAgaW50MzJfdCBpc0F1dG9zZWxlY3QgPSAxLCBpc0RlZmF1bHQgPSAwLCBpc0ZvcmNlZCA9IDA7CisgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0F1dG9zZWxlY3QsICZpc0F1dG9zZWxlY3QpOworICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAmaXNEZWZhdWx0KTsKKyAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lzRm9yY2VkLCAmaXNGb3JjZWQpOworCisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImF1dG8iLCAhIWlzQXV0b3NlbGVjdCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImRlZmF1bHQiLCAhIWlzRGVmYXVsdCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImZvcmNlZCIsICEhaXNGb3JjZWQpOworICAgIH0KKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3NzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFNlbGVjdGVkVHJhY2ssIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBpbnQzMl90IGluZGV4OworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uR2V0U2VsZWN0ZWRUcmFjayhzcDxBTWVzc2FnZT4gbXNnKSBjb25zdCB7CisgICAgaW50MzJfdCB0bXBUeXBlOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgJnRtcFR5cGUpKTsKKyAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0bXBUeXBlOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHNzaXplX3QgaW5kZXggPSBkb0dldFNlbGVjdGVkVHJhY2sodHlwZSk7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKKworICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3NzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvR2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBjb25zdCBUcmFjayAqdHJhY2sgPSBOVUxMOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6CisgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHRyYWNrICE9IE5VTEwgJiYgdHJhY2stPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHJhY2stPm1JbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBBTE9HVigiJXMgdHJhY2s6ICV6dSIsIHNlbGVjdCA/ICJzZWxlY3QiIDogImRlc2VsZWN0IiwgdHJhY2tJbmRleCk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CisgICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblNlbGVjdFRyYWNrKHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBpbnQzMl90IHRyYWNrSW5kZXgsIHNlbGVjdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBkb1NlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCk7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworCisgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvU2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgaWYgKHRyYWNrSW5kZXggPj0gbVNvdXJjZXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKCFzZWxlY3QpIHsKKyAgICAgICAgVHJhY2sqIHRyYWNrID0gTlVMTDsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFja0luZGV4ID09IG1TdWJ0aXRsZVRyYWNrLm1JbmRleCkgeworICAgICAgICAgICAgdHJhY2sgPSAmbVN1YnRpdGxlVHJhY2s7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0gZWxzZSBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFja0luZGV4ID09IG1UaW1lZFRleHRUcmFjay5tSW5kZXgpIHsKKyAgICAgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RvcCgpOworICAgICAgICB0cmFjay0+bVNvdXJjZSA9IE5VTEw7CisgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtU291cmNlcy5pdGVtQXQodHJhY2tJbmRleCk7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInRleHQvIiwgNSkpIHsKKyAgICAgICAgYm9vbCBpc1N1YnRpdGxlID0gc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICBUcmFjayAqdHJhY2sgPSBpc1N1YnRpdGxlID8gJm1TdWJ0aXRsZVRyYWNrIDogJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgaWYgKHRyYWNrLT5tU291cmNlICE9IE5VTEwgJiYgdHJhY2stPm1JbmRleCA9PSB0cmFja0luZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPm1JbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgIGlmICh0cmFjay0+bVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RvcCgpOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5tU291cmNlID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpOworICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZSh0cmFjay0+bVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5zZXRGb3JtYXQodHJhY2stPm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3VidGl0bGUpIHsKKyAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpIHx8ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgYm9vbCBhdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisgICAgICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOworICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFjay0+bUluZGV4ID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VBVlNvdXJjZSwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOworICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblNlZWsoc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic2Vla1RpbWVVcyIsICZzZWVrVGltZVVzKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3RhdHVzX3QgZXJyID0gZG9TZWVrKHNlZWtUaW1lVXMpOworICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKworICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgLy8gSWYgdGhlIFdpZGV2aW5lIHNvdXJjZSBpcyBzdG9wcGVkLCBkbyBub3QgYXR0ZW1wdCB0byByZWFkIGFueQorICAgIC8vIG1vcmUgYnVmZmVycy4KKyAgICBpZiAobVN0b3BSZWFkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBpbnQ2NF90IGFjdHVhbFRpbWVVczsKLSAgICAgICAgcmVhZEJ1ZmZlcihmYWxzZSAvKiBhdWRpbyAqLywgc2Vla1RpbWVVcywgJmFjdHVhbFRpbWVVcyk7CisgICAgICAgIHJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTywgc2Vla1RpbWVVcywgJmFjdHVhbFRpbWVVcyk7CiAKICAgICAgICAgc2Vla1RpbWVVcyA9IGFjdHVhbFRpbWVVczsKICAgICB9CiAKICAgICBpZiAobUF1ZGlvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlYWRCdWZmZXIodHJ1ZSAvKiBhdWRpbyAqLywgc2Vla1RpbWVVcyk7CisgICAgICAgIHJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTywgc2Vla1RpbWVVcyk7CiAgICAgfQogCisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RBUlQsIHNlZWtUaW1lVXMgLyAxMDAwKTsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlBBVVNFLCAwKTsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCitzcDxBQnVmZmVyPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6bWVkaWFCdWZmZXJUb0FCdWZmZXIoCisgICAgICAgIE1lZGlhQnVmZmVyKiBtYiwKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsCisgICAgICAgIGludDY0X3QgKmFjdHVhbFRpbWVVcykgeworICAgIGJvb2wgYXVkaW8gPSB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICBzaXplX3Qgb3V0TGVuZ3RoID0gbWItPnJhbmdlX2xlbmd0aCgpOworCisgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7CisgICAgICAgIG91dExlbmd0aCArPSBzaXplb2YoaW50MzJfdCk7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWI7CisgICAgaWYgKG1Jc1dpZGV2aW5lICYmICFhdWRpbykgeworICAgICAgICAvLyBkYXRhIGlzIGFscmVhZHkgcHJvdmlkZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBhYiA9IG5ldyBBQnVmZmVyKE5VTEwsIG1iLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIG1iLT5hZGRfcmVmKCk7CisgICAgICAgIGFiLT5zZXRNZWRpYUJ1ZmZlckJhc2UobWIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFiID0gbmV3IEFCdWZmZXIob3V0TGVuZ3RoKTsKKyAgICAgICAgbWVtY3B5KGFiLT5kYXRhKCksCisgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1iLT5kYXRhKCkgKyBtYi0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICBtYi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIH0KKworICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgeworICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOworICAgICAgICBpZiAoIW1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKKyAgICAgICAgICAgIG51bVBhZ2VTYW1wbGVzID0gLTE7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBhYkVuZCA9IGFiLT5kYXRhKCkgKyBtYi0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIG1lbWNweShhYkVuZCwgJm51bVBhZ2VTYW1wbGVzLCBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IGFiLT5tZXRhKCk7CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtYi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIG1ldGEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgbVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgIG1ldGEtPnNldFN0cmluZygibWltZSIsIG1pbWUpOworICAgIH0KKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCBkdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCBtU3VidGl0bGVUcmFjay5tSW5kZXgpOworICAgIH0KKworICAgIGlmIChhY3R1YWxUaW1lVXMpIHsKKyAgICAgICAgKmFjdHVhbFRpbWVVcyA9IHRpbWVVczsKKyAgICB9CisKKyAgICBtYi0+cmVsZWFzZSgpOworICAgIG1iID0gTlVMTDsKKworICAgIHJldHVybiBhYjsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cG9zdFJlYWRCdWZmZXIobWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVJlYWRCdWZmZXJMb2NrKTsKKworICAgIGlmICgobVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJiAoMSA8PCB0cmFja1R5cGUpKSA9PSAwKSB7CisgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzIHw9ICgxIDw8IHRyYWNrVHlwZSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tUeXBlIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblJlYWRCdWZmZXIoc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDMyX3QgdG1wVHlwZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tUeXBlIiwgJnRtcFR5cGUpKTsKKyAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSA9IChtZWRpYV90cmFja190eXBlKXRtcFR5cGU7CisgICAgeworICAgICAgICAvLyBvbmx5IHByb3RlY3QgdGhlIHZhcmlhYmxlIGNoYW5nZSwgYXMgcmVhZEJ1ZmZlciBtYXkKKyAgICAgICAgLy8gdGFrZSBjb25zaWRlcmFibGUgdGltZS4gIFRoaXMgbWF5IHJlc3VsdCBpbiBvbmUgZXh0cmEKKyAgICAgICAgLy8gcmVhZCBiZWluZyBwcm9jZXNzZWQsIGJ1dCB0aGF0IGlzIGJlbmlnbi4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1SZWFkQnVmZmVyTG9jayk7CisgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzICY9IH4oMSA8PCB0cmFja1R5cGUpOworICAgIH0KKyAgICByZWFkQnVmZmVyKHRyYWNrVHlwZSk7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnJlYWRCdWZmZXIoCi0gICAgICAgIGJvb2wgYXVkaW8sIGludDY0X3Qgc2Vla1RpbWVVcywgaW50NjRfdCAqYWN0dWFsVGltZVVzKSB7Ci0gICAgVHJhY2sgKnRyYWNrID0gYXVkaW8gPyAmbUF1ZGlvVHJhY2sgOiAmbVZpZGVvVHJhY2s7Ci0gICAgQ0hFQ0sodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCk7CisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBpbnQ2NF90IHNlZWtUaW1lVXMsIGludDY0X3QgKmFjdHVhbFRpbWVVcywgYm9vbCBmb3JtYXRDaGFuZ2UpIHsKKyAgICAvLyBEbyBub3QgcmVhZCBkYXRhIGlmIFdpZGV2aW5lIHNvdXJjZSBpcyBzdG9wcGVkCisgICAgaWYgKG1TdG9wUmVhZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFRyYWNrICp0cmFjazsKKyAgICBzaXplX3QgbWF4QnVmZmVycyA9IDE7CisgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKKyAgICAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOgorICAgICAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CisgICAgICAgICAgICBpZiAobUlzV2lkZXZpbmUpIHsKKyAgICAgICAgICAgICAgICBtYXhCdWZmZXJzID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgICAgICB0cmFjayA9ICZtQXVkaW9UcmFjazsKKyAgICAgICAgICAgIGlmIChtSXNXaWRldmluZSkgeworICAgICAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXhCdWZmZXJzID0gNjQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICAgICAgdHJhY2sgPSAmbVN1YnRpdGxlVHJhY2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDoKKyAgICAgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgaWYgKGFjdHVhbFRpbWVVcykgewogICAgICAgICAqYWN0dWFsVGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTIxNiw2NCArMTI5Nyw1NiBAQAogICAgIGJvb2wgc2Vla2luZyA9IGZhbHNlOwogCiAgICAgaWYgKHNlZWtUaW1lVXMgPj0gMCkgewotICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzKTsKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oc2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwogICAgICAgICBzZWVraW5nID0gdHJ1ZTsKICAgICB9CiAKLSAgICBmb3IgKDs7KSB7CisgICAgaWYgKG1Jc1dpZGV2aW5lICYmIHRyYWNrVHlwZSAhPSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgIG9wdGlvbnMuc2V0Tm9uQmxvY2tpbmcoKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBudW1CdWZmZXJzID0gMDsgbnVtQnVmZmVycyA8IG1heEJ1ZmZlcnM7ICkgewogICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZjsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gdHJhY2stPm1Tb3VyY2UtPnJlYWQoJm1idWYsICZvcHRpb25zKTsKIAogICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgc2l6ZV90IG91dExlbmd0aCA9IG1idWYtPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgICAgICAgICBpZiAoYXVkaW8gJiYgbUF1ZGlvSXNWb3JiaXMpIHsKLSAgICAgICAgICAgICAgICBvdXRMZW5ndGggKz0gc2l6ZW9mKGludDMyX3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihvdXRMZW5ndGgpOwotCi0gICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICBtYnVmLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgewotICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7Ci0gICAgICAgICAgICAgICAgaWYgKCFtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtUGFnZVNhbXBsZXMgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgJm51bVBhZ2VTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgICAgICBDSEVDSyhtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKLQotICAgICAgICAgICAgaWYgKGFjdHVhbFRpbWVVcykgewotICAgICAgICAgICAgICAgICphY3R1YWxUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9UaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtYnVmID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKHNlZWtpbmcpIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlRGlzY29udGludWl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLCBOVUxMKTsKKyAgICAgICAgICAgIC8vIGZvcm1hdENoYW5nZSAmJiBzZWVraW5nOiB0cmFjayB3aG9zZSBzb3VyY2UgaXMgY2hhbmdlZCBkdXJpbmcgc2VsZWN0aW9uCisgICAgICAgICAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgIXNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBub3QgY2hhbmdlZCBkdXJpbmcgc2VsZWN0aW9uCisgICAgICAgICAgICAvLyAhZm9ybWF0Q2hhbmdlOiBub3JtYWwgc2VlaworICAgICAgICAgICAgaWYgKChzZWVraW5nIHx8IGZvcm1hdENoYW5nZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPCisgICAgICAgICAgICAgICAgICAgIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSkgeworICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSA9IGZvcm1hdENoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgPyAoc2Vla2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUs7CisgICAgICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkoIHR5cGUsIE5VTEwsIHRydWUgLyogZGlzY2FyZCAqLyk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1lZGlhQnVmZmVyVG9BQnVmZmVyKG1idWYsIHRyYWNrVHlwZSwgYWN0dWFsVGltZVVzKTsKICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVBY2Nlc3NVbml0KGJ1ZmZlcik7CisgICAgICAgICAgICBmb3JtYXRDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHNlZWtpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICsrbnVtQnVmZmVyczsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CiAjaWYgMAogICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkaXNjYXJkICovKTsKICNlbmRpZgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5zaWduYWxFT1MoZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCmluZGV4IDJkYTY4MGMuLjFiNjgyODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaApAQCAtMjMsNTggKzIzLDE3NiBAQAogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIERlY3J5cHRIYW5kbGU7CitjbGFzcyBEcm1NYW5hZ2VyQ2xpZW50Owogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBzdHJ1Y3QgQVJUU1BDb250cm9sbGVyOwogc3RydWN0IERhdGFTb3VyY2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKK3N0cnVjdCBOdUNhY2hlZFNvdXJjZTI7CitzdHJ1Y3QgV1ZNRXh0cmFjdG9yOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSB7Ci0gICAgR2VuZXJpY1NvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCi0gICAgICAgICAgICB1aWRfdCB1aWQgPSAwKTsKKyAgICBHZW5lcmljU291cmNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpOwogCi0gICAgR2VuZXJpY1NvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWUoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7CiAKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0OworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOworICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoYm9vbCBhdWRpbywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkdlbmVyaWNTb3VyY2UoKTsKIAorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pOwogCiBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFByZXBhcmVBc3luYywKKyAgICAgICAga1doYXRGZXRjaFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRGZXRjaFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0U2VuZFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRTZW5kVGltZWRUZXh0RGF0YSwKKyAgICAgICAga1doYXRDaGFuZ2VBVlNvdXJjZSwKKyAgICAgICAga1doYXRQb2xsQnVmZmVyaW5nLAorICAgICAgICBrV2hhdEdldEZvcm1hdCwKKyAgICAgICAga1doYXRHZXRTZWxlY3RlZFRyYWNrLAorICAgICAgICBrV2hhdFNlbGVjdFRyYWNrLAorICAgICAgICBrV2hhdFNlZWssCisgICAgICAgIGtXaGF0UmVhZEJ1ZmZlciwKKyAgICAgICAga1doYXRTdG9wV2lkZXZpbmUsCisgICAgfTsKKworICAgIFZlY3RvcjxzcDxNZWRpYVNvdXJjZT4gPiBtU291cmNlczsKKwogICAgIHN0cnVjdCBUcmFjayB7CisgICAgICAgIHNpemVfdCBtSW5kZXg7CiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtUGFja2V0czsKICAgICB9OwogCiAgICAgVHJhY2sgbUF1ZGlvVHJhY2s7CisgICAgaW50NjRfdCBtQXVkaW9UaW1lVXM7CiAgICAgVHJhY2sgbVZpZGVvVHJhY2s7CisgICAgaW50NjRfdCBtVmlkZW9UaW1lVXM7CisgICAgVHJhY2sgbVN1YnRpdGxlVHJhY2s7CisgICAgVHJhY2sgbVRpbWVkVGV4dFRyYWNrOwogCisgICAgaW50MzJfdCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb247CiAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKICAgICBib29sIG1BdWRpb0lzVm9yYmlzOworICAgIGJvb2wgbUlzV2lkZXZpbmU7CisgICAgYm9vbCBtVUlEVmFsaWQ7CisgICAgdWlkX3QgbVVJRDsKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOworICAgIEFTdHJpbmcgbVVyaTsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtVXJpSGVhZGVyczsKKyAgICBpbnQgbUZkOworICAgIGludDY0X3QgbU9mZnNldDsKKyAgICBpbnQ2NF90IG1MZW5ndGg7CiAKLSAgICB2b2lkIGluaXRGcm9tRGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOworICAgIHNwPERhdGFTb3VyY2U+IG1IdHRwU291cmNlOworICAgIHNwPFdWTUV4dHJhY3Rvcj4gbVdWTUV4dHJhY3RvcjsKKyAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU3RvcFJlYWQ7CisgICAgU3RyaW5nOCBtQ29udGVudFR5cGU7CisgICAgQVN0cmluZyBtU25pZmZlZE1JTUU7CisgICAgb2ZmNjRfdCBtTWV0YURhdGFTaXplOworICAgIGludDY0X3QgbUJpdHJhdGU7CisgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgdWludDMyX3QgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXM7CisgICAgbXV0YWJsZSBNdXRleCBtUmVhZEJ1ZmZlckxvY2s7CisgICAgbXV0YWJsZSBNdXRleCBtRGlzY29ubmVjdExvY2s7CiAKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworCisgICAgdm9pZCByZXNldERhdGFTb3VyY2UoKTsKKworICAgIHN0YXR1c190IGluaXRGcm9tRGF0YVNvdXJjZSgpOworICAgIHZvaWQgY2hlY2tEcm1TdGF0dXMoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOworICAgIGludDY0X3QgZ2V0TGFzdFJlYWRQb3NpdGlvbigpOworICAgIHZvaWQgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworCisgICAgc3RhdHVzX3QgcHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKTsKKworICAgIHZvaWQgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycik7CisKKyAgICB2b2lkIG9uR2V0Rm9ybWF0TWV0YShzcDxBTWVzc2FnZT4gbXNnKSBjb25zdDsKKyAgICBzcDxNZXRhRGF0YT4gZG9HZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIGNvbnN0OworCisgICAgdm9pZCBvbkdldFNlbGVjdGVkVHJhY2soc3A8QU1lc3NhZ2U+IG1zZykgY29uc3Q7CisgICAgc3NpemVfdCBkb0dldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKKworICAgIHZvaWQgb25TZWxlY3RUcmFjayhzcDxBTWVzc2FnZT4gbXNnKTsKKyAgICBzdGF0dXNfdCBkb1NlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCk7CisKKyAgICB2b2lkIG9uU2VlayhzcDxBTWVzc2FnZT4gbXNnKTsKKyAgICBzdGF0dXNfdCBkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzKTsKKworICAgIHZvaWQgb25QcmVwYXJlQXN5bmMoKTsKKworICAgIHZvaWQgZmV0Y2hUZXh0RGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgICAgIGludDMyX3QgY3VyR2VuLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRzLCBzcDxBTWVzc2FnZT4gbXNnKTsKKworICAgIHZvaWQgc2VuZFRleHREYXRhKAorICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldHMsIHNwPEFNZXNzYWdlPiBtc2cpOworCisgICAgc3A8QUJ1ZmZlcj4gbWVkaWFCdWZmZXJUb0FCdWZmZXIoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiwKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLAorICAgICAgICAgICAgaW50NjRfdCAqYWN0dWFsVGltZVVzID0gTlVMTCk7CisKKyAgICB2b2lkIHBvc3RSZWFkQnVmZmVyKG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlKTsKKyAgICB2b2lkIG9uUmVhZEJ1ZmZlcihzcDxBTWVzc2FnZT4gbXNnKTsKICAgICB2b2lkIHJlYWRCdWZmZXIoCi0gICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gLTFsbCwgaW50NjRfdCAqYWN0dWFsVGltZVVzID0gTlVMTCk7CisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IC0xbGwsIGludDY0X3QgKmFjdHVhbFRpbWVVcyA9IE5VTEwsIGJvb2wgZm9ybWF0Q2hhbmdlID0gZmFsc2UpOworCisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludCBwZXJjZW50YWdlKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyaWNTb3VyY2UpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCmluZGV4IGYxNzgyY2MuLmEwMDNjODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIkxpdmVEYXRhU291cmNlLmgiCiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zNCwxMyArMzUsMTIgQEAKIAogTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpIVFRQTGl2ZVNvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCkKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiAgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtVVJMKHVybCksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAogICAgICAgbUZsYWdzKDApLAogICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKICAgICAgIG1PZmZzZXQoMCksCkBAIC02MiwyNSArNjIsMzEgQEAKIE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6fkhUVFBMaXZlU291cmNlKCkgewogICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgewogICAgICAgICBtTGl2ZVNlc3Npb24tPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgbUxpdmVTZXNzaW9uLmNsZWFyKCk7CiAKKyAgICAgICAgbUxpdmVMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbi0+aWQoKSk7CisgICAgICAgIG1MaXZlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKICAgICAgICAgbUxpdmVMb29wZXItPnN0b3AoKTsKKworICAgICAgICBtTGl2ZVNlc3Npb24uY2xlYXIoKTsKICAgICAgICAgbUxpdmVMb29wZXIuY2xlYXIoKTsKICAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgbUxpdmVMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7Ci0gICAgbUxpdmVMb29wZXItPnN0YXJ0KCk7CisgICAgaWYgKG1MaXZlTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUxpdmVMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOworICAgICAgICBtTGl2ZUxvb3Blci0+c3RhcnQoKTsKKworICAgICAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uTm90aWZ5LCBpZCgpKTsKIAogICAgIG1MaXZlU2Vzc2lvbiA9IG5ldyBMaXZlU2Vzc2lvbigKICAgICAgICAgICAgIG5vdGlmeSwKICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykgPyBMaXZlU2Vzc2lvbjo6a0ZsYWdJbmNvZ25pdG8gOiAwLAotICAgICAgICAgICAgbVVJRFZhbGlkLAotICAgICAgICAgICAgbVVJRCk7CisgICAgICAgICAgICBtSFRUUFNlcnZpY2UpOwogCiAgICAgbUxpdmVMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24pOwogCkBAIC0xMjEsOCArMTI3LDEyIEBACiAgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0RHVyYXRpb24oZHVyYXRpb25Vcyk7CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0VHJhY2tJbmZvKFBhcmNlbCAqcmVwbHkpIGNvbnN0IHsKLSAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0luZm8ocmVwbHkpOworc2l6ZV90IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OmdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3QgeworICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKQEAgLTE0MCw3ICsxNTAsNyBAQAogICAgIC8vIExpdmVTZXNzaW9uOjpzZWxlY3RUcmFjayByZXR1cm5zIEJBRF9WQUxVRSB3aGVuIHNlbGVjdGluZyB0aGUgY3VycmVudGx5CiAgICAgLy8gc2VsZWN0ZWQgdHJhY2ssIG9yIHVuc2VsZWN0aW5nIGEgbm9uLXNlbGVjdGVkIHRyYWNrLiBJbiB0aGlzIGNhc2UgaXQncyBhbgogICAgIC8vIG5vLW9wIHNvIHdlIHJldHVybiBPSy4KLSAgICByZXR1cm4gKGVyciA9PSBPSyB8fCBlcnIgPT0gQkFEX1ZBTFVFKSA/IE9LIDogZXJyOworICAgIHJldHVybiAoZXJyID09IE9LIHx8IGVyciA9PSBCQURfVkFMVUUpID8gKHN0YXR1c190KU9LIDogZXJyOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKQEAgLTIwNyw5ICsyMTcsOSBAQAogICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IE5VTEwgJiYKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSAmJiBmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoZm9ybWF0KTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgwLCAwKTsKKyAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gRkxBR19DQU5fUEFVU0U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCmluZGV4IGJjYzNmOGIuLjZiNWY2YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCkBAIC0yOCwxMCArMjgsOSBAQAogc3RydWN0IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKICAgICBIVFRQTGl2ZVNvdXJjZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLAotICAgICAgICAgICAgdWlkX3QgdWlkID0gMCk7CisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CkBAIC00MSw3ICs0MCw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwgKnJlcGx5KSBjb25zdDsKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKTsKIApAQCAtNjEsMTAgKzYxLDkgQEAKICAgICAgICAga1doYXRGZXRjaFN1YnRpdGxlRGF0YSwKICAgICB9OwogCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1VUkw7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKLSAgICBib29sIG1VSURWYWxpZDsKLSAgICB1aWRfdCBtVUlEOwogICAgIHVpbnQzMl90IG1GbGFnczsKICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggMjVkNTVhMy4uYTYzYTk0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC0yMiwyNCArMjIsMjIgQEAKIAogI2luY2x1ZGUgIkhUVFBMaXZlU291cmNlLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaCIKICNpbmNsdWRlICJOdVBsYXllckRyaXZlci5oIgogI2luY2x1ZGUgIk51UGxheWVyUmVuZGVyZXIuaCIKICNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgogI2luY2x1ZGUgIlJUU1BTb3VyY2UuaCIKICNpbmNsdWRlICJTdHJlYW1pbmdTb3VyY2UuaCIKICNpbmNsdWRlICJHZW5lcmljU291cmNlLmgiCi0jaW5jbHVkZSAibXA0L01QNFNvdXJjZS5oIgorI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKIAogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCi0jaW5jbHVkZSAiU29mdHdhcmVSZW5kZXJlci5oIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgpAQCAtNTIsNiArNTAsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBUT0RPIG9wdGltaXplIGJ1ZmZlciBzaXplIGZvciBwb3dlciBjb25zdW1wdGlvbgorLy8gVGhlIG9mZmxvYWQgcmVhZCBidWZmZXIgc2l6ZSBpcyAzMiBLQiBidXQgMjQgS0IgdXNlcyBsZXNzIHBvd2VyLgorY29uc3Qgc2l6ZV90IE51UGxheWVyOjprQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzID0gMjQgKiAxMDI0OworCiBzdHJ1Y3QgTnVQbGF5ZXI6OkFjdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBBY3Rpb24oKSB7fQogCkBAIC02MiwxNiArNjQsMTggQEAKIH07CiAKIHN0cnVjdCBOdVBsYXllcjo6U2Vla0FjdGlvbiA6IHB1YmxpYyBBY3Rpb24gewotICAgIFNlZWtBY3Rpb24oaW50NjRfdCBzZWVrVGltZVVzKQotICAgICAgICA6IG1TZWVrVGltZVVzKHNlZWtUaW1lVXMpIHsKKyAgICBTZWVrQWN0aW9uKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KQorICAgICAgICA6IG1TZWVrVGltZVVzKHNlZWtUaW1lVXMpLAorICAgICAgICAgIG1OZWVkTm90aWZ5KG5lZWROb3RpZnkpIHsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllciAqcGxheWVyKSB7Ci0gICAgICAgIHBsYXllci0+cGVyZm9ybVNlZWsobVNlZWtUaW1lVXMpOworICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZWVrKG1TZWVrVGltZVVzLCBtTmVlZE5vdGlmeSk7CiAgICAgfQogCiBwcml2YXRlOgogICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisgICAgYm9vbCBtTmVlZE5vdGlmeTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlZWtBY3Rpb24pOwogfTsKQEAgLTE0OCwyMiArMTUyLDI2IEBACiAgICAgOiBtVUlEVmFsaWQoZmFsc2UpLAogICAgICAgbVNvdXJjZUZsYWdzKDApLAogICAgICAgbVZpZGVvSXNBVkMoZmFsc2UpLAotICAgICAgbU5lZWRzU3dSZW5kZXJlcihmYWxzZSksCisgICAgICBtT2ZmbG9hZEF1ZGlvKGZhbHNlKSwKKyAgICAgIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24oMCksCisgICAgICBtUmVuZGVyZXJHZW5lcmF0aW9uKDApLAogICAgICAgbUF1ZGlvRU9TKGZhbHNlKSwKICAgICAgIG1WaWRlb0VPUyhmYWxzZSksCiAgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1TY2FuU291cmNlc0dlbmVyYXRpb24oMCksCiAgICAgICBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbigwKSwKKyAgICAgIG1UaW1lZFRleHRHZW5lcmF0aW9uKDApLAogICAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyhmYWxzZSksCiAgICAgICBtRmx1c2hpbmdBdWRpbyhOT05FKSwKICAgICAgIG1GbHVzaGluZ1ZpZGVvKE5PTkUpLAogICAgICAgbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXMoLTFsbCksCiAgICAgICBtU2tpcFJlbmRlcmluZ1ZpZGVvVW50aWxNZWRpYVRpbWVVcygtMWxsKSwKLSAgICAgIG1WaWRlb0xhdGVCeVVzKDBsbCksCiAgICAgICBtTnVtRnJhbWVzVG90YWwoMGxsKSwKICAgICAgIG1OdW1GcmFtZXNEcm9wcGVkKDBsbCksCiAgICAgICBtVmlkZW9TY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKKyAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKIH0KIAogTnVQbGF5ZXI6On5OdVBsYXllcigpIHsKQEAgLTE4MywxNCArMTkxLDcgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIGlkKCkpOwogCi0gICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQudXNlLW1wNHNvdXJjZSIsIHByb3AsIE5VTEwpCi0gICAgICAgICAgICAmJiAoIXN0cmNtcChwcm9wLCAiMSIpIHx8ICFzdHJjYXNlY21wKHByb3AsICJ0cnVlIikpKSB7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgTVA0U291cmNlKG5vdGlmeSwgc291cmNlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBTdHJlYW1pbmdTb3VyY2Uobm90aWZ5LCBzb3VyY2UpKTsKLSAgICB9Ci0KKyAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IFN0cmVhbWluZ1NvdXJjZShub3RpZnksIHNvdXJjZSkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC0yMTIsNyArMjEzLDEwIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnNldERhdGFTb3VyY2VBc3luYygKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgaWQoKSk7CiAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih1cmwpOwogCkBAIC0yMjAsMTggKzIyNCwzMSBAQAogCiAgICAgc3A8U291cmNlPiBzb3VyY2U7CiAgICAgaWYgKElzSFRUUExpdmVVUkwodXJsKSkgewotICAgICAgICBzb3VyY2UgPSBuZXcgSFRUUExpdmVTb3VyY2Uobm90aWZ5LCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgIHNvdXJjZSA9IG5ldyBIVFRQTGl2ZVNvdXJjZShub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHVybCwgInJ0c3A6Ly8iLCA3KSkgewotICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZShub3RpZnksIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgc291cmNlID0gbmV3IFJUU1BTb3VyY2UoCisgICAgICAgICAgICAgICAgbm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQpOwogICAgIH0gZWxzZSBpZiAoKCFzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKICAgICAgICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAodXJsLCAiaHR0cHM6Ly8iLCA4KSkKICAgICAgICAgICAgICAgICAgICAgJiYgKChsZW4gPj0gNCAmJiAhc3RyY2FzZWNtcCgiLnNkcCIsICZ1cmxbbGVuIC0gNF0pKQogICAgICAgICAgICAgICAgICAgICB8fCBzdHJzdHIodXJsLCAiLnNkcD8iKSkpIHsKLSAgICAgICAgc291cmNlID0gbmV3IFJUU1BTb3VyY2Uobm90aWZ5LCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCwgdHJ1ZSk7CisgICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKAorICAgICAgICAgICAgICAgIG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlELCB0cnVlKTsKICAgICB9IGVsc2UgewotICAgICAgICBzb3VyY2UgPSBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlEKTsKLSAgICB9CisgICAgICAgIHNwPEdlbmVyaWNTb3VyY2U+IGdlbmVyaWNTb3VyY2UgPQorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgLy8gRG9uJ3Qgc2V0IEZMQUdfU0VDVVJFIG9uIG1Tb3VyY2VGbGFncyBoZXJlIGZvciB3aWRldmluZS4KKyAgICAgICAgLy8gVGhlIGNvcnJlY3QgZmxhZ3Mgd2lsbCBiZSB1cGRhdGVkIGluIFNvdXJjZTo6a1doYXRGbGFnc0NoYW5nZWQKKyAgICAgICAgLy8gaGFuZGxlciB3aGVuICBHZW5lcmljU291cmNlIGlzIHByZXBhcmVkLgogCisgICAgICAgIHN0YXR1c190IGVyciA9IGdlbmVyaWNTb3VyY2UtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgc291cmNlID0gZ2VuZXJpY1NvdXJjZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlISIpOworICAgICAgICB9CisgICAgfQogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMjQxLDcgKzI1OCwxNiBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgaWQoKSk7CiAKLSAgICBzcDxTb3VyY2U+IHNvdXJjZSA9IG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBzcDxHZW5lcmljU291cmNlPiBzb3VyY2UgPQorICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworCisgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlISIpOworICAgICAgICBzb3VyY2UgPSBOVUxMOworICAgIH0KKwogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMjYwLDcgKzI4Niw3IEBACiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KAogICAgICAgICAgICAgICAgICJuYXRpdmUtd2luZG93IiwKICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlV2luZG93V3JhcHBlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIpKSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCB0cnVlIC8qIGNvbnRyb2xsZWRCeUFwcCAqLykpKTsKICAgICB9CiAKICAgICBtc2ctPnBvc3QoKTsKQEAgLTI4NSwzMiArMzExLDUyIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnJlc2V0QXN5bmMoKSB7CisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBEdXJpbmcgYSByZXNldCwgdGhlIGRhdGEgc291cmNlIG1pZ2h0IGJlIHVucmVzcG9uc2l2ZSBhbHJlYWR5LCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZXhwbGljaXRseSBzbyB0aGF0IHJlYWRzIGV4aXQgcHJvbXB0bHkuCisgICAgICAgIC8vIFdlIGNhbid0IHF1ZXVlIHRoZSBkaXNjb25uZWN0IHJlcXVlc3QgdG8gdGhlIGxvb3BlciwgYXMgaXQgbWlnaHQgYmUKKyAgICAgICAgLy8gcXVldWVkIGJlaGluZCBhIHN0dWNrIHJlYWQgYW5kIG5ldmVyIGdldHMgcHJvY2Vzc2VkLgorICAgICAgICAvLyBEb2luZyBhIGRpc2Nvbm5lY3Qgb3V0c2lkZSB0aGUgbG9vcGVyIHRvIGFsbG93cyB0aGUgcGVuZGluZyByZWFkcyB0byBleGl0CisgICAgICAgIC8vIChlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggZXJyb3IpLgorICAgICAgICBtU291cmNlLT5kaXNjb25uZWN0KCk7CisgICAgfQorCiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc2V0LCBpZCgpKSktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6c2Vla1RvQXN5bmMoaW50NjRfdCBzZWVrVGltZVVzKSB7Cit2b2lkIE51UGxheWVyOjpzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKTsKICAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7CisgICAgbXNnLT5zZXRJbnQzMigibmVlZE5vdGlmeSIsIG5lZWROb3RpZnkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCi0vLyBzdGF0aWMKLWJvb2wgTnVQbGF5ZXI6OklzRmx1c2hpbmdTdGF0ZShGbHVzaFN0YXR1cyBzdGF0ZSwgYm9vbCAqbmVlZFNodXRkb3duKSB7Ci0gICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6Ci0gICAgICAgICAgICBpZiAobmVlZFNodXRkb3duICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqbmVlZFNodXRkb3duID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV046Ci0gICAgICAgICAgICBpZiAobmVlZFNodXRkb3duICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqbmVlZFNodXRkb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwordm9pZCBOdVBsYXllcjo6d3JpdGVUcmFja0luZm8oCisgICAgICAgIFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiBmb3JtYXQpIGNvbnN0IHsKKyAgICBpbnQzMl90IHRyYWNrVHlwZTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigidHlwZSIsICZ0cmFja1R5cGUpKTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFTdHJpbmcgbGFuZzsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoImxhbmd1YWdlIiwgJmxhbmcpKTsKKworICAgIHJlcGx5LT53cml0ZUludDMyKDIpOyAvLyB3cml0ZSBzb21ldGhpbmcgbm9uLXplcm8KKyAgICByZXBseS0+d3JpdGVJbnQzMih0cmFja1R5cGUpOworICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcuY19zdHIoKSkpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgICAgICBpbnQzMl90IGlzQXV0bywgaXNEZWZhdWx0LCBpc0ZvcmNlZDsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImF1dG8iLCAmaXNBdXRvKSk7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJkZWZhdWx0IiwgJmlzRGVmYXVsdCkpOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZm9yY2VkIiwgJmlzRm9yY2VkKSk7CisKKyAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobWltZS5jX3N0cigpKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzQXV0byk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGVmYXVsdCk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRm9yY2VkKTsKICAgICB9CiB9CiAKQEAgLTMyMiwxNyArMzY4LDE5IEBACiAKICAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgPT0gTlVMTCk7CiAKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7Ci0KLSAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKLQotICAgICAgICAgICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtU291cmNlKTsKKyAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0sobURyaXZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChPSyk7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKGVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzQ4LDE2ICszOTYsNTggQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjY1RyYWNrcyA9IG1DQ0RlY29kZXItPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdG90YWwgdHJhY2sgY291bnQKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKKworICAgICAgICAgICAgLy8gd3JpdGUgaW5iYW5kIHRyYWNrcworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmJhbmRUcmFja3M7ICsraSkgeworICAgICAgICAgICAgICAgIHdyaXRlVHJhY2tJbmZvKHJlcGx5LCBtU291cmNlLT5nZXRUcmFja0luZm8oaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3cml0ZSBDQyB0cmFjaworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY1RyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1DQ0RlY29kZXItPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgorICAgICAgICB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKworICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisgICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKwogICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldFRyYWNrSW5mbyhyZXBseSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKIAorICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzY3LDEzICs0NTcsNDAgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgaW50MzJfdCBzZWxlY3Q7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxlY3QiLCAmc2VsZWN0KSk7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2NUcmFja3MgPSBtQ0NEZWNvZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgaW5iYW5kVHJhY2tzKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKworICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ICYmIGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbmZvID0gbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5mby0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2tJbmRleCAtPSBpbmJhbmRUcmFja3M7CisKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IGNjVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1DQ0RlY29kZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC00MjEsNiArNTM4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpKTsKIAogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJc3N1ZSBhIHNlZWsgdG8gcmVmcmVzaCB0aGUgdmlkZW8gc2NyZWVuIG9ubHkgaWYgc3RhcnRlZCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4dHJhY3RvciBtYXkgbm90IHlldCBiZSBzdGFydGVkIGFuZCB3aWxsIGFzc2VydC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpZGVvIGRlY29kZXIgaXMgbm90IHNldCAocGVyaGFwcyBhdWRpbyBvbmx5IGluIHRoaXMgY2FzZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHBlcmZvcm0gYSBzZWVrIGFzIGl0IGlzIG5vdCBuZWVkZWQuCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXMgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihjdXJyZW50UG9zaXRpb25VcywgZmFsc2UgLyogbmVlZE5vdGlmeSAqLykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXcgc3VyZmFjZSB0ZXh0dXJlLCBpbnN0YW50aWF0ZSBkZWNvZGVycwogICAgICAgICAgICAgICAgIC8vIGFnYWluIGlmIHBvc3NpYmxlLgogICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKApAQCAtNDQ3LDE2ICs1NzYsMjYgQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0YXJ0Iik7CiAKICAgICAgICAgICAgIG1WaWRlb0lzQVZDID0gZmFsc2U7Ci0gICAgICAgICAgICBtTmVlZHNTd1JlbmRlcmVyID0gZmFsc2U7CisgICAgICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CiAgICAgICAgICAgICBtQXVkaW9FT1MgPSBmYWxzZTsKICAgICAgICAgICAgIG1WaWRlb0VPUyA9IGZhbHNlOwogICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKICAgICAgICAgICAgIG1Ta2lwUmVuZGVyaW5nVmlkZW9VbnRpbE1lZGlhVGltZVVzID0gLTE7Ci0gICAgICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDA7CiAgICAgICAgICAgICBtTnVtRnJhbWVzVG90YWwgPSAwOwogICAgICAgICAgICAgbU51bUZyYW1lc0Ryb3BwZWQgPSAwOwogICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCisgICAgICAgICAgICAvKiBpbnN0YW50aWF0ZSBkZWNvZGVycyBub3cgZm9yIHNlY3VyZSBwbGF5YmFjayAqLworICAgICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2RlcihmYWxzZSwgJm1WaWRlb0RlY29kZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUsICZtQXVkaW9EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CiAKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKQEAgLTQ2NSwxMiArNjA0LDM3IEBACiAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gUmVuZGVyZXI6OkZMQUdfUkVBTF9USU1FOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmssCi0gICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlcmVyTm90aWZ5LCBpZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlcik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworCisgICAgICAgICAgICBtT2ZmbG9hZEF1ZGlvID0KKyAgICAgICAgICAgICAgICBjYW5PZmZsb2FkU3RyZWFtKGF1ZGlvTWV0YSwgKHZpZGVvRm9ybWF0ICE9IE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc19zdHJlYW1pbmcgKi8sIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19PRkZMT0FEX0FVRElPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyZXJOb3RpZnksIGlkKCkpOworICAgICAgICAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1SZW5kZXJlckdlbmVyYXRpb24pOworICAgICAgICAgICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG1BdWRpb1NpbmssIG5vdGlmeSwgZmxhZ3MpOworCisgICAgICAgICAgICBtUmVuZGVyZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJSZW5kZXJlciIpOworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyKTsKKworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGaWxlTWV0YSgpOworICAgICAgICAgICAgaW50MzJfdCByYXRlOworICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwgJnJhdGUpICYmIHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zZXRWaWRlb0ZyYW1lUmF0ZShyYXRlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcG9zdFNjYW5Tb3VyY2VzKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ5MywxMSArNjU3LDE4IEBACiAgICAgICAgICAgICBib29sIG1IYWRBbnlTb3VyY2VzQmVmb3JlID0KICAgICAgICAgICAgICAgICAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB8fCAobVZpZGVvRGVjb2RlciAhPSBOVUxMKTsKIAorICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB2aWRlbyBiZWZvcmUgYXVkaW8gYmVjYXVzZSBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uIG9mCisgICAgICAgICAgICAvLyB2aWRlbyBtYXkgY2hhbmdlIGRlZXAgYnVmZmVyIG1vZGUgb2YgYXVkaW8uCiAgICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKGZhbHNlLCAmbVZpZGVvRGVjb2Rlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGF1ZGlvIHNpbmsgZWFybHkgdW5kZXIgb2ZmbG9hZCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyphdWRpbyovKTsKKyAgICAgICAgICAgICAgICAgICAgb3BlbkF1ZGlvU2luayhmb3JtYXQsIHRydWUgLypvZmZsb2FkT25seSovKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUsICZtQXVkaW9EZWNvZGVyKTsKICAgICAgICAgICAgIH0KIApAQCAtNTM4LDI0ICs3MDksNDAgQEAKICAgICAgICAgewogICAgICAgICAgICAgYm9vbCBhdWRpbyA9IG1zZy0+d2hhdCgpID09IGtXaGF0QXVkaW9Ob3RpZnk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBjb2RlY1JlcXVlc3Q7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJjb2RlYy1yZXF1ZXN0IiwgJmNvZGVjUmVxdWVzdCkpOworICAgICAgICAgICAgaW50MzJfdCBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24gPQorICAgICAgICAgICAgICAgIChhdWRpbz8gbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24gOiBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlckdlbmVyYXRpb24gPSBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24gLSAxOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmcmVxdWVzdGVyR2VuZXJhdGlvbikpOworCisgICAgICAgICAgICBpZiAocmVxdWVzdGVyR2VuZXJhdGlvbiAhPSBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1lc3NhZ2UgZnJvbSBvbGQgJXMgZGVjb2RlciwgZ2VuZXJhdGlvbiglZDolZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgcmVxdWVzdGVyR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAgICAgICAgIGlmICghKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgSU5GT19ESVNDT05USU5VSVRZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCB3aGF0OwotICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwogCi0gICAgICAgICAgICBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkRGVjb2RlcklucHV0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLCBjb2RlY1JlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8sIG1zZyk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewogICAgICAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwICogMTAwMGxsKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RU9TKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRFT1MpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdvdCAlcyBkZWNvZGVyIEVPUyIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwpAQCAtNTY2LDE3MCArNzUzLDkxIEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhhdWRpbywgZXJyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICBib29sIG5lZWRTaHV0ZG93bjsKLQotICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhJc0ZsdXNoaW5nU3RhdGUobUZsdXNoaW5nQXVkaW8sICZuZWVkU2h1dGRvd24pKTsKLSAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBGTFVTSEVEOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKElzRmx1c2hpbmdTdGF0ZShtRmx1c2hpbmdWaWRlbywgJm5lZWRTaHV0ZG93bikpOwotICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IEZMVVNIRUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwOwotICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiZGVjb2RlciAlcyBmbHVzaCBjb21wbGV0ZWQiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKIAotICAgICAgICAgICAgICAgIGlmIChuZWVkU2h1dGRvd24pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImluaXRpYXRpbmcgJXMgZGVjb2RlciBzaHV0ZG93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgKGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXIpLT5pbml0aWF0ZVNodXRkb3duKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgdHJ1ZSAvKiBpc0RlY29kZXIgKi8pOwogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpbyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJWQgSHosICVkIGNoYW5uZWxzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdmlkZW8gZGVjb2RlcgotICAgICAgICAgICAgICAgICAgICAvLyBpcyBjcmVhdGVkIGFmdGVyIHdlIHJlY2VpdmUgdGhlIGZvcm1hdCBjaGFuZ2UgaW5kaWNhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBjb2RlIHdpbGwganVzdCBtYWtlIHRoYXQgd2Ugc2VsZWN0IGRlZXAgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdmlkZW8gd2hpY2ggc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gYXMgaXQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBwcmV2ZW50IGZyb20ga2VlcGluZyBBL1Ygc3luYy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgPT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+b3BlbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggLyogYnVmZmVyQ291bnQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbEF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3BlbkF1ZGlvU2luayhmb3JtYXQsIGZhbHNlIC8qb2ZmbG9hZE9ubHkqLyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8KKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNwbGF5V2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcGxheUhlaWdodCA9IGNyb3BCb3R0b20gLSBjcm9wVG9wICsgMTsKLQotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW8gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVkIHggJWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICIoY3JvcDogJWQgeCAlZCBAICglZCwgJWQpKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHZpZGVvSW5wdXRGb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIGludG8gYWNjb3VudCBzYW1wbGUgYXNwZWN0IHJhdGlvIGlmIG5lY2Vzc2FyeToKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmlkZW9JbnB1dEZvcm1hdC0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FyLWhlaWdodCIsICZzYXJIZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2FtcGxlIGFzcGVjdCByYXRpbyAlZCA6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcldpZHRoLCBzYXJIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGggPSAoZGlzcGxheVdpZHRoICogc2FyV2lkdGgpIC8gc2FySGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZGlzcGxheSBkaW1lbnNpb25zICVkIHggJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTmVlZHNTd1JlbmRlcmVyICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2xvckZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRSZWN0KGtLZXlDcm9wUmVjdCwgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zZXRTb2Z0UmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1OYXRpdmVXaW5kb3ctPmdldE5hdGl2ZVdpbmRvdygpLCBtZXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKGlucHV0Rm9ybWF0LCBmb3JtYXQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewogICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltRmx1c2hpbmdBdWRpbywgKGludClTSFVUVElOR19ET1dOX0RFQ09ERVIpOwogICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRfRE9XTjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICsrbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltRmx1c2hpbmdWaWRlbywgKGludClTSFVUVElOR19ET1dOX0RFQ09ERVIpOwogICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IFNIVVRfRE9XTjsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVjZWl2ZWQgZXJyb3IgZnJvbSAlcyBkZWNvZGVyLCBhYm9ydGluZyBwbGF5YmFjay4iLAotICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7Ci0KLSAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKGF1ZGlvLCBVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RHJhaW5UaGlzQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgcmVuZGVyQnVmZmVyKGF1ZGlvLCBjb2RlY1JlcXVlc3QpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRzU3dSZW5kZXJlciA9IG5hbWUuc3RhcnRzV2l0aCgiT01YLmdvb2dsZS4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdEVycm9yKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpIHx8IGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCAhPSBBQ29kZWM6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZAotICAgICAgICAgICAgICAgICAgICAmJiB3aGF0ICE9IEFDb2RlYzo6a1doYXRCdWZmZXJzQWxsb2NhdGVkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlVuaGFuZGxlZCBjb2RlYyBub3RpZmljYXRpb24gJWQgJyVjJWMlYyVjJy4iLAorCisgICAgICAgICAgICAgICAgLy8gRGVjb2RlciBlcnJvcnMgY2FuIGJlIGR1ZSB0byBTb3VyY2UgKGUuZy4gZnJvbSBzdHJlYW1pbmcpLAorICAgICAgICAgICAgICAgIC8vIG9yIGZyb20gZGVjb2RpbmcgY29ycnVwdGVkIGJpdHN0cmVhbXMsIG9yIGZyb20gb3RoZXIgZGVjb2RlcgorICAgICAgICAgICAgICAgIC8vIE1lZGlhQ29kZWMgb3BlcmF0aW9ucyAoZS5nLiBmcm9tIGFuIG9uZ29pbmcgcmVzZXQgb3Igc2VlaykuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSB0cnkgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGFmZmVjdGVkIGRlY29kZXIgaWYgcG9zc2libGUsCisgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGZvcmNlIHRoZSBzaHV0ZG93biB3aXRoIHNvbWV0aGluZworICAgICAgICAgICAgICAgIC8vIHNpbWlsYXIgdG8gcGVyZm9ybVJlc2V0KCkuIFRoaXMgbWV0aG9kIGNhbiBsZWFkIHRvIGEgaGFuZworICAgICAgICAgICAgICAgIC8vIGlmIE1lZGlhQ29kZWMgZnVuY3Rpb25zIGJsb2NrIGFmdGVyIGFuIGVycm9yLCBidXQgdGhleSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OIGluc3RlYWQgb2YgYmxvY2tpbmcuCisKKyAgICAgICAgICAgICAgICBGbHVzaFN0YXR1cyAqZmx1c2hpbmcgPSBhdWRpbyA/ICZtRmx1c2hpbmdBdWRpbyA6ICZtRmx1c2hpbmdWaWRlbzsKKyAgICAgICAgICAgICAgICBBTE9HRSgicmVjZWl2ZWQgZXJyb3IoJSN4KSBmcm9tICVzIGRlY29kZXIsIGZsdXNoaW5nKCVkKSwgbm93IHNodXR0aW5nIGRvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCAqZmx1c2hpbmcpOworCisgICAgICAgICAgICAgICAgc3dpdGNoICgqZmx1c2hpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaHV0ZG93bkRlY29kZXJBY3Rpb24oYXVkaW8sICFhdWRpbyAvKiB2aWRlbyAqLykpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICpmbHVzaGluZyA9IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV047IC8vIGluaXRpYXRlIHNodXRkb3duIGFmdGVyIGZsdXNoLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIGZsdXNoIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV046CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2FpdCBmb3IgZmx1c2ggdG8gY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0hVVFRJTkdfRE9XTl9ERUNPREVSOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIHNodXRkb3duIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWRldmluZSBzb3VyY2UgcmVhZHMgbXVzdCBzdG9wIGJlZm9yZSByZWxlYXNpbmcgdGhlIHZpZGVvIGRlY29kZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvICYmIG1Tb3VyY2UgIT0gTlVMTCAmJiBtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsgLy8gSW4gdGhlIG1pZGRsZSBvZiBhIHNlZWsuCisgICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7ICAgICAvLyBTaHV0IGRvd24uCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTSFVUX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsgIC8vIFNob3VsZCBub3Qgb2NjdXIuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIEZpbmlzaCBhbnl3YXlzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdERyYWluVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgICAgIHJlbmRlckJ1ZmZlcihhdWRpbywgbXNnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlVuaGFuZGxlZCBkZWNvZGVyIG5vdGlmaWNhdGlvbiAlZCAnJWMlYyVjJWMnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwKICAgICAgICAgICAgICAgICAgICAgICB3aGF0ID4+IDI0LAogICAgICAgICAgICAgICAgICAgICAgICh3aGF0ID4+IDE2KSAmIDB4ZmYsCkBAIC03NDIsNiArODUwLDE0IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFJlbmRlcmVyTm90aWZ5OgogICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlckdlbmVyYXRpb24gPSBtUmVuZGVyZXJHZW5lcmF0aW9uIC0gMTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJnJlcXVlc3RlckdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZXJHZW5lcmF0aW9uICE9IG1SZW5kZXJlckdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1lc3NhZ2UgZnJvbSBvbGQgcmVuZGVyZXIsIGdlbmVyYXRpb24oJWQ6JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlckdlbmVyYXRpb24sIG1SZW5kZXJlckdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaW50MzJfdCB3aGF0OwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwogCkBAIC03NzIsMzEgKzg4OCwzOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1WaWRlb0VPUyB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0UG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uVXM7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInBvc2l0aW9uVXMiLCAmcG9zaXRpb25VcykpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInZpZGVvTGF0ZUJ5VXMiLCAmbVZpZGVvTGF0ZUJ5VXMpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UG9zaXRpb24ocG9zaXRpb25Vcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RnJhbWVTdGF0cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1RvdGFsLCBtTnVtRnJhbWVzRHJvcHBlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0Rmx1c2hDb21wbGV0ZSkgewogICAgICAgICAgICAgICAgIGludDMyX3QgYXVkaW87CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKICAgICAgICAgICAgICAgICBBTE9HVigicmVuZGVyZXIgJXMgZmx1c2ggY29tcGxldGVkLiIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgIGhhbmRsZUZsdXNoQ29tcGxldGUoYXVkaW8sIGZhbHNlIC8qIGlzRGVjb2RlciAqLyk7CisgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCkgewogICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0lORk8sIE1FRElBX0lORk9fUkVOREVSSU5HX1NUQVJULCAwKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1lZGlhIHJlbmRlcmluZyBzdGFydGVkIik7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU1RBUlRFRCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVGVhciBkb3duIGF1ZGlvIG9mZmxvYWQsIGZhbGwgYmFjayB0byBzL3cgcGF0aCIpOworICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25VczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgicG9zaXRpb25VcyIsICZwb3NpdGlvblVzKSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZWFzb247CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKKyAgICAgICAgICAgICAgICBjbG9zZUF1ZGlvU2luaygpOworICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+Zmx1c2godHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPmZsdXNoKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsocG9zaXRpb25VcywgZmFsc2UgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBSZW5kZXJlcjo6a0R1ZVRvRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sICZtQXVkaW9EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtODI0LDE0ICs5NDcsMTggQEAKICAgICAgICAgY2FzZSBrV2hhdFNlZWs6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgbmVlZE5vdGlmeTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWVrVGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJuZWVkTm90aWZ5IiwgJm5lZWROb3RpZnkpKTsKIAotICAgICAgICAgICAgQUxPR1YoImtXaGF0U2VlayBzZWVrVGltZVVzPSVsbGQgdXMiLCBzZWVrVGltZVVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzLCBuZWVkTm90aWZ5PSVkIiwKKyAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgbmVlZE5vdGlmeSk7CiAKICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjo6cGVyZm9ybURlY29kZXJGbHVzaCkpOwogCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzKSk7CisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oc2Vla1RpbWVVcywgbmVlZE5vdGlmeSkpOwogCiAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTgzOSwxNyArOTY2LDM2IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDSyhtUmVuZGVyZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtU291cmNlLT5wYXVzZSgpOwotICAgICAgICAgICAgbVJlbmRlcmVyLT5wYXVzZSgpOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnBhdXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnBhdXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0sobVJlbmRlcmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbVNvdXJjZS0+cmVzdW1lKCk7Ci0gICAgICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnJlc3VtZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVzdW1lIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHxtQXVkaW9EZWNvZGVyfCBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIGR1ZSB0byB0aGUgcGF1c2UgdGltZW91dCwgc28gcmUtY3JlYXRlIGl0IGlmCisgICAgICAgICAgICAvLyBuZWVkZWQuCisgICAgICAgICAgICBpZiAoYXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKSAmJiBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgJm1BdWRpb0RlY29kZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTg1OSwzOSArMTAwNSw5NiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgb25DbG9zZWRDYXB0aW9uTm90aWZ5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpmaW5pc2hGbHVzaElmUG9zc2libGUoKSB7Ci0gICAgaWYgKG1GbHVzaGluZ0F1ZGlvICE9IEZMVVNIRUQgJiYgbUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSB7Citib29sIE51UGxheWVyOjphdWRpb0RlY29kZXJTdGlsbE5lZWRlZCgpIHsKKyAgICAvLyBBdWRpbyBkZWNvZGVyIGlzIG5vIGxvbmdlciBuZWVkZWQgaWYgaXQncyBpbiBzaHV0L3NodXR0aW5nIGRvd24gc3RhdHVzLgorICAgIHJldHVybiAoKG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRfRE9XTikgJiYgKG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRUSU5HX0RPV05fREVDT0RFUikpOworfQorCit2b2lkIE51UGxheWVyOjpoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKSB7CisgICAgLy8gV2Ugd2FpdCBmb3IgYm90aCB0aGUgZGVjb2RlciBmbHVzaCBhbmQgdGhlIHJlbmRlcmVyIGZsdXNoIHRvIGNvbXBsZXRlCisgICAgLy8gYmVmb3JlIGVudGVyaW5nIGVpdGhlciB0aGUgRkxVU0hFRCBvciB0aGUgU0hVVFRJTkdfRE9XTl9ERUNPREVSIHN0YXRlLgorCisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2lzRGVjb2Rlcl0gPSB0cnVlOworICAgIGlmICghbUZsdXNoQ29tcGxldGVbYXVkaW9dWyFpc0RlY29kZXJdKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAobUZsdXNoaW5nVmlkZW8gIT0gRkxVU0hFRCAmJiBtRmx1c2hpbmdWaWRlbyAhPSBTSFVUX0RPV04pIHsKKyAgICBGbHVzaFN0YXR1cyAqc3RhdGUgPSBhdWRpbyA/ICZtRmx1c2hpbmdBdWRpbyA6ICZtRmx1c2hpbmdWaWRlbzsKKyAgICBzd2l0Y2ggKCpzdGF0ZSkgeworICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6CisgICAgICAgIHsKKyAgICAgICAgICAgICpzdGF0ZSA9IEZMVVNIRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjoKKyAgICAgICAgeworICAgICAgICAgICAgKnN0YXRlID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOworCisgICAgICAgICAgICBBTE9HVigiaW5pdGlhdGluZyAlcyBkZWNvZGVyIHNodXRkb3duIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICBpZiAoIWF1ZGlvKSB7CisgICAgICAgICAgICAgICAgLy8gV2lkZXZpbmUgc291cmNlIHJlYWRzIG11c3Qgc3RvcCBiZWZvcmUgcmVsZWFzaW5nIHRoZSB2aWRlbyBkZWNvZGVyLgorICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwgJiYgbVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIGRlY29kZXIgZmx1c2ggY29tcGxldGVzIG9ubHkgb2NjdXIgaW4gYSBmbHVzaGluZyBzdGF0ZS4KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXNEZWNvZGVyLCAiZGVjb2RlciBmbHVzaCBpbiBpbnZhbGlkIHN0YXRlICVkIiwgKnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6ZmluaXNoRmx1c2hJZlBvc3NpYmxlKCkgeworICAgIGlmIChtRmx1c2hpbmdBdWRpbyAhPSBOT05FICYmIG1GbHVzaGluZ0F1ZGlvICE9IEZMVVNIRUQKKyAgICAgICAgICAgICYmIG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRfRE9XTikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUgJiYgbUZsdXNoaW5nVmlkZW8gIT0gRkxVU0hFRAorICAgICAgICAgICAgJiYgbUZsdXNoaW5nVmlkZW8gIT0gU0hVVF9ET1dOKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBBTE9HVigiYm90aCBhdWRpbyBhbmQgdmlkZW8gYXJlIGZsdXNoZWQgbm93LiIpOwogCisgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICBtQWdncmVnYXRlQnVmZmVyLmNsZWFyKCk7CisKICAgICBpZiAobVRpbWVEaXNjb250aW51aXR5UGVuZGluZykgewogICAgICAgICBtUmVuZGVyZXItPnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCk7CiAgICAgICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcgPSBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCAmJiBtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSEVEKSB7CiAgICAgICAgIG1BdWRpb0RlY29kZXItPnNpZ25hbFJlc3VtZSgpOwogICAgIH0KIAotICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMICYmIG1GbHVzaGluZ1ZpZGVvID09IEZMVVNIRUQpIHsKICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2lnbmFsUmVzdW1lKCk7CiAgICAgfQogCiAgICAgbUZsdXNoaW5nQXVkaW8gPSBOT05FOwogICAgIG1GbHVzaGluZ1ZpZGVvID0gTk9ORTsKIAorICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOworCiAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwogfQogCkBAIC05MDcsNiArMTExMCwzOCBAQAogICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSB0cnVlOwogfQogCit2b2lkIE51UGxheWVyOjpvcGVuQXVkaW9TaW5rKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBib29sIG9mZmxvYWRPbmx5KSB7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGJvb2wgaGFzVmlkZW8gPSAobVZpZGVvRGVjb2RlciAhPSBOVUxMKTsKKyAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdmlkZW8gZGVjb2RlcgorICAgIC8vIGlzIGNyZWF0ZWQgYWZ0ZXIgd2UgcmVjZWl2ZSB0aGUgZm9ybWF0IGNoYW5nZSBpbmRpY2F0aW9uLgorICAgIC8vIEN1cnJlbnQgY29kZSB3aWxsIGp1c3QgbWFrZSB0aGF0IHdlIHNlbGVjdCBkZWVwIGJ1ZmZlcgorICAgIC8vIHdpdGggdmlkZW8gd2hpY2ggc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gYXMgaXQgc2hvdWxkCisgICAgLy8gbm90IHByZXZlbnQgZnJvbSBrZWVwaW5nIEEvViBzeW5jLgorICAgIGlmIChoYXNWaWRlbyAmJgorICAgICAgICAgICAgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LICYmCisgICAgICAgICAgICBkdXJhdGlvblVzCisgICAgICAgICAgICAgICAgPiBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUykgeworICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICB9CisKKyAgICBtT2ZmbG9hZEF1ZGlvID0gbVJlbmRlcmVyLT5vcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgZm9ybWF0LCBvZmZsb2FkT25seSwgaGFzVmlkZW8sIGZsYWdzKTsKKworICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPQorICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgICAgIHNlbmRNZXRhRGF0YVRvSGFsKG1BdWRpb1NpbmssIGF1ZGlvTWV0YSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpjbG9zZUF1ZGlvU2luaygpIHsKKyAgICBtUmVuZGVyZXItPmNsb3NlQXVkaW9TaW5rKCk7Cit9CisKIHN0YXR1c190IE51UGxheWVyOjppbnN0YW50aWF0ZURlY29kZXIoYm9vbCBhdWRpbywgc3A8RGVjb2Rlcj4gKmRlY29kZXIpIHsKICAgICBpZiAoKmRlY29kZXIgIT0gTlVMTCkgewogICAgICAgICByZXR1cm4gT0s7CkBAIC05MjIsMTggKzExNTcsNTcgQEAKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogICAgICAgICBtVmlkZW9Jc0FWQyA9ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZS5jX3N0cigpKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gY2NOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgbUNDRGVjb2RlciA9IG5ldyBDQ0RlY29kZXIoY2NOb3RpZnkpOworCisgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzZWN1cmUiLCB0cnVlKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPQotICAgICAgICBuZXcgQU1lc3NhZ2UoYXVkaW8gPyBrV2hhdEF1ZGlvTm90aWZ5IDoga1doYXRWaWRlb05vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgIGlkKCkpOworICAgIGlmIChhdWRpbykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9Ob3RpZnksIGlkKCkpOworICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24pOwogCi0gICAgKmRlY29kZXIgPSBhdWRpbyA/IG5ldyBEZWNvZGVyKG5vdGlmeSkgOgotICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVjb2Rlcihub3RpZnksIG1OYXRpdmVXaW5kb3cpOwotICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIoKmRlY29kZXIpOworICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VmlkZW9Ob3RpZnksIGlkKCkpOworICAgICAgICArK21WaWRlb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOwogCisgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtTmF0aXZlV2luZG93KTsKKyAgICB9CisgICAgKCpkZWNvZGVyKS0+aW5pdCgpOwogICAgICgqZGVjb2RlciktPmNvbmZpZ3VyZShmb3JtYXQpOwogCisgICAgLy8gYWxsb2NhdGUgYnVmZmVycyB0byBkZWNyeXB0IHdpZGV2aW5lIHNvdXJjZSBidWZmZXJzCisgICAgaWYgKCFhdWRpbyAmJiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkpIHsKKyAgICAgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gaW5wdXRCdWZzOworICAgICAgICBDSEVDS19FUSgoKmRlY29kZXIpLT5nZXRJbnB1dEJ1ZmZlcnMoJmlucHV0QnVmcyksIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1lZGlhQnVmczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dEJ1ZnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSBpbnB1dEJ1ZnNbaV07CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbWVkaWFCdWZzLnB1c2gobWJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zZXRCdWZmZXJzKGF1ZGlvLCBtZWRpYUJ1ZnMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhQnVmcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIG1lZGlhQnVmc1tpXS0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVkaWFCdWZzLmNsZWFyKCk7CisgICAgICAgICAgICBBTE9HRSgiU2VjdXJlIHNvdXJjZSBkaWRuJ3Qgc3VwcG9ydCBzZWN1cmUgbWVkaWFCdWZzLiIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTk0MSw4ICsxMjE1LDkgQEAKICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CiAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKIAotICAgIGlmICgoYXVkaW8gJiYgSXNGbHVzaGluZ1N0YXRlKG1GbHVzaGluZ0F1ZGlvKSkKLSAgICAgICAgICAgIHx8ICghYXVkaW8gJiYgSXNGbHVzaGluZ1N0YXRlKG1GbHVzaGluZ1ZpZGVvKSkpIHsKKyAgICBpZiAoKGF1ZGlvICYmIG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUpCisgICAgICAgICAgICB8fCAoIWF1ZGlvICYmIG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUpCisgICAgICAgICAgICB8fCBtU291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBJTkZPX0RJU0NPTlRJTlVJVFkpOwogICAgICAgICByZXBseS0+cG9zdCgpOwogICAgICAgICByZXR1cm4gT0s7CkBAIC05NTAsMTQgKzEyMjUsMzcgQEAKIAogICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CiAKKyAgICAvLyBBZ2dyZWdhdGUgc21hbGxlciBidWZmZXJzIGludG8gYSBsYXJnZXIgYnVmZmVyLgorICAgIC8vIFRoZSBnb2FsIGlzIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbi4KKyAgICAvLyBOb3RlIHRoaXMgd2lsbCBub3Qgd29yayBpZiB0aGUgZGVjb2RlciByZXF1aXJlcyBvbmUgZnJhbWUgcGVyIGJ1ZmZlci4KKyAgICBib29sIGRvQnVmZmVyQWdncmVnYXRpb24gPSAoYXVkaW8gJiYgbU9mZmxvYWRBdWRpbyk7CisgICAgYm9vbCBuZWVkTW9yZURhdGEgPSBmYWxzZTsKKwogICAgIGJvb2wgZHJvcEFjY2Vzc1VuaXQ7CiAgICAgZG8gewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdChhdWRpbywgJmFjY2Vzc1VuaXQpOworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIC8vIERpZCB3ZSBzYXZlIGFuIGFjY2Vzc1VuaXQgZWFybGllciBiZWNhdXNlIG9mIGEgZGlzY29udGludWl0eT8KKyAgICAgICAgaWYgKGF1ZGlvICYmIChtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCAhPSBOVUxMKSkgeworICAgICAgICAgICAgYWNjZXNzVW5pdCA9IG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0OworICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGVyciA9IG1QZW5kaW5nQXVkaW9FcnI7CisgICAgICAgICAgICBBTE9HVigiZmVlZERlY29kZXJJbnB1dERhdGEoKSB1c2UgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGF1ZGlvLCAmYWNjZXNzVW5pdCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7CisgICAgICAgICAgICAgICAgaWYgKGRvQnVmZmVyQWdncmVnYXRpb24gJiYgKG1BZ2dyZWdhdGVCdWZmZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIHNvbWUgZGF0YSBzbyBzYXZlIHRoaXMgZm9yIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvRXJyID0gZXJyOworICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCA9IGFjY2Vzc1VuaXQ7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZlZWREZWNvZGVySW5wdXREYXRhKCkgc2F2ZSBkaXNjb250aW51aXR5IGZvciBsYXRlciIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwogICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKTsKIApAQCAtMTAwMiwzNCArMTMwMCw0NCBAQAogICAgICAgICAgICAgICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcgPQogICAgICAgICAgICAgICAgICAgICBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nIHx8IHRpbWVDaGFuZ2U7CiAKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlIHx8IHRpbWVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUgJiYgbUZsdXNoaW5nVmlkZW8gPT0gTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHdlJ2xsIHJlc3VtZSBzY2FubmluZyBzb3VyY2VzIG9uY2Ugd2UncmUgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmx1c2hpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfZnJvbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXI6OnBlcmZvcm1TY2FuU291cmNlcykpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBzZWFtbGVzc0Zvcm1hdENoYW5nZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VhbWxlc3NGb3JtYXRDaGFuZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPnN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UobmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgc2VhbWxlc3MgZm9ybWF0IGNoYW5nZSBzZXBhcmF0ZWx5CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdENoYW5nZSA9ICFzZWFtbGVzc0Zvcm1hdENoYW5nZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBzaHV0ZG93bk9yRmx1c2ggPSBmb3JtYXRDaGFuZ2UgfHwgdGltZUNoYW5nZTsKIAotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8RGVjb2Rlcj4gJmRlY29kZXIgPSBhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlICYmICFkZWNvZGVyLT5zdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKG5ld0Zvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoRGVjb2RlcihhdWRpbywgLyogbmVlZFNodXRkb3duID0gKi8gdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbHVzaERlY29kZXIoYXVkaW8sIC8qIG5lZWRTaHV0ZG93biA9ICovIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBxdWV1ZSB1cCBzY2FuLXNvdXJjZXMgb25seSBvbmNlIHBlciBkaXNjb250aW51aXR5LgorICAgICAgICAgICAgICAgIC8vIFdlIGNvbnRyb2wgdGhpcyBieSBkb2luZyBpdCBvbmx5IGlmIG5laXRoZXIgYXVkaW8gbm9yIHZpZGVvIGFyZQorICAgICAgICAgICAgICAgIC8vIGZsdXNoaW5nIG9yIHNodXR0aW5nIGRvd24uICAoQWZ0ZXIgaGFuZGxpbmcgMXN0IGRpc2NvbnRpbnVpdHksIG9uZQorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBmbHVzaGluZyBzdGF0ZXMgd2lsbCBub3QgYmUgTk9ORS4pCisgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzY2FuIHNvdXJjZXMgaWYgdGhpcyBkaXNjb250aW51aXR5IGRvZXMgbm90IHJlc3VsdAorICAgICAgICAgICAgICAgIC8vIGluIGEgZmx1c2ggb3Igc2h1dGRvd24sIGFzIHRoZSBmbHVzaGluZyBzdGF0ZSB3aWxsIHN0YXkgTk9ORS4KKyAgICAgICAgICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSAmJiBtRmx1c2hpbmdWaWRlbyA9PSBOT05FICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bk9yRmx1c2gpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHdlJ2xsIHJlc3VtZSBzY2FubmluZyBzb3VyY2VzIG9uY2Ugd2UncmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAvLyBmbHVzaGluZy4KKyAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2Zyb250KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSAvKiBub3Qgc2VhbWxlc3MgKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBjaGFuZ2UgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICBmbHVzaERlY29kZXIoYXVkaW8sIC8qIG5lZWRTaHV0ZG93biA9ICovIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZUNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGZsdXNoCisgICAgICAgICAgICAgICAgICAgIGZsdXNoRGVjb2RlcihhdWRpbywgLyogbmVlZFNodXRkb3duID0gKi8gZmFsc2UsIG5ld0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VhbWxlc3NGb3JtYXRDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV1c2UgZXhpc3RpbmcgZGVjb2RlciBhbmQgZG9uJ3QgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlRGVjb2RlckZvcm1hdFdpdGhvdXRGbHVzaChhdWRpbywgbmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gaXMgdW5hZmZlY3RlZCBieSB0aGUgZGlzY29udGludWl0eQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBGTFVTSEVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBGTFVTSEVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7Ci0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMDQ1LDEzICsxMzUzLDU4IEBACiAKICAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSBmYWxzZTsKICAgICAgICAgaWYgKCFhdWRpbwotICAgICAgICAgICAgICAgICYmIG1WaWRlb0xhdGVCeVVzID4gMTAwMDAwbGwKKyAgICAgICAgICAgICAgICAmJiAhKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpCisgICAgICAgICAgICAgICAgJiYgbVJlbmRlcmVyLT5nZXRWaWRlb0xhdGVCeVVzKCkgPiAxMDAwMDBsbAogICAgICAgICAgICAgICAgICYmIG1WaWRlb0lzQVZDCiAgICAgICAgICAgICAgICAgJiYgIUlzQVZDUmVmZXJlbmNlRnJhbWUoYWNjZXNzVW5pdCkpIHsKICAgICAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gdHJ1ZTsKICAgICAgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgICAgIH0KLSAgICB9IHdoaWxlIChkcm9wQWNjZXNzVW5pdCk7CisKKyAgICAgICAgc2l6ZV90IHNtYWxsU2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKKyAgICAgICAgbmVlZE1vcmVEYXRhID0gZmFsc2U7CisgICAgICAgIGlmIChkb0J1ZmZlckFnZ3JlZ2F0aW9uICYmIChtQWdncmVnYXRlQnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGlmIG9ubHkgcm9vbSBmb3IgYSBmZXcgc21hbGwgYnVmZmVycy4KKyAgICAgICAgICAgICAgICAmJiAoc21hbGxTaXplIDwgKGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMgLyAzKSkpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIGxhcmdlciBidWZmZXIgZm9yIGNvbWJpbmluZyBzbWFsbGVyIGJ1ZmZlcnMgZnJvbSB0aGUgZXh0cmFjdG9yLgorICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMpOworICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7IC8vIHN0YXJ0IGVtcHR5CisgICAgICAgIH0KKworICAgICAgICBpZiAoZG9CdWZmZXJBZ2dyZWdhdGlvbiAmJiAobUFnZ3JlZ2F0ZUJ1ZmZlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBpbnQ2NF90IGR1bW15OworICAgICAgICAgICAgYm9vbCBzbWFsbFRpbWVzdGFtcFZhbGlkID0gYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpOworICAgICAgICAgICAgYm9vbCBiaWdUaW1lc3RhbXBWYWxpZCA9IG1BZ2dyZWdhdGVCdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZHVtbXkpOworICAgICAgICAgICAgLy8gV2lsbCB0aGUgc21hbGxlciBidWZmZXIgZml0PworICAgICAgICAgICAgc2l6ZV90IGJpZ1NpemUgPSBtQWdncmVnYXRlQnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBzaXplX3Qgcm9vbUxlZnQgPSBtQWdncmVnYXRlQnVmZmVyLT5jYXBhY2l0eSgpIC0gYmlnU2l6ZTsKKyAgICAgICAgICAgIC8vIFNob3VsZCB3ZSBzYXZlIHRoaXMgc21hbGwgYnVmZmVyIGZvciB0aGUgbmV4dCBiaWcgYnVmZmVyPworICAgICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IHNtYWxsIGJ1ZmZlciBkaWQgbm90IGhhdmUgYSB0aW1lc3RhbXAgdGhlbiBzYXZlCisgICAgICAgICAgICAvLyBhbnkgYnVmZmVyIHRoYXQgZG9lcyBoYXZlIGEgdGltZXN0YW1wIHVudGlsIHRoZSBuZXh0IGJpZyBidWZmZXIuCisgICAgICAgICAgICBpZiAoKHNtYWxsU2l6ZSA+IHJvb21MZWZ0KQorICAgICAgICAgICAgICAgIHx8ICghYmlnVGltZXN0YW1wVmFsaWQgJiYgKGJpZ1NpemUgPiAwKSAmJiBzbWFsbFRpbWVzdGFtcFZhbGlkKSkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9FcnIgPSBlcnI7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQgPSBhY2Nlc3NVbml0OworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gR3JhYiB0aW1lIGZyb20gZmlyc3Qgc21hbGwgYnVmZmVyIGlmIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICBpZiAoKGJpZ1NpemUgPT0gMCkgJiYgc21hbGxUaW1lc3RhbXBWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBcHBlbmQgc21hbGwgYnVmZmVyIHRvIHRoZSBiaWdnZXIgYnVmZmVyLgorICAgICAgICAgICAgICAgIG1lbWNweShtQWdncmVnYXRlQnVmZmVyLT5iYXNlKCkgKyBiaWdTaXplLCBhY2Nlc3NVbml0LT5kYXRhKCksIHNtYWxsU2l6ZSk7CisgICAgICAgICAgICAgICAgYmlnU2l6ZSArPSBzbWFsbFNpemU7CisgICAgICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2V0UmFuZ2UoMCwgYmlnU2l6ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgcnVuIG91dCBvZiByb29tIGluIHRoZSBtQWdncmVnYXRlQnVmZmVyLgorICAgICAgICAgICAgICAgIG5lZWRNb3JlRGF0YSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBBTE9HVigiZmVlZERlY29kZXJJbnB1dERhdGEoKSBzbWFsbFNpemUgPSAlenUsIGJpZ1NpemUgPSAlenUsIGNhcGFjaXR5ID0gJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsU2l6ZSwgYmlnU2l6ZSwgbUFnZ3JlZ2F0ZUJ1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChkcm9wQWNjZXNzVW5pdCB8fCBuZWVkTW9yZURhdGEpOwogCiAgICAgLy8gQUxPR1YoInJldHVybmVkIGEgdmFsaWQgYnVmZmVyIG9mICVzIGRhdGEiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKIApAQCAtMTA2Myw3ICsxNDE2LDE5IEBACiAgICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7CiAjZW5kaWYKIAotICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGFjY2Vzc1VuaXQpOworICAgIGlmICghYXVkaW8pIHsKKyAgICAgICAgbUNDRGVjb2Rlci0+ZGVjb2RlKGFjY2Vzc1VuaXQpOworICAgIH0KKworICAgIGlmIChkb0J1ZmZlckFnZ3JlZ2F0aW9uICYmIChtQWdncmVnYXRlQnVmZmVyICE9IE5VTEwpKSB7CisgICAgICAgIEFMT0dWKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHJlcGx5IHdpdGggYWdncmVnYXRlZCBidWZmZXIsICV6dSIsCisgICAgICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgbUFnZ3JlZ2F0ZUJ1ZmZlcik7CisgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXIuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBhY2Nlc3NVbml0KTsKKyAgICB9CisKICAgICByZXBseS0+cG9zdCgpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTA3NSw3ICsxNDQwLDggQEAKICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CiAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKIAotICAgIGlmIChJc0ZsdXNoaW5nU3RhdGUoYXVkaW8gPyBtRmx1c2hpbmdBdWRpbyA6IG1GbHVzaGluZ1ZpZGVvKSkgeworICAgIGlmICgoYXVkaW8gJiYgbUZsdXNoaW5nQXVkaW8gIT0gTk9ORSkKKyAgICAgICAgICAgIHx8ICghYXVkaW8gJiYgbUZsdXNoaW5nVmlkZW8gIT0gTk9ORSkpIHsKICAgICAgICAgLy8gV2UncmUgY3VycmVudGx5IGF0dGVtcHRpbmcgdG8gZmx1c2ggdGhlIGRlY29kZXIsIGluIG9yZGVyCiAgICAgICAgIC8vIHRvIGNvbXBsZXRlIHRoaXMsIHRoZSBkZWNvZGVyIHdhbnRzIGFsbCBpdHMgYnVmZmVycyBiYWNrLAogICAgICAgICAvLyBzbyB3ZSBkb24ndCB3YW50IGFueSBvdXRwdXQgYnVmZmVycyBpdCBzZW50IHVzIChmcm9tIGJlZm9yZQpAQCAtMTA5MSwxNCArMTQ1NywxNSBAQAogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAorICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisKICAgICBpbnQ2NF90ICZza2lwVW50aWxNZWRpYVRpbWVVcyA9CiAgICAgICAgIGF1ZGlvCiAgICAgICAgICAgICA/IG1Ta2lwUmVuZGVyaW5nQXVkaW9VbnRpbE1lZGlhVGltZVVzCiAgICAgICAgICAgICA6IG1Ta2lwUmVuZGVyaW5nVmlkZW9VbnRpbE1lZGlhVGltZVVzOwogCiAgICAgaWYgKHNraXBVbnRpbE1lZGlhVGltZVVzID49IDApIHsKLSAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKLSAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CiAKICAgICAgICAgaWYgKG1lZGlhVGltZVVzIDwgc2tpcFVudGlsTWVkaWFUaW1lVXMpIHsKICAgICAgICAgICAgIEFMT0dWKCJkcm9wcGluZyAlcyBidWZmZXIgYXQgdGltZSAlbGxkIGFzIHJlcXVlc3RlZC4iLApAQCAtMTExMiw5ICsxNDc5LDc5IEBACiAgICAgICAgIHNraXBVbnRpbE1lZGlhVGltZVVzID0gLTE7CiAgICAgfQogCisgICAgaWYgKCFhdWRpbyAmJiBtQ0NEZWNvZGVyLT5pc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgbUNDRGVjb2Rlci0+ZGlzcGxheShtZWRpYVRpbWVVcyk7CisgICAgfQorCiAgICAgbVJlbmRlcmVyLT5xdWV1ZUJ1ZmZlcihhdWRpbywgYnVmZmVyLCByZXBseSk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OnVwZGF0ZVZpZGVvU2l6ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBpZiAoaW5wdXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiVW5rbm93biB2aWRlbyBzaXplLCByZXBvcnRpbmcgMHgwISIpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TRVRfVklERU9fU0laRSwgMCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKKyAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisKKyAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKKyAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKworICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZFJlY3QoCisgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKTsKKworICAgICAgICBkaXNwbGF5V2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7CisgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7CisKKyAgICAgICAgQUxPR1YoIlZpZGVvIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlZCB4ICVkICIKKyAgICAgICAgICAgICAiKGNyb3A6ICVkIHggJWQgQCAoJWQsICVkKSkiLAorICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgZGlzcGxheVdpZHRoLAorICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICAgY3JvcExlZnQsIGNyb3BUb3ApOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJmRpc3BsYXlXaWR0aCkpOworICAgICAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmZGlzcGxheUhlaWdodCkpOworCisgICAgICAgIEFMT0dWKCJWaWRlbyBpbnB1dCBmb3JtYXQgJWQgeCAlZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgfQorCisgICAgLy8gVGFrZSBpbnRvIGFjY291bnQgc2FtcGxlIGFzcGVjdCByYXRpbyBpZiBuZWNlc3Nhcnk6CisgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OworICAgIGlmIChpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpCisgICAgICAgICAgICAmJiBpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCkpIHsKKyAgICAgICAgQUxPR1YoIlNhbXBsZSBhc3BlY3QgcmF0aW8gJWQgOiAlZCIsIHNhcldpZHRoLCBzYXJIZWlnaHQpOworCisgICAgICAgIGRpc3BsYXlXaWR0aCA9IChkaXNwbGF5V2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7CisKKyAgICAgICAgQUxPR1YoImRpc3BsYXkgZGltZW5zaW9ucyAlZCB4ICVkIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIWlucHV0Rm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0KKworICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgeworICAgICAgICBpbnQzMl90IHRtcCA9IGRpc3BsYXlXaWR0aDsKKyAgICAgICAgZGlzcGxheVdpZHRoID0gZGlzcGxheUhlaWdodDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IHRtcDsKKyAgICB9CisKKyAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLAorICAgICAgICAgICAgZGlzcGxheVdpZHRoLAorICAgICAgICAgICAgZGlzcGxheUhlaWdodCk7Cit9CisKIHZvaWQgTnVQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewogICAgIGlmIChtRHJpdmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTEyOSw2MyArMTU2Niw3MiBAQAogICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIobXNnLCBleHQxLCBleHQyLCBpbik7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OmZsdXNoRGVjb2Rlcihib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93bikgewordm9pZCBOdVBsYXllcjo6Zmx1c2hEZWNvZGVyKAorICAgICAgICBib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93biwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZuZXdGb3JtYXQpIHsKICAgICBBTE9HVigiWyVzXSBmbHVzaERlY29kZXIgbmVlZFNodXRkb3duPSVkIiwKICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBuZWVkU2h1dGRvd24pOwogCi0gICAgaWYgKChhdWRpbyAmJiBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHx8ICghYXVkaW8gJiYgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgeworICAgIGNvbnN0IHNwPERlY29kZXI+ICZkZWNvZGVyID0gZ2V0RGVjb2RlcihhdWRpbyk7CisgICAgaWYgKGRlY29kZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HSSgiZmx1c2hEZWNvZGVyICVzIHdpdGhvdXQgZGVjb2RlciBwcmVzZW50IiwKICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBjb250aW51ZSB0byBzY2FuIHNvdXJjZXMgdW50aWwgd2UgZmluaXNoIGZsdXNoaW5nLgogICAgICsrbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7CiAKLSAgICAoYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlciktPnNpZ25hbEZsdXNoKCk7CisgICAgZGVjb2Rlci0+c2lnbmFsRmx1c2gobmV3Rm9ybWF0KTsKICAgICBtUmVuZGVyZXItPmZsdXNoKGF1ZGlvKTsKIAogICAgIEZsdXNoU3RhdHVzIG5ld1N0YXR1cyA9CiAgICAgICAgIG5lZWRTaHV0ZG93biA/IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04gOiBGTFVTSElOR19ERUNPREVSOwogCisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2ZhbHNlIC8qIGlzRGVjb2RlciAqL10gPSBmYWxzZTsKKyAgICBtRmx1c2hDb21wbGV0ZVthdWRpb11bdHJ1ZSAvKiBpc0RlY29kZXIgKi9dID0gZmFsc2U7CiAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIENIRUNLKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUKLSAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdBdWRpbyA9PSBBV0FJVElOR19ESVNDT05USU5VSVRZKTsKLQorICAgICAgICBBTE9HRV9JRihtRmx1c2hpbmdBdWRpbyAhPSBOT05FLAorICAgICAgICAgICAgICAgICJhdWRpbyBmbHVzaERlY29kZXIoKSBpcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtRmx1c2hpbmdBdWRpbyk7CiAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gbmV3U3RhdHVzOwotCi0gICAgICAgIGlmIChtRmx1c2hpbmdWaWRlbyA9PSBOT05FKSB7Ci0gICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgPyBBV0FJVElOR19ESVNDT05USU5VSVRZCi0gICAgICAgICAgICAgICAgOiBGTFVTSEVEOwotICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0sobUZsdXNoaW5nVmlkZW8gPT0gTk9ORQotICAgICAgICAgICAgICAgIHx8IG1GbHVzaGluZ1ZpZGVvID09IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkpOwotCisgICAgICAgIEFMT0dFX0lGKG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUsCisgICAgICAgICAgICAgICAgInZpZGVvIGZsdXNoRGVjb2RlcigpIGlzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1GbHVzaGluZ1ZpZGVvKTsKICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBuZXdTdGF0dXM7CiAKLSAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUpIHsKLSAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICA/IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkKLSAgICAgICAgICAgICAgICA6IEZMVVNIRUQ7CisgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1DQ0RlY29kZXItPmZsdXNoKCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXNwPEFNZXNzYWdlPiBOdVBsYXllcjo6U291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YShhdWRpbyk7Cit2b2lkIE51UGxheWVyOjp1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoKAorICAgICAgICBib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIEFMT0dWKCJbJXNdIHVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2giLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKIAotICAgIGlmIChtZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29uc3Qgc3A8RGVjb2Rlcj4gJmRlY29kZXIgPSBnZXREZWNvZGVyKGF1ZGlvKTsKKyAgICBpZiAoZGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJ1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoICVzIHdpdGhvdXQgZGVjb2RlciBwcmVzZW50IiwKKyAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgZGVjb2Rlci0+c2lnbmFsVXBkYXRlRm9ybWF0KGZvcm1hdCk7Cit9CiAKLSAgICBpZihjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJm1zZykgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Cit2b2lkIE51UGxheWVyOjpxdWV1ZURlY29kZXJTaHV0ZG93bigKKyAgICAgICAgYm9vbCBhdWRpbywgYm9vbCB2aWRlbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIEFMT0dJKCJxdWV1ZURlY29kZXJTaHV0ZG93biBhdWRpbz0lZCwgdmlkZW89JWQiLCBhdWRpbywgdmlkZW8pOworCisgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICBuZXcgU2h1dGRvd25EZWNvZGVyQWN0aW9uKGF1ZGlvLCB2aWRlbykpOworCisgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgUG9zdE1lc3NhZ2VBY3Rpb24ocmVwbHkpKTsKKworICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OnNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKSB7CkBAIC0xMjExLDYgKzE2NTcsMTkgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBOdVBsYXllcjo6Z2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgaWQoKSk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE51UGxheWVyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VsZWN0VHJhY2ssIGlkKCkpOwogICAgIG1zZy0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwpAQCAtMTIxOSw5ICsxNjc4LDM1IEBACiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKIAorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKwogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE51UGxheWVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcykgeworICAgIHNwPFJlbmRlcmVyPiByZW5kZXJlciA9IG1SZW5kZXJlcjsKKyAgICBpZiAocmVuZGVyZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZXItPmdldEN1cnJlbnRQb3NpdGlvbihtZWRpYVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6Z2V0U3RhdHMoaW50NjRfdCAqbnVtRnJhbWVzVG90YWwsIGludDY0X3QgKm51bUZyYW1lc0Ryb3BwZWQpIHsKKyAgICAqbnVtRnJhbWVzVG90YWwgPSBtTnVtRnJhbWVzVG90YWw7CisgICAgKm51bUZyYW1lc0Ryb3BwZWQgPSBtTnVtRnJhbWVzRHJvcHBlZDsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyOjpnZXRGaWxlTWV0YSgpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0RmlsZUZvcm1hdE1ldGEoKTsKK30KKwogdm9pZCBOdVBsYXllcjo6c2NoZWR1bGVQb2xsRHVyYXRpb24oKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxEdXJhdGlvbiwgaWQoKSk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uKTsKQEAgLTEyMzgsMTggKzE3MjMsNiBAQAogICAgICAgICAvLyBhbiBpbnRlcm1lZGlhdGUgc3RhdGUsIGkuZS4gb25lIG1vcmUgbW9yZSBkZWNvZGVycyBhcmUgY3VycmVudGx5CiAgICAgICAgIC8vIGZsdXNoaW5nIG9yIHNodXR0aW5nIGRvd24uCiAKLSAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIGFuIGVkZ2UgY2FzZSB3aGVyZSB0aGUgcmVuZGVyZXIgb3ducyBhbGwgb3V0cHV0Ci0gICAgICAgICAgICAvLyBidWZmZXJzIGFuZCBpcyBwYXVzZWQsIHRoZXJlZm9yZSB0aGUgZGVjb2RlciB3aWxsIG5vdCByZWFkCi0gICAgICAgICAgICAvLyBtb3JlIGlucHV0IGRhdGEgYW5kIHdpbGwgbmV2ZXIgZW5jb3VudGVyIHRoZSBtYXRjaGluZwotICAgICAgICAgICAgLy8gZGlzY29udGludWl0eS4gVG8gYXZvaWQgdGhpcywgd2UgcmVzdW1lIHRoZSByZW5kZXJlci4KLQotICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUZsdXNoaW5nVmlkZW8gPT0gQVdBSVRJTkdfRElTQ09OVElOVUlUWSkgewotICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSB8fCBtRmx1c2hpbmdWaWRlbyAhPSBOT05FKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgZmx1c2hpbmcsIHBvc3Rwb25lIHRoZSByZXNldCB1bnRpbCB0aGF0J3MKICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC4KQEAgLTEyNjcsMTggKzE3NDAsMjkgQEAKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OnBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcykgewotICAgIEFMT0dWKCJwZXJmb3JtU2VlayBzZWVrVGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcykiLAordm9pZCBOdVBsYXllcjo6cGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpIHsKKyAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBuZWVkTm90aWZ5KCVkKSIsCiAgICAgICAgICAgc2Vla1RpbWVVcywKLSAgICAgICAgICBzZWVrVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICBzZWVrVGltZVVzIC8gMUU2LAorICAgICAgICAgIG5lZWROb3RpZnkpOwogCisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZXNldCBvY2N1cnMgcmlnaHQgYmVmb3JlIHRoZSBsb29wIG1vZGUKKyAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgc2Vla3MgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCwKKyAgICAgICAgICAgICAgICAibVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKKyAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcyk7CisgICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKIAogICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UG9zaXRpb24oc2Vla1RpbWVVcyk7Ci0gICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNlZWtDb21wbGV0ZSgpOworICAgICAgICAgICAgaWYgKG5lZWROb3RpZnkpIHsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNlZWtDb21wbGV0ZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzEzLDE0ICsxNzk3LDYgQEAKIAogICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcgPSB0cnVlOwogCi0gICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUgJiYgKCFhdWRpbyB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpKSB7Ci0gICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gRkxVU0hFRDsKLSAgICB9Ci0KLSAgICBpZiAobUZsdXNoaW5nVmlkZW8gPT0gTk9ORSAmJiAoIXZpZGVvIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBGTFVTSEVEOwotICAgIH0KLQogICAgIGlmIChhdWRpbyAmJiBtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgZmx1c2hEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sIHRydWUgLyogbmVlZFNodXRkb3duICovKTsKICAgICB9CkBAIC0xMzQxLDEzICsxODE3LDE5IEBACiAgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOwogICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKIAorICAgIGlmIChtUmVuZGVyZXJMb29wZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtUmVuZGVyZXJMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbVJlbmRlcmVyTG9vcGVyLmNsZWFyKCk7CisgICAgfQogICAgIG1SZW5kZXJlci5jbGVhcigpOworICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwogCi0gICAgICAgIGxvb3BlcigpLT51bnJlZ2lzdGVySGFuZGxlcihtU291cmNlLT5pZCgpKTsKLQogICAgICAgICBtU291cmNlLmNsZWFyKCk7CiAgICAgfQogCkBAIC0xNDA4LDE2ICsxODkwLDE1IEBACiAKICAgICAgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKGVycik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0NDYsMTEgKzE5MjcsMTkgQEAKIAogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRWaWRlb1NpemVDaGFuZ2VkOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TRVRfVklERU9fU0laRSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0QnVmZmVyaW5nVXBkYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHBlcmNlbnRhZ2U7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGVyY2VudGFnZSIsICZwZXJjZW50YWdlKSk7CisKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ3MSwyMSArMTk2MCw0MCBAQAogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CiAKLSAgICAgICAgICAgIGludDMyX3QgdHJhY2tJbmRleDsKLSAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBkdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgMCAvKiBiYXNlSW5kZXggKi8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRUaW1lZFRleHREYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgJiYgZ2VuZXJhdGlvbiAhPSBtVGltZWRUZXh0R2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKKworICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGRyaXZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBwb3NNczsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBwb3NVczsKKyAgICAgICAgICAgIGRyaXZlci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZwb3NNcyk7CisgICAgICAgICAgICBwb3NVcyA9IHBvc01zICogMTAwMDsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogCi0gICAgICAgICAgICBQYXJjZWwgaW47Ci0gICAgICAgICAgICBpbi53cml0ZUludDMyKHRyYWNrSW5kZXgpOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQ2NChkdXJhdGlvblVzKTsKLSAgICAgICAgICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TVUJUSVRMRV9EQVRBLCAwLCAwLCAmaW4pOworICAgICAgICAgICAgaWYgKHBvc1VzIDwgdGltZVVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVRpbWVkVGV4dEdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QodGltZVVzIC0gcG9zVXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZW5kVGltZWRUZXh0RGF0YShidWZmZXIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTUwMiwxMyArMjAxMCwxMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtTm9MaWNlbnNlOgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgRVJST1JfRFJNX05PX0xJQ0VOU0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6Om9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2hhdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSBOdVBsYXllcjo6Q0NEZWNvZGVyOjprV2hhdENsb3NlZENhcHRpb25EYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgaW5iYW5kVHJhY2tzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBOdVBsYXllcjo6Q0NEZWNvZGVyOjprV2hhdFRyYWNrQWRkZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0lORk8sIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKworfQorCit2b2lkIE51UGxheWVyOjpzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KSB7CisgICAgaW50MzJfdCB0cmFja0luZGV4OworICAgIGludDY0X3QgdGltZVVzLCBkdXJhdGlvblVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKKworICAgIFBhcmNlbCBpbjsKKyAgICBpbi53cml0ZUludDMyKHRyYWNrSW5kZXggKyBiYXNlSW5kZXgpOworICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKKyAgICBpbi53cml0ZUludDY0KGR1cmF0aW9uVXMpOworICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOworICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOworICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TVUJUSVRMRV9EQVRBLCAwLCAwLCAmaW4pOworfQorCit2b2lkIE51UGxheWVyOjpzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6TE9DQUxfREVTQ1JJUFRJT05TOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKyAgICBDSEVDSyhzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSA9PSAwKTsKKworICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBQYXJjZWwgcGFyY2VsOworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgIGZsYWcgfD0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFA7CisgICAgICAgIFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSwgc2l6ZSwgZmxhZywgdGltZVVzIC8gMTAwMCwgJnBhcmNlbCk7CisgICAgfQorCisgICAgaWYgKChwYXJjZWwuZGF0YVNpemUoKSA+IDApKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1RJTUVEX1RFWFQsIDAsIDAsICZwYXJjZWwpOworICAgIH0gZWxzZSB7ICAvLyBzZW5kIGFuIGVtcHR5IHRpbWVkIHRleHQKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRURfVEVYVCwgMCwgMCk7CisgICAgfQorfQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAorc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpTb3VyY2U6OmdldEZvcm1hdChib29sIGF1ZGlvKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGb3JtYXRNZXRhKGF1ZGlvKTsKKworICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKworICAgIGlmKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmbXNnKSA9PSBPSykgeworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwogdm9pZCBOdVBsYXllcjo6U291cmNlOjpub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RmxhZ3NDaGFuZ2VkKTsKQEAgLTE1MTYsMTEgKzIxMjMsMTAgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6U291cmNlOjpub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Cit2b2lkIE51UGxheWVyOjpTb3VyY2U6Om5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKQEAgLTE1MzEsMjMgKzIxMzcsOCBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Cit2b2lkIE51UGxheWVyOjpTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgewogICAgIFRSRVNQQVNTKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OnF1ZXVlRGVjb2RlclNodXRkb3duKAotICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgQUxPR0koInF1ZXVlRGVjb2RlclNodXRkb3duIGF1ZGlvPSVkLCB2aWRlbz0lZCIsIGF1ZGlvLCB2aWRlbyk7Ci0KLSAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgIG5ldyBTaHV0ZG93bkRlY29kZXJBY3Rpb24oYXVkaW8sIHZpZGVvKSk7Ci0KLSAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKLQotICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBQb3N0TWVzc2FnZUFjdGlvbihyZXBseSkpOwotCi0gICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAppbmRleCA1OTBlMWYyLi5kNjEyMGQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApAQCAtMjQsNyArMjQsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBQ29kZWM7CitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBNZXRhRGF0YTsKIHN0cnVjdCBOdVBsYXllckRyaXZlcjsKIApAQCAtMzgsNyArMzksOSBAQAogICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwogCiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKQEAgLTU2LDEyICs1OSwyMCBAQAogICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5UmVzZXRDb21wbGV0ZSIgb25jZSBmaW5pc2hlZC4KICAgICB2b2lkIHJlc2V0QXN5bmMoKTsKIAotICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5U2Vla0NvbXBsZXRlIiBvbmNlIGZpbmlzaGVkLgotICAgIHZvaWQgc2Vla1RvQXN5bmMoaW50NjRfdCBzZWVrVGltZVVzKTsKKyAgICAvLyBXaWxsIG5vdGlmeSB0aGUgZHJpdmVyIHRocm91Z2ggIm5vdGlmeVNlZWtDb21wbGV0ZSIgb25jZSBmaW5pc2hlZAorICAgIC8vIGFuZCBuZWVkTm90aWZ5IGlzIHRydWUuCisgICAgdm9pZCBzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSA9IGZhbHNlKTsKIAogICAgIHN0YXR1c190IHNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKTsKICAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOworICAgIHZvaWQgZ2V0U3RhdHMoaW50NjRfdCAqbU51bUZyYW1lc1RvdGFsLCBpbnQ2NF90ICptTnVtRnJhbWVzRHJvcHBlZCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZ2V0RmlsZU1ldGEoKTsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlczsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51UGxheWVyKCk7CkBAIC03NCw2ICs4NSw4IEBACiAKIHByaXZhdGU6CiAgICAgc3RydWN0IERlY29kZXI7CisgICAgc3RydWN0IERlY29kZXJQYXNzVGhyb3VnaDsKKyAgICBzdHJ1Y3QgQ0NEZWNvZGVyOwogICAgIHN0cnVjdCBHZW5lcmljU291cmNlOwogICAgIHN0cnVjdCBIVFRQTGl2ZVNvdXJjZTsKICAgICBzdHJ1Y3QgUmVuZGVyZXI7CkBAIC05Niw2ICsxMDksNyBAQAogICAgICAgICBrV2hhdFNjYW5Tb3VyY2VzICAgICAgICAgICAgICAgID0gJ3NjYW4nLAogICAgICAgICBrV2hhdFZpZGVvTm90aWZ5ICAgICAgICAgICAgICAgID0gJ3ZpZE4nLAogICAgICAgICBrV2hhdEF1ZGlvTm90aWZ5ICAgICAgICAgICAgICAgID0gJ2F1ZE4nLAorICAgICAgICBrV2hhdENsb3NlZENhcHRpb25Ob3RpZnkgICAgICAgID0gJ2NhcE4nLAogICAgICAgICBrV2hhdFJlbmRlcmVyTm90aWZ5ICAgICAgICAgICAgID0gJ3Jlbk4nLAogICAgICAgICBrV2hhdFJlc2V0ICAgICAgICAgICAgICAgICAgICAgID0gJ3JzZXQnLAogICAgICAgICBrV2hhdFNlZWsgICAgICAgICAgICAgICAgICAgICAgID0gJ3NlZWsnLApAQCAtMTA0LDYgKzExOCw3IEBACiAgICAgICAgIGtXaGF0UG9sbER1cmF0aW9uICAgICAgICAgICAgICAgPSAncG9sRCcsCiAgICAgICAgIGtXaGF0U291cmNlTm90aWZ5ICAgICAgICAgICAgICAgPSAnc3JjTicsCiAgICAgICAgIGtXaGF0R2V0VHJhY2tJbmZvICAgICAgICAgICAgICAgPSAnZ1RySScsCisgICAgICAgIGtXaGF0R2V0U2VsZWN0ZWRUcmFjayAgICAgICAgICAgPSAnZ1NlbCcsCiAgICAgICAgIGtXaGF0U2VsZWN0VHJhY2sgICAgICAgICAgICAgICAgPSAnc2VsVCcsCiAgICAgfTsKIApAQCAtMTE2LDkgKzEzMSwxNCBAQAogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHNwPERlY29kZXI+IG1WaWRlb0RlY29kZXI7CiAgICAgYm9vbCBtVmlkZW9Jc0FWQzsKLSAgICBib29sIG1OZWVkc1N3UmVuZGVyZXI7CisgICAgYm9vbCBtT2ZmbG9hZEF1ZGlvOwogICAgIHNwPERlY29kZXI+IG1BdWRpb0RlY29kZXI7CisgICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOwogICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7CisgICAgc3A8QUxvb3Blcj4gbVJlbmRlcmVyTG9vcGVyOworICAgIGludDMyX3QgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1SZW5kZXJlckdlbmVyYXRpb247CiAKICAgICBMaXN0PHNwPEFjdGlvbj4gPiBtRGVmZXJyZWRBY3Rpb25zOwogCkBAIC0xMjksMTAgKzE0OSwxMCBAQAogICAgIGludDMyX3QgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKIAogICAgIGludDMyX3QgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVGltZWRUZXh0R2VuZXJhdGlvbjsKIAogICAgIGVudW0gRmx1c2hTdGF0dXMgewogICAgICAgICBOT05FLAotICAgICAgICBBV0FJVElOR19ESVNDT05USU5VSVRZLAogICAgICAgICBGTFVTSElOR19ERUNPREVSLAogICAgICAgICBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOLAogICAgICAgICBTSFVUVElOR19ET1dOX0RFQ09ERVIsCkBAIC0xNDQsMzEgKzE2NCw2MCBAQAogICAgIC8vIG5vdGlvbiBvZiB0aW1lIGhhcyBjaGFuZ2VkLgogICAgIGJvb2wgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZzsKIAorICAgIC8vIFN0YXR1cyBvZiBmbHVzaCByZXNwb25zZXMgZnJvbSB0aGUgZGVjb2RlciBhbmQgcmVuZGVyZXIuCisgICAgYm9vbCBtRmx1c2hDb21wbGV0ZVsyXVsyXTsKKworICAgIC8vIFVzZWQgYnkgZmVlZERlY29kZXJJbnB1dERhdGEgdG8gYWdncmVnYXRlIHNtYWxsIGJ1ZmZlcnMgaW50bworICAgIC8vIG9uZSBsYXJnZSBidWZmZXIuCisgICAgc3A8QUJ1ZmZlcj4gbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQ7CisgICAgc3RhdHVzX3QgICAgbVBlbmRpbmdBdWRpb0VycjsKKyAgICBzcDxBQnVmZmVyPiBtQWdncmVnYXRlQnVmZmVyOworCiAgICAgRmx1c2hTdGF0dXMgbUZsdXNoaW5nQXVkaW87CiAgICAgRmx1c2hTdGF0dXMgbUZsdXNoaW5nVmlkZW87CiAKICAgICBpbnQ2NF90IG1Ta2lwUmVuZGVyaW5nQXVkaW9VbnRpbE1lZGlhVGltZVVzOwogICAgIGludDY0X3QgbVNraXBSZW5kZXJpbmdWaWRlb1VudGlsTWVkaWFUaW1lVXM7CiAKLSAgICBpbnQ2NF90IG1WaWRlb0xhdGVCeVVzOwogICAgIGludDY0X3QgbU51bUZyYW1lc1RvdGFsLCBtTnVtRnJhbWVzRHJvcHBlZDsKIAogICAgIGludDMyX3QgbVZpZGVvU2NhbGluZ01vZGU7CiAKICAgICBib29sIG1TdGFydGVkOwogCisgICAgaW5saW5lIGNvbnN0IHNwPERlY29kZXI+ICZnZXREZWNvZGVyKGJvb2wgYXVkaW8pIHsKKyAgICAgICAgcmV0dXJuIGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXI7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgY2xlYXJGbHVzaENvbXBsZXRlKCkgeworICAgICAgICBtRmx1c2hDb21wbGV0ZVswXVswXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVswXVsxXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVsxXVswXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVsxXVsxXSA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgb3BlbkF1ZGlvU2luayhjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgYm9vbCBvZmZsb2FkT25seSk7CisgICAgdm9pZCBjbG9zZUF1ZGlvU2luaygpOworCiAgICAgc3RhdHVzX3QgaW5zdGFudGlhdGVEZWNvZGVyKGJvb2wgYXVkaW8sIHNwPERlY29kZXI+ICpkZWNvZGVyKTsKIAorICAgIHZvaWQgdXBkYXRlVmlkZW9TaXplKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0ID0gTlVMTCk7CisKICAgICBzdGF0dXNfdCBmZWVkRGVjb2RlcklucHV0RGF0YShib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCByZW5kZXJCdWZmZXIoYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKIAorICAgIHZvaWQgaGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2Rlcik7CiAgICAgdm9pZCBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKIAotICAgIHZvaWQgZmx1c2hEZWNvZGVyKGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duKTsKKyAgICBib29sIGF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCk7CiAKLSAgICBzdGF0aWMgYm9vbCBJc0ZsdXNoaW5nU3RhdGUoRmx1c2hTdGF0dXMgc3RhdGUsIGJvb2wgKm5lZWRTaHV0ZG93biA9IE5VTEwpOworICAgIHZvaWQgZmx1c2hEZWNvZGVyKAorICAgICAgICAgICAgYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbmV3Rm9ybWF0ID0gTlVMTCk7CisgICAgdm9pZCB1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAogICAgIHZvaWQgcG9zdFNjYW5Tb3VyY2VzKCk7CiAKQEAgLTE3Nyw3ICsyMjYsNyBAQAogCiAgICAgdm9pZCBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CiAKLSAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcyk7CisgICAgdm9pZCBwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSk7CiAgICAgdm9pZCBwZXJmb3JtRGVjb2RlckZsdXNoKCk7CiAgICAgdm9pZCBwZXJmb3JtRGVjb2RlclNodXRkb3duKGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8pOwogICAgIHZvaWQgcGVyZm9ybVJlc2V0KCk7CkBAIC0xODUsMTAgKzIzNCwxNiBAQAogICAgIHZvaWQgcGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJndyYXBwZXIpOwogCiAgICAgdm9pZCBvblNvdXJjZU5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkNsb3NlZENhcHRpb25Ob3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdm9pZCBxdWV1ZURlY29kZXJTaHV0ZG93bigKICAgICAgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOwogCisgICAgdm9pZCBzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KTsKKyAgICB2b2lkIHNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgdm9pZCB3cml0ZVRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4gZm9ybWF0KSBjb25zdDsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggMjQyM2ZkNS4uMjdmNjEzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTE3LDE0ICsxNywxOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOdVBsYXllckRlY29kZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgIk51UGxheWVyRGVjb2Rlci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzIsNzAgKzM3LDY1MSBAQAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJm5hdGl2ZVdpbmRvdykKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSB7CisgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCisgICAgICBtQnVmZmVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1QYXVzZWQodHJ1ZSksCisgICAgICBtQ29tcG9uZW50TmFtZSgiZGVjb2RlciIpIHsKKyAgICAvLyBFdmVyeSBkZWNvZGVyIGhhcyBpdHMgb3duIGxvb3BlciBiZWNhdXNlIE1lZGlhQ29kZWMgb3BlcmF0aW9ucworICAgIC8vIGFyZSBibG9ja2luZywgYnV0IE51UGxheWVyIG5lZWRzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgorICAgIG1EZWNvZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk5QRGVjb2RlciIpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworCisgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJOUERlY29kZXItQ0wiKTsKKyAgICBtQ29kZWNMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiB9CiAKIE51UGxheWVyOjpEZWNvZGVyOjp+RGVjb2RlcigpIHsKKyAgICBtRGVjb2Rlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgbURlY29kZXJMb29wZXItPnN0b3AoKTsKKworICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwogfQogCi12b2lkIE51UGxheWVyOjpEZWNvZGVyOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKK3N0YXRpYworc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCEoKnJlc3BvbnNlKS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpyZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgbUNTRHNGb3JDdXJyZW50Rm9ybWF0LmNsZWFyKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyA7ICsraSkgeworICAgICAgICBBU3RyaW5nIHRhZyA9ICJjc2QtIjsKKyAgICAgICAgdGFnLmFwcGVuZChpKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEJ1ZmZlcih0YWcuY19zdHIoKSwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1DU0RzRm9yQ3VycmVudEZvcm1hdC5wdXNoKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewogICAgIENIRUNLKG1Db2RlYyA9PSBOVUxMKTsKIAorICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKICAgICBBU3RyaW5nIG1pbWU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnlNc2cgPQotICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRDb2RlY05vdGlmeSwgaWQoKSk7CisgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IE5VTEw7CisgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICBzdXJmYWNlID0gbU5hdGl2ZVdpbmRvdy0+Z2V0U3VyZmFjZVRleHR1cmVDbGllbnQoKTsKKyAgICB9CiAKLSAgICBtQ1NESW5kZXggPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgKytpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKLSAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJWQiLCBpKS5jX3N0cigpLCAmY3NkKSkgeworICAgIG1Db21wb25lbnROYW1lID0gbWltZTsKKyAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIiBkZWNvZGVyIik7CisgICAgQUxPR1YoIlslc10gb25Db25maWd1cmUgKHN1cmZhY2U9JXApIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgc3VyZmFjZS5nZXQoKSk7CisKKyAgICBtQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobUNvZGVjTG9vcGVyLCBtaW1lLmNfc3RyKCksIGZhbHNlIC8qIGVuY29kZXIgKi8pOworICAgIGludDMyX3Qgc2VjdXJlID0gMDsKKyAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInNlY3VyZSIsICZzZWN1cmUpICYmIHNlY3VyZSAhPSAwKSB7CisgICAgICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgbUNvZGVjLT5nZXROYW1lKCZtQ29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIi5zZWN1cmUiKTsKKyAgICAgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICAgICAgQUxPR0koIlslc10gY3JlYXRpbmciLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjTG9vcGVyLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgJXMlcyBkZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAoc2VjdXJlID8gInNlY3VyZSAiIDogIiIpLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Db2RlYy0+Z2V0TmFtZSgmbUNvbXBvbmVudE5hbWUpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZGlzY29ubmVjdCBmcm9tIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyB3aWxsIHJlY29ubmVjdAorICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KAorICAgICAgICAgICAgICAgIHN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgLy8gV2UgdHJlYXQgdGhpcyBhcyBhIHdhcm5pbmcsIGFzIHRoaXMgaXMgYSBwcmVwYXJhdG9yeSBzdGVwLgorICAgICAgICAvLyBDb2RlYyB3aWxsIHRyeSB0byBjb25uZWN0IHRvIHRoZSBzdXJmYWNlLCB3aGljaCBpcyB3aGVyZQorICAgICAgICAvLyBhbnkgZXJyb3Igc2lnbmFsaW5nIHdpbGwgb2NjdXIuCisgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywgImZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gc3VyZmFjZTogJWQiLCBlcnIpOworICAgIH0KKyAgICBlcnIgPSBtQ29kZWMtPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgIGZvcm1hdCwgc3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMuY2xlYXIoKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGZvcm1hdCk7CisKKyAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIGluIGNvbmZpZ3VyZWQgc3RhdGUKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZtT3V0cHV0Rm9ybWF0KSk7CisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldElucHV0Rm9ybWF0KCZtSW5wdXRGb3JtYXQpKTsKKworICAgIGVyciA9IG1Db2RlYy0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMuY2xlYXIoKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgYWZ0ZXIgc3RhcnQKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXJzKCZtSW5wdXRCdWZmZXJzKSk7CisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldE91dHB1dEJ1ZmZlcnMoJm1PdXRwdXRCdWZmZXJzKSk7CisgICAgQUxPR1YoIlslc10gZ290ICV6dSBpbnB1dCBhbmQgJXp1IG91dHB1dCBidWZmZXJzIiwKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtSW5wdXRCdWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisKKyAgICByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKKyAgICBtUGF1c2VkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlcnNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgbU1lZGlhQnVmZmVyc1tpXS0+cmVsZWFzZSgpOworICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTWVkaWFCdWZmZXJzLnJlc2l6ZShtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFCdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChpKSA9IE5VTEw7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuY2xlYXIoKTsKKyAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLnJlc2l6ZShtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpKSA9IGZhbHNlOworICAgIH0KKworICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5jbGVhcigpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpyZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKSB7CisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworICAgICAgICBtQ29kZWMtPnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihyZXBseSk7CisgICAgfQorfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjppc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgIHJldHVybiBnZW5lcmF0aW9uICE9IG1CdWZmZXJHZW5lcmF0aW9uOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjppbml0KCkgeworICAgIG1EZWNvZGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsVXBkYXRlRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFVwZGF0ZUZvcm1hdCwgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6RGVjb2Rlcjo6Z2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpidWZmZXJzKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldElucHV0QnVmZmVycywgaWQoKSk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJidWZmZXJzIiwgYnVmZmVycyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpCit7CisgICAgLy8gV2UgY2Fubm90IGltbWVkaWF0ZWx5IHJlbGVhc2UgdGhlIGNvZGVjIGR1ZSB0byBidWZmZXJzIHN0aWxsIG91dHN0YW5kaW5nCisgICAgLy8gaW4gdGhlIHJlbmRlcmVyLiAgV2Ugc2lnbmFsIHRvIHRoZSBwbGF5ZXIgdGhlIGVycm9yIHNvIGl0IGNhbiBzaHV0ZG93bi9yZWxlYXNlIHRoZQorICAgIC8vIGRlY29kZXIgYWZ0ZXIgZmx1c2hpbmcgYW5kIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiB0byBkaXNjYXJkIHVubmVjZXNzYXJ5IG1lc3NhZ2VzLgorCisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlQW5JbnB1dEJ1ZmZlcigpIHsKKyAgICBzaXplX3QgYnVmZmVySXggPSAtMTsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmYnVmZmVySXgpOworICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIGlucHV0OiAlZCIsCisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMgPT0gT0sgPyAoaW50KWJ1ZmZlckl4IDogcmVzKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIGlmIChyZXMgIT0gLUVBR0FJTikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZXF1ZXVlIGlucHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKworICAgIGlmIChtTWVkaWFCdWZmZXJzW2J1ZmZlckl4XSAhPSBOVUxMKSB7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnNbYnVmZmVySXhdLT5yZWxlYXNlKCk7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBOVUxMOworICAgIH0KKyAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gdHJ1ZTsKKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBpZCgpKTsKKyAgICByZXBseS0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKworICAgIGlmICghbUNTRHNUb1N1Ym1pdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbUNTRHNUb1N1Ym1pdC5pdGVtQXQoMCk7CisgICAgICAgIEFMT0dJKCJbJXNdIHJlc3VibWl0dGluZyBDU0QiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICAgICAgbUNTRHNUb1N1Ym1pdC5yZW1vdmVBdCgwKTsKKyAgICAgICAgQ0hFQ0sob25JbnB1dEJ1ZmZlckZpbGxlZChyZXBseSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lbXB0eSgpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSAqbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmJlZ2luKCk7CisgICAgICAgIGlmICghb25JbnB1dEJ1ZmZlckZpbGxlZChtc2cpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCi0gICAgICAgIG1DU0QucHVzaChjc2QpOworICAgICAgICBtUGVuZGluZ0lucHV0TWVzc2FnZXMuZXJhc2UobVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmJlZ2luKCkpOwogICAgIH0KIAotICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKLSAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCBtTmF0aXZlV2luZG93KTsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgLy8gQ3VycmVudCB2aWRlbyBkZWNvZGVycyBkbyBub3QgcmV0dXJuIGZyb20gT01YX0ZpbGxUaGlzQnVmZmVyCi0gICAgLy8gcXVpY2tseSwgdmlvbGF0aW5nIHRoZSBPcGVuTUFYIHNwZWNzLCB1bnRpbCB0aGF0IGlzIHJlbWVkaWVkCi0gICAgLy8gd2UgbmVlZCB0byBpbnZlc3QgaW4gYW4gZXh0cmEgbG9vcGVyIHRvIGZyZWUgdGhlIG1haW4gZXZlbnQKLSAgICAvLyBxdWV1ZS4KLSAgICBib29sIG5lZWREZWRpY2F0ZWRMb29wZXIgPSAhc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAidmlkZW8vIiwgNik7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZpbGxUaGlzQnVmZmVyKTsKKyAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgbUlucHV0QnVmZmVyc1tidWZmZXJJeF0pOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgcmV0dXJuIHRydWU7Cit9CiAKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgIG1Db2RlYyA9IG5ldyBBQ29kZWM7Citib29sIGFuZHJvaWQ6Ok51UGxheWVyOjpEZWNvZGVyOjpvbklucHV0QnVmZmVyRmlsbGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc2l6ZV90IGJ1ZmZlckl4OworICAgIENIRUNLKG1zZy0+ZmluZFNpemUoImJ1ZmZlci1peCIsICZidWZmZXJJeCkpOworICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3A8QUJ1ZmZlcj4gY29kZWNCdWZmZXIgPSBtSW5wdXRCdWZmZXJzW2J1ZmZlckl4XTsKIAotICAgIGlmIChuZWVkRGVkaWNhdGVkTG9vcGVyICYmIG1Db2RlY0xvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoIk51UGxheWVyRGVjb2RlciIpOwotICAgICAgICBtQ29kZWNMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIGJvb2wgaGFzQnVmZmVyID0gbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKTsKKworICAgIC8vIGhhbmRsZSB3aWRldmluZSBjbGFzc2ljIHNvdXJjZSAtIHRoYXQgZmlsbHMgYW4gYXJiaXRyYXJ5IGlucHV0IGJ1ZmZlcgorICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZmZlciA9IE5VTEw7CisgICAgaWYgKGhhc0J1ZmZlcikgeworICAgICAgICBtZWRpYUJ1ZmZlciA9IChNZWRpYUJ1ZmZlciAqKShidWZmZXItPmdldE1lZGlhQnVmZmVyQmFzZSgpKTsKKyAgICAgICAgaWYgKG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGxpa2VseSBmaWxsZWQgYW5vdGhlciBidWZmZXIgdGhhbiB3ZSByZXF1ZXN0ZWQ6IGFkanVzdCBidWZmZXIgaW5kZXgKKyAgICAgICAgICAgIHNpemVfdCBpeDsKKyAgICAgICAgICAgIGZvciAoaXggPSAwOyBpeCA8IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZiA9IG1JbnB1dEJ1ZmZlcnNbaXhdOworICAgICAgICAgICAgICAgIGlmIChidWYtPmRhdGEoKSA9PSBtZWRpYUJ1ZmZlci0+ZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBpbnB1dCBidWZmZXJzIGFyZSBkZXF1ZXVlZCBvbiBzdGFydCwgaGVuY2UgdGhlIGNoZWNrCisgICAgICAgICAgICAgICAgICAgIGlmICghbUlucHV0QnVmZmVySXNEZXF1ZXVlZFtpeF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHJlY2VpdmVkIE1lZGlhQnVmZmVyIGZvciAjJXp1IGluc3RlYWQgb2YgIyV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGl4LCBidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVFJJQ0tZOiBuZWVkIGJ1ZmZlciBmb3IgdGhlIG1ldGFkYXRhLCBzbyBpbnN0ZWFkLCBzZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gY29kZWNCdWZmZXIgdG8gdGhlIHNhbWUgKHRob3VnaCBpbmNvcnJlY3QpIGJ1ZmZlciB0bworICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBhIG1lbWNweSBpbnRvIHRoZSBjb2RlY0J1ZmZlcgorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXJJeCA9IGl4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDSyhpeCA8IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIChuZWVkRGVkaWNhdGVkTG9vcGVyID8gbUNvZGVjTG9vcGVyIDogbG9vcGVyKCkpLT5yZWdpc3RlckhhbmRsZXIobUNvZGVjKTsKIAotICAgIG1Db2RlYy0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnlNc2cpOwotICAgIG1Db2RlYy0+aW5pdGlhdGVTZXR1cChmb3JtYXQpOworCisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIC8qIGluY2x1ZGVzICFoYXNCdWZmZXIgKi8pIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1FcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJnN0cmVhbUVycikgfHwgIWhhc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKHN0cmVhbUVyciA9PSBPSykgeworICAgICAgICAgICAgLyogYnVmZmVycyBhcmUgcmV0dXJuZWQgdG8gaG9sZCBvbiB0byAqLworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBhdHRlbXB0IHRvIHF1ZXVlIEVPUworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgYnVmZmVySXgsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBzdHJlYW1FcnIgPSBlcnI7CisgICAgICAgICAgICAvLyBlcnIgd2lsbCBub3QgYmUgRVJST1JfRU5EX09GX1NUUkVBTQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cmVhbUVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBBTE9HRSgiU3RyZWFtIGVycm9yIGZvciAlcyAoZXJyPSVkKSwgRU9TICVzIHF1ZXVlZCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUVyciwKKyAgICAgICAgICAgICAgICAgICAgZXJyID09IE9LID8gInN1Y2Nlc3NmdWxseSIgOiAidW5zdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHN0cmVhbUVycik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IDA7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgIGludDMyX3QgZW9zLCBjc2Q7CisgICAgICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmY3NkKSAmJiBjc2QpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29weSBpbnRvIGNvZGVjIGJ1ZmZlcgorICAgICAgICBpZiAoYnVmZmVyICE9IGNvZGVjQnVmZmVyKSB7CisgICAgICAgICAgICBDSEVDS19MRShidWZmZXItPnNpemUoKSwgY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpOworICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpZiAobWVkaWFCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXVlIGlucHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sobU1lZGlhQnVmZmVyc1tidWZmZXJJeF0gPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IG1lZGlhQnVmZmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVBbk91dHB1dEJ1ZmZlcigpIHsKKyAgICBzaXplX3QgYnVmZmVySXggPSAtMTsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIGludDY0X3QgdGltZVVzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICZidWZmZXJJeCwgJm9mZnNldCwgJnNpemUsICZ0aW1lVXMsICZmbGFncyk7CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIG91dHB1dDogJWQiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIG91dHB1dDogJWQgKHRpbWU9JWxsZCBmbGFncz0lIiBQUkl1MzIgIikiLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChpbnQpYnVmZmVySXgsIHRpbWVVcywgZmxhZ3MpOworICAgIH0KKworICAgIGlmIChyZXMgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmbU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVycyBmb3IgJXMgYWZ0ZXIgSU5GTyBldmVudCAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIE51UGxheWVyIGlnbm9yZXMgdGhpcworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJmZvcm1hdCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IG91dHB1dCBmb3JtYXQgZm9yICVzIGFmdGVyIElORk8gZXZlbnQgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVzID09IElORk9fRElTQ09OVElOVUlUWSkgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIGlmIChyZXMgIT0gLUVBR0FJTikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZXF1ZXVlIG91dHB1dCBidWZmZXIgZm9yICVzIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtT3V0cHV0QnVmZmVycy5zaXplKCkpOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1PdXRwdXRCdWZmZXJzW2J1ZmZlckl4XTsKKyAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgc2l6ZSk7CisgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgIH0KKyAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IENPREVDQ09ORklHIG9yIFNZTkNGUkFNRSBmb3IgZGVjb2RlcgorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyQnVmZmVyLCBpZCgpKTsKKyAgICByZXBseS0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXREcmFpblRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBhZnRlciByZW5kZXJpbmcgaXMgY29tcGxldGUsCisgICAgLy8gYnV0IFJlbmRlcmVyIG5lZWRzIGl0IG5vdworICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICBBTE9HVigicXVldWVpbmcgZW9zIFslc10iLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFT1MpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvblJlbmRlckJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQzMl90IHJlbmRlcjsKKyAgICBzaXplX3QgYnVmZmVySXg7CisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZW5kZXIiLCAmcmVuZGVyKSAmJiByZW5kZXIpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOczsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSk7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShidWZmZXJJeCwgdGltZXN0YW1wTnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJeCk7CisgICAgfQorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWxlYXNlIG91dHB1dCBidWZmZXIgZm9yICVzIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25GbHVzaCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5mbHVzaCgpOworICAgICAgICBtQ1NEc1RvU3VibWl0ID0gbUNTRHNGb3JDdXJyZW50Rm9ybWF0OyAvLyBjb3B5IG9wZXJhdG9yCisgICAgICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZsdXNoICVzIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdEZsdXNoQ29tcGxldGVkLgorICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcnMgZXZlbiBpZiBmbHVzaCBmYWlscy4KKyAgICB9CisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1QYXVzZWQgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvblJlc3VtZSgpIHsKKyAgICBtUGF1c2VkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uU2h1dGRvd24oKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMgPSBOVUxMOworICAgICAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIHJlY29ubmVjdCB0byBzdXJmYWNlIGFzIE1lZGlhQ29kZWMgZGlzY29ubmVjdGVkIGZyb20gaXQKKyAgICAgICAgICAgIHN0YXR1c190IGVycm9yID0KKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LT5nZXROYXRpdmVXaW5kb3coKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICBBTE9HV19JRihlcnJvciAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIlslc10gZmFpbGVkIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdywgZXJyb3I9JWQiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbXBvbmVudE5hbWUgPSAiZGVjb2RlciI7CisgICAgfQorCisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSAlcyAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRTaHV0ZG93bkNvbXBsZXRlZC4KKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1QYXVzZWQgPSB0cnVlOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJbJXNdIG9uTWVzc2FnZTogJXMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICBvbkNvbmZpZ3VyZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0VXBkYXRlRm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0SW5wdXRCdWZmZXJzOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqZHN0QnVmZmVyczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlcnMiLCAodm9pZCAqKikmZHN0QnVmZmVycykpOworCisgICAgICAgICAgICBkc3RCdWZmZXJzLT5jbGVhcigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRCdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZHN0QnVmZmVycy0+cHVzaChtSW5wdXRCdWZmZXJzW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdENvZGVjTm90aWZ5OgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBudW1JbnB1dCwgbnVtT3V0cHV0OwogCi0gICAgICAgICAgICBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBvbkZpbGxUaGlzQnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImNvZGVjLXJlcXVlc3QiLCBtc2cpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImlucHV0LWJ1ZmZlcnMiLCAmbnVtSW5wdXQpKSB7CisgICAgICAgICAgICAgICAgICAgIG51bUlucHV0ID0gSU5UMzJfTUFYOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIm91dHB1dC1idWZmZXJzIiwgJm51bU91dHB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0ID0gSU5UMzJfTUFYOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobnVtSW5wdXQtLSA+IDAgJiYgaGFuZGxlQW5JbnB1dEJ1ZmZlcigpKSB7fQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChudW1PdXRwdXQtLSA+IDAgJiYgaGFuZGxlQW5PdXRwdXRCdWZmZXIoKSkge30KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRJbnB1dEJ1ZmZlckZpbGxlZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIGlmICghbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFvbklucHV0QnVmZmVyRmlsbGVkKG1zZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLnB1c2hfYmFjayhtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVuZGVyQnVmZmVyOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgb25SZW5kZXJCdWZmZXIobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoIm5ldy1mb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9uRmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgb25SZXN1bWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvblNodXRkb3duKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMDUsNDcgKzY5MSwyMCBAQAogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25GaWxsVGhpc0J1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHNwPEFNZXNzYWdlPiByZXBseTsKLSAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOwotCi0jaWYgMAotICAgIHNwPEFCdWZmZXI+IG91dEJ1ZmZlcjsKLSAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZvdXRCdWZmZXIpKTsKLSNlbHNlCi0gICAgc3A8QUJ1ZmZlcj4gb3V0QnVmZmVyOwotI2VuZGlmCi0KLSAgICBpZiAobUNTREluZGV4IDwgbUNTRC5zaXplKCkpIHsKLSAgICAgICAgb3V0QnVmZmVyID0gbUNTRC5lZGl0SXRlbUF0KG1DU0RJbmRleCsrKTsKLSAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLQotICAgICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBvdXRCdWZmZXIpOwotICAgICAgICByZXBseS0+cG9zdCgpOwotICAgICAgICByZXR1cm47Cit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpzaWduYWxGbHVzaChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgaWQoKSk7CisgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIG1zZy0+c2V0TWVzc2FnZSgibmV3LWZvcm1hdCIsIGZvcm1hdCk7CiAgICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiY29kZWMtcmVxdWVzdCIsIG1zZyk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbEZsdXNoKCkgewotICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBtQ29kZWMtPnNpZ25hbEZsdXNoKCk7Ci0gICAgfQorICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpzaWduYWxSZXN1bWUoKSB7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7Ci0gICAgfQorICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjppbml0aWF0ZVNodXRkb3duKCkgewotICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBtQ29kZWMtPmluaXRpYXRlU2h1dGRvd24oKTsKLSAgICB9CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCBpZCgpKSktPnBvc3QoKTsKIH0KIAogYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6c3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdCB7CkBAIC0xNjMsMTQgKzcyMiwxNiBAQAogICAgICAgICBjb25zdCBjaGFyICoga2V5c1tdID0geyAiY2hhbm5lbC1jb3VudCIsICJzYW1wbGUtcmF0ZSIsICJpcy1hZHRzIiB9OwogICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHNpemVvZihrZXlzKSAvIHNpemVvZihrZXlzWzBdKTsgaSsrKSB7CiAgICAgICAgICAgICBpbnQzMl90IG9sZFZhbCwgbmV3VmFsOwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm9sZFZhbCkgfHwgIXRhcmdldEZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZuZXdWYWwpCi0gICAgICAgICAgICAgICAgICAgIHx8IG9sZFZhbCAhPSBuZXdWYWwpIHsKKyAgICAgICAgICAgIGlmICghbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZvbGRWYWwpIHx8CisgICAgICAgICAgICAgICAgICAgICF0YXJnZXRGb3JtYXQtPmZpbmRJbnQzMihrZXlzW2ldLCAmbmV3VmFsKSB8fAorICAgICAgICAgICAgICAgICAgICBvbGRWYWwgIT0gbmV3VmFsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gb2xkQnVmLCBuZXdCdWY7Ci0gICAgICAgIGlmIChtRm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZvbGRCdWYpICYmIHRhcmdldEZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmbmV3QnVmKSkgeworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmb2xkQnVmKSAmJgorICAgICAgICAgICAgICAgIHRhcmdldEZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmbmV3QnVmKSkgewogICAgICAgICAgICAgaWYgKG9sZEJ1Zi0+c2l6ZSgpICE9IG5ld0J1Zi0+c2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTgxLDcgKzc0Miw3IEBACiB9CiAKIGJvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OnN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0IHsKLSAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0xOTAsNyArNzUxLDcgQEAKICAgICB9CiAKICAgICBBU3RyaW5nIG9sZE1pbWUsIG5ld01pbWU7Ci0gICAgaWYgKCFtRm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm9sZE1pbWUpCisgICAgaWYgKCFtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm9sZE1pbWUpCiAgICAgICAgICAgICB8fCAhdGFyZ2V0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm5ld01pbWUpCiAgICAgICAgICAgICB8fCAhKG9sZE1pbWUgPT0gbmV3TWltZSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjAxLDEyICs3NjIsMzQzIEBACiAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgIHNlYW1sZXNzID0gc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKHRhcmdldEZvcm1hdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VhbWxlc3MgPSBtQ29kZWMgIT0gTlVMTCAmJiBtQ29kZWMtPmlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soKTsKKyAgICAgICAgaW50MzJfdCBpc0FkYXB0aXZlOworICAgICAgICBzZWFtbGVzcyA9IChtQ29kZWMgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsICZpc0FkYXB0aXZlKSAmJgorICAgICAgICAgICAgICAgIGlzQWRhcHRpdmUpOwogICAgIH0KIAogICAgIEFMT0dWKCIlcyBzZWFtbGVzcyBzdXBwb3J0IGZvciAlcyIsIHNlYW1sZXNzID8gInllcyIgOiAibm8iLCBvbGRNaW1lLmNfc3RyKCkpOwogICAgIHJldHVybiBzZWFtbGVzczsKIH0KIAorc3RydWN0IENDRGF0YSB7CisgICAgQ0NEYXRhKHVpbnQ4X3QgdHlwZSwgdWludDhfdCBkYXRhMSwgdWludDhfdCBkYXRhMikKKyAgICAgICAgOiBtVHlwZSh0eXBlKSwgbURhdGExKGRhdGExKSwgbURhdGEyKGRhdGEyKSB7CisgICAgfQorICAgIGJvb2wgZ2V0Q2hhbm5lbChzaXplX3QgKmNoYW5uZWwpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1EYXRhMSA+PSAweDEwICYmIG1EYXRhMSA8PSAweDFmKSB7CisgICAgICAgICAgICAqY2hhbm5lbCA9IChtRGF0YTEgPj0gMHgxOCA/IDEgOiAwKSArIChtVHlwZSA/IDIgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IG1UeXBlOworICAgIHVpbnQ4X3QgbURhdGExOworICAgIHVpbnQ4X3QgbURhdGEyOworfTsKKworc3RhdGljIGJvb2wgaXNOdWxsUGFkKENDRGF0YSAqY2MpIHsKKyAgICByZXR1cm4gY2MtPm1EYXRhMSA8IDB4MTAgJiYgY2MtPm1EYXRhMiA8IDB4MTA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBCeXRlUGFpcihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYpIHsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBU3RyaW5nIG91dDsKKworICAgIHdoaWxlIChvZmZzZXQgPCBjY0J1Zi0+c2l6ZSgpKSB7CisgICAgICAgIGNoYXIgdG1wWzEyOF07CisKKyAgICAgICAgQ0NEYXRhICpjYyA9IChDQ0RhdGEgKikgKGNjQnVmLT5kYXRhKCkgKyBvZmZzZXQpOworCisgICAgICAgIGlmIChpc051bGxQYWQoY2MpKSB7CisgICAgICAgICAgICAvLyAxIG51bGwgcGFkIG9yIFhEUyBtZXRhZGF0YSwgaWdub3JlCisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKENDRGF0YSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYy0+bURhdGExID49IDB4MjAgJiYgY2MtPm1EYXRhMSA8PSAweDdmKSB7CisgICAgICAgICAgICAvLyAyIGJhc2ljIGNoYXJzCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1CYXNpYzogJWMgJWMiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExID09IDB4MTEgfHwgY2MtPm1EYXRhMSA9PSAweDE5KQorICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MzAgJiYgY2MtPm1EYXRhMiA8PSAweDNmKSB7CisgICAgICAgICAgICAvLyAxIHNwZWNpYWwgY2hhcgorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdU3BlY2lhbDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDEyIHx8IGNjLT5tRGF0YTEgPT0gMHgxQSkKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgzZil7CisgICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXVNwYW5pc2g6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMyB8fCBjYy0+bURhdGExID09IDB4MUIpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpeworICAgICAgICAgICAgLy8gMSBQb3J0dWd1ZXNlL0dlcm1hbi9EYW5pc2ggY2hhcgorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdR2VybWFuOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExID09IDB4MTEgfHwgY2MtPm1EYXRhMSA9PSAweDE5KQorICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDJmKXsKKyAgICAgICAgICAgIC8vIE1pZC1Sb3cgQ29kZXMgKFRhYmxlIDY5KQorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdTWlkLXJvdzogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoKGNjLT5tRGF0YTEgPT0gMHgxNCB8fCBjYy0+bURhdGExID09IDB4MWMpCisgICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDJmKQorICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAoKGNjLT5tRGF0YTEgPT0gMHgxNyB8fCBjYy0+bURhdGExID09IDB4MWYpCisgICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjEgJiYgY2MtPm1EYXRhMiA8PSAweDIzKSl7CisgICAgICAgICAgICAvLyBNaXNjIENvbnRyb2wgQ29kZXMgKFRhYmxlIDcwKQorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdQ3RybDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSAmIDB4NzApID09IDB4MTAKKyAgICAgICAgICAgICAgICAmJiAoY2MtPm1EYXRhMiAmIDB4NDApID09IDB4NDAKKyAgICAgICAgICAgICAgICAmJiAoKGNjLT5tRGF0YTEgJiAweDA3KSB8fCAhKGNjLT5tRGF0YTIgJiAweDIwKSkgKSB7CisgICAgICAgICAgICAvLyBQcmVhbWJsZSBBZGRyZXNzIENvZGVzIChUYWJsZSA3MSkKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXVBBQzogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXUludmFsaWQ6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG91dC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKworICAgICAgICBvdXQuYXBwZW5kKHRtcCk7CisKKyAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihDQ0RhdGEpOworICAgIH0KKworICAgIEFMT0dJKCIlcyIsIG91dC5jX3N0cigpKTsKK30KKworTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Q0NEZWNvZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQorICAgIDogbU5vdGlmeShub3RpZnkpLAorICAgICAgbUN1cnJlbnRDaGFubmVsKDApLAorICAgICAgbVNlbGVjdGVkVHJhY2soLTEpIHsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKG1UcmFja0luZGljZXMpL3NpemVvZihtVHJhY2tJbmRpY2VzWzBdKTsgKytpKSB7CisgICAgICAgICAgbVRyYWNrSW5kaWNlc1tpXSA9IC0xOworICAgICAgfQorfQorCitzaXplX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZvdW5kQ2hhbm5lbHMuc2l6ZSgpOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmICghaXNUcmFja1ZhbGlkKGluZGV4KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSk7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgInVuZCIpOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4KTsKKyAgICAvL0NDMSwgZmllbGQgMCBjaGFubmVsIDAKKyAgICBib29sIGlzRGVmYXVsdEF1dG8gPSAobUZvdW5kQ2hhbm5lbHNbaW5kZXhdID09IDApOworICAgIGZvcm1hdC0+c2V0SW50MzIoImF1dG8iLCBpc0RlZmF1bHRBdXRvKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJkZWZhdWx0IiwgaXNEZWZhdWx0QXV0byk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiZm9yY2VkIiwgMCk7CisKKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQoaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHNlbGVjdCkgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgYWxyZWFkeSBzZWxlY3RlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CisgICAgICAgIG1TZWxlY3RlZFRyYWNrID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdCkgZ2V0VHJhY2tDb3VudCgpOworfQorCitib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5kZXggPCBnZXRUcmFja0NvdW50KCk7Cit9CisKK2ludDMyX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tJbmRleChzaXplX3QgY2hhbm5lbCkgY29uc3QgeworICAgIGlmIChjaGFubmVsIDwgc2l6ZW9mKG1UcmFja0luZGljZXMpL3NpemVvZihtVHJhY2tJbmRpY2VzWzBdKSkgeworICAgICAgICByZXR1cm4gbVRyYWNrSW5kaWNlc1tjaGFubmVsXTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6ZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgc3A8QUJ1ZmZlcj4gc2VpOworICAgIGlmICghYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kQnVmZmVyKCJzZWkiLCAmc2VpKSB8fCBzZWkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisKKyAgICBOQUxCaXRSZWFkZXIgYnIoc2VpLT5kYXRhKCkgKyAxLCBzZWktPnNpemUoKSAtIDEpOworICAgIC8vIHNlaV9tZXNzYWdlKCkKKyAgICB3aGlsZSAoYnIuYXRMZWFzdE51bUJpdHNMZWZ0KDE2KSkgeyAvLyBhdCBsZWFzdCAxNi1iaXQgZm9yIHNlaV9tZXNzYWdlKCkKKyAgICAgICAgdWludDMyX3QgcGF5bG9hZF90eXBlID0gMDsKKyAgICAgICAgc2l6ZV90IHBheWxvYWRfc2l6ZSA9IDA7CisgICAgICAgIHVpbnQ4X3QgbGFzdF9ieXRlOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxhc3RfYnl0ZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwYXlsb2FkX3R5cGUgKz0gbGFzdF9ieXRlOworICAgICAgICB9IHdoaWxlIChsYXN0X2J5dGUgPT0gMHhGRik7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgbGFzdF9ieXRlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHBheWxvYWRfc2l6ZSArPSBsYXN0X2J5dGU7CisgICAgICAgIH0gd2hpbGUgKGxhc3RfYnl0ZSA9PSAweEZGKTsKKworICAgICAgICAvLyBzZWlfcGF5bG9hZCgpCisgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPT0gNCkgeworICAgICAgICAgICAgLy8gdXNlcl9kYXRhX3JlZ2lzdGVyZWRfaXR1X3RfdDM1KCkKKworICAgICAgICAgICAgLy8gQVRTQyBBLzcyOiA2LjQuMgorICAgICAgICAgICAgdWludDhfdCBpdHVfdF90MzVfY291bnRyeV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHVpbnQxNl90IGl0dV90X3QzNV9wcm92aWRlcl9jb2RlID0gYnIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICB1aW50MzJfdCB1c2VyX2lkZW50aWZpZXIgPSBici5nZXRCaXRzKDMyKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXNlcl9kYXRhX3R5cGVfY29kZSA9IGJyLmdldEJpdHMoOCk7CisKKyAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSAxICsgMiArIDQgKyAxOworCisgICAgICAgICAgICBpZiAoaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9PSAweEI1CisgICAgICAgICAgICAgICAgICAgICYmIGl0dV90X3QzNV9wcm92aWRlcl9jb2RlID09IDB4MDAzMQorICAgICAgICAgICAgICAgICAgICAmJiB1c2VyX2lkZW50aWZpZXIgPT0gJ0dBOTQnCisgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfZGF0YV90eXBlX2NvZGUgPT0gMHgzKSB7CisgICAgICAgICAgICAgICAgLy8gTVBFR19jY19kYXRhKCkKKyAgICAgICAgICAgICAgICAvLyBBVFNDIEEvNTMgUGFydCA0OiA2LjIuMy4xCisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7IC8vcHJvY2Vzc19lbV9kYXRhX2ZsYWcKKyAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NfY2NfZGF0YV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxKTsgLy9hZGRpdGlvbmFsX2RhdGFfZmxhZworICAgICAgICAgICAgICAgIHNpemVfdCBjY19jb3VudCA9IGJyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoOCk7IC8vIGVtX2RhdGE7CisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDI7CisKKyAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc19jY19kYXRhX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBvdXQ7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2NCdWYgPSBuZXcgQUJ1ZmZlcihjY19jb3VudCAqIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgY2NCdWYtPnNldFJhbmdlKDAsIDApOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NfY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXJrZXIgPSBici5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobWFya2VyLCAweDFmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjY192YWxpZCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNjX3R5cGUgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG9kZCBwYXJpdHkgYml0CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNjX2RhdGFfMSA9IGJyLmdldEJpdHMoOCkgJiAweDdmOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjY19kYXRhXzIgPSBici5nZXRCaXRzKDgpICYgMHg3ZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjX3ZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjY190eXBlID09IDAgfHwgY2NfdHlwZSA9PSAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDRGF0YSBjYyhjY190eXBlLCBjY19kYXRhXzEsIGNjX2RhdGFfMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc051bGxQYWQoJmNjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjLmdldENoYW5uZWwoJmNoYW5uZWwpICYmIGdldFRyYWNrSW5kZXgoY2hhbm5lbCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tJbmRpY2VzW2NoYW5uZWxdID0gbUZvdW5kQ2hhbm5lbHMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvdW5kQ2hhbm5lbHMucHVzaF9iYWNrKGNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tBZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNjQnVmLT5kYXRhKCkgKyBjY0J1Zi0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmNjLCBzaXplb2YoY2MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NCdWYtPnNldFJhbmdlKDAsIGNjQnVmLT5zaXplKCkgKyBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSBjY19jb3VudCAqIDM7CisKKyAgICAgICAgICAgICAgICAgICAgbUNDTWFwLmFkZCh0aW1lVXMsIGNjQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiTWFsZm9ybWVkIFNFSSBwYXlsb2FkIHR5cGUgNCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIlVuc3VwcG9ydGVkIFNFSSBwYXlsb2FkIHR5cGUgJWQiLCBwYXlsb2FkX3R5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcHBpbmcgcmVtYWluaW5nIGJpdHMgb2YgdGhpcyBwYXlsb2FkCisgICAgICAgIGJyLnNraXBCaXRzKHBheWxvYWRfc2l6ZSAqIDgpOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCitzcDxBQnVmZmVyPiBOdVBsYXllcjo6Q0NEZWNvZGVyOjpmaWx0ZXJDQ0J1ZigKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmNjQnVmLCBzaXplX3QgaW5kZXgpIHsKKyAgICBzcDxBQnVmZmVyPiBmaWx0ZXJlZENDQnVmID0gbmV3IEFCdWZmZXIoY2NCdWYtPnNpemUoKSk7CisgICAgZmlsdGVyZWRDQ0J1Zi0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICBzaXplX3QgY2NfY291bnQgPSBjY0J1Zi0+c2l6ZSgpIC8gc2l6ZW9mKENDRGF0YSk7CisgICAgY29uc3QgQ0NEYXRhKiBjY19kYXRhID0gKGNvbnN0IENDRGF0YSopY2NCdWYtPmRhdGEoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNjX2NvdW50OyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGNoYW5uZWw7CisgICAgICAgIGlmIChjY19kYXRhW2ldLmdldENoYW5uZWwoJmNoYW5uZWwpKSB7CisgICAgICAgICAgICBtQ3VycmVudENoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB9CisgICAgICAgIGlmIChtQ3VycmVudENoYW5uZWwgPT0gbUZvdW5kQ2hhbm5lbHNbaW5kZXhdKSB7CisgICAgICAgICAgICBtZW1jcHkoZmlsdGVyZWRDQ0J1Zi0+ZGF0YSgpICsgZmlsdGVyZWRDQ0J1Zi0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZjY19kYXRhW2ldLCBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgICAgICBmaWx0ZXJlZENDQnVmLT5zZXRSYW5nZSgwLCBmaWx0ZXJlZENDQnVmLT5zaXplKCkgKyBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmlsdGVyZWRDQ0J1ZjsKK30KKwordm9pZCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBpZiAoZXh0cmFjdEZyb21TRUkoYWNjZXNzVW5pdCkpIHsKKyAgICAgICAgQUxPR0koIkZvdW5kIENFQS02MDggdHJhY2siKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUcmFja0FkZGVkKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorICAgIC8vIFRPRE86IGV4dHJhY3QgQ0MgZnJvbSBvdGhlciBzb3VyY2VzCit9CisKK3ZvaWQgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6ZGlzcGxheShpbnQ2NF90IHRpbWVVcykgeworICAgIGlmICghaXNUcmFja1ZhbGlkKG1TZWxlY3RlZFRyYWNrKSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgY3VycmVudCB0cmFjayhpbmRleD0lZCkiLCBtU2VsZWN0ZWRUcmFjayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNDTWFwLmluZGV4T2ZLZXkodGltZVVzKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJjYyBmb3IgdGltZXN0YW1wICUiIFBSSWQ2NCAiIG5vdCBmb3VuZCIsIHRpbWVVcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBjY0J1ZiA9IGZpbHRlckNDQnVmKG1DQ01hcC52YWx1ZUF0KGluZGV4KSwgbVNlbGVjdGVkVHJhY2spOworCisgICAgaWYgKGNjQnVmLT5zaXplKCkgPiAwKSB7CisjaWYgMAorICAgICAgICBkdW1wQnl0ZVBhaXIoY2NCdWYpOworI2VuZGlmCisKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCBtU2VsZWN0ZWRUcmFjayk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIDBsbCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRDbG9zZWRDYXB0aW9uRGF0YSk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBjY0J1Zik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIC8vIHJlbW92ZSBhbGwgZW50cmllcyBiZWZvcmUgdGltZVVzCisgICAgbUNDTWFwLnJlbW92ZUl0ZW1zQXQoMCwgaW5kZXggKyAxKTsKK30KKwordm9pZCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpmbHVzaCgpIHsKKyAgICBtQ0NNYXAuY2xlYXIoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCmluZGV4IDc4ZWE3NGEuLmRiYTNlZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKQEAgLTI1LDIwICsyNSwzNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBNZWRpYUNvZGVjOworc3RydWN0IE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkRlY29kZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIERlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICBjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbmF0aXZlV2luZG93ID0gTlVMTCk7CiAKLSAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIGluaXQoKTsKIAotICAgIHZvaWQgc2lnbmFsRmx1c2goKTsKLSAgICB2b2lkIHNpZ25hbFJlc3VtZSgpOwotICAgIHZvaWQgaW5pdGlhdGVTaHV0ZG93bigpOworICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqZHN0QnVmZmVycykgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0ID0gTlVMTCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFVwZGF0ZUZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7CiAKLSAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0bykgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0bykgY29uc3Q7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRGaWxsVGhpc0J1ZmZlciAgICAgID0gJ2ZsVEInLAorICAgICAgICBrV2hhdERyYWluVGhpc0J1ZmZlciAgICAgPSAnZHJUQicsCisgICAgICAgIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCA9ICdmbXRDJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zsc0MnLAorICAgICAgICBrV2hhdFNodXRkb3duQ29tcGxldGVkICAgPSAnc2hEQycsCisgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKKyAgICAgICAga1doYXRFcnJvciAgICAgICAgICAgICAgID0gJ2VyciAnLAorICAgIH07CiAKIHByb3RlY3RlZDoKKwogICAgIHZpcnR1YWwgfkRlY29kZXIoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC00NiwyNyArNjIsOTAgQEAKIHByaXZhdGU6CiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0Q29kZWNOb3RpZnkgICAgICAgID0gJ2NkY04nLAorICAgICAgICBrV2hhdENvbmZpZ3VyZSAgICAgICAgICA9ICdjb25mJywKKyAgICAgICAga1doYXRHZXRJbnB1dEJ1ZmZlcnMgICAgPSAnZ0luQicsCisgICAgICAgIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQgID0gJ2lucEYnLAorICAgICAgICBrV2hhdFJlbmRlckJ1ZmZlciAgICAgICA9ICdybmRyJywKKyAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgPSAnZmx1cycsCisgICAgICAgIGtXaGF0U2h1dGRvd24gICAgICAgICAgID0gJ3NodUQnLAorICAgICAgICBrV2hhdFVwZGF0ZUZvcm1hdCAgICAgICA9ICd1Rm10JywKICAgICB9OwogCiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKIAotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIHNwPEFDb2RlYz4gbUNvZGVjOworICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3A8TWVkaWFDb2RlYz4gbUNvZGVjOwogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKKyAgICBzcDxBTG9vcGVyPiBtRGVjb2Rlckxvb3BlcjsKIAotICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0Q7Ci0gICAgc2l6ZV90IG1DU0RJbmRleDsKKyAgICBMaXN0PHNwPEFNZXNzYWdlPiA+IG1QZW5kaW5nSW5wdXRNZXNzYWdlczsKIAotICAgIHNwPEFNZXNzYWdlPiBtYWtlRm9ybWF0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUlucHV0QnVmZmVyczsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtT3V0cHV0QnVmZmVyczsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQ7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUNTRHNUb1N1Ym1pdDsKKyAgICBWZWN0b3I8Ym9vbD4gbUlucHV0QnVmZmVySXNEZXF1ZXVlZDsKKyAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gbU1lZGlhQnVmZmVyczsKIAotICAgIHZvaWQgb25GaWxsVGhpc0J1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBoYW5kbGVFcnJvcihpbnQzMl90IGVycik7CisgICAgYm9vbCBoYW5kbGVBbklucHV0QnVmZmVyKCk7CisgICAgYm9vbCBoYW5kbGVBbk91dHB1dEJ1ZmZlcigpOworCisgICAgdm9pZCByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKyAgICB2b2lkIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOworICAgIGJvb2wgaXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZvaWQgb25GbHVzaCgpOworICAgIHZvaWQgb25SZXN1bWUoKTsKKyAgICBib29sIG9uSW5wdXRCdWZmZXJGaWxsZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25SZW5kZXJCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25TaHV0ZG93bigpOworCisgICAgaW50MzJfdCBtQnVmZmVyR2VuZXJhdGlvbjsKKyAgICBib29sIG1QYXVzZWQ7CisgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKIAogICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2Rlcik7CiB9OwogCitzdHJ1Y3QgTnVQbGF5ZXI6OkNDRGVjb2RlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDbG9zZWRDYXB0aW9uRGF0YSwKKyAgICAgICAga1doYXRUcmFja0FkZGVkLAorICAgIH07CisKKyAgICBDQ0RlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CisgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CisgICAgdm9pZCBmbHVzaCgpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIEtleWVkVmVjdG9yPGludDY0X3QsIHNwPEFCdWZmZXI+ID4gbUNDTWFwOworICAgIHNpemVfdCBtQ3VycmVudENoYW5uZWw7CisgICAgaW50MzJfdCBtU2VsZWN0ZWRUcmFjazsKKyAgICBpbnQzMl90IG1UcmFja0luZGljZXNbNF07CisgICAgVmVjdG9yPHNpemVfdD4gbUZvdW5kQ2hhbm5lbHM7CisKKyAgICBib29sIGlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIGludDMyX3QgZ2V0VHJhY2tJbmRleChzaXplX3QgY2hhbm5lbCkgY29uc3Q7CisgICAgYm9vbCBleHRyYWN0RnJvbVNFSShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgc3A8QUJ1ZmZlcj4gZmlsdGVyQ0NCdWYoY29uc3Qgc3A8QUJ1ZmZlcj4gJmNjQnVmLCBzaXplX3QgaW5kZXgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NEZWNvZGVyKTsKK307CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTlVQTEFZRVJfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhYWNkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJOdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oIgorCisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4Q2FjaGVkQnl0ZXMgPSAyMDAwMDA7CisvLyBUaGUgYnVmZmVycyB3aWxsIGNvbnRhaW4gYSBiaXQgbGVzcyB0aGFuIGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMuCisvLyBTbyB3ZSBjYW4gc3RhcnQgb2ZmIHdpdGgganVzdCBlbm91Z2ggYnVmZmVycyB0byBrZWVwIHRoZSBjYWNoZSBmdWxsLgorc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGVuZGluZ0J1ZmZlcnMgPSAxICsgKGtNYXhDYWNoZWRCeXRlcyAvIE51UGxheWVyOjprQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzKTsKKworTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6RGVjb2RlclBhc3NUaHJvdWdoKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKKyAgICA6IERlY29kZXIobm90aWZ5KSwKKyAgICAgIG1Ob3RpZnkobm90aWZ5KSwKKyAgICAgIG1CdWZmZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVJlYWNoZWRFT1ModHJ1ZSksCisgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwoMCksCisgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluKDApLAorICAgICAgbUNhY2hlZEJ5dGVzKDApLAorICAgICAgbUNvbXBvbmVudE5hbWUoInBhc3MgdGhyb3VnaCBkZWNvZGVyIikgeworICAgIG1EZWNvZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoIik7CisgICAgbURlY29kZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Cit9CisKK051UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6On5EZWNvZGVyUGFzc1Rocm91Z2goKSB7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmluaXQoKSB7CisgICAgbURlY29kZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpzaWduYWxGbHVzaCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnNpZ25hbFJlc3VtZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjppbml0aWF0ZVNodXRkb3duKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogdGFyZ2V0Rm9ybWF0ICovKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgIG1DYWNoZWRCeXRlcyA9IDA7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsID0gMDsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluID0gMDsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICByZXF1ZXN0TWF4QnVmZmVycygpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjppc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgIHJldHVybiBnZW5lcmF0aW9uICE9IG1CdWZmZXJHZW5lcmF0aW9uOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnJlcXVlc3RBQnVmZmVyKCkgeworICAgIGlmIChtQ2FjaGVkQnl0ZXMgPj0ga01heENhY2hlZEJ5dGVzKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIG1DYWNoZWRCeXRlcyA9ICV6dSIsCisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbUNhY2hlZEJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobVJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR1YoIlslc10gcmVhY2hlZCBFT1MiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBpZCgpKTsKKyAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RmlsbFRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsKys7CisgICAgQUxPR1YoInJlcXVlc3RBQnVmZmVyOiAjVG9GaWxsID0gJXp1LCAjVG9EcmFpbiA9ICV6dSIsIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCwKKyAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgYW5kcm9pZDo6TnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25JbnB1dEJ1ZmZlckZpbGxlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAtLW1QZW5kaW5nQnVmZmVyc1RvRmlsbDsKKyAgICBpZiAobVJlYWNoZWRFT1MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFT1MpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2FjaGVkQnl0ZXMgKz0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRCdWZmZXJDb25zdW1lZCwgaWQoKSk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworICAgIHJlcGx5LT5zZXRJbnQzMigic2l6ZSIsIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXREcmFpblRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgKyttUGVuZGluZ0J1ZmZlcnNUb0RyYWluOworICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRmlsbGVkOiAjVG9GaWxsID0gJXp1LCAjVG9EcmFpbiA9ICV6dSwgY2FjaGVkQnl0ZXMgPSAlenUiLAorICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsLCBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluLCBtQ2FjaGVkQnl0ZXMpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uQnVmZmVyQ29uc3VtZWQoaW50MzJfdCBzaXplKSB7CisgICAgLS1tUGVuZGluZ0J1ZmZlcnNUb0RyYWluOworICAgIG1DYWNoZWRCeXRlcyAtPSBzaXplOworICAgIEFMT0dWKCJvbkJ1ZmZlckNvbnN1bWVkOiAjVG9GaWxsID0gJXp1LCAjVG9EcmFpbiA9ICV6dSwgY2FjaGVkQnl0ZXMgPSAlenUiLAorICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwsIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4sIG1DYWNoZWRCeXRlcyk7CisgICAgcmVxdWVzdEFCdWZmZXIoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkZsdXNoKCkgeworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCA9IDA7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiA9IDA7CisgICAgbUNhY2hlZEJ5dGVzID0gMDsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnJlcXVlc3RNYXhCdWZmZXJzKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFBlbmRpbmdCdWZmZXJzOyBpKyspIHsKKyAgICAgICAgaWYgKCFyZXF1ZXN0QUJ1ZmZlcigpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvblNodXRkb3duKCkgeworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJbJXNdIG9uTWVzc2FnZTogJXMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgb25Db25maWd1cmUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlcXVlc3RBQnVmZmVyOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdEFCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBvbklucHV0QnVmZmVyRmlsbGVkKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRCdWZmZXJDb25zdW1lZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2l6ZSIsICZzaXplKSk7CisgICAgICAgICAgICAgICAgb25CdWZmZXJDb25zdW1lZChzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICB7CisgICAgICAgICAgICBvbkZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcXVlc3RNYXhCdWZmZXJzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTaHV0ZG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25TaHV0ZG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyMDI1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCisKKyNkZWZpbmUgTlVQTEFZRVJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KKworI2luY2x1ZGUgIk51UGxheWVyLmgiCisKKyNpbmNsdWRlICJOdVBsYXllckRlY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaCA6IHB1YmxpYyBEZWNvZGVyIHsKKyAgICBEZWNvZGVyUGFzc1Rocm91Z2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIGluaXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bigpOworCisgICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdG8pIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgICB2aXJ0dWFsIH5EZWNvZGVyUGFzc1Rocm91Z2goKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UmVxdWVzdEFCdWZmZXIgICAgID0gJ3JlcUInLAorICAgICAgICBrV2hhdENvbmZpZ3VyZSAgICAgICAgICA9ICdjb25mJywKKyAgICAgICAga1doYXRJbnB1dEJ1ZmZlckZpbGxlZCAgPSAnaW5wRicsCisgICAgICAgIGtXaGF0QnVmZmVyQ29uc3VtZWQgICAgID0gJ2J1ZkMnLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICA9ICdmbHVzJywKKyAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgPSAnc2h1RCcsCisgICAgfTsKKworICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIHNwPEFMb29wZXI+IG1EZWNvZGVyTG9vcGVyOworCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhIGJ1ZmZlciB3YXMgcmVxdWVzdGVkLgorICAgICAqIFJldHVybnMgZmFsc2UgaWYgYXQgRU9TIG9yIGNhY2hlIGFscmVhZHkgZnVsbC4KKyAgICAgKi8KKyAgICBib29sIHJlcXVlc3RBQnVmZmVyKCk7CisgICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdm9pZCBvbkZsdXNoKCk7CisgICAgdm9pZCBvbklucHV0QnVmZmVyRmlsbGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQnVmZmVyQ29uc3VtZWQoaW50MzJfdCBzaXplKTsKKyAgICB2b2lkIHJlcXVlc3RNYXhCdWZmZXJzKCk7CisgICAgdm9pZCBvblNodXRkb3duKCk7CisKKyAgICBpbnQzMl90IG1CdWZmZXJHZW5lcmF0aW9uOworICAgIGJvb2wgICAgbVJlYWNoZWRFT1M7CisgICAgLy8gVE9ETyBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwgYW5kIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4gYXJlIG9ubHkgZm9yCisgICAgLy8gZGVidWdnaW5nLiBUaGV5IGNhbiBiZSByZW1vdmVkIHdoZW4gdGhlIHBvd2VyIGludmVzdGlnYXRpb24gaXMgZG9uZS4KKyAgICBzaXplX3QgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbDsKKyAgICBzaXplX3QgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgc2l6ZV90ICBtQ2FjaGVkQnl0ZXM7CisgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlY29kZXJQYXNzVGhyb3VnaCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCA0NzgzNGZkLi5hYjQ2MDc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOdVBsYXllckRyaXZlciIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXJEcml2ZXIuaCIKQEAgLTI1LDcgKzI2LDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzYsMTIgKzM5LDE0IEBACiAgICAgICBtU2V0U3VyZmFjZUluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbUR1cmF0aW9uVXMoLTEpLAogICAgICAgbVBvc2l0aW9uVXMoLTEpLAotICAgICAgbU51bUZyYW1lc1RvdGFsKDApLAotICAgICAgbU51bUZyYW1lc0Ryb3BwZWQoMCksCisgICAgICBtU2Vla0luUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtUGxheWVyRmxhZ3MoMCksCiAgICAgICBtQXRFT1MoZmFsc2UpLAorICAgICAgbUxvb3BpbmcoZmFsc2UpLAorICAgICAgbUF1dG9Mb29wKGZhbHNlKSwKICAgICAgIG1TdGFydHVwU2Vla1RpbWVVcygtMSkgeworICAgIEFMT0dWKCJOdVBsYXllckRyaXZlciglcCkiLCB0aGlzKTsKICAgICBtTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllckRyaXZlciBMb29wZXIiKTsKIAogICAgIG1Mb29wZXItPnN0YXJ0KApAQCAtNTYsNiArNjEsNyBAQAogfQogCiBOdVBsYXllckRyaXZlcjo6fk51UGxheWVyRHJpdmVyKCkgeworICAgIEFMT0dWKCJ+TnVQbGF5ZXJEcml2ZXIoJXApIiwgdGhpcyk7CiAgICAgbUxvb3Blci0+c3RvcCgpOwogfQogCkBAIC03MCw3ICs3NiwxMCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXApIHVybCglcykiLCB0aGlzLCB1cmlEZWJ1Z1N0cmluZyh1cmwsIGZhbHNlKS5jX3N0cigpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7CkBAIC03OSw3ICs4OCw3IEBACiAKICAgICBtU3RhdGUgPSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOwogCi0gICAgbVBsYXllci0+c2V0RGF0YVNvdXJjZUFzeW5jKHVybCwgaGVhZGVycyk7CisgICAgbVBsYXllci0+c2V0RGF0YVNvdXJjZUFzeW5jKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogCiAgICAgd2hpbGUgKG1TdGF0ZSA9PSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HKSB7CiAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CkBAIC04OSw2ICs5OCw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXApIGZpbGUoJWQpIiwgdGhpcywgZmQpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKQEAgLTEwNyw2ICsxMTcsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXApIHN0cmVhbSBzb3VyY2UiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7CkBAIC0xMjYsNiArMTM3LDcgQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgeworICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobVNldFN1cmZhY2VJblByb2dyZXNzKSB7CkBAIC0xNTMsNiArMTY1LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnByZXBhcmUoKSB7CisgICAgQUxPR1YoInByZXBhcmUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gcHJlcGFyZV9sKCk7CiB9CkBAIC0xNzEsMTIgKzE4NCwyMyBAQAogICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gKG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgcmVhbGx5IGp1c3QgcGF1c2VkLiBoYW5kbGUgYXMgc2VlayB0byBzdGFydAorICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc7CisgICAgICAgICAgICBtSXNBc3luY1ByZXBhcmUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDAsIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgICAgICAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgeworICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCkgPyBPSyA6IFVOS05PV05fRVJST1I7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnByZXBhcmVBc3luYygpIHsKKyAgICBBTE9HVigicHJlcGFyZUFzeW5jKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewpAQCAtMTg1LDEyICsyMDksMjAgQEAKICAgICAgICAgICAgIG1Jc0FzeW5jUHJlcGFyZSA9IHRydWU7CiAgICAgICAgICAgICBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgorICAgICAgICAgICAgLy8gdGhpcyBpcyByZWFsbHkganVzdCBwYXVzZWQuIGhhbmRsZSBhcyBzZWVrIHRvIHN0YXJ0CisgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzsKKyAgICAgICAgICAgIG1Jc0FzeW5jUHJlcGFyZSA9IHRydWU7CisgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwLCB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH07CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzdGFydCgpIHsKKyAgICBBTE9HRCgic3RhcnQoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CkBAIC0yMTMsOSArMjQ1LDcgQEAKICAgICAgICAgICAgIG1QbGF5ZXItPnN0YXJ0KCk7CiAKICAgICAgICAgICAgIGlmIChtU3RhcnR1cFNlZWtUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtU3RhcnR1cFNlZWtUaW1lVXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBub3RpZnlTZWVrQ29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtU3RhcnR1cFNlZWtUaW1lVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKG1TdGFydHVwU2Vla1RpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yMjUsMTEgKzI1NSwyNiBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUF0RU9TKSB7CisgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1QbGF5ZXItPnJlc3VtZSgpOworICAgICAgICAgICAgaWYgKG1BdEVPUykgeworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJlc3VtZSgpOworICAgICAgICAgICAgICAgIG1Qb3NpdGlvblVzID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJlc3VtZSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjQzLDcgKzI4OCwzMSBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c3RvcCgpIHsKLSAgICByZXR1cm4gcGF1c2UoKTsKKyAgICBBTE9HRCgic3RvcCglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgorICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorCisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU1RPUFBFRCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6cGF1c2UoKSB7CkBAIC0yNTUsNyArMzI0LDggQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKIAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9QQVVTRUQpOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QQVVTRUQpOwogICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0yNjMsOCArMzMzLDYgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI3Myw2ICszNDEsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2Vla1RvKGludCBtc2VjKSB7CisgICAgQUxPR0QoInNlZWtUbyglcCkgJWQgbXMiLCB0aGlzLCBtc2VjKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbXNlYyAqIDEwMDBsbDsKQEAgLTI4MSw2ICszNTAsMTAgQEAKICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgewogICAgICAgICAgICAgbVN0YXJ0dXBTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICAgICAgICAgIC8vIHByZXRlbmQgdGhhdCB0aGUgc2VlayBjb21wbGV0ZWQuIEl0IHdpbGwgYWN0dWFsbHkgaGFwcGVuIHdoZW4gc3RhcnRpbmcgcGxheWJhY2suCisgICAgICAgICAgICAvLyBUT0RPOiBhY3R1YWxseSBwZXJmb3JtIHRoZSBzZWVrIGhlcmUsIHNvIHRoZSBwbGF5ZXIgaXMgcmVhZHkgdG8gZ28gYXQgdGhlIG5ldworICAgICAgICAgICAgLy8gbG9jYXRpb24KKyAgICAgICAgICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yODgsOSArMzYxLDEwIEBACiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgogICAgICAgICB7CiAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TZWVrSW5Qcm9ncmVzcyA9IHRydWU7CiAgICAgICAgICAgICAvLyBzZWVrcyBjYW4gdGFrZSBhIHdoaWxlLCBzbyB3ZSBlc3NlbnRpYWxseSBwYXVzZWQKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BBVVNFRCk7Ci0gICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYyhzZWVrVGltZVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUEFVU0VEKTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKHNlZWtUaW1lVXMsIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yOTgsMTggKzM3MiwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIG1Qb3NpdGlvblVzID0gc2Vla1RpbWVVczsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKSB7CisgICAgaW50NjRfdCB0ZW1wVXMgPSAwOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPmdldEN1cnJlbnRQb3NpdGlvbigmdGVtcFVzKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVBvc2l0aW9uVXMgPCAwKSB7Ci0gICAgICAgICptc2VjID0gMDsKKyAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIG1TZWVrSW5Qcm9ncmVzcyBoZXJlIGJlY2F1c2UgbVBsYXllci0+c2Vla1RvQXN5bmMgaXMgYW4gYXN5bmMgY2FsbCwgd2hpY2gKKyAgICAvLyBtZWFucyBnZXRDdXJyZW50UG9zaXRpb24gY2FuIGJlIGNhbGxlZCBiZWZvcmUgc2VlayBpcyBjb21wbGV0ZWQuIElvdywgcmVuZGVyZXIgbWF5IHJldHVybiBhCisgICAgLy8gcG9zaXRpb24gdmFsdWUgdGhhdCdzIGRpZmZlcmVudCB0aGUgc2VlayB0byBwb3NpdGlvbi4KKyAgICBpZiAocmV0ICE9IE9LIHx8IG1TZWVrSW5Qcm9ncmVzcykgeworICAgICAgICB0ZW1wVXMgPSAobVBvc2l0aW9uVXMgPD0gMCkgPyAwIDogbVBvc2l0aW9uVXM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKm1zZWMgPSAobVBvc2l0aW9uVXMgKyA1MDBsbCkgLyAxMDAwOworICAgICAgICBtUG9zaXRpb25VcyA9IHRlbXBVczsKICAgICB9Ci0KKyAgICAqbXNlYyA9IChpbnQpZGl2Um91bmQodGVtcFVzLCAoaW50NjRfdCkoMTAwMCkpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzI2LDYgKzQwNiw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpyZXNldCgpIHsKKyAgICBBTE9HRCgicmVzZXQoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CkBAIC0zNDAsNyArNDIxLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0sobUlzQXN5bmNQcmVwYXJlKTsKIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfUFJFUEFSRUQpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QUkVQQVJFRCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0zNDgsNyArNDI5LDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NUT1BQRUQpOworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfU1RPUFBFRCkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NUT1BQRUQpOworICAgIH0KIAogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKQEAgLTM2MCwxMiArNDQzLDE0IEBACiAgICAgbUR1cmF0aW9uVXMgPSAtMTsKICAgICBtUG9zaXRpb25VcyA9IC0xOwogICAgIG1TdGFydHVwU2Vla1RpbWVVcyA9IC0xOworICAgIG1Mb29waW5nID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRMb29waW5nKGludCBsb29wKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIG1Mb29waW5nID0gbG9vcCAhPSAwOworICAgIHJldHVybiBPSzsKIH0KIAogcGxheWVyX3R5cGUgTnVQbGF5ZXJEcml2ZXI6OnBsYXllclR5cGUoKSB7CkBAIC00MDksNiArNDk0LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovKTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCB0eXBlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUsIHJlcGx5KTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTQxOCwxOCArNTA5LDIwIEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKICAgICBtUGxheWVyLT5zZXRBdWRpb1NpbmsoYXVkaW9TaW5rKTsKKyAgICBtQXVkaW9TaW5rID0gYXVkaW9TaW5rOwogfQogCi1zdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFBhcmFtZXRlcigKKyAgICAgICAgaW50IC8qIGtleSAqLywgY29uc3QgUGFyY2VsICYgLyogcmVxdWVzdCAqLykgewogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCAvKiBrZXkgKi8sIFBhcmNlbCAqIC8qIHJlcGx5ICovKSB7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3JkcykgeworICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLCBQYXJjZWwgKnJlY29yZHMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgdXNpbmcgbWVkaWE6Ok1ldGFkYXRhOwpAQCAtNDU2LDYgKzU0OSw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVJlc2V0Q29tcGxldGUoKSB7CisgICAgQUxPR0QoIm5vdGlmeVJlc2V0Q29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MpOwpAQCAtNDY0LDYgKzU1OCw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZSgpIHsKKyAgICBBTE9HVigibm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpOwpAQCAtNDc3LDM0ICs1NzIsNDUgQEAKICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CiB9CiAKLXZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVBvc2l0aW9uKGludDY0X3QgcG9zaXRpb25VcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVBvc2l0aW9uVXMgPSBwb3NpdGlvblVzOwotfQotCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGUoKSB7Ci0gICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU0VFS19DT01QTEVURSk7CisgICAgQUxPR1YoIm5vdGlmeVNlZWtDb21wbGV0ZSglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1TZWVrSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUZyYW1lU3RhdHMoCi0gICAgICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWwsIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbU51bUZyYW1lc1RvdGFsID0gbnVtRnJhbWVzVG90YWw7Ci0gICAgbU51bUZyYW1lc0Ryb3BwZWQgPSBudW1GcmFtZXNEcm9wcGVkOwordm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlX2woKSB7CisgICAgYm9vbCB3YXNTZWVraW5nID0gdHJ1ZTsKKyAgICBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgeworICAgICAgICB3YXNTZWVraW5nID0gZmFsc2U7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOworICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgICAgICBpZiAoIW1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByZXBhcmluZyBzeW5jaHJvbm91c2x5LCBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgeworICAgICAgICAvLyBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5vdGlmeUxpc3RlbmVyX2wod2FzU2Vla2luZyA/IE1FRElBX1NFRUtfQ09NUExFVEUgOiBNRURJQV9QUkVQQVJFRCk7CiB9CiAKLXN0YXR1c190IE51UGxheWVyRHJpdmVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6ZHVtcCgKKyAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICYgLyogYXJncyAqLykgY29uc3QgeworICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWw7CisgICAgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkOworICAgIG1QbGF5ZXItPmdldFN0YXRzKCZudW1GcmFtZXNUb3RhbCwgJm51bUZyYW1lc0Ryb3BwZWQpOwogCiAgICAgRklMRSAqb3V0ID0gZmRvcGVuKGR1cChmZCksICJ3Iik7CiAKICAgICBmcHJpbnRmKG91dCwgIiBOdVBsYXllclxuIik7Ci0gICAgZnByaW50ZihvdXQsICIgIG51bUZyYW1lc1RvdGFsKCVsbGQpLCBudW1GcmFtZXNEcm9wcGVkKCVsbGQpLCAiCisgICAgZnByaW50ZihvdXQsICIgIG51bUZyYW1lc1RvdGFsKCUiIFBSSWQ2NCAiKSwgbnVtRnJhbWVzRHJvcHBlZCglIiBQUklkNjQgIiksICIKICAgICAgICAgICAgICAgICAgInBlcmNlbnRhZ2VEcm9wcGVkKCUuMmYpXG4iLAotICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzVG90YWwsCi0gICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNEcm9wcGVkLAotICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzVG90YWwgPT0gMAotICAgICAgICAgICAgICAgICAgICA/IDAuMCA6IChkb3VibGUpbU51bUZyYW1lc0Ryb3BwZWQgLyBtTnVtRnJhbWVzVG90YWwpOworICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgbnVtRnJhbWVzRHJvcHBlZCwKKyAgICAgICAgICAgICAgICAgbnVtRnJhbWVzVG90YWwgPT0gMAorICAgICAgICAgICAgICAgICAgICA/IDAuMCA6IChkb3VibGUpbnVtRnJhbWVzRHJvcHBlZCAvIG51bUZyYW1lc1RvdGFsKTsKIAogICAgIGZjbG9zZShvdXQpOwogICAgIG91dCA9IE5VTEw7CkBAIC01MTQsMTEgKzYyMCw0MSBAQAogCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcigKICAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7Ci0gICAgaWYgKG1zZyA9PSBNRURJQV9QTEFZQkFDS19DT01QTEVURSB8fCBtc2cgPT0gTUVESUFfRVJST1IpIHsKLSAgICAgICAgbUF0RU9TID0gdHJ1ZTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG5vdGlmeUxpc3RlbmVyX2wobXNnLCBleHQxLCBleHQyLCBpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyX2woCisgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgeworICAgIHN3aXRjaCAobXNnKSB7CisgICAgICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxvb3BpbmcgfHwgKG1BdXRvTG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1BdWRpb1NpbmsgPT0gTlVMTCB8fCBtQXVkaW9TaW5rLT5yZWFsdGltZSgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1FRElBX0VSUk9SOgorICAgICAgICB7CisgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgc2VuZEV2ZW50KG1zZywgZXh0MSwgZXh0MiwgaW4pOworICAgIG1Mb2NrLmxvY2soKTsKIH0KIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChzdGF0dXNfdCBlcnIpIHsKQEAgLTU0NywxNSArNjgzLDI0IEBACiAgICAgbUFzeW5jUmVzdWx0ID0gZXJyOwogCiAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9QUkVQQVJFRCk7Ci0gICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlIHN0YXRlIGJlZm9yZSBub3RpZnlpbmcgY2xpZW50LCBzbyB0aGF0IGlmIGNsaWVudCBjYWxscyBiYWNrIGludG8gTnVQbGF5ZXJEcml2ZXIKKyAgICAgICAgLy8gaW4gcmVzcG9uc2UsIE51UGxheWVyRHJpdmVyIGhhcyB0aGUgcmlnaHQgc3RhdGUKICAgICAgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7Ci0gICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BSRVBBUkVEKTsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1VOUFJFUEFSRUQ7CisgICAgICAgIGlmIChtSXNBc3luY1ByZXBhcmUpIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1QbGF5ZXItPmdldEZpbGVNZXRhKCk7CisgICAgaW50MzJfdCBsb29wOworICAgIGlmIChtZXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKSAmJiBsb29wICE9IDApIHsKKyAgICAgICAgbUF1dG9Mb29wID0gdHJ1ZTsKICAgICB9CiAKICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAppbmRleCA5OWY3MmE2Li41Y2JhN2Q5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaApAQCAtMzEsNyArMzEsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCkBAIC02Niw5ICs2OCw4IEBACiAgICAgdm9pZCBub3RpZnlSZXNldENvbXBsZXRlKCk7CiAgICAgdm9pZCBub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUoKTsKICAgICB2b2lkIG5vdGlmeUR1cmF0aW9uKGludDY0X3QgZHVyYXRpb25Vcyk7Ci0gICAgdm9pZCBub3RpZnlQb3NpdGlvbihpbnQ2NF90IHBvc2l0aW9uVXMpOwogICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlKCk7Ci0gICAgdm9pZCBub3RpZnlGcmFtZVN0YXRzKGludDY0X3QgbnVtRnJhbWVzVG90YWwsIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCk7CisgICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGVfbCgpOwogICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKICAgICB2b2lkIG5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncyk7CiAKQEAgLTg1LDYgKzg2LDkgQEAKICAgICAgICAgU1RBVEVfUlVOTklORywKICAgICAgICAgU1RBVEVfUEFVU0VELAogICAgICAgICBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUywKKyAgICAgICAgU1RBVEVfU1RPUFBFRCwgICAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRAorICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcsICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2Vla2luZworICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQogICAgIH07CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwpAQCAtMTAwLDE5ICsxMDQsMjIgQEAKICAgICBib29sIG1TZXRTdXJmYWNlSW5Qcm9ncmVzczsKICAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwogICAgIGludDY0X3QgbVBvc2l0aW9uVXM7Ci0gICAgaW50NjRfdCBtTnVtRnJhbWVzVG90YWw7Ci0gICAgaW50NjRfdCBtTnVtRnJhbWVzRHJvcHBlZDsKKyAgICBib29sIG1TZWVrSW5Qcm9ncmVzczsKICAgICAvLyA8PDwKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8TnVQbGF5ZXI+IG1QbGF5ZXI7CisgICAgc3A8QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKIAogICAgIGJvb2wgbUF0RU9TOworICAgIGJvb2wgbUxvb3Bpbmc7CisgICAgYm9vbCBtQXV0b0xvb3A7CiAKICAgICBpbnQ2NF90IG1TdGFydHVwU2Vla1RpbWVVczsKIAogICAgIHN0YXR1c190IHByZXBhcmVfbCgpOworICAgIHZvaWQgbm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXJEcml2ZXIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCBiZjUyNzFlLi44NmNlMzg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0yMCwyMyArMjAsNDQgQEAKIAogI2luY2x1ZGUgIk51UGxheWVyUmVuZGVyZXIuaCIKIAotI2luY2x1ZGUgIlNvZnR3YXJlUmVuZGVyZXIuaCIKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPFZpZGVvRnJhbWVTY2hlZHVsZXIuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWF4aW11bSB0aW1lIGluIHBhdXNlZCBzdGF0ZSB3aGVuIG9mZmxvYWRpbmcgYXVkaW8gZGVjb21wcmVzc2lvbi4gV2hlbiBlbGFwc2VkLCB0aGUgQXVkaW9TaW5rCisvLyBpcyBjbG9zZWQgdG8gYWxsb3cgdGhlIGF1ZGlvIERTUCB0byBwb3dlciBkb3duLgorc3RhdGljIGNvbnN0IGludDY0X3Qga09mZmxvYWRQYXVzZU1heFVzID0gNjAwMDAwMDBsbDsKKwogLy8gc3RhdGljCiBjb25zdCBpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6a01pblBvc2l0aW9uVXBkYXRlRGVsYXlVcyA9IDEwMDAwMGxsOwogCitzdGF0aWMgYm9vbCBzRnJhbWVBY2N1cmF0ZUFWc3luYyA9IGZhbHNlOworCitzdGF0aWMgdm9pZCByZWFkUHJvcGVydGllcygpIHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMubWVkaWEuYXZzeW5jIiwgdmFsdWUsIE5VTEwpKSB7CisgICAgICAgIHNGcmFtZUFjY3VyYXRlQVZzeW5jID0KKyAgICAgICAgICAgICFzdHJjbXAoIjEiLCB2YWx1ZSkgfHwgIXN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSk7CisgICAgfQorfQorCiBOdVBsYXllcjo6UmVuZGVyZXI6OlJlbmRlcmVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICB1aW50MzJfdCBmbGFncykKICAgICA6IG1BdWRpb1Npbmsoc2luayksCi0gICAgICBtU29mdFJlbmRlcmVyKE5VTEwpLAogICAgICAgbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1OdW1GcmFtZXNXcml0dGVuKDApLApAQCAtNDQsMjggKzY1LDM3IEBACiAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyhmYWxzZSksCiAgICAgICBtQXVkaW9RdWV1ZUdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9RdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcygtMSksCiAgICAgICBtQW5jaG9yVGltZVJlYWxVcygtMSksCi0gICAgICBtRmx1c2hpbmdBdWRpbyhmYWxzZSksCi0gICAgICBtRmx1c2hpbmdWaWRlbyhmYWxzZSksCisgICAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbigtMSksCisgICAgICBtQW5jaG9yTWF4TWVkaWFVcygtMSksCisgICAgICBtVmlkZW9MYXRlQnlVcygwbGwpLAogICAgICAgbUhhc0F1ZGlvKGZhbHNlKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCisgICAgICBtUGF1c2VTdGFydGVkVGltZVJlYWxVcygtMSksCisgICAgICBtRmx1c2hpbmdBdWRpbyhmYWxzZSksCisgICAgICBtRmx1c2hpbmdWaWRlbyhmYWxzZSksCiAgICAgICBtU3luY1F1ZXVlcyhmYWxzZSksCiAgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkKGZhbHNlKSwKICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAogICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAotICAgICAgbUxhc3RQb3NpdGlvblVwZGF0ZVVzKC0xbGwpLAotICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSB7CisgICAgICBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbigwKSwKKyAgICAgIG1BdWRpb09mZmxvYWRUb3JuRG93bihmYWxzZSksCisgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvKEFVRElPX0lORk9fSU5JVElBTElaRVIpLAorICAgICAgbVRvdGFsQnVmZmVyc1F1ZXVlZCgwKSwKKyAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApIHsKKyAgICByZWFkUHJvcGVydGllcygpOwogfQogCiBOdVBsYXllcjo6UmVuZGVyZXI6On5SZW5kZXJlcigpIHsKLSAgICBkZWxldGUgbVNvZnRSZW5kZXJlcjsKLX0KLQotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldFNvZnRSZW5kZXJlcihTb2Z0d2FyZVJlbmRlcmVyICpzb2Z0UmVuZGVyZXIpIHsKLSAgICBkZWxldGUgbVNvZnRSZW5kZXJlcjsKLSAgICBtU29mdFJlbmRlcmVyID0gc29mdFJlbmRlcmVyOworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cXVldWVCdWZmZXIoCkBAIC05MiwxMCArMTIyLDE0IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUZsdXNoTG9jayk7CiAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgQ0hFQ0soIW1GbHVzaGluZ0F1ZGlvKTsKKyAgICAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENIRUNLKCFtRmx1c2hpbmdWaWRlbyk7CisgICAgICAgICAgICBpZiAobUZsdXNoaW5nVmlkZW8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDYsMTMgKzE0MCwyMyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAvLyBDSEVDSyhtQXVkaW9RdWV1ZS5lbXB0eSgpKTsKICAgICAvLyBDSEVDSyhtVmlkZW9RdWV1ZS5lbXB0eSgpKTsKLSAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKLSAgICBtQW5jaG9yVGltZVJlYWxVcyA9IC0xOworICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKC0xKTsKKyAgICBzZXRBbmNob3JUaW1lKC0xLCAtMSk7CisgICAgc2V0VmlkZW9MYXRlQnlVcygwKTsKICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOwogfQogCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsQXVkaW9TaW5rQ2hhbmdlZCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvLCBpZCgpKSktPnBvc3QoKTsKK30KKwogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBhdXNlKCkgewogICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CiB9CkBAIC0xMjEsOCArMTY1LDE2OCBAQAogICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOwogfQogCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvRnJhbWVSYXRlLCBpZCgpKTsKKyAgICBtc2ctPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZnBzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcykgeworICAgIHJldHVybiBnZXRDdXJyZW50UG9zaXRpb24obWVkaWFVcywgQUxvb3Blcjo6R2V0Tm93VXMoKSk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0Q3VycmVudFBvc2l0aW9uKAorICAgICAgICBpbnQ2NF90ICptZWRpYVVzLCBpbnQ2NF90IG5vd1VzLCBib29sIGFsbG93UGFzdFF1ZXVlZFZpZGVvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgaWYgKCFtSGFzQXVkaW8gJiYgIW1IYXNWaWRlbykgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHBvc2l0aW9uVXMgPSAobm93VXMgLSBtQW5jaG9yVGltZVJlYWxVcykgKyBtQW5jaG9yVGltZU1lZGlhVXM7CisKKyAgICBpZiAobVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgIT0gLTEpIHsKKyAgICAgICAgcG9zaXRpb25VcyAtPSAobm93VXMgLSBtUGF1c2VTdGFydGVkVGltZVJlYWxVcyk7CisgICAgfQorCisgICAgLy8gbGltaXQgcG9zaXRpb24gdG8gdGhlIGxhc3QgcXVldWVkIG1lZGlhIHRpbWUgKGZvciB2aWRlbyBvbmx5IHN0cmVhbQorICAgIC8vIHBvc2l0aW9uIHdpbGwgYmUgZGlzY3JldGUgYXMgd2UgZG9uJ3Qga25vdyBob3cgbG9uZyBlYWNoIGZyYW1lIGxhc3RzKQorICAgIGlmIChtQW5jaG9yTWF4TWVkaWFVcyA+PSAwICYmICFhbGxvd1Bhc3RRdWV1ZWRWaWRlbykgeworICAgICAgICBpZiAocG9zaXRpb25VcyA+IG1BbmNob3JNYXhNZWRpYVVzKSB7CisgICAgICAgICAgICBwb3NpdGlvblVzID0gbUFuY2hvck1heE1lZGlhVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocG9zaXRpb25VcyA8IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpIHsKKyAgICAgICAgcG9zaXRpb25VcyA9IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXM7CisgICAgfQorCisgICAgKm1lZGlhVXMgPSAocG9zaXRpb25VcyA8PSAwKSA/IDAgOiBwb3NpdGlvblVzOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEhhc01lZGlhKGJvb2wgYXVkaW8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgbUhhc0F1ZGlvID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGFzVmlkZW8gPSB0cnVlOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKGludDY0X3QgbWVkaWFVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVVzOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChpbnQ2NF90IG1lZGlhVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9PSAtMSkgeworICAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRBbmNob3JUaW1lKAorICAgICAgICBpbnQ2NF90IG1lZGlhVXMsIGludDY0X3QgcmVhbFVzLCBpbnQ2NF90IG51bUZyYW1lc1dyaXR0ZW4sIGJvb2wgcmVzdW1lKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKKyAgICBtQW5jaG9yVGltZVJlYWxVcyA9IHJlYWxVczsKKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IG51bUZyYW1lc1dyaXR0ZW47CisgICAgaWYgKHJlc3VtZSkgeworICAgICAgICBtUGF1c2VTdGFydGVkVGltZVJlYWxVcyA9IC0xOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBtVmlkZW9MYXRlQnlVcyA9IGxhdGVVczsKK30KKworaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFZpZGVvTGF0ZUJ5VXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgcmV0dXJuIG1WaWRlb0xhdGVCeVVzOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcyhpbnQ2NF90IHJlYWxVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzID0gcmVhbFVzOworfQorCitib29sIE51UGxheWVyOjpSZW5kZXJlcjo6b3BlbkF1ZGlvU2luaygKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9wZW5BdWRpb1NpbmssIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnNldEludDMyKCJvZmZsb2FkLW9ubHkiLCBvZmZsb2FkT25seSk7CisgICAgbXNnLT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOworICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGludDMyX3Qgb2ZmbG9hZDsKKyAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJvZmZsb2FkIiwgJm9mZmxvYWQpKTsKKyAgICByZXR1cm4gKG9mZmxvYWQgIT0gMCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpjbG9zZUF1ZGlvU2luaygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VBdWRpb1NpbmssIGlkKCkpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKK30KKwogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T3BlbkF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKworICAgICAgICAgICAgaW50MzJfdCBvZmZsb2FkT25seTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJvZmZsb2FkLW9ubHkiLCAmb2ZmbG9hZE9ubHkpKTsKKworICAgICAgICAgICAgaW50MzJfdCBoYXNWaWRlbzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoYXMtdmlkZW8iLCAmaGFzVmlkZW8pKTsKKworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAoaW50MzJfdCAqKSZmbGFncykpOworCisgICAgICAgICAgICBib29sIG9mZmxvYWQgPSBvbk9wZW5BdWRpb1NpbmsoZm9ybWF0LCBvZmZsb2FkT25seSwgaGFzVmlkZW8sIGZsYWdzKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJvZmZsb2FkIiwgb2ZmbG9hZCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDbG9zZUF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgb25DbG9zZUF1ZGlvU2luaygpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcEF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0RHJhaW5BdWRpb1F1ZXVlOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CkBAIC0xNDksNyArMzUzLDEwIEBACiAKICAgICAgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGl0IG1vcmUgZGF0YSBhZnRlciBhYm91dCBoYWxmIHRoYXQgdGltZQogICAgICAgICAgICAgICAgIC8vIGhhcyBlbGFwc2VkLgotICAgICAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoZGVsYXlVcyAvIDIpOworICAgICAgICAgICAgICAgIC8vIGtXaGF0RHJhaW5BdWRpb1F1ZXVlIGlzIHVzZWQgZm9yIG5vbi1vZmZsb2FkaW5nIG1vZGUsCisgICAgICAgICAgICAgICAgLy8gYW5kIG1Mb2NrIGlzIHVzZWQgb25seSBmb3Igb2ZmbG9hZGluZyBtb2RlLiBUaGVyZWZvcmUsCisgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBhY3F1aXJlIG1Mb2NrIGhlcmUuCisgICAgICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKGRlbGF5VXMgLyAyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNzAsNiArMzc3LDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRQb3N0RHJhaW5WaWRlb1F1ZXVlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFF1ZXVlQnVmZmVyOgogICAgICAgICB7CiAgICAgICAgICAgICBvblF1ZXVlQnVmZmVyKG1zZyk7CkBAIC0xOTQsNiArNDE0LDEyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvOgorICAgICAgICB7CisgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgogICAgICAgICB7CiAgICAgICAgICAgICBvblBhdXNlKCk7CkBAIC0yMDYsMTQgKzQzMiw0MSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U2V0VmlkZW9GcmFtZVJhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGZwczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZwcykpOworICAgICAgICAgICAgb25TZXRWaWRlb0ZyYW1lUmF0ZShmcHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uQXVkaW9PZmZsb2FkVGVhckRvd24oa0R1ZVRvRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkF1ZGlvIE9mZmxvYWQgdGVhciBkb3duIGR1ZSB0byBwYXVzZSB0aW1lb3V0LiIpOworICAgICAgICAgICAgb25BdWRpb09mZmxvYWRUZWFyRG93bihrRHVlVG9UaW1lb3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwb3N0RHJhaW5BdWRpb1F1ZXVlKGludDY0X3QgZGVsYXlVcykgewotICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtUGF1c2VkKSB7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluQXVkaW9RdWV1ZV9sKGludDY0X3QgZGVsYXlVcykgeworICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtUGF1c2VkCisgICAgICAgICAgICB8fCBvZmZsb2FkaW5nQXVkaW8oKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMjcsMTAgKzQ4MCw2IEBACiAgICAgbXNnLT5wb3N0KGRlbGF5VXMpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsQXVkaW9TaW5rQ2hhbmdlZCgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCwgaWQoKSkpLT5wb3N0KCk7Ci19Ci0KIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpIHsKICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtQXVkaW9RdWV1ZUdlbmVyYXRpb247CiAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gbVZpZGVvUXVldWVHZW5lcmF0aW9uOwpAQCAtMjQ4LDYgKzQ5NywxMDIgQEAKICAgICB9CiB9CiAKKy8vIHN0YXRpYworc2l6ZV90IE51UGxheWVyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2soCisgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICogLyogYXVkaW9TaW5rICovLAorICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICB2b2lkICpjb29raWUsCisgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7CisgICAgTnVQbGF5ZXI6OlJlbmRlcmVyICptZSA9IChOdVBsYXllcjo6UmVuZGVyZXIgKiljb29raWU7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX0ZJTExfQlVGRkVSOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWUtPmZpbGxBdWRpb0J1ZmZlcihidWZmZXIsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9TVFJFQU1fRU5EOgorICAgICAgICB7CisgICAgICAgICAgICBtZS0+bm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9URUFSX0RPV046CisgICAgICAgIHsKKyAgICAgICAgICAgIG1lLT5ub3RpZnlBdWRpb09mZmxvYWRUZWFyRG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc2l6ZV90IE51UGxheWVyOjpSZW5kZXJlcjo6ZmlsbEF1ZGlvQnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSB8fCBtUGF1c2VkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJvb2wgaGFzRU9TID0gZmFsc2U7CisKKyAgICBzaXplX3Qgc2l6ZUNvcGllZCA9IDA7CisgICAgYm9vbCBmaXJzdEVudHJ5ID0gdHJ1ZTsKKyAgICB3aGlsZSAoc2l6ZUNvcGllZCA8IHNpemUgJiYgIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CisKKyAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwpIHsgLy8gRU9TCisgICAgICAgICAgICBoYXNFT1MgPSB0cnVlOworICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaXJzdEVudHJ5ICYmIGVudHJ5LT5tT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIGZpcnN0RW50cnkgPSBmYWxzZTsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWQobWVkaWFUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpIC0gZW50cnktPm1PZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplUmVtYWluaW5nID0gc2l6ZSAtIHNpemVDb3BpZWQ7CisgICAgICAgIGlmIChjb3B5ID4gc2l6ZVJlbWFpbmluZykgeworICAgICAgICAgICAgY29weSA9IHNpemVSZW1haW5pbmc7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoKGNoYXIgKilidWZmZXIgKyBzaXplQ29waWVkLAorICAgICAgICAgICAgICAgZW50cnktPm1CdWZmZXItPmRhdGEoKSArIGVudHJ5LT5tT2Zmc2V0LAorICAgICAgICAgICAgICAgY29weSk7CisKKyAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gY29weTsKKyAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgZW50cnkgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHNpemVDb3BpZWQgKz0gY29weTsKKyAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA+PSAwKSB7CisgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBzZXRBbmNob3JUaW1lKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMsIG5vd1VzIC0gZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKG5vd1VzKSk7CisgICAgfQorCisgICAgLy8gd2UgZG9uJ3Qga25vdyBob3cgbXVjaCBkYXRhIHdlIGFyZSBxdWV1ZWluZyBmb3Igb2ZmbG9hZGVkIHRyYWNrcworICAgIG1BbmNob3JNYXhNZWRpYVVzID0gLTE7CisKKyAgICBpZiAoaGFzRU9TKSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQXVkaW9TaW5rLCBpZCgpKSktPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZUNvcGllZDsKK30KKwogYm9vbCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uRHJhaW5BdWRpb1F1ZXVlKCkgewogICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKICAgICBpZiAobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCkgIT0gT0spIHsKQEAgLTI3MiwxMCArNjE3LDE1IEBACiAgICAgd2hpbGUgKG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSA+IDAgJiYgIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CiAKKyAgICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQgPSBlbnRyeS0+bUJ1ZmZlck9yZGluYWw7CisKICAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgIC8vIEVPUwotCi0gICAgICAgICAgICBub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCk7CisgICAgICAgICAgICBpbnQ2NF90IHBvc3RFT1NEZWxheVVzID0gMDsKKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CisgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCBwb3N0RU9TRGVsYXlVcyk7CiAKICAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgZW50cnkgPSBOVUxMOwpAQCAtMjg1LDI2ICs2MzUsOCBAQAogICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0KICAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLCBtZWRpYVRpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwotCi0gICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7Ci0gICAgICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgdWludDMyX3QgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgPQotICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuIC0gbnVtRnJhbWVzUGxheWVkOwotCi0gICAgICAgICAgICBpbnQ2NF90IHJlYWxUaW1lT2Zmc2V0VXMgPQotICAgICAgICAgICAgICAgIChtQXVkaW9TaW5rLT5sYXRlbmN5KCkgLyAyICAvKiBYWFggKi8KLSAgICAgICAgICAgICAgICAgICAgKyBudW1GcmFtZXNQZW5kaW5nUGxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkpICogMTAwMGxsOwotCi0gICAgICAgICAgICAvLyBBTE9HSSgicmVhbFRpbWVPZmZzZXRVcyA9ICVsbGQgdXMiLCByZWFsVGltZU9mZnNldFVzKTsKLQotICAgICAgICAgICAgbUFuY2hvclRpbWVSZWFsVXMgPQotICAgICAgICAgICAgICAgIEFMb29wZXI6OkdldE5vd1VzKCkgKyByZWFsVGltZU9mZnNldFVzOworICAgICAgICAgICAgb25OZXdBdWRpb01lZGlhVGltZShtZWRpYVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKQEAgLTMxMiwxMSArNjQ0LDEzIEBACiAgICAgICAgICAgICBjb3B5ID0gbnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlOwogICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+d3JpdGUoCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwgY29weSksCi0gICAgICAgICAgICAgICAgIChzc2l6ZV90KWNvcHkpOworICAgICAgICBzc2l6ZV90IHdyaXR0ZW4gPSBtQXVkaW9TaW5rLT53cml0ZShlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsIGNvcHkpOworICAgICAgICBpZiAod3JpdHRlbiA8IDApIHsKKyAgICAgICAgICAgIC8vIEFuIGVycm9yIGluIEF1ZGlvU2luayB3cml0ZSBpcyBmYXRhbCBoZXJlLgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQXVkaW9TaW5rIHdyaXRlIGVycm9yKCV6ZCkgd2hlbiB3cml0aW5nICV6dSBieXRlcyIsIHdyaXR0ZW4sIGNvcHkpOworICAgICAgICB9CiAKLSAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gY29weTsKKyAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gd3JpdHRlbjsKICAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKICAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOwpAQCAtMzI0LDIwICs2NTgsNzMgQEAKICAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSAtPSBjb3B5OwotICAgICAgICBzaXplX3QgY29waWVkRnJhbWVzID0gY29weSAvIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOworICAgICAgICBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGUgLT0gd3JpdHRlbjsKKyAgICAgICAgc2l6ZV90IGNvcGllZEZyYW1lcyA9IHdyaXR0ZW4gLyBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gY29waWVkRnJhbWVzOwogCiAgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkKCk7Ci0gICAgfQogCi0gICAgbm90aWZ5UG9zaXRpb24oKTsKKyAgICAgICAgaWYgKHdyaXR0ZW4gIT0gKHNzaXplX3QpY29weSkgeworICAgICAgICAgICAgLy8gQSBzaG9ydCBjb3VudCB3YXMgcmVjZWl2ZWQgZnJvbSBBdWRpb1Npbms6OndyaXRlKCkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBdWRpb1Npbmsgd3JpdGUgc2hvdWxkIGJsb2NrIHVudGlsIGV4YWN0bHkgdGhlIG51bWJlciBvZiBieXRlcyBhcmUgZGVsaXZlcmVkLgorICAgICAgICAgICAgLy8gQnV0IGl0IG1heSByZXR1cm4gd2l0aCBhIHNob3J0IGNvdW50ICh3aXRob3V0IGFuIGVycm9yKSB3aGVuOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIDEpIFNpemUgdG8gYmUgY29waWVkIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiBXZSBjb25zaWRlciB0aGlzIGZhdGFsLgorICAgICAgICAgICAgLy8gMikgQXVkaW9TaW5rIGlzIGFuIEF1ZGlvQ2FjaGUgZm9yIGRhdGEgcmV0cmlldmFsLCBhbmQgdGhlIEF1ZGlvQ2FjaGUgaXMgZXhjZWVkZWQuCisKKyAgICAgICAgICAgIC8vIChDYXNlIDEpCisgICAgICAgICAgICAvLyBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuICBJZiBpdCBpcyBub3QgYSBtdWx0aXBsZSBvZiBhIGZyYW1lIHNpemUsIGl0CisgICAgICAgICAgICAvLyBuZWVkcyB0byBmYWlsLCBhcyB3ZSBzaG91bGQgbm90IGNhcnJ5IG92ZXIgZnJhY3Rpb25hbCBmcmFtZXMgYmV0d2VlbiBjYWxscy4KKyAgICAgICAgICAgIENIRUNLX0VRKGNvcHkgJSBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKSwgMCk7CisKKyAgICAgICAgICAgIC8vIChDYXNlIDIpCisgICAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgIC8vIEJld2FyZSBvZiBjYWxsaW5nIGltbWVkaWF0ZWx5IGFnYWluIGFzIHRoaXMgbWF5IGJ1c3ktbG9vcCBpZiB5b3UgYXJlIG5vdCBjYXJlZnVsLgorICAgICAgICAgICAgQUxPR1coIkF1ZGlvU2luayB3cml0ZSBzaG9ydCBmcmFtZSBjb3VudCAlemQgPCAlenUiLCB3cml0dGVuLCBjb3B5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1BbmNob3JNYXhNZWRpYVVzID0KKyAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsKKyAgICAgICAgICAgICAgICAoaW50NjRfdCkobWF4KChsb25nIGxvbmcpbU51bUZyYW1lc1dyaXR0ZW4gLSBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiwgMExMKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkpOwogCiAgICAgcmV0dXJuICFtQXVkaW9RdWV1ZS5lbXB0eSgpOwogfQogCitpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgeworICAgIGludDY0X3Qgd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyA9CisgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpOworICAgIHJldHVybiB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKG5vd1VzKTsKK30KKworaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFJlYWxUaW1lVXMoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcykgeworICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CisgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMsIG5vd1VzLCB0cnVlIC8qIGFsbG93UGFzdFF1ZXVlZFZpZGVvICovKSAhPSBPSykgeworICAgICAgICAvLyBJZiBmYWlsZWQgdG8gZ2V0IGN1cnJlbnQgcG9zaXRpb24sIGUuZy4gZHVlIHRvIGF1ZGlvIGNsb2NrIGlzIG5vdCByZWFkeSwgdGhlbiBqdXN0CisgICAgICAgIC8vIHBsYXkgb3V0IHZpZGVvIGltbWVkaWF0ZWx5IHdpdGhvdXQgZGVsYXkuCisgICAgICAgIHJldHVybiBub3dVczsKKyAgICB9CisgICAgcmV0dXJuIChtZWRpYVRpbWVVcyAtIGN1cnJlbnRQb3NpdGlvblVzKSArIG5vd1VzOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25OZXdBdWRpb01lZGlhVGltZShpbnQ2NF90IG1lZGlhVGltZVVzKSB7CisgICAgLy8gVFJJQ0tZOiB2b3JiaXMgZGVjb2RlciBnZW5lcmF0ZXMgbXVsdGlwbGUgZnJhbWVzIHdpdGggdGhlIHNhbWUKKyAgICAvLyB0aW1lc3RhbXAsIHNvIG9ubHkgdXBkYXRlIG9uIHRoZSBmaXJzdCBmcmFtZSB3aXRoIGEgZ2l2ZW4gdGltZXN0YW1wCisgICAgaWYgKG1lZGlhVGltZVVzID09IG1BbmNob3JUaW1lTWVkaWFVcykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWQobWVkaWFUaW1lVXMpOworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIHNldEFuY2hvclRpbWUoCisgICAgICAgICAgICBtZWRpYVRpbWVVcywgbm93VXMgKyBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25Vcyhub3dVcyksIG1OdW1GcmFtZXNXcml0dGVuKTsKK30KKwogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBvc3REcmFpblZpZGVvUXVldWUoKSB7Ci0gICAgaWYgKG1EcmFpblZpZGVvUXVldWVQZW5kaW5nIHx8IG1TeW5jUXVldWVzIHx8IG1QYXVzZWQpIHsKKyAgICBpZiAobURyYWluVmlkZW9RdWV1ZVBlbmRpbmcKKyAgICAgICAgICAgIHx8IG1TeW5jUXVldWVzCisgICAgICAgICAgICB8fCAobVBhdXNlZCAmJiBtVmlkZW9TYW1wbGVSZWNlaXZlZCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzUwLDM2ICs3MzcsNjcgQEAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RHJhaW5WaWRlb1F1ZXVlLCBpZCgpKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvUXVldWVHZW5lcmF0aW9uKTsKIAotICAgIGludDY0X3QgZGVsYXlVczsKLQogICAgIGlmIChlbnRyeS5tQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gRU9TIGRvZXNuJ3QgY2FycnkgYSB0aW1lc3RhbXAuCi0gICAgICAgIGRlbGF5VXMgPSAwOwotICAgIH0gZWxzZSBpZiAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpIHsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgZGVsYXlVczsKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHJlYWxUaW1lVXM7CisgICAgaWYgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKSB7CiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLQotICAgICAgICBkZWxheVVzID0gbWVkaWFUaW1lVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICByZWFsVGltZVVzID0gbWVkaWFUaW1lVXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgQ0hFQ0soZW50cnkubUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwogCiAgICAgICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7Ci0gICAgICAgICAgICBkZWxheVVzID0gMDsKLQotICAgICAgICAgICAgaWYgKCFtSGFzQXVkaW8pIHsKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRBbmNob3JUaW1lKG1lZGlhVGltZVVzLCBub3dVcyk7CisgICAgICAgICAgICByZWFsVGltZVVzID0gbm93VXM7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHJlYWxUaW1lVXMgPQotICAgICAgICAgICAgICAgIChtZWRpYVRpbWVVcyAtIG1BbmNob3JUaW1lTWVkaWFVcykgKyBtQW5jaG9yVGltZVJlYWxVczsKKyAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBnZXRSZWFsVGltZVVzKG1lZGlhVGltZVVzLCBub3dVcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtSGFzQXVkaW8pIHsKKyAgICAgICAgICAgIG1BbmNob3JNYXhNZWRpYVVzID0gbWVkaWFUaW1lVXMgKyAxMDAwMDA7IC8vIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzCisgICAgICAgIH0KIAotICAgICAgICAgICAgZGVsYXlVcyA9IHJlYWxUaW1lVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICAvLyBIZXVyaXN0aWNzIHRvIGhhbmRsZSBzaXR1YXRpb24gd2hlbiBtZWRpYSB0aW1lIGNoYW5nZWQgd2l0aG91dCBhCisgICAgICAgIC8vIGRpc2NvbnRpbnVpdHkuIElmIHdlIGhhdmUgbm90IGRyYWluZWQgYW4gYXVkaW8gYnVmZmVyIHRoYXQgd2FzCisgICAgICAgIC8vIHJlY2VpdmVkIGFmdGVyIHRoaXMgYnVmZmVyLCByZXBvc3QgaW4gMTAgbXNlYy4gT3RoZXJ3aXNlIHJlcG9zdAorICAgICAgICAvLyBpbiA1MDAgbXNlYy4KKyAgICAgICAgZGVsYXlVcyA9IHJlYWxUaW1lVXMgLSBub3dVczsKKyAgICAgICAgaWYgKGRlbGF5VXMgPiA1MDAwMDApIHsKKyAgICAgICAgICAgIGludDY0X3QgcG9zdERlbGF5VXMgPSA1MDAwMDA7CisgICAgICAgICAgICBpZiAobUhhc0F1ZGlvICYmIChtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCAtIGVudHJ5Lm1CdWZmZXJPcmRpbmFsKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgcG9zdERlbGF5VXMgPSAxMDAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0V2hhdChrV2hhdFBvc3REcmFpblZpZGVvUXVldWUpOworICAgICAgICAgICAgbXNnLT5wb3N0KHBvc3REZWxheVVzKTsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+cmVzdGFydCgpOworICAgICAgICAgICAgQUxPR0koInBvc3NpYmxlIHZpZGVvIHRpbWUganVtcCBvZiAlZG1zLCByZXRyeWluZyBpbiAlZG1zIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCkoZGVsYXlVcyAvIDEwMDApLCAoaW50KShwb3N0RGVsYXlVcyAvIDEwMDApKTsKKyAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1zZy0+cG9zdChkZWxheVVzKTsKKyAgICByZWFsVGltZVVzID0gbVZpZGVvU2NoZWR1bGVyLT5zY2hlZHVsZShyZWFsVGltZVVzICogMTAwMCkgLyAxMDAwOworICAgIGludDY0X3QgdHdvVnN5bmNzVXMgPSAyICogKG1WaWRlb1NjaGVkdWxlci0+Z2V0VnN5bmNQZXJpb2QoKSAvIDEwMDApOworCisgICAgZGVsYXlVcyA9IHJlYWxUaW1lVXMgLSBub3dVczsKKworICAgIEFMT0dXX0lGKGRlbGF5VXMgPiA1MDAwMDAsICJ1bnVzdWFsbHkgaGlnaCBkZWxheVVzOiAlIiBQUklkNjQsIGRlbGF5VXMpOworICAgIC8vIHBvc3QgMiBkaXNwbGF5IHJlZnJlc2hlcyBiZWZvcmUgcmVuZGVyaW5nIGlzIGR1ZQorICAgIC8vIEZJWE1FIGN1cnJlbnRseSB0aGlzIGluY3JlYXNlcyBwb3dlciBjb25zdW1wdGlvbiwgc28gdW5sZXNzIGZyYW1lLWFjY3VyYXRlCisgICAgLy8gQVYgc3luYyBpcyByZXF1ZXN0ZWQsIHBvc3QgY2xvc2VyIHRvIHJlcXVpcmVkIHJlbmRlciB0aW1lIChhdCAwLjYzIHZzeW5jcykKKyAgICBpZiAoIXNGcmFtZUFjY3VyYXRlQVZzeW5jKSB7CisgICAgICAgIHR3b1ZzeW5jc1VzID4+PSA0OworICAgIH0KKyAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IHR3b1ZzeW5jc1VzID8gZGVsYXlVcyAtIHR3b1ZzeW5jc1VzIDogMCk7CiAKICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7CiB9CkBAIC0zOTksMTIgKzgxNywxMSBAQAogICAgICAgICBtVmlkZW9RdWV1ZS5lcmFzZShtVmlkZW9RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgZW50cnkgPSBOVUxMOwogCi0gICAgICAgIG1WaWRlb0xhdGVCeVVzID0gMGxsOwotCi0gICAgICAgIG5vdGlmeVBvc2l0aW9uKCk7CisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBpbnQ2NF90IG5vd1VzID0gLTE7CiAgICAgaW50NjRfdCByZWFsVGltZVVzOwogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgewogICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZyZWFsVGltZVVzKSk7CkBAIC00MTIsMzcgKzgyOSw1MSBAQAogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwogCi0gICAgICAgIHJlYWxUaW1lVXMgPSBtZWRpYVRpbWVVcyAtIG1BbmNob3JUaW1lTWVkaWFVcyArIG1BbmNob3JUaW1lUmVhbFVzOworICAgICAgICBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIHJlYWxUaW1lVXMgPSBnZXRSZWFsVGltZVVzKG1lZGlhVGltZVVzLCBub3dVcyk7CiAgICAgfQogCi0gICAgbVZpZGVvTGF0ZUJ5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gcmVhbFRpbWVVczsKLSAgICBib29sIHRvb0xhdGUgPSAobVZpZGVvTGF0ZUJ5VXMgPiA0MDAwMCk7CisgICAgYm9vbCB0b29MYXRlID0gZmFsc2U7CiAKLSAgICBpZiAodG9vTGF0ZSkgewotICAgICAgICBBTE9HVigidmlkZW8gbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICBtVmlkZW9MYXRlQnlVcywgbVZpZGVvTGF0ZUJ5VXMgLyAxRTYpOworICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICBpZiAobm93VXMgPT0gLTEpIHsKKyAgICAgICAgICAgIG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKG5vd1VzIC0gcmVhbFRpbWVVcyk7CisgICAgICAgIHRvb0xhdGUgPSAobVZpZGVvTGF0ZUJ5VXMgPiA0MDAwMCk7CisKKyAgICAgICAgaWYgKHRvb0xhdGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgICBtVmlkZW9MYXRlQnlVcywgbVZpZGVvTGF0ZUJ5VXMgLyAxRTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyB2aWRlbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCisgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSA/IHJlYWxUaW1lVXMgOgorICAgICAgICAgICAgICAgICAgICAocmVhbFRpbWVVcyArIG1BbmNob3JUaW1lTWVkaWFVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSkgLyAxRTYpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoInJlbmRlcmluZyB2aWRlbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCi0gICAgICAgICAgICAgICAgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FID8gcmVhbFRpbWVVcyA6Ci0gICAgICAgICAgICAgICAgKHJlYWxUaW1lVXMgKyBtQW5jaG9yVGltZU1lZGlhVXMgLSBtQW5jaG9yVGltZVJlYWxVcykpIC8gMUU2KTsKLSAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVNvZnRSZW5kZXJlci0+cmVuZGVyKGVudHJ5LT5tQnVmZmVyLT5kYXRhKCksIGVudHJ5LT5tQnVmZmVyLT5zaXplKCksIE5VTEwpOworICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKDApOworICAgICAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkICYmICFtSGFzQXVkaW8pIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgYSBmbHVzaCB3b24ndCBiZSB1c2VkIGFzIGFuY2hvcgorICAgICAgICAgICAgLy8gd2hlbiByZW5kZXJlciBpcyBpbiBwYXVzZWQgc3RhdGUsIGJlY2F1c2UgcmVzdW1lIGNhbiBoYXBwZW4gYW55IHRpbWUgYWZ0ZXIgc2Vlay4KKyAgICAgICAgICAgIHNldEFuY2hvclRpbWUoLTEsIC0xKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHJlYWxUaW1lVXMgKiAxMDAwbGwpOwogICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDMyKCJyZW5kZXIiLCAhdG9vTGF0ZSk7CiAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwogICAgIG1WaWRlb1F1ZXVlLmVyYXNlKG1WaWRlb1F1ZXVlLmJlZ2luKCkpOwogICAgIGVudHJ5ID0gTlVMTDsKIAotICAgIGlmICghbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCkgewotICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgbm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpOworICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkID0gdHJ1ZTsKKworICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICBpZiAoIW1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpOworICAgICAgICB9CisgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkKCk7CiAgICAgfQotCi0gICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKLQotICAgIG5vdGlmeVBvc2l0aW9uKCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCkgewpAQCAtNDUxLDIyICs4ODIsMjkgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCkgewordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOwotICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG5vdGlmeS0+cG9zdChkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUF1ZGlvT2ZmbG9hZFRlYXJEb3duKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb09mZmxvYWRUZWFyRG93biwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblF1ZXVlQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBhdWRpbzsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKIAotICAgIGlmIChhdWRpbykgewotICAgICAgICBtSGFzQXVkaW8gPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1IYXNWaWRlbyA9IHRydWU7CisgICAgc2V0SGFzTWVkaWEoYXVkaW8pOworCisgICAgaWYgKG1IYXNWaWRlbykgeworICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChkcm9wQnVmZmVyV2hpbGVGbHVzaGluZyhhdWRpbywgbXNnKSkgewpAQCAtNDg0LDE1ICs5MjIsMTggQEAKICAgICBlbnRyeS5tTm90aWZ5Q29uc3VtZWQgPSBub3RpZnlDb25zdW1lZDsKICAgICBlbnRyeS5tT2Zmc2V0ID0gMDsKICAgICBlbnRyeS5tRmluYWxSZXN1bHQgPSBPSzsKKyAgICBlbnRyeS5tQnVmZmVyT3JkaW5hbCA9ICsrbVRvdGFsQnVmZmVyc1F1ZXVlZDsKIAogICAgIGlmIChhdWRpbykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwotICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlKCk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1WaWRlb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CiAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKICAgICB9CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN5bmNRdWV1ZXMgfHwgbUF1ZGlvUXVldWUuZW1wdHkoKSB8fCBtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MDIsNyArOTQzLDcgQEAKIAogICAgIGlmIChmaXJzdEF1ZGlvQnVmZmVyID09IE5VTEwgfHwgZmlyc3RWaWRlb0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIEVPUyBzaWduYWxsZWQgb24gZWl0aGVyIHF1ZXVlLgotICAgICAgICBzeW5jUXVldWVzRG9uZSgpOworICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTUyNiwxMCArOTY3LDEwIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzeW5jUXVldWVzRG9uZSgpOworICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnN5bmNRdWV1ZXNEb25lKCkgewordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnN5bmNRdWV1ZXNEb25lX2woKSB7CiAgICAgaWYgKCFtU3luY1F1ZXVlcykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTM3LDcgKzk3OCw3IEBACiAgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKIAogICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgewotICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlKCk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwogICAgIH0KIAogICAgIGlmICghbVZpZGVvUXVldWUuZW1wdHkoKSkgewpAQCAtNTYxLDE0ICsxMDAyLDE2IEBACiAgICAgZW50cnkubUZpbmFsUmVzdWx0ID0gZmluYWxSZXN1bHQ7CiAKICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKG1BdWRpb1F1ZXVlLmVtcHR5KCkgJiYgbVN5bmNRdWV1ZXMpIHsKLSAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiAgICAgICAgIH0KICAgICAgICAgbUF1ZGlvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZSgpOworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAobVZpZGVvUXVldWUuZW1wdHkoKSAmJiBtU3luY1F1ZXVlcykgewotICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiAgICAgICAgIH0KICAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwpAQCAtNTc5LDYgKzEwMjIsMTUgQEAKICAgICBpbnQzMl90IGF1ZGlvOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUZsdXNoTG9jayk7CisgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgc3luY2luZyB0aGUgcXVldWVzLCBpLmUuIGRyb3BwaW5nIGF1ZGlvIHdoaWxlCiAgICAgLy8gYWxpZ25pbmcgdGhlIGZpcnN0IGF1ZGlvL3ZpZGVvIGJ1ZmZlciB0aW1lcyBhbmQgb25seSBvbmUgb2YgdGhlCiAgICAgLy8gdHdvIHF1ZXVlcyBoYXMgZGF0YSwgd2UgbWF5IHN0YXJ2ZSB0aGF0IHF1ZXVlIGJ5IG5vdCByZXF1ZXN0aW5nCkBAIC01ODcsMzEgKzEwMzksNDcgQEAKICAgICAvLyBjb3JyZXNwb25kaW5nIGRpc2NvbnRpbnVpdHkgb24gdGhlIG90aGVyIHF1ZXVlLgogICAgIC8vIFRoZXJlZm9yZSB3ZSdsbCBzdG9wIHN5bmNpbmcgdGhlIHF1ZXVlcyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbQogICAgIC8vIGlzIGZsdXNoZWQuCi0gICAgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICB7CisgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOworICAgICAgICAgc2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcygtMSk7CisgICAgfQogCiAgICAgQUxPR1YoImZsdXNoaW5nICVzIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIGZsdXNoUXVldWUoJm1BdWRpb1F1ZXVlKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGZsdXNoUXVldWUoJm1BdWRpb1F1ZXVlKTsKIAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUZsdXNoTG9jayk7Ci0gICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gZmFsc2U7CisgICAgICAgICAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CisKKyAgICAgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwogCi0gICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CisgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOwogCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKLSAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBmYWxzZTsKLQogICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwogICAgICAgICArK21WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKIAorICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+cmVzdGFydCgpOworICAgICAgICB9CisKICAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKICAgICB9CiAKKyAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZCA9IGZhbHNlOwogICAgIG5vdGlmeUZsdXNoQ29tcGxldGUoYXVkaW8pOwogfQogCkBAIC02NjEsNzAgKzExMjksNzMgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uQXVkaW9TaW5rQ2hhbmdlZCgpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBDSEVDSyghbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcpOwogICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IC0xOwogICAgIHVpbnQzMl90IHdyaXR0ZW47CiAgICAgaWYgKG1BdWRpb1NpbmstPmdldEZyYW1lc1dyaXR0ZW4oJndyaXR0ZW4pID09IE9LKSB7CiAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gd3JpdHRlbjsKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlQb3NpdGlvbigpIHsKLSAgICBpZiAobUFuY2hvclRpbWVSZWFsVXMgPCAwIHx8IG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgaWYgKG1MYXN0UG9zaXRpb25VcGRhdGVVcyA+PSAwCi0gICAgICAgICAgICAmJiBub3dVcyA8IG1MYXN0UG9zaXRpb25VcGRhdGVVcyArIGtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtTGFzdFBvc2l0aW9uVXBkYXRlVXMgPSBub3dVczsKLQotICAgIGludDY0X3QgcG9zaXRpb25VcyA9IChub3dVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSArIG1BbmNob3JUaW1lTWVkaWFVczsKLQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQb3NpdGlvbik7Ci0gICAgbm90aWZ5LT5zZXRJbnQ2NCgicG9zaXRpb25VcyIsIHBvc2l0aW9uVXMpOwotICAgIG5vdGlmeS0+c2V0SW50NjQoInZpZGVvTGF0ZUJ5VXMiLCBtVmlkZW9MYXRlQnlVcyk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUZsYWdzICY9IH5GTEFHX09GRkxPQURfQVVESU87CisgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblBhdXNlKCkgewotICAgIENIRUNLKCFtUGF1c2VkKTsKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICBBTE9HVygiUmVuZGVyZXI6Om9uUGF1c2UoKSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBwYXVzZWQhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CisgICAgICAgIG1QYXVzZWQgPSB0cnVlOworICAgICAgICBzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgIH0KIAogICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247Ci0KICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOwotCi0gICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKIAogICAgIGlmIChtSGFzQXVkaW8pIHsKICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICAgICAgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKICAgICB9CiAKICAgICBBTE9HVigibm93IHBhdXNlZCBhdWRpbyBxdWV1ZSBoYXMgJWQgZW50cmllcywgdmlkZW8gaGFzICVkIGVudHJpZXMiLAogICAgICAgICAgIG1BdWRpb1F1ZXVlLnNpemUoKSwgbVZpZGVvUXVldWUuc2l6ZSgpKTsKLQotICAgIG1QYXVzZWQgPSB0cnVlOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25SZXN1bWUoKSB7CisgICAgcmVhZFByb3BlcnRpZXMoKTsKKwogICAgIGlmICghbVBhdXNlZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYgKG1IYXNBdWRpbykgeworICAgICAgICBjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKICAgICB9CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBpZiAobVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgIT0gLTEpIHsKKyAgICAgICAgaW50NjRfdCBuZXdBbmNob3JSZWFsVXMgPQorICAgICAgICAgICAgbUFuY2hvclRpbWVSZWFsVXMgKyBBTG9vcGVyOjpHZXROb3dVcygpIC0gbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXM7CisgICAgICAgIHNldEFuY2hvclRpbWUoCisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzLCBuZXdBbmNob3JSZWFsVXMsIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuLCB0cnVlIC8qIHJlc3VtZSAqLyk7CisgICAgfQogCiAgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoKTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfQogCiAgICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CkBAIC03MzIsNSArMTIwMywyNDIgQEAKICAgICB9CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcykgeworICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgeworICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgIH0KKyAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoZnBzKTsKK30KKworLy8gVE9ETzogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcygpCisvLyBhcyBpdCBhY3F1aXJlcyBsb2NrcyBhbmQgbWF5IHF1ZXJ5IHRoZSBhdWRpbyBkcml2ZXIuCisvLworLy8gU29tZSBjYWxscyBjb3VsZCBjb25jZWl2YWJseSByZXRyaWV2ZSBleHRyYXBvbGF0ZWQgZGF0YSBpbnN0ZWFkIG9mCisvLyBhY2Nlc3NpbmcgZ2V0VGltZXN0YW1wKCkgb3IgZ2V0UG9zaXRpb24oKSBldmVyeSB0aW1lIGEgZGF0YSBidWZmZXIgd2l0aAorLy8gYSBtZWRpYSB0aW1lIGlzIHJlY2VpdmVkLgorLy8KK2ludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgeworICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKKyAgICBpbnQ2NF90IG51bUZyYW1lc1BsYXllZEF0OworICAgIEF1ZGlvVGltZXN0YW1wIHRzOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTdGFsZVRpbWVzdGFtcDEwMG1zID0gMTAwMDAwOworCisgICAgc3RhdHVzX3QgcmVzID0gbUF1ZGlvU2luay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICBpZiAocmVzID09IE9LKSB7ICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IG1peGluZyBhdWRpbyB0cmFja3MgYW5kIG9mZmxvYWRlZCB0cmFja3MuCisgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IHRzLm1Qb3NpdGlvbjsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPQorICAgICAgICAgICAgdHMubVRpbWUudHZfc2VjICogMTAwMDAwMExMICsgdHMubVRpbWUudHZfbnNlYyAvIDEwMDA7CisgICAgICAgIGNvbnN0IGludDY0X3QgdGltZXN0YW1wQWdlID0gbm93VXMgLSBudW1GcmFtZXNQbGF5ZWRBdDsKKyAgICAgICAgaWYgKHRpbWVzdGFtcEFnZSA+IGtTdGFsZVRpbWVzdGFtcDEwMG1zKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGF1ZGlvIEZJWE1FLgorICAgICAgICAgICAgLy8gZ2V0VGltZXN0YW1wIHJldHVybnMgYSB0aW1lc3RhbXAgd2hpY2ggbWF5IGNvbWUgZnJvbSBhdWRpbyBtaXhpbmcgdGhyZWFkcy4KKyAgICAgICAgICAgIC8vIEFmdGVyIHBhdXNpbmcsIHRoZSBNaXhlclRocmVhZCBtYXkgZ28gaWRsZSwgdGh1cyB0aGUgbVRpbWUgZXN0aW1hdGUgbWF5CisgICAgICAgICAgICAvLyBiZWNvbWUgc3RhbGUuIEFzc3VtaW5nIHRoYXQgdGhlIE1peGVyVGhyZWFkIHJ1bnMgMjBtcywgd2l0aCBGYXN0TWl4ZXIgYXQgNW1zLAorICAgICAgICAgICAgLy8gdGhlIG1heCBsYXRlbmN5IHNob3VsZCBiZSBhYm91dCAyNW1zIHdpdGggYW4gYXZlcmFnZSBhcm91bmQgMTJtcyAodG8gYmUgdmVyaWZpZWQpLgorICAgICAgICAgICAgLy8gRm9yIHNhZmV0eSB3ZSB1c2UgMTAwbXMuCisgICAgICAgICAgICBBTE9HVigiZ2V0VGltZXN0YW1wOiByZXR1cm5lZCBzdGFsZSB0aW1lc3RhbXAgbm93VXMoJWxsZCkgbnVtRnJhbWVzUGxheWVkQXQoJWxsZCkiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW5vd1VzLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0gbm93VXMgLSBrU3RhbGVUaW1lc3RhbXAxMDBtczsKKyAgICAgICAgfQorICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IE9LICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0gZWxzZSBpZiAocmVzID09IFdPVUxEX0JMT0NLKSB7IC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSAwOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzOworICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IFdPVUxEX0JMT0NLICVkICVsbGQiLAorICAgICAgICAvLyAgICAgICAgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgorICAgICAgICByZXMgPSBtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKTsKKyAgICAgICAgQ0hFQ0tfRVEocmVzLCAoc3RhdHVzX3QpT0spOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCArPSAxMDAwTEwgKiBtQXVkaW9TaW5rLT5sYXRlbmN5KCkgLyAyOyAvKiBYWFggKi8KKyAgICAgICAgLy9BTE9HRCgiZ2V0UG9zaXRpb246ICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIG51bUZyYW1lc1BsYXllZEF0KTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhlIChpbnQzMl90KSBjYXN0aW5nIGJlbG93IGFzIGl0IG1heSBvdmVyZmxvdyBhdCAxMi40IGhvdXJzLgorICAgIC8vQ0hFQ0tfRVEobnVtRnJhbWVzUGxheWVkICYgKDEgPDwgMzEpLCAwKTsgIC8vIGNhbid0IGJlIG5lZ2F0aXZlIHVudGlsIDEyLjQgaHJzLCB0ZXN0CisgICAgaW50NjRfdCBkdXJhdGlvblVzID0gKGludDY0X3QpKChpbnQzMl90KW51bUZyYW1lc1BsYXllZCAqIDEwMDBMTCAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKSkKKyAgICAgICAgICAgICsgbm93VXMgLSBudW1GcmFtZXNQbGF5ZWRBdDsKKyAgICBpZiAoZHVyYXRpb25VcyA8IDApIHsKKyAgICAgICAgLy8gT2NjdXJzIHdoZW4gbnVtRnJhbWVzUGxheWVkIHBvc2l0aW9uIGlzIHZlcnkgc21hbGwgYW5kIHRoZSBmb2xsb3dpbmc6CisgICAgICAgIC8vICgxKSBJbiBjYXNlIDEsIHRoZSB0aW1lIG5vd1VzIGlzIGNvbXB1dGVkIGJlZm9yZSBnZXRUaW1lc3RhbXAoKSBpcyBjYWxsZWQgYW5kCisgICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWRBdCBpcyBncmVhdGVyIHRoYW4gbm93VXMgYnkgdGltZSBtb3JlIHRoYW4gbnVtRnJhbWVzUGxheWVkLgorICAgICAgICAvLyAoMikgSW4gY2FzZSAzLCB1c2luZyBnZXRQb3NpdGlvbiBhbmQgYWRkaW5nIG1BdWRpb1NpbmstPmxhdGVuY3koKSB0bworICAgICAgICAvLyAgICAgbnVtRnJhbWVzUGxheWVkQXQsIGJ5IGEgdGltZSBhbW91bnQgZ3JlYXRlciB0aGFuIG51bUZyYW1lc1BsYXllZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQm90aCBvZiB0aGVzZSBhcmUgdHJhbnNpdG9yeSBjb25kaXRpb25zLgorICAgICAgICBBTE9HVigiZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzOiBuZWdhdGl2ZSBkdXJhdGlvbiAlbGxkIHNldCB0byB6ZXJvIiwgKGxvbmcgbG9uZylkdXJhdGlvblVzKTsKKyAgICAgICAgZHVyYXRpb25VcyA9IDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoJWxsZCkgbm93VXMoJWxsZCkgZnJhbWVzKCV1KSBmcmFtZXNBdCglbGxkKSIsCisgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uVXMsIChsb25nIGxvbmcpbm93VXMsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgcmV0dXJuIGR1cmF0aW9uVXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkF1ZGlvT2ZmbG9hZFRlYXJEb3duKEF1ZGlvT2ZmbG9hZFRlYXJEb3duUmVhc29uIHJlYXNvbikgeworICAgIGlmIChtQXVkaW9PZmZsb2FkVG9ybkRvd24pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQXVkaW9PZmZsb2FkVG9ybkRvd24gPSB0cnVlOworCisgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKKyAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgIT0gT0spIHsKKyAgICAgICAgY3VycmVudFBvc2l0aW9uVXMgPSAwOworICAgIH0KKworICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duKTsKKyAgICBub3RpZnktPnNldEludDY0KCJwb3NpdGlvblVzIiwgY3VycmVudFBvc2l0aW9uVXMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdChrT2ZmbG9hZFBhdXNlTWF4VXMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OmNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgKyttQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbjsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbk9wZW5BdWRpb1NpbmsoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkT25seSglZCkgb2ZmbG9hZGluZ0F1ZGlvKCVkKSIsCisgICAgICAgICAgICBvZmZsb2FkT25seSwgb2ZmbG9hZGluZ0F1ZGlvKCkpOworICAgIGJvb2wgYXVkaW9TaW5rQ2hhbmdlZCA9IGZhbHNlOworCisgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykpOworCisgICAgaW50MzJfdCBjaGFubmVsTWFzazsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2spKSB7CisgICAgICAgIC8vIHNpZ25hbCB0byB0aGUgQXVkaW9TaW5rIHRvIGRlcml2ZSB0aGUgbWFzayBmcm9tIGNvdW50LgorICAgICAgICBjaGFubmVsTWFzayA9IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUjsKKyAgICB9CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKKworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZG4ndCBtYXAgbWltZSBcIiVzXCIgdG8gYSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICJhdWRpb19mb3JtYXQiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiTWltZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpLCBhdWRpb0Zvcm1hdCk7CisKKyAgICAgICAgICAgIGludCBhdmdCaXRSYXRlID0gLTE7CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiYml0LXJhdGUiLCAmYXZnQml0UmF0ZSk7CisKKyAgICAgICAgICAgIGludDMyX3QgYWFjUHJvZmlsZSA9IC0xOworICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUMKKyAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImFhYy1wcm9maWxlIiwgJmFhY1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVkZWZpbmUgQUFDIGZvcm1hdCBhcyBwZXIgYWFjIHByb2ZpbGUKKyAgICAgICAgICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJvZmlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzID0gLTE7CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uVXMiLCAmb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMpOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQgPSBhdWRpb0Zvcm1hdDsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uYml0X3JhdGUgPSBhdmdCaXRSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvID0gaGFzVmlkZW87CisgICAgICAgICAgICBvZmZsb2FkSW5mby5pc19zdHJlYW1pbmcgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobWVtY21wKCZtQ3VycmVudE9mZmxvYWRJbmZvLCAmb2ZmbG9hZEluZm8sIHNpemVvZihvZmZsb2FkSW5mbykpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogbm8gY2hhbmdlIGluIG9mZmxvYWQgbW9kZSIpOworICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBmcm9tIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24sIGV2ZXJ5dGhpbmcgb2suCisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZmxvYWRpbmdBdWRpbygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IHRyeSB0byBvcGVuIEF1ZGlvU2luayBpbiBvZmZsb2FkIG1vZGUiKTsKKyAgICAgICAgICAgIGZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgICAgICAgICBmbGFncyAmPSB+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgOCAvKiBidWZmZXJDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncywKKyAgICAgICAgICAgICAgICAgICAgJm9mZmxvYWRJbmZvKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwbGF5YmFjayBpcyBvZmZsb2FkZWQgdG8gaC93LCB3ZSBwYXNzCisgICAgICAgICAgICAgICAgLy8gdGhlIEhBTCBzb21lIG1ldGFkYXRhIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IgUENNIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGdvaW5nIHRocm91Z2ggdGhlIEF1ZGlvRmxpbmdlciBtaXhlcgorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFjaGluZyB0aGUgaGFyZHdhcmUuCisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBvZmZsb2FkSW5mbzsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgICAgIEFMT0dWX0lGKGVyciA9PSBPSywgIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgc3VjY2VlZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAsIGZhbGwgYmFjayB0byBub24gb2ZmbG9hZCBtb2RlLgorICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFvZmZsb2FkT25seSAmJiAhb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgZmxhZ3MgJj0gfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvcGVuIEF1ZGlvU2luayBpbiBOT04tb2ZmbG9hZCBtb2RlIik7CisKKyAgICAgICAgYXVkaW9TaW5rQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5vcGVuKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgOCAvKiBidWZmZXJDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzKSwKKyAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICB9CisgICAgaWYgKGF1ZGlvU2lua0NoYW5nZWQpIHsKKyAgICAgICAgb25BdWRpb1NpbmtDaGFuZ2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZmxvYWRpbmdBdWRpbygpOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25DbG9zZUF1ZGlvU2luaygpIHsKKyAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCA5MTI0ZTAzLi43YjQ2YTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTIzLDE2ICsyMywyMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLWNsYXNzIFNvZnR3YXJlUmVuZGVyZXI7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKIAogc3RydWN0IE51UGxheWVyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CiAgICAgICAgIEZMQUdfUkVBTF9USU1FID0gMSwKKyAgICAgICAgRkxBR19PRkZMT0FEX0FVRElPID0gMiwKICAgICB9OwogICAgIFJlbmRlcmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwogCisgICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKKyAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICphdWRpb1NpbmssCisgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqbWUsCisgICAgICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCk7CisKICAgICB2b2lkIHF1ZXVlQnVmZmVyKAogICAgICAgICAgICAgYm9vbCBhdWRpbywKICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsCkBAIC00NiwxOCArNTIsNDcgQEAKIAogICAgIHZvaWQgc2lnbmFsQXVkaW9TaW5rQ2hhbmdlZCgpOwogCisgICAgdm9pZCBzaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisKICAgICB2b2lkIHBhdXNlKCk7CiAgICAgdm9pZCByZXN1bWUoKTsKIAorICAgIHZvaWQgc2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKKworICAgIC8vIEZvbGxvd2luZyBzZXR0ZXJzIGFuZCBnZXR0ZXJzIGFyZSBwcm90ZWN0ZWQgYnkgbVRpbWVMb2NrLgorICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oCisgICAgICAgICAgICBpbnQ2NF90ICptZWRpYVVzLCBpbnQ2NF90IG5vd1VzLCBib29sIGFsbG93UGFzdFF1ZXVlZFZpZGVvID0gZmFsc2UpOworICAgIHZvaWQgc2V0SGFzTWVkaWEoYm9vbCBhdWRpbyk7CisgICAgdm9pZCBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZShpbnQ2NF90IG1lZGlhVXMpOworICAgIHZvaWQgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChpbnQ2NF90IG1lZGlhVXMpOworICAgIHZvaWQgc2V0QW5jaG9yVGltZSgKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFVcywgaW50NjRfdCByZWFsVXMsIGludDY0X3QgbnVtRnJhbWVzV3JpdHRlbiA9IC0xLCBib29sIHJlc3VtZSA9IGZhbHNlKTsKKyAgICB2b2lkIHNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpOworICAgIGludDY0X3QgZ2V0VmlkZW9MYXRlQnlVcygpOworICAgIHZvaWQgc2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcyhpbnQ2NF90IHJlYWxVcyk7CisKKyAgICBib29sIG9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgY2xvc2VBdWRpb1NpbmsoKTsKKwogICAgIGVudW0gewogICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCiAgICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZSAgICAgICA9ICdmbHVDJywKICAgICAgICAga1doYXRQb3NpdGlvbiAgICAgICAgICAgID0gJ3Bvc2knLAogICAgICAgICBrV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQgPSAndmRyZCcsCiAgICAgICAgIGtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCA9ICdtZHJkJywKKyAgICAgICAga1doYXRBdWRpb09mZmxvYWRUZWFyRG93biA9ICdhT1REJywKKyAgICAgICAga1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQgPSAnYU9QVCcsCiAgICAgfTsKIAotICAgIHZvaWQgc2V0U29mdFJlbmRlcmVyKFNvZnR3YXJlUmVuZGVyZXIgKnNvZnRSZW5kZXJlcik7CisgICAgZW51bSBBdWRpb09mZmxvYWRUZWFyRG93blJlYXNvbiB7CisgICAgICAgIGtEdWVUb0Vycm9yID0gMCwKKyAgICAgICAga0R1ZVRvVGltZW91dCwKKyAgICB9OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UmVuZGVyZXIoKTsKQEAgLTY2LDE0ICsxMDEsMjAgQEAKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKLSAgICAgICAga1doYXREcmFpbkF1ZGlvUXVldWUgICAgPSAnZHJhQScsCi0gICAgICAgIGtXaGF0RHJhaW5WaWRlb1F1ZXVlICAgID0gJ2RyYVYnLAotICAgICAgICBrV2hhdFF1ZXVlQnVmZmVyICAgICAgICA9ICdxdWVCJywKLSAgICAgICAga1doYXRRdWV1ZUVPUyAgICAgICAgICAgPSAncUVPUycsCi0gICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgID0gJ2ZsdXMnLAotICAgICAgICBrV2hhdEF1ZGlvU2lua0NoYW5nZWQgICA9ICdhdVNDJywKLSAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgPSAncGF1cycsCi0gICAgICAgIGtXaGF0UmVzdW1lICAgICAgICAgICAgID0gJ3Jlc20nLAorICAgICAgICBrV2hhdERyYWluQXVkaW9RdWV1ZSAgICAgPSAnZHJhQScsCisgICAgICAgIGtXaGF0RHJhaW5WaWRlb1F1ZXVlICAgICA9ICdkcmFWJywKKyAgICAgICAga1doYXRQb3N0RHJhaW5WaWRlb1F1ZXVlID0gJ3BEVlEnLAorICAgICAgICBrV2hhdFF1ZXVlQnVmZmVyICAgICAgICAgPSAncXVlQicsCisgICAgICAgIGtXaGF0UXVldWVFT1MgICAgICAgICAgICA9ICdxRU9TJywKKyAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgID0gJ2ZsdXMnLAorICAgICAgICBrV2hhdEF1ZGlvU2lua0NoYW5nZWQgICAgPSAnYXVTQycsCisgICAgICAgIGtXaGF0UGF1c2UgICAgICAgICAgICAgICA9ICdwYXVzJywKKyAgICAgICAga1doYXRSZXN1bWUgICAgICAgICAgICAgID0gJ3Jlc20nLAorICAgICAgICBrV2hhdE9wZW5BdWRpb1NpbmsgICAgICAgPSAnb3BuQScsCisgICAgICAgIGtXaGF0Q2xvc2VBdWRpb1NpbmsgICAgICA9ICdjbHNBJywKKyAgICAgICAga1doYXRTdG9wQXVkaW9TaW5rICAgICAgID0gJ3N0cEEnLAorICAgICAgICBrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8gPSAnbm9PQScsCisgICAgICAgIGtXaGF0U2V0VmlkZW9GcmFtZVJhdGUgICA9ICdzVkZSJywKICAgICB9OwogCiAgICAgc3RydWN0IFF1ZXVlRW50cnkgewpAQCAtODEsNDQgKzEyMiw3MiBAQAogICAgICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeUNvbnN1bWVkOwogICAgICAgICBzaXplX3QgbU9mZnNldDsKICAgICAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OworICAgICAgICBpbnQzMl90IG1CdWZmZXJPcmRpbmFsOwogICAgIH07CiAKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluUG9zaXRpb25VcGRhdGVEZWxheVVzOwogCiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7Ci0gICAgU29mdHdhcmVSZW5kZXJlciAqbVNvZnRSZW5kZXJlcjsKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBNdXRleCBtTG9jazsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtQXVkaW9RdWV1ZTsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1WaWRlb1F1ZXVlOwogICAgIHVpbnQzMl90IG1OdW1GcmFtZXNXcml0dGVuOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXI+IG1WaWRlb1NjaGVkdWxlcjsKIAogICAgIGJvb2wgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmc7CiAgICAgYm9vbCBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZzsKICAgICBpbnQzMl90IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKIAorICAgIE11dGV4IG1UaW1lTG9jazsKKyAgICAvLyB8bVRpbWVMb2NrfCBwcm90ZWN0cyB0aGUgZm9sbG93aW5nIDcgbWVtYmVyIHZhcnMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aW1lLgorICAgIC8vIE5vdGU6IHRob3NlIG1lbWJlcnMgYXJlIG9ubHkgd3JpdHRlbiBvbiBSZW5kZXJlciB0aHJlYWQsIHNvIHJlYWRpbmcgb24gUmVuZGVyZXIgdGhyZWFkCisgICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHByb3RlY3RlZC4gT3RoZXJ3aXNlIGFjY2Vzc2luZyB0aG9zZSBtZW1iZXJzIG11c3QgYmUgcHJvdGVjdGVkIGJ5CisgICAgLy8gfG1UaW1lTG9ja3wuCisgICAgLy8gVE9ETzogbW92ZSB0aG9zZSBtZW1iZXJzIHRvIGEgc2VwZXJhdGVkIG1lZGlhIGNsb2NrIGNsYXNzLgorICAgIGludDY0X3QgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lTWVkaWFVczsKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lUmVhbFVzOworICAgIGludDY0X3QgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW47CisgICAgaW50NjRfdCBtQW5jaG9yTWF4TWVkaWFVczsKKyAgICBpbnQ2NF90IG1WaWRlb0xhdGVCeVVzOworICAgIGJvb2wgbUhhc0F1ZGlvOworICAgIGJvb2wgbUhhc1ZpZGVvOworICAgIGludDY0X3QgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXM7CiAKICAgICBNdXRleCBtRmx1c2hMb2NrOyAgLy8gcHJvdGVjdHMgdGhlIGZvbGxvd2luZyAyIG1lbWJlciB2YXJzLgogICAgIGJvb2wgbUZsdXNoaW5nQXVkaW87CiAgICAgYm9vbCBtRmx1c2hpbmdWaWRlbzsKIAotICAgIGJvb2wgbUhhc0F1ZGlvOwotICAgIGJvb2wgbUhhc1ZpZGVvOwogICAgIGJvb2wgbVN5bmNRdWV1ZXM7CiAKICAgICBib29sIG1QYXVzZWQ7CisgICAgYm9vbCBtVmlkZW9TYW1wbGVSZWNlaXZlZDsKICAgICBib29sIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQ7CiAgICAgaW50MzJfdCBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247CiAKICAgICBpbnQ2NF90IG1MYXN0UG9zaXRpb25VcGRhdGVVczsKLSAgICBpbnQ2NF90IG1WaWRlb0xhdGVCeVVzOworCisgICAgaW50MzJfdCBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbjsKKyAgICBib29sIG1BdWRpb09mZmxvYWRUb3JuRG93bjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBtQ3VycmVudE9mZmxvYWRJbmZvOworCisgICAgaW50MzJfdCBtVG90YWxCdWZmZXJzUXVldWVkOworICAgIGludDMyX3QgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQ7CisKKworICAgIHNpemVfdCBmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBib29sIG9uRHJhaW5BdWRpb1F1ZXVlKCk7Ci0gICAgdm9pZCBwb3N0RHJhaW5BdWRpb1F1ZXVlKGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIGludDY0X3QgZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcyk7CisgICAgaW50NjRfdCBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoaW50NjRfdCBub3dVcyk7CisgICAgdm9pZCBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woaW50NjRfdCBkZWxheVVzID0gMCk7CisKKyAgICB2b2lkIG9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcyk7CisgICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpOwogCiAgICAgdm9pZCBvbkRyYWluVmlkZW9RdWV1ZSgpOwogICAgIHZvaWQgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwpAQCAtMTMwLDE4ICsxOTksMzMgQEAKICAgICB2b2lkIG9uUXVldWVFT1MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25GbHVzaChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICB2b2lkIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOwogICAgIHZvaWQgb25QYXVzZSgpOwogICAgIHZvaWQgb25SZXN1bWUoKTsKKyAgICB2b2lkIG9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKKyAgICB2b2lkIG9uQXVkaW9PZmZsb2FkVGVhckRvd24oQXVkaW9PZmZsb2FkVGVhckRvd25SZWFzb24gcmVhc29uKTsKKyAgICBib29sIG9uT3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgdm9pZCBvbkNsb3NlQXVkaW9TaW5rKCk7CiAKLSAgICB2b2lkIG5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CisgICAgdm9pZCBub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOwogICAgIHZvaWQgbm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKTsKICAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKCk7CiAgICAgdm9pZCBub3RpZnlWaWRlb0xhdGVCeShpbnQ2NF90IGxhdGVCeVVzKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKKyAgICB2b2lkIG5vdGlmeUF1ZGlvT2ZmbG9hZFRlYXJEb3duKCk7CiAKICAgICB2b2lkIGZsdXNoUXVldWUoTGlzdDxRdWV1ZUVudHJ5PiAqcXVldWUpOwogICAgIGJvb2wgZHJvcEJ1ZmZlcldoaWxlRmx1c2hpbmcoYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICB2b2lkIHN5bmNRdWV1ZXNEb25lX2woKTsKKworICAgIGJvb2wgb2ZmbG9hZGluZ0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEZMQUdfT0ZGTE9BRF9BVURJTykgIT0gMDsgfQorCisgICAgdm9pZCBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOworICAgIHZvaWQgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZW5kZXJlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaAppbmRleCBlNTA1MzNhLi4yZjA2YzMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaApAQCAtMjEsMTEgKzIxLDE1IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgTWV0YURhdGE7CitzdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKIHN0cnVjdCBOdVBsYXllcjo6U291cmNlIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTM0LDE2ICszOCwyMCBAQAogICAgICAgICBGTEFHX0NBTl9TRUVLX0ZPUldBUkQgICA9IDQsICAvLyB0aGUgIjEwIHNlYyBmb3J3YXJkIGJ1dHRvbiIKICAgICAgICAgRkxBR19DQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKICAgICAgICAgRkxBR19EWU5BTUlDX0RVUkFUSU9OICAgPSAxNiwKKyAgICAgICAgRkxBR19TRUNVUkUgICAgICAgICAgICAgPSAzMiwKICAgICB9OwogCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0UHJlcGFyZWQsCiAgICAgICAgIGtXaGF0RmxhZ3NDaGFuZ2VkLAogICAgICAgICBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQsCisgICAgICAgIGtXaGF0QnVmZmVyaW5nVXBkYXRlLAogICAgICAgICBrV2hhdEJ1ZmZlcmluZ1N0YXJ0LAogICAgICAgICBrV2hhdEJ1ZmZlcmluZ0VuZCwKICAgICAgICAga1doYXRTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0VGltZWRUZXh0RGF0YSwKICAgICAgICAga1doYXRRdWV1ZURlY29kZXJTaHV0ZG93biwKKyAgICAgICAga1doYXREcm1Ob0xpY2Vuc2UsCiAgICAgfTsKIAogICAgIC8vIFRoZSBwcm92aWRlcyBtZXNzYWdlIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBwbGF5ZXIgYWJvdXQgdmFyaW91cwpAQCAtNTksMjggKzY3LDQ1IEBACiAgICAgdmlydHVhbCB2b2lkIHBhdXNlKCkge30KICAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lKCkge30KIAorICAgIC8vIEV4cGxpY2l0bHkgZGlzY29ubmVjdCB0aGUgdW5kZXJsaW5nIGRhdGEgc291cmNlCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSB7fQorCiAgICAgLy8gUmV0dXJucyBPSyBpZmYgbW9yZSBkYXRhIHdhcyBhdmFpbGFibGUsCiAgICAgLy8gYW4gZXJyb3Igb3IgRVJST1JfRU5EX09GX1NUUkVBTSBpZiBub3QuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpID0gMDsKIAogICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdChib29sIGF1ZGlvKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgLyogYXVkaW8gKi8pIHsgcmV0dXJuIE5VTEw7IH0KKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoCiAgICAgICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICogLyogZHVyYXRpb25VcyAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3QgeworICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgLyogdHJhY2tJbmRleCAqLykgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIC8qIHR5cGUgKi8pIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgLyogdHJhY2tJbmRleCAqLywgYm9vbCAvKiBzZWxlY3QgKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcykgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgLyogc2Vla1RpbWVVcyAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGJvb2wgLyogYXVkaW8gKi8sIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmLyogYnVmZmVycyAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC05MywxMiArMTE4LDEwIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSB7IHJldHVybiBOVUxMOyB9Ci0KICAgICBzcDxBTWVzc2FnZT4gZHVwTm90aWZ5KCkgY29uc3QgeyByZXR1cm4gbU5vdGlmeS0+ZHVwKCk7IH0KIAogICAgIHZvaWQgbm90aWZ5RmxhZ3NDaGFuZ2VkKHVpbnQzMl90IGZsYWdzKTsKLSAgICB2b2lkIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCA9IE5VTEwpOwogICAgIHZvaWQgbm90aWZ5UHJlcGFyZWQoc3RhdHVzX3QgZXJyID0gT0spOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCmluZGV4IDE4Y2Y2ZDEuLmZmYWNiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJNeUhhbmRsZXIuaCIKICNpbmNsdWRlICJTRFBMb2FkZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIApAQCAtMzMsMTIgKzM0LDE0IEBACiAKIE51UGxheWVyOjpSVFNQU291cmNlOjpSVFNQU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKICAgICAgICAgYm9vbCB1aWRWYWxpZCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBib29sIGlzU0RQKQogICAgIDogU291cmNlKG5vdGlmeSksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbVVSTCh1cmwpLAogICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKICAgICAgIG1VSUQodWlkKSwKQEAgLTY3LDYgKzcwLDcgQEAKIAogTnVQbGF5ZXI6OlJUU1BTb3VyY2U6On5SVFNQU291cmNlKCkgewogICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CiAgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKICAgICB9CiB9CkBAIC03NywxNCArODEsMTMgQEAKICAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOwogICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwogCi0gICAgICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8UlRTUFNvdXJjZT4odGhpcyk7Ci0gICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwogICAgIH0KIAogICAgIENIRUNLKG1IYW5kbGVyID09IE5VTEwpOwogICAgIENIRUNLKG1TRFBMb2FkZXIgPT0gTlVMTCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBpZCgpKTsKIAogICAgIENIRUNLX0VRKG1TdGF0ZSwgKGludClESVNDT05ORUNURUQpOwogICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7CkBAIC05Miw3ICs5NSw3IEBACiAgICAgaWYgKG1Jc1NEUCkgewogICAgICAgICBtU0RQTG9hZGVyID0gbmV3IFNEUExvYWRlcihub3RpZnksCiAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IFNEUExvYWRlcjo6a0ZsYWdJbmNvZ25pdG8gOiAwLAotICAgICAgICAgICAgICAgIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlKTsKIAogICAgICAgICBtU0RQTG9hZGVyLT5sb2FkKAogICAgICAgICAgICAgICAgIG1VUkwuY19zdHIoKSwgbUV4dHJhSGVhZGVycy5pc0VtcHR5KCkgPyBOVUxMIDogJm1FeHRyYUhlYWRlcnMpOwpAQCAtMTE1LDcgKzExOCw3IEBACiAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgaWQoKSk7CiAKICAgICBzcDxBTWVzc2FnZT4gZHVtbXk7CiAgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmZHVtbXkpOwpAQCAtMzAyLDcgKzMwNSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpSVFNQU291cmNlOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBlcmZvcm1TZWVrLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGVyZm9ybVNlZWssIGlkKCkpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCArK21TZWVrR2VuZXJhdGlvbik7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgc2Vla1RpbWVVcyk7CiAgICAgbXNnLT5wb3N0KDIwMDAwMGxsKTsKQEAgLTM1Myw3ICszNTYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBvbkNvbm5lY3RlZCgpOwogCi0gICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKDAsIDApOworICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgpOwogCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAKQEAgLTUwMiw3ICs1MDUsMTAgQEAKICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CiAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBpbmZvLT5tU291cmNlOwogICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssIE5VTEwpOworICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXNjYXJkICovKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC02MDcsNyArNjEzLDcgQEAKICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZmluZCB1cmwgaW4gU0RQIik7CiAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBpZCgpKTsKIAogICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKHJ0c3BVcmkuY19zdHIoKSwgbm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOwogICAgICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCmluZGV4IDhjZjM0YTAuLmYxY2FlNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaApAQCAtMjIsOCArMjIsNiBAQAogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFMb29wZXI7CkBAIC0zNCw2ICszMiw3IEBACiBzdHJ1Y3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSB7CiAgICAgUlRTUFNvdXJjZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAogICAgICAgICAgICAgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLApAQCAtODgsNiArODcsNyBAQAogICAgICAgICBib29sIG1OUFRNYXBwaW5nVmFsaWQ7CiAgICAgfTsKIAorICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAgICAgQVN0cmluZyBtVVJMOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7CiAgICAgYm9vbCBtVUlEVmFsaWQ7CkBAIC0xMDAsNyArMTAwLDYgQEAKICAgICBib29sIG1CdWZmZXJpbmc7CiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPFJUU1BTb3VyY2U+ID4gbVJlZmxlY3RvcjsKICAgICBzcDxNeUhhbmRsZXI+IG1IYW5kbGVyOwogICAgIHNwPFNEUExvYWRlcj4gbVNEUExvYWRlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAppbmRleCAyOGYwZDUwLi4yZTlhMjlhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcApAQCAtNDQsNyArNDQsNyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpTdHJlYW1pbmdTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKLSAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKDAsIDApOworICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKICAgICBub3RpZnlGbGFnc0NoYW5nZWQoMCk7CiAgICAgbm90aWZ5UHJlcGFyZWQoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxZDk0Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNUDRTb3VyY2UuaCIKLQotI2luY2x1ZGUgIkZyYWdtZW50ZWRNUDRQYXJzZXIuaCIKLSNpbmNsdWRlICIuLi9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU3RyZWFtU291cmNlIDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlNvdXJjZSB7Ci0gICAgU3RyZWFtU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpCi0gICAgICAgIDogbUxpc3RlbmVyKG5ldyBOdVBsYXllcjo6TnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcihzb3VyY2UsIDApKSwKLSAgICAgICAgICBtUG9zaXRpb24oMCkgewotICAgICAgICBtTGlzdGVuZXItPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IG1Qb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChvZmZzZXQgPiBtUG9zaXRpb24pIHsKLSAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEwMjRdOwotICAgICAgICAgICAgb2ZmNjRfdCBza2lwQnl0ZXMgPSBvZmZzZXQgLSBtUG9zaXRpb247Ci0gICAgICAgICAgICBpZiAoc2tpcEJ5dGVzID4gc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICBza2lwQnl0ZXMgPSBzaXplb2YoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOwotICAgICAgICAgICAgc3NpemVfdCBuOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIG4gPSBtTGlzdGVuZXItPnJlYWQoYnVmZmVyLCBza2lwQnl0ZXMsICZleHRyYSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobiA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkICVsZCBieXRlcyBhdCBvZmZzZXQgJWxsZCIsIG4sIG1Qb3NpdGlvbik7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9zaXRpb24gKz0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKLSAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICAgICAgd2hpbGUgKHRvdGFsIDwgc2l6ZSkgewotICAgICAgICAgICAgc3NpemVfdCBuID0gbUxpc3RlbmVyLT5yZWFkKAotICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWRhdGEgKyB0b3RhbCwgc2l6ZSAtIHRvdGFsLCAmZXh0cmEpOwotCi0gICAgICAgICAgICBpZiAobiA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBtUG9zaXRpb24gKz0gdG90YWw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRvdGFsICs9IG47Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigicmVhZCAlbGQgYnl0ZXMgYXQgb2Zmc2V0ICVsbGQiLCBuLCBtUG9zaXRpb24pOwotCi0gICAgICAgIG1Qb3NpdGlvbiArPSB0b3RhbDsKLQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgYm9vbCBpc1NlZWthYmxlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHNwPE51UGxheWVyOjpOdVBsYXllclN0cmVhbUxpc3RlbmVyPiBtTGlzdGVuZXI7Ci0gICAgb2ZmNjRfdCBtUG9zaXRpb247Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW1Tb3VyY2UpOwotfTsKLQotTVA0U291cmNlOjpNUDRTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKQotICAgIDogU291cmNlKG5vdGlmeSksCi0gICAgICBtU291cmNlKHNvdXJjZSksCi0gICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKLSAgICAgIG1QYXJzZXIobmV3IEZyYWdtZW50ZWRNUDRQYXJzZXIpLAotICAgICAgbUVPUyhmYWxzZSkgewotICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUGFyc2VyKTsKLX0KLQotTVA0U291cmNlOjp+TVA0U291cmNlKCkgewotfQotCi12b2lkIE1QNFNvdXJjZTo6cHJlcGFyZUFzeW5jKCkgewotICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoMCwgMCk7Ci0gICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKDApOwotICAgIG5vdGlmeVByZXBhcmVkKCk7Ci19Ci0KLXZvaWQgTVA0U291cmNlOjpzdGFydCgpIHsKLSAgICBtTG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8pOwotICAgIG1QYXJzZXItPnN0YXJ0KG5ldyBTdHJlYW1Tb3VyY2UobVNvdXJjZSkpOwotfQotCi1zdGF0dXNfdCBNUDRTb3VyY2U6OmZlZWRNb3JlVFNEYXRhKCkgewotICAgIHJldHVybiBtRU9TID8gRVJST1JfRU5EX09GX1NUUkVBTSA6IChzdGF0dXNfdClPSzsKLX0KLQotc3A8QU1lc3NhZ2U+IE1QNFNvdXJjZTo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKLSAgICByZXR1cm4gbVBhcnNlci0+Z2V0Rm9ybWF0KGF1ZGlvKTsKLX0KLQotc3RhdHVzX3QgTVA0U291cmNlOjpkZXF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICByZXR1cm4gbVBhcnNlci0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYXVkaW8sIGFjY2Vzc1VuaXQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZWY2MjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1QNF9TT1VSQ0VfSAotI2RlZmluZSBNUDRfU09VUkNFX0gKLQotI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXI7Ci0KLXN0cnVjdCBNUDRTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSB7Ci0gICAgTVA0U291cmNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKLQotICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdChib29sIGF1ZGlvKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUDRTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxJU3RyZWFtU291cmNlPiBtU291cmNlOwotICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8RnJhZ21lbnRlZE1QNFBhcnNlcj4gbVBhcnNlcjsKLSAgICBib29sIG1FT1M7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUDRTb3VyY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIE1QNF9TT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5tayBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQubWsKaW5kZXggNjljNzViOC4uOTcwN2M0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rCkBAIC0zMSw5ICszMSw4IEBACiAgICAgbGliY29tbW9uX3RpbWVfY2xpZW50IFwKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYm1lZGlhCi0jIFRoaXMgZGVwZW5kZW5jeSBvbiBsaWJtZWRpYSBpcyBmb3IgU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLgotIyBDb25zaWRlciBhIHNlcGFyYXRlIGEgbGlicmFyeSBmb3IgU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLgorICAgIGxpYmxvZworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmluc3RhbnRzc3EKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJuYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcAppbmRleCA3NGE2ZmRiLi41NTFmNTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcApAQCAtMjQsMTEgKzI0LDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2U6OkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoQXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpIDoKICAgICBOQkFJT19Tb3VyY2UoZm9ybWF0KSwgbVByb3ZpZGVyKHByb3ZpZGVyKSwgbUNvbnN1bWVkKDApCiB7CiAgICAgQUxPR19BU1NFUlQocHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgQUxPR19BU1NFUlQoZm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKTsKKyAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNWYWxpZChmb3JtYXQpKTsKIH0KIAogQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZTo6fkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoKQpAQCAtNjgsNyArNjgsNyBAQAogICAgIH0KICAgICAvLyBjb3VudCBjb3VsZCBiZSB6ZXJvLCBlaXRoZXIgYmVjYXVzZSBjb3VudCB3YXMgemVybyBvbiBlbnRyeSBvcgogICAgIC8vIGF2YWlsYWJsZSBpcyB6ZXJvLCBidXQgYm90aCBhcmUgdW5saWtlbHkgc28gZG9uJ3QgY2hlY2sgZm9yIHRoYXQKLSAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtQnVmZmVyLnJhdyArIChtQ29uc3VtZWQgPDwgbUJpdFNoaWZ0KSwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtQnVmZmVyLnJhdyArIChtQ29uc3VtZWQgKiBtRnJhbWVTaXplKSwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICBpZiAoQ0NfVU5MSUtFTFkoKG1Db25zdW1lZCArPSBjb3VudCkgPj0gbUJ1ZmZlci5mcmFtZUNvdW50KSkgewogICAgICAgICBtUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwogICAgICAgICBtQnVmZmVyLnJhdyA9IE5VTEw7CkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgICAgIGNvdW50ID0gYXZhaWxhYmxlOwogICAgICAgICB9CiAgICAgICAgIGlmIChDQ19MSUtFTFkoY291bnQgPiAwKSkgewotICAgICAgICAgICAgY2hhciogcmVhZFRndCA9IChjaGFyICopIG1CdWZmZXIucmF3ICsgKG1Db25zdW1lZCA8PCBtQml0U2hpZnQpOworICAgICAgICAgICAgY2hhciogcmVhZFRndCA9IChjaGFyICopIG1CdWZmZXIucmF3ICsgKG1Db25zdW1lZCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgc3NpemVfdCByZXQgPSB2aWEodXNlciwgcmVhZFRndCwgY291bnQsIHJlYWRQVFMpOwogICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHJldCA8PSAwKSkgewogICAgICAgICAgICAgICAgIGlmIChDQ19MSUtFTFkoYWNjdW11bGF0b3IgPiAwKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcAppbmRleCAwNTI3M2Y2Li42YWFiNDhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcApAQCAtNDAsMTYgKzQwLDE1IEBACiBzc2l6ZV90IEF1ZGlvU3RyZWFtSW5Tb3VyY2U6Om5lZ290aWF0ZShjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzW10sIHNpemVfdCBudW1PZmZlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBjb3VudGVyT2ZmZXJzW10sIHNpemVfdCYgbnVtQ291bnRlck9mZmVycykKIHsKLSAgICBpZiAobUZvcm1hdCA9PSBGb3JtYXRfSW52YWxpZCkgeworICAgIGlmICghRm9ybWF0X2lzVmFsaWQobUZvcm1hdCkpIHsKICAgICAgICAgbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1TdHJlYW0tPmNvbW1vbik7CiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHN0cmVhbUZvcm1hdCA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtU3RyZWFtLT5jb21tb24pOwotICAgICAgICBpZiAoc3RyZWFtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KSBtU3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtU3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwgcG9wY291bnQoY2hhbm5lbE1hc2spKTsKLSAgICAgICAgICAgIG1CaXRTaGlmdCA9IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KG1Gb3JtYXQpOwotICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtU3RyZWFtLT5jb21tb24pOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KSBtU3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtU3RyZWFtLT5jb21tb24pOworICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSwgc3RyZWFtRm9ybWF0KTsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCk7CiAgICAgfQogICAgIHJldHVybiBOQkFJT19Tb3VyY2U6Om5lZ290aWF0ZShvZmZlcnMsIG51bU9mZmVycywgY291bnRlck9mZmVycywgbnVtQ291bnRlck9mZmVycyk7CiB9CkBAIC02NSwxNCArNjQsMTQgQEAKICAgICByZXR1cm4gbUZyYW1lc092ZXJydW47CiB9CiAKLXNzaXplX3QgQXVkaW9TdHJlYW1JblNvdXJjZTo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3NzaXplX3QgQXVkaW9TdHJlYW1JblNvdXJjZTo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCwgaW50NjRfdCByZWFkUFRTIF9fdW51c2VkKQogewotICAgIGlmIChDQ19VTkxJS0VMWShtRm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSkgeworICAgIGlmIChDQ19VTkxJS0VMWSghRm9ybWF0X2lzVmFsaWQobUZvcm1hdCkpKSB7CiAgICAgICAgIHJldHVybiBORUdPVElBVEU7CiAgICAgfQotICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGNvdW50IDw8IG1CaXRTaGlmdCk7CisgICAgc3NpemVfdCBieXRlc1JlYWQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgewotICAgICAgICBzaXplX3QgZnJhbWVzUmVhZCA9IGJ5dGVzUmVhZCA+PiBtQml0U2hpZnQ7CisgICAgICAgIHNpemVfdCBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgbUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKICAgICAgICAgcmV0dXJuIGZyYW1lc1JlYWQ7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCmluZGV4IGU0MzQxZDcuLjBkNWY5MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcApAQCAtMzcsMTYgKzM3LDE1IEBACiBzc2l6ZV90IEF1ZGlvU3RyZWFtT3V0U2luazo6bmVnb3RpYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbXSwgc2l6ZV90IG51bU9mZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGNvdW50ZXJPZmZlcnNbXSwgc2l6ZV90JiBudW1Db3VudGVyT2ZmZXJzKQogewotICAgIGlmIChtRm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkgewogICAgICAgICBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzID0gbVN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbVN0cmVhbS0+Y29tbW9uKTsKICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0ID0gbVN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgIGlmIChzdHJlYW1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtU3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIG1TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLCBwb3Bjb3VudChjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUJpdFNoaWZ0ID0gRm9ybWF0X2ZyYW1lQml0U2hpZnQobUZvcm1hdCk7Ci0gICAgICAgIH0KKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1TdHJlYW0tPmNvbW1vbik7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIG1TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1TdHJlYW0tPmNvbW1vbik7CisgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSwgc3RyZWFtRm9ybWF0KTsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCk7CiAgICAgfQogICAgIHJldHVybiBOQkFJT19TaW5rOjpuZWdvdGlhdGUob2ZmZXJzLCBudW1PZmZlcnMsIGNvdW50ZXJPZmZlcnMsIG51bUNvdW50ZXJPZmZlcnMpOwogfQpAQCAtNTYsMTAgKzU1LDEwIEBACiAgICAgaWYgKCFtTmVnb3RpYXRlZCkgewogICAgICAgICByZXR1cm4gTkVHT1RJQVRFOwogICAgIH0KLSAgICBBTE9HX0FTU0VSVChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKTsKLSAgICBzc2l6ZV90IHJldCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSk7CisgICAgc3NpemVfdCByZXQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgaWYgKHJldCA+IDApIHsKLSAgICAgICAgcmV0ID4+PSBtQml0U2hpZnQ7CisgICAgICAgIHJldCAvPSBtRnJhbWVTaXplOwogICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSByZXQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgdmVyaWZ5IEhBTCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJldHVybmluZyB0aGUgY29ycmVjdCBlcnJvciBjb2RlcyBlLmcuIFdPVUxEX0JMT0NLCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAgYi9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAKaW5kZXggM2M2MWI2MC4uMGI2NTg2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGUuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNkZWZpbmUgTE9HX1RBRyAiTW9ub1BpcGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKQEAgLTMwLDcgKzMyLDI0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTW9ub1BpcGU6Ok1vbm9QaXBlKHNpemVfdCByZXFGcmFtZXMsIE5CQUlPX0Zvcm1hdCBmb3JtYXQsIGJvb2wgd3JpdGVDYW5CbG9jaykgOgorc3RhdGljIHVpbnQ2NF90IGNhY2hlTjsgLy8gb3V0cHV0IG9mIENDSGVscGVyOjpnZXRMb2NhbEZyZXEoKQorc3RhdGljIGJvb2wgY2FjaGVWYWxpZDsgLy8gd2hldGhlciBjYWNoZU4gaXMgdmFsaWQKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBjYWNoZU9uY2VDb250cm9sID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKK3N0YXRpYyB2b2lkIGNhY2hlT25jZUluaXQoKQoreworICAgIENDSGVscGVyIHRtcEhlbHBlcjsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKE9LICE9IChyZXMgPSB0bXBIZWxwZXIuZ2V0TG9jYWxGcmVxKCZjYWNoZU4pKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZldGNoIGxvY2FsIHRpbWUgZnJlcXVlbmN5IHdoZW4gY29uc3RydWN0aW5nIGEiCisgICAgICAgICAgICAgICIgTW9ub1BpcGUgKHJlcyA9ICVkKS4gIGdldE5leHRXcml0ZVRpbWVzdGFtcCBjYWxscyB3aWxsIGJlIgorICAgICAgICAgICAgICAiIG5vbi1mdW5jdGlvbmFsIiwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYWNoZVZhbGlkID0gdHJ1ZTsKK30KKworTW9ub1BpcGU6Ok1vbm9QaXBlKHNpemVfdCByZXFGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2spIDoKICAgICAgICAgTkJBSU9fU2luayhmb3JtYXQpLAogICAgICAgICBtVXBkYXRlU2VxKDApLAogICAgICAgICBtUmVxRnJhbWVzKHJlcUZyYW1lcyksCkBAIC00Nyw4ICs2Niw2IEBACiAgICAgICAgIG1UaW1lc3RhbXBNdXRhdG9yKCZtVGltZXN0YW1wU2hhcmVkKSwKICAgICAgICAgbVRpbWVzdGFtcE9ic2VydmVyKCZtVGltZXN0YW1wU2hhcmVkKQogewotICAgIENDSGVscGVyIHRtcEhlbHBlcjsKLSAgICBzdGF0dXNfdCByZXM7CiAgICAgdWludDY0X3QgTiwgRDsKIAogICAgIG1OZXh0UmRQVFMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKQEAgLTU5LDE5ICs3NiwyMCBAQAogICAgIG1TYW1wbGVzVG9Mb2NhbFRpbWUuYV90b19iX2Rlbm9tID0gMDsKIAogICAgIEQgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgIGlmIChPSyAhPSAocmVzID0gdG1wSGVscGVyLmdldExvY2FsRnJlcSgmTikpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmV0Y2ggbG9jYWwgdGltZSBmcmVxdWVuY3kgd2hlbiBjb25zdHJ1Y3RpbmcgYSIKLSAgICAgICAgICAgICAgIiBNb25vUGlwZSAocmVzID0gJWQpLiAgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIGNhbGxzIHdpbGwgYmUiCi0gICAgICAgICAgICAgICIgbm9uLWZ1bmN0aW9uYWwiLCByZXMpOworCisgICAgKHZvaWQpIHB0aHJlYWRfb25jZSgmY2FjaGVPbmNlQ29udHJvbCwgY2FjaGVPbmNlSW5pdCk7CisgICAgaWYgKCFjYWNoZVZhbGlkKSB7CisgICAgICAgIC8vIGxvZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBOID0gY2FjaGVOOwogCiAgICAgTGluZWFyVHJhbnNmb3JtOjpyZWR1Y2UoJk4sICZEKTsKICAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1NpZ25lZEhpQml0c01hc2sgICA9IH4oMHg3RkZGRkZGRnVsbCk7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtVbnNpZ25lZEhpQml0c01hc2sgPSB+KDB4RkZGRkZGRkZ1bGwpOwogICAgIGlmICgoTiAmIGtTaWduZWRIaUJpdHNNYXNrKSB8fCAoRCAmIGtVbnNpZ25lZEhpQml0c01hc2spKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVkdWNlIHNhbXBsZSByYXRlIHRvIGxvY2FsIGNsb2NrIGZyZXF1ZW5jeSByYXRpbyB0byBmaXQiCi0gICAgICAgICAgICAgICIgaW4gYSAzMi8zMiBiaXQgcmF0aW9uYWwuICAobWF4IHJlZHVjdGlvbiBpcyAweCUwMTZsbHgvMHglMDE2bGx4IgorICAgICAgICAgICAgICAiIGluIGEgMzIvMzIgYml0IHJhdGlvbmFsLiAgKG1heCByZWR1Y3Rpb24gaXMgMHglMDE2IiBQUkl4NjQgIi8weCUwMTYiIFBSSXg2NAogICAgICAgICAgICAgICAiKS4gIGdldE5leHRXcml0ZVRpbWVzdGFtcCBjYWxscyB3aWxsIGJlIG5vbi1mdW5jdGlvbmFsIiwgTiwgRCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMTUsMTEgKzEzMywxMSBAQAogICAgICAgICAgICAgcGFydDEgPSB3cml0dGVuOwogICAgICAgICB9CiAgICAgICAgIGlmIChDQ19MSUtFTFkocGFydDEgPiAwKSkgewotICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIG1CdWZmZXIgKyAocmVhciA8PCBtQml0U2hpZnQpLCBidWZmZXIsIHBhcnQxIDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbUJ1ZmZlciArIChyZWFyICogbUZyYW1lU2l6ZSksIGJ1ZmZlciwgcGFydDEgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShyZWFyICsgcGFydDEgPT0gbU1heEZyYW1lcykpIHsKICAgICAgICAgICAgICAgICBzaXplX3QgcGFydDIgPSB3cml0dGVuIC0gcGFydDE7CiAgICAgICAgICAgICAgICAgaWYgKENDX0xJS0VMWShwYXJ0MiA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShtQnVmZmVyLCAoY2hhciAqKSBidWZmZXIgKyAocGFydDEgPDwgbUJpdFNoaWZ0KSwgcGFydDIgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1CdWZmZXIsIChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSAqIG1GcmFtZVNpemUpLCBwYXJ0MiAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUod3JpdHRlbiArIG1SZWFyLCAmbVJlYXIpOwpAQCAtMTI5LDcgKzE0Nyw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjb3VudCAtPSB3cml0dGVuOwotICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyAod3JpdHRlbiA8PCBtQml0U2hpZnQpOworICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyAod3JpdHRlbiAqIG1GcmFtZVNpemUpOwogICAgICAgICAvLyBTaW11bGF0ZSBibG9ja2luZyBJL08gYnkgc2xlZXBpbmcgYXQgZGlmZmVyZW50IHJhdGVzLCBkZXBlbmRpbmcgb24gYSB0aHJvdHRsZS4KICAgICAgICAgLy8gVGhlIHRocm90dGxlIHRyaWVzIHRvIGtlZXAgdGhlIG1lYW4gcGlwZSBkZXB0aCBuZWFyIHRoZSBzZXRwb2ludCwgd2l0aCBhIHNsaWdodCBqaXR0ZXIuCiAgICAgICAgIHVpbnQzMl90IG5zOwpAQCAtMjkyLDcgKzMxMCw3IEBACiAgICAgICAgIC8vIGVycm9yLCBidXQgdGhlbiB6ZXJvIG91dCB0aGUgcmF0aW8gaW4gdGhlIGxpbmVhciB0cmFuc2Zvcm0gc28KICAgICAgICAgLy8gdGhhdCB3ZSBkb24ndCB0cnkgdG8gZG8gYW55IGNvbnZlcnNpb25zIGZyb20gbm93IG9uLiAgVGhpcwogICAgICAgICAvLyBNb25vUGlwZSdzIGdldE5leHRXcml0ZVRpbWVzdGFtcCBpcyBub3cgYnJva2VuIGZvciBnb29kLgotICAgICAgICBBTE9HRSgiT3ZlcmZsb3cgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgJWQgYXVkaW8gZnJhbWVzIHRvIgorICAgICAgICBBTE9HRSgiT3ZlcmZsb3cgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgJXp1IGF1ZGlvIGZyYW1lcyB0byIKICAgICAgICAgICAgICAgIiBkdXJhdGlvbiBpbiBsb2NhbCB0aW1lLiAgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIHdpbGwgZmFpbCBmcm9tIgogICAgICAgICAgICAgICAiIG5vdyBvbi4iLCBhdWRGcmFtZXMpOwogICAgICAgICBtU2FtcGxlc1RvTG9jYWxUaW1lLmFfdG9fYl9udW1lciA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAgYi9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAKaW5kZXggODUxMzQxYS4uZGU4MjIyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGVSZWFkZXIuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcApAQCAtNzMsMTEgKzczLDExIEBACiAgICAgICAgIHBhcnQxID0gcmVkOwogICAgIH0KICAgICBpZiAoQ0NfTElLRUxZKHBhcnQxID4gMCkpIHsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbVBpcGUtPm1CdWZmZXIgKyAoZnJvbnQgPDwgbUJpdFNoaWZ0KSwgcGFydDEgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbVBpcGUtPm1CdWZmZXIgKyAoZnJvbnQgKiBtRnJhbWVTaXplKSwgcGFydDEgKiBtRnJhbWVTaXplKTsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKGZyb250ICsgcGFydDEgPT0gbVBpcGUtPm1NYXhGcmFtZXMpKSB7CiAgICAgICAgICAgICBzaXplX3QgcGFydDIgPSByZWQgLSBwYXJ0MTsKICAgICAgICAgICAgIGlmIChDQ19MSUtFTFkocGFydDIgPiAwKSkgewotICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBidWZmZXIgKyAocGFydDEgPDwgbUJpdFNoaWZ0KSwgbVBpcGUtPm1CdWZmZXIsIHBhcnQyIDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSAqIG1GcmFtZVNpemUpLCBtUGlwZS0+bUJ1ZmZlciwgcGFydDIgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtUGlwZS0+dXBkYXRlRnJvbnRBbmROUlBUUyhyZWQgKyBtUGlwZS0+bUZyb250LCBuZXh0UmVhZFBUUyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9OQkFJTy5jcHAgYi9tZWRpYS9saWJuYmFpby9OQkFJTy5jcHAKaW5kZXggZTBkMmMyMS4uZDY0MWU3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTkJBSU8uY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcApAQCAtMjIsMTE5ICsyMiw0MiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXNpemVfdCBGb3JtYXRfZnJhbWVTaXplKE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitzaXplX3QgRm9ybWF0X2ZyYW1lU2l6ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkKIHsKLSAgICByZXR1cm4gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpICogc2l6ZW9mKHNob3J0KTsKKyAgICByZXR1cm4gZm9ybWF0Lm1GcmFtZVNpemU7CiB9CiAKLXNpemVfdCBGb3JtYXRfZnJhbWVCaXRTaGlmdChOQkFJT19Gb3JtYXQgZm9ybWF0KQorY29uc3QgTkJBSU9fRm9ybWF0IEZvcm1hdF9JbnZhbGlkID0geyAwLCAwLCBBVURJT19GT1JNQVRfSU5WQUxJRCwgMCB9OworCit1bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkKIHsKLSAgICAvLyBzaXplb2Yoc2hvcnQpID09IDIsIHNvIGZyYW1lIHNpemUgPT0gMSA8PCBjaGFubmVscwotICAgIHJldHVybiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gZm9ybWF0Lm1TYW1wbGVSYXRlOwogfQogCi1lbnVtIHsKLSAgICBGb3JtYXRfU1JfODAwMCwKLSAgICBGb3JtYXRfU1JfMTEwMjUsCi0gICAgRm9ybWF0X1NSXzE2MDAwLAotICAgIEZvcm1hdF9TUl8yMjA1MCwKLSAgICBGb3JtYXRfU1JfMjQwMDAsCi0gICAgRm9ybWF0X1NSXzMyMDAwLAotICAgIEZvcm1hdF9TUl80NDEwMCwKLSAgICBGb3JtYXRfU1JfNDgwMDAsCi0gICAgRm9ybWF0X1NSX01hc2sgPSA3Ci19OwotCi1lbnVtIHsKLSAgICBGb3JtYXRfQ18xID0gMHgwOCwKLSAgICBGb3JtYXRfQ18yID0gMHgxMCwKLSAgICBGb3JtYXRfQ19NYXNrID0gMHgxOAotfTsKLQotdW5zaWduZWQgRm9ybWF0X3NhbXBsZVJhdGUoTkJBSU9fRm9ybWF0IGZvcm1hdCkKK3Vuc2lnbmVkIEZvcm1hdF9jaGFubmVsQ291bnQoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpCiB7Ci0gICAgaWYgKGZvcm1hdCA9PSBGb3JtYXRfSW52YWxpZCkgeworICAgIGlmICghRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgc3dpdGNoIChmb3JtYXQgJiBGb3JtYXRfU1JfTWFzaykgewotICAgIGNhc2UgRm9ybWF0X1NSXzgwMDA6Ci0gICAgICAgIHJldHVybiA4MDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzExMDI1OgotICAgICAgICByZXR1cm4gMTEwMjU7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMTYwMDA6Ci0gICAgICAgIHJldHVybiAxNjAwMDsKLSAgICBjYXNlIEZvcm1hdF9TUl8yMjA1MDoKLSAgICAgICAgcmV0dXJuIDIyMDUwOwotICAgIGNhc2UgRm9ybWF0X1NSXzI0MDAwOgotICAgICAgICByZXR1cm4gMjQwMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMzIwMDA6Ci0gICAgICAgIHJldHVybiAzMjAwMDsKLSAgICBjYXNlIEZvcm1hdF9TUl80NDEwMDoKLSAgICAgICAgcmV0dXJuIDQ0MTAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzQ4MDAwOgotICAgICAgICByZXR1cm4gNDgwMDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBmb3JtYXQubUNoYW5uZWxDb3VudDsKIH0KIAotdW5zaWduZWQgRm9ybWF0X2NoYW5uZWxDb3VudChOQkFJT19Gb3JtYXQgZm9ybWF0KQorTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCiB7Ci0gICAgaWYgKGZvcm1hdCA9PSBGb3JtYXRfSW52YWxpZCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc3dpdGNoIChmb3JtYXQgJiBGb3JtYXRfQ19NYXNrKSB7Ci0gICAgY2FzZSBGb3JtYXRfQ18xOgotICAgICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEZvcm1hdF9DXzI6Ci0gICAgICAgIHJldHVybiAyOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50KQotewotICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQ7Ci0gICAgc3dpdGNoIChzYW1wbGVSYXRlKSB7Ci0gICAgY2FzZSA4MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfODAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzExMDI1OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMTYwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8yMjA1MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDAwMDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzI0MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMzIwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl80NDEwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzQ4MDAwOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgorICAgIGlmIChzYW1wbGVSYXRlID09IDAgfHwgY2hhbm5lbENvdW50ID09IDAgfHwgIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7CiAgICAgICAgIHJldHVybiBGb3JtYXRfSW52YWxpZDsKICAgICB9Ci0gICAgc3dpdGNoIChjaGFubmVsQ291bnQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICAgIGZvcm1hdCB8PSBGb3JtYXRfQ18xOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIGZvcm1hdCB8PSBGb3JtYXRfQ18yOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRm9ybWF0X0ludmFsaWQ7Ci0gICAgfQotICAgIHJldHVybiBmb3JtYXQ7CisgICAgTkJBSU9fRm9ybWF0IHJldDsKKyAgICByZXQubVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIHJldC5tQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgIHJldC5tRm9ybWF0ID0gZm9ybWF0OworICAgIHJldC5tRnJhbWVTaXplID0gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpID8KKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSA6IHNpemVvZih1aW50OF90KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvLyBUaGlzIGlzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjsgaXQgaXMgZXhwZWN0ZWQgdGhhdCBzdWJjbGFzc2VzIHdpbGwgb3B0aW1pemUgdGhpcy4KQEAgLTIxNCwxMSArMTM3LDExIEBACiBzc2l6ZV90IE5CQUlPX1BvcnQ6Om5lZ290aWF0ZShjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzW10sIHNpemVfdCBudW1PZmZlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGNvdW50ZXJPZmZlcnNbXSwgc2l6ZV90JiBudW1Db3VudGVyT2ZmZXJzKQogewotICAgIEFMT0dWKCJuZWdvdGlhdGUgb2ZmZXJzPSVwIG51bU9mZmVycz0ldSBjb3VudGVyc09mZmVycz0lcCBudW1Db3VudGVyT2ZmZXJzPSV1IiwKKyAgICBBTE9HVigibmVnb3RpYXRlIG9mZmVycz0lcCBudW1PZmZlcnM9JXp1IGNvdW50ZXJzT2ZmZXJzPSVwIG51bUNvdW50ZXJPZmZlcnM9JXp1IiwKICAgICAgICAgICAgIG9mZmVycywgbnVtT2ZmZXJzLCBjb3VudGVyT2ZmZXJzLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICBpZiAobUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkgeworICAgIGlmIChGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bU9mZmVyczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAob2ZmZXJzW2ldID09IG1Gb3JtYXQpIHsKKyAgICAgICAgICAgIGlmIChGb3JtYXRfaXNFcXVhbChvZmZlcnNbaV0sIG1Gb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgbU5lZ290aWF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgfQpAQCAtMjMzLDQgKzE1NiwxNyBAQAogICAgIHJldHVybiAoc3NpemVfdCkgTkVHT1RJQVRFOwogfQogCitib29sIEZvcm1hdF9pc1ZhbGlkKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQoreworICAgIHJldHVybiBmb3JtYXQubVNhbXBsZVJhdGUgIT0gMCAmJiBmb3JtYXQubUNoYW5uZWxDb3VudCAhPSAwICYmCisgICAgICAgICAgICBmb3JtYXQubUZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCAmJiBmb3JtYXQubUZyYW1lU2l6ZSAhPSAwOworfQorCitib29sIEZvcm1hdF9pc0VxdWFsKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0MSwgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQyKQoreworICAgIHJldHVybiBmb3JtYXQxLm1TYW1wbGVSYXRlID09IGZvcm1hdDIubVNhbXBsZVJhdGUgJiYKKyAgICAgICAgICAgIGZvcm1hdDEubUNoYW5uZWxDb3VudCA9PSBmb3JtYXQyLm1DaGFubmVsQ291bnQgJiYgZm9ybWF0MS5tRm9ybWF0ID09IGZvcm1hdDIubUZvcm1hdCAmJgorICAgICAgICAgICAgZm9ybWF0MS5tRnJhbWVTaXplID09IGZvcm1hdDIubUZyYW1lU2l6ZTsKK30KKwogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAgYi9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKaW5kZXggMDQ1YmY2NC4uNGQxNDkwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMzcsMjUgKzMzOCwyNSBAQAogICAgICAgICB9CiAgICAgICAgIGkgLT0gbGVuZ3RoICsgMzsKICAgICB9Ci0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgIGxvc3QgKz0gaTsKLSAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzd2FybmluZzogbG9zdCAldSBieXRlcyB3b3J0aCBvZiBldmVudHNcbiIsIGluZGVudCwgIiIsIGxvc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0koIiUqc3dhcm5pbmc6IGxvc3QgJXUgYnl0ZXMgd29ydGggb2YgZXZlbnRzXG4iLCBpbmRlbnQsICIiLCBsb3N0KTsKLSAgICAgICAgfQorICAgIG1GZCA9IGZkOworICAgIG1JbmRlbnQgPSBpbmRlbnQ7CisgICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7CisgICAgbG9zdCArPSBpOworICAgIGlmIChsb3N0ID4gMCkgeworICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogbG9zdCAlenUgYnl0ZXMgd29ydGggb2YgZXZlbnRzIiwgbG9zdCk7CisgICAgICAgIC8vIFRPRE8gdGltZXN0YW1wIGVtcHR5IGhlcmUsIG9ubHkgb3RoZXIgY2hvaWNlIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCB0aW1lc3RhbXAgZXZlbnQgaW4gdGhlCisgICAgICAgIC8vICAgICAgbG9nIHRvIHB1c2ggaXQgb3V0LiAgQ29uc2lkZXIga2VlcGluZyB0aGUgdGltZXN0YW1wL2JvZHkgYmV0d2VlbiBjYWxscyB0byByZWFkQXQoKS4KKyAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKICAgICB9CiAgICAgc2l6ZV90IHdpZHRoID0gMTsKICAgICB3aGlsZSAobWF4U2VjID49IDEwKSB7CiAgICAgICAgICsrd2lkdGg7CiAgICAgICAgIG1heFNlYyAvPSAxMDsKICAgICB9Ci0gICAgY2hhciBwcmVmaXhbMzJdOwogICAgIGlmIChtYXhTZWMgPj0gMCkgewotICAgICAgICBzbnByaW50ZihwcmVmaXgsIHNpemVvZihwcmVmaXgpLCAiWyUqc10gIiwgd2lkdGggKyA0LCAiIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJlZml4WzBdID0gJ1wwJzsKKyAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyUqc10iLCAoaW50KSB3aWR0aCArIDQsICIiKTsKICAgICB9CisgICAgYm9vbCBkZWZlcnJlZFRpbWVzdGFtcCA9IGZhbHNlOwogICAgIHdoaWxlIChpIDwgYXZhaWwpIHsKICAgICAgICAgZXZlbnQgPSAoRXZlbnQpIGNvcHlbaV07CiAgICAgICAgIGxlbmd0aCA9IGNvcHlbaSArIDFdOwpAQCAtMzYzLDExICszNjQsOCBAQAogICAgICAgICBzaXplX3QgYWR2YW5jZSA9IGxlbmd0aCArIDM7CiAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBFVkVOVF9TVFJJTkc6Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzJXMlLipzXG4iLCBpbmRlbnQsICIiLCBwcmVmaXgsIGxlbmd0aCwgKGNvbnN0IGNoYXIgKikgZGF0YSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dJKCIlKnMlcyUuKnMiLCBpbmRlbnQsICIiLCBwcmVmaXgsIGxlbmd0aCwgKGNvbnN0IGNoYXIgKikgZGF0YSk7Ci0gICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoaW50KSBsZW5ndGgsIChjb25zdCBjaGFyICopIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRVZFTlRfVElNRVNUQU1QOiB7CiAgICAgICAgICAgICAvLyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBsZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYyk7CiAgICAgICAgICAgICBtZW1jcHkoJnRzLCBkYXRhLCBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSk7CkBAIC00MDAsNDggKzM5OCw1NiBAQAogICAgICAgICAgICAgICAgIHByZXZOc2VjID0gdHNOZXh0LnR2X25zZWM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzaXplX3QgbiA9IChqIC0gaSkgLyAoc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykgKyAzKTsKKyAgICAgICAgICAgIGlmIChkZWZlcnJlZFRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOwogICAgICAgICAgICAgaWYgKG4gPj0ga1NxdWFzaFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzWyVkLiUwM2QgdG8gLiUuMDNkIGJ5IC4lLjAzZCB0byAuJS4wM2RdXG4iLCBpbmRlbnQsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHRzLnR2X3NlYywgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChkZWx0YU1pbiAvIDEwMDAwMDApLCAoaW50KSAoZGVsdGFNYXggLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIiUqc1slZC4lMDNkIHRvIC4lLjAzZCBieSAuJS4wM2QgdG8gLiUuMDNkXVxuIiwgaW5kZW50LCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0cy50dl9zZWMsIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cy50dl9uc2VjICsgZGVsdGFUb3RhbCkgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoZGVsdGFNaW4gLyAxMDAwMDAwKSwgKGludCkgKGRlbHRhTWF4IC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZCB0byAuJS4wM2QgYnkgLiUuMDNkIHRvIC4lLjAzZF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgdHMudHZfc2VjLCAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cy50dl9uc2VjICsgZGVsdGFUb3RhbCkgLyAxMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChkZWx0YU1pbiAvIDEwMDAwMDApLCAoaW50KSAoZGVsdGFNYXggLyAxMDAwMDAwKSk7CiAgICAgICAgICAgICAgICAgaSA9IGo7CiAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IDA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzWyVkLiUwM2RdXG4iLCBpbmRlbnQsICIiLCAoaW50KSB0cy50dl9zZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiUqc1slZC4lMDNkXSIsIGluZGVudCwgIiIsIChpbnQpIHRzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgdHMudHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApKTsKKyAgICAgICAgICAgIGRlZmVycmVkVGltZXN0YW1wID0gdHJ1ZTsKICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzJXN3YXJuaW5nOiB1bmtub3duIGV2ZW50ICVkXG4iLCBpbmRlbnQsICIiLCBwcmVmaXgsIGV2ZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiUqcyVzd2FybmluZzogdW5rbm93biBldmVudCAlZCIsIGluZGVudCwgIiIsIHByZWZpeCwgZXZlbnQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpICs9IGFkdmFuY2U7CisKKyAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKKyAgICAgICAgICAgIGRlZmVycmVkVGltZXN0YW1wID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlZmVycmVkVGltZXN0YW1wKSB7CisgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQogICAgIC8vIEZJWE1FIGl0IHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvIHB1dCBhIGNoYXIgbUNvcHlbMjU2XSBhcyBhIG1lbWJlciB2YXJpYWJsZSBvZiB0aGUgZHVtcGVyCiAgICAgZGVsZXRlW10gY29weTsKIH0KIAordm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wTGluZShjb25zdCBTdHJpbmc4JiB0aW1lc3RhbXAsIFN0cmluZzgmIGJvZHkpCit7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIGRwcmludGYobUZkLCAiJS4qcyVzICVzXG4iLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HSSgiJS4qcyVzICVzIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7CisgICAgfQorICAgIGJvZHkuY2xlYXIoKTsKK30KKwogYm9vbCBOQkxvZzo6UmVhZGVyOjppc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlNZW1vcnkuZ2V0KCkgPT0gbUlNZW1vcnkuZ2V0KCk7CisgICAgcmV0dXJuIGlNZW1vcnkgIT0gMCAmJiBtSU1lbW9yeSAhPSAwICYmIGlNZW1vcnktPnBvaW50ZXIoKSA9PSBtSU1lbW9yeS0+cG9pbnRlcigpOwogfQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BpcGUuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKaW5kZXggMWMyMWY5Yy4uNmUwZWM4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKQEAgLTI1LDE5ICsyNSwyMiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLVBpcGU6OlBpcGUoc2l6ZV90IG1heEZyYW1lcywgTkJBSU9fRm9ybWF0IGZvcm1hdCkgOgorUGlwZTo6UGlwZShzaXplX3QgbWF4RnJhbWVzLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCwgdm9pZCAqYnVmZmVyKSA6CiAgICAgICAgIE5CQUlPX1NpbmsoZm9ybWF0KSwKICAgICAgICAgbU1heEZyYW1lcyhyb3VuZHVwKG1heEZyYW1lcykpLAotICAgICAgICBtQnVmZmVyKG1hbGxvYyhtTWF4RnJhbWVzICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpKSksCisgICAgICAgIG1CdWZmZXIoYnVmZmVyID09IE5VTEwgPyBtYWxsb2MobU1heEZyYW1lcyAqIEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KSkgOiBidWZmZXIpLAogICAgICAgICBtUmVhcigwKSwKLSAgICAgICAgbVJlYWRlcnMoMCkKKyAgICAgICAgbVJlYWRlcnMoMCksCisgICAgICAgIG1GcmVlQnVmZmVySW5EZXN0cnVjdG9yKGJ1ZmZlciA9PSBOVUxMKQogewogfQogCiBQaXBlOjp+UGlwZSgpCiB7CiAgICAgQUxPR19BU1NFUlQoYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtUmVhZGVycykgPT0gMCk7Ci0gICAgZnJlZShtQnVmZmVyKTsKKyAgICBpZiAobUZyZWVCdWZmZXJJbkRlc3RydWN0b3IpIHsKKyAgICAgICAgZnJlZShtQnVmZmVyKTsKKyAgICB9CiB9CiAKIHNzaXplX3QgUGlwZTo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpCkBAIC01MiwxMyArNTUsMTMgQEAKICAgICBpZiAoQ0NfTElLRUxZKHdyaXR0ZW4gPiBjb3VudCkpIHsKICAgICAgICAgd3JpdHRlbiA9IGNvdW50OwogICAgIH0KLSAgICBtZW1jcHkoKGNoYXIgKikgbUJ1ZmZlciArIChyZWFyIDw8IG1CaXRTaGlmdCksIGJ1ZmZlciwgd3JpdHRlbiA8PCBtQml0U2hpZnQpOworICAgIG1lbWNweSgoY2hhciAqKSBtQnVmZmVyICsgKHJlYXIgKiBtRnJhbWVTaXplKSwgYnVmZmVyLCB3cml0dGVuICogbUZyYW1lU2l6ZSk7CiAgICAgaWYgKENDX1VOTElLRUxZKHJlYXIgKyB3cml0dGVuID09IG1NYXhGcmFtZXMpKSB7CiAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgoY291bnQgLT0gd3JpdHRlbikgPiByZWFyKSkgewogICAgICAgICAgICAgY291bnQgPSByZWFyOwogICAgICAgICB9CiAgICAgICAgIGlmIChDQ19MSUtFTFkoY291bnQgPiAwKSkgewotICAgICAgICAgICAgbWVtY3B5KG1CdWZmZXIsIChjaGFyICopIGJ1ZmZlciArICh3cml0dGVuIDw8IG1CaXRTaGlmdCksIGNvdW50IDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBtZW1jcHkobUJ1ZmZlciwgKGNoYXIgKikgYnVmZmVyICsgKHdyaXR0ZW4gKiBtRnJhbWVTaXplKSwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIHdyaXR0ZW4gKz0gY291bnQ7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9QaXBlUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwCmluZGV4IGQ3ODZiODQzLi5jOGU0OTUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9QaXBlUmVhZGVyLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9QaXBlUmVhZGVyLmNwcApAQCAtNTksNyArNTksNyBAQAogICAgIHJldHVybiBhdmFpbDsKIH0KIAotc3NpemVfdCBQaXBlUmVhZGVyOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMpCitzc2l6ZV90IFBpcGVSZWFkZXI6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludDY0X3QgcmVhZFBUUyBfX3VudXNlZCkKIHsKICAgICBzc2l6ZV90IGF2YWlsID0gYXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgaWYgKENDX1VOTElLRUxZKGF2YWlsIDw9IDApKSB7CkBAIC03NiwxNCArNzYsMTQgQEAKICAgICAgICAgcmVkID0gY291bnQ7CiAgICAgfQogICAgIC8vIEluIHBhcnRpY3VsYXIsIGFuIG92ZXJydW4gZHVyaW5nIHRoZSBtZW1jcHkgd2lsbCByZXN1bHQgaW4gcmVhZGluZyBjb3JydXB0IGRhdGEKLSAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS5tQnVmZmVyICsgKGZyb250IDw8IG1CaXRTaGlmdCksIHJlZCA8PCBtQml0U2hpZnQpOworICAgIG1lbWNweShidWZmZXIsIChjaGFyICopIG1QaXBlLm1CdWZmZXIgKyAoZnJvbnQgKiBtRnJhbWVTaXplKSwgcmVkICogbUZyYW1lU2l6ZSk7CiAgICAgLy8gV2UgY291bGQgcmUtcmVhZCB0aGUgcmVhciBwb2ludGVyIGhlcmUgdG8gZGV0ZWN0IHRoZSBjb3JydXB0aW9uLCBidXQgd2h5IGJvdGhlcj8KICAgICBpZiAoQ0NfVU5MSUtFTFkoZnJvbnQgKyByZWQgPT0gbVBpcGUubU1heEZyYW1lcykpIHsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKChjb3VudCAtPSByZWQpID4gZnJvbnQpKSB7CiAgICAgICAgICAgICBjb3VudCA9IGZyb250OwogICAgICAgICB9CiAgICAgICAgIGlmIChDQ19MSUtFTFkoY291bnQgPiAwKSkgewotICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGJ1ZmZlciArIChyZWQgPDwgbUJpdFNoaWZ0KSwgbVBpcGUubUJ1ZmZlciwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBidWZmZXIgKyAocmVkICogbUZyYW1lU2l6ZSksIG1QaXBlLm1CdWZmZXIsIGNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICByZWQgKz0gY291bnQ7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwCmluZGV4IDA2MmZhMGYuLmUyMWVmNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAKIFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXI6OlNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIoY29uc3Qgc3A8TkJBSU9fU291cmNlPiYgc291cmNlKSA6CiAgICAgbVNvdXJjZShzb3VyY2UpLAotICAgIC8vIG1GcmFtZUJpdFNoaWZ0Rm9ybWF0IGJlbG93CisgICAgLy8gbUZyYW1lU2l6ZSBiZWxvdwogICAgIG1BbGxvY2F0ZWQoTlVMTCksIG1TaXplKDApLCBtT2Zmc2V0KDApLCBtUmVtYWluaW5nKDApLCBtR2V0Q291bnQoMCksIG1GcmFtZXNSZWxlYXNlZCgwKQogewogICAgIEFMT0dfQVNTRVJUKHNvdXJjZSAhPSAwKTsKQEAgLTM3LDcgKzM3LDcgQEAKICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKICAgICBpbmRleCA9IHNvdXJjZS0+bmVnb3RpYXRlKGNvdW50ZXJPZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwogICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgIG1GcmFtZUJpdFNoaWZ0ID0gRm9ybWF0X2ZyYW1lQml0U2hpZnQoc291cmNlLT5mb3JtYXQoKSk7CisgICAgbUZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUoc291cmNlLT5mb3JtYXQoKSk7CiB9CiAKIFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXI6On5Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyKCkKQEAgLTU0LDE0ICs1NCwxNCBAQAogICAgICAgICBpZiAobVJlbWFpbmluZyA8IGJ1ZmZlci0+ZnJhbWVDb3VudCkgewogICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbVJlbWFpbmluZzsKICAgICAgICAgfQotICAgICAgICBidWZmZXItPnJhdyA9IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCA8PCBtRnJhbWVCaXRTaGlmdCk7CisgICAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIgKikgbUFsbG9jYXRlZCArIChtT2Zmc2V0ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIG1HZXRDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KICAgICAvLyBkbyB3ZSBuZWVkIHRvIHJlYWxsb2NhdGU/CiAgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1TaXplKSB7CiAgICAgICAgIGZyZWUobUFsbG9jYXRlZCk7Ci0gICAgICAgIG1BbGxvY2F0ZWQgPSBtYWxsb2MoYnVmZmVyLT5mcmFtZUNvdW50IDw8IG1GcmFtZUJpdFNoaWZ0KTsKKyAgICAgICAgbUFsbG9jYXRlZCA9IG1hbGxvYyhidWZmZXItPmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgbVNpemUgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgfQogICAgIC8vIHJlYWQgZnJvbSBzb3VyY2UKQEAgLTg0LDcgKzg0LDcgQEAKIHZvaWQgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcihCdWZmZXIgKmJ1ZmZlcikKIHsKICAgICBBTE9HX0FTU0VSVCgoYnVmZmVyICE9IE5VTEwpICYmCi0gICAgICAgICAgICAoYnVmZmVyLT5yYXcgPT0gKGNoYXIgKikgbUFsbG9jYXRlZCArIChtT2Zmc2V0IDw8IG1GcmFtZUJpdFNoaWZ0KSkgJiYKKyAgICAgICAgICAgIChidWZmZXItPnJhdyA9PSAoY2hhciAqKSBtQWxsb2NhdGVkICsgKG1PZmZzZXQgKiBtRnJhbWVTaXplKSkgJiYKICAgICAgICAgICAgIChidWZmZXItPmZyYW1lQ291bnQgPD0gbUdldENvdW50KSAmJgogICAgICAgICAgICAgKG1HZXRDb3VudCA8PSBtUmVtYWluaW5nKSAmJgogICAgICAgICAgICAgKG1PZmZzZXQgKyBtUmVtYWluaW5nIDw9IG1TaXplKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcAppbmRleCA0ZDEwNzJmLi4xOTZmNmVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgIHJldHVybiBuZXcgQUFDU291cmNlKG1EYXRhU291cmNlLCBtTWV0YSwgbU9mZnNldFZlY3RvciwgbUZyYW1lRHVyYXRpb25Vcyk7CiB9CiAKLXNwPE1ldGFEYXRhPiBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworc3A8TWV0YURhdGE+IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICBpZiAobU9mZnNldFZlY3Rvci5lbXB0eSgpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAppbmRleCBhNmY3Y2ZiLi4zNTM5MjBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKQEAgLTE0LDYgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQUFDV3JpdGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMjcsMTAgKzMzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMTEsNyArMTEzLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFBQ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgQUFDV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KQEAgLTE3MSw3ICsxNzMsNyBAQAogICAgIHZvaWQgKmR1bW15OwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gKHN0YXR1c190KSBkdW1teTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAgICAgewogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKQEAgLTIwMCw3ICsyMDIsNyBAQAogCiAvLyBzdGF0aWMKIHZvaWQgKkFBQ1dyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkICptZSkgewotICAgIHJldHVybiAodm9pZCAqKSBzdGF0aWNfY2FzdDxBQUNXcml0ZXIgKj4obWUpLT50aHJlYWRGdW5jKCk7CisgICAgcmV0dXJuICh2b2lkICopKHVpbnRwdHJfdClzdGF0aWNfY2FzdDxBQUNXcml0ZXIgKj4obWUpLT50aHJlYWRGdW5jKCk7CiB9CiAKIC8qCkBAIC0zNDgsNyArMzUwLDcgQEAKICAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICBBTE9HVigidGltZSBzdGFtcDogJWxsZCwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlbGxkIiwKKyAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICUiIFBSSWQ2NCwKICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOwogICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtYXhUaW1lc3RhbXBVcykgewogICAgICAgICAgICAgbWF4VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDY3YTE5Y2QuLjJlMTY1NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtMTcsNiArMTcsMTMgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQUNvZGVjIgogCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CkBAIC0yNSw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CkBAIC0zNiw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KIAogI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KIApAQCAtNDMsNiArNTIsNDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBPTVggZXJyb3JzIGFyZSBkaXJlY3RseSBtYXBwZWQgaW50byBzdGF0dXNfdCByYW5nZSBpZgorLy8gdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBNZWRpYUVycm9yIHN0YXR1cyBjb2RlLgorLy8gVXNlIHRoZSBzdGF0dXNGcm9tT01YRXJyb3IoaW50MzJfdCBvbXhFcnJvcikgZnVuY3Rpb24uCisvLworLy8gQ3VycmVudGx5IHRoaXMgaXMgYSBkaXJlY3QgbWFwLgorLy8gU2VlIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oCisvLworLy8gVmVuZG9yIE9NWCBlcnJvcnMgICAgIGZyb20gMHg5MDAwMDAwMCAtIDB4OTAwMEZGRkYKKy8vIEV4dGVuc2lvbiBPTVggZXJyb3JzICBmcm9tIDB4OEYwMDAwMDAgLSAweDkwMDAwMDAwCisvLyBTdGFuZGFyZCBPTVggZXJyb3JzICAgZnJvbSAweDgwMDAxMDAwIC0gMHg4MDAwMTAyNCAoMHg4MDAwMTAyNCBjdXJyZW50KQorLy8KKworLy8gcmV0dXJucyB0cnVlIGlmIGVyciBpcyBhIHJlY29nbml6ZWQgT01YIGVycm9yIGNvZGUuCisvLyBhcyBPTVggZXJyb3IgaXMgT01YX1MzMiwgdGhpcyBpcyBhbiBpbnQzMl90IHR5cGUKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc09NWEVycm9yKGludDMyX3QgZXJyKSB7CisgICAgcmV0dXJuIChFUlJPUl9DT0RFQ19NSU4gPD0gZXJyICYmIGVyciA8PSBFUlJPUl9DT0RFQ19NQVgpOworfQorCisvLyBjb252ZXJ0cyBhbiBPTVggZXJyb3IgdG8gYSBzdGF0dXNfdAorc3RhdGljIGlubGluZSBzdGF0dXNfdCBzdGF0dXNGcm9tT01YRXJyb3IoaW50MzJfdCBvbXhFcnJvcikgeworICAgIHN3aXRjaCAob214RXJyb3IpIHsKKyAgICBjYXNlIE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOgorICAgIGNhc2UgT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQ6CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsgLy8gY2FuIHRyaWdnZXIgaWxsZWdhbCBhcmd1bWVudCBlcnJvciBmb3IgcHJvdmlkZWQgbmFtZXMuCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGlzT01YRXJyb3Iob214RXJyb3IpID8gb214RXJyb3IgOiAwOyAvLyBubyB0cmFuc2xhdGlvbiByZXF1aXJlZAorICAgIH0KK30KKworLy8gY2hlY2tzIGFuZCBjb252ZXJ0cyBzdGF0dXNfdCB0byBhIG5vbi1zaWRlLWVmZmVjdCBzdGF0dXNfdAorc3RhdGljIGlubGluZSBzdGF0dXNfdCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKHN0YXR1c190IGVycikgeworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgLy8gdGhlIGZvbGxvd2luZyBlcnJvcnMgaGF2ZSBzaWRlIGVmZmVjdHMgYW5kIG1heSBjb21lCisgICAgLy8gZnJvbSBvdGhlciBjb2RlIG1vZHVsZXMuIFJlbWFwIGZvciBzYWZldHkgcmVhc29ucy4KKyAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOgorICAgIGNhc2UgREVBRF9PQkpFQ1Q6CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorfQorCiB0ZW1wbGF0ZTxjbGFzcyBUPgogc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKICAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOwpAQCAtNjQsNyArMTE1LDcgQEAKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwogCiAgICAgICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCBvbXhfbXNnLnR5cGUpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoIm5vZGUiLCBvbXhfbXNnLm5vZGUpOworICAgICAgICBtc2ctPnNldEludDMyKCJub2RlIiwgb214X21zZy5ub2RlKTsKIAogICAgICAgICBzd2l0Y2ggKG9teF9tc2cudHlwZSkgewogICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RVZFTlQ6CkBAIC03NywxMyArMTI4LDEzIEBACiAKICAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVNUFRZX0JVRkZFUl9ET05FOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigiYnVmZmVyIiwgb214X21zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYnVmZmVyIiwgb214X21zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkU6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKAorICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIiwgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZV9vZmZzZXQiLApAQCAtOTcsMTIgKzE0OCw2IEBACiAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtX3ByaXZhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnBsYXRmb3JtX3ByaXZhdGUpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhX3B0ciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZGF0YV9wdHIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xNTcsOSArMjAyLDcgQEAKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwKICAgICAgICAgICAgIHNpemVfdCByYW5nZU9mZnNldCwgc2l6ZV90IHJhbmdlTGVuZ3RoLAogICAgICAgICAgICAgT01YX1UzMiBmbGFncywKLSAgICAgICAgICAgIGludDY0X3QgdGltZVVzLAotICAgICAgICAgICAgdm9pZCAqcGxhdGZvcm1Qcml2YXRlLAotICAgICAgICAgICAgdm9pZCAqZGF0YVB0cik7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyk7CiAKICAgICB2b2lkIGdldE1vcmVJbnB1dERhdGFJZlBvc3NpYmxlKCk7CiAKQEAgLTM2MCwyMiArNDAzLDI3IEBACiAKIEFDb2RlYzo6QUNvZGVjKCkKICAgICA6IG1RdWlya3MoMCksCi0gICAgICBtTm9kZShOVUxMKSwKKyAgICAgIG1Ob2RlKDApLAogICAgICAgbVNlbnRGb3JtYXQoZmFsc2UpLAogICAgICAgbUlzRW5jb2RlcihmYWxzZSksCiAgICAgICBtVXNlTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQoZmFsc2UpLAogICAgICAgbUZhdGFsRXJyb3IoZmFsc2UpLAogICAgICAgbVNodXRkb3duSW5Qcm9ncmVzcyhmYWxzZSksCi0gICAgICBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayhmYWxzZSksCisgICAgICBtRXhwbGljaXRTaHV0ZG93bihmYWxzZSksCiAgICAgICBtRW5jb2RlckRlbGF5KDApLAogICAgICAgbUVuY29kZXJQYWRkaW5nKDApLAorICAgICAgbVJvdGF0aW9uRGVncmVlcygwKSwKICAgICAgIG1DaGFubmVsTWFza1ByZXNlbnQoZmFsc2UpLAogICAgICAgbUNoYW5uZWxNYXNrKDApLAogICAgICAgbURlcXVldWVDb3VudGVyKDApLAogICAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMoZmFsc2UpLAogICAgICAgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0KDApLAogICAgICAgbVJlcGVhdEZyYW1lRGVsYXlVcygtMWxsKSwKLSAgICAgIG1NYXhQdHNHYXBVcygtMWwpIHsKKyAgICAgIG1NYXhQdHNHYXBVcygtMWxsKSwKKyAgICAgIG1UaW1lUGVyRnJhbWVVcygtMWxsKSwKKyAgICAgIG1UaW1lUGVyQ2FwdHVyZVVzKC0xbGwpLAorICAgICAgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZChmYWxzZSksCisgICAgICBtVHVubmVsZWQoZmFsc2UpIHsKICAgICBtVW5pbml0aWFsaXplZFN0YXRlID0gbmV3IFVuaW5pdGlhbGl6ZWRTdGF0ZSh0aGlzKTsKICAgICBtTG9hZGVkU3RhdGUgPSBuZXcgTG9hZGVkU3RhdGUodGhpcyk7CiAgICAgbUxvYWRlZFRvSWRsZVN0YXRlID0gbmV3IExvYWRlZFRvSWRsZVN0YXRlKHRoaXMpOwpAQCAtNDUxLDYgKzQ5OSwxMCBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgaWQoKSk7CiAgICAgbXNnLT5zZXRJbnQzMigia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOwogICAgIG1zZy0+cG9zdCgpOworICAgIGlmICgha2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgICAgICAvLyBlbnN1cmUgc2h1dGRvd24gY29tcGxldGVzIGluIDMgc2Vjb25kcworICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UsIGlkKCkpKS0+cG9zdCgzMDAwMDAwKTsKKyAgICB9CiB9CiAKIHZvaWQgQUNvZGVjOjpzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSB7CkBAIC00OTEsNyArNTQzLDcgQEAKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwogCiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJWx1IGJ1ZmZlcnMgb2Ygc2l6ZSAlbHUgb24gJXMgcG9ydCIsCisgICAgICAgICAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICV1IGJ1ZmZlcnMgb2Ygc2l6ZSAldSBvbiAlcyBwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgZGVmLm5CdWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKQEAgLTU0Nyw3ICs1OTksNyBAQAogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZCk7CiAKICAgICBub3RpZnktPnNldEludDMyKCJwb3J0SW5kZXgiLCBwb3J0SW5kZXgpOwogCkBAIC01OTEsNiArNjQzLDI3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKG1Sb3RhdGlvbkRlZ3JlZXMgIT0gMCkgeworICAgICAgICB1aW50MzJfdCB0cmFuc2Zvcm0gPSAwOworICAgICAgICBzd2l0Y2ggKG1Sb3RhdGlvbkRlZ3JlZXMpIHsKKyAgICAgICAgICAgIGNhc2UgMDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF85MDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMTgwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjcwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhbnNmb3JtID4gMCkgeworICAgICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHRyYW5zZm9ybSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0gZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gU2V0IHVwIHRoZSBuYXRpdmUgd2luZG93LgogICAgIE9NWF9VMzIgdXNhZ2UgPSAwOwogICAgIGVyciA9IG1PTVgtPmdldEdyYXBoaWNCdWZmZXJVc2FnZShtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgJnVzYWdlKTsKQEAgLTYzMiw2ICs3MDUsMjEgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICAvLyBFeGl0cyBoZXJlIGZvciB0dW5uZWxlZCB2aWRlbyBwbGF5YmFjayBjb2RlY3MgLS0gaS5lLiBza2lwcyBuYXRpdmUgd2luZG93CisgICAgLy8gYnVmZmVyIGFsbG9jYXRpb24gc3RlcCBhcyB0aGlzIGlzIG1hbmFnZWQgYnkgdGhlIHR1bm5lbGVkIE9NWCBvbXBvbmVudAorICAgIC8vIGl0c2VsZiBhbmQgZXhwbGljaXRseSBzZXRzIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgdG8gMC4KKyAgICBpZiAobVR1bm5lbGVkKSB7CisgICAgICAgIEFMT0dWKCJUdW5uZWxlZCBQbGF5YmFjazogc2tpcHBpbmcgbmF0aXZlIHdpbmRvdyBidWZmZXIgYWxsb2NhdGlvbi4iKTsKKyAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IDA7CisgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOworCisgICAgICAgICptaW5VbmRlcXVldWVkQnVmZmVycyA9IDA7CisgICAgICAgICpidWZmZXJDb3VudCA9IDA7CisgICAgICAgICpidWZmZXJTaXplID0gMDsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPSAwOwogICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAogICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLApAQCAtNjQzLDE4ICs3MzEsMzQgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICAvLyBYWFg6IElzIHRoaXMgdGhlIHJpZ2h0IGxvZ2ljIHRvIHVzZT8gIEl0J3Mgbm90IGNsZWFyIHRvIG1lIHdoYXQgdGhlIE9NWAotICAgIC8vIGJ1ZmZlciBjb3VudHMgcmVmZXIgdG8gLSBob3cgZG8gdGhleSBhY2NvdW50IGZvciB0aGUgcmVuZGVyZXIgaG9sZGluZyBvbgotICAgIC8vIHRvIGJ1ZmZlcnM/Ci0gICAgaWYgKGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPCBkZWYubkJ1ZmZlckNvdW50TWluICsgKm1pblVuZGVxdWV1ZWRCdWZmZXJzKSB7Ci0gICAgICAgIE9NWF9VMzIgbmV3QnVmZmVyQ291bnQgPSBkZWYubkJ1ZmZlckNvdW50TWluICsgKm1pblVuZGVxdWV1ZWRCdWZmZXJzOworICAgIC8vIEZJWE1FOiBhc3N1bWUgdGhhdCBzdXJmYWNlIGlzIGNvbnRyb2xsZWQgYnkgYXBwIChuYXRpdmUgd2luZG93CisgICAgLy8gcmV0dXJucyB0aGUgbnVtYmVyIGZvciB0aGUgY2FzZSB3aGVuIHN1cmZhY2UgaXMgbm90IGNvbnRyb2xsZWQgYnkgYXBwKQorICAgIC8vIEZJWE1FMjogVGhpcyBtZWFucyB0aGF0IG1pblVuZGVxZXVldWRCdWZzIGNhbiBiZSAxIGxhcmdlciB0aGFuIHJlcG9ydGVkCisgICAgLy8gRm9yIG5vdywgdHJ5IHRvIGFsbG9jYXRlIDEgbW9yZSBidWZmZXIsIGJ1dCBkb24ndCBmYWlsIGlmIHVuc3VjY2Vzc2Z1bAorCisgICAgLy8gVXNlIGNvbnNlcnZhdGl2ZSBhbGxvY2F0aW9uIHdoaWxlIGFsc28gdHJ5aW5nIHRvIHJlZHVjZSBzdGFydmF0aW9uCisgICAgLy8KKyAgICAvLyAxLiBhbGxvY2F0ZSBhdCBsZWFzdCBuQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmZmVycyAtIHRoYXQgaXMgdGhlCisgICAgLy8gICAgbWluaW11bSBuZWVkZWQgZm9yIHRoZSBjb25zdW1lciB0byBiZSBhYmxlIHRvIHdvcmsKKyAgICAvLyAyLiB0cnkgdG8gYWxsb2NhdGUgdHdvICgyKSBhZGRpdGlvbmFsIGJ1ZmZlcnMgdG8gcmVkdWNlIHN0YXJ2YXRpb24gZnJvbQorICAgIC8vICAgIHRoZSBjb25zdW1lcgorICAgIC8vICAgIHBsdXMgYW4gZXh0cmEgYnVmZmVyIHRvIGFjY291bnQgZm9yIGluY29ycmVjdCBtaW5VbmRlcXVldWVkQnVmcworICAgIGZvciAoT01YX1UzMiBleHRyYUJ1ZmZlcnMgPSAyICsgMTsgLyogY29uZGl0aW9uIGluc2lkZSBsb29wICovOyBleHRyYUJ1ZmZlcnMtLSkgeworICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0KKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gKyAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgKyBleHRyYUJ1ZmZlcnM7CiAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBuZXdCdWZmZXJDb3VudDsKICAgICAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CiAKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIlslc10gc2V0dGluZyBuQnVmZmVyQ291bnRBY3R1YWwgdG8gJWx1IGZhaWxlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBuZXdCdWZmZXJDb3VudCwgZXJyKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgKm1pblVuZGVxdWV1ZWRCdWZmZXJzICs9IGV4dHJhQnVmZmVyczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1coIlslc10gc2V0dGluZyBuQnVmZmVyQ291bnRBY3R1YWwgdG8gJXUgZmFpbGVkOiAlZCIsCisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbmV3QnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIC8qIGV4aXQgY29uZGl0aW9uICovCisgICAgICAgIGlmIChleHRyYUJ1ZmZlcnMgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KQEAgLTY3OSw4ICs3ODMsOSBAQAogICAgICAgICAgICAgJmJ1ZmZlckNvdW50LCAmYnVmZmVyU2l6ZSwgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKICAgICBpZiAoZXJyICE9IDApCiAgICAgICAgIHJldHVybiBlcnI7CisgICAgbU51bVVuZGVxdWV1ZWRCdWZmZXJzID0gbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CiAKLSAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICVsdSBidWZmZXJzIGZyb20gYSBuYXRpdmUgd2luZG93IG9mIHNpemUgJWx1IG9uICIKKyAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICV1IGJ1ZmZlcnMgZnJvbSBhIG5hdGl2ZSB3aW5kb3cgb2Ygc2l6ZSAldSBvbiAiCiAgICAgICAgICAib3V0cHV0IHBvcnQiLAogICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwogCkBAIC03MDQsMTQgKzgwOSwxNCBAQAogICAgICAgICBlcnIgPSBtT01YLT51c2VHcmFwaGljQnVmZmVyKG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBncmFwaGljQnVmZmVyLAogICAgICAgICAgICAgICAgICZidWZmZXJJZCk7CiAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoInJlZ2lzdGVyaW5nIEdyYXBoaWNCdWZmZXIgJWx1IHdpdGggT01YIElMIGNvbXBvbmVudCBmYWlsZWQ6ICIKKyAgICAgICAgICAgIEFMT0dFKCJyZWdpc3RlcmluZyBHcmFwaGljQnVmZmVyICV1IHdpdGggT01YIElMIGNvbXBvbmVudCBmYWlsZWQ6ICIKICAgICAgICAgICAgICAgICAgIiVkIiwgaSwgZXJyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKS5tQnVmZmVySUQgPSBidWZmZXJJZDsKIAotICAgICAgICBBTE9HVigiWyVzXSBSZWdpc3RlcmVkIGdyYXBoaWMgYnVmZmVyIHdpdGggSUQgJXAgKHBvaW50ZXIgPSAlcCkiLAorICAgICAgICBBTE9HVigiWyVzXSBSZWdpc3RlcmVkIGdyYXBoaWMgYnVmZmVyIHdpdGggSUQgJXUgKHBvaW50ZXIgPSAlcCkiLAogICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgYnVmZmVySWQsIGdyYXBoaWNCdWZmZXIuZ2V0KCkpOwogICAgIH0KQEAgLTczMiw3ICs4MzcsMTAgQEAKIAogICAgIGZvciAoT01YX1UzMiBpID0gY2FuY2VsU3RhcnQ7IGkgPCBjYW5jZWxFbmQ7IGkrKykgewogICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSk7Ci0gICAgICAgIGNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KGluZm8pOworICAgICAgICBzdGF0dXNfdCBlcnJvciA9IGNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KGluZm8pOworICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgIGVyciA9IGVycm9yOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIGVycjsKQEAgLTc0NCw4ICs4NTIsOSBAQAogICAgICAgICAgICAgJmJ1ZmZlckNvdW50LCAmYnVmZmVyU2l6ZSwgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKICAgICBpZiAoZXJyICE9IDApCiAgICAgICAgIHJldHVybiBlcnI7CisgICAgbU51bVVuZGVxdWV1ZWRCdWZmZXJzID0gbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CiAKLSAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICVsdSBtZXRhIGJ1ZmZlcnMgb24gb3V0cHV0IHBvcnQiLAorICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJXUgbWV0YSBidWZmZXJzIG9uIG91dHB1dCBwb3J0IiwKICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlckNvdW50KTsKIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSBidWZmZXJDb3VudCAqIDg7CkBAIC03NzEsNyArODgwLDcgQEAKIAogICAgICAgICBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5wdXNoKGluZm8pOwogCi0gICAgICAgIEFMT0dWKCJbJXNdIGFsbG9jYXRlZCBtZXRhIGJ1ZmZlciB3aXRoIElEICVwIChwb2ludGVyID0gJXApIiwKKyAgICAgICAgQUxPR1YoIlslc10gYWxsb2NhdGVkIG1ldGEgYnVmZmVyIHdpdGggSUQgJXUgKHBvaW50ZXIgPSAlcCkiLAogICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8ubUJ1ZmZlcklELCBtZW0tPnBvaW50ZXIoKSk7CiAgICAgfQogCkBAIC03ODgsNyArODk3LDcgQEAKICAgICBpZiAoaW5mbyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRVJST1JfSU87CiAKLSAgICBBTE9HVigiWyVzXSBzdWJtaXR0aW5nIG91dHB1dCBtZXRhIGJ1ZmZlciBJRCAlcCBmb3IgZ3JhcGhpYyBidWZmZXIgJXAiLAorICAgIEFMT0dWKCJbJXNdIHN1Ym1pdHRpbmcgb3V0cHV0IG1ldGEgYnVmZmVyIElEICV1IGZvciBncmFwaGljIGJ1ZmZlciAlcCIsCiAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklELCBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSk7CiAKICAgICAtLW1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdDsKQEAgLTgwMiwxNyArOTExLDE4IEBACiBzdGF0dXNfdCBBQ29kZWM6OmNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KEJ1ZmZlckluZm8gKmluZm8pIHsKICAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsIChpbnQpQnVmZmVySW5mbzo6T1dORURfQllfVVMpOwogCi0gICAgQUxPR1YoIlslc10gQ2FsbGluZyBjYW5jZWxCdWZmZXIgb24gYnVmZmVyICVwIiwKKyAgICBBTE9HVigiWyVzXSBDYWxsaW5nIGNhbmNlbEJ1ZmZlciBvbiBidWZmZXIgJXUiLAogICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIGludCBlcnIgPSBtTmF0aXZlV2luZG93LT5jYW5jZWxCdWZmZXIoCiAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIGluZm8tPm1HcmFwaGljQnVmZmVyLmdldCgpLCAtMSk7CiAKLSAgICBDSEVDS19FUShlcnIsIDApOworICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiWyVzXSBjYW4gbm90IHJldHVybiBidWZmZXIgJXUgdG8gbmF0aXZlIHdpbmRvdyIsCisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1c7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIGVycjsKIH0KIAogQUNvZGVjOjpCdWZmZXJJbmZvICpBQ29kZWM6OmRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgewpAQCAtODIwLDYgKzkzMCwxMiBAQAogICAgIGludCBmZW5jZUZkID0gLTE7CiAgICAgQ0hFQ0sobU5hdGl2ZVdpbmRvdy5nZXQoKSAhPSBOVUxMKTsKIAorICAgIGlmIChtVHVubmVsZWQpIHsKKyAgICAgICAgQUxPR1coImRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gdHVubmVsIgorICAgICAgICAgICAgICAiIHZpZGVvIHBsYXliYWNrIG1vZGUgbW9kZSEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgaWYgKG1GYXRhbEVycm9yKSB7CiAgICAgICAgIEFMT0dXKCJub3QgZGVxdWV1aW5nIGZyb20gbmF0aXZlIHdpbmRvdyBkdWUgdG8gZmF0YWwgZXJyb3IiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC05MTgsNyArMTAzNCw3IEBACiAKICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMCiAgICAgICAgICAgICAmJiBpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKSB7Ci0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbykpOworICAgICAgICBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKICAgICB9CiAKICAgICBDSEVDS19FUShtT01YLT5mcmVlQnVmZmVyKApAQCAtOTcyLDEyICsxMDg4LDE2IEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiLCAiYXVkaW9fZW5jb2Rlci5hYWMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgImF1ZGlvX2VuY29kZXIudm9yYmlzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwgImF1ZGlvX2VuY29kZXIub3B1cyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFtbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiwgImF1ZGlvX2VuY29kZXIuZzcxMWFsYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuYXZjIiwgInZpZGVvX2VuY29kZXIuYXZjIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIiwgInZpZGVvX2VuY29kZXIuaGV2YyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IiwgInZpZGVvX2VuY29kZXIubXBlZzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywKQEAgLTEwNDcsNiArMTE2Nyw5IEBACiAgICAgICAgIGVuY29kZXIgPSBmYWxzZTsKICAgICB9CiAKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKICAgICBtSXNFbmNvZGVyID0gZW5jb2RlcjsKIAogICAgIHN0YXR1c190IGVyciA9IHNldENvbXBvbmVudFJvbGUoZW5jb2RlciAvKiBpc0VuY29kZXIgKi8sIG1pbWUpOwpAQCAtMTEyOSw3NCArMTI1MiwxMjQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiLCAmbU1heFB0c0dhcFVzKSkgewotICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gLTFsOworICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gLTFsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWUtbGFwc2UiLCAmbVRpbWVQZXJDYXB0dXJlVXMpKSB7CisgICAgICAgICAgICBtVGltZVBlckNhcHR1cmVVcyA9IC0xbGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSZtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSkgeworICAgICAgICAgICAgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQWx3YXlzIHRyeSB0byBlbmFibGUgZHluYW1pYyBvdXRwdXQgYnVmZmVycyBvbiBuYXRpdmUgc3VyZmFjZQogICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICBpbnQzMl90IGhhdmVOYXRpdmVXaW5kb3cgPSBtc2ctPmZpbmRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCAmb2JqKSAmJgotICAgICAgICAgICAgb2JqICE9IE5VTEw7CisgICAgICAgIG9iaiAhPSBOVUxMOwogICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzID0gZmFsc2U7Ci0gICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2sgPSBmYWxzZTsKKyAgICBpZiAodmlkZW8gJiYgIWVuY29kZXIpIHsKKyAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIGZhbHNlKTsKKyAgICB9CiAgICAgaWYgKCFlbmNvZGVyICYmIHZpZGVvICYmIGhhdmVOYXRpdmVXaW5kb3cpIHsKLSAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIGZhaWxlZCB3LyBlcnIgJWQiLAotICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gd2luZG93V3JhcHBlcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpOworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3cgPSB3aW5kb3dXcmFwcGVyLT5nZXROYXRpdmVXaW5kb3coKTsKIAotICAgICAgICAgICAgLy8gaWYgYWRhcHRpdmUgcGxheWJhY2sgaGFzIGJlZW4gcmVxdWVzdGVkLCB0cnkgSkIgZmFsbGJhY2sKLSAgICAgICAgICAgIC8vIE5PVEU6IFRISVMgRkFMTEJBQ0sgTUVDSEFOSVNNIFdJTEwgQkUgUkVNT1ZFRCBEVUUgVE8gSVRTCi0gICAgICAgICAgICAvLyBMQVJHRSBNRU1PUlkgUkVRVUlSRU1FTlQKKyAgICAgICAgaW50MzJfdCB0dW5uZWxlZDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIiwgJnR1bm5lbGVkKSAmJgorICAgICAgICAgICAgdHVubmVsZWQgIT0gMCkgeworICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIFRVTk5FTEVEIHZpZGVvIHBsYXliYWNrLiIpOworICAgICAgICAgICAgbVR1bm5lbGVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgLy8gd2Ugd2lsbCBub3QgZG8gYWRhcHRpdmUgcGxheWJhY2sgb24gc29mdHdhcmUgYWNjZXNzZWQKLSAgICAgICAgICAgIC8vIHN1cmZhY2VzIGFzIHRoZXkgbmV2ZXIgaGFkIHRvIHJlc3BvbmQgdG8gY2hhbmdlcyBpbiB0aGUKLSAgICAgICAgICAgIC8vIGNyb3Agd2luZG93LCBhbmQgd2UgZG9uJ3QgdHJ1c3QgdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0by4KLSAgICAgICAgICAgIGludCB1c2FnZUJpdHMgPSAwOwotICAgICAgICAgICAgYm9vbCBjYW5Eb0FkYXB0aXZlUGxheWJhY2s7Ci0KLSAgICAgICAgICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IHdpbmRvd1dyYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE5hdGl2ZVdpbmRvd1dyYXBwZXIgKj4ob2JqLmdldCgpKSk7Ci0gICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3cgPSB3aW5kb3dXcmFwcGVyLT5nZXROYXRpdmVXaW5kb3coKTsKLQotICAgICAgICAgICAgaWYgKG5hdGl2ZVdpbmRvdy0+cXVlcnkoCi0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAotICAgICAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzKSAhPSBPSykgewotICAgICAgICAgICAgICAgIGNhbkRvQWRhcHRpdmVQbGF5YmFjayA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYW5Eb0FkYXB0aXZlUGxheWJhY2sgPQotICAgICAgICAgICAgICAgICAgICAodXNhZ2VCaXRzICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0spKSA9PSAwOworICAgICAgICAgICAgaW50MzJfdCBhdWRpb0h3U3luYyA9IDA7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhdWRpby1ody1zeW5jIiwgJmF1ZGlvSHdTeW5jKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJObyBBdWRpbyBIVyBTeW5jIHByb3ZpZGVkIGZvciB2aWRlbyB0dW5uZWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGNvbmZpZ3VyZVR1bm5lbGVkVmlkZW9QbGF5YmFjayhhdWRpb0h3U3luYywgbmF0aXZlV2luZG93KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrKCVkLCVwKSBmYWlsZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvSHdTeW5jLCBuYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGggPSAwLCBtYXhIZWlnaHQgPSAwOwotICAgICAgICAgICAgaWYgKGNhbkRvQWRhcHRpdmVQbGF5YmFjayAmJgotICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJtYXgtd2lkdGgiLCAmbWF4V2lkdGgpICYmCi0gICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKCVsZHglbGQpIiwKLSAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAiWyVzXSBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayBmYWlsZWQgdy8gZXJyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7Ci0gICAgICAgICAgICAgICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2sgPSAoZXJyID09IE9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGFsbG93IGZhaWx1cmUKLSAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIHRydWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlslc10gc3RvcmVNZXRhRGF0YUluQnVmZmVycyBzdWNjZWVkZWQiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzID0gdHJ1ZTsKLSAgICAgICAgICAgIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJDb25maWd1cmluZyBDUFUgY29udHJvbGxlZCB2aWRlbyBwbGF5YmFjay4iKTsKKyAgICAgICAgICAgIG1UdW5uZWxlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBBbHdheXMgdHJ5IHRvIGVuYWJsZSBkeW5hbWljIG91dHB1dCBidWZmZXJzIG9uIG5hdGl2ZSBzdXJmYWNlCisgICAgICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAorICAgICAgICAgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgZmFpbGVkIHcvIGVyciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworCisgICAgICAgICAgICAgICAgLy8gaWYgYWRhcHRpdmUgcGxheWJhY2sgaGFzIGJlZW4gcmVxdWVzdGVkLCB0cnkgSkIgZmFsbGJhY2sKKyAgICAgICAgICAgICAgICAvLyBOT1RFOiBUSElTIEZBTExCQUNLIE1FQ0hBTklTTSBXSUxMIEJFIFJFTU9WRUQgRFVFIFRPIElUUworICAgICAgICAgICAgICAgIC8vIExBUkdFIE1FTU9SWSBSRVFVSVJFTUVOVAorCisgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBub3QgZG8gYWRhcHRpdmUgcGxheWJhY2sgb24gc29mdHdhcmUgYWNjZXNzZWQKKyAgICAgICAgICAgICAgICAvLyBzdXJmYWNlcyBhcyB0aGV5IG5ldmVyIGhhZCB0byByZXNwb25kIHRvIGNoYW5nZXMgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gY3JvcCB3aW5kb3csIGFuZCB3ZSBkb24ndCB0cnVzdCB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvLgorICAgICAgICAgICAgICAgIGludCB1c2FnZUJpdHMgPSAwOworICAgICAgICAgICAgICAgIGJvb2wgY2FuRG9BZGFwdGl2ZVBsYXliYWNrOworCisgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZVdpbmRvdy0+cXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0NPTlNVTUVSX1VTQUdFX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBjYW5Eb0FkYXB0aXZlUGxheWJhY2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYW5Eb0FkYXB0aXZlUGxheWJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHVzYWdlQml0cyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0spKSA9PSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGggPSAwLCBtYXhIZWlnaHQgPSAwOworICAgICAgICAgICAgICAgIGlmIChjYW5Eb0FkYXB0aXZlUGxheWJhY2sgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJtYXgtd2lkdGgiLCAmbWF4V2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibWF4LWhlaWdodCIsICZtYXhIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKCVkeCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbWF4V2lkdGgsIG1heEhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCBtYXhXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlslc10gcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2sgZmFpbGVkIHcvIGVyciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoIm1heC13aWR0aCIsIG1heFdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigibWF4LWhlaWdodCIsIG1heEhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWxsb3cgZmFpbHVyZQorICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIHN1Y2NlZWRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyA9IHRydWU7CisgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIHRydWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IHB1c2g7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biIsICZwdXNoKQorICAgICAgICAgICAgICAgICAgICAmJiBwdXNoICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdQdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3dPblNodXRkb3duOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBwdXNoOwotICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biIsICZwdXNoKQotICAgICAgICAgICAgICAgICYmIHB1c2ggIT0gMCkgewotICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnUHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93T25TaHV0ZG93bjsKKyAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgICAgICBtUm90YXRpb25EZWdyZWVzID0gcm90YXRpb25EZWdyZWVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJvdGF0aW9uRGVncmVlcyA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMDQsMTMgKzEzNzcsNyBAQAogICAgICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWltZSwgbXNnKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQotICAgICAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IHNldHVwVmlkZW9EZWNvZGVyKG1pbWUsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gc2V0dXBWaWRlb0RlY29kZXIobWltZSwgbXNnKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKQEAgLTEyMzIsMTYgKzEzOTksNTIgQEAKICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50MzJfdCBpc0FEVFMsIGFhY1Byb2ZpbGU7CisgICAgICAgICAgICBpbnQzMl90IHNick1vZGU7CisgICAgICAgICAgICBpbnQzMl90IG1heE91dHB1dENoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3QgcGNtTGltaXRlckVuYWJsZTsKKyAgICAgICAgICAgIGRyY1BhcmFtc190IGRyYzsKICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImlzLWFkdHMiLCAmaXNBRFRTKSkgewogICAgICAgICAgICAgICAgIGlzQURUUyA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtcHJvZmlsZSIsICZhYWNQcm9maWxlKSkgewogICAgICAgICAgICAgICAgIGFhY1Byb2ZpbGUgPSBPTVhfQVVESU9fQUFDT2JqZWN0TnVsbDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1zYnItbW9kZSIsICZzYnJNb2RlKSkgeworICAgICAgICAgICAgICAgIHNick1vZGUgPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCIsICZtYXhPdXRwdXRDaGFubmVsQ291bnQpKSB7CisgICAgICAgICAgICAgICAgbWF4T3V0cHV0Q2hhbm5lbENvdW50ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtcGNtLWxpbWl0ZXItZW5hYmxlIiwgJnBjbUxpbWl0ZXJFbmFibGUpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIHBjbUxpbWl0ZXJFbmFibGUgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1lbmNvZGVkLXRhcmdldC1sZXZlbCIsICZkcmMuZW5jb2RlZFRhcmdldExldmVsKSkgeworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KKyAgICAgICAgICAgICAgICBkcmMuZW5jb2RlZFRhcmdldExldmVsID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtZHJjLWN1dC1sZXZlbCIsICZkcmMuZHJjQ3V0KSkgeworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KKyAgICAgICAgICAgICAgICBkcmMuZHJjQ3V0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtZHJjLWJvb3N0LWxldmVsIiwgJmRyYy5kcmNCb29zdCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmRyY0Jvb3N0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtZHJjLWhlYXZ5LWNvbXByZXNzaW9uIiwgJmRyYy5oZWF2eUNvbXByZXNzaW9uKSkgeworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KKyAgICAgICAgICAgICAgICBkcmMuaGVhdnlDb21wcmVzc2lvbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXRhcmdldC1yZWYtbGV2ZWwiLCAmZHJjLnRhcmdldFJlZkxldmVsKSkgeworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KKyAgICAgICAgICAgICAgICBkcmMudGFyZ2V0UmVmTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZXJyID0gc2V0dXBBQUNDb2RlYygKICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGJpdFJhdGUsIGFhY1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgIGlzQURUUyAhPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgaXNBRFRTICE9IDAsIHNick1vZGUsIG1heE91dHB1dENoYW5uZWxDb3VudCwgZHJjLAorICAgICAgICAgICAgICAgICAgICBwY21MaW1pdGVyRW5hYmxlKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKSkgewogICAgICAgICBlcnIgPSBzZXR1cEFNUkNvZGVjKGVuY29kZXIsIGZhbHNlIC8qIGlzV0FNUiAqLywgYml0UmF0ZSk7CkBAIC0xMjY4LDggKzE0NzEsMTAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxleGl0eSIsICZjb21wcmVzc2lvbkxldmVsKSAmJgorICAgICAgICAgICAgICAgICAgICAhbXNnLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiLCAmY29tcHJlc3Npb25MZXZlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25MZXZlbCA9IDU7Ly8gZGVmYXVsdCBGTEFDIGNvbXByZXNzaW9uIGxldmVsCisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTGV2ZWwgPSA1OyAvLyBkZWZhdWx0IEZMQUMgY29tcHJlc3Npb24gbGV2ZWwKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXByZXNzaW9uTGV2ZWwgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb21wcmVzc2lvbiBsZXZlbCAlZCBvdXRzaWRlIFswLi44XSByYW5nZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgMCIsCkBAIC0xMzMwLDYgKzE1MzUsMTEgQEAKICAgICAgICAgZXJyID0gc2V0TWluQnVmZmVyU2l6ZShrUG9ydEluZGV4SW5wdXQsIDgxOTIpOyAgLy8gWFhYCiAgICAgfQogCisgICAgQ0hFQ0tfRVEoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4SW5wdXQsIGlucHV0Rm9ybWF0KSwgKHN0YXR1c190KU9LKTsKKyAgICBDSEVDS19FUShnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIG91dHB1dEZvcm1hdCksIChzdGF0dXNfdClPSyk7CisgICAgbUlucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7CisgICAgbU91dHB1dEZvcm1hdCA9IG91dHB1dEZvcm1hdDsKKwogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTEzOTgsNyArMTYwOCw5IEBACiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBBQUNDb2RlYygKICAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludDMyX3QgYml0UmF0ZSwgaW50MzJfdCBhYWNQcm9maWxlLCBib29sIGlzQURUUykgeworICAgICAgICBpbnQzMl90IGJpdFJhdGUsIGludDMyX3QgYWFjUHJvZmlsZSwgYm9vbCBpc0FEVFMsIGludDMyX3Qgc2JyTW9kZSwKKyAgICAgICAgaW50MzJfdCBtYXhPdXRwdXRDaGFubmVsQ291bnQsIGNvbnN0IGRyY1BhcmFtc190JiBkcmMsCisgICAgICAgIGludDMyX3QgcGNtTGltaXRlckVuYWJsZSkgewogICAgIGlmIChlbmNvZGVyICYmIGlzQURUUykgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0xNDY1LDYgKzE2NzcsMzIgQEAKICAgICAgICAgcHJvZmlsZS5uQUFDRVJ0b29scyA9IE9NWF9BVURJT19BQUNFUk5vbmU7CiAgICAgICAgIHByb2ZpbGUuZUFBQ1Byb2ZpbGUgPSAoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNQcm9maWxlOwogICAgICAgICBwcm9maWxlLmVBQUNTdHJlYW1Gb3JtYXQgPSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkY7CisgICAgICAgIHN3aXRjaCAoc2JyTW9kZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvLyBkaXNhYmxlIHNicgorICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvLyBlbmFibGUgc2luZ2xlLXJhdGUgc2JyCisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgLy8gZW5hYmxlIGR1YWwtcmF0ZSBzYnIKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgLy8gZW5hYmxlIGJvdGggbW9kZXMgLT4gdGhlIGNvZGVjIHdpbGwgZGVjaWRlIHdoaWNoIG1vZGUgc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBzYnIgbW9kZQorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCiAKICAgICAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLCAmcHJvZmlsZSwgc2l6ZW9mKHByb2ZpbGUpKTsKQEAgLTE0OTUsOCArMTczMywyNCBAQAogICAgICAgICAgICAgPyBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0QURUUwogICAgICAgICAgICAgOiBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkY7CiAKLSAgICByZXR1cm4gbU9NWC0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICZwcm9maWxlLCBzaXplb2YocHJvZmlsZSkpOworICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ1BSRVNFTlRBVElPTlRZUEUgcHJlc2VudGF0aW9uOworICAgIHByZXNlbnRhdGlvbi5uTWF4T3V0cHV0Q2hhbm5lbHMgPSBtYXhPdXRwdXRDaGFubmVsQ291bnQ7CisgICAgcHJlc2VudGF0aW9uLm5EcmNDdXQgPSBkcmMuZHJjQ3V0OworICAgIHByZXNlbnRhdGlvbi5uRHJjQm9vc3QgPSBkcmMuZHJjQm9vc3Q7CisgICAgcHJlc2VudGF0aW9uLm5IZWF2eUNvbXByZXNzaW9uID0gZHJjLmhlYXZ5Q29tcHJlc3Npb247CisgICAgcHJlc2VudGF0aW9uLm5UYXJnZXRSZWZlcmVuY2VMZXZlbCA9IGRyYy50YXJnZXRSZWZMZXZlbDsKKyAgICBwcmVzZW50YXRpb24ubkVuY29kZWRUYXJnZXRMZXZlbCA9IGRyYy5lbmNvZGVkVGFyZ2V0TGV2ZWw7CisgICAgcHJlc2VudGF0aW9uLm5QQ01MaW1pdGVyRW5hYmxlID0gcGNtTGltaXRlckVuYWJsZTsKKworICAgIHN0YXR1c190IHJlcyA9IG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzLCB3aWxsIG5vdCBjYXVzZSBjb25maWd1cmF0aW9uIGZhaWx1cmUKKyAgICAgICAgbU9NWC0+c2V0UGFyYW1ldGVyKG1Ob2RlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAmcHJlc2VudGF0aW9uLCBzaXplb2YocHJlc2VudGF0aW9uKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImRpZCBub3Qgc2V0IEF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbiBkdWUgdG8gZXJyb3IgJWQgd2hlbiBzZXR0aW5nIEF1ZGlvQWFjIiwgcmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFDM0NvZGVjKApAQCAtMTY5Myw2ICsxOTQ3LDI3IEBACiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwgJnBjbVBhcmFtcywgc2l6ZW9mKHBjbVBhcmFtcykpOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OmNvbmZpZ3VyZVR1bm5lbGVkVmlkZW9QbGF5YmFjaygKKyAgICAgICAgaW50MzJfdCBhdWRpb0h3U3luYywgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdykgeworICAgIG5hdGl2ZV9oYW5kbGVfdCogc2lkZWJhbmRIYW5kbGU7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIGF1ZGlvSHdTeW5jLCAmc2lkZWJhbmRIYW5kbGUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSBmYWlsZWQhIChlcnIgJWQpLiIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2lkZWJhbmRfc3RyZWFtKG5hdGl2ZVdpbmRvdy5nZXQoKSwgc2lkZWJhbmRIYW5kbGUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbSglcCkgZmFpbGVkISAoZXJyICVkKS4iLAorICAgICAgICAgICAgICAgIHNpZGViYW5kSGFuZGxlLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKICAgICAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQsCkBAIC0xNzE0LDYgKzE5ODksMTcgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBzdWJzdGl0dXRlIGJhY2sgZmxleGlibGUgY29sb3IgZm9ybWF0IHRvIGNvZGVjIHN1cHBvcnRlZCBmb3JtYXQKKyAgICAgICAgT01YX1UzMiBmbGV4aWJsZUVxdWl2YWxlbnQ7CisgICAgICAgIGlmIChjb21wcmVzc2lvbkZvcm1hdCA9PSBPTVhfVklERU9fQ29kaW5nVW51c2VkICYmCisgICAgICAgICAgICAgICAgaXNGbGV4aWJsZUNvbG9yRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgbU9NWCwgbU5vZGUsIGZvcm1hdC5lQ29sb3JGb3JtYXQsICZmbGV4aWJsZUVxdWl2YWxlbnQpICYmCisgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQgPT0gZmxleGlibGVFcXVpdmFsZW50KSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSB1c2luZyBjb2xvciBmb3JtYXQgJSN4IGluIHBsYWNlIG9mICUjeCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGZvcm1hdC5lQ29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIGNvbG9yRm9ybWF0ID0gZm9ybWF0LmVDb2xvckZvcm1hdDsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIGlzIHZpb2xhdGVkIGJ5IFRJJ3MgdmlkZW8gZGVjb2Rlci4KICAgICAgICAgLy8gQ0hFQ0tfRVEoZm9ybWF0Lm5JbmRleCwgaW5kZXgpOwogCkBAIC0xNzc0LDYgKzIwNjAsNyBAQAogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIG1WaWRlb0NvZGluZ1R5cGU7CiB9IGtWaWRlb0NvZGluZ01hcEVudHJ5W10gPSB7CiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIE9NWF9WSURFT19Db2RpbmdBVkMgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIE9NWF9WSURFT19Db2RpbmdIRVZDIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgT01YX1ZJREVPX0NvZGluZ01QRUc0IH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBPTVhfVklERU9fQ29kaW5nSDI2MyB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIsIE9NWF9WSURFT19Db2RpbmdNUEVHMiB9LApAQCAtMTgxNCw3ICsyMTAxLDEzIEBACiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBWaWRlb0RlY29kZXIoCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghbXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQ7CiAgICAgc3RhdHVzX3QgZXJyID0gR2V0VmlkZW9Db2RpbmdUeXBlRnJvbU1pbWUobWltZSwgJmNvbXByZXNzaW9uRm9ybWF0KTsKIApAQCAtMTgyOSw3ICsyMTIyLDIwIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZXJyID0gc2V0U3VwcG9ydGVkT3V0cHV0Rm9ybWF0KCk7CisgICAgaW50MzJfdCB0bXA7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmdG1wKSkgeworICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4odG1wKTsKKyAgICAgICAgZXJyID0gc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKKyAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVklERU9fQ29kaW5nVW51c2VkLCBjb2xvckZvcm1hdCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJbJXNdIGRvZXMgbm90IHN1cHBvcnQgY29sb3IgZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIGVyciA9IHNldFN1cHBvcnRlZE91dHB1dEZvcm1hdCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gc2V0U3VwcG9ydGVkT3V0cHV0Rm9ybWF0KCk7CisgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTkyMCw2ICsyMjI2LDcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBmcmFtZVJhdGUgPSAoZmxvYXQpdG1wOworICAgICAgICBtVGltZVBlckZyYW1lVXMgPSAoaW50NjRfdCkgKDEwMDAwMDAuMGYgLyBmcmFtZVJhdGUpOwogICAgIH0KIAogICAgIHZpZGVvX2RlZi0+eEZyYW1lcmF0ZSA9IChPTVhfVTMyKShmcmFtZVJhdGUgKiA2NTUzNi4wZik7CkBAIC0xOTk0LDYgKzIzMDEsMTAgQEAKICAgICAgICAgICAgIGVyciA9IHNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ0hFVkM6CisgICAgICAgICAgICBlcnIgPSBzZXR1cEhFVkNFbmNvZGVyUGFyYW1ldGVycyhtc2cpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVlA4OgogICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDk6CiAgICAgICAgICAgICBlcnIgPSBzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKG1zZyk7CkBAIC0yMDUyLDcgKzIzNjMsNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgT01YX1UzMiByZXQgPSBmcmFtZVJhdGUgKiBpRnJhbWVzSW50ZXJ2YWw7Ci0gICAgQ0hFQ0socmV0ID4gMSk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMjIyMiw2ICsyNTMyLDU4IEBACiAgICAgcmV0dXJuIHNldHVwRXJyb3JDb3JyZWN0aW9uUGFyYW1ldGVycygpOwogfQogCisvLyBzdGF0aWMKK2ludCAvKiBPTVhfVklERU9fQVZDTEVWRUxUWVBFICovIEFDb2RlYzo6Z2V0QVZDTGV2ZWxGb3IoCisgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHJhdGUsIGludCBiaXRyYXRlLAorICAgICAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgcHJvZmlsZSkgeworICAgIC8vIGNvbnZlcnQgYml0cmF0ZSB0byBtYWluL2Jhc2VsaW5lIHByb2ZpbGUga2JwcyBlcXVpdmFsZW50CisgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTA6CisgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMzAwMCk7IGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDoKKyAgICAgICAgICAgIGJpdHJhdGUgPSBkaXZVcChiaXRyYXRlLCAxMjUwKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMTAwMCk7IGJyZWFrOworICAgIH0KKworICAgIC8vIGNvbnZlcnQgc2l6ZSBhbmQgcmF0ZSB0byBNQnMKKyAgICB3aWR0aCA9IGRpdlVwKHdpZHRoLCAxNik7CisgICAgaGVpZ2h0ID0gZGl2VXAoaGVpZ2h0LCAxNik7CisgICAgaW50IG1icyA9IHdpZHRoICogaGVpZ2h0OworICAgIHJhdGUgKj0gbWJzOworICAgIGludCBtYXhEaW1lbnNpb24gPSBtYXgod2lkdGgsIGhlaWdodCk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGxpbWl0c1tdWzVdID0geworICAgICAgICAvKiAgIE1CcHMgICAgIE1CICAgZGltICBiaXRyYXRlICAgICAgICBsZXZlbCAqLworICAgICAgICB7ICAgIDE0ODUsICAgIDk5LCAgMjgsICAgICA2NCwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKKyAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAxMjgsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCisgICAgICAgIHsgICAgMzAwMCwgICAzOTYsICA1NiwgICAgMTkyLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAorICAgICAgICB7ICAgIDYwMDAsICAgMzk2LCAgNTYsICAgIDM4NCwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKKyAgICAgICAgeyAgIDExODgwLCAgIDM5NiwgIDU2LCAgICA3NjgsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCisgICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAyMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAorICAgICAgICB7ICAgMTk4MDAsICAgNzkyLCAgNzksICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKKyAgICAgICAgeyAgIDIwMjUwLCAgMTYyMCwgMTEzLCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCisgICAgICAgIHsgICA0MDUwMCwgIDE2MjAsIDExMywgIDEwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAorICAgICAgICB7ICAxMDgwMDAsICAzNjAwLCAxNjksICAxNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKKyAgICAgICAgeyAgMjE2MDAwLCAgNTEyMCwgMjAyLCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCisgICAgICAgIHsgIDI0NTc2MCwgIDgxOTIsIDI1NiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAorICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKyAgICAgICAgeyAgNTIyMjQwLCAgODcwNCwgMjYzLCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCisgICAgICAgIHsgIDU4OTgyNCwgMjIwODAsIDQyMCwgMTM1MDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAorICAgICAgICB7ICA5ODMwNDAsIDM2ODY0LCA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKKyAgICAgICAgeyAyMDczNjAwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShsaW1pdHMpOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50ICgmbGltaXQpWzVdID0gbGltaXRzW2ldOworICAgICAgICBpZiAocmF0ZSA8PSBsaW1pdFswXSAmJiBtYnMgPD0gbGltaXRbMV0gJiYgbWF4RGltZW5zaW9uIDw9IGxpbWl0WzJdCisgICAgICAgICAgICAgICAgJiYgYml0cmF0ZSA8PSBsaW1pdFszXSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0WzRdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IGJpdHJhdGUsIGlGcmFtZUludGVydmFsOwogICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkKQEAgLTIzMzAsMTQgKzI2OTIsMTM5IEBACiAgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZSwgYml0cmF0ZU1vZGUpOwogfQogCi1zdGF0dXNfdCBBQ29kZWM6OnNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEhFVkNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgYml0cmF0ZSwgaUZyYW1lSW50ZXJ2YWw7CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKQorICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CiAKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgIGludDMyX3QgdG1wOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1yYXRlIiwgJnRtcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBmcmFtZVJhdGUgPSAoZmxvYXQpdG1wOworICAgIH0KKworICAgIE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSBoZXZjVHlwZTsKKyAgICBJbml0T01YUGFyYW1zKCZoZXZjVHlwZSk7CisgICAgaGV2Y1R5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0hldmMsICZoZXZjVHlwZSwgc2l6ZW9mKGhldmNUeXBlKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgaW50MzJfdCBsZXZlbDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigibGV2ZWwiLCAmbGV2ZWwpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKHByb2ZpbGUsIGxldmVsKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGhldmNUeXBlLmVQcm9maWxlID0gc3RhdGljX2Nhc3Q8T01YX1ZJREVPX0hFVkNQUk9GSUxFVFlQRT4ocHJvZmlsZSk7CisgICAgICAgIGhldmNUeXBlLmVMZXZlbCA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19IRVZDTEVWRUxUWVBFPihsZXZlbCk7CisgICAgfQorCisgICAgLy8gVE9ETzogTmVlZCBPTVggc3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHNldHRpbmcgaUZyYW1lSW50ZXJ2YWwKKworICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvSGV2YywgJmhldmNUeXBlLCBzaXplb2YoaGV2Y1R5cGUpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZSwgYml0cmF0ZU1vZGUpOworfQorCitzdGF0dXNfdCBBQ29kZWM6OnNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgaW50MzJfdCBpRnJhbWVJbnRlcnZhbCA9IDA7CisgICAgc2l6ZV90IHRzTGF5ZXJzID0gMDsKKyAgICBPTVhfVklERU9fQU5EUk9JRF9WUFhURU1QT1JBTExBWUVSUEFUVEVSTlRZUEUgcGF0dGVybiA9CisgICAgICAgIE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmU7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtWcDhMYXllclJhdGVBbGxvY3Rpb24KKyAgICAgICAgW09NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTXQorICAgICAgICBbT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlNdID0geworICAgICAgICB7MTAwLCAxMDAsIDEwMH0sICAvLyAxIGxheWVyCisgICAgICAgIHsgNjAsIDEwMCwgMTAwfSwgIC8vIDIgbGF5ZXJzIHs2MCUsIDQwJX0KKyAgICAgICAgeyA0MCwgIDYwLCAxMDB9LCAgLy8gMyBsYXllcnMgezQwJSwgMjAlLCA0MCV9CisgICAgfTsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmJpdHJhdGUpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbXNnLT5maW5kSW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCAmaUZyYW1lSW50ZXJ2YWwpOworCisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CisKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgIGludDMyX3QgdG1wOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1yYXRlIiwgJnRtcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBmcmFtZVJhdGUgPSAoZmxvYXQpdG1wOworICAgIH0KKworICAgIEFTdHJpbmcgdHNTY2hlbWE7CisgICAgaWYgKG1zZy0+ZmluZFN0cmluZygidHMtc2NoZW1hIiwgJnRzU2NoZW1hKSkgeworICAgICAgICBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMS1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMi1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDI7CisgICAgICAgIH0gZWxzZSBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMy1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgdHMtc2NoZW1hIFslc10iLCB0c1NjaGVtYS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFIHZwOHR5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmdnA4dHlwZSk7CisgICAgdnA4dHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyLAorICAgICAgICAgICAgJnZwOHR5cGUsIHNpemVvZih2cDh0eXBlKSk7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGlmIChpRnJhbWVJbnRlcnZhbCA+IDApIHsKKyAgICAgICAgICAgIHZwOHR5cGUubktleUZyYW1lSW50ZXJ2YWwgPSBzZXRQRnJhbWVzU3BhY2luZyhpRnJhbWVJbnRlcnZhbCwgZnJhbWVSYXRlKTsKKyAgICAgICAgfQorICAgICAgICB2cDh0eXBlLmVUZW1wb3JhbFBhdHRlcm4gPSBwYXR0ZXJuOworICAgICAgICB2cDh0eXBlLm5UZW1wb3JhbExheWVyQ291bnQgPSB0c0xheWVyczsKKyAgICAgICAgaWYgKHRzTGF5ZXJzID4gMCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgdnA4dHlwZS5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSA9CisgICAgICAgICAgICAgICAgICAgIGtWcDhMYXllclJhdGVBbGxvY3Rpb25bdHNMYXllcnMgLSAxXVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYml0cmF0ZU1vZGUgPT0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQpIHsKKyAgICAgICAgICAgIHZwOHR5cGUubk1pblF1YW50aXplciA9IDI7CisgICAgICAgICAgICB2cDh0eXBlLm5NYXhRdWFudGl6ZXIgPSA2MzsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyLAorICAgICAgICAgICAgICAgICZ2cDh0eXBlLCBzaXplb2YodnA4dHlwZSkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiRXh0ZW5kZWQgVlA4IHBhcmFtZXRlcnMgc2V0IGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZSwgYml0cmF0ZU1vZGUpOwogfQogCkBAIC0yNDkzLDE5ICsyOTgwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGludCBtaW5VbmRlcXVldWVkQnVmcyA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVlcnkoCi0gICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCi0gICAgICAgICAgICAmbWluVW5kZXF1ZXVlZEJ1ZnMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiWyVzXSBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMgcXVlcnkgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0KLSAgICAgICAgbWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOwotICAgIH0KLQotICAgIHdoaWxlIChjb3VudEJ1ZmZlcnNPd25lZEJ5TmF0aXZlV2luZG93KCkgPiAoc2l6ZV90KW1pblVuZGVxdWV1ZWRCdWZzCisgICAgd2hpbGUgKGNvdW50QnVmZmVyc093bmVkQnlOYXRpdmVXaW5kb3coKSA+IG1OdW1VbmRlcXVldWVkQnVmZmVycwogICAgICAgICAgICAgJiYgZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIHRoZXNlIGJ1ZmZlcnMgd2lsbCBiZSBzdWJtaXR0ZWQgYXMgcmVndWxhciBidWZmZXJzOyBhY2NvdW50IGZvciB0aGlzCiAgICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyAmJiBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPiAwKSB7CkBAIC0yNTIxLDcgKzI5OTYsNyBAQAogCiAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzICE9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTCiAgICAgICAgICAgICAgICAgJiYgaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XKSB7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSBCdWZmZXIgJXAgb24gcG9ydCAlbGQgc3RpbGwgaGFzIHN0YXR1cyAlZCIsCisgICAgICAgICAgICBBTE9HVigiWyVzXSBCdWZmZXIgJXUgb24gcG9ydCAldSBzdGlsbCBoYXMgc3RhdHVzICVkIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUJ1ZmZlcklELCBwb3J0SW5kZXgsIGluZm8tPm1TdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjU1MSw3OSArMzAyNiwyOTEgQEAKICAgICB9CiB9CiAKLXZvaWQgQUNvZGVjOjpzZW5kRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisvLyBzdGF0aWMKK2Jvb2wgQUNvZGVjOjpkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZwYXJhbXMpIHsKKyAgICBNZWRpYUltYWdlICZpbWFnZSA9IHBhcmFtcy5zTWVkaWFJbWFnZTsKKyAgICBtZW1zZXQoJmltYWdlLCAwLCBzaXplb2YoaW1hZ2UpKTsKIAorICAgIGltYWdlLm1UeXBlID0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOOworICAgIGltYWdlLm1OdW1QbGFuZXMgPSAwOworCisgICAgY29uc3QgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm10ID0gcGFyYW1zLmVDb2xvckZvcm1hdDsKKyAgICBpbWFnZS5tV2lkdGggPSBwYXJhbXMubkZyYW1lV2lkdGg7CisgICAgaW1hZ2UubUhlaWdodCA9IHBhcmFtcy5uRnJhbWVIZWlnaHQ7CisKKyAgICAvLyBvbmx5IHN1cHBvcnRpbmcgWVVWNDIwCisgICAgaWYgKGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyICYmCisgICAgICAgIGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyICYmCisgICAgICAgIGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciAmJgorICAgICAgICBmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpIHsKKyAgICAgICAgQUxPR1coImRvIG5vdCBrbm93IGNvbG9yIGZvcm1hdCAweCV4ID0gJWQiLCBmbXQsIGZtdCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBURU1QT1JBUlkgRklYIGZvciBzb21lIHZlbmRvcnMgdGhhdCBhZHZlcnRpc2Ugc2xpY2VIZWlnaHQgYXMgMAorICAgIGlmIChwYXJhbXMublN0cmlkZSAhPSAwICYmIHBhcmFtcy5uU2xpY2VIZWlnaHQgPT0gMCkgeworICAgICAgICBBTE9HVygidXNpbmcgc2xpY2VIZWlnaHQ9JXUgaW5zdGVhZCBvZiB3aGF0IGNvZGVjIGFkdmVydGlzZWQgKD0wKSIsCisgICAgICAgICAgICAgICAgcGFyYW1zLm5GcmFtZUhlaWdodCk7CisgICAgICAgIHBhcmFtcy5uU2xpY2VIZWlnaHQgPSBwYXJhbXMubkZyYW1lSGVpZ2h0OworICAgIH0KKworICAgIC8vIHdlIG5lZWQgc3RyaWRlIGFuZCBzbGljZS1oZWlnaHQgdG8gYmUgbm9uLXplcm8KKyAgICBpZiAocGFyYW1zLm5TdHJpZGUgPT0gMCB8fCBwYXJhbXMublNsaWNlSGVpZ2h0ID09IDApIHsKKyAgICAgICAgQUxPR1coImNhbm5vdCBkZXNjcmliZSBjb2xvciBmb3JtYXQgMHgleCA9ICVkIHdpdGggc3RyaWRlPSV1IGFuZCBzbGljZUhlaWdodD0ldSIsCisgICAgICAgICAgICAgICAgZm10LCBmbXQsIHBhcmFtcy5uU3RyaWRlLCBwYXJhbXMublNsaWNlSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNldC11cCBZVVYgZm9ybWF0CisgICAgaW1hZ2UubVR5cGUgPSBNZWRpYUltYWdlOjpNRURJQV9JTUFHRV9UWVBFX1lVVjsKKyAgICBpbWFnZS5tTnVtUGxhbmVzID0gMzsKKyAgICBpbWFnZS5tQml0RGVwdGggPSA4OworICAgIGltYWdlLm1QbGFuZVtpbWFnZS5ZXS5tT2Zmc2V0ID0gMDsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubUNvbEluYyA9IDE7CisgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlldLm1Sb3dJbmMgPSBwYXJhbXMublN0cmlkZTsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgIGltYWdlLm1QbGFuZVtpbWFnZS5ZXS5tVmVydFN1YnNhbXBsaW5nID0gMTsKKworICAgIHN3aXRjaCAoZm10KSB7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjogLy8gdXNlZCBmb3IgWVYxMgorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldCA9IHBhcmFtcy5uU3RyaWRlICogcGFyYW1zLm5TbGljZUhlaWdodDsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tUm93SW5jID0gcGFyYW1zLm5TdHJpZGUgLyAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1PZmZzZXQgPSBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldAorICAgICAgICAgICAgICAgICAgICArIChwYXJhbXMublN0cmlkZSAqIHBhcmFtcy5uU2xpY2VIZWlnaHQgLyA0KTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tUm93SW5jID0gcGFyYW1zLm5TdHJpZGUgLyAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAvLyBGSVhNRTogTlYyMSBmb3Igc3ctZW5jb2RlciwgTlYxMiBmb3IgZGVjb2RlciBhbmQgaHctZW5jb2RlcgorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgLy8gTlYxMgorICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQgPSBwYXJhbXMublN0cmlkZSAqIHBhcmFtcy5uU2xpY2VIZWlnaHQ7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1PZmZzZXQgPSBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldCArIDE7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEFDb2RlYzo6ZGVzY3JpYmVDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcykKK3sKKyAgICBPTVhfSU5ERVhUWVBFIGRlc2NyaWJlQ29sb3JGb3JtYXRJbmRleDsKKyAgICBpZiAob214LT5nZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIG5vZGUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVDb2xvckZvcm1hdCIsCisgICAgICAgICAgICAmZGVzY3JpYmVDb2xvckZvcm1hdEluZGV4KSAhPSBPSyB8fAorICAgICAgICBvbXgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG5vZGUsIGRlc2NyaWJlQ29sb3JGb3JtYXRJbmRleCwKKyAgICAgICAgICAgICZkZXNjcmliZVBhcmFtcywgc2l6ZW9mKGRlc2NyaWJlUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaWJlRGVmYXVsdENvbG9yRm9ybWF0KGRlc2NyaWJlUGFyYW1zKTsKKyAgICB9CisgICAgcmV0dXJuIGRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlLm1UeXBlICE9CisgICAgICAgICAgICBNZWRpYUltYWdlOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047Cit9CisKKy8vIHN0YXRpYworYm9vbCBBQ29kZWM6OmlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsIElPTVg6Om5vZGVfaWQgbm9kZSwKKyAgICAgICAgIHVpbnQzMl90IGNvbG9yRm9ybWF0LCBPTVhfVTMyICpmbGV4aWJsZUVxdWl2YWxlbnQpIHsKKyAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zIGRlc2NyaWJlUGFyYW1zOworICAgIEluaXRPTVhQYXJhbXMoJmRlc2NyaWJlUGFyYW1zKTsKKyAgICBkZXNjcmliZVBhcmFtcy5lQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7CisgICAgLy8gcmVhc29uYWJsZSBkdW1teSB2YWx1ZXMKKyAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVXaWR0aCA9IDEyODsKKyAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVIZWlnaHQgPSAxMjg7CisgICAgZGVzY3JpYmVQYXJhbXMublN0cmlkZSA9IDEyODsKKyAgICBkZXNjcmliZVBhcmFtcy5uU2xpY2VIZWlnaHQgPSAxMjg7CisKKyAgICBDSEVDSyhmbGV4aWJsZUVxdWl2YWxlbnQgIT0gTlVMTCk7CisKKyAgICBpZiAoIWRlc2NyaWJlQ29sb3JGb3JtYXQob214LCBub2RlLCBkZXNjcmliZVBhcmFtcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IE1lZGlhSW1hZ2UgJmltZyA9IGRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlOworICAgIGlmIChpbWcubVR5cGUgPT0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9ZVVYpIHsKKyAgICAgICAgaWYgKGltZy5tTnVtUGxhbmVzICE9IDMgfHwKKyAgICAgICAgICAgIGltZy5tUGxhbmVbaW1nLlldLm1Ib3JpelN1YnNhbXBsaW5nICE9IDEgfHwKKyAgICAgICAgICAgIGltZy5tUGxhbmVbaW1nLlldLm1WZXJ0U3Vic2FtcGxpbmcgIT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gWVVWIDQyMAorICAgICAgICBpZiAoaW1nLm1QbGFuZVtpbWcuVV0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgICAgICYmIGltZy5tUGxhbmVbaW1nLlVdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgICAgICYmIGltZy5tUGxhbmVbaW1nLlZdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAmJiBpbWcubVBsYW5lW2ltZy5WXS5tVmVydFN1YnNhbXBsaW5nID09IDIpIHsKKyAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZsZXhpYmxlIFlVVjQyMCBmb3JtYXQKKyAgICAgICAgICAgIGlmIChpbWcubUJpdERlcHRoIDw9IDgpIHsKKyAgICAgICAgICAgICAgICpmbGV4aWJsZUVxdWl2YWxlbnQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6Z2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKKyAgICAvLyBUT0RPOiBjYXRjaCBlcnJvcnMgYW4gcmV0dXJuIHRoZW0gaW5zdGVhZCBvZiB1c2luZyBDSEVDSwogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwogICAgIEluaXRPTVhQYXJhbXMoJmRlZik7Ci0gICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgIGRlZi5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSksCiAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKIAotICAgIENIRUNLX0VRKChpbnQpZGVmLmVEaXIsIChpbnQpT01YX0Rpck91dHB1dCk7CisgICAgQ0hFQ0tfRVEoKGludClkZWYuZURpciwKKyAgICAgICAgICAgIChpbnQpKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ID8gT01YX0Rpck91dHB1dCA6IE9NWF9EaXJJbnB1dCkpOwogCiAgICAgc3dpdGNoIChkZWYuZURvbWFpbikgewogICAgICAgICBjYXNlIE9NWF9Qb3J0RG9tYWluVmlkZW86CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvRGVmID0gJmRlZi5mb3JtYXQudmlkZW87CisgICAgICAgICAgICBzd2l0Y2ggKChpbnQpdmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1VudXNlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Jc0VuY29kZXIgXiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOwogCi0gICAgICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgICAgICBpZiAoIW1Jc0VuY29kZXIpIHsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEdldE1pbWVUeXBlRm9yVmlkZW9Db2RpbmcoCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInN0cmlkZSIsIHZpZGVvRGVmLT5uU3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgdmlkZW9EZWYtPm5TbGljZUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIHZpZGVvRGVmLT5lQ29sb3JGb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgIERlc2NyaWJlQ29sb3JGb3JtYXRQYXJhbXMgZGVzY3JpYmVQYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJmRlc2NyaWJlUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMuZUNvbG9yRm9ybWF0ID0gdmlkZW9EZWYtPmVDb2xvckZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lV2lkdGggPSB2aWRlb0RlZi0+bkZyYW1lV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5GcmFtZUhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5TdHJpZGUgPSB2aWRlb0RlZi0+blN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMublNsaWNlSGVpZ2h0ID0gdmlkZW9EZWYtPm5TbGljZUhlaWdodDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpYmVDb2xvckZvcm1hdChtT01YLCBtTm9kZSwgZGVzY3JpYmVQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlLWRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0SW5kZXggIT0ga1BvcnRJbmRleE91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWxzbyBnZXQgaW5wdXQgY3JvcAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFIHJlY3Q7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnJlY3QpOworICAgICAgICAgICAgICAgICAgICByZWN0Lm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PTVgtPmdldENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIHNpemVvZihyZWN0KSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoID0gdmlkZW9EZWYtPm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uSGVpZ2h0ID0gdmlkZW9EZWYtPm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkxlZnQsIDApOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5Ub3AsIDApOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5XaWR0aCwgMHUpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5IZWlnaHQsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRSZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1ZQODoKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSB2cDh0eXBlOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZ2cDh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdnA4dHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnA4dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodnA4dHlwZSkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdHNTY2hlbWEgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA4dHlwZS5lVGVtcG9yYWxQYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodnA4dHlwZS5uVGVtcG9yYWxMYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4xLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4yLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4zLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoInRzLXNjaGVtYSIsIHRzU2NoZW1hKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gc2V0IHVwIG1pbWUuCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Jc0VuY29kZXIgXiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkpOworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChHZXRNaW1lVHlwZUZvclZpZGVvQ29kaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCwgJm1pbWUpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2lkdGgiLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOwogICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiaGVpZ2h0IiwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7Ci0KLSAgICAgICAgICAgIGlmICghbUlzRW5jb2RlcikgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInN0cmlkZSIsIHZpZGVvRGVmLT5uU3RyaWRlKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCB2aWRlb0RlZi0+blNsaWNlSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCB2aWRlb0RlZi0+ZUNvbG9yRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfUkVDVFRZUEUgcmVjdDsKLSAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZyZWN0KTsKLSAgICAgICAgICAgICAgICByZWN0Lm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotCi0gICAgICAgICAgICAgICAgaWYgKG1PTVgtPmdldENvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCwgc2l6ZW9mKHJlY3QpKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uV2lkdGggPSB2aWRlb0RlZi0+bkZyYW1lV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QubkhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uTGVmdCwgMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uVG9wLCAwKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5XaWR0aCwgMHUpOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkhlaWdodCwgMHUpOwotICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFJlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0UmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjYzNiw3ICszMzIzLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwKQEAgLTI2NTYsMjAgKzMzNDMsNiBAQAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRW5jb2RlckRlbGF5ICsgbUVuY29kZXJQYWRkaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gcGFyYW1zLm5DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZXZidWZzaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmJ1ZnNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZidWZzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2tpcEN1dEJ1ZmZlciA9IG5ldyBTa2lwQ3V0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckRlbGF5ICogZnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5jb2RlclBhZGRpbmcgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsTWFza1ByZXNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtbWFzayIsIG1DaGFubmVsTWFzayk7CkBAIC0yNjgxLDcgKzMzNTQsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLApAQCAtMjY5OCw3ICszMzcxLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLApAQCAtMjcyNCw3ICszMzk3LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9GTEFDVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0ZsYWMsCkBAIC0yNzM3LDExICszNDEwLDQ1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ01QMzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb01wMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdWT1JCSVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkQUMzOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUMzVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCkBAIC0yNzU1LDcgKzM0NjIsNTIgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbXMpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0c3MTE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhcmFtcykpKTsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZU1VTGF3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZUFMYXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcgorICAgICAgICAgICAgICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVU5LTk9XTiBBVURJTyBDT0RJTkc6ICVkXG4iLCBhdWRpb0RlZi0+ZUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjc2NSw2ICszNTE3LDQzIEBACiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIAorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBQ29kZWM6OnNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKTsKKworICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgbm90aWZ5KSwgKHN0YXR1c190KU9LKTsKKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBDSEVDSyhub3RpZnktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fUkFXICYmCisgICAgICAgIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJgorICAgICAgICBub3RpZnktPmZpbmRSZWN0KCJjcm9wIiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgLy8gbm90aWZ5IHJlbmRlcmVyIG9mIHRoZSBjcm9wIGNoYW5nZQorICAgICAgICAvLyBOT1RFOiBuYXRpdmUgd2luZG93IHVzZXMgZXh0ZW5kZWQgcmlnaHQtYm90dG9tIGNvb3JkaW5hdGUKKyAgICAgICAgcmVwbHktPnNldFJlY3QoImNyb3AiLCBsZWZ0LCB0b3AsIHJpZ2h0ICsgMSwgYm90dG9tICsgMSk7CisgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyAmJgorICAgICAgICAgICAgICAgKG1FbmNvZGVyRGVsYXkgfHwgbUVuY29kZXJQYWRkaW5nKSkgeworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgQ0hFQ0sobm90aWZ5LT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmY2hhbm5lbENvdW50KSk7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzaXplX3QgcHJldmJ1ZnNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKHByZXZidWZzaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2YnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRW5jb2RlckRlbGF5ICogZnJhbWVTaXplLAorICAgICAgICAgICAgICAgIG1FbmNvZGVyUGFkZGluZyAqIGZyYW1lU2l6ZSk7CisgICAgfQorCiAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICBtU2VudEZvcm1hdCA9IHRydWU7CkBAIC0yNzcyLDEyICszNTYxLDIyIEBACiAKIHZvaWQgQUNvZGVjOjpzaWduYWxFcnJvcihPTVhfRVJST1JUWVBFIGVycm9yLCBzdGF0dXNfdCBpbnRlcm5hbEVycm9yKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0RXJyb3IpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIm9teC1lcnJvciIsIGVycm9yKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEVycm9yKTsKKyAgICBBTE9HRSgic2lnbmFsRXJyb3Iob214RXJyb3IgJSN4LCBpbnRlcm5hbEVycm9yICVkKSIsIGVycm9yLCBpbnRlcm5hbEVycm9yKTsKKworICAgIGlmIChpbnRlcm5hbEVycm9yID09IFVOS05PV05fRVJST1IpIHsgLy8gZmluZCBiZXR0ZXIgZXJyb3IgY29kZQorICAgICAgICBjb25zdCBzdGF0dXNfdCBvbXhTdGF0dXMgPSBzdGF0dXNGcm9tT01YRXJyb3IoZXJyb3IpOworICAgICAgICBpZiAob214U3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIGludGVybmFsRXJyb3IgPSBvbXhTdGF0dXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiSW52YWxpZCBPTVggZXJyb3IgJSN4IiwgZXJyb3IpOworICAgICAgICB9CisgICAgfQogCiAgICAgbUZhdGFsRXJyb3IgPSB0cnVlOwogCiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgaW50ZXJuYWxFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYWN0aW9uQ29kZSIsIEFDVElPTl9DT0RFX0ZBVEFMKTsgLy8gY291bGQgdHJhbnNsYXRlIGZyb20gT01YIGVycm9yLgogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCkBAIC0yOTc0LDcgKzM3NzMsOCBAQAogICAgICAgbUNvZGVjKGNvZGVjKSB7CiB9CiAKLUFDb2RlYzo6QmFzZVN0YXRlOjpQb3J0TW9kZSBBQ29kZWM6OkJhc2VTdGF0ZTo6Z2V0UG9ydE1vZGUoT01YX1UzMiBwb3J0SW5kZXgpIHsKK0FDb2RlYzo6QmFzZVN0YXRlOjpQb3J0TW9kZSBBQ29kZWM6OkJhc2VTdGF0ZTo6Z2V0UG9ydE1vZGUoCisgICAgICAgIE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgcmV0dXJuIEtFRVBfQlVGRkVSUzsKIH0KIApAQCAtMzAwMCw2ICszODAwLDcgQEAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOgogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtOgogICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSByZXN1bHQgaW4gYW4gYXBwIGlsbGVnYWwgc3RhdGUgZXhjZXB0aW9uLgogICAgICAgICAgICAgQUxPR0UoIk1lc3NhZ2UgMHgleCB3YXMgbm90IGhhbmRsZWQiLCBtc2ctPndoYXQoKSk7CiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMDA3LDExICszODA4LDI1IEBACiAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0T01YRGllZDoKICAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJlc3VsdCBpbiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllIGhhbmRsaW5nIGluIE1lZGlhQ29kZWMuCiAgICAgICAgICAgICBBTE9HRSgiT01YL21lZGlhc2VydmVyIGRpZWQsIHNpZ25hbGxpbmcgZXJyb3IhIik7CiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclJlc291cmNlc0xvc3QsIERFQURfT0JKRUNUKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGZvcmNpbmcgdGhlIHJlbGVhc2Ugb2YgY29kZWMiLAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5mcmVlTm9kZShtQ29kZWMtPm1Ob2RlKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCJbJXNdIGZhaWxlZCB0byByZWxlYXNlIGNvZGVjIGluc3RhbmNlOiBlcnI9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMzAyMyw4ICszODM4LDE2IEBACiAgICAgaW50MzJfdCB0eXBlOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpKTsKIAorICAgIC8vIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGlzIGlzIGFuIG91dHN0YW5kaW5nIG1lc3NhZ2UgZm9yIGEKKyAgICAvLyBjb2RlYyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBkZXN0cm95ZWQKKyAgICBpZiAobUNvZGVjLT5tTm9kZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJpZ25vcmluZyBtZXNzYWdlIGFzIGFscmVhZHkgZnJlZWQgY29tcG9uZW50OiAlcyIsCisgICAgICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBJT01YOjpub2RlX2lkIG5vZGVJRDsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJub2RlIiwgJm5vZGVJRCkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJub2RlIiwgKGludDMyX3QqKSZub2RlSUQpKTsKICAgICBDSEVDS19FUShub2RlSUQsIG1Db2RlYy0+bU5vZGUpOwogCiAgICAgc3dpdGNoICh0eXBlKSB7CkBAIC0zMDU1LDcgKzM4NzgsNyBAQAogICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORToKICAgICAgICAgewogICAgICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiYnVmZmVyIiwgJmJ1ZmZlcklEKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVyIiwgKGludDMyX3QqKSZidWZmZXJJRCkpOwogCiAgICAgICAgICAgICByZXR1cm4gb25PTVhFbXB0eUJ1ZmZlckRvbmUoYnVmZmVySUQpOwogICAgICAgICB9CkBAIC0zMDYzLDI3ICszODg2LDIxIEBACiAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkU6CiAgICAgICAgIHsKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlciIsICZidWZmZXJJRCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlciIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKIAogICAgICAgICAgICAgaW50MzJfdCByYW5nZU9mZnNldCwgcmFuZ2VMZW5ndGgsIGZsYWdzOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGU7Ci0gICAgICAgICAgICB2b2lkICpkYXRhUHRyOwogCiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmFuZ2Vfb2Zmc2V0IiwgJnJhbmdlT2Zmc2V0KSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmFuZ2VfbGVuZ3RoIiwgJnJhbmdlTGVuZ3RoKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXAiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJwbGF0Zm9ybV9wcml2YXRlIiwgJnBsYXRmb3JtUHJpdmF0ZSkpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZGF0YV9wdHIiLCAmZGF0YVB0cikpOwogCiAgICAgICAgICAgICByZXR1cm4gb25PTVhGaWxsQnVmZmVyRG9uZSgKICAgICAgICAgICAgICAgICAgICAgYnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpcmFuZ2VPZmZzZXQsIChzaXplX3QpcmFuZ2VMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgIChPTVhfVTMyKWZsYWdzLAotICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCi0gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgZGF0YVB0cik7CisgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtMzEwMyw3ICszOTIwLDEzIEBACiAKICAgICBBTE9HRSgiWyVzXSBFUlJPUigweCUwOGx4KSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZGF0YTEpOwogCi0gICAgbUNvZGVjLT5zaWduYWxFcnJvcigoT01YX0VSUk9SVFlQRSlkYXRhMSk7CisgICAgLy8gdmVyaWZ5IE9NWCBjb21wb25lbnQgc2VuZHMgYmFjayBhbiBlcnJvciB3ZSBleHBlY3QuCisgICAgT01YX0VSUk9SVFlQRSBvbXhFcnJvciA9IChPTVhfRVJST1JUWVBFKWRhdGExOworICAgIGlmICghaXNPTVhFcnJvcihvbXhFcnJvcikpIHsKKyAgICAgICAgQUxPR1coIkludmFsaWQgT01YIGVycm9yICUjeCIsIG9teEVycm9yKTsKKyAgICAgICAgb214RXJyb3IgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIG1Db2RlYy0+c2lnbmFsRXJyb3Iob214RXJyb3IpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0zMTE4LDIzICszOTQxLDEyIEBACiAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVCk7CiAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwogCi0gICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZidWZmZXJNZXRhID0gaW5mby0+bURhdGEtPm1ldGEoKTsKLSAgICB2b2lkICptZWRpYUJ1ZmZlcjsKLSAgICBpZiAoYnVmZmVyTWV0YS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1lZGlhQnVmZmVyKQotICAgICAgICAgICAgJiYgbWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAvLyBXZSdyZSBpbiAic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIgbW9kZSwgdGhlIHVuZGVybHlpbmcKLSAgICAgICAgLy8gT01YIGNvbXBvbmVudCBoYWQgYWNjZXNzIHRvIGRhdGEgdGhhdCdzIGltcGxpY2l0bHkgcmVmY291bnRlZAotICAgICAgICAvLyBieSB0aGlzICJtZWRpYUJ1ZmZlciIgb2JqZWN0LiBOb3cgdGhhdCB0aGUgT01YIGNvbXBvbmVudCBoYXMKLSAgICAgICAgLy8gdG9sZCB1cyB0aGF0IGl0J3MgZG9uZSB3aXRoIHRoZSBpbnB1dCBidWZmZXIsIHdlIGNhbiBkZWNyZW1lbnQKLSAgICAgICAgLy8gdGhlIG1lZGlhQnVmZmVyJ3MgcmVmZXJlbmNlIGNvdW50LgotCi0gICAgICAgIEFMT0dWKCJyZWxlYXNpbmcgbWJ1ZiAlcCIsIG1lZGlhQnVmZmVyKTsKLQotICAgICAgICAoKE1lZGlhQnVmZmVyICopbWVkaWFCdWZmZXIpLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1lZGlhQnVmZmVyID0gTlVMTDsKLQotICAgICAgICBidWZmZXJNZXRhLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIE5VTEwpOwotICAgIH0KKyAgICAvLyBXZSdyZSBpbiAic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIgbW9kZSwgdGhlIHVuZGVybHlpbmcKKyAgICAvLyBPTVggY29tcG9uZW50IGhhZCBhY2Nlc3MgdG8gZGF0YSB0aGF0J3MgaW1wbGljaXRseSByZWZjb3VudGVkCisgICAgLy8gYnkgdGhpcyAiTWVkaWFCdWZmZXIiIG9iamVjdC4gTm93IHRoYXQgdGhlIE9NWCBjb21wb25lbnQgaGFzCisgICAgLy8gdG9sZCB1cyB0aGF0IGl0J3MgZG9uZSB3aXRoIHRoZSBpbnB1dCBidWZmZXIsIHdlIGNhbiBkZWNyZW1lbnQKKyAgICAvLyB0aGUgbWVkaWFCdWZmZXIncyByZWZlcmVuY2UgY291bnQuCisgICAgaW5mby0+bURhdGEtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKIAogICAgIFBvcnRNb2RlIG1vZGUgPSBnZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQpOwogCkBAIC0zMTY1LDE0ICszOTc3LDE0IEBACiAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXIpOwotICAgIG5vdGlmeS0+c2V0UG9pbnRlcigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZpbGxUaGlzQnVmZmVyKTsKKyAgICBub3RpZnktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+Y2xlYXIoKTsKICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgaW5mby0+bURhdGEpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIG1Db2RlYy0+aWQoKSk7Ci0gICAgcmVwbHktPnNldFBvaW50ZXIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgcmVwbHktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKIApAQCAtMzE4Myw4ICszOTk1LDcgQEAKIAogdm9pZCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJidWZmZXItaWQiLCAmYnVmZmVySUQpKTsKLQorICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwogICAgIGludDMyX3QgZXJyID0gT0s7CiAgICAgYm9vbCBlb3MgPSBmYWxzZTsKQEAgLTMyODgsOCArNDA5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dE1vZGUgPT0gRlJFRV9CVUZGRVJTID8gIkZSRUUiIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TW9kZSA9PSBLRUVQX0JVRkZFUlMgPyAiS0VFUCIgOiAiUkVTVUJNSVQiKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRNb2RlID09IFJFU1VCTUlUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMzM4MiwxMCArNDE5Miw4IEBACiAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwKICAgICAgICAgc2l6ZV90IHJhbmdlT2Zmc2V0LCBzaXplX3QgcmFuZ2VMZW5ndGgsCiAgICAgICAgIE9NWF9VMzIgZmxhZ3MsCi0gICAgICAgIGludDY0X3QgdGltZVVzLAotICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgIHZvaWQgKmRhdGFQdHIpIHsKLSAgICBBTE9HVigiWyVzXSBvbk9NWEZpbGxCdWZmZXJEb25lICVwIHRpbWUgJWxsZCB1cywgZmxhZ3MgPSAweCUwOGx4IiwKKyAgICAgICAgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBBTE9HVigiWyVzXSBvbk9NWEZpbGxCdWZmZXJEb25lICV1IHRpbWUgJSIgUFJJZDY0ICIgdXMsIGZsYWdzID0gMHglMDh4IiwKICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQsIHRpbWVVcywgZmxhZ3MpOwogCiAgICAgc3NpemVfdCBpbmRleDsKQEAgLTM0MjIsNyArNDIzMCw3IEBACiAgICAgICAgIGNhc2UgUkVTVUJNSVRfQlVGRkVSUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHJhbmdlTGVuZ3RoID09IDAgJiYgIShmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXAiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNhbGxpbmcgZmlsbEJ1ZmZlciAldSIsCiAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIoCkBAIC0zNDM2LDcgKzQyNDQsNyBAQAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0KICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLCBtQ29kZWMtPmlkKCkpOwogCi0gICAgICAgICAgICBpZiAoIW1Db2RlYy0+bVNlbnRGb3JtYXQpIHsKKyAgICAgICAgICAgIGlmICghbUNvZGVjLT5tU2VudEZvcm1hdCAmJiByYW5nZUxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICBtQ29kZWMtPnNlbmRGb3JtYXRDaGFuZ2UocmVwbHkpOwogICAgICAgICAgICAgfQogCkBAIC0zNDYzLDEyICs0MjcxLDEyIEBACiAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdERyYWluVGhpc0J1ZmZlcik7Ci0gICAgICAgICAgICBub3RpZnktPnNldFBvaW50ZXIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGluZm8tPm1EYXRhKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOwogCi0gICAgICAgICAgICByZXBseS0+c2V0UG9pbnRlcigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgICAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKIApAQCAtMzQ4MCw3ICs0Mjg4LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEVPUyk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRFT1MpOwogICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIG1Db2RlYy0+bUlucHV0RU9TUmVzdWx0KTsKICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKIApAQCAtMzUwNCw4ICs0MzEyLDcgQEAKIAogdm9pZCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25PdXRwdXRCdWZmZXJEcmFpbmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOwotICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlci1pZCIsICZidWZmZXJJRCkpOwotCisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlci1pZCIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKICAgICBzc2l6ZV90IGluZGV4OwogICAgIEJ1ZmZlckluZm8gKmluZm8gPQogICAgICAgICBtQ29kZWMtPmZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhPdXRwdXQsIGJ1ZmZlcklELCAmaW5kZXgpOwpAQCAtMzUyMSwxOSArNDMyOCw0MyBAQAogICAgIGludDMyX3QgcmVuZGVyOwogICAgIGlmIChtQ29kZWMtPm1OYXRpdmVXaW5kb3cgIT0gTlVMTAogICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlciAhPSAwCi0gICAgICAgICAgICAmJiAoaW5mby0+bURhdGEgPT0gTlVMTCB8fCBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApKSB7CisgICAgICAgICAgICAmJiBpbmZvLT5tRGF0YSAhPSBOVUxMICYmIGluZm8tPm1EYXRhLT5zaXplKCkgIT0gMCkgeworICAgICAgICBBVFJBQ0VfTkFNRSgicmVuZGVyIik7CiAgICAgICAgIC8vIFRoZSBjbGllbnQgd2FudHMgdGhpcyBidWZmZXIgdG8gYmUgcmVuZGVyZWQuCiAKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcyA9IDA7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgLy8gVE9ETzogaXQgc2VlbXMgbGlrZSB3ZSBzaG91bGQgdXNlIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgICAgIC8vIGluIHRoZSAobWVkaWEpYnVmZmVyIGFzIGl0IHBvdGVudGlhbGx5IGNhbWUgZnJvbQorICAgICAgICAgICAgLy8gYW4gaW5wdXQgc3VyZmFjZSwgYnV0IHdlIGRpZCBub3QgcHJvcGFnYXRlIGl0IHByaW9yIHRvCisgICAgICAgICAgICAvLyBBUEkgMjAuICBQZXJoYXBzIGNoZWNrIGZvciB0YXJnZXQgU0RLIHZlcnNpb24uCisjaWYgMAorICAgICAgICAgICAgaWYgKGluZm8tPm1EYXRhLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBidWZmZXIgUFRTIG9mICUiIFBSSWQ2NCwgdGltZXN0YW1wTnMpOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcE5zICo9IDEwMDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCiAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLCB0aW1lc3RhbXBOcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gc2V0IGJ1ZmZlciB0aW1lc3RhbXA6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICgoZXJyID0gbUNvZGVjLT5tTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgICAgICAgICBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSwgLTEpKSA9PSBPSykgewogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1c7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmCisgICAgICAgICAgICAoaW5mby0+bURhdGEgPT0gTlVMTCB8fCBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiZnJhbWUtZHJvcCIpOworICAgICAgICB9CiAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKICAgICB9CiAKQEAgLTM1NjQsNyArNDM5NSw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXAiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIobUNvZGVjLT5tTm9kZSwgaW5mby0+bUJ1ZmZlcklEKSwKQEAgLTM2MzQsMTAgKzQ0NjUsMTEgQEAKICAgICAgICAgICAgIGludDMyX3Qga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwotICAgICAgICAgICAgQ0hFQ0soIWtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOworICAgICAgICAgICAgQUxPR1dfSUYoa2VlcENvbXBvbmVudEFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qga2VlcCBjb21wb25lbnQgYWxsb2NhdGVkIG9uIHNodXRkb3duIGluIFVuaW5pdGlhbGl6ZWQgc3RhdGUiKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwpAQCAtMzY0NywxMyArNDQ3OSwyMCBAQAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRGbHVzaDoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbywgYXMgd2UgaGF2ZSBhbHJlYWR5IHNpZ25hbGVkIHNodXRkb3duCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCYXNlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgfQpAQCAtMzY5NCw2ICs0NTMzLDcgQEAKIAogICAgIEFTdHJpbmcgY29tcG9uZW50TmFtZTsKICAgICB1aW50MzJfdCBxdWlya3MgPSAwOworICAgIGludDMyX3QgZW5jb2RlciA9IGZhbHNlOwogICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1hdGNoaW5nQ29kZWNzLmFkZCgpOwogICAgICAgICBPTVhDb2RlYzo6Q29kZWNOYW1lQW5kUXVpcmtzICplbnRyeSA9ICZtYXRjaGluZ0NvZGVjcy5lZGl0SXRlbUF0KGluZGV4KTsKQEAgLTM3MDYsNyArNDU0Niw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAotICAgICAgICBpbnQzMl90IGVuY29kZXI7CiAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVuY29kZXIiLCAmZW5jb2RlcikpIHsKICAgICAgICAgICAgIGVuY29kZXIgPSBmYWxzZTsKICAgICAgICAgfQpAQCAtMzczNSw2ICs0NTc0LDggQEAKIAogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJBbGxvY2F0aW5nIGNvbXBvbmVudCAnJXMnIGZhaWxlZCwgdHJ5IG5leHQgb25lLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBub2RlID0gTlVMTDsKQEAgLTM3NDIsMTAgKzQ1ODMsMTAgQEAKIAogICAgIGlmIChub2RlID09IE5VTEwpIHsKICAgICAgICAgaWYgKCFtaW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYSBkZWNvZGVyIGZvciB0eXBlICclcycuIiwKLSAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYSAlc2NvZGVyIGZvciB0eXBlICclcycuIiwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlciA/ICJlbiIgOiAiZGUiLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBkZWNvZGVyICclcycuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29kZWMgJyVzJy4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZCk7CkBAIC0zNzY5LDcgKzQ2MTAsNyBAQAogCiAgICAgewogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJjb21wb25lbnROYW1lIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgfQpAQCAtMzc5Niw3ICs0NjM3LDggQEAKICAgICBtQ29kZWMtPm1EZXF1ZXVlQ291bnRlciA9IDA7CiAgICAgbUNvZGVjLT5tTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPSAwOwogICAgIG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xbGw7Ci0gICAgbUNvZGVjLT5tSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IGZhbHNlOworICAgIG1Db2RlYy0+bUlucHV0Rm9ybWF0LmNsZWFyKCk7CisgICAgbUNvZGVjLT5tT3V0cHV0Rm9ybWF0LmNsZWFyKCk7CiAKICAgICBpZiAobUNvZGVjLT5tU2h1dGRvd25JblByb2dyZXNzKSB7CiAgICAgICAgIGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IG1Db2RlYy0+bUtlZXBDb21wb25lbnRBbGxvY2F0ZWQ7CkBAIC0zODA2LDYgKzQ2NDgsOSBAQAogCiAgICAgICAgIG9uU2h1dGRvd24oa2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgfQorICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSBmYWxzZTsKKworICAgIG1Db2RlYy0+cHJvY2Vzc0RlZmVycmVkTWVzc2FnZXMoKTsKIH0KIAogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvblNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewpAQCAtMzgxNSw5ICs0NjYwLDEyIEBACiAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tVW5pbml0aWFsaXplZFN0YXRlKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKLSAgICBub3RpZnktPnBvc3QoKTsKKyAgICBpZiAobUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93bikgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICBtQ29kZWMtPm1FeHBsaWNpdFNodXRkb3duID0gZmFsc2U7CisgICAgfQogfQogCiBib29sIEFDb2RlYzo6TG9hZGVkU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC0zODUxLDYgKzQ2OTksNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsICZrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSk7CiAKKyAgICAgICAgICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgb25TaHV0ZG93bihrZWVwQ29tcG9uZW50QWxsb2NhdGVkKTsKIAogICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CkBAIC0zODYwLDcgKzQ3MDksNyBAQAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRGbHVzaDoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwpAQCAtMzg4OSw3ICs0NzM4LDcgQEAKICAgICAgICAgQUxPR0UoIlslc10gY29uZmlndXJlQ29kZWMgcmV0dXJuaW5nIGVycm9yICVkIiwKICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogCi0gICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMzkwOSw3ICs0NzU4LDkgQEAKIAogICAgIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgbUNvZGVjLT5tSW5wdXRGb3JtYXQpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoIm91dHB1dC1mb3JtYXQiLCBtQ29kZWMtPm1PdXRwdXRGb3JtYXQpOwogICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICB9CiAKQEAgLTM5MTcsMTEgKzQ3NjgsMTEgQEAKIH0KIAogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvbkNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSB7CiAgICAgQUxPR1YoIm9uQ3JlYXRlSW5wdXRTdXJmYWNlIik7CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCk7CiAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC0zOTQ1LDcgKzQ3OTYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsKSB7CisgICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsbCkgewogICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LApAQCAtMzk1NSw2ICs0ODA2LDQxIEBACiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSBtYXggdGltZXN0YW1wIGdhcCAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tVGltZVBlckNhcHR1cmVVcyA+IDBsbAorICAgICAgICAgICAgJiYgbUNvZGVjLT5tVGltZVBlckZyYW1lVXMgPiAwbGwpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lTGFwc2VbMl07CisgICAgICAgIHRpbWVMYXBzZVswXSA9IG1Db2RlYy0+bVRpbWVQZXJGcmFtZVVzOworICAgICAgICB0aW1lTGFwc2VbMV0gPSBtQ29kZWMtPm1UaW1lUGVyQ2FwdHVyZVVzOworICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCisgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFLAorICAgICAgICAgICAgICAgICZ0aW1lTGFwc2VbMF0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRpbWVMYXBzZSkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgdGltZSBsYXBzZSAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSB7CisgICAgICAgIGJvb2wgc3VzcGVuZCA9IHRydWU7CisgICAgICAgIGVyciA9IG1Db2RlYy0+bU9NWC0+c2V0SW50ZXJuYWxPcHRpb24oCisgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwKKyAgICAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsCisgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NVU1BFTkQsCisgICAgICAgICAgICAgICAgJnN1c3BlbmQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN1c3BlbmQpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBVbmFibGUgdG8gY29uZmlndXJlIG9wdGlvbiB0byBzdXNwZW5kIChlcnIgJWQpIiwKICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIGVycik7CiAgICAgICAgIH0KQEAgLTM5OTksNyArNDg4NSw3IEBACiAgICAgICAgICAgICAgIihlcnJvciAweCUwOHgpIiwKICAgICAgICAgICAgICBlcnIpOwogCi0gICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKIAogICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUxvYWRlZFN0YXRlKTsKICAgICB9CkBAIC00MDE3LDYgKzQ5MDMsNyBAQAogCiBib29sIEFDb2RlYzo6TG9hZGVkVG9JZGxlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgogICAgICAgICB7CiAgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOwpAQCAtNDAzOSw3ICs0OTI2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBldmVuIHN0YXJ0ZWQgeWV0LCBzbyB3ZSdyZSBmbHVzaGVkIGFscmlnaHQuLi4KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTQwODMsNiArNDk3MCw3IEBACiAKIGJvb2wgQUNvZGVjOjpJZGxlVG9FeGVjdXRpbmdTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgogICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CiAgICAgICAgIHsKICAgICAgICAgICAgIG1Db2RlYy0+ZGVmZXJNZXNzYWdlKG1zZyk7CkBAIC00MDk5LDcgKzQ5ODcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IGV2ZW4gc3RhcnRlZCB5ZXQsIHNvIHdlJ3JlIGZsdXNoZWQgYWxyaWdodC4uLgogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNDE0Myw3ICs1MDMxLDcgQEAKIH0KIAogQUNvZGVjOjpCYXNlU3RhdGU6OlBvcnRNb2RlIEFDb2RlYzo6RXhlY3V0aW5nU3RhdGU6OmdldFBvcnRNb2RlKAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIHJldHVybiBSRVNVQk1JVF9CVUZGRVJTOwogfQogCkBAIC00MjA1LDExICs1MDkzLDE0IEBACiAKICAgICBzdWJtaXRPdXRwdXRCdWZmZXJzKCk7CiAKLSAgICAvLyBQb3N0IHRoZSBmaXJzdCBpbnB1dCBidWZmZXIuCisgICAgLy8gUG9zdCBhbGwgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlcnMKICAgICBDSEVDS19HVChtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpLCAwdSk7Ci0gICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZWRpdEl0ZW1BdCgwKTsKLQotICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbmZvKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCk7IGkrKykgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOworICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgeworICAgICAgICAgICAgcG9zdEZpbGxUaGlzQnVmZmVyKGluZm8pOworICAgICAgICB9CisgICAgfQogCiAgICAgbUFjdGl2ZSA9IHRydWU7CiB9CkBAIC00MjMxLDYgKzUxMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwogCiAgICAgICAgICAgICBtQ29kZWMtPm1TaHV0ZG93bkluUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgbUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93biA9IHRydWU7CiAgICAgICAgICAgICBtQ29kZWMtPm1LZWVwQ29tcG9uZW50QWxsb2NhdGVkID0ga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKIAogICAgICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwpAQCAtNDM1Miw2ICs1MjQ0LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVczsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoInNraXAtZnJhbWVzLWJlZm9yZSIsICZza2lwRnJhbWVzQmVmb3JlVXMpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAmc2tpcEZyYW1lc0JlZm9yZVVzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNraXBGcmFtZXNCZWZvcmVVcykpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHBhcmFtZXRlciAnc2tpcC1mcmFtZXMtYmVmb3JlJyAoZXJyICVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50MzJfdCBkcm9wSW5wdXRGcmFtZXM7CiAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsICZkcm9wSW5wdXRGcmFtZXMpKSB7CiAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGRyb3BJbnB1dEZyYW1lcyAhPSAwOwpAQCAtNDM4NSw3ICs1MjkzLDcgQEAKIAogdm9pZCBBQ29kZWM6Om9uU2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaWduYWxlZElucHV0RU9TKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNpZ25hbGVkSW5wdXRFT1MpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShtTm9kZSk7CiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtNDUwNSw3ICs1NDEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCByZWNvbmZpZ3VyYXRpb24gKGVycm9yIDB4JTA4eCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CiAKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIGVycik7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgbm90IGNvcnJlY3QsIGJ1dCBhcHBlYXJzIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvbmx5IHdheSB0byBmcmVlIHRoZSBjb21wb25lbnQgaW5zdGFuY2UuCkBAIC00Nzc0LDcgKzU2ODIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZSwgbUNvZGVjLT5pZCgpKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCBvbXhfbWVzc2FnZTo6RVZFTlQpOwotICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKCJub2RlIiwgbUNvZGVjLT5tTm9kZSk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJub2RlIiwgbUNvZGVjLT5tTm9kZSk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJldmVudCIsIGV2ZW50KTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGExIiwgZGF0YTEpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZGF0YTIiLCBkYXRhMik7CkBAIC00ODE1LDcgKzU3MjMsNyBAQAogICAgICAgICBtQ29kZWMtPndhaXRVbnRpbEFsbFBvc3NpYmxlTmF0aXZlV2luZG93QnVmZmVyc0FyZVJldHVybmVkVG9VcygpOwogCiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCk7CiAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgIG1Db2RlYy0+bVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcAppbmRleCAwM2RjYmY5Li5hNmZiM2Q4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAKQEAgLTE4OSw3ICsxODksNyBAQAogICAgICAgICAgICAgbU9mZnNldFRhYmxlLCBtT2Zmc2V0VGFibGVMZW5ndGgpOwogfQogCi1zcDxNZXRhRGF0YT4gQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKK3NwPE1ldGFEYXRhPiBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjIxLDcgKzIyMSw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbU9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKQEAgLTI1OCwxNCArMjU4LDE0IEBACiAgICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIDIwMDAwbGw7ICAvLyAyMG1zIHBlciBmcmFtZS4KICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiAyMDAwMGxsOwogCi0gICAgICAgIGludCBpbmRleCA9IHNlZWtGcmFtZSAvIDUwOworICAgICAgICBzaXplX3QgaW5kZXggPSBzZWVrRnJhbWUgPCAwID8gMCA6IHNlZWtGcmFtZSAvIDUwOwogICAgICAgICBpZiAoaW5kZXggPj0gbU9mZnNldFRhYmxlTGVuZ3RoKSB7CiAgICAgICAgICAgICBpbmRleCA9IG1PZmZzZXRUYWJsZUxlbmd0aCAtIDE7CiAgICAgICAgIH0KIAogICAgICAgICBtT2Zmc2V0ID0gbU9mZnNldFRhYmxlW2luZGV4XSArIChtSXNXaWRlID8gOSA6IDYpOwogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBzZWVrRnJhbWUgLSBpbmRleCAqIDUwOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IHNlZWtGcmFtZSAtIGluZGV4ICogNTA7IGkrKykgewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRGcmFtZVNpemVCeU9mZnNldChtRGF0YVNvdXJjZSwgbU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlLCAmc2l6ZSkpICE9IE9LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCA4ZDVlZWM4Li45YWE3ZDk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTE0LDYgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CkBAIC0yMiwxMCArMjgsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTEwNSw3ICsxMDcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQU1SV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBTVJXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQpAQCAtMTYyLDcgKzE2NCw3IEBACiAgICAgdm9pZCAqZHVtbXk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSAoc3RhdHVzX3QpIGR1bW15OworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKICAgICB7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgaWYgKGVyciA9PSBPSyAmJgpAQCAtMTkxLDcgKzE5Myw3IEBACiAKIC8vIHN0YXRpYwogdm9pZCAqQU1SV3JpdGVyOjpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKSB7Ci0gICAgcmV0dXJuICh2b2lkICopIHN0YXRpY19jYXN0PEFNUldyaXRlciAqPihtZSktPnRocmVhZEZ1bmMoKTsKKyAgICByZXR1cm4gKHZvaWQgKikodWludHB0cl90KSBzdGF0aWNfY2FzdDxBTVJXcml0ZXIgKj4obWUpLT50aHJlYWRGdW5jKCk7CiB9CiAKIHN0YXR1c190IEFNUldyaXRlcjo6dGhyZWFkRnVuYygpIHsKQEAgLTIzNSw3ICsyMzcsNyBAQAogICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlbGxkLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICVsbGQiLAorICAgICAgICBBTE9HVigidGltZSBzdGFtcDogJSIgUFJJZDY0ICIsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOwogICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtYXhUaW1lc3RhbXBVcykgewogICAgICAgICAgICAgbWF4VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDZhMmE2OTYuLjE5M2Y4YTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMTQsNyArMTQsMTAgQEAKICAgICAgICAgQXdlc29tZVBsYXllci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ2FtZXJhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCAgICAgICAgIFwKKyAgICAgICAgQ2xvY2tFc3RpbWF0b3IuY3BwICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ29kZWNCYXNlLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRGF0YVVSSVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRFJNRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRVNEUy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRmlsZVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMwLDggKzMzLDEwIEBACiAgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhQ29kZWMuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhQ29kZWNMaXN0LmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhQ29kZWNTb3VyY2UuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRGVmcy5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIGh0dHAvTWVkaWFIVFRQLmNwcCAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhTXV4ZXIuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1ldGFEYXRhLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NSwyMiArNjAsMjMgQEAKICAgICAgICAgV1ZNRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgWElOR1NlZWtlci5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgYXZjX3V0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbXA0L0ZyYWdtZW50ZWRNUDRQYXJzZXIuY3BwICAgICAgIFwKLSAgICAgICAgbXA0L1RyYWNrRnJhZ21lbnQuY3BwICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS8gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dCBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9zZXJ2aWNlcy9jb25uZWN0aXZpdHltYW5hZ2VyIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2ZsYWMvaW5jbHVkZSBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC90cmVtb2xvIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbGlid2VibSBcCisgICAgICAgICQoVE9QKS9zeXN0ZW0vbmV0ZC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uIFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvaTE4biBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJiaW5kZXIgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICAgICAgbGliY29ubmVjdGl2aXR5bWFuYWdlciBcCiAgICAgICAgIGxpYmN1dGlscyBcCiAgICAgICAgIGxpYmRsIFwKICAgICAgICAgbGliZHJtZnJhbWV3b3JrIFwKQEAgLTgwLDYgKzg2LDggQEAKICAgICAgICAgbGliaWN1dWMgXAogICAgICAgICBsaWJsb2cgXAogICAgICAgICBsaWJtZWRpYSBcCisgICAgICAgIGxpYm5ldGRfY2xpZW50IFwKKyAgICAgICAgbGlib3B1cyBcCiAgICAgICAgIGxpYnNvbml2b3ggXAogICAgICAgICBsaWJzc2wgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9vbXggXApAQCAtOTUsNiArMTAzLDcgQEAKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FhY2VuYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfd2VibSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCBcCiAgICAgICAgIGxpYnZweCBcCiAgICAgICAgIGxpYndlYm0gXApAQCAtMTAzLDEzICsxMTIsNiBAQAogICAgICAgICBsaWJGTEFDIFwKICAgICAgICAgbGlibWVkaWFfaGVscGVyCiAKLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgICAgIGNocm9taXVtX2h0dHBfc3R1Yi5jcHAKLUxPQ0FMX0NQUEZMQUdTICs9IC1EQ0hST01JVU1fQVZBSUxBQkxFPTEKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJzdGxwb3J0Ci1pbmNsdWRlIGV4dGVybmFsL3N0bHBvcnQvbGlic3RscG9ydC5tawotCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y19jb21tb24gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IDA1ZWUzNGUuLmUyNDgyNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUGxheWVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMjEsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgpAQCAtMTM5LDYgKzE0MiwxMiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAweCV4IiwgbWltZSwgYXVkaW9Gb3JtYXQpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKKyAgICAgICAgaWYgKChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDKSAmJiBmb3JtYXQtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgeworICAgICAgICAgICAgLy8gUmVkZWZpbmUgQUFDIGZvcm1hdCBjb3Jyb3Nwb25kaW5nIHRvIGFhYyBwcm9maWxlCisgICAgICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50IGF2Z0JpdFJhdGUgPSAtMTsKQEAgLTIyMSw3ICsyMzAsOCBAQAogCiAgICAgICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBtU2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIGF1ZGlvTWFzaywKLSAgICAgICAgICAgICAgICAwLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmQXVkaW9DYWxsYmFjaywgdGhpcywgMCk7CisgICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsCisgICAgICAgICAgICAgICAgMCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovKTsKIAogICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CkBAIC00MTAsNyArNDIwLDcgQEAKIAogLy8gc3RhdGljCiBzaXplX3QgQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAorICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqIC8qIGF1ZGlvU2luayAqLywKICAgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29va2llLAogICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCkgewogICAgIEF1ZGlvUGxheWVyICptZSA9IChBdWRpb1BsYXllciAqKWNvb2tpZTsKQEAgLTU2NSwxMiArNTc1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVG9Db21wbGV0aW9uVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAwMDAwMGxsICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQpIC8gbVNhbXBsZVJhdGU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwbGF5ZWQ6ICVsbGQgKCVsbGQgdXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwbGF5ZWQ6ICUiIFBSSWQ2NCAiICglbGxkIHVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc1BsYXllZCArIG51bUFkZGl0aW9uYWxGcmFtZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsICogKG1OdW1GcmFtZXNQbGF5ZWQgKyBudW1BZGRpdGlvbmFsRnJhbWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGUpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVkIGZyYW1lcyBsZWZ0IHRvIHBsYXksICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBmcmFtZXMgbGVmdCB0byBwbGF5LCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNQZW5kaW5nUGxheW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVUb0NvbXBsZXRpb25VcywgdGltZVRvQ29tcGxldGlvblVzIC8gMUU2KTsKIApAQCAtNjI3LDcgKzYzNyw3IEBACiAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9CiAgICAgICAgICAgICAgICAgICAgICgobU51bUZyYW1lc1BsYXllZCArIHNpemVfZG9uZSAvIG1GcmFtZVNpemUpICogMTAwMDAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJWQsICIKKyAgICAgICAgICAgICAgICBBTE9HVigiYnVmZmVyLT5zaXplKCkgPSAlenUsICIKICAgICAgICAgICAgICAgICAgICAgICJtUG9zaXRpb25UaW1lTWVkaWFVcz0lLjJmIG1Qb3NpdGlvblRpbWVSZWFsVXM9JS4yZiIsCiAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpLAogICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMgLyAxRTYsIG1Qb3NpdGlvblRpbWVSZWFsVXMgLyAxRTYpOwpAQCAtNzQ1LDcgKzc1NSw3IEBACiAKICAgICAvLyBIQUwgcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGJ1ZmZlciB3ZSBzZW50IGF0IG1TdGFydFBvc1VzCiAgICAgY29uc3QgaW50NjRfdCByZW5kZXJlZER1cmF0aW9uID0gbVN0YXJ0UG9zVXMgKyBwbGF5ZWRVczsKLSAgICBBTE9HVigiZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCAlbGxkIiwgcmVuZGVyZWREdXJhdGlvbik7CisgICAgQUxPR1YoImdldE91dHB1dFBsYXlQb3NpdGlvblVzX2wgJSIgUFJJZDY0LCByZW5kZXJlZER1cmF0aW9uKTsKICAgICByZXR1cm4gcmVuZGVyZWREdXJhdGlvbjsKIH0KIApAQCAtNzU2LDggKzc2NiwxMyBAQAogICAgICAgICBpZiAobVNlZWtpbmcpIHsKICAgICAgICAgICAgIHJldHVybiBtU2Vla1RpbWVVczsKICAgICAgICAgfQorICAgICAgICBpZiAobVJlYWNoZWRFT1MpIHsKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25Vcyk7CisgICAgICAgICAgICByZXR1cm4gZHVyYXRpb25VczsKKyAgICAgICAgfQogICAgICAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpOwotICAgICAgICBBTE9HVigiZ2V0TWVkaWFUaW1lVXMgZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpIG1Qb3NpdGlvblRpbWVSZWFsVXMgJWxsZCIsCisgICAgICAgIEFMT0dWKCJnZXRNZWRpYVRpbWVVcyBnZXRPdXRwdXRQbGF5UG9zaXRpb25Vc19sKCkgbVBvc2l0aW9uVGltZVJlYWxVcyAlIiBQUklkNjQsCiAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMpOwogICAgICAgICByZXR1cm4gbVBvc2l0aW9uVGltZVJlYWxVczsKICAgICB9CkBAIC03OTUsNyArODEwLDcgQEAKIHN0YXR1c190IEF1ZGlvUGxheWVyOjpzZWVrVG8oaW50NjRfdCB0aW1lX3VzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIEFMT0dWKCJzZWVrVG8oICVsbGQgKSIsIHRpbWVfdXMpOworICAgIEFMT0dWKCJzZWVrVG8oICUiIFBSSWQ2NCAiICkiLCB0aW1lX3VzKTsKIAogICAgIG1TZWVraW5nID0gdHJ1ZTsKICAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBkNzIyM2Q5Li44MDRmMTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NvdXJjZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI2LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjUsMTAgKzY3LDEwIEBACiAgICAgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgQXVkaW9SZWNvcmQgY2FsbGJhY2sgbmV2ZXIgcmV0dXJucyBtb3JlIHRoYW4gdGhlIG1heGltdW0KICAgICAgICAgLy8gYnVmZmVyIHNpemUKLSAgICAgICAgaW50IGZyYW1lQ291bnQgPSBrTWF4QnVmZmVyU2l6ZSAvIHNpemVvZihpbnQxNl90KSAvIGNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgZnJhbWVDb3VudCA9IGtNYXhCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpIC8gY2hhbm5lbENvdW50OwogCiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBBdWRpb1JlY29yZCB0b3RhbCBidWZmZXIgc2l6ZSBpcyBsYXJnZSBlbm91Z2gKLSAgICAgICAgaW50IGJ1ZkNvdW50ID0gMjsKKyAgICAgICAgc2l6ZV90IGJ1ZkNvdW50ID0gMjsKICAgICAgICAgd2hpbGUgKChidWZDb3VudCAqIGZyYW1lQ291bnQpIDwgbWluRnJhbWVDb3VudCkgewogICAgICAgICAgICAgYnVmQ291bnQrKzsKICAgICAgICAgfQpAQCAtNzYsMTAgKzc4LDEwIEBACiAgICAgICAgIG1SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCiAgICAgICAgICAgICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgYnVmQ291bnQgKiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoYnVmQ291bnQgKiBmcmFtZUNvdW50KSwKICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRDYWxsYmFja0Z1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovKTsKICAgICAgICAgbUluaXRDaGVjayA9IG1SZWNvcmQtPmluaXRDaGVjaygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBzdGF0dXM7CkBAIC0xMzYsNyArMTM4LDcgQEAKIH0KIAogdm9pZCBBdWRpb1NvdXJjZTo6d2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbCgpIHsKLSAgICBBTE9HVigid2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbDogJWxsZCIsIG1OdW1DbGllbnRPd25lZEJ1ZmZlcnMpOworICAgIEFMT0dWKCJ3YWl0T3V0c3RhbmRpbmdFbmNvZGluZ0ZyYW1lc19sOiAlIiBQUklkNjQsIG1OdW1DbGllbnRPd25lZEJ1ZmZlcnMpOwogICAgIHdoaWxlIChtTnVtQ2xpZW50T3duZWRCdWZmZXJzID4gMCkgewogICAgICAgICBtRnJhbWVFbmNvZGluZ0NvbXBsZXRpb25Db25kaXRpb24ud2FpdChtTG9jayk7CiAgICAgfQpAQCAtMTUzLDYgKzE1NSw4IEBACiAgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CisKICAgICBtUmVjb3JkLT5zdG9wKCk7CiAgICAgd2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbCgpOwogICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXNfbCgpOwpAQCAtMjA4LDcgKzIxMiw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgKm91dCA9IE5VTEw7CiAKQEAgLTI2OSw3ICsyNzMsNyBAQAogc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmRhdGFDYWxsYmFjayhjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJiBhdWRpb0J1ZmZlcikgewogICAgIGludDY0X3QgdGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMGxsOwogCi0gICAgQUxPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgQUxPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HVygiU3B1cmlvdXMgY2FsbGJhY2sgZnJvbSBBdWRpb1JlY29yZC4gRHJvcCB0aGUgYXVkaW8gZGF0YS4iKTsKQEAgLTI3OCw4ICsyODIsOCBAQAogCiAgICAgLy8gRHJvcCByZXRyaWV2ZWQgYW5kIHByZXZpb3VzbHkgbG9zdCBhdWRpbyBkYXRhLgogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCAmJiB0aW1lVXMgPCBtU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7Ci0gICAgICAgIEFMT0dWKCJEcm9wIGF1ZGlvIGRhdGEgYXQgJWxsZC8lbGxkIHVzIiwgdGltZVVzLCBtU3RhcnRUaW1lVXMpOworICAgICAgICAodm9pZCkgbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7CisgICAgICAgIEFMT0dWKCJEcm9wIGF1ZGlvIGRhdGEgYXQgJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMsIG1TdGFydFRpbWVVcyk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTMwOCw3ICszMTIsNyBAQAogICAgIGlmIChudW1Mb3N0Qnl0ZXMgPiAwKSB7CiAgICAgICAgIC8vIExvc3Mgb2YgYXVkaW8gZnJhbWVzIHNob3VsZCBoYXBwZW4gcmFyZWx5OyB0aHVzIHRoZSBMT0dXIHNob3VsZAogICAgICAgICAvLyBub3QgY2F1c2UgYSBsb2dnaW5nIHNwYW0KLSAgICAgICAgQUxPR1coIkxvc3QgYXVkaW8gcmVjb3JkIGRhdGE6ICVkIGJ5dGVzIiwgbnVtTG9zdEJ5dGVzKTsKKyAgICAgICAgQUxPR1coIkxvc3QgYXVkaW8gcmVjb3JkIGRhdGE6ICV6dSBieXRlcyIsIG51bUxvc3RCeXRlcyk7CiAgICAgfQogCiAgICAgd2hpbGUgKG51bUxvc3RCeXRlcyA+IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggMTMzY2FlMy4uNDkzZTU5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTE5LDYgKzE5LDkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXdlc29tZVBsYXllciIKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIApAQCAtMzQsMTYgKzM3LDIwIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CkBAIC04Miw3ICs4OSw3IEBACiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXdlc29tZUV2ZW50KCkge30KIAotICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqcXVldWUsIGludDY0X3QgLyogbm93X3VzICovKSB7CisgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICogLyogcXVldWUgKi8sIGludDY0X3QgLyogbm93X3VzICovKSB7CiAgICAgICAgIChtUGxheWVyLT4qbU1ldGhvZCkoKTsKICAgICB9CiAKQEAgLTk2LDE3ICsxMDMsMjEgQEAKIAogc3RydWN0IEF3ZXNvbWVMb2NhbFJlbmRlcmVyIDogcHVibGljIEF3ZXNvbWVSZW5kZXJlciB7CiAgICAgQXdlc29tZUxvY2FsUmVuZGVyZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCi0gICAgICAgIDogbVRhcmdldChuZXcgU29mdHdhcmVSZW5kZXJlcihuYXRpdmVXaW5kb3csIG1ldGEpKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkKKyAgICAgICAgOiBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgICAgbVRhcmdldChuZXcgU29mdHdhcmVSZW5kZXJlcihuYXRpdmVXaW5kb3cpKSB7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIHJlbmRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKwogICAgICAgICByZW5kZXIoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIHRpbWVVcyAqIDEwMDApOwogICAgIH0KIAotICAgIHZvaWQgcmVuZGVyKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIG1UYXJnZXQtPnJlbmRlcihkYXRhLCBzaXplLCBOVUxMKTsKKyAgICB2b2lkIHJlbmRlcihjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgICAgICBtVGFyZ2V0LT5yZW5kZXIoZGF0YSwgc2l6ZSwgdGltZXN0YW1wTnMsIE5VTEwsIG1Gb3JtYXQpOwogICAgIH0KIAogcHJvdGVjdGVkOgpAQCAtMTE2LDYgKzEyNyw3IEBACiAgICAgfQogCiBwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogICAgIFNvZnR3YXJlUmVuZGVyZXIgKm1UYXJnZXQ7CiAKICAgICBBd2Vzb21lTG9jYWxSZW5kZXJlcihjb25zdCBBd2Vzb21lTG9jYWxSZW5kZXJlciAmKTsKQEAgLTIyNyw2ICsyMzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkF3ZXNvbWVQbGF5ZXI6Om9uQXVkaW9UZWFyRG93bkV2ZW50KTsKICAgICBtQXVkaW9UZWFyRG93bkV2ZW50UGVuZGluZyA9IGZhbHNlOwogCisgICAgbUNsb2NrRXN0aW1hdG9yID0gbmV3IFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKCk7CisKICAgICByZXNldCgpOwogfQogCkBAIC0yNzYsMTUgKzI5MCwyMCBAQAogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBzZXREYXRhU291cmNlX2wodXJpLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGh0dHBTZXJ2aWNlLCB1cmksIGhlYWRlcnMpOwogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlX2woCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIHJlc2V0X2woKTsKIAorICAgIG1IVFRQU2VydmljZSA9IGh0dHBTZXJ2aWNlOwogICAgIG1VcmkgPSB1cmk7CiAKICAgICBpZiAoaGVhZGVycykgewpAQCAtMzAxLDcgKzMyMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HSSgic2V0RGF0YVNvdXJjZV9sKFVSTCBzdXBwcmVzc2VkKSIpOworICAgIEFMT0dJKCJzZXREYXRhU291cmNlX2woJXMpIiwgdXJpRGVidWdTdHJpbmcobVVyaSwgbUZsYWdzICYgSU5DT0dOSVRPKS5jX3N0cigpKTsKIAogICAgIC8vIFRoZSBhY3R1YWwgd29yayB3aWxsIGJlIGRvbmUgZHVyaW5nIHByZXBhcmF0aW9uIGluIHRoZSBjYWxsIHRvCiAgICAgLy8gOjpmaW5pc2hTZXREYXRhU291cmNlX2wgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGNhbGxpbmcgdGhyZWFkIGluCkBAIC0zOTMsNiArNDEyLDEzIEBACiAKICAgICAgICAgdG90YWxCaXRSYXRlICs9IGJpdHJhdGU7CiAgICAgfQorICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IG1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICAgICAgaWYgKGZpbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CisgICAgICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uOworICAgICAgICB9CisgICAgfQogCiAgICAgbUJpdHJhdGUgPSB0b3RhbEJpdFJhdGU7CiAKQEAgLTU4MSw2ICs2MDcsNyBAQAogICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7CiAgICAgbVNlZWtUaW1lVXMgPSAwOwogCisgICAgbUhUVFBTZXJ2aWNlLmNsZWFyKCk7CiAgICAgbVVyaS5zZXRUbygiIik7CiAgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKIApAQCAtNzA4LDExICs3MzUsOSBAQAogICAgICAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoZ2V0Qml0cmF0ZSgmYml0cmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgY2FjaGVkU2l6ZSA9IG1DYWNoZWRTb3VyY2UtPmNhY2hlZFNpemUoKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWRTaXplICogODAwMDAwMGxsIC8gYml0cmF0ZTsKLQorICAgICAgICAgICAgYm9vbCBlb3MyOworICAgICAgICAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzOworICAgICAgICAgICAgaWYgKGdldENhY2hlZER1cmF0aW9uX2woJmNhY2hlZER1cmF0aW9uVXMsICZlb3MyKSAmJiBtRHVyYXRpb25VcyA+IDApIHsKICAgICAgICAgICAgICAgICBpbnQgcGVyY2VudGFnZSA9IDEwMC4wICogKGRvdWJsZSljYWNoZWREdXJhdGlvblVzIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IDEwMDsKQEAgLTcyMCwxMiArNzQ1LDEyIEBACiAKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBiaXRyYXRlIG9mIHRoZSBzdHJlYW0sIHVzZSBhYnNvbHV0ZSBzaXplCisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYml0cmF0ZS9kdXJhdGlvbiBvZiB0aGUgc3RyZWFtLCB1c2UgYWJzb2x1dGUgc2l6ZQogICAgICAgICAgICAgICAgIC8vIGxpbWl0cyB0byBtYWludGFpbiB0aGUgY2FjaGUuCiAKICAgICAgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFBMQVlJTkcpICYmICFlb3MKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjYWNoZWREYXRhUmVtYWluaW5nIDwga0xvd1dhdGVyTWFya0J5dGVzKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKDwgJWQpICwgcGF1c2luZy4iLAorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKDwgJXp1KSAsIHBhdXNpbmcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrTG93V2F0ZXJNYXJrQnl0ZXMpOwogICAgICAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgU0VUKTsKICAgICAgICAgICAgICAgICAgICAgcGF1c2VfbCgpOwpAQCAtNzM0LDEyICs3NTksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlb3MgfHwgY2FjaGVkRGF0YVJlbWFpbmluZyA+IGtIaWdoV2F0ZXJNYXJrQnl0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlZCksIHJlc3VtaW5nLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlenUpLCByZXN1bWluZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CiAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5X2woKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjYWNoZSBoYXMgZmlsbGVkIHVwICg+ICVkKSwgcHJlcGFyZSBpcyBkb25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjYWNoZSBoYXMgZmlsbGVkIHVwICg+ICV6dSksIHByZXBhcmUgaXMgZG9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIaWdoV2F0ZXJNYXJrQnl0ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTIxMyw3ICsxMjM4LDkgQEAKICAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLiAgVGhpcyByZW5kZXJlcgogICAgICAgICAvLyB0aGVuIHBlcmZvcm1zIGEgY29sb3IgY29udmVyc2lvbiBhbmQgY29weSB0byBnZXQgdGhlIGRhdGEKICAgICAgICAgLy8gaW50byB0aGUgQU5hdGl2ZUJ1ZmZlci4KLSAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgbWV0YSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmZm9ybWF0KTsKKyAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgZm9ybWF0KTsKICAgICB9CiB9CiAKQEAgLTE0ODIsNyArMTUwOSw3IEBACiAgICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOwogCiAgICAgaWYgKG1UZXh0RHJpdmVyID09IE5VTEwpIHsKLSAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lcik7CisgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgfQogCiAgICAgbVRleHREcml2ZXItPmFkZEluQmFuZFRleHRTb3VyY2UodHJhY2tJbmRleCwgc291cmNlKTsKQEAgLTE2OTQsNyArMTcyMSw3IEBACiAgICAgfQogCiAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJzZWVraW5nIGF1ZGlvIHRvICVsbGQgdXMgKCUuMmYgc2VjcykuIiwgdmlkZW9UaW1lVXMsIHZpZGVvVGltZVVzIC8gMUU2KTsKKyAgICAgICAgQUxPR1YoInNlZWtpbmcgYXVkaW8gdG8gJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykuIiwgdmlkZW9UaW1lVXMsIHZpZGVvVGltZVVzIC8gMUU2KTsKIAogICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdmlkZW8gdGltZSwgc2VlayBhdWRpbyB0byB0aGUgb3JpZ2luYWxseQogICAgICAgICAvLyByZXF1ZXN0ZWQgc2VlayB0aW1lIGluc3RlYWQuCkBAIC0xNzU4LDcgKzE3ODUsNyBAQAogICAgIGlmICghbVZpZGVvQnVmZmVyKSB7CiAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwogICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLCBtU2Vla1RpbWVVcyAvIDFFNik7CisgICAgICAgICAgICBBTE9HVigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLCBtU2Vla1RpbWVVcyAvIDFFNik7CiAKICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAogICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywKQEAgLTE4MjgsNyArMTg1NSw3IEBACiAKICAgICBpZiAobVNlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7CiAgICAgICAgIGlmIChtU2Vla1RpbWVVcyA+IHRpbWVVcykgewotICAgICAgICAgICAgQUxPR0koIlhYWCBtU2Vla1RpbWVVcyA9ICVsbGQgdXMsIHRpbWVVcyA9ICVsbGQgdXMiLAorICAgICAgICAgICAgQUxPR0koIlhYWCBtU2Vla1RpbWVVcyA9ICUiIFBSSWQ2NCAiIHVzLCB0aW1lVXMgPSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCB0aW1lVXMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTg1OCwyMSArMTg4NSwyOCBAQAogICAgIFRpbWVTb3VyY2UgKnRzID0KICAgICAgICAgKChtRmxhZ3MgJiBBVURJT19BVF9FT1MpIHx8ICEobUZsYWdzICYgQVVESU9QTEFZRVJfU1RBUlRFRCkpCiAgICAgICAgICAgICA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOworICAgIGludDY0X3Qgc3lzdGVtVGltZVVzID0gbVN5c3RlbVRpbWVTb3VyY2UuZ2V0UmVhbFRpbWVVcygpOworICAgIGludDY0X3QgbG9vcGVyVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAogICAgIGlmIChtRmxhZ3MgJiBGSVJTVF9GUkFNRSkgewogICAgICAgICBtb2RpZnlGbGFncyhGSVJTVF9GUkFNRSwgQ0xFQVIpOwogICAgICAgICBtU2luY2VMYXN0RHJvcHBlZCA9IDA7Ci0gICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7CisgICAgICAgIG1DbG9ja0VzdGltYXRvci0+cmVzZXQoKTsKKyAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gZXN0aW1hdGVSZWFsVGltZVVzKHRzLCBzeXN0ZW1UaW1lVXMpIC0gdGltZVVzOwogICAgIH0KIAogICAgIGludDY0X3QgcmVhbFRpbWVVcywgbWVkaWFUaW1lVXM7CiAgICAgaWYgKCEobUZsYWdzICYgQVVESU9fQVRfRU9TKSAmJiBtQXVkaW9QbGF5ZXIgIT0gTlVMTAogICAgICAgICAmJiBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZU1hcHBpbmcoJnJlYWxUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgQUxPR1YoInVwZGF0aW5nIFRTZGVsdGEgKCUiIFBSSWQ2NCAiID0+ICUiIFBSSWQ2NCAiIGNoYW5nZSAlIiBQUklkNjQgIikiLAorICAgICAgICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMsIHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVcywKKyAgICAgICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzIC0gKHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVcykpOworICAgICAgICBBVFJBQ0VfSU5UKCJUUyBkZWx0YSBjaGFuZ2UgKG1zKSIsIChtVGltZVNvdXJjZURlbHRhVXMgLSAocmVhbFRpbWVVcyAtIG1lZGlhVGltZVVzKSkgLyAxRTMpOwogICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSByZWFsVGltZVVzIC0gbWVkaWFUaW1lVXM7CiAgICAgfQogCiAgICAgaWYgKHdhc1NlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7Ci0gICAgICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gZXN0aW1hdGVSZWFsVGltZVVzKHRzLCBzeXN0ZW1UaW1lVXMpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOwogCiAgICAgICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOwogCkBAIC0xODgzLDEyICsxOTE3LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSAwOwogICAgIGlmICh3YXNTZWVraW5nID09IE5PX1NFRUspIHsKICAgICAgICAgLy8gTGV0J3MgZGlzcGxheSB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgc2Vla2luZyByaWdodCBhd2F5LgogCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gZXN0aW1hdGVSZWFsVGltZVVzKHRzLCBzeXN0ZW1UaW1lVXMpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOwogCi0gICAgICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOworICAgICAgICBsYXRlbmVzc1VzID0gbm93VXMgLSB0aW1lVXM7CiAKICAgICAgICAgQVRSQUNFX0lOVCgiVmlkZW8gTGF0ZW5lc3MgKG1zKSIsIGxhdGVuZXNzVXMgLyAxRTMpOwogCkBAIC0xOTE4LDEzICsxOTUzLDEzIEBACiAKICAgICAgICAgaWYgKGxhdGVuZXNzVXMgPiA0MDAwMCkgewogICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDQwbXMgbGF0ZS4KLSAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgQUxPR1YoIndlJ3JlIGxhdGUgYnkgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLAogICAgICAgICAgICAgICAgICBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2KTsKIAogICAgICAgICAgICAgaWYgKCEobUZsYWdzICYgU0xPV19ERUNPREVSX0hBQ0spCiAgICAgICAgICAgICAgICAgICAgIHx8IG1TaW5jZUxhc3REcm9wcGVkID4gRlJBTUVfRFJPUF9GUkVRKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykgZHJvcHBpbmcgIgorICAgICAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIGRyb3BwaW5nICIKICAgICAgICAgICAgICAgICAgICAgICJvbmUgYWZ0ZXIgJWQgZnJhbWVzIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdGVuZXNzVXMsIGxhdGVuZXNzVXMgLyAxRTYsIG1TaW5jZUxhc3REcm9wcGVkKTsKIApAQCAtMTk0Miw5ICsxOTc3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChsYXRlbmVzc1VzIDwgLTEwMDAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gMTBtcyBlYXJseS4KLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMTAwMDApOworICAgICAgICBpZiAobGF0ZW5lc3NVcyA8IC0zMDAwMCkgeworICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDMwbXMgZWFybHksIHNjaGVkdWxlIGF0IG1vc3QgMjAgbXMgYmVmb3JlIHRpbWUgZHVlCisgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKGxhdGVuZXNzVXMgPCAtNjAwMDAgPyAzMDAwMCA6IC1sYXRlbmVzc1VzIC0gMjAwMDApOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMTk1OCw2ICsxOTkzLDggQEAKIAogICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgIG1TaW5jZUxhc3REcm9wcGVkKys7CisgICAgICAgIG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBsb29wZXJUaW1lVXMgLSBsYXRlbmVzc1VzKTsKKwogICAgICAgICBtVmlkZW9SZW5kZXJlci0+cmVuZGVyKG1WaWRlb0J1ZmZlcik7CiAgICAgICAgIGlmICghbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCkgewogICAgICAgICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCA9IHRydWU7CkBAIC0yMDA3LDE0ICsyMDQ0LDI2IEBACiAKICAgICAgICAgaW50NjRfdCBuZXh0VGltZVVzOwogICAgICAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZuZXh0VGltZVVzKSk7Ci0gICAgICAgIGludDY0X3QgZGVsYXlVcyA9IG5leHRUaW1lVXMgLSB0cy0+Z2V0UmVhbFRpbWVVcygpICsgbVRpbWVTb3VyY2VEZWx0YVVzOwotICAgICAgICBwb3N0VmlkZW9FdmVudF9sKGRlbGF5VXMgPiAxMDAwMCA/IDEwMDAwIDogZGVsYXlVcyA8IDAgPyAwIDogZGVsYXlVcyk7CisgICAgICAgIHN5c3RlbVRpbWVVcyA9IG1TeXN0ZW1UaW1lU291cmNlLmdldFJlYWxUaW1lVXMoKTsKKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gbmV4dFRpbWVVcyAtIGVzdGltYXRlUmVhbFRpbWVVcyh0cywgc3lzdGVtVGltZVVzKSArIG1UaW1lU291cmNlRGVsdGFVczsKKyAgICAgICAgQVRSQUNFX0lOVCgiRnJhbWUgZGVsdGEgKG1zKSIsIChuZXh0VGltZVVzIC0gdGltZVVzKSAvIDFFMyk7CisgICAgICAgIEFMT0dWKCJuZXh0IGZyYW1lIGluICUiIFBSSWQ2NCwgZGVsYXlVcyk7CisgICAgICAgIC8vIHRyeSB0byBzY2hlZHVsZSAzMG1zIGJlZm9yZSB0aW1lIGR1ZQorICAgICAgICBwb3N0VmlkZW9FdmVudF9sKGRlbGF5VXMgPiA2MDAwMCA/IDMwMDAwIDogKGRlbGF5VXMgPCAzMDAwMCA/IDAgOiBkZWxheVVzIC0gMzAwMDApKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKIH0KIAoraW50NjRfdCBBd2Vzb21lUGxheWVyOjplc3RpbWF0ZVJlYWxUaW1lVXMoVGltZVNvdXJjZSAqdHMsIGludDY0X3Qgc3lzdGVtVGltZVVzKSB7CisgICAgaWYgKHRzID09ICZtU3lzdGVtVGltZVNvdXJjZSkgeworICAgICAgICByZXR1cm4gc3lzdGVtVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAoaW50NjRfdCltQ2xvY2tFc3RpbWF0b3ItPmVzdGltYXRlKHN5c3RlbVRpbWVVcywgdHMtPmdldFJlYWxUaW1lVXMoKSk7CisgICAgfQorfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RWaWRlb0V2ZW50X2woaW50NjRfdCBkZWxheVVzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIApAQCAtMjE5MiwxNSArMjI0MSwxNCBAQAogICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCBtVXJpLnN0cmluZygpLCA3KQogICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIG1Vcmkuc3RyaW5nKCksIDgpCiAgICAgICAgICAgICB8fCBpc1dpZGV2aW5lU3RyZWFtaW5nKSB7Ci0gICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZSA9IEhUVFBCYXNlOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgKG1GbGFncyAmIElOQ09HTklUTykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKTsKLQotICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPnNldFVJRChtVUlEKTsKKyAgICAgICAgaWYgKG1IVFRQU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBwbGF5IG1lZGlhIGZyb20gaHR0cCBVUkkgd2l0aG91dCBIVFRQIHNlcnZpY2UuIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gbUhUVFBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKKwogICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOwogICAgICAgICBib29sIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcms7CiAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCkBAIC0yMjA4LDYgKzIyNTYsMTAgQEAKIAogICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbm5lY3RpbmdEYXRhU291cmNlLT5jb25uZWN0KG1VcmksICZtVXJpSGVhZGVycyk7CisgICAgICAgIC8vIGZvcmNlIGNvbm5lY3Rpb24gYXQgdGhpcyBwb2ludCwgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGdldE1JTUVUeXBlIGFuZCB0aGUKKyAgICAgICAgLy8gY2FjaGluZyBkYXRhc291cmNlIGNvbnN0cnVjdGVkIGJlbG93LCB3aGljaCBjb3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgcmVxdWVzdHMgdG8gdGhlCisgICAgICAgIC8vIHNlcnZlciwgYW5kL29yIGZhaWxlZCBjb25uZWN0aW9ucy4KKyAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKICAgICAgICAgbUxvY2subG9jaygpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIyMzgsOCArMjI5MCw2IEBACiAKICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLmNsZWFyKCk7CiAKLSAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IGRhdGFTb3VyY2UtPmdldE1JTUVUeXBlKCk7Ci0KICAgICAgICAgaWYgKHN0cm5jYXNlY21wKGNvbnRlbnRUeXBlLnN0cmluZygpLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBkb2luZyB0aGlzIGZvciBzdHJlYW1zIHRoYXQgYXBwZWFyIHRvIGJlIGF1ZGlvLW9ubHkKICAgICAgICAgICAgIC8vIHN0cmVhbXMgdG8gZW5zdXJlIHRoYXQgZXZlbiBsb3cgYmFuZHdpZHRoIHN0cmVhbXMgc3RhcnQKQEAgLTIyNzEsMTIgKzIzMjEsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWV0YURhdGFTaXplID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBtZXRhRGF0YVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChvZmY2NF90KWNhY2hlZERhdGFSZW1haW5pbmcgPj0gbWV0YURhdGFTaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBjYWNoZWQgJWQgYnl0ZXMgb2YgZGF0YSIsIGNhY2hlZERhdGFSZW1haW5pbmcpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigibm93IGNhY2hlZCAlenUgYnl0ZXMgb2YgZGF0YSIsIGNhY2hlZERhdGFSZW1haW5pbmcpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YVNpemUgPCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBrTWluQnl0ZXNGb3JTbmlmZmluZykgewpAQCAtMjI5NSw4ICsyMzQ1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNuaWZmZWRNSU1FID0gdG1wLnN0cmluZygpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtZXRhLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YS1kYXRhLXNpemUiLCAmbWV0YURhdGFTaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KCJtZXRhLWRhdGEtc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oJm1ldGFEYXRhU2l6ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFTaXplID0ga0hpZ2hXYXRlck1hcmtCeXRlczsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjMxNiw3ICsyMzY2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKG1Vcmkuc3RyaW5nKCksICZtVXJpSGVhZGVycyk7CisgICAgICAgIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSwgbVVyaS5zdHJpbmcoKSwgJm1VcmlIZWFkZXJzKTsKICAgICB9CiAKICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CkBAIC0yNTgzLDEyICsyNjM0LDEyIEBACiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZWxlY3RBdWRpb1RyYWNrX2woCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLCBzaXplX3QgdHJhY2tJbmRleCkgewogCi0gICAgQUxPR0koInNlbGVjdEF1ZGlvVHJhY2tfbDogdHJhY2tJbmRleD0lZCwgbUZsYWdzPTB4JXgiLCB0cmFja0luZGV4LCBtRmxhZ3MpOworICAgIEFMT0dJKCJzZWxlY3RBdWRpb1RyYWNrX2w6IHRyYWNrSW5kZXg9JXp1LCBtRmxhZ3M9MHgleCIsIHRyYWNrSW5kZXgsIG1GbGFncyk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKICAgICAgICAgaWYgKChzc2l6ZV90KXRyYWNrSW5kZXggPT0gbUFjdGl2ZUF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgQUxPR0koIlRyYWNrICVkIGlzIGFjdGl2ZS4gRG9lcyBub3RoaW5nLiIsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgQUxPR0koIlRyYWNrICV6dSBpcyBhY3RpdmUuIERvZXMgbm90aGluZy4iLCB0cmFja0luZGV4KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgICAgICAvL21TdGF0cy5tRmxhZ3MgPSBtRmxhZ3M7CkBAIC0yNjU0LDE0ICsyNzA1LDE0IEBACiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoInNlbGVjdFRyYWNrOiB0cmFja0luZGV4ID0gJWQgYW5kIHNlbGVjdD0lZCIsIHRyYWNrSW5kZXgsIHNlbGVjdCk7CisgICAgQUxPR1YoInNlbGVjdFRyYWNrOiB0cmFja0luZGV4ID0gJXp1IGFuZCBzZWxlY3Q9JWQiLCB0cmFja0luZGV4LCBzZWxlY3QpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwogICAgIGlmIChtVGV4dERyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHRyYWNrQ291bnQgKz0gbVRleHREcml2ZXItPmNvdW50RXh0ZXJuYWxUcmFja3MoKTsKICAgICB9CiAgICAgaWYgKHRyYWNrSW5kZXggPj0gdHJhY2tDb3VudCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgaW5kZXggKCVkKSBpcyBvdXQgb2YgcmFuZ2UgWzAsICVkKSIsIHRyYWNrSW5kZXgsIHRyYWNrQ291bnQpOworICAgICAgICBBTE9HRSgiVHJhY2sgaW5kZXggKCV6dSkgaXMgb3V0IG9mIHJhbmdlIFswLCAlenUpIiwgdHJhY2tJbmRleCwgdHJhY2tDb3VudCk7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC0yNjczLDE0ICsyNzI0LDE0IEBACiAgICAgICAgIGlzQXVkaW9UcmFjayA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CiAKICAgICAgICAgaWYgKCFpc0F1ZGlvVHJhY2sgJiYgc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFjayAlZCBpcyBub3QgZWl0aGVyIGF1ZGlvIG9yIHRpbWVkIHRleHQiLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFjayAlenUgaXMgbm90IGVpdGhlciBhdWRpbyBvciB0aW1lZCB0ZXh0IiwgdHJhY2tJbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaXNBdWRpb1RyYWNrKSB7CiAgICAgICAgIGlmICghc2VsZWN0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiRGVzZWxlY3QgYW4gYXVkaW8gdHJhY2sgKCVkKSBpcyBub3Qgc3VwcG9ydGVkIiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICBBTE9HRSgiRGVzZWxlY3QgYW4gYXVkaW8gdHJhY2sgKCV6dSkgaXMgbm90IHN1cHBvcnRlZCIsIHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzZWxlY3RBdWRpb1RyYWNrX2wobUV4dHJhY3Rvci0+Z2V0VHJhY2sodHJhY2tJbmRleCksIHRyYWNrSW5kZXgpOwpAQCAtMjc1OCw3ICsyODA5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgICAgIGlmIChtVGV4dERyaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lciwgbUhUVFBTZXJ2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFN0cmluZyB2YWx1ZXMgd3JpdHRlbiBpbiBQYXJjZWwgYXJlIFVURi0xNiB2YWx1ZXMuCiAgICAgICAgICAgICBTdHJpbmc4IHVyaShyZXF1ZXN0LnJlYWRTdHJpbmcxNigpKTsKQEAgLTI3NzAsNyArMjgyMSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgZmQgICAgICAgICA9IHJlcXVlc3QucmVhZEZpbGVEZXNjcmlwdG9yKCk7CiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IHJlcXVlc3QucmVhZEludDY0KCk7CkBAIC0yODAzLDE0ICsyODU0LDE1IEBACiAgICAgcmV0dXJuIG1DYWNoZWRTb3VyY2UgIT0gTlVMTCB8fCBtV1ZNRXh0cmFjdG9yICE9IE5VTEw7CiB9CiAKLXN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7CitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOwogCiAgICAgRklMRSAqb3V0ID0gZmRvcGVuKGR1cChmZCksICJ3Iik7CiAKICAgICBmcHJpbnRmKG91dCwgIiBBd2Vzb21lUGxheWVyXG4iKTsKICAgICBpZiAobVN0YXRzLm1GZCA8IDApIHsKLSAgICAgICAgZnByaW50ZihvdXQsICIgIFVSSShzdXBwcmVzc2VkKSIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAgVVJJKCVzKSIsIHVyaURlYnVnU3RyaW5nKG1VcmksIG1GbGFncyAmIElOQ09HTklUTykuY19zdHIoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZnByaW50ZihvdXQsICIgIGZkKCVkKSIsIG1TdGF0cy5tRmQpOwogICAgIH0KQEAgLTI4MTgsNyArMjg3MCw3IEBACiAgICAgZnByaW50ZihvdXQsICIsIGZsYWdzKDB4JTA4eCkiLCBtU3RhdHMubUZsYWdzKTsKIAogICAgIGlmIChtU3RhdHMubUJpdHJhdGUgPj0gMCkgewotICAgICAgICBmcHJpbnRmKG91dCwgIiwgYml0cmF0ZSglbGxkIGJwcykiLCBtU3RhdHMubUJpdHJhdGUpOworICAgICAgICBmcHJpbnRmKG91dCwgIiwgYml0cmF0ZSglIiBQUklkNjQgIiBicHMpIiwgbVN0YXRzLm1CaXRyYXRlKTsKICAgICB9CiAKICAgICBmcHJpbnRmKG91dCwgIlxuIik7CkBAIC0yODI2LDcgKzI4NzgsNyBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0YXRzLm1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgVHJhY2tTdGF0ICZzdGF0ID0gbVN0YXRzLm1UcmFja3MuaXRlbUF0KGkpOwogCi0gICAgICAgIGZwcmludGYob3V0LCAiICBUcmFjayAlZFxuIiwgaSArIDEpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAgVHJhY2sgJXp1XG4iLCBpICsgMSk7CiAgICAgICAgIGZwcmludGYob3V0LCAiICAgTUlNRSglcykiLCBzdGF0Lm1NSU1FLnN0cmluZygpKTsKIAogICAgICAgICBpZiAoIXN0YXQubURlY29kZXJOYW1lLmlzRW1wdHkoKSkgewpAQCAtMjgzOCw4ICsyODkwLDggQEAKICAgICAgICAgaWYgKChzc2l6ZV90KWkgPT0gbVN0YXRzLm1WaWRlb1RyYWNrSW5kZXgpIHsKICAgICAgICAgICAgIGZwcmludGYob3V0LAogICAgICAgICAgICAgICAgICAgICAiICAgdmlkZW9EaW1lbnNpb25zKCVkIHggJWQpLCAiCi0gICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0RlY29kZWQoJWxsZCksICIKLSAgICAgICAgICAgICAgICAgICAgIm51bVZpZGVvRnJhbWVzRHJvcHBlZCglbGxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIm51bVZpZGVvRnJhbWVzRGVjb2RlZCglIiBQUklkNjQgIiksICIKKyAgICAgICAgICAgICAgICAgICAgIm51bVZpZGVvRnJhbWVzRHJvcHBlZCglIiBQUklkNjQgIilcbiIsCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9XaWR0aCwKICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1WaWRlb0hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0RlY29kZWQsCkBAIC0yODk5LDYgKzI5NTEsOSBAQAogICAgIC8vIGdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBzdGFydCByZWNyZWF0ZWQgc3RyZWFtIGZyb20gaGVyZQogICAgIGdldFBvc2l0aW9uKCZtQXVkaW9UZWFyRG93blBvc2l0aW9uKTsKIAorICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBzYXZlZEhUVFBTZXJ2aWNlID0gbUhUVFBTZXJ2aWNlOworCisgICAgYm9vbCB3YXNMb29waW5nID0gbUZsYWdzICYgTE9PUElORzsKICAgICAvLyBSZXNldCBhbmQgcmVjcmVhdGUKICAgICByZXNldF9sKCk7CiAKQEAgLTI5MDgsNyArMjk2Myw3IEBACiAgICAgICAgIG1GaWxlU291cmNlID0gZmlsZVNvdXJjZTsKICAgICAgICAgZXJyID0gc2V0RGF0YVNvdXJjZV9sKGZpbGVTb3VyY2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbCh1cmksICZ1cmlIZWFkZXJzKTsKKyAgICAgICAgZXJyID0gc2V0RGF0YVNvdXJjZV9sKHNhdmVkSFRUUFNlcnZpY2UsIHVyaSwgJnVyaUhlYWRlcnMpOwogICAgIH0KIAogICAgIG1GbGFncyB8PSBQUkVQQVJJTkc7CkBAIC0yOTE3LDYgKzI5NzIsOSBAQAogICAgICAgICAvLyBhIE1FRElBX0VSUk9SIHRvIHRoZSBjbGllbnQgYW5kIGFib3J0IHRoZSBwcmVwYXJlCiAgICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKICAgICB9CisgICAgaWYgKHdhc0xvb3BpbmcpIHsKKyAgICAgICAgbUZsYWdzIHw9IExPT1BJTkc7CisgICAgfQogCiAgICAgbUF1ZGlvVGVhckRvd24gPSB0cnVlOwogICAgIG1Jc0FzeW5jUHJlcGFyZSA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAppbmRleCAzMDE3ZmU3Li5mNzZhZWQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNvdXJjZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTMxLDYgKzMzLDEyIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KSAodm9pZCkoeCkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KQorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGludDY0X3QgQ0FNRVJBX1NPVVJDRV9USU1FT1VUX05TID0gMzAwMDAwMDAwMExMOwpAQCAtNjMsMTIgKzcxLDE1IEBACiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6Om5vdGlmeShpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKSB7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKG1zZ1R5cGUpOworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShleHQxKTsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoZXh0Mik7CiAgICAgQUxPR1YoIm5vdGlmeSglZCwgJWQsICVkKSIsIG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwogfQogCiB2b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKSB7Ci0gICAgQUxPR1YoInBvc3REYXRhKCVkLCBwdHI6JXAsIHNpemU6JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICogLyogbWV0YWRhdGEgKi8pIHsKKyAgICBBTE9HVigicG9zdERhdGEoJWQsIHB0cjolcCwgc2l6ZTolenUpIiwKICAgICAgICAgIG1zZ1R5cGUsIGRhdGFQdHItPnBvaW50ZXIoKSwgZGF0YVB0ci0+c2l6ZSgpKTsKIAogICAgIHNwPENhbWVyYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZS5wcm9tb3RlKCk7CkBAIC01NzcsMTQgKzU4OCwxNSBAQAogICAgIH0KIH0KIAotdm9pZCBDYW1lcmFTb3VyY2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKICAgICBBTE9HVigic3RhcnRDYW1lcmFSZWNvcmRpbmciKTsKICAgICAvLyBSZXNldCB0aGUgaWRlbnRpdHkgdG8gdGhlIGN1cnJlbnQgdGhyZWFkIGJlY2F1c2UgbWVkaWEgc2VydmVyIG93bnMgdGhlCiAgICAgLy8gY2FtZXJhIGFuZCByZWNvcmRpbmcgaXMgc3RhcnRlZCBieSB0aGUgYXBwbGljYXRpb25zLiBUaGUgYXBwbGljYXRpb25zCiAgICAgLy8gd2lsbCBjb25uZWN0IHRvIHRoZSBjYW1lcmEgaW4gSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpzdGFydFJlY29yZGluZy4KICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKG1OdW1JbnB1dEJ1ZmZlcnMgPiAwKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1DYW1lcmEtPnNlbmRDb21tYW5kKAorICAgICAgICBlcnIgPSBtQ2FtZXJhLT5zZW5kQ29tbWFuZCgKICAgICAgICAgICAgIENBTUVSQV9DTURfU0VUX1ZJREVPX0JVRkZFUl9DT1VOVCwgbU51bUlucHV0QnVmZmVycywgMCk7CiAKICAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIENhbWVyYUhBTDEgY2xpZW50czsgdGh1cyB0aGUgZmFpbHVyZSBpcwpAQCAtNTk1LDE3ICs2MDcsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGVyciA9IE9LOwogICAgIGlmIChtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSB7CiAgICAgICAgIG1DYW1lcmEtPnVubG9jaygpOwogICAgICAgICBtQ2FtZXJhLmNsZWFyKCk7Ci0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywKLSAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcobmV3IFByb3h5TGlzdGVuZXIodGhpcykpKTsKKyAgICAgICAgaWYgKChlcnIgPSBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPnN0YXJ0UmVjb3JkaW5nKAorICAgICAgICAgICAgICAgIG5ldyBQcm94eUxpc3RlbmVyKHRoaXMpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgcmVjb3JkaW5nLCByZWNlaXZlZCBlcnJvcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIobmV3IENhbWVyYVNvdXJjZUxpc3RlbmVyKHRoaXMpKTsKICAgICAgICAgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKTsKLSAgICAgICAgQ0hFQ0sobUNhbWVyYS0+cmVjb3JkaW5nRW5hYmxlZCgpKTsKKyAgICAgICAgaWYgKCFtQ2FtZXJhLT5yZWNvcmRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHJlY29yZGluZyIpOworICAgICAgICB9CiAgICAgfQogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKQEAgLTYzNywxMCArNjU3LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGFydENhbWVyYVJlY29yZGluZygpOworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkpID09IE9LKSB7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICB9CiAKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBlcnI7CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgewpAQCAtNjU1LDYzICs2NzcsODAgQEAKIAogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VDYW1lcmEoKSB7CiAgICAgQUxPR1YoInJlbGVhc2VDYW1lcmEiKTsKLSAgICBpZiAobUNhbWVyYSAhPSAwKSB7Ci0gICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICBpZiAoKG1DYW1lcmFGbGFncyAmIEZMQUdTX0hPVF9DQU1FUkEpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgd2FzIGNvbGQgd2hlbiB3ZSBzdGFydGVkLCBzdG9wcGluZyBwcmV2aWV3Iik7Ci0gICAgICAgICAgICBtQ2FtZXJhLT5zdG9wUHJldmlldygpOwotICAgICAgICAgICAgbUNhbWVyYS0+ZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIG1DYW1lcmEtPnVubG9jaygpOworICAgIHNwPENhbWVyYT4gY2FtZXJhOworICAgIGJvb2wgY29sZENhbWVyYSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgLy8gZ2V0IGEgbG9jYWwgcmVmIGFuZCBjbGVhciByZWYgdG8gbUNhbWVyYSBub3cKKyAgICAgICAgY2FtZXJhID0gbUNhbWVyYTsKICAgICAgICAgbUNhbWVyYS5jbGVhcigpOwotICAgICAgICBtQ2FtZXJhID0gMDsKKyAgICAgICAgY29sZENhbWVyYSA9IChtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSA9PSAwOworICAgIH0KKworICAgIGlmIChjYW1lcmEgIT0gMCkgeworICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgaWYgKGNvbGRDYW1lcmEpIHsKKyAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgd2FzIGNvbGQgd2hlbiB3ZSBzdGFydGVkLCBzdG9wcGluZyBwcmV2aWV3Iik7CisgICAgICAgICAgICBjYW1lcmEtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICBjYW1lcmEtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmEtPnVubG9jaygpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICB9Ci0gICAgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSAwKSB7Ci0gICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7Ci0gICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS5jbGVhcigpOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobUNhbWVyYVJlY29yZGluZ1Byb3h5ICE9IDApIHsKKyAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtQ2FtZXJhRmxhZ3MgPSAwOwogICAgIH0KLSAgICBtQ2FtZXJhRmxhZ3MgPSAwOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnJlc2V0KCkgewogICAgIEFMT0dEKCJyZXNldDogRSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CiAKLSAgICBpbnQ2NF90IHRva2VuOwotICAgIGJvb2wgaXNUb2tlblZhbGlkID0gZmFsc2U7Ci0gICAgaWYgKG1DYW1lcmEgIT0gMCkgewotICAgICAgICB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIGlzVG9rZW5WYWxpZCA9IHRydWU7Ci0gICAgfQotICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXMoKTsKLSAgICB3aGlsZSAoIW1GcmFtZXNCZWluZ0VuY29kZWQuZW1wdHkoKSkgewotICAgICAgICBpZiAoTk9fRVJST1IgIT0KLSAgICAgICAgICAgIG1GcmFtZUNvbXBsZXRlQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXMgKiAxMDAwTEwgKyBDQU1FUkFfU09VUkNFX1RJTUVPVVRfTlMpKSB7Ci0gICAgICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG91dHN0YW5kaW5nIGZyYW1lcyBiZWluZyBlbmNvZGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5zaXplKCkpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCisgICAgICAgIGludDY0X3QgdG9rZW47CisgICAgICAgIGJvb2wgaXNUb2tlblZhbGlkID0gZmFsc2U7CisgICAgICAgIGlmIChtQ2FtZXJhICE9IDApIHsKKyAgICAgICAgICAgIHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIGlzVG9rZW5WYWxpZCA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOworICAgICAgICB3aGlsZSAoIW1GcmFtZXNCZWluZ0VuY29kZWQuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9CisgICAgICAgICAgICAgICAgbUZyYW1lQ29tcGxldGVDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXMgKiAxMDAwTEwgKyBDQU1FUkFfU09VUkNFX1RJTUVPVVRfTlMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBvdXRzdGFuZGluZyBmcmFtZXMgYmVpbmcgZW5jb2RlZDogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICAgICAgaWYgKGlzVG9rZW5WYWxpZCkgeworICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNvbGxlY3RTdGF0cykgeworICAgICAgICAgICAgQUxPR0koIkZyYW1lcyByZWNlaXZlZC9lbmNvZGVkL2Ryb3BwZWQ6ICVkLyVkLyVkIGluICUiIFBSSWQ2NCAiIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1JlY2VpdmVkLCBtTnVtRnJhbWVzRW5jb2RlZCwgbU51bUZyYW1lc0Ryb3BwZWQsCisgICAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTnVtR2xpdGNoZXMgPiAwKSB7CisgICAgICAgICAgICBBTE9HVygiJWQgbG9uZyBkZWxheXMgYmV0d2VlbiBuZWlnaGJvcmluZyB2aWRlbyBmcmFtZXMiLCBtTnVtR2xpdGNoZXMpOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfRVEobU51bUZyYW1lc1JlY2VpdmVkLCBtTnVtRnJhbWVzRW5jb2RlZCArIG1OdW1GcmFtZXNEcm9wcGVkKTsKICAgICB9Ci0gICAgc3RvcENhbWVyYVJlY29yZGluZygpOworCiAgICAgcmVsZWFzZUNhbWVyYSgpOwotICAgIGlmIChpc1Rva2VuVmFsaWQpIHsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgfQogCi0gICAgaWYgKG1Db2xsZWN0U3RhdHMpIHsKLSAgICAgICAgQUxPR0koIkZyYW1lcyByZWNlaXZlZC9lbmNvZGVkL2Ryb3BwZWQ6ICVkLyVkLyVkIGluICVsbGQgdXMiLAotICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQsIG1OdW1GcmFtZXNEcm9wcGVkLAotICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKLSAgICB9Ci0KLSAgICBpZiAobU51bUdsaXRjaGVzID4gMCkgewotICAgICAgICBBTE9HVygiJWQgbG9uZyBkZWxheXMgYmV0d2VlbiBuZWlnaGJvcmluZyB2aWRlbyBmcmFtZXMiLCBtTnVtR2xpdGNoZXMpOwotICAgIH0KLQotICAgIENIRUNLX0VRKG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQgKyBtTnVtRnJhbWVzRHJvcHBlZCk7CiAgICAgQUxPR0QoInJlc2V0OiBYIik7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNzg5LDcgKzgyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjYW1lcmEgcmVjb3JkaW5nIHByb3h5IGlzIGdvbmUiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW5jb21pbmcgY2FtZXJhIHZpZGVvIGZyYW1lczogJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgQUxPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbmNvbWluZyBjYW1lcmEgdmlkZW8gZnJhbWVzOiAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgxMiwxMCArODUxLDEwIEBACiAKIHZvaWQgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKICAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgewotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6IHRpbWVzdGFtcCAlbGxkIHVzIiwgdGltZXN0YW1wVXMpOworICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6IHRpbWVzdGFtcCAlIiBQUklkNjQgIiB1cyIsIHRpbWVzdGFtcFVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN0YXJ0ZWQgfHwgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwICYmIHRpbWVzdGFtcFVzIDwgbVN0YXJ0VGltZVVzKSkgewotICAgICAgICBBTE9HVigiRHJvcCBmcmFtZSBhdCAlbGxkLyVsbGQgdXMiLCB0aW1lc3RhbXBVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgQUxPR1YoIkRyb3AgZnJhbWUgYXQgJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgdXMiLCB0aW1lc3RhbXBVcywgbVN0YXJ0VGltZVVzKTsKICAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGRhdGEpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODU0LDcgKzg5Myw3IEBACiAgICAgbUZyYW1lc1JlY2VpdmVkLnB1c2hfYmFjayhkYXRhKTsKICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TdGFydFRpbWVVcyArICh0aW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKICAgICBtRnJhbWVUaW1lcy5wdXNoX2JhY2sodGltZVVzKTsKLSAgICBBTE9HVigiaW5pdGlhbCBkZWxheTogJWxsZCwgY3VycmVudCB0aW1lIHN0YW1wOiAlbGxkIiwKKyAgICBBTE9HVigiaW5pdGlhbCBkZWxheTogJSIgUFJJZDY0ICIsIGN1cnJlbnQgdGltZSBzdGFtcDogJSIgUFJJZDY0LAogICAgICAgICBtU3RhcnRUaW1lVXMsIHRpbWVVcyk7CiAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKaW5kZXggNTc3MjMxNi4uMGFjZDlkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UiCiAKQEAgLTc5LDEzICs4MSwxNCBAQAogICAgICAgbVNraXBDdXJyZW50RnJhbWUoZmFsc2UpIHsKIAogICAgIG1UaW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzID0gdGltZUJldHdlZW5GcmFtZUNhcHR1cmVVczsKLSAgICBBTE9HRCgic3RhcnRpbmcgdGltZSBsYXBzZSBtb2RlOiAlbGxkIHVzIiwKKyAgICBBTE9HRCgic3RhcnRpbmcgdGltZSBsYXBzZSBtb2RlOiAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgIG1UaW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzKTsKIAogICAgIG1WaWRlb1dpZHRoID0gdmlkZW9TaXplLndpZHRoOwogICAgIG1WaWRlb0hlaWdodCA9IHZpZGVvU2l6ZS5oZWlnaHQ7CiAKLSAgICBpZiAoIXRyeVNldHRpbmdWaWRlb1NpemUodmlkZW9TaXplLndpZHRoLCB2aWRlb1NpemUuaGVpZ2h0KSkgeworICAgIGlmIChPSyA9PSBtSW5pdENoZWNrICYmICF0cnlTZXR0aW5nVmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpIHsKKyAgICAgICAgcmVsZWFzZUNhbWVyYSgpOwogICAgICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKICAgICB9CiAKQEAgLTEzNCw3ICsxMzcsNyBAQAogICAgIH0KIAogICAgIGJvb2wgdmlkZW9TaXplU3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1cHBvcnRlZFNpemVzLnNpemUoKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRTaXplcy5zaXplKCk7ICsraSkgewogICAgICAgICBpbnQzMl90IHBpY3R1cmVXaWR0aCA9IHN1cHBvcnRlZFNpemVzW2ldLndpZHRoOwogICAgICAgICBpbnQzMl90IHBpY3R1cmVIZWlnaHQgPSBzdXBwb3J0ZWRTaXplc1tpXS5oZWlnaHQ7CiAKQEAgLTIzMSw3ICsyMzQsNyBAQAogICAgIHJldHVybiBuZXdNZW1vcnk7CiB9CiAKLWJvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpIHsKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwQ3VycmVudEZyYW1lKGludDY0X3QgLyogdGltZXN0YW1wVXMgKi8pIHsKICAgICBBTE9HVigic2tpcEN1cnJlbnRGcmFtZSIpOwogICAgIGlmIChtU2tpcEN1cnJlbnRGcmFtZSkgewogICAgICAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IGZhbHNlOwpAQCAtMjY1LDcgKzI2OCw3IEBACiAKICAgICAgICAgICAgIC8vIFJlYWxseSBtYWtlIHN1cmUgdGhhdCB0aGlzIHZpZGVvIHJlY29yZGluZyBmcmFtZSB3aWxsIG5vdCBiZSBkcm9wcGVkLgogICAgICAgICAgICAgaWYgKCp0aW1lc3RhbXBVcyA8IG1TdGFydFRpbWVVcykgewotICAgICAgICAgICAgICAgIEFMT0dJKCJzZXQgdGltZXN0YW1wVXMgdG8gc3RhcnQgdGltZSBzdGFtcCAlbGxkIHVzIiwgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgic2V0IHRpbWVzdGFtcFVzIHRvIHN0YXJ0IHRpbWUgc3RhbXAgJSIgUFJJZDY0ICIgdXMiLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgICAgICp0aW1lc3RhbXBVcyA9IG1TdGFydFRpbWVVczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQxZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xvY2tFc3RpbWF0b3IuY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsb2NrRXN0aW1hdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1dpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcigKKyAgICAgICAgc2l6ZV90IGhlYWRMZW5ndGgsIGRvdWJsZSBoZWFkRmFjdG9yLCBzaXplX3QgbWFpbkxlbmd0aCwgZG91YmxlIHRhaWxGYWN0b3IpCisgICAgOiBtSGVhZEZhY3RvckludigxLiAvIGhlYWRGYWN0b3IpLAorICAgICAgbVRhaWxGYWN0b3IodGFpbEZhY3RvciksCisgICAgICBtSGlzdG9yeUxlbmd0aChtYWluTGVuZ3RoICsgaGVhZExlbmd0aCksCisgICAgICBtSGVhZExlbmd0aChoZWFkTGVuZ3RoKSB7CisgICAgcmVzZXQoKTsKKyAgICBtWEhpc3RvcnkucmVzaXplKG1IaXN0b3J5TGVuZ3RoKTsKKyAgICBtWUhpc3RvcnkucmVzaXplKG1IaXN0b3J5TGVuZ3RoKTsKKyAgICBtRmlyc3RXZWlnaHQgPSBwb3coaGVhZEZhY3RvciwgbUhlYWRMZW5ndGgpOworfQorCitXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjpMaW5lYXJGaXQoKSB7CisgICAgcmVzZXQoKTsKK30KKwordm9pZCBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjpyZXNldCgpIHsKKyAgICBtWCA9IG1YWCA9IG1ZID0gbVlZID0gbVhZID0gbVcgPSAwLjsKK30KKworZG91YmxlIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpMaW5lYXJGaXQ6OnNpemUoKSBjb25zdCB7CisgICAgZG91YmxlIHMgPSBtVyAqIG1XICsgbVggKiBtWCArIG1ZICogbVkgKyBtWFggKiBtWFggKyBtWFkgKiBtWFkgKyBtWVkgKiBtWVk7CisgICAgaWYgKHMgPiAxZTcyKSB7CisgICAgICAgIC8vIDFlNzIgY29ycmVzcG9uZHMgdG8gY2xvY2sgbW9ub3RvbmljIHRpbWUgb2YgYWJvdXQgOCB5ZWFycworICAgICAgICBBTE9HVygiZXN0aW1hdG9yIGlzIG92ZXJmbG93aW5nOiB3PSVnIHg9JWcgeT0lZyB4eD0lZyB4eT0lZyB5eT0lZyIsCisgICAgICAgICAgICAgIG1XLCBtWCwgbVksIG1YWCwgbVhZLCBtWVkpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKwordm9pZCBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjphZGQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgdykgeworICAgIG1XICs9IHc7CisgICAgbVggKz0gdyAqIHg7CisgICAgbVkgKz0gdyAqIHk7CisgICAgbVhYICs9IHcgKiB4ICogeDsKKyAgICBtWFkgKz0gdyAqIHggKiB5OworICAgIG1ZWSArPSB3ICogeSAqIHk7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6Y29tYmluZShjb25zdCBMaW5lYXJGaXQgJmxmKSB7CisgICAgbVcgKz0gbGYubVc7CisgICAgbVggKz0gbGYubVg7CisgICAgbVkgKz0gbGYubVk7CisgICAgbVhYICs9IGxmLm1YWDsKKyAgICBtWFkgKz0gbGYubVhZOworICAgIG1ZWSArPSBsZi5tWVk7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6c2NhbGUoZG91YmxlIHcpIHsKKyAgICBtVyAqPSB3OworICAgIG1YICo9IHc7CisgICAgbVkgKj0gdzsKKyAgICBtWFggKj0gdzsKKyAgICBtWFkgKj0gdzsKKyAgICBtWVkgKj0gdzsKK30KKworZG91YmxlIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpMaW5lYXJGaXQ6OmludGVycG9sYXRlKGRvdWJsZSB4KSB7CisgICAgZG91YmxlIGRpdiA9IG1XICogbVhYIC0gbVggKiBtWDsKKyAgICBpZiAoZmFicyhkaXYpIDwgMWUtNSAqIG1XICogbVcpIHsKKyAgICAgICAgLy8gdGhpcyBvbmx5IHNob3VsZCBoYXBwZW4gb24gdGhlIGZpcnN0IHZhbHVlCisgICAgICAgIHJldHVybiB4OworICAgICAgICAvLyBhc3N1bWluZyBhID0gMSwgd2UgY291bGQgYWxzbyByZXR1cm4geCArIChtWSAtIG1YKSAvIG1XOworICAgIH0KKyAgICBkb3VibGUgYV9kaXYgPSAobVcgKiBtWFkgLSBtWCAqIG1ZKTsKKyAgICBkb3VibGUgYl9kaXYgPSAobVhYICogbVkgLSBtWCAqIG1YWSk7CisgICAgQUxPR1YoImE9JS40ZyBiPSUuNGcgaW49JWcgb3V0PSVnIiwKKyAgICAgICAgICAgIGFfZGl2IC8gZGl2LCBiX2RpdiAvIGRpdiwgeCwgKGFfZGl2ICogeCArIGJfZGl2KSAvIGRpdik7CisgICAgcmV0dXJuIChhX2RpdiAqIHggKyBiX2RpdikgLyBkaXY7Cit9CisKK2RvdWJsZSBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6ZXN0aW1hdGUoZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgICAgLyoKKyAgICAgKiBUT0RPOiBXZSBjb3VsZCB1cGRhdGUgdGhlIGhlYWQgYnkgYWRkaW5nIHRoZSBuZXcgc2FtcGxlIHRvIGl0CisgICAgICogYW5kIGFtcGxpZnlpbmcgaXQsIGJ1dCB0aGlzIGFwcHJvYWNoIGNhbiBsZWFkIHRvIHVuYm91bmRlZAorICAgICAqIGVycm9yLiBJbnN0ZWFkLCB3ZSByZWNhbGN1bGF0ZSB0aGUgaGVhZCBhdCBlYWNoIHN0ZXAsIHdoaWNoCisgICAgICogaXMgY29tcHV0YXRpb25hbGx5IG1vcmUgZXhwZW5zaXZlLiBXZSBjb3VsZCBiYWxhbmNlIHRoZSB0d28KKyAgICAgKiBtZXRob2RzIGJ5IHJlY2FsY3VsYXRpbmcganVzdCBiZWZvcmUgdGhlIGVycm9yIGJlY29tZXMKKyAgICAgKiBzaWduaWZpY2FudC4KKyAgICAgKi8KKyAgICBjb25zdCBib29sIHVwZGF0ZV9oZWFkID0gZmFsc2U7CisgICAgaWYgKHVwZGF0ZV9oZWFkKSB7CisgICAgICAgIC8vIGFkZCBuZXcgc2FtcGxlIHRvIHRoZSBoZWFkCisgICAgICAgIG1IZWFkLnNjYWxlKG1IZWFkRmFjdG9ySW52KTsgLy8gYW1wbGlmeSBoZWFkCisgICAgICAgIG1IZWFkLmFkZCh4LCB5LCBtRmlyc3RXZWlnaHQpOworICAgIH0KKworICAgIC8qCisgICAgICogVFJJQ0tZOiBwbGFjZSBlbGVtZW50cyBpbnRvIHRoZSBjaXJjdWxhciBidWZmZXIgYXQgZGVjcmVhc2luZworICAgICAqIGluZGljZXMsIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBwYXN0IGVsZW1lbnRzIGJ5IGFkZGl0aW9uCisgICAgICogKHRoZXJlYnkgYXZvaWRpbmcgcG90ZW50aWFsbHkgbmVnYXRpdmUgaW5kaWNlcy4pCisgICAgICovCisgICAgaWYgKG1OdW1TYW1wbGVzID49IG1IZWFkTGVuZ3RoKSB7CisgICAgICAgIC8vIG1vdmUgbGFzdCBoZWFkIHNhbXBsZSBmcm9tIGhlYWQgdG8gdGhlIG1haW4gd2luZG93CisgICAgICAgIHNpemVfdCBsYXN0SGVhZEl4ID0gKG1TYW1wbGVJeCArIG1IZWFkTGVuZ3RoKSAlIG1IaXN0b3J5TGVuZ3RoOworICAgICAgICBpZiAodXBkYXRlX2hlYWQpIHsKKyAgICAgICAgICAgIG1IZWFkLmFkZChtWEhpc3RvcnlbbGFzdEhlYWRJeF0sIG1ZSGlzdG9yeVtsYXN0SGVhZEl4XSwgLTEuKTsgLy8gcmVtb3ZlCisgICAgICAgIH0KKyAgICAgICAgbU1haW4uYWRkKG1YSGlzdG9yeVtsYXN0SGVhZEl4XSwgbVlIaXN0b3J5W2xhc3RIZWFkSXhdLCAxLik7CisgICAgICAgIGlmIChtTnVtU2FtcGxlcyA+PSBtSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgLy8gbW92ZSBsYXN0IG1haW4gc2FtcGxlIGZyb20gbWFpbiB3aW5kb3cgdG8gdGFpbAorICAgICAgICAgICAgbU1haW4uYWRkKG1YSGlzdG9yeVttU2FtcGxlSXhdLCBtWUhpc3RvcnlbbVNhbXBsZUl4XSwgLTEuKTsgLy8gcmVtb3ZlCisgICAgICAgICAgICBtVGFpbC5hZGQobVhIaXN0b3J5W21TYW1wbGVJeF0sIG1ZSGlzdG9yeVttU2FtcGxlSXhdLCAxLik7CisgICAgICAgICAgICBtVGFpbC5zY2FsZShtVGFpbEZhY3Rvcik7IC8vIGF0dGVudWF0ZSB0YWlsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBtWEhpc3RvcnkuZWRpdEl0ZW1BdChtU2FtcGxlSXgpID0geDsKKyAgICBtWUhpc3RvcnkuZWRpdEl0ZW1BdChtU2FtcGxlSXgpID0geTsKKyAgICBpZiAobU51bVNhbXBsZXMgPCBtSGlzdG9yeUxlbmd0aCkgeworICAgICAgICArK21OdW1TYW1wbGVzOworICAgIH0KKworICAgIC8vIHJlY2FsY3VsYXRlIGhlYWQgdW5sZXNzIHdlIHdlcmUgdXNpbmcgdGhlIHVwZGF0ZSBtZXRob2QKKyAgICBpZiAoIXVwZGF0ZV9oZWFkKSB7CisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgICAgIGRvdWJsZSB3ID0gbUZpcnN0V2VpZ2h0OworICAgICAgICBmb3IgKHNpemVfdCBoZWFkSXggPSAwOyBoZWFkSXggPCBtSGVhZExlbmd0aCAmJiBoZWFkSXggPCBtTnVtU2FtcGxlczsgKytoZWFkSXgpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IChtU2FtcGxlSXggKyBoZWFkSXgpICUgbUhpc3RvcnlMZW5ndGg7CisgICAgICAgICAgICBtSGVhZC5hZGQobVhIaXN0b3J5W2l4XSwgbVlIaXN0b3J5W2l4XSwgdyk7CisgICAgICAgICAgICB3ICo9IG1IZWFkRmFjdG9ySW52OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1TYW1wbGVJeCA+IDApIHsKKyAgICAgICAgLS1tU2FtcGxlSXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNhbXBsZUl4ID0gbUhpc3RvcnlMZW5ndGggLSAxOworICAgIH0KKworICAgIC8vIHJldHVybiBlc3RpbWF0aW9uIHJlc3VsdAorICAgIExpbmVhckZpdCB0b3RhbDsKKyAgICB0b3RhbC5jb21iaW5lKG1IZWFkKTsKKyAgICB0b3RhbC5jb21iaW5lKG1NYWluKTsKKyAgICB0b3RhbC5jb21iaW5lKG1UYWlsKTsKKyAgICByZXR1cm4gdG90YWwuaW50ZXJwb2xhdGUoeCk7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OnJlc2V0KCkgeworICAgIG1IZWFkLnJlc2V0KCk7CisgICAgbU1haW4ucmVzZXQoKTsKKyAgICBtVGFpbC5yZXNldCgpOworICAgIG1OdW1TYW1wbGVzID0gMDsKKyAgICBtU2FtcGxlSXggPSBtSGlzdG9yeUxlbmd0aCAtIDE7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyOWQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNCYXNlIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NvZGVjQmFzZTo6Q29kZWNCYXNlKCkgeworfQorCitDb2RlY0Jhc2U6On5Db2RlY0Jhc2UoKSB7Cit9CisKK0NvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uOjpQb3J0RGVzY3JpcHRpb24oKSB7Cit9CisKK0NvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uOjp+UG9ydERlc2NyaXB0aW9uKCkgeworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAppbmRleCA1NTMxZWE3NC4uNjVhZDBmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTEzLDEzICsxMywxMSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRGF0YVNvdXJjZSIKIAogI2luY2x1ZGUgImluY2x1ZGUvQU1SRXh0cmFjdG9yLmgiCiAKLSNpZiBDSFJPTUlVTV9BVkFJTEFCTEUKLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2VuZGlmCi0KICNpbmNsdWRlICJpbmNsdWRlL0FBQ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgiCkBAIC0zNSwxMCArMzMsMTUgQEAKIAogI2luY2x1ZGUgIm1hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpAQCAtMTgwLDcgKzE4MywxNSBAQAogCiAvLyBzdGF0aWMKIHNwPERhdGFTb3VyY2U+IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUsCisgICAgICAgIEhUVFBCYXNlICpodHRwU291cmNlKSB7CisgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgKmNvbnRlbnRUeXBlID0gIiI7CisgICAgfQorCiAgICAgYm9vbCBpc1dpZGV2aW5lID0gIXN0cm5jYXNlY21wKCJ3aWRldmluZTovLyIsIHVyaSwgMTEpOwogCiAgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOwpAQCAtMTg5LDcgKzIwMCwxOSBAQAogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KQogICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkKICAgICAgICAgICAgIHx8IGlzV2lkZXZpbmUpIHsKLSAgICAgICAgc3A8SFRUUEJhc2U+IGh0dHBTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBodHRwIHNlcnZpY2UhIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChodHRwU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOworICAgICAgICAgICAgaWYgKGNvbm4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBodHRwIGNvbm5lY3Rpb24gZnJvbSBodHRwIHNlcnZpY2UhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodHRwU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN0cmluZzggdG1wOwogICAgICAgICBpZiAoaXNXaWRldmluZSkgewpAQCAtMTk5LDMyICsyMjIsMzggQEAKICAgICAgICAgICAgIHVyaSA9IHRtcC5zdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChodHRwU291cmNlLT5jb25uZWN0KHVyaSwgaGVhZGVycykgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKKyAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOworICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBub25DYWNoZVNwZWNpZmljSGVhZGVyczsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICAgICAgbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMgPSAqaGVhZGVyczsKKyAgICAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCisgICAgICAgICAgICAgICAgICAgICZub25DYWNoZVNwZWNpZmljSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgJmNhY2hlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAmZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCh1cmksICZub25DYWNoZVNwZWNpZmljSGVhZGVycykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCBodHRwIHNvdXJjZSEiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFpc1dpZGV2aW5lKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOwotICAgICAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOwotICAgICAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvcHkgPSAqaGVhZGVyczsKLSAgICAgICAgICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHksICZjYWNoZUNvbmZpZywgJmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOworICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqY29udGVudFR5cGUgPSBodHRwU291cmNlLT5nZXRNSU1FVHlwZSgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzb3VyY2UgPSBOdUNhY2hlZFNvdXJjZTI6OkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgaHR0cFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVDb25maWcuaXNFbXB0eSgpID8gTlVMTCA6IGNhY2hlQ29uZmlnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVDb25maWcuaXNFbXB0eSgpID8gTlVMTCA6IGNhY2hlQ29uZmlnLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRoYXQgcHJlZmV0Y2hpbmcsIGNhY2hpbmcsIGRhdGFzb3VyY2Ugd3JhcHBlcgogICAgICAgICAgICAgLy8gaW4gdGhlIHdpZGV2aW5lOi8vIGNhc2UuCiAgICAgICAgICAgICBzb3VyY2UgPSBodHRwU291cmNlOwogICAgICAgICB9Ci0KLSMgaWYgQ0hST01JVU1fQVZBSUxBQkxFCiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImRhdGE6IiwgdXJpLCA1KSkgewotICAgICAgICBzb3VyY2UgPSBjcmVhdGVEYXRhVXJpU291cmNlKHVyaSk7Ci0jZW5kaWYKKyAgICAgICAgc291cmNlID0gRGF0YVVSSVNvdXJjZTo6Q3JlYXRlKHVyaSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQXNzdW1lIGl0J3MgYSBmaWxlbmFtZS4KICAgICAgICAgc291cmNlID0gbmV3IEZpbGVTb3VyY2UodXJpKTsKQEAgLTIzNyw2ICsyNjYsMTkgQEAKICAgICByZXR1cm4gc291cmNlOwogfQogCitzcDxEYXRhU291cmNlPiBEYXRhU291cmNlOjpDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkgeworICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOworICAgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUhUVFAoY29ubik7CisgICAgfQorfQorCiBTdHJpbmc4IERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgewogICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzOTMxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitzcDxEYXRhVVJJU291cmNlPiBEYXRhVVJJU291cmNlOjpDcmVhdGUoY29uc3QgY2hhciAqdXJpKSB7CisgICAgaWYgKHN0cm5jYXNlY21wKCJkYXRhOiIsIHVyaSwgNSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY2hhciAqY29tbWFQb3MgPSBzdHJyY2hyKHVyaSwgJywnKTsKKworICAgIGlmIChjb21tYVBvcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKworICAgIEFTdHJpbmcgdG1wKCZ1cmlbNV0sIGNvbW1hUG9zIC0gJnVyaVs1XSk7CisKKyAgICBpZiAodG1wLmVuZHNXaXRoKCI7YmFzZTY0IikpIHsKKyAgICAgICAgQVN0cmluZyBlbmNvZGVkKGNvbW1hUG9zICsgMSk7CisKKyAgICAgICAgLy8gU3RyaXAgQ1IgYW5kIExGLi4uCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBlbmNvZGVkLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkLmNfc3RyKClbaV0gPT0gJ1xyJyB8fCBlbmNvZGVkLmNfc3RyKClbaV0gPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGVuY29kZWQuZXJhc2UoaSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIgPSBkZWNvZGVCYXNlNjQoZW5jb2RlZCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgZm91bmQuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjaWYgMAorICAgICAgICBzaXplX3QgZGF0YUxlbiA9IHN0cmxlbih1cmkpIC0gdG1wLnNpemUoKSAtIDY7CisgICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGRhdGFMZW4pOworICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGNvbW1hUG9zICsgMSwgZGF0YUxlbik7CisKKyAgICAgICAgLy8gdW5lc2NhcGUKKyNlbHNlCisgICAgICAgIC8vIE1lZGlhUGxheWVyIGRvZXNuJ3QgY2FyZSBmb3IgdGhpcyByaWdodCBub3cgYXMgd2UgZG9uJ3QKKyAgICAgICAgLy8gcGxheSBhbnkgdGV4dC1iYXNlZCBtZWRpYS4KKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBjaGFyc2V0IG9yIG1pbWUgdHlwZS4KKworICAgIHJldHVybiBuZXcgRGF0YVVSSVNvdXJjZShidWZmZXIpOworfQorCitEYXRhVVJJU291cmNlOjpEYXRhVVJJU291cmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCisgICAgOiBtQnVmZmVyKGJ1ZmZlcikgeworfQorCitEYXRhVVJJU291cmNlOjp+RGF0YVVSSVNvdXJjZSgpIHsKK30KKworc3RhdHVzX3QgRGF0YVVSSVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBPSzsKK30KKworc3NpemVfdCBEYXRhVVJJU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ID49IChvZmY2NF90KW1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc2l6ZV90IGNvcHkgPSBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQ7CisgICAgaWYgKGNvcHkgPiBzaXplKSB7CisgICAgICAgIGNvcHkgPSBzaXplOworICAgIH0KKworICAgIG1lbWNweShkYXRhLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGNvcHkpOworCisgICAgcmV0dXJuIGNvcHk7Cit9CisKK3N0YXR1c190IERhdGFVUklTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICpzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCmluZGV4IGM3NmJjNGEuLjhmYmI1N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCkBAIC05MSw3ICs5MSw3IEBACiAgICAgfQogICAgIHdoaWxlIChtb3JlKTsKIAotICAgIEFMT0dWKCJ0YWc9MHglMDJ4IGRhdGFfc2l6ZT0lZCIsICp0YWcsICpkYXRhX3NpemUpOworICAgIEFMT0dWKCJ0YWc9MHglMDJ4IGRhdGFfc2l6ZT0lenUiLCAqdGFnLCAqZGF0YV9zaXplKTsKIAogICAgIGlmICgqZGF0YV9zaXplID4gc2l6ZSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcAppbmRleCAwOThmY2Y5Li5mYTcyNTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcApAQCAtMjA4LDU1ICsyMDgsNTUgQEAKIC8vIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVyIGxpc3QsIGJ1dCBkaXNjYXJkIHJlZHVuZGFudCBpbmZvcm1hdGlvbi4KIAogRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgRkxBQ1BhcnNlcjo6cmVhZF9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sIEZMQUNfX2J5dGUgYnVmZmVyW10sCiAgICAgICAgIHNpemVfdCAqYnl0ZXMsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5yZWFkQ2FsbGJhY2soYnVmZmVyLCBieXRlcyk7CiB9CiAKIEZMQUNfX1N0cmVhbURlY29kZXJTZWVrU3RhdHVzIEZMQUNQYXJzZXI6OnNlZWtfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAogICAgICAgICBGTEFDX191aW50NjQgYWJzb2x1dGVfYnl0ZV9vZmZzZXQsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5zZWVrQ2FsbGJhY2soYWJzb2x1dGVfYnl0ZV9vZmZzZXQpOwogfQogCiBGTEFDX19TdHJlYW1EZWNvZGVyVGVsbFN0YXR1cyBGTEFDUGFyc2VyOjp0ZWxsX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgRkxBQ19fdWludDY0ICphYnNvbHV0ZV9ieXRlX29mZnNldCwgdm9pZCAqY2xpZW50X2RhdGEpCiB7CiAgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPnRlbGxDYWxsYmFjayhhYnNvbHV0ZV9ieXRlX29mZnNldCk7CiB9CiAKIEZMQUNfX1N0cmVhbURlY29kZXJMZW5ndGhTdGF0dXMgRkxBQ1BhcnNlcjo6bGVuZ3RoX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgRkxBQ19fdWludDY0ICpzdHJlYW1fbGVuZ3RoLCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+bGVuZ3RoQ2FsbGJhY2soc3RyZWFtX2xlbmd0aCk7CiB9CiAKIEZMQUNfX2Jvb2wgRkxBQ1BhcnNlcjo6ZW9mX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLCB2b2lkICpjbGllbnRfZGF0YSkKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5lb2ZDYWxsYmFjaygpOwogfQogCiBGTEFDX19TdHJlYW1EZWNvZGVyV3JpdGVTdGF0dXMgRkxBQ1BhcnNlcjo6d3JpdGVfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwKICAgICAgICAgY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCBidWZmZXJbXSwgdm9pZCAqY2xpZW50X2RhdGEpCiB7CiAgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPndyaXRlQ2FsbGJhY2soZnJhbWUsIGJ1ZmZlcik7CiB9CiAKIHZvaWQgRkxBQ1BhcnNlcjo6bWV0YWRhdGFfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAogICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPm1ldGFkYXRhQ2FsbGJhY2sobWV0YWRhdGEpOwogfQogCiB2b2lkIEZMQUNQYXJzZXI6OmVycm9yX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cywgdm9pZCAqY2xpZW50X2RhdGEpCiB7CiAgICAgKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+ZXJyb3JDYWxsYmFjayhzdGF0dXMpOwpAQCAtMzgwLDE1ICszODAsMjEgQEAKIC8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgogLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vOChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5TW9ubzgoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weVN0ZXJlbzgoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weVN0ZXJlbzgoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwogICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKQEAgLTQwNCwxNSArNDEwLDIxIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KHNob3J0ICpkc3QsIGNvbnN0IGludCAqY29uc3QgKnNyYywgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKK3N0YXRpYyB2b2lkIGNvcHlNb25vMTYoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNihzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKICAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldOwpAQCAtNDMwLDE1ICs0NDIsMjEgQEAKIAogLy8gMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKIAotc3RhdGljIHZvaWQgY29weU1vbm8yNChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8yNChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwogICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPj4gODsKQEAgLTQ1NCw4ICs0NzIsMTEgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlUcmVzcGFzcyhzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3MoCisgICAgICAgIHNob3J0ICogLyogZHN0ICovLAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICogLyogc3JjICovLAorICAgICAgICB1bnNpZ25lZCAvKiBuU2FtcGxlcyAqLywKKyAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7CiAgICAgVFJFU1BBU1MoKTsKIH0KIApAQCAtNzAwLDcgKzcyMSw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKQorc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0YXJ0Iik7CiAKQEAgLTc5Miw4ICs4MTMsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykKLXsKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKaW5kZXggNWZhNGI2Zi4uMzIyOTFjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMjAsMTcgKzIwLDEzIEBACiAKICNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAKLSNpZiBDSFJPTUlVTV9BVkFJTEFCTEUKLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2VuZGlmCi0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgogCi0jaW5jbHVkZSA8Q29ubmVjdGl2aXR5TWFuYWdlci5oPgorI2luY2x1ZGUgPE5ldGRDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MCwzNCArMzYsNyBAQAogICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcygwKSwKICAgICAgIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcygwKSwKICAgICAgIG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwcygwKSwKLSAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zKDUwMDApLAotICAgICAgbVVJRFZhbGlkKGZhbHNlKSwKLSAgICAgIG1VSUQoMCkgewotfQotCi0vLyBzdGF0aWMKLXNwPEhUVFBCYXNlPiBIVFRQQmFzZTo6Q3JlYXRlKHVpbnQzMl90IGZsYWdzKSB7Ci0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0gICAgICAgIEhUVFBCYXNlICpkYXRhU291cmNlID0gY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZShmbGFncyk7Ci0gICAgICAgIGlmIChkYXRhU291cmNlKSB7Ci0gICAgICAgICAgIHJldHVybiBkYXRhU291cmNlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB7Ci0gICAgICAgIFRSRVNQQVNTKCk7Ci0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEhUVFBCYXNlOjpVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0gICAgcmV0dXJuIFVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLSNlbHNlCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotI2VuZGlmCisgICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSB7CiB9CiAKIHZvaWQgSFRUUEJhc2U6OmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KApAQCAtMTM1LDIxICsxMDQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBIVFRQQmFzZTo6c2V0VUlEKHVpZF90IHVpZCkgewotICAgIG1VSURWYWxpZCA9IHRydWU7Ci0gICAgbVVJRCA9IHVpZDsKLX0KLQotYm9vbCBIVFRQQmFzZTo6Z2V0VUlEKHVpZF90ICp1aWQpIGNvbnN0IHsKLSAgICBpZiAoIW1VSURWYWxpZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnVpZCA9IG1VSUQ7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQogLy8gc3RhdGljCiB2b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKSB7CiAgICAgaW50IHJlcyA9IHF0YWd1aWRfdGFnU29ja2V0KHNvY2tmZCwga1RhZywgdWlkKTsKQEAgLTE2OCw3ICsxMjIsNyBAQAogCiAvLyBzdGF0aWMKIHZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKSB7Ci0gICAgQ29ubmVjdGl2aXR5TWFuYWdlcjo6bWFya1NvY2tldEFzVXNlcihzb2NrZmQsIHVpZCk7CisgICAgc2V0TmV0d29ya0ZvclVzZXIodWlkLCBzb2NrZmQpOwogfQogCiAvLyBzdGF0aWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDM4MGRhYjQuLjRhNjMxNTI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKQEAgLTM5OCw3ICszOTgsOCBAQAogICAgICAgICAgICAgbVNlZWtlcik7CiB9CiAKLXNwPE1ldGFEYXRhPiBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworc3A8TWV0YURhdGE+IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAppbmRleCBjOWVkNWJiLi45ODU2ZjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcApAQCAtNTU1LDcgKzU1NSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW0pIHsKK3N0YXR1c190IE1QRUcyVFNXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW0gKi8pIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwpAQCAtNTk2LDcgKzU5Niw4IEBACiAgICAgcmV0dXJuICFtU3RhcnRlZCB8fCAobU51bVNvdXJjZXNEb25lID09IG1Tb3VyY2VzLnNpemUoKSA/IHRydWUgOiBmYWxzZSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNXcml0ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSB7CitzdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpkdW1wKAorICAgICAgICBpbnQgLyogZmQgKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC02ODEsNyArNjgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQUxPR1YoIndyaXRpbmcgYWNjZXNzIHVuaXQgYXQgdGltZSAlLjJmIHNlY3MgKGluZGV4ICVkKSIsCisgICAgICAgICAgICAgICAgQUxPR1YoIndyaXRpbmcgYWNjZXNzIHVuaXQgYXQgdGltZSAlLjJmIHNlY3MgKGluZGV4ICV6dSkiLAogICAgICAgICAgICAgICAgICAgICAgbWluVGltZVVzIC8gMUU2LCBtaW5JbmRleCk7CiAKICAgICAgICAgICAgICAgICBzb3VyY2UgPSBtU291cmNlcy5lZGl0SXRlbUF0KG1pbkluZGV4KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCA3Mjg0ZDZhLi5iNzU3Zjk0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0xNiwxNyArMTYsMTkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNUEVHNEV4dHJhY3RvciIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlVGFibGUuaCIKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNTEsMTEgKzUzLDEzIEBACiBjbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiBwdWJsaWM6CiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAorICAgIE1QRUc0U291cmNlKGNvbnN0IHNwPE1QRUc0RXh0cmFjdG9yPiAmb3duZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKKyAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwpAQCAtNzIsNiArNzYsOCBAQAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAorICAgIC8vIGtlZXAgdGhlIE1QRUc0RXh0cmFjdG9yIGFyb3VuZCwgc2luY2Ugd2UncmUgcmVmZXJlbmNpbmcgaXRzIGRhdGEKKyAgICBzcDxNUEVHNEV4dHJhY3Rvcj4gbU93bmVyOwogICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIGludDMyX3QgbVRpbWVzY2FsZTsKQEAgLTc5LDYgKzg1LDcgQEAKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OwogICAgIHVpbnQzMl90IG1DdXJyZW50RnJhZ21lbnRJbmRleDsKICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmbVNlZ21lbnRzOworICAgIGNvbnN0IFRyZXggKm1UcmV4OwogICAgIG9mZjY0X3QgbUZpcnN0TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1OZXh0TW9vZk9mZnNldDsKQEAgLTEwMCw2ICsxMDcsNyBAQAogICAgIHVpbnQ2NF90KiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzOwogCiAgICAgYm9vbCBtSXNBVkM7CisgICAgYm9vbCBtSXNIRVZDOwogICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CkBAIC0xNDUsNiArMTUzLDcgQEAKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgICAgIHNpemVfdCBzaXplOwogICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKKyAgICAgICAgaW50MzJfdCBjb21wb3NpdGlvbk9mZnNldDsKICAgICAgICAgdWludDhfdCBpdlsxNl07CiAgICAgICAgIFZlY3RvcjxzaXplX3Q+IGNsZWFyc2l6ZXM7CiAgICAgICAgIFZlY3RvcjxzaXplX3Q+IGVuY3J5cHRlZHNpemVzOwpAQCAtMjY0LDcgKzI3Myw3IEBACiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopX2RhdGE7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgcHJpbnRmKCIweCUwNHggICIsIG9mZnNldCk7CisgICAgICAgIHByaW50ZigiMHglMDR6eCAgIiwgb2Zmc2V0KTsKIAogICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBvZmZzZXQ7CiAgICAgICAgIGlmIChuID4gMTYpIHsKQEAgLTMyMSw2ICszMzAsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIAorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZS4iKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQzLDggKzM1NSw3IEBACiB9CiAKIE1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbVNpZHhEdXJhdGlvbigwKSwKLSAgICAgIG1Nb29mT2Zmc2V0KDApLAorICAgIDogbU1vb2ZPZmZzZXQoMCksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCkBAIC00MDksNyArNDIwLDcgQEAKICAgICAgICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKICAgICB9CiAKLSAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiAlZCB0cmFja3MiLCBuKTsKKyAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiAlenUgdHJhY2tzIiwgbik7CiAgICAgcmV0dXJuIG47CiB9CiAKQEAgLTQ4Miw4ICs0OTMsMTggQEAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIG9mZjY0X3Qgb3JpZ19vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgIGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCwgMCk7Ci0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKKworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gb3JpZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgY29udGludWUgcGFyc2luZyBpZiB0aGUgb2Zmc2V0IHdhcyBhZHZhbmNlZCwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcAorICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgYWR2YW5jZTogMHglbGxkLT4weCVsbGQiLCBvcmlnX29mZnNldCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApAQCAtNDkyLDEyICs1MTMsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOwotICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3MnLCAnaScsICdkJywgJ3gnKSkgewotICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHNpZHggYm94IHRvbwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgeworICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewogICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAogICAgICAgICAgICAgbU1vb2ZPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKSkgeworICAgICAgICAgICAgLy8ga2VlcCBwYXJzaW5nIHVudGlsIHdlIGdldCB0byB0aGUgZGF0YQorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNTA5LDggKzUzMCw2IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wNCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgbUluaXRDaGVjayA9IE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBlcnI7CiAgICAgfQpAQCAtNTc1LDcgKzU5NCw4IEBACiAgICAgcmV0dXJuIHNpemU7CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZURybVNJTkYob2ZmNjRfdCAqb2Zmc2V0LCBvZmY2NF90IGRhdGFfb2Zmc2V0KSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VEcm1TSU5GKAorICAgICAgICBvZmY2NF90ICogLyogb2Zmc2V0ICovLCBvZmY2NF90IGRhdGFfb2Zmc2V0KSB7CiAgICAgdWludDhfdCB1cGRhdGVJZFRhZzsKICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnVwZGF0ZUlkVGFnLCAxKSA8IDEpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwpAQCAtNzY0LDggKzc4NCwyNSBAQAogICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDE2IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAvLyBhdG9tIGV4dGVuZHMgdG8gZW5kIG9mIGZpbGUKKyAgICAgICAgICAgIG9mZjY0X3Qgc291cmNlU2l6ZTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc291cmNlU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBjaHVua19zaXplID0gKHNvdXJjZVNpemUgLSAqb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gWFhYIGNvdWxkIHdlIGp1c3QgcGljayBhICJzdWZmaWNpZW50bHkgbGFyZ2UiIHZhbHVlIGhlcmU/CisgICAgICAgICAgICAgICAgQUxPR0UoImF0b20gc2l6ZSBpcyAwLCBhbmQgZGF0YSBzb3VyY2UgaGFzIG5vIHNpemUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm90IGFsbG93ZWQgZm9yIG5vbi10b3BsZXZlbCBhdG9tcywgc2tpcCBpdAorICAgICAgICAgICAgKm9mZnNldCArPSA0OworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgewogICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlIiBQUkl1NjQsIGNodW5rX3NpemUpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIApAQCAtNzc2LDcgKzgxMyw3IEBACiAjaWYgMAogICAgIHN0YXRpYyBjb25zdCBjaGFyIGtXaGl0ZXNwYWNlW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CiAgICAgY29uc3QgY2hhciAqaW5kZW50ID0gJmtXaGl0ZXNwYWNlW3NpemVvZihrV2hpdGVzcGFjZSkgLSAxIC0gMiAqIGRlcHRoXTsKLSAgICBwcmludGYoIiVzZm91bmQgY2h1bmsgJyVzJyBvZiBzaXplICVsbGRcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOworICAgIHByaW50ZigiJXNmb3VuZCBjaHVuayAnJXMnIG9mIHNpemUgJSIgUFJJdTY0ICJcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOwogCiAgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICBzaXplX3QgbiA9IGNodW5rX3NpemU7CkBAIC04MzIsNyArODY5LDcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnZCcsICd0JywgJ3MnKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlVGFibGUgY2h1bmsgaXMgJWQgYnl0ZXMgbG9uZy4iLCAoc2l6ZV90KWNodW5rX3NpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVUYWJsZSBjaHVuayBpcyAlIiBQUkl1NjQgIiBieXRlcyBsb25nLiIsIGNodW5rX3NpemUpOwogCiAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpCiAgICAgICAgICAgICAgICAgICAgICAgICAmIChEYXRhU291cmNlOjprV2FudHNQcmVmZXRjaGluZwpAQCAtOTE5LDYgKzk1Niw4IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnbCcsICdzJywgJ3QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICAvLyBTZWUgMTQ0OTYtMTIgOC42LjYKICAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgMSkgPCAxKSB7CkBAIC05ODEsMTIgKzEwMjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnZicsICdyJywgJ20nLCAnYScpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHVpbnQzMl90IG9yaWdpbmFsX2ZvdXJjYzsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmb3JpZ2luYWxfZm91cmNjLCA0KSA8IDQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CkBAIC0xMDAwLDEyICsxMDQwLDEzIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdlJywgJ24nLCAnYycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMzIpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQpAQCAtMTA1MCwyMyArMTA5MSwyNSBAQAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgZGVmYXVsdElWU2l6ZSk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2snLCAnaCcsICdkJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrSGVhZGVyKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAncycsICdzJywgJ2gnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBQc3NoSW5mbyBwc3NoOwogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDQsICZwc3NoLnV1aWQsIDE2KSA8IDE2KSB7CkBAIC0xMDk1LDEyICsxMTM4LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUHNzaC5wdXNoX2JhY2socHNzaCk7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMTMxLDYgKzExNzUsOCBAQAogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgPSBudG9obCh0aW1lc2NhbGUpOwogCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMiBzYXlzIGFsbCBvbmVzIG1lYW5zIGluZGV0ZXJtaW5hdGUsIGJ1dCBzb21lIGZpbGVzIHNlZW0gdG8gdXNlCisgICAgICAgICAgICAvLyAwIGluc3RlYWQuIFdlIHRyZWF0IGJvdGggdGhlIHNhbWUuCiAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKQEAgLTExMzgsNyArMTE4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2g2NChkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbnRvaDY0KGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uMzI7CiAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0xMTQ2LDEzICsxMTk0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbjMyKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGZmbXBlZyBzZXRzIGR1cmF0aW9uIHRvIC0xLCB3aGljaCBpcyBpbmNvcnJlY3QuCiAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uMzIgIT0gMHhmZmZmZmZmZikgewogICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwogICAgICAgICAgICAgb2ZmNjRfdCBsYW5nX29mZnNldDsKQEAgLTExODEsNyArMTIzMCw2IEBACiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTI5MSw2ICsxMzM5LDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKToKICAgICAgICAgewogICAgICAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKIApAQCAtMTM0OCwxMSArMTM5OCwxMiBAQAogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDaHVua09mZnNldFBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMzYyLDExICsxNDEzLDEyIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTM3Nyw2ICsxNDI5LDggQEAKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQpAQCAtMTQyOSw3ICsxNDgzLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQogICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCkBAIC0xNDUzLDYgKzE1MDYsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAndCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0VGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDYxLDEyICsxNTE2LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnYycsICd0JywgJ3QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDc1LDEyICsxNTMxLDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFN5bmNTYW1wbGVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0ODksMTMgKzE1NDYsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEB4eXoKICAgICAgICAgY2FzZSBGT1VSQ0MoJ1x4QTknLCAneCcsICd5JywgJ3onKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiQHh5eiIgYm94CiAgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIkB4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LApAQCAtMTUyNCwxMiArMTU4MiwxMyBAQAogCiAgICAgICAgICAgICBidWZmZXJbbG9jYXRpb25fbGVuZ3RoXSA9ICdcMCc7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgYnVmZmVyKTsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xNTY3LDEyICsxNjI2LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICdDJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0xNTgzLDEyICsxNjQzLDI3IEBACiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKAogICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOworCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJzInLCAnNicsICczJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBkMjYzIGNvbnRhaW5zIGEgZml4ZWQgNyBieXRlcyBwYXJ0OgogICAgICAgICAgICAgICogICB2ZW5kb3IgLSA0IGJ5dGVzCkBAIC0xNjE0LDcgKzE2ODksNiBAQAogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTYyMiwxMSArMTY5NiwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTE2NjAsNiArMTczNiw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA9PSA2ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlSVR1bmVzTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAKQEAgLTE2NjgsMTcgKzE3NDYsMTggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdoJywgJ2QnKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDI0KSB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAzMikgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzI0XTsKKyAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzMyXTsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpCiAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKQEAgLTE2ODYsMTQgKzE3NjUsMjcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDY0X3QgY3JlYXRpb25UaW1lOworICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb24gPSAwOwogICAgICAgICAgICAgaWYgKGhlYWRlclswXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTY0X0FUKCZoZWFkZXJbNF0pOwogICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsyMF0pOworICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZoZWFkZXJbMjRdKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclswXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTMyX0FUKCZoZWFkZXJbNF0pOwogICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsxMl0pOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGQzMiA9IFUzMl9BVCgmaGVhZGVyWzE2XSk7CisgICAgICAgICAgICAgICAgaWYgKGQzMiA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGQzMiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZDMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CkBAIC0xNzAxLDcgKzE3OTMsNTAgQEAKIAogICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5RGF0ZSwgcy5zdHJpbmcoKSk7CiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICdoJywgJ2QnKToKKyAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgZmxhZ3NbNF07CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBmbGFncywgc2l6ZW9mKGZsYWdzKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBpZiAoZmxhZ3NbMF0gPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIDY0IGJpdAorICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAxMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+Z2V0VUludDY0KGRhdGFfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyAzMiBiaXQKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkMzI7CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZkMzIpOworICAgICAgICAgICAgICAgIGlmIChkMzIgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkMzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNzIyLDYgKzE4NTcsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDgsICZidWZmZXIsIDQpIDwgNCkgewpAQCAtMTczNiw3ICsxODczLDI2IEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKToKKyAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMjQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKKyAgICAgICAgICAgIFRyZXggdHJleDsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZ0cmV4LnRyYWNrX0lEKSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgOCwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgpIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAxMiwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24pIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAxNiwgJnRyZXguZGVmYXVsdF9zYW1wbGVfc2l6ZSkgfHwKKyAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDIwLCAmdHJleC5kZWZhdWx0X3NhbXBsZV9mbGFncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJleC5hZGQodHJleCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNzUzLDYgKzE5MDksNyBAQAogICAgICAgICAgICAgaWYgKChjaHVua19zaXplID4gU0laRV9NQVgpIHx8IChTSVpFX01BWCAtIGNodW5rX3NpemUgPD0gc2l6ZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplICsgY2h1bmtfc2l6ZV07CiAgICAgICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtMTc2Nyw2ICsxOTI0LDggQEAKICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CiAgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAorICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgcmVhZCBwb2ludGVyIHNvIHdlIGRvbid0IGVuZCB1cCByZWFkaW5nIHRoaXMgYWdhaW4KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCkBAIC0xNzgxLDYgKzE5NDAsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKG1GaWxlTWV0YURhdGEgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJjaHVua19kYXRhX3NpemUgPSAlbGxkIGFuZCBkYXRhX29mZnNldCA9ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplLCBkYXRhX29mZnNldCk7CkBAIC0xODAzLDcgKzE5NjQsNiBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKSArIGtTa2lwQnl0ZXNPZkRhdGFCb3gsIGNodW5rX2RhdGFfc2l6ZSAtIGtTa2lwQnl0ZXNPZkRhdGFCb3gpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xODE0LDI1ICsxOTc0LDI3IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2wnLCAnYicsICdtJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCd5JywgJ3InLCAncicsICdjJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2UzR1BQTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSwgZGVwdGgpOwogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnSScsICdEJywgJzMnLCAnMicpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA2KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcGFyc2VJRDN2Mk1ldGFEYXRhKGRhdGFfb2Zmc2V0ICsgNik7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE5MjQsNyArMjA4Niw3IEBACiAgICAgICAgIG9mZnNldCArPSAxNjsKICAgICAgICAgc2l6ZSAtPSAxNjsKICAgICB9Ci0gICAgQUxPR1YoInNpZHggcHJlcy9vZmY6ICVMZC8lTGQiLCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUsIGZpcnN0T2Zmc2V0KTsKKyAgICBBTE9HVigic2lkeCBwcmVzL29mZjogJSIgUFJJdTY0ICIvJSIgUFJJdTY0LCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUsIGZpcnN0T2Zmc2V0KTsKIAogICAgIGlmIChzaXplIDwgNCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE5NTYsOSArMjExOCwxMCBAQAogICAgICAgICAgICAgQUxPR1coInN1Yi1zaWR4IGJveGVzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBzYXAgPSBkMyAmIDB4ODAwMDAwMDA7Ci0gICAgICAgIGJvb2wgc2FwdHlwZSA9IGQzID4+IDI4OwotICAgICAgICBpZiAoIXNhcCB8fCBzYXB0eXBlID4gMikgewotICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGUiKTsKKyAgICAgICAgdWludDMyX3Qgc2FwdHlwZSA9IChkMyA+PiAyOCkgJiA3OworICAgICAgICBpZiAoIXNhcCB8fCAoc2FwdHlwZSAhPSAxICYmIHNhcHR5cGUgIT0gMikpIHsKKyAgICAgICAgICAgIC8vIHR5cGUgMSBhbmQgMiBhcmUgc3luYyBzYW1wbGVzCisgICAgICAgICAgICBBTE9HVygibm90IGEgc3RyZWFtIGFjY2VzcyBwb2ludCwgb3IgdW5zdXBwb3J0ZWQgdHlwZTogJTA4eCIsIGQzKTsKICAgICAgICAgfQogICAgICAgICB0b3RhbF9kdXJhdGlvbiArPSBkMjsKICAgICAgICAgb2Zmc2V0ICs9IDEyOwpAQCAtMTk2OSwxMiArMjEzMiwxMSBAQAogICAgICAgICBtU2lkeEVudHJpZXMuYWRkKHNlKTsKICAgICB9CiAKLSAgICBtU2lkeER1cmF0aW9uID0gdG90YWxfZHVyYXRpb24gKiAxMDAwMDAwIC8gdGltZVNjYWxlOwotICAgIEFMT0dWKCJkdXJhdGlvbjogJWxsZCIsIG1TaWR4RHVyYXRpb24pOworICAgIHVpbnQ2NF90IHNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKIAogICAgIGludDY0X3QgbWV0YUR1cmF0aW9uOwogICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBtU2lkeER1cmF0aW9uKTsKKyAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaWR4RHVyYXRpb24pOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMjY3LDExICsyNDI5LDE0IEBACiB9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZTNHUFBNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBkZXB0aCkgewotICAgIGlmIChzaXplIDwgNCkgeworICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgdWludDhfdCAqYnVmZmVyID0gbmV3IHVpbnQ4X3Rbc2l6ZV07CisgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIDFdOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgewogICAgICAgICBkZWxldGVbXSBidWZmZXI7CkBAIC0yMzM3LDYgKzI1MDIsMTAgQEAKICAgICAgICAgaW50IGxlbjE2ID0gMDsgLy8gTnVtYmVyIG9mIFVURi0xNiBjaGFyYWN0ZXJzCiAKICAgICAgICAgLy8gc21hbGxlc3QgcG9zc2libGUgdmFsaWQgVVRGLTE2IHN0cmluZyB3IEJPTTogMHhmZSAweGZmIDB4MDAgMHgwMAorICAgICAgICBpZiAoc2l6ZSA8IDYpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc2l6ZSAtIDYgPj0gNCkgewogICAgICAgICAgICAgbGVuMTYgPSAoKHNpemUgLSA2KSAvIDIpIC0gMTsgLy8gZG9uJ3QgaW5jbHVkZSAweDAwMDAgdGVybWluYXRvcgogICAgICAgICAgICAgZnJhbWVkYXRhID0gKGNoYXIxNl90ICopKGJ1ZmZlciArIDYpOwpAQCAtMjM2MCw2ICsyNTI5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc1VURjgpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgpAQCAtMjQ1MCwxMSArMjYyMCwyNCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0VHJhY2sgY2FsbGVkLCBwc3NoOiAlZCIsIG1Qc3NoLnNpemUoKSk7CiAKLSAgICByZXR1cm4gbmV3IE1QRUc0U291cmNlKAorICAgIFRyZXggKnRyZXggPSBOVUxMOworICAgIGludDMyX3QgdHJhY2tJZDsKKyAgICBpZiAodHJhY2stPm1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpbmRleCk7CisgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CisgICAgICAgICAgICAgICAgdHJleCA9IHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiZ2V0VHJhY2sgY2FsbGVkLCBwc3NoOiAlenUiLCBtUHNzaC5zaXplKCkpOworCisgICAgcmV0dXJuIG5ldyBNUEVHNFNvdXJjZSh0aGlzLAogICAgICAgICAgICAgdHJhY2stPm1ldGEsIG1EYXRhU291cmNlLCB0cmFjay0+dGltZXNjYWxlLCB0cmFjay0+c2FtcGxlVGFibGUsCi0gICAgICAgICAgICBtU2lkeEVudHJpZXMsIG1Nb29mT2Zmc2V0KTsKKyAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQpOwogfQogCiAvLyBzdGF0aWMKQEAgLTI0NzAsNiArMjY1MywxMSBAQAogICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVBVkNDKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUhWQ0MpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKQEAgLTI0NzgsMTQgKzI2NjYsNjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghdHJhY2stPnNhbXBsZVRhYmxlLT5pc1ZhbGlkKCkpIHsKKyAgICBpZiAodHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwgfHwgIXRyYWNrLT5zYW1wbGVUYWJsZS0+aXNWYWxpZCgpKSB7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgbWV0YWRhdGEgd2UgbmVlZC4KKyAgICAgICAgQUxPR0UoInN0YmwgYXRvbSBtaXNzaW5nL2ludmFsaWQuIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCit0eXBlZGVmIGVudW0geworICAgIC8vQU9UX05PTkUgICAgICAgICAgICAgPSAtMSwKKyAgICAvL0FPVF9OVUxMX09CSkVDVCAgICAgID0gMCwKKyAgICAvL0FPVF9BQUNfTUFJTiAgICAgICAgID0gMSwgLyoqPCBNYWluIHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFPVF9BQUNfTEMgICAgICAgICAgID0gMiwgICAvKio8IExvdyBDb21wbGV4aXR5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfQUFDX1NTUiAgICAgICAgICA9IDMsCisgICAgLy9BT1RfQUFDX0xUUCAgICAgICAgICA9IDQsCisgICAgQU9UX1NCUiAgICAgICAgICAgICAgPSA1LAorICAgIC8vQU9UX0FBQ19TQ0FMICAgICAgICAgPSA2LAorICAgIC8vQU9UX1RXSU5fVlEgICAgICAgICAgPSA3LAorICAgIC8vQU9UX0NFTFAgICAgICAgICAgICAgPSA4LAorICAgIC8vQU9UX0hWWEMgICAgICAgICAgICAgPSA5LAorICAgIC8vQU9UX1JTVkRfMTAgICAgICAgICAgPSAxMCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1JTVkRfMTEgICAgICAgICAgPSAxMSwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1RUU0kgICAgICAgICAgICAgPSAxMiwgLyoqPCBUVFNJIE9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX01BSU5fU1lOVEggICAgICAgPSAxMywgLyoqPCBNYWluIFN5bnRoZXRpYyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1dBVl9UQUJfU1lOVEggICAgPSAxNCwgLyoqPCBXYXZldGFibGUgU3ludGhlc2lzIG9iamVjdCAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0dFTl9NSURJICAgICAgICAgPSAxNSwgLyoqPCBHZW5lcmFsIE1JREkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0FMR19TWU5USF9BVURfRlggPSAxNiwgLyoqPCBBbGdvcml0aG1pYyBTeW50aGVzaXMgYW5kIEF1ZGlvIEZYIG9iamVjdCAqLworICAgIEFPVF9FUl9BQUNfTEMgICAgICAgID0gMTcsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3cgQ29tcGxleGl0eSAgICAqLworICAgIC8vQU9UX1JTVkRfMTggICAgICAgICAgPSAxOCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0FBQ19MVFAgICAgICAgPSAxOSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMVFAgb2JqZWN0ICAgICAgICAqLworICAgIEFPVF9FUl9BQUNfU0NBTCAgICAgID0gMjAsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBTY2FsYWJsZSBvYmplY3QgICAqLworICAgIC8vQU9UX0VSX1RXSU5fVlEgICAgICAgPSAyMSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFR3aW5WUSBvYmplY3QgICAgICAgICAqLworICAgIEFPVF9FUl9CU0FDICAgICAgICAgID0gMjIsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEJTQUMgb2JqZWN0ICAgICAgICAgICAqLworICAgIEFPVF9FUl9BQUNfTEQgICAgICAgID0gMjMsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3dEZWxheSBvYmplY3QgICAqLworICAgIC8vQU9UX0VSX0NFTFAgICAgICAgICAgPSAyNCwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIENFTFAgb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0hWWEMgICAgICAgICAgPSAyNSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhWWEMgb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0hJTE4gICAgICAgICAgPSAyNiwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhJTE4gb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX1BBUkEgICAgICAgICAgPSAyNywgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFBhcmFtZXRyaWMgb2JqZWN0ICAgICAqLworICAgIC8vQU9UX1JTVkRfMjggICAgICAgICAgPSAyOCwgLyoqPCBtaWdodCBiZWNvbWUgU1NDICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFPVF9QUyAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBQUywgUGFyYW1ldHJpYyBTdGVyZW8gKGluY2x1ZGVzIFNCUikgICAgICAqLworICAgIC8vQU9UX01QRUdTICAgICAgICAgICAgPSAzMCwgLyoqPCBNUEVHIFN1cnJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgQU9UX0VTQ0FQRSAgICAgICAgICAgPSAzMSwgICAvKio8IFNpZ25hbCBBT1QgdXNlcyBtb3JlIHRoYW4gNSBiaXRzICAgICAgICAgICovCisKKyAgICAvL0FPVF9NUDNPTk1QNF9MMSAgICAgID0gMzIsIC8qKjwgTVBFRy1MYXllcjEgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NUDNPTk1QNF9MMiAgICAgID0gMzMsIC8qKjwgTVBFRy1MYXllcjIgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NUDNPTk1QNF9MMyAgICAgID0gMzQsIC8qKjwgTVBFRy1MYXllcjMgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzM1ICAgICAgICAgID0gMzUsIC8qKjwgbWlnaHQgYmVjb21lIERTVCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzM2ICAgICAgICAgID0gMzYsIC8qKjwgbWlnaHQgYmVjb21lIEFMUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9BQUNfU0xTICAgICAgICAgID0gMzcsIC8qKjwgQUFDICsgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9TTFMgICAgICAgICAgICAgID0gMzgsIC8qKjwgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9BQUNfRUxEICAgICAgID0gMzksIC8qKjwgQUFDIEVuaGFuY2VkIExvdyBEZWxheSAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8vQU9UX1VTQUMgICAgICAgICAgICAgPSA0MiwgLyoqPCBVU0FDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1NBT0MgICAgICAgICAgICAgPSA0MywgLyoqPCBTQU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0xEX01QRUdTICAgICAgICAgPSA0NCwgLyoqPCBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAqLworCisgICAgLy9BT1RfUlNWRDUwICAgICAgICAgICA9IDUwLCAgLyoqPCBJbnRlcmltIEFPVCBmb3IgUnN2ZDUwICAgICAgICAgICAgICAgICAgICovCit9IEFVRElPX09CSkVDVF9UWVBFOworCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dXBkYXRlQXVkaW9UcmFja0luZm9Gcm9tRVNEU19NUEVHNEF1ZGlvKAogICAgICAgICBjb25zdCB2b2lkICplc2RzX2RhdGEsIHNpemVfdCBlc2RzX3NpemUpIHsKICAgICBFU0RTIGVzZHMoZXNkc19kYXRhLCBlc2RzX3NpemUpOwpAQCAtMjU2OCw3ICsyODA5LDcgQEAKICAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZSA9PSA1IHx8IG9iamVjdFR5cGUgPT0gMjkpIHsgLy8gU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YWJsZSAxLjEzCisgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YWJsZSAxLjEzCiAgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZTsKICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxNSkgewpAQCAtMjU4Niw2ICsyODI3LDEzMSBAQAogICAgICAgICAvLyAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKICAgICB9CiAKKyAgICBzd2l0Y2ggKG51bUNoYW5uZWxzKSB7CisgICAgICAgIC8vIHZhbHVlcyBkZWZpbmVkIGluIDE0NDk2LTNfMjAwOSBhbWVuZG1lbnQtNCBUYWJsZSAxLjE5IC0gQ2hhbm5lbCBDb25maWd1cmF0aW9uCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAxOi8vIEZDCisgICAgICAgIGNhc2UgMjovLyBGTCBGUgorICAgICAgICBjYXNlIDM6Ly8gRkMsIEZMIEZSCisgICAgICAgIGNhc2UgNDovLyBGQywgRkwgRlIsIFJDCisgICAgICAgIGNhc2UgNTovLyBGQywgRkwgRlIsIFNMIFNSCisgICAgICAgIGNhc2UgNjovLyBGQywgRkwgRlIsIFNMIFNSLCBMRkUKKyAgICAgICAgICAgIC8vbnVtQ2hhbm5lbHMgYWxyZWFkeSBjb250YWlucyB0aGUgcmlnaHQgdmFsdWUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOi8vIEZDLCBGTCBGUiwgU0wgU1IsIFJDLCBMRkUKKyAgICAgICAgICAgIG51bUNoYW5uZWxzID0gNzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6IC8vIEZDLCBGQ0wgRkNSLCBGTCBGUiwgU0wgU1IsIExGRQorICAgICAgICBjYXNlIDEyOi8vIEZDLCBGTCAgRlIsICBTTCBTUiwgUkwgUlIsIExGRQorICAgICAgICBjYXNlIDE0Oi8vIEZDLCBGTCAgRlIsICBTTCBTUiwgTEZFLCBGSEwgRkhSCisgICAgICAgICAgICBudW1DaGFubmVscyA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsKKyAgICAgICAgICAgIG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOworCisgICAgICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfRVNDQVBFKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9IDMyICsgYnIuZ2V0Qml0cyg2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MQyB8fAorICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAorICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOworCisgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgPSBici5nZXRCaXRzKDE0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBleHRlbnNpb25GbGFnID0gLTE7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvYmplY3RUeXBlKSB7CisgICAgICAgICAgICAgICAgLy8gMTQ0OTYtMyA0LjUuMS4xIGV4dGVuc2lvbkZsYWcKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEM6CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQlNBQzoKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1coImNzZCBtaXNzaW5nIGV4dGVuc2lvbiBmbGFnOyBhc3N1bWluZyAlZCBmb3Igb2JqZWN0IHR5cGUgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcsIG9iamVjdFR5cGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSAwOworICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbHNOdW0gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRWxlbWVudEluc3RhbmNlVGFnID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFByb2ZpbGUgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUJhY2tDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUFzc29jRGF0YUVsZW1lbnRzID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVZhbGlkQ2NFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgaWYgKE1vbm9NaXhkb3duUHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBpZiAoU3RlcmVvTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGlmIChNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXggPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFBzZXVkb1N1cnJvdW5kRW5hYmxlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gRnJvbnRFbGVtZW50SXNDcGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gU2lkZUVsZW1lbnRJc0NwZSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRUYWdTZWxlY3QgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBCYWNrRWxlbWVudElzQ3BlID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gY2hhbm5lbHNOdW07CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTGZlRWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsc051bSA9ICVkIiwgY2hhbm5lbHNOdW0pOworICAgICAgICAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsc0VmZmVjdGl2ZU51bSA9ICVkIiwgY2hhbm5lbHNFZmZlY3RpdmVOdW0pOworICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gY2hhbm5lbHNOdW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQpAQCAtMjYxNiwxOSArMjk4MiwyMyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzRTb3VyY2U6Ok1QRUc0U291cmNlKAorICAgICAgICBjb25zdCBzcDxNUEVHNEV4dHJhY3Rvcj4gJm93bmVyLAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCiAgICAgICAgIGludDMyX3QgdGltZVNjYWxlLAogICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKKyAgICAgICAgY29uc3QgVHJleCAqdHJleCwKICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQpCi0gICAgOiBtRm9ybWF0KGZvcm1hdCksCisgICAgOiBtT3duZXIob3duZXIpLAorICAgICAgbUZvcm1hdChmb3JtYXQpLAogICAgICAgbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtVGltZXNjYWxlKHRpbWVTY2FsZSksCiAgICAgICBtU2FtcGxlVGFibGUoc2FtcGxlVGFibGUpLAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCgwKSwKICAgICAgIG1DdXJyZW50RnJhZ21lbnRJbmRleCgwKSwKICAgICAgIG1TZWdtZW50cyhzaWR4KSwKKyAgICAgIG1UcmV4KHRyZXgpLAogICAgICAgbUZpcnN0TW9vZk9mZnNldChmaXJzdE1vb2ZPZmZzZXQpLAogICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0KGZpcnN0TW9vZk9mZnNldCksCiAgICAgICBtQ3VycmVudFRpbWUoMCksCkBAIC0yNjM3LDYgKzMwMDcsNyBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSgwKSwKICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMoTlVMTCksCiAgICAgICBtSXNBVkMoZmFsc2UpLAorICAgICAgbUlzSEVWQyhmYWxzZSksCiAgICAgICBtTkFMTGVuZ3RoU2l6ZSgwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1Hcm91cChOVUxMKSwKQEAgLTI2NDQsNiArMzAxNSw4IEBACiAgICAgICBtV2FudHNOQUxGcmFnbWVudHMoZmFsc2UpLAogICAgICAgbVNyY0J1ZmZlcihOVUxMKSB7CiAKKyAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOworCiAgICAgbUZvcm1hdC0+ZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmbUNyeXB0b01vZGUpOwogICAgIG1EZWZhdWx0SVZTaXplID0gMDsKICAgICBtRm9ybWF0LT5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZtRGVmYXVsdElWU2l6ZSk7CkBAIC0yNjYxLDYgKzMwMzQsNyBAQAogICAgIENIRUNLKHN1Y2Nlc3MpOwogCiAgICAgbUlzQVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBtSXNIRVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CiAKICAgICBpZiAobUlzQVZDKSB7CiAgICAgICAgIHVpbnQzMl90IHR5cGU7CkBAIC0yNjc1LDYgKzMwNDksMTggQEAKIAogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOworICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBDSEVDSyhzaXplID49IDcpOworICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpcHRyWzBdLCAxdSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisKKyAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0clsxNCArIDddICYgMyk7CiAgICAgfQogCiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZtVHJhY2tJZCkpOwpAQCAtMjc5OCw5ICszMTg0LDIwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKLSAgICAgICAgICAgICAgICAvLyAqb2Zmc2V0IHBvaW50cyB0byB0aGUgbWRhdCBib3ggZm9sbG93aW5nIHRoaXMgbW9vZgotICAgICAgICAgICAgICAgIHBhcnNlQ2h1bmsob2Zmc2V0KTsgLy8gZG9lc24ndCBhY3R1YWxseSBwYXJzZSBpdCwganVzdCB1cGRhdGVzIG9mZnNldAotICAgICAgICAgICAgICAgIG1OZXh0TW9vZk9mZnNldCA9ICpvZmZzZXQ7CisgICAgICAgICAgICAgICAgLy8gKm9mZnNldCBwb2ludHMgdG8gdGhlIGJveCBmb2xsb3dpbmcgdGhpcyBtb29mLiBGaW5kIHRoZSBuZXh0IG1vb2YgZnJvbSB0aGVyZS4KKworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGhkciwgOCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAqb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODU5LDcgKzMyNTYsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcyhvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7CitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvblNpemVzKAorICAgICAgICBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAvKiBzaXplICovKSB7CiAgICAgQUxPR1YoInBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcyIpOwogICAgIC8vIDE0NDk2LTEyIDguNy4xMgogICAgIHVpbnQ4X3QgdmVyc2lvbjsKQEAgLTI5MjEsNyArMzMxOSw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgeworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKAorICAgICAgICBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAvKiBzaXplICovKSB7CiAgICAgQUxPR1YoInBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzIik7CiAgICAgLy8gMTQ0OTYtMTIgOC43LjEzCiAgICAgdWludDhfdCB2ZXJzaW9uOwpAQCAtMzIyMCw4ICszNjE5LDggQEAKICAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKICAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50KSB7CiAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKKyAgICB9IGVsc2UgaWYgKG1UcmV4KSB7CisgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyZXgtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwogICAgIH0KIAogICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgewpAQCAtMzI0OCw3ICszNjQ3LDcgQEAKICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA8IHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpIHsKKyAgICBpZiAoc2l6ZSA8IChvZmY2NF90KXNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0zMjgyLDcgKzM2ODEsNyBAQAogICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSAlZCBhdCBvZmZzZXQgMHglMDhsbHgsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCisgICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlICVkIGF0IG9mZnNldCAweCUwOCIgUFJJeDY0ICIsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCiAgICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IiwgaSArIDEsCiAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgc2FtcGxlU2l6ZSwgc2FtcGxlRHVyYXRpb24sCiAgICAgICAgICAgICAgICAgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDAKQEAgLTMyOTAsNiArMzY4OSw3IEBACiAgICAgICAgIHRtcC5vZmZzZXQgPSBkYXRhT2Zmc2V0OwogICAgICAgICB0bXAuc2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIHRtcC5kdXJhdGlvbiA9IHNhbXBsZUR1cmF0aW9uOworICAgICAgICB0bXAuY29tcG9zaXRpb25PZmZzZXQgPSBzYW1wbGVDdHNPZmZzZXQ7CiAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5hZGQodG1wKTsKIAogICAgICAgICBkYXRhT2Zmc2V0ICs9IHNhbXBsZVNpemU7CkBAIC0zMzYxLDcgKzM3NjEsNyBAQAogCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgICAgICAgICAgc2Vla1RpbWVVcyAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwLAorICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsIDEwMDAwMDAsIG1UaW1lc2NhbGUsCiAgICAgICAgICAgICAgICAgJnNhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwogCiAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKQEAgLTM0MjMsNyArMzgyMyw3IEBACiAKICAgICBvZmY2NF90IG9mZnNldDsKICAgICBzaXplX3Qgc2l6ZTsKLSAgICB1aW50MzJfdCBjdHM7CisgICAgdWludDMyX3QgY3RzLCBzdHRzOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7CiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewpAQCAtMzQzMSw3ICszODMxLDcgQEAKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmN0cywgJmlzU3luY1NhbXBsZSwgJnN0dHMpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0zNDQ5LDcgKzM4NDksNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFtSXNBVkMgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKSB8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKICAgICAgICAgaWYgKG5ld0J1ZmZlcikgewogICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9CiAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKQEAgLTM0NjYsNiArMzg2Niw4IEBACiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzQ3OSw3ICszODgxLDcgQEAKICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDKSB7CisgICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CiAgICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCkBAIC0zNTU0LDEyICszOTU2LDEyIEBACiAgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAogICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewogICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CiAgICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKDB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CkBAIC0zNTkxLDYgKzM5OTMsOCBAQAogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAogICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzYzMyw3ICs0MDM3LDcgQEAKICAgICAgICAgICAgICAgICBjb25zdCBTaWR4RW50cnkgKnNlID0gJm1TZWdtZW50c1tpXTsKICAgICAgICAgICAgICAgICBpZiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzID4gc2Vla1RpbWVVcykgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIHRpbWUgaXMgc29tZXdoZXJlIGluIHRoaXMgc2VnbWVudAotICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DKSB8fAorICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DICYmIHNlZWtUaW1lVXMgPiB0b3RhbFRpbWUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIChzZWVrVGltZVVzIC0gdG90YWxUaW1lKSA+ICh0b3RhbFRpbWUgKyBzZS0+bUR1cmF0aW9uVXMgLSBzZWVrVGltZVVzKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RlZCBuZXh0IHN5bmMsIG9yIGNsb3Nlc3Qgc3luYyBhbmQgaXQgd2FzIGNsb3NlciB0byB0aGUgZW5kIG9mCkBAIC0zNjQ2LDExICs0MDUwLDE5IEBACiAgICAgICAgICAgICAgICAgdG90YWxUaW1lICs9IHNlLT5tRHVyYXRpb25VczsKICAgICAgICAgICAgICAgICB0b3RhbE9mZnNldCArPSBzZS0+bVNpemU7CiAgICAgICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IHRvdGFsT2Zmc2V0OwotICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7Ci0gICAgICAgIHBhcnNlQ2h1bmsoJnRvdGFsT2Zmc2V0KTsKLSAgICAgICAgbUN1cnJlbnRUaW1lID0gdG90YWxUaW1lICogbVRpbWVzY2FsZSAvIDEwMDAwMDBsbDsKKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IHRvdGFsT2Zmc2V0OworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKKyAgICAgICAgICAgIHBhcnNlQ2h1bmsoJnRvdGFsT2Zmc2V0KTsKKyAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IHRvdGFsVGltZSAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwbGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3aXRob3V0IHNpZHggYm94ZXMsIHdlIGNhbiBvbmx5IHNlZWsgdG8gMAorICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbUZpcnN0TW9vZk9mZnNldDsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKKyAgICAgICAgICAgIHBhcnNlQ2h1bmsoJnRtcCk7CisgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSAwOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewpAQCAtMzY2Miw3ICs0MDc0LDcgQEAKICAgICB9CiAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7Ci0gICAgc2l6ZV90IHNpemU7CisgICAgc2l6ZV90IHNpemUgPSAwOwogICAgIHVpbnQzMl90IGN0cyA9IDA7CiAgICAgYm9vbCBpc1N5bmNTYW1wbGUgPSBmYWxzZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwpAQCAtMzY3MCwyMiArNDA4MiwyNCBAQAogICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOwogCiAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCBmcmFnbWVudAotICAgICAgICAgICAgU2FtcGxlIGxhc3RTYW1wbGUgPSBtQ3VycmVudFNhbXBsZXNbbUN1cnJlbnRTYW1wbGVzLnNpemUoKSAtIDFdOwotICAgICAgICAgICAgb2ZmNjRfdCBuZXh0TW9vZiA9IG1OZXh0TW9vZk9mZnNldDsgLy8gbGFzdFNhbXBsZS5vZmZzZXQgKyBsYXN0U2FtcGxlLnNpemU7CisgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQgaWYgdGhlcmUgaXMgb25lCisgICAgICAgICAgICBpZiAobU5leHRNb29mT2Zmc2V0IDw9IG1DdXJyZW50TW9vZk9mZnNldCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2ZmNjRfdCBuZXh0TW9vZiA9IG1OZXh0TW9vZk9mZnNldDsKICAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG5leHRNb29mOwogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7CiAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgICAgIHBhcnNlQ2h1bmsoJm5leHRNb29mKTsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IFNhbXBsZSAqc21wbCA9ICZtQ3VycmVudFNhbXBsZXNbbUN1cnJlbnRTYW1wbGVJbmRleF07CiAgICAgICAgIG9mZnNldCA9IHNtcGwtPm9mZnNldDsKICAgICAgICAgc2l6ZSA9IHNtcGwtPnNpemU7Ci0gICAgICAgIGN0cyA9IG1DdXJyZW50VGltZTsKKyAgICAgICAgY3RzID0gbUN1cnJlbnRUaW1lICsgc21wbC0+Y29tcG9zaXRpb25PZmZzZXQ7CiAgICAgICAgIG1DdXJyZW50VGltZSArPSBzbXBsLT5kdXJhdGlvbjsKICAgICAgICAgaXNTeW5jU2FtcGxlID0gKG1DdXJyZW50U2FtcGxlSW5kZXggPT0gMCk7IC8vIFhYWAogCkBAIC0zNzE3LDcgKzQxMzEsNyBAQAogICAgICAgICBidWZtZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIG1DcnlwdG9LZXksIDE2KTsKICAgICB9CiAKLSAgICBpZiAoIW1Jc0FWQyB8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmICghaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0zNzQyLDYgKzQxNTYsOCBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzc1NSw3ICs0MTcxLDcgQEAKICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDKSB7CisgICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CiAgICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCkBAIC0zODkzLDYgKzQzMDksOCBAQAogCiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCkBAIC0zOTU1LDYgKzQzNzMsOCBAQAogICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJ20nKSwKICAgICAgICAgRk9VUkNDKCdpJywgJ3MnLCAnbycsICcyJyksCiAgICAgICAgIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpLAorICAgICAgICBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyksCiAgICAgICAgIEZPVVJDQygnMycsICdnJywgJ3AnLCAnNCcpLAogICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzEnKSwKICAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcyJyksCkBAIC00MDI2LDcgKzQ0NDYsNyBAQAogCiAgICAgICAgIGNoYXIgY2h1bmtzdHJpbmdbNV07CiAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtUeXBlLCBjaHVua3N0cmluZyk7Ci0gICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlbGxkIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIG9mZnNldCk7CisgICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCBvZmZzZXQpOwogICAgICAgICBzd2l0Y2ggKGNodW5rVHlwZSkgewogICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAndCcsICd5JywgJ3AnKToKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCA0Mjg4NWRkLi40Yjg0NDBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC0xNiwxMiArMTYsMTcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNUEVHNFdyaXRlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CkBAIC0zMywxMyArMzgsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjZGVmaW5lIFdBUk5fVU5MRVNTKGNvbmRpdGlvbiwgbWVzc2FnZSwgLi4uKSBcCisoIChDT05ESVRJT04oY29uZGl0aW9uKSkgPyBmYWxzZSA6ICh7IFwKKyAgICBBTE9HVygiQ29uZGl0aW9uICVzIGZhaWxlZCAiICBtZXNzYWdlLCAjY29uZGl0aW9uLCAjI19fVkFfQVJHU19fKTsgXAorICAgIHRydWU7IFwKK30pKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5TdHJlYW1hYmxlRmlsZVNpemVJbkJ5dGVzID0gNSAqIDEwMjQgKiAxMDI0OwpAQCAtNDA4LDcgKzQxNSw3IEBACiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6ZHVtcCgKLSAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CisgICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyogYXJncyAqLykgY29uc3QgewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwpAQCAtNDE5LDcgKzQyNiw3IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICBmcmFtZXMgZW5jb2RlZCA6ICVkXG4iLCBtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICBkdXJhdGlvbiBlbmNvZGVkIDogJWxsZCB1c1xuIiwgbVRyYWNrRHVyYXRpb25Vcyk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgIGR1cmF0aW9uIGVuY29kZWQgOiAlIiBQUklkNjQgIiB1c1xuIiwgbVRyYWNrRHVyYXRpb25Vcyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE9LOwpAQCAtNDM0LDcgKzQ0MSw3IEBACiAKICAgICAvLyBBdCBtb3N0IDIgdHJhY2tzIGNhbiBiZSBzdXBwb3J0ZWQuCiAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID49IDIpIHsKLSAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoJWQpIHRvIGFkZCIsIG1UcmFja3Muc2l6ZSgpKTsKKyAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoJXp1KSB0byBhZGQiLCBtVHJhY2tzLnNpemUoKSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKQEAgLTU0OCw4ICs1NTUsOCBAQAogICAgICAgICBzaXplID0gTUFYX01PT1ZfQk9YX1NJWkU7CiAgICAgfQogCi0gICAgQUxPR0koImxpbWl0czogJWxsZC8lbGxkIGJ5dGVzL3VzLCBiaXQgcmF0ZTogJWQgYnBzIGFuZCB0aGUgZXN0aW1hdGVkIgotICAgICAgICAgIiBtb292IHNpemUgJWxsZCBieXRlcyIsCisgICAgQUxPR0koImxpbWl0czogJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgYnl0ZXMvdXMsIGJpdCByYXRlOiAlZCBicHMgYW5kIHRoZSIKKyAgICAgICAgICIgZXN0aW1hdGVkIG1vb3Ygc2l6ZSAlIiBQUklkNjQgIiBieXRlcyIsCiAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcywgYml0UmF0ZSwgc2l6ZSk7CiAgICAgcmV0dXJuIGZhY3RvciAqIHNpemU7CiB9CkBAIC01ODUsOCArNTkyLDggQEAKICAgICAgICAgLy8gSWYgZmlsZSBzaXplIGlzIHNldCB0byBiZSBsYXJnZXIgdGhhbiB0aGUgMzIgYml0IGZpbGUKICAgICAgICAgLy8gc2l6ZSBsaW1pdCwgdHJlYXQgaXQgYXMgYW4gZXJyb3IuCiAgICAgICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID4ga01heDMyQml0RmlsZVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dXKCIzMi1iaXQgZmlsZSBzaXplIGxpbWl0ICglbGxkIGJ5dGVzKSB0b28gYmlnLiAiCi0gICAgICAgICAgICAgICAgICJJdCBpcyBjaGFuZ2VkIHRvICVsbGQgYnl0ZXMiLAorICAgICAgICAgICAgQUxPR1coIjMyLWJpdCBmaWxlIHNpemUgbGltaXQgKCUiIFBSSWQ2NCAiIGJ5dGVzKSB0b28gYmlnLiAiCisgICAgICAgICAgICAgICAgICJJdCBpcyBjaGFuZ2VkIHRvICUiIFBSSWQ2NCAiIGJ5dGVzIiwKICAgICAgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBrTWF4MzJCaXRGaWxlU2l6ZSk7CiAgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID0ga01heDMyQml0RmlsZVNpemU7CiAgICAgICAgIH0KQEAgLTg0Nyw3ICs4NTQsNyBAQAogICAgIH0KIAogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgQUxPR0QoIkR1cmF0aW9uIGZyb20gdHJhY2tzIHJhbmdlIGlzIFslbGxkLCAlbGxkXSB1cyIsCisgICAgICAgIEFMT0dEKCJEdXJhdGlvbiBmcm9tIHRyYWNrcyByYW5nZSBpcyBbJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiXSB1cyIsCiAgICAgICAgICAgICBtaW5EdXJhdGlvblVzLCBtYXhEdXJhdGlvblVzKTsKICAgICB9CiAKQEAgLTk3NCwxMyArOTgxLDE2IEBACiAgICAgaWYgKHBhcmFtICYmIHBhcmFtLT5maW5kSW50MzIoa0tleUZpbGVUeXBlLCAmZmlsZVR5cGUpICYmCiAgICAgICAgIGZpbGVUeXBlICE9IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7CiAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7Ci0gICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVJbnQzMigwKTsKICAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICAgICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOworICAgICAgICB3cml0ZUludDMyKDApOworICAgICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOworICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOwogICAgIH0KIAotICAgIHdyaXRlSW50MzIoMCk7Ci0gICAgd3JpdGVGb3VyY2MoImlzb20iKTsKLSAgICB3cml0ZUZvdXJjYygiM2dwNCIpOwogICAgIGVuZEJveCgpOwogfQogCkBAIC0xMzExLDEyICsxMzIxLDEyIEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OnNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpIHsKLSAgICBBTE9HSSgic2V0U3RhcnRUaW1lc3RhbXBVczogJWxsZCIsIHRpbWVVcyk7CisgICAgQUxPR0koInNldFN0YXJ0VGltZXN0YW1wVXM6ICUiIFBSSWQ2NCwgdGltZVVzKTsKICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgPCAwIHx8IG1TdGFydFRpbWVzdGFtcFVzID4gdGltZVVzKSB7CiAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZVVzOwotICAgICAgICBBTE9HSSgiRWFybGllc3QgdHJhY2sgc3RhcnRpbmcgdGltZTogJWxsZCIsIG1TdGFydFRpbWVzdGFtcFVzKTsKKyAgICAgICAgQUxPR0koIkVhcmxpZXN0IHRyYWNrIHN0YXJ0aW5nIHRpbWU6ICUiIFBSSWQ2NCwgbVN0YXJ0VGltZXN0YW1wVXMpOwogICAgIH0KIH0KIApAQCAtMTQwNiw3ICsxNDE2LDcgQEAKICAgICAgICAgc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IGR1cmF0aW9uKSB7CiAKICAgICBpZiAoZHVyYXRpb24gPT0gMCkgewotICAgICAgICBBTE9HVygiMC1kdXJhdGlvbiBzYW1wbGVzIGZvdW5kOiAlZCIsIHNhbXBsZUNvdW50KTsKKyAgICAgICAgQUxPR1coIjAtZHVyYXRpb24gc2FtcGxlcyBmb3VuZDogJXp1Iiwgc2FtcGxlQ291bnQpOwogICAgIH0KICAgICBtU3R0c1RhYmxlRW50cmllcy0+YWRkKGh0b25sKHNhbXBsZUNvdW50KSk7CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPmFkZChodG9ubChkdXJhdGlvbikpOwpAQCAtMTUxNyw3ICsxNTI3LDcgQEAKICAgICB7CiAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICBBTE9HVigiUmVjZWl2ZSByZXF1ZXN0IHRvIHRyYWNrIHByb2dyZXNzIHN0YXR1cyBmb3IgZXZlcnkgJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZSByZXF1ZXN0IHRvIHRyYWNrIHByb2dyZXNzIHN0YXR1cyBmb3IgZXZlcnkgJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMpOwogICAgICAgICAgICAgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA9IHRpbWVVczsKICAgICAgICAgICAgIG1UcmFja2luZ1Byb2dyZXNzU3RhdHVzID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMTU1MSw3ICsxNTYxLDcgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVDaHVua1RvRmlsZShDaHVuayogY2h1bmspIHsKLSAgICBBTE9HVigid3JpdGVDaHVua1RvRmlsZTogJWxsZCBmcm9tICVzIHRyYWNrIiwKKyAgICBBTE9HVigid3JpdGVDaHVua1RvRmlsZTogJSIgUFJJZDY0ICIgZnJvbSAlcyB0cmFjayIsCiAgICAgICAgIGNodW5rLT5tVGltZVN0YW1wVXMsIGNodW5rLT5tVHJhY2stPmlzQXVkaW8oKT8gImF1ZGlvIjogInZpZGVvIik7CiAKICAgICBpbnQzMl90IGlzRmlyc3RTYW1wbGUgPSB0cnVlOwpAQCAtMTU4Niw3ICsxNTk2LDcgQEAKICAgICBzZW5kU2Vzc2lvblN1bW1hcnkoKTsKIAogICAgIG1DaHVua0luZm9zLmNsZWFyKCk7Ci0gICAgQUxPR0QoIiVkIGNodW5rcyBhcmUgd3JpdHRlbiBpbiB0aGUgbGFzdCBiYXRjaCIsIG91dHN0YW5kaW5nQ2h1bmtzKTsKKyAgICBBTE9HRCgiJXp1IGNodW5rcyBhcmUgd3JpdHRlbiBpbiB0aGUgbGFzdCBiYXRjaCIsIG91dHN0YW5kaW5nQ2h1bmtzKTsKIH0KIAogYm9vbCBNUEVHNFdyaXRlcjo6ZmluZENodW5rVG9Xcml0ZShDaHVuayAqY2h1bmspIHsKQEAgLTE3MjcsNyArMTczNyw3IEBACiAgICAgICAgICAgICBzdGFydFRpbWVPZmZzZXRVcyA9IGtJbml0aWFsRGVsYXlUaW1lVXM7CiAgICAgICAgIH0KICAgICAgICAgc3RhcnRUaW1lVXMgKz0gc3RhcnRUaW1lT2Zmc2V0VXM7Ci0gICAgICAgIEFMT0dJKCJTdGFydCB0aW1lIG9mZnNldDogJWxsZCB1cyIsIHN0YXJ0VGltZU9mZnNldFVzKTsKKyAgICAgICAgQUxPR0koIlN0YXJ0IHRpbWUgb2Zmc2V0OiAlIiBQUklkNjQgIiB1cyIsIHN0YXJ0VGltZU9mZnNldFVzKTsKICAgICB9CiAKICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOwpAQCAtMTc2Miw3ICsxNzcyLDcgQEAKIH0KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpzdG9wKCkgewotICAgIEFMT0dEKCJTdG9wcGluZyAlcyB0cmFjayIsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKKyAgICBBTE9HRCgiJXMgdHJhY2sgc3RvcHBpbmciLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HRSgiU3RvcCgpIGNhbGxlZCBidXQgdHJhY2sgaXMgbm90IHN0YXJ0ZWQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CkBAIC0xNzczLDE4ICsxNzgzLDEzIEBACiAgICAgfQogICAgIG1Eb25lID0gdHJ1ZTsKIAorICAgIEFMT0dEKCIlcyB0cmFjayBzb3VyY2Ugc3RvcHBpbmciLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIEFMT0dEKCIlcyB0cmFjayBzb3VyY2Ugc3RvcHBlZCIsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKKwogICAgIHZvaWQgKmR1bW15OwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gKHN0YXR1c190KSBkdW1teTsKLQotICAgIEFMT0dEKCJTdG9wcGluZyAlcyB0cmFjayBzb3VyY2UiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7Ci0gICAgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIGlmIChlcnIgPT0gT0sgJiYgc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBlcnIgPSBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogCiAgICAgQUxPR0QoIiVzIHRyYWNrIHN0b3BwZWQiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CiAgICAgcmV0dXJuIGVycjsKQEAgLTE3OTksNyArMTgwNCw3IEBACiAgICAgVHJhY2sgKnRyYWNrID0gc3RhdGljX2Nhc3Q8VHJhY2sgKj4obWUpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gdHJhY2stPnRocmVhZEVudHJ5KCk7Ci0gICAgcmV0dXJuICh2b2lkICopIGVycjsKKyAgICByZXR1cm4gKHZvaWQgKikodWludHB0cl90KWVycjsKIH0KIAogc3RhdGljIHZvaWQgZ2V0TmFsVW5pdFR5cGUodWludDhfdCBieXRlLCB1aW50OF90KiB0eXBlKSB7CkBAIC0xODEyLDcgKzE4MTcsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmROZXh0U3RhcnRDb2RlKAogICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CiAKLSAgICBBTE9HVigiZmluZE5leHRTdGFydENvZGU6ICVwICVkIiwgZGF0YSwgbGVuZ3RoKTsKKyAgICBBTE9HVigiZmluZE5leHRTdGFydENvZGU6ICVwICV6dSIsIGRhdGEsIGxlbmd0aCk7CiAKICAgICBzaXplX3QgYnl0ZXNMZWZ0ID0gbGVuZ3RoOwogICAgIHdoaWxlIChieXRlc0xlZnQgPiA0ICAmJgpAQCAtMTg3MSw3ICsxODc2LDcgQEAKICAgICAvLyAyIGJ5dGVzIGZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aCBmaWVsZAogICAgIC8vIHBsdXMgdGhlIDcgYnl0ZXMgZm9yIHRoZSBoZWFkZXIKICAgICBpZiAoc2l6ZSA8IDQgKyA3KSB7Ci0gICAgICAgIEFMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICVkIiwgc2l6ZSk7CisgICAgICAgIEFMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICV6dSIsIHNpemUpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIApAQCAtMTk0MCw3ICsxOTQ1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuU2VxUGFyYW1TZXRzID4gMHgxRikgewotICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHNlcSBwYXJhbWV0ZXIgc2V0cyAoJWQpIGZvdW5kIiwgblNlcVBhcmFtU2V0cyk7CisgICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgc2VxIHBhcmFtZXRlciBzZXRzICglenUpIGZvdW5kIiwgblNlcVBhcmFtU2V0cyk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMTk1Myw3ICsxOTU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPiAweEZGKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglZCkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKKyAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBwaWMgcGFyYW1ldGVyIHNldHMgKCV6ZCkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTgzLDcgKzE5ODgsNyBAQAogICAgIH0KIAogICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlZCIsIHNpemUpOworICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlenUiLCBzaXplKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKQEAgLTIwOTksNiArMjEwNCw3IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIGNvbnN0IGNoYXIgKnRyYWNrTmFtZSA9IG1Jc0F1ZGlvID8gIkF1ZGlvIiA6ICJWaWRlbyI7CiAgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKSkgPT0gT0spIHsKICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0yMTk0LDE1ICsyMjAwLDI3IEBACiAKICAgICAgICAgaWYgKG1SZXN1bWVkKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA9IHRpbWVzdGFtcFVzIC0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0tfR0UoZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzLCAwbGwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludDY0X3QgcGF1c2VkRHVyYXRpb25VcyA9IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyAtIG1UcmFja0R1cmF0aW9uVXM7Ci0gICAgICAgICAgICBDSEVDS19HRShwYXVzZWREdXJhdGlvblVzLCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MocGF1c2VkRHVyYXRpb25VcyA+PSBsYXN0RHVyYXRpb25VcywgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9IHBhdXNlZER1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VczsKICAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOworICAgICAgICBpZiAoV0FSTl9VTkxFU1ModGltZXN0YW1wVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICghbUlzQXVkaW8pIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb21wb3NpdGlvbiB0aW1lOiB0aW1lc3RhbXBVcwpAQCAtMjIxNCwxNSArMjIzMiwyMyBAQAogICAgICAgICAgICAgZGVjb2RpbmdUaW1lVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwogICAgICAgICAgICAgY3R0c09mZnNldFRpbWVVcyA9CiAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzICsga01heEN0dHNPZmZzZXRUaW1lVXMgLSBkZWNvZGluZ1RpbWVVczsKLSAgICAgICAgICAgIENIRUNLX0dFKGN0dHNPZmZzZXRUaW1lVXMsIDBsbCk7CisgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MoY3R0c09mZnNldFRpbWVVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICBBTE9HVigiZGVjb2RpbmcgdGltZTogJWxsZCBhbmQgY3R0cyBvZmZzZXQgdGltZTogJWxsZCIsCisgICAgICAgICAgICBBTE9HVigiZGVjb2RpbmcgdGltZTogJSIgUFJJZDY0ICIgYW5kIGN0dHMgb2Zmc2V0IHRpbWU6ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgY3R0c09mZnNldFRpbWVVcyk7CiAKICAgICAgICAgICAgIC8vIFVwZGF0ZSBjdHRzIGJveCB0YWJsZSBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgIGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzID0KICAgICAgICAgICAgICAgICAgICAgKGN0dHNPZmZzZXRUaW1lVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOwotICAgICAgICAgICAgQ0hFQ0tfTEUoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MsIDB4MEZGRkZGRkZGTEwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzIDw9IDB4MEZGRkZGRkZGTEwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGZpcnN0IGN0dHMgdGFibGUgZW50cnkgdG8gaGF2ZSBvbmUgc2luZ2xlIGVudHJ5CiAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZG8gYWRqdXN0bWVudCBmb3IgdGhlIGluaXRpYWwgdHJhY2sgc3RhcnQKQEAgLTIyNjAsOSArMjI4NiwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfR0UodGltZXN0YW1wVXMsIDBsbCk7Ci0gICAgICAgIEFMT0dWKCIlcyBtZWRpYSB0aW1lIHN0YW1wOiAlbGxkIGFuZCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb24gJWxsZCIsCi0gICAgICAgICAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOworICAgICAgICBpZiAoV0FSTl9VTkxFU1ModGltZXN0YW1wVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIlcyBtZWRpYSB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiBhbmQgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICB0cmFja05hbWUsIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOwogICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtVHJhY2tEdXJhdGlvblVzKSB7CiAgICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CiAgICAgICAgIH0KQEAgLTIyNzYsMTEgKzIzMDYsMjggQEAKICAgICAgICAgICAgICgodGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMIC0KICAgICAgICAgICAgICAgICAobGFzdFRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCk7CiAgICAgICAgIGlmIChjdXJyRHVyYXRpb25UaWNrcyA8IDBsbCkgewotICAgICAgICAgICAgQUxPR0UoInRpbWVzdGFtcFVzICVsbGQgPCBsYXN0VGltZXN0YW1wVXMgJWxsZCBmb3IgJXMgdHJhY2siLAotICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKKyAgICAgICAgICAgIEFMT0dFKCJ0aW1lc3RhbXBVcyAlIiBQUklkNjQgIiA8IGxhc3RUaW1lc3RhbXBVcyAlIiBQUklkNjQgIiBmb3IgJXMgdHJhY2siLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMsIHRyYWNrTmFtZSk7CisgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIC8vIGlmIHRoZSBkdXJhdGlvbiBpcyBkaWZmZXJlbnQgZm9yIHRoaXMgc2FtcGxlLCBzZWUgaWYgaXQgaXMgY2xvc2UgZW5vdWdoIHRvIHRoZSBwcmV2aW91cworICAgICAgICAvLyBkdXJhdGlvbiB0aGF0IHdlIGNhbiBmdWRnZSBpdCBhbmQgdXNlIHRoZSBzYW1lIHZhbHVlLCB0byBhdm9pZCBmaWxsaW5nIHRoZSBzdHRzIHRhYmxlCisgICAgICAgIC8vIHdpdGggbG90cyBvZiBuZWFyLWlkZW50aWNhbCBlbnRyaWVzLgorICAgICAgICAvLyAiY2xvc2UgZW5vdWdoIiBoZXJlIG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgZHVyYXRpb24gbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgbGVzcworICAgICAgICAvLyB0aGFuIDAuMSBtaWxsaXNlY29uZHMKKyAgICAgICAgaWYgKGxhc3REdXJhdGlvblRpY2tzICYmIChjdXJyRHVyYXRpb25UaWNrcyAhPSBsYXN0RHVyYXRpb25UaWNrcykpIHsKKyAgICAgICAgICAgIGludDY0X3QgZGVsdGFVcyA9ICgobGFzdER1cmF0aW9uVGlja3MgLSBjdXJyRHVyYXRpb25UaWNrcykgKiAxMDAwMDAwTEwKKyAgICAgICAgICAgICAgICAgICAgKyAobVRpbWVTY2FsZSAvIDIpKSAvIG1UaW1lU2NhbGU7CisgICAgICAgICAgICBpZiAoZGVsdGFVcyA+IC0xMDAgJiYgZGVsdGFVcyA8IDEwMCkgeworICAgICAgICAgICAgICAgIC8vIHVzZSBwcmV2aW91cyB0aWNrcywgYW5kIGFkanVzdCB0aW1lc3RhbXAgYXMgaWYgaXQgd2FzIGFjdHVhbGx5IHRoYXQgbnVtYmVyCisgICAgICAgICAgICAgICAgLy8gb2YgdGlja3MKKyAgICAgICAgICAgICAgICBjdXJyRHVyYXRpb25UaWNrcyA9IGxhc3REdXJhdGlvblRpY2tzOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzICs9IGRlbHRhVXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBtU3RzelRhYmxlRW50cmllcy0+YWRkKGh0b25sKHNhbXBsZVNpemUpKTsKICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID4gMikgewogCkBAIC0yMzAwLDggKzIzNDcsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHJldmlvdXNTYW1wbGVTaXplID0gc2FtcGxlU2l6ZTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiJXMgdGltZXN0YW1wVXMvbGFzdFRpbWVzdGFtcFVzOiAlbGxkLyVsbGQiLAotICAgICAgICAgICAgICAgIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iLCB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzKTsKKyAgICAgICAgQUxPR1YoIiVzIHRpbWVzdGFtcFVzL2xhc3RUaW1lc3RhbXBVczogJSIgUFJJZDY0ICIvJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIHRyYWNrTmFtZSwgdGltZXN0YW1wVXMsIGxhc3RUaW1lc3RhbXBVcyk7CiAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CiAgICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gY3VyckR1cmF0aW9uVGlja3M7CiAgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwpAQCAtMjQwNiw5ICsyNDUzLDkgQEAKICAgICBzZW5kVHJhY2tTdW1tYXJ5KGhhc011bHRpcGxlVHJhY2tzKTsKIAogICAgIEFMT0dJKCJSZWNlaXZlZCB0b3RhbC8wLWxlbmd0aCAoJWQvJWQpIGJ1ZmZlcnMgYW5kIGVuY29kZWQgJWQgZnJhbWVzLiAtICVzIiwKLSAgICAgICAgICAgIGNvdW50LCBuWmVyb0xlbmd0aEZyYW1lcywgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCksIG1Jc0F1ZGlvPyAiYXVkaW8iOiAidmlkZW8iKTsKKyAgICAgICAgICAgIGNvdW50LCBuWmVyb0xlbmd0aEZyYW1lcywgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCksIHRyYWNrTmFtZSk7CiAgICAgaWYgKG1Jc0F1ZGlvKSB7Ci0gICAgICAgIEFMT0dJKCJBdWRpbyB0cmFjayBkcmlmdCB0aW1lOiAlbGxkIHVzIiwgbU93bmVyLT5nZXREcmlmdFRpbWVVcygpKTsKKyAgICAgICAgQUxPR0koIkF1ZGlvIHRyYWNrIGRyaWZ0IHRpbWU6ICUiIFBSSWQ2NCAiIHVzIiwgbU93bmVyLT5nZXREcmlmdFRpbWVVcygpKTsKICAgICB9CiAKICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKQEAgLTI0OTEsMTEgKzI1MzgsMTEgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OnRyYWNrUHJvZ3Jlc3NTdGF0dXMoaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVycikgewotICAgIEFMT0dWKCJ0cmFja1Byb2dyZXNzU3RhdHVzOiAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICBBTE9HVigidHJhY2tQcm9ncmVzc1N0YXR1czogJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMpOwogCiAgICAgaWYgKG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPiAwICYmCiAgICAgICAgIHRpbWVVcyAtIG1QcmV2aW91c1RyYWNrVGltZVVzID49IG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpIHsKLSAgICAgICAgQUxPR1YoIkZpcmUgdGltZSB0cmFja2luZyBwcm9ncmVzcyBzdGF0dXMgYXQgJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgICAgIEFMT0dWKCJGaXJlIHRpbWUgdHJhY2tpbmcgcHJvZ3Jlc3Mgc3RhdHVzIGF0ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICAgICAgbU93bmVyLT50cmFja1Byb2dyZXNzU3RhdHVzKG1UcmFja0lkLCB0aW1lVXMgLSBtUHJldmlvdXNUcmFja1RpbWVVcywgZXJyKTsKICAgICAgICAgbVByZXZpb3VzVHJhY2tUaW1lVXMgPSB0aW1lVXM7CiAgICAgfQpAQCAtMjUyOSwxMyArMjU3NiwxMyBAQAogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpzZXREcmlmdFRpbWVVcyhpbnQ2NF90IGRyaWZ0VGltZVVzKSB7Ci0gICAgQUxPR1YoInNldERyaWZ0VGltZVVzOiAlbGxkIHVzIiwgZHJpZnRUaW1lVXMpOworICAgIEFMT0dWKCJzZXREcmlmdFRpbWVVczogJSIgUFJJZDY0ICIgdXMiLCBkcmlmdFRpbWVVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICBtRHJpZnRUaW1lVXMgPSBkcmlmdFRpbWVVczsKIH0KIAogaW50NjRfdCBNUEVHNFdyaXRlcjo6Z2V0RHJpZnRUaW1lVXMoKSB7Ci0gICAgQUxPR1YoImdldERyaWZ0VGltZVVzOiAlbGxkIHVzIiwgbURyaWZ0VGltZVVzKTsKKyAgICBBTE9HVigiZ2V0RHJpZnRUaW1lVXM6ICUiIFBSSWQ2NCAiIHVzIiwgbURyaWZ0VGltZVVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwogICAgIHJldHVybiBtRHJpZnRUaW1lVXM7CiB9CkBAIC0yOTkxLDcgKzMwMzgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1YoImN0dHMgYm94IGhhcyAlZCBlbnRyaWVzIHdpdGggcmFuZ2UgWyVsbGQsICVsbGRdIiwKKyAgICBBTE9HVigiY3R0cyBib3ggaGFzICVkIGVudHJpZXMgd2l0aCByYW5nZSBbJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiXSIsCiAgICAgICAgICAgICBtQ3R0c1RhYmxlRW50cmllcy0+Y291bnQoKSwgbU1pbkN0dHNPZmZzZXRUaW1lVXMsIG1NYXhDdHRzT2Zmc2V0VGltZVVzKTsKIAogICAgIG1Pd25lci0+YmVnaW5Cb3goImN0dHMiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCmluZGV4IDI0ODQyMTIuLmQ2ODBlMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcApAQCAtMzYsNyArMzYsNyBAQAogICAgIENIRUNLKG1DdXJyZW50TWVkaWFCdWZmZXIgPT0gTlVMTCk7CiB9CiAKLXN0YXR1c190IE1lZGlhQWRhcHRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgTWVkaWFBZGFwdGVyOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQWRhcHRlckxvY2spOwogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwpAQCAtNzUsNyArNzUsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUFkYXB0ZXI6OnJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIEFMT0dWKCJSZWFkIGJlZm9yZSBldmVuIHN0YXJ0ZWQhIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5jcHAKaW5kZXggMTFiODBiZi4uMWY4MGE0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8c3lzL2F0b21pY3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC05Miw3ICs5MSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQgcHJldkNvdW50ID0gX19hdG9taWNfZGVjKCZtUmVmQ291bnQpOworICAgIGludCBwcmV2Q291bnQgPSBfX3N5bmNfZmV0Y2hfYW5kX3N1YigmbVJlZkNvdW50LCAxKTsKICAgICBpZiAocHJldkNvdW50ID09IDEpIHsKICAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGUgdGhpczsKQEAgLTExMiw3ICsxMTEsNyBAQAogfQogCiB2b2lkIE1lZGlhQnVmZmVyOjphZGRfcmVmKCkgewotICAgICh2b2lkKSBfX2F0b21pY19pbmMoJm1SZWZDb3VudCk7CisgICAgKHZvaWQpIF9fc3luY19mZXRjaF9hbmRfYWRkKCZtUmVmQ291bnQsIDEpOwogfQogCiB2b2lkICpNZWRpYUJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKQEAgLTEzNSw3ICsxMzQsNyBAQAogCiB2b2lkIE1lZGlhQnVmZmVyOjpzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgewogICAgIGlmICgobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCkgJiYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSkgewotICAgICAgICBBTE9HRSgib2Zmc2V0ID0gJWQsIGxlbmd0aCA9ICVkLCBtU2l6ZSA9ICVkIiwgb2Zmc2V0LCBsZW5ndGgsIG1TaXplKTsKKyAgICAgICAgQUxPR0UoIm9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1LCBtU2l6ZSA9ICV6dSIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7CiAgICAgfQogICAgIENIRUNLKChtR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB8fCAob2Zmc2V0ICsgbGVuZ3RoIDw9IG1TaXplKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5jcHAKaW5kZXggODBhYWU1MS4uNmFjNmQ0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5jcHAKQEAgLTU1LDcgKzU1LDggQEAKICAgICBtTGFzdEJ1ZmZlciA9IGJ1ZmZlcjsKIH0KIAotc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoTWVkaWFCdWZmZXIgKipvdXQpIHsKK3N0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgYm9vbCBub25CbG9ja2luZykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBmb3IgKDs7KSB7CkBAIC03MCw2ICs3MSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG5vbkJsb2NraW5nKSB7CisgICAgICAgICAgICAqb3V0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIEFsbCBidWZmZXJzIGFyZSBpbiB1c2UuIEJsb2NrIHVudGlsIG9uZSBvZiB0aGVtIGlzIHJldHVybmVkIHRvIHVzLgogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggOGFmMWFhZi4uZGY0N2JkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTE2LDEyICsxNiwxMyBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWMiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KLQorI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgiCiAKKyNpbmNsdWRlIDxiaW5kZXIvSUJhdHRlcnlTdGF0cy5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTMxLDQ1ICszMiwxMTkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTmF0aXZlV2luZG93V3JhcHBlci5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBzdGF0aWMKLXNwPE1lZGlhQ29kZWM+IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyKSB7Ci0gICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIpOwotICAgIGlmIChjb2RlYy0+aW5pdChtaW1lLCB0cnVlIC8qIG5hbWVJc1R5cGUgKi8sIGVuY29kZXIpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworc3RydWN0IE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllciA6IHB1YmxpYyBTaW5nbGV0b248QmF0dGVyeU5vdGlmaWVyPiB7CisgICAgQmF0dGVyeU5vdGlmaWVyKCk7CisKKyAgICB2b2lkIG5vdGVTdGFydFZpZGVvKCk7CisgICAgdm9pZCBub3RlU3RvcFZpZGVvKCk7CisgICAgdm9pZCBub3RlU3RhcnRBdWRpbygpOworICAgIHZvaWQgbm90ZVN0b3BBdWRpbygpOworCitwcml2YXRlOgorICAgIGludDMyX3QgbVZpZGVvUmVmQ291bnQ7CisgICAgaW50MzJfdCBtQXVkaW9SZWZDb3VudDsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBtQmF0dGVyeVN0YXRTZXJ2aWNlOworfTsKKworQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcikKKworTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpCYXR0ZXJ5Tm90aWZpZXIoKSA6CisgICAgbVZpZGVvUmVmQ291bnQoMCksCisgICAgbUF1ZGlvUmVmQ291bnQoMCkgeworICAgIC8vIGdldCBiYXR0ZXJ5IHNlcnZpY2UKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gTlVMTCkgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZSA9IGludGVyZmFjZV9jYXN0PElCYXR0ZXJ5U3RhdHM+KHNtLT5nZXRTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKG1CYXR0ZXJ5U3RhdFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoImJhdHRlcnlzdGF0cyBzZXJ2aWNlIHVuYXZhaWxhYmxlISIpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0YXJ0VmlkZW8oKSB7CisgICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdGFydFZpZGVvKEFJRF9NRURJQSk7CisgICAgfQorICAgIG1WaWRlb1JlZkNvdW50Kys7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcFZpZGVvKCkgeworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wKCk6IHZpZGVvIHJlZmNvdW50IGlzIGJyb2tlbiEiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHJldHVybiBjb2RlYzsKKyAgICBtVmlkZW9SZWZDb3VudC0tOworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RvcFZpZGVvKEFJRF9NRURJQSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0YXJ0QXVkaW8oKSB7CisgICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdGFydEF1ZGlvKEFJRF9NRURJQSk7CisgICAgfQorICAgIG1BdWRpb1JlZkNvdW50Kys7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcEF1ZGlvKCkgeworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wKCk6IGF1ZGlvIHJlZmNvdW50IGlzIGJyb2tlbiEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1BdWRpb1JlZkNvdW50LS07CisgICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdG9wQXVkaW8oQUlEX01FRElBKTsKKyAgICB9Cit9CisvLyBzdGF0aWMKK3NwPE1lZGlhQ29kZWM+IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyLCBzdGF0dXNfdCAqZXJyKSB7CisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIpOworCisgICAgY29uc3Qgc3RhdHVzX3QgcmV0ID0gY29kZWMtPmluaXQobWltZSwgdHJ1ZSAvKiBuYW1lSXNUeXBlICovLCBlbmNvZGVyKTsKKyAgICBpZiAoZXJyICE9IE5VTEwpIHsKKyAgICAgICAgKmVyciA9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldCA9PSBPSyA/IGNvZGVjIDogTlVMTDsgLy8gTlVMTCBkZWFsbG9jYXRlcyBjb2RlYy4KIH0KIAogLy8gc3RhdGljCiBzcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QgKmVycikgewogICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyKTsKLSAgICBpZiAoY29kZWMtPmluaXQobmFtZSwgZmFsc2UgLyogbmFtZUlzVHlwZSAqLywgZmFsc2UgLyogZW5jb2RlciAqLykgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgcmV0dXJuIGNvZGVjOworICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG5hbWUsIGZhbHNlIC8qIG5hbWVJc1R5cGUgKi8sIGZhbHNlIC8qIGVuY29kZXIgKi8pOworICAgIGlmIChlcnIgIT0gTlVMTCkgeworICAgICAgICAqZXJyID0gcmV0OworICAgIH0KKyAgICByZXR1cm4gcmV0ID09IE9LID8gY29kZWMgOiBOVUxMOyAvLyBOVUxMIGRlYWxsb2NhdGVzIGNvZGVjLgogfQogCiBNZWRpYUNvZGVjOjpNZWRpYUNvZGVjKGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIpCiAgICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCksCiAgICAgICBtTG9vcGVyKGxvb3BlciksCi0gICAgICBtQ29kZWMobmV3IEFDb2RlYyksCisgICAgICBtQ29kZWMoTlVMTCksCiAgICAgICBtUmVwbHlJRCgwKSwKICAgICAgIG1GbGFncygwKSwKKyAgICAgIG1TdGlja3lFcnJvcihPSyksCiAgICAgICBtU29mdFJlbmRlcmVyKE5VTEwpLAorICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQoZmFsc2UpLAorICAgICAgbUlzVmlkZW8oZmFsc2UpLAogICAgICAgbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uKDApLAogICAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQoMCksCiAgICAgICBtRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uKDApLApAQCAtOTcsMjkgKzE3Miw0MiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpIHsKKy8vIHN0YXRpYwordm9pZCBNZWRpYUNvZGVjOjpQb3N0UmVwbHlXaXRoRXJyb3IoaW50MzJfdCByZXBseUlELCBpbnQzMl90IGVycikgeworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6aW5pdChjb25zdCBBU3RyaW5nICZuYW1lLCBib29sIG5hbWVJc1R5cGUsIGJvb2wgZW5jb2RlcikgeworICAgIC8vIHNhdmUgaW5pdCBwYXJhbWV0ZXJzIGZvciByZXNldAorICAgIG1Jbml0TmFtZSA9IG5hbWU7CisgICAgbUluaXROYW1lSXNUeXBlID0gbmFtZUlzVHlwZTsKKyAgICBtSW5pdElzRW5jb2RlciA9IGVuY29kZXI7CisKICAgICAvLyBDdXJyZW50IHZpZGVvIGRlY29kZXJzIGRvIG5vdCByZXR1cm4gZnJvbSBPTVhfRmlsbFRoaXNCdWZmZXIKICAgICAvLyBxdWlja2x5LCB2aW9sYXRpbmcgdGhlIE9wZW5NQVggc3BlY3MsIHVudGlsIHRoYXQgaXMgcmVtZWRpZWQKICAgICAvLyB3ZSBuZWVkIHRvIGludmVzdCBpbiBhbiBleHRyYSBsb29wZXIgdG8gZnJlZSB0aGUgbWFpbiBldmVudAogICAgIC8vIHF1ZXVlLgorICAgIG1Db2RlYyA9IG5ldyBBQ29kZWM7CiAgICAgYm9vbCBuZWVkRGVkaWNhdGVkTG9vcGVyID0gZmFsc2U7Ci0gICAgaWYgKG5hbWVJc1R5cGUgJiYgIXN0cm5jYXNlY21wKG5hbWUsICJ2aWRlby8iLCA2KSkgeworICAgIGlmIChuYW1lSXNUeXBlICYmICFzdHJuY2FzZWNtcChuYW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KSkgewogICAgICAgICBuZWVkRGVkaWNhdGVkTG9vcGVyID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBBU3RyaW5nIHRtcCA9IG5hbWU7CiAgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoIi5zZWN1cmUiKSkgewogICAgICAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbWNsID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbWNsID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CiAgICAgICAgIHNzaXplX3QgY29kZWNJZHggPSBtY2wtPmZpbmRDb2RlY0J5TmFtZSh0bXAuY19zdHIoKSk7CiAgICAgICAgIGlmIChjb2RlY0lkeCA+PSAwKSB7Ci0gICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gdHlwZXM7Ci0gICAgICAgICAgICBpZiAobWNsLT5nZXRTdXBwb3J0ZWRUeXBlcyhjb2RlY0lkeCwgJnR5cGVzKSA9PSBPSykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZWVkRGVkaWNhdGVkTG9vcGVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG1jbC0+Z2V0Q29kZWNJbmZvKGNvZGVjSWR4KTsKKyAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKKyAgICAgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1pbWVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIG5lZWREZWRpY2F0ZWRMb29wZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1Myw2ICsyNDEsMTQgQEAKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpzZXRDYWxsYmFjayhjb25zdCBzcDxBTWVzc2FnZT4gJmNhbGxiYWNrKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldENhbGxiYWNrLCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImNhbGxiYWNrIiwgY2FsbGJhY2spOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmNvbmZpZ3VyZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZuYXRpdmVXaW5kb3csCkBAIC0xNzQsNyArMjcwLDIwIEBACiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CisgICAgc3RhdHVzX3QgZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworCisgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgLy8gTWVkaWFDb2RlYyBub3cgc2V0IHN0YXRlIHRvIFVOSU5JVElBTElaRUQgdXBvbiBhbnkgZmF0YWwgZXJyb3IuCisgICAgICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkLWNvbXBhdGliaWxpdHksIGRvIGEgcmVzZXQoKSB0byBwdXQgY29kZWMKKyAgICAgICAgLy8gYmFjayBpbnRvIElOSVRJQUxJWkVEIHN0YXRlLgorICAgICAgICAvLyBCdXQgZG9uJ3QgcmVzZXQgaWYgdGhlIGVyciBpcyBJTlZBTElEX09QRVJBVElPTiwgd2hpY2ggbWVhbnMKKyAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZSBmYWlsdXJlIGlzIGR1ZSB0byB3cm9uZyBzdGF0ZS4KKworICAgICAgICBBTE9HRSgiY29uZmlndXJlIGZhaWxlZCB3aXRoIGVyciAweCUwOHgsIHJlc2V0dGluZy4uLiIsIGVycik7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Y3JlYXRlSW5wdXRTdXJmYWNlKApAQCAtMjE4LDYgKzMyNyw0MSBAQAogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OnJlc2V0KCkgeworICAgIC8qIFdoZW4gZXh0ZXJuYWwtZmFjaW5nIE1lZGlhQ29kZWMgb2JqZWN0IGlzIGNyZWF0ZWQsCisgICAgICAgaXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gIFRodXMsIHJlc2V0IGlzIGVzc2VudGlhbGx5CisgICAgICAgcmVsZWFzZSgpIGZvbGxvd2VkIGJ5IGluaXQoKSwgcGx1cyBjbGVhcmluZyB0aGUgc3RhdGUgKi8KKworICAgIHN0YXR1c190IGVyciA9IHJlbGVhc2UoKTsKKworICAgIC8vIHVucmVnaXN0ZXIgaGFuZGxlcnMKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1Db2RlY0xvb3BlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ29kZWNMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1Db2RlYy0+aWQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOworICAgICAgICB9CisgICAgICAgIG1Db2RlYyA9IE5VTEw7CisgICAgfQorICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworCisgICAgbUZsYWdzID0gMDsgICAgLy8gY2xlYXIgYWxsIGZsYWdzCisgICAgbVN0aWNreUVycm9yID0gT0s7CisKKyAgICAvLyByZXNldCBzdGF0ZSBub3QgcmVzZXQgYnkgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCkKKyAgICBtUmVwbHlJRCA9IDA7CisgICAgbURlcXVldWVJbnB1dFJlcGx5SUQgPSAwOworICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IDA7CisgICAgbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uID0gMDsKKyAgICBtRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uID0gMDsKKyAgICBtSGF2ZUlucHV0U3VyZmFjZSA9IGZhbHNlOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBlcnIgPSBpbml0KG1Jbml0TmFtZSwgbUluaXROYW1lSXNUeXBlLCBtSW5pdElzRW5jb2Rlcik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OnF1ZXVlSW5wdXRCdWZmZXIoCiAgICAgICAgIHNpemVfdCBpbmRleCwKICAgICAgICAgc2l6ZV90IG9mZnNldCwKQEAgLTMyMyw2ICs0NjcsMTYgQEAKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKHNpemVfdCBpbmRleCwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLCBpZCgpKTsKKyAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOworICAgIG1zZy0+c2V0SW50MzIoInJlbmRlciIsIHRydWUpOworICAgIG1zZy0+c2V0SW50NjQoInRpbWVzdGFtcE5zIiwgdGltZXN0YW1wTnMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OnJlbGVhc2VPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4KSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIGlkKCkpOwogICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBpbmRleCk7CkBAIC0zNTIsNiArNTA2LDIwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRJbnB1dEZvcm1hdChzcDxBTWVzc2FnZT4gKmZvcm1hdCkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRJbnB1dEZvcm1hdCwgaWQoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIENIRUNLKHJlc3BvbnNlLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmdldE5hbWUoQVN0cmluZyAqbmFtZSkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXROYW1lLCBpZCgpKTsKIApAQCAtMzg0LDYgKzU1Miw1NSBAQAogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldE91dHB1dEJ1ZmZlcihzaXplX3QgaW5kZXgsIHNwPEFCdWZmZXI+ICpidWZmZXIpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIHJldHVybiBnZXRCdWZmZXJBbmRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgaW5kZXgsIGJ1ZmZlciwgJmZvcm1hdCk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldE91dHB1dEZvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIHJldHVybiBnZXRCdWZmZXJBbmRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgaW5kZXgsICZidWZmZXIsIGZvcm1hdCk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldElucHV0QnVmZmVyKHNpemVfdCBpbmRleCwgc3A8QUJ1ZmZlcj4gKmJ1ZmZlcikgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgcmV0dXJuIGdldEJ1ZmZlckFuZEZvcm1hdChrUG9ydEluZGV4SW5wdXQsIGluZGV4LCBidWZmZXIsICZmb3JtYXQpOworfQorCitib29sIE1lZGlhQ29kZWM6OmlzRXhlY3V0aW5nKCkgY29uc3QgeworICAgIHJldHVybiBtU3RhdGUgPT0gU1RBUlRFRCB8fCBtU3RhdGUgPT0gRkxVU0hFRDsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0QnVmZmVyQW5kRm9ybWF0KAorICAgICAgICBzaXplX3QgcG9ydEluZGV4LCBzaXplX3QgaW5kZXgsCisgICAgICAgIHNwPEFCdWZmZXI+ICpidWZmZXIsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgLy8gdXNlIG11dGV4IGluc3RlYWQgb2YgYSBjb250ZXh0IHN3aXRjaAorCisgICAgYnVmZmVyLT5jbGVhcigpOworICAgIGZvcm1hdC0+Y2xlYXIoKTsKKyAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIHdlIGRvIG5vdCB3YW50IG1Qb3J0QnVmZmVycyB0byBjaGFuZ2UgZHVyaW5nIHRoaXMgc2VjdGlvbgorICAgIC8vIHdlIGFsc28gZG9uJ3Qgd2FudCBtT3duZWRCeUNsaWVudCB0byBjaGFuZ2UgZHVyaW5nIHRoaXMKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAqYnVmZmVycyA9ICZtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XTsKKyAgICBpZiAoaW5kZXggPCBidWZmZXJzLT5zaXplKCkpIHsKKyAgICAgICAgY29uc3QgQnVmZmVySW5mbyAmaW5mbyA9IGJ1ZmZlcnMtPml0ZW1BdChpbmRleCk7CisgICAgICAgIGlmIChpbmZvLm1Pd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAvLyBieSB0aGUgdGltZSBidWZmZXJzIGFycmF5IGlzIGluaXRpYWxpemVkLCBjcnlwdG8gaXMgc2V0CisgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCAmJiBtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gaW5mby5tRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGluZm8ubURhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZm9ybWF0ID0gaW5mby5tRm9ybWF0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Zmx1c2goKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKTsKIApAQCAtNDA3LDkgKzYyNCw3IEBACiAKIHZvaWQgTWVkaWFDb2RlYzo6Y2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCkgewogICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtRGVxdWV1ZUlucHV0UmVwbHlJRCk7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtRGVxdWV1ZUlucHV0UmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogCiAgICAgICAgICsrbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uOwogICAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCA9IDA7CkBAIC00MTcsOSArNjMyLDcgQEAKICAgICB9CiAKICAgICBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykgewotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCk7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtRGVxdWV1ZU91dHB1dFJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKIAogICAgICAgICArK21EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb247CiAgICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IDA7CkBAIC00MjgsMTQgKzY0MSwxMiBAQAogfQogCiBib29sIE1lZGlhQ29kZWM6OmhhbmRsZURlcXVldWVJbnB1dEJ1ZmZlcih1aW50MzJfdCByZXBseUlELCBib29sIG5ld1JlcXVlc3QpIHsKLSAgICBpZiAobVN0YXRlICE9IFNUQVJURUQKLSAgICAgICAgICAgIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKQorICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAobUZsYWdzICYga0ZsYWdJc0FzeW5jKQogICAgICAgICAgICAgfHwgKG5ld1JlcXVlc3QgJiYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZykpKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLQorICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTQ1NiwxMCArNjY3LDExIEBACiBib29sIE1lZGlhQ29kZWM6OmhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0KSB7CiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVECi0gICAgICAgICAgICB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikKKyAgICBpZiAoIWlzRXhlY3V0aW5nKCkgfHwgKG1GbGFncyAmIGtGbGFnSXNBc3luYykKICAgICAgICAgICAgIHx8IChuZXdSZXF1ZXN0ICYmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKSkpIHsKICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7CisgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkKSB7CiAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKTsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkOwpAQCAtNTE2LDIyICs3MjgsMjAgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKIAogICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0RXJyb3I6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0RXJyb3I6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9teEVycm9yLCBpbnRlcm5hbEVycm9yOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigib214LWVycm9yIiwgJm9teEVycm9yKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmaW50ZXJuYWxFcnJvcikpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVyciwgYWN0aW9uQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImFjdGlvbkNvZGUiLCAmYWN0aW9uQ29kZSkpOwogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBhbiBlcnJvci4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiKG9teCBlcnJvciAweCUwOHgsIGludGVybmFsRXJyb3IgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb214RXJyb3IsIGludGVybmFsRXJyb3IpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvbXhFcnJvciA9PSBPTVhfRXJyb3JSZXNvdXJjZXNMb3N0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50ZXJuYWxFcnJvciA9PSBERUFEX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyICUjeCwgYWN0aW9uQ29kZSAlZCwgd2hpbGUgaW4gc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU2F3TWVkaWFTZXJ2ZXJEaWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBib29sIHNlbmRFcnJvclJlcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBib29sIHNlbmRFcnJvclJlc3BvbnNlID0gdHJ1ZTsKIAogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTklUSUFMSVpJTkc6CkBAIC01NDIsMTMgKzc1MiwxNSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTkZJR1VSSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JVElBTElaRUQgOiBJTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklOSVRJQUxJWkVEIDogQ09ORklHVVJFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU1OCw3ICs3NzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgZXJyb3IsIGFzc3VtaW5nIHdlJ2xsIHN0aWxsIGdldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaHV0ZG93biBjb21wbGV0ZSBub3RpZmljYXRpb24uCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXBvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU2VydmVyIGRpZWQsIHRoZXJlIGRlZmluaXRlbHkgd29uJ3QKQEAgLTU2OSw3ICs3ODEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVE9QUElORy0+VU5JTklUSUFMSVpFRCwgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWwgU1RPUFBJTkctPklOSVRJQUxJWkVEIHN0YXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC01NzcsNDQgKzc5MSw4MCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpID8gRkxVU0hFRCA6IFNUQVJURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIsIGFjdGlvbkNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9DT0RFX1RSQU5TSUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09ERV9SRUNPVkVSQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpb25Db2RlIGluIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUgaXMgYWx3YXlzIGZhdGFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25Db2RlID0gQUNUSU9OX0NPREVfRkFUQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIsIGFjdGlvbkNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9DT0RFX1RSQU5TSUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09ERV9SRUNPVkVSQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbmRFcnJvclJlcG9uc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgVU5LTk9XTl9FUlJPUik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VuZEVycm9yUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtUmVwbHlJRCwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0Q29tcG9uZW50QWxsb2NhdGVkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBJTklUSUFMSVpJTkcpOwogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygiY29tcG9uZW50TmFtZSIsICZtQ29tcG9uZW50TmFtZSkpOwogCkBAIC02MzQsMjEgKzg4NCwyNCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRDb21wb25lbnRDb25maWd1cmVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIENPTkZJR1VSSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgaW5wdXQgc3VyZmFjZSBmbGFnCiAgICAgICAgICAgICAgICAgICAgIG1IYXZlSW5wdXRTdXJmYWNlID0gZmFsc2U7CiAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgJm1JbnB1dEZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJvdXRwdXQtZm9ybWF0IiwgJm1PdXRwdXRGb3JtYXQpKTsKKworICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShDT05GSUdVUkVEKTsKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIEFDb2RlYzo6a1doYXRDcmVhdGVJbnB1dFN1cmZhY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKQogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CkBAIC02NjQsOSArOTE3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0U2lnbmFsZWRJbnB1dEVPUzoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRTaWduYWxlZElucHV0RU9TOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gQUNvZGVjOjprV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZSgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKQEAgLTY3Nyw4ICs5MzAsOSBAQAogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRCdWZmZXJzQWxsb2NhdGVkOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3J0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwb3J0SW5kZXgiLCAmcG9ydEluZGV4KSk7CiAKQEAgLTY5NSw4ICs5NDksOCBAQAogICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicG9ydERlc2MiLCAmb2JqKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QUNvZGVjOjpQb3J0RGVzY3JpcHRpb24+IHBvcnREZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDb2RlYzo6UG9ydERlc2NyaXB0aW9uICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPENvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uPiBwb3J0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbiAqPihvYmouZ2V0KCkpOwogCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzID0gcG9ydERlc2MtPmNvdW50QnVmZmVycygpOwogCkBAIC03MjksNDAgKzk4MywxOCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBrRmxhZ0lzU29mdHdhcmVDb2RlYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgPT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0lzU29mdHdhcmVDb2RlYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbVNvZnRSZW5kZXJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFJlY3QoImNyb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2xvckZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldFJlY3Qoa0tleUNyb3BSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29mdHdhcmVSZW5kZXJlcihtTmF0aXZlV2luZG93LCBtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihtTmF0aXZlV2luZG93KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC03NzMsNiArMTAwNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGNvZGVjIHNwZWNpZmljIGRhdGEgYW5kIGFtZW5kIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdCBhcyBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdHYXRoZXJDb2RlY1NwZWNpZmljRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKQEAgLTc4MCw3ICsxMDE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXI6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0RmlsbFRoaXNCdWZmZXI6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvKiBzaXplX3QgaW5kZXggPSAqL3VwZGF0ZUJ1ZmZlcnMoa1BvcnRJbmRleElucHV0LCBtc2cpOwogCkBAIC04MDcsNyArMTA0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXVlQ1NESW5wdXRCdWZmZXIgZmFpbGVkIHcvIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKQEAgLTgxNSw3ICsxMDQ5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSGF2ZUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGhhbmRsZURlcXVldWVJbnB1dEJ1ZmZlcihtRGVxdWV1ZUlucHV0UmVwbHlJRCkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICArK21EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbjsKQEAgLTgyNyw3ICsxMDY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0RHJhaW5UaGlzQnVmZmVyOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcjoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8qIHNpemVfdCBpbmRleCA9ICovdXBkYXRlQnVmZmVycyhrUG9ydEluZGV4T3V0cHV0LCBtc2cpOwogCkBAIC04NjIsMTAgKzExMDAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0dhdGhlckNvZGVjU3BlY2lmaWNEYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcihtRGVxdWV1ZU91dHB1dFJlcGx5SUQpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgKyttRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uOwpAQCAtODc4LDMyICsxMTIyLDQyIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEVPUzoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRFT1M6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IG5vdGlmeSB0aGUgY2xpZW50IG9mIHRoaXMgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZmxhZyBpbiAib25PdXRwdXRCdWZmZXJSZWFkeSIuCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVE9QUElORykgewogICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBSRUxFQVNJTkcpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKIAogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Rmx1c2hDb21wbGV0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIEZMVVNISU5HKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRFRCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gRkxVU0hJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWNlaXZlZCBGbHVzaENvbXBsZXRlZCBtZXNzYWdlIGluIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoRkxVU0hFRCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC05MjEsMTAgKzExNzUsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IFVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTk1NCwxNiArMTIwNSw0NSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U2V0Q2FsbGJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gSU5JVElBTElaSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IGlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBjYW4ndCBiZSBzZXQgYWZ0ZXIgY29kZWMgaXMgZXhlY3V0aW5nLAorICAgICAgICAgICAgICAgIC8vIG9yIGJlZm9yZSBpdCdzIGluaXRpYWxpemVkIChhcyB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGNsZWFyZWQgd2hlbiBpdCBnb2VzIHRvIElOSVRJQUxJWkVEKQorICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBjYWxsYmFjazsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImNhbGxiYWNrIiwgJmNhbGxiYWNrKSk7CisKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiTWVkaWFDb2RlYyB3aWxsIG9wZXJhdGUgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0lzQXN5bmM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0FzeW5jOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgogICAgICAgICB7CiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC05ODMsMTAgKzEyNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRTdXJmYWNlVGV4dHVyZUNsaWVudCgpKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDI0LDEwICsxMzAxLDcgQEAKIAogICAgICAgICAgICAgLy8gTXVzdCBiZSBjb25maWd1cmVkLCBidXQgY2FuJ3QgaGF2ZSBiZWVuIHN0YXJ0ZWQgeWV0LgogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMDQxLDExICsxMzE1LDExIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSEVEKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgT0spOworICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEwNjUsMjAgKzEzMzksMjEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSU5JVElBTElaRUQKLSAgICAgICAgICAgICAgICAgICAgJiYgbVN0YXRlICE9IENPTkZJR1VSRUQgJiYgbVN0YXRlICE9IFNUQVJURUQpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBtYXkgYmUgaW4gIlVOSU5JVElBTElaRUQiIHN0YXRlIGFscmVhZHkgd2l0aG91dCB0aGUKKyAgICAgICAgICAgIGlmICghKG1GbGFncyAmIGtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQpICYmIG1TdGF0ZSAhPSBJTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICAmJiBtU3RhdGUgIT0gQ09ORklHVVJFRCAmJiAhaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG1heSBiZSBpbiAiVU5JTklUSUFMSVpFRCIgc3RhdGUgYWxyZWFkeSBhbmQKKyAgICAgICAgICAgICAgICAvLyBhbHNvIHNodXRkb3duIHRoZSBlbmNvZGVyL2RlY29kZXIgd2l0aG91dCB0aGUKICAgICAgICAgICAgICAgICAvLyBjbGllbnQgYmVpbmcgYXdhcmUgb2YgdGhpcyBpZiBtZWRpYSBzZXJ2ZXIgZGllZCB3aGlsZQogICAgICAgICAgICAgICAgIC8vIHdlIHdlcmUgYmVpbmcgc3RvcHBlZC4gVGhlIGNsaWVudCB3b3VsZCBhc3N1bWUgdGhhdAogICAgICAgICAgICAgICAgIC8vIGFmdGVyIHN0b3AoKSByZXR1cm5lZCwgaXQgd291bGQgYmUgc2FmZSB0byBjYWxsIHJlbGVhc2UoKQogICAgICAgICAgICAgICAgIC8vIGFuZCBpdCBzaG91bGQgYmUgaW4gdGhpcyBjYXNlLCBubyBoYXJtIHRvIGFsbG93IGEgcmVsZWFzZSgpCiAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSB1bmluaXRpYWxpemVkLgotICAgICAgICAgICAgICAgIC8vIFNpbWlsYXJseSBzdG9wcGluZyBhIHN0b3BwZWQgTWVkaWFDb2RlYyBzaG91bGQgYmUgYmVuaWduLgogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXJyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9PSB0YXJnZXRTdGF0ZSA/IE9LIDogSU5WQUxJRF9PUEVSQVRJT04pOwotCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVN0YXRlID09IHRhcmdldFN0YXRlID8gT0sgOiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiB0YXJnZXRTdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMDg3LDYgKzEzNjIsOSBAQAogICAgICAgICAgICAgICAgIC8vIEl0J3MgZGVhZCwgSmltLiBEb24ndCBleHBlY3QgaW5pdGlhdGVTaHV0ZG93biB0byB5aWVsZAogICAgICAgICAgICAgICAgIC8vIGFueSB1c2VmdWwgcmVzdWx0cyBub3cuLi4KICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTEwNiwxMSArMTM4NCwxNSBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtSGF2ZUlucHV0U3VyZmFjZSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlSW5wdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCB3aXRoIGlucHV0IHN1cmZhY2UiKTsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMTIyLDkgKzE0MDQsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVvdXRVcyIsICZ0aW1lb3V0VXMpKTsKIAogICAgICAgICAgICAgaWYgKHRpbWVvdXRVcyA9PSAwbGwpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCAtRUFHQUlOKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCAtRUFHQUlOKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTE1Myw5ICsxNDMzLDcgQEAKIAogICAgICAgICAgICAgQ0hFQ0sobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCAtRUFHQUlOKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobURlcXVldWVJbnB1dFJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1EZXF1ZXVlSW5wdXRSZXBseUlELCAtRUFHQUlOKTsKIAogICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmc7CiAgICAgICAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCA9IDA7CkBAIC0xMTY3LDE5ICsxNDQ1LDE3IEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uUXVldWVJbnB1dEJ1ZmZlcihtc2cpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMTg4LDYgKzE0NjQsMTIgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZU91dHB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcihyZXBseUlELCB0cnVlIC8qIG5ldyByZXF1ZXN0ICovKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTE5Niw5ICsxNDc4LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lb3V0VXMiLCAmdGltZW91dFVzKSk7CiAKICAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPT0gMGxsKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgLUVBR0FJTik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgLUVBR0FJTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEyMjcsOSArMTUwNyw3IEBACiAKICAgICAgICAgICAgIENIRUNLKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIC1FQUdBSU4pOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtRGVxdWV1ZU91dHB1dFJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCwgLUVBR0FJTik7CiAKICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZzsKICAgICAgICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IDA7CkBAIC0xMjQxLDE5ICsxNTE5LDE3IEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uUmVsZWFzZU91dHB1dEJ1ZmZlcihtc2cpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMjYyLDExICsxNTM4LDExIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEyODAsMTEgKzE1NTYsMTEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8IChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTMxNCwxNSArMTU5MCwxNiBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CisgICAgICAgICAgICAvLyBUT0RPOiBza2lwIGZsdXNoaW5nIGlmIGFscmVhZHkgRkxVU0hFRAogICAgICAgICAgICAgc2V0U3RhdGUoRkxVU0hJTkcpOwogCiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEZsdXNoKCk7CkBAIC0xMzMwLDIzICsxNjA3LDI4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRHZXRJbnB1dEZvcm1hdDoKICAgICAgICAgY2FzZSBrV2hhdEdldE91dHB1dEZvcm1hdDoKICAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9CisgICAgICAgICAgICAgICAgKG1zZy0+d2hhdCgpID09IGtXaGF0R2V0T3V0cHV0Rm9ybWF0ID8gbU91dHB1dEZvcm1hdCA6IG1JbnB1dEZvcm1hdCk7CisKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmICgobVN0YXRlICE9IFNUQVJURUQgJiYgbVN0YXRlICE9IEZMVVNISU5HKQotICAgICAgICAgICAgICAgICAgICB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikKLSAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dEZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICgobVN0YXRlICE9IENPTkZJR1VSRUQgJiYgbVN0YXRlICE9IFNUQVJUSU5HICYmCisgICAgICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFSVEVEICYmIG1TdGF0ZSAhPSBGTFVTSElORyAmJgorICAgICAgICAgICAgICAgICBtU3RhdGUgIT0gRkxVU0hFRCkKKyAgICAgICAgICAgICAgICAgICAgfHwgZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgbU91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTM3MiwxMCArMTY1NCw3IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtQ29tcG9uZW50TmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMzk1LDEwICsxNjc0LDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25TZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQyMSwxNCArMTY5NywxNCBAQAogICAgICAgICArK2k7CiAgICAgfQogCi0gICAgQUxPR1YoIkZvdW5kICV1IHBpZWNlcyBvZiBjb2RlYyBzcGVjaWZpYyBkYXRhLiIsIG1DU0Quc2l6ZSgpKTsKKyAgICBBTE9HVigiRm91bmQgJXp1IHBpZWNlcyBvZiBjb2RlYyBzcGVjaWZpYyBkYXRhLiIsIG1DU0Quc2l6ZSgpKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6cXVldWVDU0RJbnB1dEJ1ZmZlcihzaXplX3QgYnVmZmVySW5kZXgpIHsKICAgICBDSEVDSyghbUNTRC5lbXB0eSgpKTsKIAotICAgIEJ1ZmZlckluZm8gKmluZm8gPQotICAgICAgICAmbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZWRpdEl0ZW1BdChidWZmZXJJbmRleCk7CisgICAgY29uc3QgQnVmZmVySW5mbyAqaW5mbyA9CisgICAgICAgICZtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5pdGVtQXQoYnVmZmVySW5kZXgpOwogCiAgICAgc3A8QUJ1ZmZlcj4gY3NkID0gKm1DU0QuYmVnaW4oKTsKICAgICBtQ1NELmVyYXNlKG1DU0QuYmVnaW4oKSk7CkBAIC0xNDYzLDE4ICsxNzM5LDIzIEBACiAgICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKICAgICAgICAgc2V0TmF0aXZlV2luZG93KE5VTEwpOwogCisgICAgICAgIG1JbnB1dEZvcm1hdC5jbGVhcigpOwogICAgICAgICBtT3V0cHV0Rm9ybWF0LmNsZWFyKCk7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnT3V0cHV0QnVmZmVyc0NoYW5nZWQ7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdTdGlja3lFcnJvcjsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzRW5jb2RlcjsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0dhdGhlckNvZGVjU3BlY2lmaWNEYXRhOworICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNBc3luYzsKKyAgICAgICAgbVN0aWNreUVycm9yID0gT0s7CiAKICAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LmNsZWFyKCk7CisgICAgICAgIG1DYWxsYmFjay5jbGVhcigpOwogICAgIH0KIAogICAgIGlmIChuZXdTdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CisgICAgICAgIC8vIHJldHVybiBhbnkgc3RyYWdnbGluZyBidWZmZXJzLCBlLmcuIGlmIHdlIGdvdCBoZXJlIG9uIGFuIGVycm9yCisgICAgICAgIHJldHVybkJ1ZmZlcnNUb0NvZGVjKCk7CiAKICAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBpcyBnb25lLCBtZWRpYXNlcnZlcidzIHByb2JhYmx5IGJhY2sgdXAgYWxyZWFkeQogICAgICAgICAvLyBidXQgc2hvdWxkIGRlZmluaXRlbHkgYmUgYmFjayB1cCBzaG91bGQgd2UgdHJ5IHRvIGluc3RhbnRpYXRlCkBAIC0xNDg1LDYgKzE3NjYsOCBAQAogICAgIG1TdGF0ZSA9IG5ld1N0YXRlOwogCiAgICAgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CisKKyAgICB1cGRhdGVCYXR0ZXJ5U3RhdCgpOwogfQogCiB2b2lkIE1lZGlhQ29kZWM6OnJldHVybkJ1ZmZlcnNUb0NvZGVjKCkgewpAQCAtMTQ5NCw2ICsxNzc3LDcgQEAKIAogdm9pZCBNZWRpYUNvZGVjOjpyZXR1cm5CdWZmZXJzVG9Db2RlY09uUG9ydChpbnQzMl90IHBvcnRJbmRleCkgewogICAgIENIRUNLKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgfHwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpOworICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CiAKICAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF07CiAKQEAgLTE1MjAsOCArMTgwNCw4IEBACiAgICAgICAgIGludDMyX3QgcG9ydEluZGV4LCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIENIRUNLKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgfHwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpOwogCi0gICAgdm9pZCAqYnVmZmVySUQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiYnVmZmVyLWlkIiwgJmJ1ZmZlcklEKSk7CisgICAgdWludDMyX3QgYnVmZmVySUQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlci1pZCIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKIAogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAqYnVmZmVycyA9ICZtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XTsKIApAQCAtMTUzMiw2ICsxODE2LDggQEAKICAgICAgICAgICAgIENIRUNLKGluZm8tPm1Ob3RpZnkgPT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZpbmZvLT5tTm90aWZ5KSk7CiAKKyAgICAgICAgICAgIGluZm8tPm1Gb3JtYXQgPQorICAgICAgICAgICAgICAgIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KSA/IG1JbnB1dEZvcm1hdCA6IG1PdXRwdXRGb3JtYXQ7CiAgICAgICAgICAgICBtQXZhaWxQb3J0QnVmZmVyc1twb3J0SW5kZXhdLnB1c2hfYmFjayhpKTsKIAogICAgICAgICAgICAgcmV0dXJuIGk7CkBAIC0xNjQ4LDExICsxOTM0LDE1IEBACiAgICAgICAgIGluZm8tPm1EYXRhLT5zZXRSYW5nZSgwLCByZXN1bHQpOwogICAgIH0KIAorICAgIC8vIHN5bmNocm9uaXphdGlvbiBib3VuZGFyeSBmb3IgZ2V0QnVmZmVyQW5kRm9ybWF0CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgIH0KICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CiAgICAgcmVwbHktPnBvc3QoKTsKIAogICAgIGluZm8tPm1Ob3RpZnkgPSBOVUxMOwotICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNjY2LDcgKzE5NTYsNyBAQAogICAgICAgICByZW5kZXIgPSAwOwogICAgIH0KIAotICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgIGlmICghaXNFeGVjdXRpbmcoKSkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTE2ODAsMTggKzE5NzAsNDAgQEAKICAgICAgICAgcmV0dXJuIC1FQUNDRVM7CiAgICAgfQogCi0gICAgaWYgKHJlbmRlciAmJiAoaW5mby0+bURhdGEgPT0gTlVMTCB8fCBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApKSB7CisgICAgLy8gc3luY2hyb25pemF0aW9uIGJvdW5kYXJ5IGZvciBnZXRCdWZmZXJBbmRGb3JtYXQKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CisgICAgICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHJlbmRlciAmJiBpbmZvLT5tRGF0YSAhPSBOVUxMICYmIGluZm8tPm1EYXRhLT5zaXplKCkgIT0gMCkgewogICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQzMigicmVuZGVyIiwgdHJ1ZSk7CiAKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcyA9IDA7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKSB7CisgICAgICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCB0aW1lc3RhbXBOcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpdCBzZWVtcyBsaWtlIHdlIHNob3VsZCB1c2UgdGhlIHRpbWVzdGFtcAorICAgICAgICAgICAgLy8gaW4gdGhlIChtZWRpYSlidWZmZXIgYXMgaXQgcG90ZW50aWFsbHkgY2FtZSBmcm9tCisgICAgICAgICAgICAvLyBhbiBpbnB1dCBzdXJmYWNlLCBidXQgd2UgZGlkIG5vdCBwcm9wYWdhdGUgaXQgcHJpb3IgdG8KKyAgICAgICAgICAgIC8vIEFQSSAyMC4gIFBlcmhhcHMgY2hlY2sgZm9yIHRhcmdldCBTREsgdmVyc2lvbi4KKyNpZiAwCisgICAgICAgICAgICBpZiAoaW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZXN0YW1wTnMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInVzaW5nIGJ1ZmZlciBQVFMgb2YgJSIgUFJJZDY0LCB0aW1lc3RhbXBOcyk7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wTnMgKj0gMTAwMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbVNvZnRSZW5kZXJlci0+cmVuZGVyKAotICAgICAgICAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+ZGF0YSgpLCBpbmZvLT5tRGF0YS0+c2l6ZSgpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPmRhdGEoKSwgaW5mby0+bURhdGEtPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wTnMsIE5VTEwsIGluZm8tPm1Gb3JtYXQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaW5mby0+bU5vdGlmeS0+cG9zdCgpOwogICAgIGluZm8tPm1Ob3RpZnkgPSBOVUxMOwotICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNzEwLDcgKzIwMjIsMjIgQEAKIAogICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF0uZWRpdEl0ZW1BdChpbmRleCk7CiAgICAgQ0hFQ0soIWluZm8tPm1Pd25lZEJ5Q2xpZW50KTsKLSAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IHRydWU7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IHRydWU7CisKKyAgICAgICAgLy8gc2V0IGltYWdlLWRhdGEKKyAgICAgICAgaWYgKGluZm8tPm1Gb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhOworICAgICAgICAgICAgaWYgKGluZm8tPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKSkgeworICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPnNldEJ1ZmZlcigiaW1hZ2UtZGF0YSIsIGltYWdlRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgIGlmIChpbmZvLT5tRm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+c2V0UmVjdCgiY3JvcC1yZWN0IiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIHJldHVybiBpbmRleDsKIH0KQEAgLTE3NDgsMTYgKzIwNzUsMTAwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1lZGlhQ29kZWM6Om9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKSB7CisgICAgaW50MzJfdCBpbmRleDsKKyAgICB3aGlsZSAoKGluZGV4ID0gZGVxdWV1ZVBvcnRCdWZmZXIoa1BvcnRJbmRleElucHV0KSkgPj0gMCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbUNhbGxiYWNrLT5kdXAoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiY2FsbGJhY2tJRCIsIENCX0lOUFVUX0FWQUlMQUJMRSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoKSB7CisgICAgaW50MzJfdCBpbmRleDsKKyAgICB3aGlsZSAoKGluZGV4ID0gZGVxdWV1ZVBvcnRCdWZmZXIoa1BvcnRJbmRleE91dHB1dCkpID49IDApIHsKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9CisgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uaXRlbUF0KGluZGV4KS5tRGF0YTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1DYWxsYmFjay0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9PVVRQVVRfQVZBSUxBQkxFKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiaW5kZXgiLCBpbmRleCk7CisgICAgICAgIG1zZy0+c2V0U2l6ZSgib2Zmc2V0IiwgYnVmZmVyLT5vZmZzZXQoKSk7CisgICAgICAgIG1zZy0+c2V0U2l6ZSgic2l6ZSIsIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICAgICAgaW50MzJfdCBvbXhGbGFnczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigib214RmxhZ3MiLCAmb214RmxhZ3MpKTsKKworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmIChvbXhGbGFncyAmIE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FOworICAgICAgICB9CisgICAgICAgIGlmIChvbXhGbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgICAgICBmbGFncyB8PSBCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgfQorICAgICAgICBpZiAob214RmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgfQorCisgICAgICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOworCisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjpvbkVycm9yKHN0YXR1c190IGVyciwgaW50MzJfdCBhY3Rpb25Db2RlLCBjb25zdCBjaGFyICpkZXRhaWwpIHsKKyAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1DYWxsYmFjay0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9FUlJPUik7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImFjdGlvbkNvZGUiLCBhY3Rpb25Db2RlKTsKKworICAgICAgICBpZiAoZGV0YWlsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJkZXRhaWwiLCBkZXRhaWwpOworICAgICAgICB9CisKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6Om9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpIHsKKyAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1DYWxsYmFjay0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQpOworICAgICAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIG1PdXRwdXRGb3JtYXQpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9Cit9CisKKwogdm9pZCBNZWRpYUNvZGVjOjpwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCkgewogICAgIGlmIChtQWN0aXZpdHlOb3RpZnkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKChtRmxhZ3MgJiAoa0ZsYWdTdGlja3lFcnJvcgorICAgIGJvb2wgaXNFcnJvck9yT3V0cHV0Q2hhbmdlZCA9CisgICAgICAgICAgICAobUZsYWdzICYgKGtGbGFnU3RpY2t5RXJyb3IKICAgICAgICAgICAgICAgICAgICAgfCBrRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgIHwga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkKSkKKyAgICAgICAgICAgICAgICAgICAgfCBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQpKTsKKworICAgIGlmIChpc0Vycm9yT3JPdXRwdXRDaGFuZ2VkCiAgICAgICAgICAgICB8fCAhbUF2YWlsUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lbXB0eSgpCiAgICAgICAgICAgICB8fCAhbUF2YWlsUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZW1wdHkoKSkgeworICAgICAgICBtQWN0aXZpdHlOb3RpZnktPnNldEludDMyKCJpbnB1dC1idWZmZXJzIiwKKyAgICAgICAgICAgICAgICBtQXZhaWxQb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKSk7CisKKyAgICAgICAgaWYgKGlzRXJyb3JPck91dHB1dENoYW5nZWQpIHsKKyAgICAgICAgICAgIC8vIHdlIHdhbnQgY29uc3VtZXIgdG8gZGVxdWV1ZSBhcyBtYW55IHRpbWVzIGFzIGl0IGNhbgorICAgICAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LT5zZXRJbnQzMigib3V0cHV0LWJ1ZmZlcnMiLCBJTlQzMl9NQVgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LT5zZXRJbnQzMigib3V0cHV0LWJ1ZmZlcnMiLAorICAgICAgICAgICAgICAgICAgICBtQXZhaWxQb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCkpOworICAgICAgICB9CiAgICAgICAgIG1BY3Rpdml0eU5vdGlmeS0+cG9zdCgpOwogICAgICAgICBtQWN0aXZpdHlOb3RpZnkuY2xlYXIoKTsKICAgICB9CkBAIC0xODE4LDQgKzIyMjksMzQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgTWVkaWFDb2RlYzo6dXBkYXRlQmF0dGVyeVN0YXQoKSB7CisgICAgaWYgKG1TdGF0ZSA9PSBDT05GSUdVUkVEICYmICFtQmF0dGVyeVN0YXROb3RpZmllZCkgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIENIRUNLKG1PdXRwdXRGb3JtYXQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgICAgIG1Jc1ZpZGVvID0gbWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIik7CisKKyAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworCisgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgbm90aWZpZXIubm90ZVN0YXJ0VmlkZW8oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVTdGFydEF1ZGlvKCk7CisgICAgICAgIH0KKworICAgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCAmJiBtQmF0dGVyeVN0YXROb3RpZmllZCkgeworICAgICAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisKKyAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgICAgICBub3RpZmllci5ub3RlU3RvcFZpZGVvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZmllci5ub3RlU3RvcEF1ZGlvKCk7CisgICAgICAgIH0KKworICAgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZCA9IGZhbHNlOworICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCBiNzRiMmUyLi41YjhiZTQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC0xOCwxMiArMTgsMTkgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3QiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CisKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxsaWJleHBhdC9leHBhdC5oPgpAQCAtMzIsMzAgKzM5LDEyOSBAQAogCiBzdGF0aWMgTXV0ZXggc0luaXRNdXRleDsKIAotLy8gc3RhdGljCi1NZWRpYUNvZGVjTGlzdCAqTWVkaWFDb2RlY0xpc3Q6OnNDb2RlY0xpc3Q7CitzdGF0aWMgTWVkaWFDb2RlY0xpc3QgKmdDb2RlY0xpc3QgPSBOVUxMOwogCiAvLyBzdGF0aWMKLWNvbnN0IE1lZGlhQ29kZWNMaXN0ICpNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKSB7CitzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpzQ29kZWNMaXN0OworCisvLyBzdGF0aWMKK3NwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OmdldExvY2FsSW5zdGFuY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHNJbml0TXV0ZXgpOwogCi0gICAgaWYgKHNDb2RlY0xpc3QgPT0gTlVMTCkgewotICAgICAgICBzQ29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0OworICAgIGlmIChnQ29kZWNMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgZ0NvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdDsKKyAgICAgICAgaWYgKGdDb2RlY0xpc3QtPmluaXRDaGVjaygpID09IE9LKSB7CisgICAgICAgICAgICBzQ29kZWNMaXN0ID0gZ0NvZGVjTGlzdDsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBzQ29kZWNMaXN0LT5pbml0Q2hlY2soKSA9PSBPSyA/IHNDb2RlY0xpc3QgOiBOVUxMOworICAgIHJldHVybiBzQ29kZWNMaXN0OworfQorCitzdGF0aWMgTXV0ZXggc1JlbW90ZUluaXRNdXRleDsKKworc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6c1JlbW90ZUxpc3Q7CisKKy8vIHN0YXRpYworc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNSZW1vdGVJbml0TXV0ZXgpOworICAgIGlmIChzUmVtb3RlTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOworICAgICAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KKyAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7CisgICAgICAgIGlmIChzZXJ2aWNlLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNSZW1vdGVMaXN0ID0gc2VydmljZS0+Z2V0Q29kZWNMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc1JlbW90ZUxpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gaWYgZmFpbGVkIHRvIGdldCByZW1vdGUgbGlzdCwgY3JlYXRlIGxvY2FsIGxpc3QKKyAgICAgICAgICAgIHNSZW1vdGVMaXN0ID0gZ2V0TG9jYWxJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzUmVtb3RlTGlzdDsKIH0KIAogTWVkaWFDb2RlY0xpc3Q6Ok1lZGlhQ29kZWNMaXN0KCkKICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCkgewotICAgIEZJTEUgKmZpbGUgPSBmb3BlbigiL2V0Yy9tZWRpYV9jb2RlY3MueG1sIiwgInIiKTsKKyAgICBwYXJzZVRvcExldmVsWE1MRmlsZSgiL2V0Yy9tZWRpYV9jb2RlY3MueG1sIik7Cit9CiAKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZS4iKTsKK3ZvaWQgTWVkaWFDb2RlY0xpc3Q6OnBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKmNvZGVjc194bWwpIHsKKyAgICAvLyBnZXQgaHJlZl9iYXNlCisgICAgY2hhciAqaHJlZl9iYXNlX2VuZCA9IHN0cnJjaHIoY29kZWNzX3htbCwgJy8nKTsKKyAgICBpZiAoaHJlZl9iYXNlX2VuZCAhPSBOVUxMKSB7CisgICAgICAgIG1IcmVmQmFzZSA9IEFTdHJpbmcoY29kZWNzX3htbCwgaHJlZl9iYXNlX2VuZCAtIGNvZGVjc194bWwgKyAxKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7IC8vIGtlZXBpbmcgdGhpcyBoZXJlIGZvciBzYWZldHkKKyAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOworICAgIG1EZXB0aCA9IDA7CisKKyAgICBPTVhDbGllbnQgY2xpZW50OworICAgIG1Jbml0Q2hlY2sgPSBjbGllbnQuY29ubmVjdCgpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbU9NWCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKKyAgICBwYXJzZVhNTEZpbGUoY29kZWNzX3htbCk7CisgICAgbU9NWC5jbGVhcigpOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHBhcnNlWE1MRmlsZShmaWxlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gbUNvZGVjSW5mb3Muc2l6ZSgpOyBpLS0gPiAwOykgeworICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvcy5pdGVtQXQoaSkuZ2V0KCk7CisKKyAgICAgICAgaWYgKGluZm8ubUNhcHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIE5vIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudD8/PworICAgICAgICAgICAgQUxPR1coIkNvbXBvbmVudCAlcyBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlIG9mIG1lZGlhPyIsCisgICAgICAgICAgICAgICAgICBpbmZvLm1OYW1lLmNfc3RyKCkpOworCisgICAgICAgICAgICBtQ29kZWNJbmZvcy5yZW1vdmVBdChpKTsKKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHR5cGVfaXggPSAwOyB0eXBlX2l4IDwgaW5mby5tQ2Fwcy5zaXplKCk7ICsrdHlwZV9peCkgeworICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZSA9IGluZm8ubUNhcHMua2V5QXQodHlwZV9peCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcHMgPSBpbmZvLm1DYXBzLnZhbHVlQXQodHlwZV9peCk7CisKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgY29kZWMgaW5mbyBmb3IgJXM6ICVzIiwgaW5mby5tTmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5nZXREZXRhaWxzKCktPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiAgICBmbGFncz0lZCIsIGNhcHMtPmdldEZsYWdzKCkpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBjb2xvckZvcm1hdHM7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZENvbG9yRm9ybWF0cygmY29sb3JGb3JtYXRzKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBuaWNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY29sb3JGb3JtYXRzLnNpemUoKTsgaXgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoY29sb3JGb3JtYXRzLml0ZW1BdChpeCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgY29sb3JzPVslc10iLCBuaWNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOworICAgICAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBuaWNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcHJvZmlsZUxldmVscy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWwgJnBsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxzLml0ZW1BdChpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZChwbC5tUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQocGwubUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAgIGxldmVscz1bJXNdIiwgbmljZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KIAogI2lmIDAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0luZm9zLnNpemUoKTsgKytpKSB7CkBAIC03NSw5ICsxODEsNiBAQAogICAgICAgICBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOwogICAgIH0KICNlbmRpZgotCi0gICAgZmNsb3NlKGZpbGUpOwotICAgIGZpbGUgPSBOVUxMOwogfQogCiBNZWRpYUNvZGVjTGlzdDo6fk1lZGlhQ29kZWNMaXN0KCkgewpAQCAtODcsMTAgKzE5MCwxNCBAQAogICAgIHJldHVybiBtSW5pdENoZWNrOwogfQogCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVhNTEZpbGUoRklMRSAqZmlsZSkgewotICAgIG1Jbml0Q2hlY2sgPSBPSzsKLSAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgIG1EZXB0aCA9IDA7Cit2b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCkgeworICAgIEZJTEUgKmZpbGUgPSBmb3BlbihwYXRoLCAiciIpOworCisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGU6ICVzIiwgcGF0aCk7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gOjpYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOwogICAgIENIRUNLKHBhcnNlciAhPSBOVUxMKTsKQEAgLTEwMyw3ICsyMTAsNyBAQAogICAgIHdoaWxlIChtSW5pdENoZWNrID09IE9LKSB7CiAgICAgICAgIHZvaWQgKmJ1ZmYgPSA6OlhNTF9HZXRCdWZmZXIocGFyc2VyLCBCVUZGX1NJWkUpOwogICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGluIGNhbGwgdG8gWE1MX0dldEJ1ZmZlcigpIik7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gWE1MX0dldEJ1ZmZlcigpIik7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTUsOCArMjIyLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKDo6WE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKQotICAgICAgICAgICAgICAgICE9IFhNTF9TVEFUVVNfT0spIHsKKyAgICAgICAgWE1MX1N0YXR1cyBzdGF0dXMgPSA6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gWE1MX1NUQVRVU19PSykgeworICAgICAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCAoJXMpIiwgOjpYTUxfRXJyb3JTdHJpbmcoOjpYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTI4LDI1ICsyMzYsOCBAQAogCiAgICAgOjpYTUxfUGFyc2VyRnJlZShwYXJzZXIpOwogCi0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaS0tID4gMDspIHsKLSAgICAgICAgICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KGkpOwotCi0gICAgICAgICAgICBpZiAoaW5mby0+bVR5cGVzID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBObyB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQ/Pz8KLQotICAgICAgICAgICAgICAgIEFMT0dXKCJDb21wb25lbnQgJXMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgdHlwZSBvZiBtZWRpYT8iLAotICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1OYW1lLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgbUNvZGVjSW5mb3MucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICBtQ29kZWNJbmZvcy5jbGVhcigpOwotICAgICAgICBtQ29kZWNRdWlya3MuY2xlYXIoKTsKLSAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICAgIGZpbGUgPSBOVUxMOwogfQogCiAvLyBzdGF0aWMKQEAgLTE2MCwxMiArMjUxLDY1IEBACiAgICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0xpc3QgKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKmhyZWYgPSBOVUxMOworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgeworICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgImhyZWYiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBocmVmID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zIGFuZCBmb3Igc2ltcGxpY2l0eSwgZmlsZSBuYW1lcyBjYW4gb25seSBjb250YWluCisgICAgLy8gW2EtekEtWjAtOV8uXSBhbmQgbXVzdCBzdGFydCB3aXRoICBtZWRpYV9jb2RlY3NfIGFuZCBlbmQgd2l0aCAueG1sCisgICAgZm9yIChpID0gMDsgaHJlZltpXSAhPSAnXDAnOyBpKyspIHsKKyAgICAgICAgaWYgKGhyZWZbaV0gPT0gJy4nIHx8IGhyZWZbaV0gPT0gJ18nIHx8CisgICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJzAnICYmIGhyZWZbaV0gPD0gJzknKSB8fAorICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdBJyAmJiBocmVmW2ldIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnYScgJiYgaHJlZltpXSA8PSAneicpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgQVN0cmluZyBmaWxlbmFtZSA9IGhyZWY7CisgICAgaWYgKCFmaWxlbmFtZS5zdGFydHNXaXRoKCJtZWRpYV9jb2RlY3NfIikgfHwKKyAgICAgICAgIWZpbGVuYW1lLmVuZHNXaXRoKCIueG1sIikpIHsKKyAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBmaWxlbmFtZS5pbnNlcnQobUhyZWZCYXNlLCAwKTsKKworICAgIHBhcnNlWE1MRmlsZShmaWxlbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKwogdm9pZCBNZWRpYUNvZGVjTGlzdDo6c3RhcnRFbGVtZW50SGFuZGxlcigKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGJvb2wgaW5UeXBlID0gdHJ1ZTsKKworICAgIGlmICghc3RyY21wKG5hbWUsICJJbmNsdWRlIikpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IGluY2x1ZGVYTUxGaWxlKGF0dHJzKTsKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKKyAgICAgICAgICAgIG1QYXN0U2VjdGlvbnMucHVzaChtQ3VycmVudFNlY3Rpb24pOworICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9JTkNMVURFOworICAgICAgICB9CisgICAgICAgICsrbURlcHRoOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKICAgICAgICAgY2FzZSBTRUNUSU9OX1RPUExFVkVMOgogICAgICAgICB7CkBAIC0yMDYsNiArMzUwLDI1IEBACiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZFF1aXJrKGF0dHJzKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiVHlwZSIpKSB7CiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZFR5cGVGcm9tQXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ1RJT05fREVDT0RFUl9UWVBFIDogU0VDVElPTl9FTkNPREVSX1RZUEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluVHlwZSA9IGZhbHNlOworICAgICAgICAvLyBmYWxsIHRocm91Z2gKKworICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgorICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUgbGltaXRzIGFuZCBmZWF0dXJlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiB0eXBlCisgICAgICAgICAgICBib29sIG91dHNpZGUgPSAhaW5UeXBlICYmICFtQ3VycmVudEluZm8tPm1IYXNTb2xlTWltZTsKKyAgICAgICAgICAgIGlmIChvdXRzaWRlICYmICghc3RyY21wKG5hbWUsICJMaW1pdCIpIHx8ICFzdHJjbXAobmFtZSwgIkZlYXR1cmUiKSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkxpbWl0IikpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkTGltaXQoYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJGZWF0dXJlIikpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkRmVhdHVyZShhdHRycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjM5LDEwICs0MDIsMjUgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlR5cGUiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ1RJT05fREVDT0RFUiA6IFNFQ1RJT05fRU5DT0RFUik7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPmNvbXBsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CiAgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPmNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNTEsNiArNDI5LDE3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKICAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVJTOworICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mby0+Y29tcGxldGUoKTs7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJJbmNsdWRlIikgJiYgbVBhc3RTZWN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gbVBhc3RTZWN0aW9ucy50b3AoKTsKKyAgICAgICAgICAgICAgICBtUGFzdFNlY3Rpb25zLnBvcCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI5MiwyMyArNDgxLDM3IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIGFkZE1lZGlhQ29kZWMoZW5jb2RlciwgbmFtZSwgdHlwZSk7Ci0KKyAgICBtQ3VycmVudEluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm8obmFtZSwgZW5jb2RlciwgdHlwZSk7CisgICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQorICAgIC8vIGZhaWwuICBPbmx5IGxpc3QgdGhlIGNvZGVjIGlmIHRoaXMgc3VjY2VlZHMuCisgICAgLy8gSG93ZXZlciwga2VlcCBtQ3VycmVudEluZm8gb2JqZWN0IGFyb3VuZCB1bnRpbCBwYXJzaW5nCisgICAgLy8gb2YgZnVsbCBjb2RlYyBpbmZvIGlzIGNvbXBsZXRlZC4KKyAgICBpZiAoaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyh0eXBlKSA9PSBPSykgeworICAgICAgICBtQ29kZWNJbmZvcy5wdXNoX2JhY2sobUN1cnJlbnRJbmZvKTsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE1lZGlhQ29kZWNMaXN0OjphZGRNZWRpYUNvZGVjKAotICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUpIHsKLSAgICBtQ29kZWNJbmZvcy5wdXNoKCk7Ci0gICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zLmVkaXRJdGVtQXQobUNvZGVjSW5mb3Muc2l6ZSgpIC0gMSk7Ci0gICAgaW5mby0+bU5hbWUgPSBuYW1lOwotICAgIGluZm8tPm1Jc0VuY29kZXIgPSBlbmNvZGVyOwotICAgIGluZm8tPm1UeXBlcyA9IDA7Ci0gICAgaW5mby0+bVF1aXJrcyA9IDA7Ci0KLSAgICBpZiAodHlwZSAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZFR5cGUodHlwZSk7CitzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBjaGFyICp0eXBlKSB7CisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQorCisgICAgQUxPR1YoImluaXRpYWxpemVDYXBhYmlsaXRpZXMgJXM6JXMiLAorICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tTmFtZS5jX3N0cigpLCB0eXBlKTsKKworICAgIENvZGVjQ2FwYWJpbGl0aWVzIGNhcHM7CisgICAgc3RhdHVzX3QgZXJyID0gUXVlcnlDb2RlYygKKyAgICAgICAgICAgIG1PTVgsCisgICAgICAgICAgICBtQ3VycmVudEluZm8tPm1OYW1lLmNfc3RyKCksCisgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tSXNFbmNvZGVyLAorICAgICAgICAgICAgJmNhcHMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gbUN1cnJlbnRJbmZvLT5pbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNhcHMpOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKSB7CkBAIC0zMzMsMjQgKzUzNiw3IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHVpbnQzMl90IGJpdDsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNvZGVjUXVpcmtzLmluZGV4T2ZLZXkobmFtZSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBiaXQgPSBtQ29kZWNRdWlya3Muc2l6ZSgpOwotCi0gICAgICAgIGlmIChiaXQgPT0gMzIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJUb28gbWFueSBkaXN0aW5jdCBxdWlyayBuYW1lcyBpbiBjb25maWd1cmF0aW9uLiIpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvZGVjUXVpcmtzLmFkZChuYW1lLCBiaXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJpdCA9IG1Db2RlY1F1aXJrcy52YWx1ZUF0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBDb2RlY0luZm8gKmluZm8gPSAmbUNvZGVjSW5mb3MuZWRpdEl0ZW1BdChtQ29kZWNJbmZvcy5zaXplKCkgLSAxKTsKLSAgICBpbmZvLT5tUXVpcmtzIHw9IDF1bCA8PCBiaXQ7Ci0KKyAgICBtQ3VycmVudEluZm8tPmFkZFF1aXJrKG5hbWUpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzc2LDU3ICs1NjIsMjgwIEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIGFkZFR5cGUobmFtZSk7CisgICAgc3RhdHVzX3QgcmV0ID0gbUN1cnJlbnRJbmZvLT5hZGRNaW1lKG5hbWUpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKKyAgICAvLyBUaGUgbmV4dCBzdGVwIGludm9sdmVzIHRyeWluZyB0byBsb2FkIHRoZSBjb2RlYywgd2hpY2ggbWF5CisgICAgLy8gZmFpbC4gIEhhbmRsZSB0aGlzIGdyYWNlZnVsbHkgKGJ5IG5vdCByZXBvcnRpbmcgc3VjaCBtaW1lKS4KKyAgICBpZiAoaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhuYW1lKSAhPSBPSykgeworICAgICAgICBtQ3VycmVudEluZm8tPnJlbW92ZU1pbWUobmFtZSk7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6YWRkVHlwZShjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgdWludDMyX3QgYml0OwotICAgIHNzaXplX3QgaW5kZXggPSBtVHlwZXMuaW5kZXhPZktleShuYW1lKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIGJpdCA9IG1UeXBlcy5zaXplKCk7Ci0KLSAgICAgICAgaWYgKGJpdCA9PSAzMikgewotICAgICAgICAgICAgQUxPR1coIlRvbyBtYW55IGRpc3RpbmN0IHR5cGUgbmFtZXMgaW4gY29uZmlndXJhdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1UeXBlcy5hZGQobmFtZSwgYml0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBiaXQgPSBtVHlwZXMudmFsdWVBdChpbmRleCk7Ci0gICAgfQotCi0gICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zLmVkaXRJdGVtQXQobUNvZGVjSW5mb3Muc2l6ZSgpIC0gMSk7Ci0gICAgaW5mby0+bVR5cGVzIHw9IDF1bCA8PCBiaXQ7Ci19Ci0KKy8vIGxlZ2FjeSBtZXRob2QgZm9yIG5vbi1hZHZhbmNlZCBjb2RlY3MKIHNzaXplX3QgTWVkaWFDb2RlY0xpc3Q6OmZpbmRDb2RlY0J5VHlwZSgKICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCkgY29uc3QgewotICAgIHNzaXplX3QgdHlwZUluZGV4ID0gbVR5cGVzLmluZGV4T2ZLZXkodHlwZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFkdmFuY2VkRmVhdHVyZXNbXSA9IHsKKyAgICAgICAgImZlYXR1cmUtc2VjdXJlLXBsYXliYWNrIiwKKyAgICAgICAgImZlYXR1cmUtdHVubmVsZWQtcGxheWJhY2siLAorICAgIH07CiAKLSAgICBpZiAodHlwZUluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9CisgICAgc2l6ZV90IG51bUNvZGVjcyA9IG1Db2RlY0luZm9zLnNpemUoKTsKKyAgICBmb3IgKDsgc3RhcnRJbmRleCA8IG51bUNvZGVjczsgKytzdGFydEluZGV4KSB7CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChzdGFydEluZGV4KS5nZXQoKTsKIAotICAgIHVpbnQzMl90IHR5cGVNYXNrID0gMXVsIDw8IG1UeXBlcy52YWx1ZUF0KHR5cGVJbmRleCk7CisgICAgICAgIGlmIChpbmZvLmlzRW5jb2RlcigpICE9IGVuY29kZXIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcGFiaWxpdGllcyA9IGluZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yKHR5cGUpOworICAgICAgICBpZiAoY2FwYWJpbGl0aWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZGV0YWlscyA9IGNhcGFiaWxpdGllcy0+Z2V0RGV0YWlscygpOwogCi0gICAgd2hpbGUgKHN0YXJ0SW5kZXggPCBtQ29kZWNJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KHN0YXJ0SW5kZXgpOwotCi0gICAgICAgIGlmIChpbmZvLm1Jc0VuY29kZXIgPT0gZW5jb2RlciAmJiAoaW5mby5tVHlwZXMgJiB0eXBlTWFzaykpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGFydEluZGV4OworICAgICAgICBpbnQzMl90IHJlcXVpcmVkOworICAgICAgICBib29sIGlzQWR2YW5jZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IEFSUkFZX1NJWkUoYWR2YW5jZWRGZWF0dXJlcyk7IGl4KyspIHsKKyAgICAgICAgICAgIGlmIChkZXRhaWxzLT5maW5kSW50MzIoYWR2YW5jZWRGZWF0dXJlc1tpeF0sICZyZXF1aXJlZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlzQWR2YW5jZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgKytzdGFydEluZGV4OworICAgICAgICBpZiAoIWlzQWR2YW5jZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGFydEluZGV4OworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIC1FTk9FTlQ7CiB9CiAKK3N0YXRpYyBzdGF0dXNfdCBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoQVN0cmluZyBuYW1lLCBjb25zdCBjaGFyICphdHRyLCBib29sIGZvdW5kID0gdHJ1ZSkgeworICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggJXMnJXMnIGF0dHJpYnV0ZSIsIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIChmb3VuZCA/ICIiIDogIm5vICIpLCBhdHRyKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0YXR1c190IGxpbWl0RXJyb3IoQVN0cmluZyBuYW1lLCBjb25zdCBjaGFyICptc2cpIHsKKyAgICBBTE9HRSgibGltaXQgJyVzJyAlcyIsIG5hbWUuY19zdHIoKSwgbXNnKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0YXR1c190IGxpbWl0SW52YWxpZEF0dHIoQVN0cmluZyBuYW1lLCBjb25zdCBjaGFyICphdHRyLCBBU3RyaW5nIHZhbHVlKSB7CisgICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCBpbnZhbGlkICclcycgYXR0cmlidXRlICglcykiLCBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICBhdHRyLCB2YWx1ZS5jX3N0cigpKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgeworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXR0cmlidXRlcyB3aXRoIHZhbHVlcworICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm5hbWUiKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJkZWZhdWx0IikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAiaW4iKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJtYXgiKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJtaW4iKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyYW5nZSIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJhbmdlcyIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInNjYWxlIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgeworICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoYXR0cnNbaV0sIGF0dHJzW2kgKyAxXSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgQVN0cmluZyBuYW1lOworICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJuYW1lIiwgJm5hbWUpKSB7CisgICAgICAgIEFMT0dFKCJsaW1pdCB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gc2l6ZSwgYmxvY2tzLCBiaXRyYXRlLCBmcmFtZS1yYXRlLCBibG9ja3MtcGVyLXNlY29uZCwgYXNwZWN0LXJhdGlvOiByYW5nZQorICAgIC8vIHF1YWxpdHk6IHJhbmdlICsgZGVmYXVsdCArIFtzY2FsZV0KKyAgICAvLyBjb21wbGV4aXR5OiByYW5nZSArIGRlZmF1bHQKKyAgICBib29sIGZvdW5kOworCisgICAgaWYgKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIgfHwgbmFtZSA9PSAiYml0cmF0ZSIgfHwgbmFtZSA9PSAiYmxvY2stY291bnQiCisgICAgICAgICAgICB8fCBuYW1lID09ICJibG9ja3MtcGVyLXNlY29uZCIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIKKyAgICAgICAgICAgIHx8IG5hbWUgPT0gImZyYW1lLXJhdGUiIHx8IG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gInNpemUiKSB7CisgICAgICAgIEFTdHJpbmcgbWluLCBtYXg7CisgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoIm1pbiIsICZtaW4pICYmIG1zZy0+ZmluZFN0cmluZygibWF4IiwgJm1heCkpIHsKKyAgICAgICAgICAgIG1pbi5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIG1pbi5hcHBlbmQobWF4KTsKKyAgICAgICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpIHx8IG1zZy0+Y29udGFpbnMoInZhbHVlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzICdtaW4nIGFuZCAnbWF4JyBhcyB3ZWxsIGFzICdyYW5nZScgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgIid2YWx1ZScgYXR0cmlidXRlcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJhbmdlIiwgbWluKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJtaW4iKSB8fCBtc2ctPmNvbnRhaW5zKCJtYXgiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyBvbmx5ICdtaW4nIG9yICdtYXgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZFN0cmluZygidmFsdWUiLCAmbWF4KSkgeworICAgICAgICAgICAgbWluID0gbWF4OworICAgICAgICAgICAgbWluLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgbWluLmFwcGVuZChtYXgpOworICAgICAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoInJhbmdlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzIGJvdGggJ3JhbmdlJyBhbmQgJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZygicmFuZ2UiLCBtaW4pOworICAgICAgICB9CisKKyAgICAgICAgQVN0cmluZyByYW5nZSwgc2NhbGUgPSAibGluZWFyIiwgZGVmLCBpbl87CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJyYW5nZSIsICZyYW5nZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJ3aXRoIG5vICdyYW5nZScsICd2YWx1ZScgb3IgJ21pbicvJ21heCcgYXR0cmlidXRlcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJjb21wbGV4aXR5IikgXgorICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygiZGVmYXVsdCIsICZkZWYpKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiZGVmYXVsdCIsIGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSAhPSAicXVhbGl0eSIgJiYgbXNnLT5maW5kU3RyaW5nKCJzY2FsZSIsICZzY2FsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInNjYWxlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChuYW1lID09ICJhc3BlY3QtcmF0aW8iKSBeIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygiaW4iLCAmaW5fKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImluIiwgZm91bmQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIpIHsKKyAgICAgICAgICAgIGlmICghKGluXyA9PSAicGl4ZWxzIikgJiYgIShpbl8gPT0gImJsb2NrcyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0SW52YWxpZEF0dHIobmFtZSwgImluIiwgaW5fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluXy5lcmFzZSg1LCAxKTsgLy8gKHBpeGVsfGJsb2NrKS1hc3BlY3QtcmF0aW8KKyAgICAgICAgICAgIGluXy5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIGluXy5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICBuYW1lID0gaW5fOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09ICJxdWFsaXR5IikgeworICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwoInF1YWxpdHktc2NhbGUiLCBzY2FsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiKSB7CisgICAgICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7CisgICAgICAgICAgICB0YWcuYXBwZW5kKCItZGVmYXVsdCIpOworICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwodGFnLCBkZWYpOworICAgICAgICB9CisgICAgICAgIEFTdHJpbmcgdGFnID0gbmFtZTsKKyAgICAgICAgdGFnLmFwcGVuZCgiLXJhbmdlIik7CisgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgcmFuZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTdHJpbmcgbWF4LCB2YWx1ZSwgcmFuZ2VzOworICAgICAgICBpZiAobXNnLT5jb250YWlucygiZGVmYXVsdCIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJkZWZhdWx0Iik7CisgICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygiaW4iKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiaW4iKTsKKyAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PSAiY2hhbm5lbC1jb3VudCIpIF4KKyAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWF4IiwgZm91bmQpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJtaW4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJyYW5nZSIpOworICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJzYW1wbGUtcmF0ZSIpIF4KKyAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInJhbmdlcyIsICZyYW5nZXMpKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAicmFuZ2VzIiwgZm91bmQpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoInNjYWxlIikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInNjYWxlIik7CisgICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImFsaWdubWVudCIgfHwgbmFtZSA9PSAiYmxvY2stc2l6ZSIpIF4KKyAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJnZhbHVlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInZhbHVlIiwgZm91bmQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1heC5zaXplKCkpIHsKKyAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gIm1heC0iOworICAgICAgICAgICAgdGFnLmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgbWF4KTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5zaXplKCkpIHsKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChyYW5nZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7CisgICAgICAgICAgICB0YWcuYXBwZW5kKCItcmFuZ2VzIik7CisgICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIHJhbmdlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgdW5yZWNvZ25pemVkIGxpbWl0ICclcyciLCBuYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIGJvb2wgcGFyc2VCb29sZWFuKGNvbnN0IGNoYXIgKnMpIHsKKyAgICBpZiAoIXN0cmNhc2VjbXAocywgInRydWUiKSB8fCAhc3RyY2FzZWNtcChzLCAieWVzIikgfHwgIXN0cmNhc2VjbXAocywgInkiKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2hhciAqZW5kOworICAgIHVuc2lnbmVkIGxvbmcgcmVzID0gc3RydG91bChzLCAmZW5kLCAxMCk7CisgICAgcmV0dXJuICpzICE9ICdcMCcgJiYgKmVuZCA9PSAnXDAnICYmIHJlcyA+IDA7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIHNpemVfdCBpID0gMDsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBpbnQzMl90IG9wdGlvbmFsID0gLTE7CisgICAgaW50MzJfdCByZXF1aXJlZCA9IC0xOworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKKworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICAvLyBhdHRyaWJ1dGVzIHdpdGggdmFsdWVzCisgICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJvcHRpb25hbCIpIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyZXF1aXJlZCIpKSB7CisgICAgICAgICAgICBpbnQgdmFsdWUgPSAoaW50KXBhcnNlQm9vbGVhbihhdHRyc1tpICsgMV0pOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJvcHRpb25hbCIpKSB7CisgICAgICAgICAgICAgICAgb3B0aW9uYWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgeworICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZlYXR1cmUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCAmJiBvcHRpb25hbCAhPSAtMSkgeworICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGlzIGJvdGgvbmVpdGhlciBvcHRpb25hbCBhbmQgcmVxdWlyZWQiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKChvcHRpb25hbCAhPSAtMSB8fCByZXF1aXJlZCAhPSAtMSkgJiYgKHZhbHVlICE9IE5VTEwpKSB7CisgICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaGFzIGJvdGggYSB2YWx1ZSBhbmQgb3B0aW9uYWwvcmVxdWlyZWQgYXR0cmlidXRlIiwgbmFtZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRmVhdHVyZShuYW1lLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGRGZWF0dXJlKG5hbWUsIChyZXF1aXJlZCA9PSAxKSB8fCAob3B0aW9uYWwgPT0gMCkpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHNzaXplX3QgTWVkaWFDb2RlY0xpc3Q6OmZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBDb2RlY0luZm8gJmluZm8gPSBtQ29kZWNJbmZvcy5pdGVtQXQoaSk7CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChpKS5nZXQoKTsKIAogICAgICAgICBpZiAoaW5mby5tTmFtZSA9PSBuYW1lKSB7CiAgICAgICAgICAgICByZXR1cm4gaTsKQEAgLTQ0MCwxMDggKzg0OSw0IEBACiAgICAgcmV0dXJuIG1Db2RlY0luZm9zLnNpemUoKTsKIH0KIAotY29uc3QgY2hhciAqTWVkaWFDb2RlY0xpc3Q6OmdldENvZGVjTmFtZShzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0gICAgcmV0dXJuIGluZm8ubU5hbWUuY19zdHIoKTsKLX0KLQotYm9vbCBNZWRpYUNvZGVjTGlzdDo6aXNFbmNvZGVyKHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA+PSBtQ29kZWNJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKLSAgICByZXR1cm4gaW5mby5tSXNFbmNvZGVyOwotfQotCi1ib29sIE1lZGlhQ29kZWNMaXN0Ojpjb2RlY0hhc1F1aXJrKAotICAgICAgICBzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnF1aXJrTmFtZSkgY29uc3QgewotICAgIGlmIChpbmRleCA+PSBtQ29kZWNJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKLQotICAgIGlmIChpbmZvLm1RdWlya3MgIT0gMCkgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNvZGVjUXVpcmtzLmluZGV4T2ZLZXkocXVpcmtOYW1lKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5mby5tUXVpcmtzICYgKDF1bCA8PCBtQ29kZWNRdWlya3MudmFsdWVBdChpbmRleCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmdldFN1cHBvcnRlZFR5cGVzKAotICAgICAgICBzaXplX3QgaW5kZXgsIFZlY3RvcjxBU3RyaW5nPiAqdHlwZXMpIGNvbnN0IHsKLSAgICB0eXBlcy0+Y2xlYXIoKTsKLQotICAgIGlmIChpbmRleCA+PSBtQ29kZWNJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC1FUkFOR0U7Ci0gICAgfQotCi0gICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVR5cGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGVNYXNrID0gMXVsIDw8IG1UeXBlcy52YWx1ZUF0KGkpOwotCi0gICAgICAgIGlmIChpbmZvLm1UeXBlcyAmIHR5cGVNYXNrKSB7Ci0gICAgICAgICAgICB0eXBlcy0+cHVzaChtVHlwZXMua2V5QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6Z2V0Q29kZWNDYXBhYmlsaXRpZXMoCi0gICAgICAgIHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqdHlwZSwKLSAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMsCi0gICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gKmNvbG9yRm9ybWF0cywKLSAgICAgICAgdWludDMyX3QgKmZsYWdzKSBjb25zdCB7Ci0gICAgcHJvZmlsZUxldmVscy0+Y2xlYXIoKTsKLSAgICBjb2xvckZvcm1hdHMtPmNsZWFyKCk7Ci0KLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0KLSAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIHN0YXR1c190IGVyciA9IGNsaWVudC5jb25uZWN0KCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIENvZGVjQ2FwYWJpbGl0aWVzIGNhcHM7Ci0gICAgZXJyID0gUXVlcnlDb2RlYygKLSAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwKLSAgICAgICAgICAgIGluZm8ubU5hbWUuY19zdHIoKSwgdHlwZSwgaW5mby5tSXNFbmNvZGVyLCAmY2Fwcyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZzcmMgPSBjYXBzLm1Qcm9maWxlTGV2ZWxzLml0ZW1BdChpKTsKLQotICAgICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOwotICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBzcmMubVByb2ZpbGU7Ci0gICAgICAgIHByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBzcmMubUxldmVsOwotICAgICAgICBwcm9maWxlTGV2ZWxzLT5wdXNoKHByb2ZpbGVMZXZlbCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLm1Db2xvckZvcm1hdHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29sb3JGb3JtYXRzLT5wdXNoKGNhcHMubUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkpOwotICAgIH0KLQotICAgICpmbGFncyA9IGNhcHMubUZsYWdzOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVjZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTAsMCArMSw4OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY1NvdXJjZSIKKyNkZWZpbmUgREVCVUdfRFJJRlRfVElNRSAwCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBQdWxsZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCisgICAgc3RhdHVzX3Qgc3RhcnQoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisgICAgdm9pZCBzdG9wKCk7CisKKyAgICB2b2lkIHBhdXNlKCk7CisgICAgdm9pZCByZXN1bWUoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB+UHVsbGVyKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U3RhcnQgPSAnbXN0YScsCisgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAga1doYXRQdWxsLAorICAgICAgICBrV2hhdFBhdXNlLAorICAgICAgICBrV2hhdFJlc3VtZSwKKyAgICB9OworCisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBpbnQzMl90IG1QdWxsR2VuZXJhdGlvbjsKKyAgICBib29sIG1Jc0F1ZGlvOworICAgIGJvb2wgbVBhdXNlZDsKKyAgICBib29sIG1SZWFjaGVkRU9TOworCisgICAgc3RhdHVzX3QgcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzY2hlZHVsZVB1bGwoKTsKKyAgICB2b2lkIGhhbmRsZUVPUygpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHVsbGVyKTsKK307CisKK01lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6UHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlcigpKSwKKyAgICAgIG1QdWxsR2VuZXJhdGlvbigwKSwKKyAgICAgIG1Jc0F1ZGlvKGZhbHNlKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVJlYWNoZWRFT1MoZmFsc2UpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJwdWxsX2xvb3BlciIpOworfQorCitNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6On5QdWxsZXIoKSB7CisgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgbUxvb3Blci0+c3RvcCgpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6c3RhcnQoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgeworICAgIEFMT0dWKCJwdWxsZXIgKCVzKSBzdGFydCIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgIG1Mb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAorICAgICAgICAgICAgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIG1Ob3RpZnkgPSBub3RpZnk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOworICAgIG1zZy0+c2V0T2JqZWN0KCJtZXRhIiwgbWV0YSk7CisgICAgcmV0dXJuIHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IobXNnKTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnN0b3AoKSB7CisgICAgLy8gU3RvcCBzb3VyY2UgZnJvbSBjYWxsZXIncyB0aHJlYWQgaW5zdGVhZCBvZiBwdWxsZXIncyBsb29wZXIuCisgICAgLy8gbVNvdXJjZS0+c3RvcCgpIGlzIHRocmVhZC1zYWZlLCBkb2luZyBpdCBvdXRzaWRlIHRoZSBwdWxsZXIncworICAgIC8vIGxvb3BlciBhbGxvd3MgdXMgdG8gYXQgbGVhc3Qgc3RvcCBpZiBzb3VyY2UgZ2V0cyBzdHVjay4KKyAgICAvLyBJZiBzb3VyY2UgZ2V0cyBzdHVjayBpbiByZWFkKCksIHRoZSBsb29wZXIgd291bGQgbmV2ZXIKKyAgICAvLyBiZSBhYmxlIHRvIHByb2Nlc3MgdGhlIHN0b3AoKSwgd2hpY2ggY291bGQgbGVhZCB0byBBTlIuCisKKyAgICBBTE9HVigic291cmNlICglcykgc3RvcHBpbmciLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICBtU291cmNlLT5zdG9wKCk7CisgICAgQUxPR1YoInNvdXJjZSAoJXMpIHN0b3BwZWQiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnBhdXNlKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpyZXN1bWUoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpzY2hlZHVsZVB1bGwoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFB1bGwsIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUHVsbEdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6aGFuZGxlRU9TKCkgeworICAgIGlmICghbVJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR1YoInB1bGxlciAoJXMpIHBvc3RpbmcgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldFBvaW50ZXIoImFjY2Vzc1VuaXQiLCBOVUxMKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJtZXRhIiwgJm9iaikpOworCisgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChzdGF0aWNfY2FzdDxNZXRhRGF0YSAqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlUHVsbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcDoKKyAgICAgICAgeworICAgICAgICAgICAgKyttUHVsbEdlbmVyYXRpb247CisKKyAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UHVsbDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworCisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtUHVsbEdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtYnVmKTsKKworICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbWJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0cmVhbSBlbmRlZCwgbWJ1ZiAlcCIsIG1idWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciAlZCByZWFkaW5nIHN0cmVhbS4iLCBlcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVFT1MoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworCisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRQb2ludGVyKCJhY2Nlc3NVbml0IiwgbWJ1Zik7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgorICAgICAgICB7CisgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYworc3A8TWVkaWFDb2RlY1NvdXJjZT4gTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8TWVkaWFDb2RlY1NvdXJjZT4gbWVkaWFTb3VyY2UgPQorICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNTb3VyY2UobG9vcGVyLCBmb3JtYXQsIHNvdXJjZSwgZmxhZ3MpOworCisgICAgaWYgKG1lZGlhU291cmNlLT5pbml0KCkgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1lZGlhU291cmNlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6c3RhcnQoTWV0YURhdGEqIHBhcmFtcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgbXNnLT5zZXRPYmplY3QoIm1ldGEiLCBwYXJhbXMpOworICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnN0b3AoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHN0YXR1c190IGVyciA9IHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IobXNnKTsKKworICAgIC8vIG1QdWxsZXItPnN0b3AoKSBuZWVkcyB0byBiZSBkb25lIG91dHNpZGUgTWVkaWFDb2RlY1NvdXJjZSdzIGxvb3BlciwKKyAgICAvLyBhcyBpdCBjb250YWlucyBhIHN5bmNocm9ub3VzIGNhbGwgdG8gc3RvcCB0aGUgdW5kZXJseWluZyBNZWRpYVNvdXJjZSwKKyAgICAvLyB3aGljaCBvZnRlbiB3YWl0cyBmb3IgYWxsIG91dHN0YW5kaW5nIE1lZGlhQnVmZmVycyB0byByZXR1cm4sIGJ1dAorICAgIC8vIE1lZGlhQnVmZmVycyBhcmUgb25seSByZXR1cm5lZCB3aGVuIE1lZGlhQ29kZWNTb3VyY2UgbG9vcGVyIGdldHMKKyAgICAvLyB0byBwcm9jZXNzIHRoZW0uCisKKyAgICBpZiAobVB1bGxlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJwdWxsZXIgKCVzKSBzdG9wcGluZyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICBtUHVsbGVyLT5zdG9wKCk7CisgICAgICAgIEFMT0dJKCJwdWxsZXIgKCVzKSBzdG9wcGVkIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cGF1c2UoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IE1lZGlhQ29kZWNTb3VyY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIHsKKyAgICBDSEVDSyhtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKTsKKyAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIqKiBidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zKiAvKiBvcHRpb25zICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1PdXRwdXRCdWZmZXJMb2NrKTsKKworICAgICpidWZmZXIgPSBOVUxMOworICAgIHdoaWxlIChtT3V0cHV0QnVmZmVyUXVldWUuc2l6ZSgpID09IDAgJiYgIW1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICBtT3V0cHV0QnVmZmVyQ29uZC53YWl0KG1PdXRwdXRCdWZmZXJMb2NrKTsKKyAgICB9CisgICAgaWYgKCFtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgKmJ1ZmZlciA9ICptT3V0cHV0QnVmZmVyUXVldWUuYmVnaW4oKTsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLmVyYXNlKG1PdXRwdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gbUVycm9yQ29kZTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgYnVmZmVyLT5zZXRPYnNlcnZlcigwKTsKKyAgICBidWZmZXItPnJlbGVhc2UoKTsKK30KKworTWVkaWFDb2RlY1NvdXJjZTo6TWVkaWFDb2RlY1NvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICB1aW50MzJfdCBmbGFncykKKyAgICA6IG1Mb29wZXIobG9vcGVyKSwKKyAgICAgIG1PdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KSwKKyAgICAgIG1NZXRhKG5ldyBNZXRhRGF0YSksCisgICAgICBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbUlzVmlkZW8oZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVN0b3BwaW5nKGZhbHNlKSwKKyAgICAgIG1Eb01vcmVXb3JrUGVuZGluZyhmYWxzZSksCisgICAgICBtRmlyc3RTYW1wbGVUaW1lVXMoLTFsbCksCisgICAgICBtRW5jb2RlclJlYWNoZWRFT1MoZmFsc2UpLAorICAgICAgbUVycm9yQ29kZShPSykgeworICAgIENIRUNLKG1Mb29wZXIgIT0gTlVMTCk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLmNfc3RyKCksIDYpKSB7CisgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSkgeworICAgICAgICBtUHVsbGVyID0gbmV3IFB1bGxlcihzb3VyY2UpOworICAgIH0KK30KKworTWVkaWFDb2RlY1NvdXJjZTo6fk1lZGlhQ29kZWNTb3VyY2UoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKKworICAgIG1Db2RlY0xvb3Blci0+c3RvcCgpOworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3ItPmlkKCkpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjppbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6aW5pdEVuY29kZXIoKSB7CisgICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxNZWRpYUNvZGVjU291cmNlPih0aGlzKTsKKyAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CisKKyAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoImNvZGVjX2xvb3BlciIpOworICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoKTsKKworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9NRVRBREFUQV9JTlBVVCkgeworICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIsIDEpOworICAgIH0KKworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CisgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiLCAxKTsKKyAgICB9CisKKyAgICBBU3RyaW5nIG91dHB1dE1JTUU7CisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZvdXRwdXRNSU1FKSk7CisKKyAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKKyAgICAgICAgICAgIG1Db2RlY0xvb3Blciwgb3V0cHV0TUlNRS5jX3N0cigpLCB0cnVlIC8qIGVuY29kZXIgKi8pOworCisgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgQUxPR1YoIm91dHB1dCBmb3JtYXQgaXMgJyVzJyIsIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOworCisgICAgc3RhdHVzX3QgZXJyID0gbUVuY29kZXItPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgIE5VTEwgLyogbmF0aXZlV2luZG93ICovLAorICAgICAgICAgICAgICAgIE5VTEwgLyogY3J5cHRvICovLAorICAgICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbUVuY29kZXItPmdldE91dHB1dEZvcm1hdCgmbU91dHB1dEZvcm1hdCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1PdXRwdXRGb3JtYXQsIG1NZXRhKTsKKworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CisgICAgICAgIENIRUNLKG1Jc1ZpZGVvKTsKKworICAgICAgICBlcnIgPSBtRW5jb2Rlci0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZtR3JhcGhpY0J1ZmZlclByb2R1Y2VyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyID0gbUVuY29kZXItPnN0YXJ0KCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gbUVuY29kZXItPmdldElucHV0QnVmZmVycygmbUVuY29kZXJJbnB1dEJ1ZmZlcnMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG1FbmNvZGVyLT5nZXRPdXRwdXRCdWZmZXJzKCZtRW5jb2Rlck91dHB1dEJ1ZmZlcnMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1FbmNvZGVyUmVhY2hlZEVPUyA9IGZhbHNlOworICAgIG1FcnJvckNvZGUgPSBPSzsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpyZWxlYXNlRW5jb2RlcigpIHsKKyAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUVuY29kZXItPnJlbGVhc2UoKTsKKyAgICBtRW5jb2Rlci5jbGVhcigpOworCisgICAgd2hpbGUgKCFtSW5wdXRCdWZmZXJRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gKm1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmVyYXNlKG1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FbmNvZGVySW5wdXRCdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoaSk7CisgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKKyAgICB9CisKKyAgICBtRW5jb2RlcklucHV0QnVmZmVycy5jbGVhcigpOworICAgIG1FbmNvZGVyT3V0cHV0QnVmZmVycy5jbGVhcigpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCFyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnNpZ25hbEVPUyhzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoIW1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICBBTE9HVigiZW5jb2RlciAoJXMpIHJlYWNoZWQgRU9TIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtT3V0cHV0QnVmZmVyTG9jayk7CisgICAgICAgICAgICAvLyByZWxlYXNlIGFsbCB1bnJlYWQgbWVkaWEgYnVmZmVycworICAgICAgICAgICAgZm9yIChMaXN0PE1lZGlhQnVmZmVyKj46Oml0ZXJhdG9yIGl0ID0gbU91dHB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IG1PdXRwdXRCdWZmZXJRdWV1ZS5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgICAgICgqaXQpLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWUuY2xlYXIoKTsKKyAgICAgICAgICAgIG1FbmNvZGVyUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgICAgICBtRXJyb3JDb2RlID0gZXJyOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvbmQuc2lnbmFsKCk7CisgICAgICAgIH0KKworICAgICAgICByZWxlYXNlRW5jb2RlcigpOworICAgIH0KKyAgICBpZiAobVN0b3BwaW5nICYmIG1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICBBTE9HSSgiZW5jb2RlciAoJXMpIHN0b3BwZWQiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKyAgICAgICAgLy8gcG9zdGluZyByZXBseSB0byBldmVyeW9uZSB0aGF0J3Mgd2FpdGluZworICAgICAgICBMaXN0PHVpbnQzMl90Pjo6aXRlcmF0b3IgaXQ7CisgICAgICAgIGZvciAoaXQgPSBtU3RvcFJlcGx5SURRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IG1TdG9wUmVwbHlJRFF1ZXVlLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KCppdCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0b3BSZXBseUlEUXVldWUuY2xlYXIoKTsKKyAgICAgICAgbVN0b3BwaW5nID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnN1c3BlbmQoKSB7CisgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CisgICAgaWYgKG1FbmNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCB0cnVlKTsKKyAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6cmVzdW1lKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzKSB7CisgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CisgICAgaWYgKG1FbmNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCBmYWxzZSk7CisgICAgICAgIGlmIChza2lwRnJhbWVzQmVmb3JlVXMgPiAwKSB7CisgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCBza2lwRnJhbWVzQmVmb3JlVXMpOworICAgICAgICB9CisgICAgICAgIG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnNjaGVkdWxlRG9Nb3JlV29yaygpIHsKKyAgICBpZiAobURvTW9yZVdvcmtQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSB0cnVlOworCisgICAgaWYgKG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkgPT0gTlVMTCkgeworICAgICAgICBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID0gbmV3IEFNZXNzYWdlKAorICAgICAgICAgICAgICAgIGtXaGF0RW5jb2RlckFjdGl2aXR5LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICB9CisgICAgbUVuY29kZXItPnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtRW5jb2RlckFjdGl2aXR5Tm90aWZ5KTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6ZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKSB7CisgICAgd2hpbGUgKCFtSW5wdXRCdWZmZXJRdWV1ZS5lbXB0eSgpCisgICAgICAgICAgICAmJiAhbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyKiBtYnVmID0gKm1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmVyYXNlKG1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCkpOworCisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleCA9ICptQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCk7CisgICAgICAgIG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZXJhc2UobUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5iZWdpbigpKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IDBsbDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgQ0hFQ0sobWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgICAgICAgICAvLyBwdXNoIGRlY29kaW5nIHRpbWUgZm9yIHZpZGVvLCBvciBkcmlmdCB0aW1lIGZvciBhdWRpbworICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgICAgICAgICAgbURlY29kaW5nVGltZVF1ZXVlLnB1c2hfYmFjayh0aW1lVXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyNpZiBERUJVR19EUklGVF9USU1FCisgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFNhbXBsZVRpbWVVcyA8IDBsbCkgeworICAgICAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBkcmlmdFRpbWVVcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleURyaWZ0VGltZSwgJmRyaWZ0VGltZVVzKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHJpZnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpZnRUaW1lVXMgPSB0aW1lVXMgLSBtRmlyc3RTYW1wbGVUaW1lVXMgLSBkcmlmdFRpbWVVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbURyaWZ0VGltZVF1ZXVlLnB1c2hfYmFjayhkcmlmdFRpbWVVcyk7CisjZW5kaWYgLy8gREVCVUdfRFJJRlRfVElNRQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplID0gbWJ1Zi0+c2l6ZSgpOworCisgICAgICAgICAgICBtZW1jcHkobUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KS0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIG1idWYtPmRhdGEoKSwgc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgIC8vIHZpZGVvIGVuY29kZXIgd2lsbCByZWxlYXNlIE1lZGlhQnVmZmVyIHdoZW4gZG9uZQorICAgICAgICAgICAgICAgIC8vIHdpdGggdW5kZXJseWluZyBkYXRhLgorICAgICAgICAgICAgICAgIG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCktPnNldE1lZGlhQnVmZmVyQmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1idWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbGFncyA9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCAwLCBzaXplLCB0aW1lVXMsIGZsYWdzKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpkb01vcmVXb3JrKGludDMyX3QgbnVtSW5wdXQsIGludDMyX3QgbnVtT3V0cHV0KSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSkgeworICAgICAgICB3aGlsZSAobnVtSW5wdXQtLSA+IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmJ1ZmZlckluZGV4KTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLnB1c2hfYmFjayhidWZmZXJJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmZWVkRW5jb2RlcklucHV0QnVmZmVycygpOworICAgIH0KKworICAgIHdoaWxlIChudW1PdXRwdXQtLSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4OworICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGVyciA9IG1FbmNvZGVyLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICZidWZmZXJJbmRleCwgJm9mZnNldCwgJnNpemUsICZ0aW1lVXMsICZmbGFncyk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBtRW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmbUVuY29kZXJPdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7CisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IG91dGJ1ZiA9IG1FbmNvZGVyT3V0cHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpOworCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihvdXRidWYtPnNpemUoKSk7CisgICAgICAgICAgICBtZW1jcHkobWJ1Zi0+ZGF0YSgpLCBvdXRidWYtPmRhdGEoKSwgb3V0YnVmLT5zaXplKCkpOworCisgICAgICAgICAgICBpZiAoIShmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3JhcGhpY0J1ZmZlclNvdXJjZSBpcyBzdXBwb3NlZCB0byBkaXNjYXJkIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBiZWZvcmUgc3RhcnQsIGFuZCBvZmZzZXQgdGltZVVzIGJ5IHN0YXJ0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWNvZGluZyB0aW1lIGZvciBzdXJmYWNlIHNvdXJjZSBpcyB1bmF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBwcmVzZW50YXRpb24gdGltZSBmb3Igbm93LiBNYXkgbmVlZCB0byBtb3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGxvZ2ljIGludG8gTWVkaWFDb2RlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soIW1EZWNvZGluZ1RpbWVRdWV1ZS5lbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzID0gKihtRGVjb2RpbmdUaW1lUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVjb2RpbmdUaW1lUXVldWUuZXJhc2UobURlY29kaW5nVGltZVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCBkZWNvZGluZ1RpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlt2aWRlb10gdGltZSAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSwgZHRzL3B0cyBkaWZmICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIHRpbWVVcyAvIDFFNiwgZGVjb2RpbmdUaW1lVXMgLSB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHJpZnRUaW1lVXMgPSAwOworI2lmIERFQlVHX0RSSUZUX1RJTUUKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soIW1EcmlmdFRpbWVRdWV1ZS5lbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHJpZnRUaW1lVXMgPSAqKG1EcmlmdFRpbWVRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgbURyaWZ0VGltZVF1ZXVlLmVyYXNlKG1EcmlmdFRpbWVRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlEcmlmdFRpbWUsIGRyaWZ0VGltZVVzKTsKKyNlbmRpZiAvLyBERUJVR19EUklGVF9USU1FCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbYXVkaW9dIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcyksIGRyaWZ0ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIHRpbWVVcyAvIDFFNiwgZHJpZnRUaW1lVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUUpIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1idWYtPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgbWJ1Zi0+YWRkX3JlZigpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1PdXRwdXRCdWZmZXJMb2NrKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWUucHVzaF9iYWNrKG1idWYpOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb25kLnNpZ25hbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUVuY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySW5kZXgpOworCisgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6b25TdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaWYgKG1TdG9wcGluZykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHdoaWxlIHdlJ3JlIHN0b3BwaW5nIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0koIk1lZGlhQ29kZWNTb3VyY2UgKCVzKSByZXN1bWluZyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICAgICAgcmVzdW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOworICAgICAgICAgICAgbVB1bGxlci0+cmVzdW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgc3RhcnRpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy0+ZmluZEludDY0KGtLZXlUaW1lLCAmc3RhcnRUaW1lVXMpKSB7CisgICAgICAgICAgICBzdGFydFRpbWVVcyA9IC0xbGw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdW1lKHN0YXJ0VGltZVVzKTsKKyAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0sobVB1bGxlciAhPSBOVUxMKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBrV2hhdFB1bGxlck5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgIGVyciA9IG1QdWxsZXItPnN0YXJ0KHBhcmFtcywgbm90aWZ5KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgc3RhcnRlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICBjYXNlIGtXaGF0UHVsbGVyTm90aWZ5OgorICAgIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImFjY2Vzc1VuaXQiLCAodm9pZCoqKSZtYnVmKSk7CisKKyAgICAgICAgaWYgKG1idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoInB1bGxlciAoJXMpIHJlYWNoZWQgRU9TIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgICAgICBzaWduYWxFT1MoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigiZ290IG1zZyAnJXMnIGFmdGVyIGVuY29kZXIgc2h1dGRvd24uIiwKKyAgICAgICAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5wdXNoX2JhY2sobWJ1Zik7CisKKyAgICAgICAgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga1doYXRFbmNvZGVyQWN0aXZpdHk6CisgICAgeworICAgICAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IG51bUlucHV0LCBudW1PdXRwdXQ7CisKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5wdXQtYnVmZmVycyIsICZudW1JbnB1dCkpIHsKKyAgICAgICAgICAgIG51bUlucHV0ID0gSU5UMzJfTUFYOworICAgICAgICB9CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIm91dHB1dC1idWZmZXJzIiwgJm51bU91dHB1dCkpIHsKKyAgICAgICAgICAgIG51bU91dHB1dCA9IElOVDMyX01BWDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IGRvTW9yZVdvcmsobnVtSW5wdXQsIG51bU91dHB1dCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyByZWFjaGVkIEVPUywgb3IgZXJyb3IKKyAgICAgICAgICAgIHNpZ25hbEVPUyhlcnIpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgibWV0YSIsICZvYmopKTsKKyAgICAgICAgTWV0YURhdGEgKnBhcmFtcyA9IHN0YXRpY19jYXN0PE1ldGFEYXRhICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIG9uU3RhcnQocGFyYW1zKSk7CisgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0U3RvcDoKKyAgICB7CisgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgc3RvcHBpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKworICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgaWYgKG1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSByZWFjaGVkIEVPUywgcmVwbHkgYW5kIHJldHVybiBub3cKKyAgICAgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgYWxyZWFkeSBzdG9wcGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtU3RvcFJlcGx5SURRdWV1ZS5wdXNoX2JhY2socmVwbHlJRCk7CisgICAgICAgIGlmIChtU3RvcHBpbmcpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgd2UncmUgYWxyZWFkeSBzdG9wcGluZywgcmVwbHkgd2lsbCBiZSBwb3N0ZWQKKyAgICAgICAgICAgIC8vIHRvIGFsbCB3aGVuIHdlJ3JlIHN0b3BwZWQuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1TdG9wcGluZyA9IHRydWU7CisKKyAgICAgICAgLy8gaWYgdXNpbmcgc3VyZmFjZSwgc2lnbmFsIHNvdXJjZSBFT1MgYW5kIHdhaXQgZm9yIEVPUyB0byBjb21lIGJhY2suCisgICAgICAgIC8vIG90aGVyd2lzZSwgcmVsZWFzZSBlbmNvZGVyIGFuZCBwb3N0IEVPUyBpZiBoYXZlbid0IGRvbmUgYWxyZWFkeQorICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICAgICAgbUVuY29kZXItPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpZ25hbEVPUygpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0UGF1c2U6CisgICAgeworICAgICAgICBpZiAobUZsYWdzICYmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgIHN1c3BlbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKG1QdWxsZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBtUHVsbGVyLT5wYXVzZSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKaW5kZXggMzQwY2JhNy4uZDQ4ZGQ4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDggPSAidmlkZW8veC12bmQub24yLnZwOCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDkgPSAidmlkZW8veC12bmQub24yLnZwOSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgPSAidmlkZW8vYXZjIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgPSAidmlkZW8vaGV2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgPSAidmlkZW8vM2dwcCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiA9ICJ2aWRlby9tcGVnMiI7CkBAIC0zNiw2ICszNyw3IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgPSAiYXVkaW8vbXA0YS1sYXRtIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQID0gImF1ZGlvL3FjZWxwIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyA9ICJhdWRpby92b3JiaXMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyA9ICJhdWRpby9vcHVzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyA9ICJhdWRpby9nNzExLWFsYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXID0gImF1ZGlvL2c3MTEtbWxhdyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgPSAiYXVkaW8vcmF3IjsKQEAgLTU2LDUgKzU4LDcgQEAKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQID0gInRleHQvM2dwcC10dCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1NVQlJJUCA9ICJhcHBsaWNhdGlvbi94LXN1YnJpcCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1ZUVCA9ICJ0ZXh0L3Z0dCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDggPSAidGV4dC9jZWEtNjA4IjsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggZDg3ZTkxMC4uYzdjNmYzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYU11eGVyIgorCisjaW5jbHVkZSAid2VibS9XZWJtV3JpdGVyLmgiCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KQEAgLTM2LDE5ICszOSwzMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYU11eGVyOjpNZWRpYU11eGVyKGNvbnN0IGNoYXIgKnBhdGgsIE91dHB1dEZvcm1hdCBmb3JtYXQpCi0gICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCkgeworICAgIDogbUZvcm1hdChmb3JtYXQpLAorICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKICAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7CiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIocGF0aCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihwYXRoKTsKKyAgICB9CisKKyAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQotCiB9CiAKIE1lZGlhTXV4ZXI6Ok1lZGlhTXV4ZXIoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKKyAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgIG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CiAgICAgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX01QRUdfNCkgewogICAgICAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGZkKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgbVdyaXRlciA9IG5ldyBXZWJtV3JpdGVyKGZkKTsKKyAgICB9CisKKyAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQpAQCAtMTA5LDggKzEyMywxMyBAQAogICAgICAgICBBTE9HRSgic2V0TG9jYXRpb24oKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKS4iKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBpZiAobUZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX01QRUdfNCkgeworICAgICAgICBBTE9HRSgic2V0TG9jYXRpb24oKSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgLm1wNCBvdXRwdXQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICBBTE9HVigiU2V0dGluZyBsb2NhdGlvbjogbGF0aXR1ZGUgPSAlZCwgbG9uZ2l0dWRlID0gJWQiLCBsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKLSAgICByZXR1cm4gbVdyaXRlci0+c2V0R2VvRGF0YShsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TVBFRzRXcml0ZXIqPihtV3JpdGVyLmdldCgpKS0+c2V0R2VvRGF0YShsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFNdXhlcjo6c3RhcnQoKSB7CkBAIC0xNTcsNyArMTc2LDcgQEAKICAgICB9CiAKICAgICBpZiAodHJhY2tJbmRleCA+PSBtVHJhY2tMaXN0LnNpemUoKSkgewotICAgICAgICBBTE9HRSgiV3JpdGVTYW1wbGVEYXRhKCkgZ2V0IGFuIGludmFsaWQgaW5kZXggJWQiLCB0cmFja0luZGV4KTsKKyAgICAgICAgQUxPR0UoIldyaXRlU2FtcGxlRGF0YSgpIGdldCBhbiBpbnZhbGlkIGluZGV4ICV6dSIsIHRyYWNrSW5kZXgpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcAppbmRleCBmZDBlNzljLi41NzY0NzFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCkBAIC0zMiw2ICszMiwxOSBAQAogICAgIG1PcHRpb25zID0gMDsKICAgICBtU2Vla1RpbWVVcyA9IDA7CiAgICAgbUxhdGVuZXNzVXMgPSAwOworICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworfQorCit2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5vbkJsb2NraW5nOwogfQogCiB2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGEuY3BwCmluZGV4IDcyNWY5N2UuLjFhMTFjMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YS5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YSIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0zMjAsNyArMzIxLDcgQEAKICAgICBjb25zdCB2b2lkICpkYXRhID0gc3RvcmFnZSgpOwogICAgIHN3aXRjaChtVHlwZSkgewogICAgICAgICBjYXNlIFRZUEVfTk9ORToKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgibm8gdHlwZSwgc2l6ZSAlZCkiLCBtU2l6ZSk7CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIm5vIHR5cGUsIHNpemUgJXp1KSIsIG1TaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfQ19TVFJJTkc6CiAgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihjaGFyKikgJXMiLCAoY29uc3QgY2hhciAqKWRhdGEpOwpAQCAtMzI5LDcgKzMzMCw3IEBACiAgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihpbnQzMl90KSAlZCIsICooaW50MzJfdCAqKWRhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVFlQRV9JTlQ2NDoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGludDY0X3QpICVsbGQiLCAqKGludDY0X3QgKilkYXRhKTsKKyAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGludDY0X3QpICUiIFBSSWQ2NCwgKihpbnQ2NF90ICopZGF0YSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgogICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoZmxvYXQpICVmIiwgKihmbG9hdCAqKWRhdGEpOwpAQCAtMzQ2LDcgKzM0Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIodW5rbm93biB0eXBlICVkLCBzaXplICVkKSIsIG1UeXBlLCBtU2l6ZSk7CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIih1bmtub3duIHR5cGUgJWQsIHNpemUgJXp1KSIsIG1UeXBlLCBtU2l6ZSk7CiAgICAgICAgICAgICBpZiAobVNpemUgPD0gNDgpIHsgLy8gaWYgaXQncyBsZXNzIHRoYW4gdGhyZWUgbGluZXMgb2YgaGV4IGRhdGEsIGR1bXAgaXQKICAgICAgICAgICAgICAgICBBU3RyaW5nIGZvbzsKICAgICAgICAgICAgICAgICBoZXhkdW1wKGRhdGEsIG1TaXplLCAwLCAmZm9vKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCmluZGV4IDI3MGQ2NGEuLmNiYzFmZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVDYWNoZWRTb3VyY2UyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMTM1LDcgKzEzNyw3IEBACiB9CiAKIHZvaWQgUGFnZUNhY2hlOjpjb3B5KHNpemVfdCBmcm9tLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCJjb3B5IGZyb20gJWQgc2l6ZSAlZCIsIGZyb20sIHNpemUpOworICAgIEFMT0dWKCJjb3B5IGZyb20gJXp1IHNpemUgJXp1IiwgZnJvbSwgc2l6ZSk7CiAKICAgICBpZiAoc2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTE4OSw2ICsxOTEsNyBAQAogICAgICAgbUZpbmFsU3RhdHVzKE9LKSwKICAgICAgIG1MYXN0QWNjZXNzUG9zKDApLAogICAgICAgbUZldGNoaW5nKHRydWUpLAorICAgICAgbURpc2Nvbm5lY3RpbmcoZmFsc2UpLAogICAgICAgbUxhc3RGZXRjaFRpbWVVcygtMSksCiAgICAgICBtTnVtUmV0cmllc0xlZnQoa01heE51bVJldHJpZXMpLAogICAgICAgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKGtEZWZhdWx0SGlnaFdhdGVyVGhyZXNob2xkKSwKQEAgLTIxMyw3ICsyMTYsMTQgQEAKIAogICAgIG1Mb29wZXItPnNldE5hbWUoIk51Q2FjaGVkU291cmNlMiIpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKLSAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgLy8gU2luY2UgaXQgbWF5IG5vdCBiZSBvYnZpb3VzIHdoeSBvdXIgbG9vcGVyIHRocmVhZCBuZWVkcyB0byBiZQorICAgIC8vIGFibGUgdG8gY2FsbCBpbnRvIGphdmEgc2luY2UgaXQgZG9lc24ndCBhcHBlYXIgdG8gZG8gc28gYXQgYWxsLi4uCisgICAgLy8gSU1lZGlhSFRUUENvbm5lY3Rpb24gbWF5IGJlIChhbmQgbW9zdCBsaWtlbHkgaXMpIGltcGxlbWVudGVkIGluIEpBVkEKKyAgICAvLyBhbmQgYSBsb2NhbCBKQVZBIElCaW5kZXIgd2lsbCBjYWxsIGRpcmVjdGx5IGludG8gSk5JIG1ldGhvZHMuCisgICAgLy8gU28gd2hlbmV2ZXIgd2UgY2FsbCBEYXRhU291cmNlOjpyZWFkQXQgaXQgbWF5IGVuZCB1cCBpbiBhIGNhbGwgdG8KKyAgICAvLyBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6cmVhZEF0IGFuZCB0aGVyZWZvcmUgY2FsbCBiYWNrIGludG8gSkFWQS4KKyAgICBtTG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOwogfQogCiBOdUNhY2hlZFNvdXJjZTI6On5OdUNhY2hlZFNvdXJjZTIoKSB7CkBAIC0yNDQsNiArMjU0LDI3IEBACiAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogfQogCit2b2lkIE51Q2FjaGVkU291cmNlMjo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgeworICAgICAgICBBTE9HVigiZGlzY29ubmVjdGluZyBIVFRQQmFzZWRTb3VyY2UiKTsKKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgLy8gc2V0IG1EaXNjb25uZWN0aW5nIHRvIHRydWUsIGlmIGEgZmV0Y2ggcmV0dXJucyBhZnRlcgorICAgICAgICAgICAgLy8gdGhpcywgdGhlIHNvdXJjZSB3aWxsIGJlIG1hcmtlZCBhcyBFT1MuCisgICAgICAgICAgICBtRGlzY29ubmVjdGluZyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2lnbmFsIG1Db25kaXRpb24gc28gdGhhdCB0aGUgcGVuZGluZyByZWFkQXQoKQorICAgICAgICAgICAgLy8gd2lsbCBpbW1lZGlhdGVseSByZXR1cm4KKyAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBleHBsaWNpdGx5IGRpc2Nvbm5lY3QgZnJvbSB0aGUgc291cmNlLCB0byBhbGxvdyBhbnkKKyAgICAgICAgLy8gcGVuZGluZyByZWFkcyB0byByZXR1cm4gbW9yZSBwcm9tcHRseQorICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIH0KK30KKwogc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcykgewogICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CiAgICAgICAgIEhUVFBCYXNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKTsKQEAgLTMwNyw3ICszMzgsMTEgQEAKIAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgZXJyID09IC1FUElQRSkgeworICAgICAgICBpZiAobURpc2Nvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CisgICAgICAgICAgICBtRmluYWxTdGF0dXMgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9VTlNVUFBPUlRFRCB8fCBlcnIgPT0gLUVQSVBFKSB7CiAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBldmVuIGlmIHdlCiAgICAgICAgICAgICAvLyByZXRyeSwgaS5lLiB0aGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCByYW5nZSByZXF1ZXN0cyBvciBzaW1pbGFyLgogICAgICAgICAgICAgbU51bVJldHJpZXNMZWZ0ID0gMDsKQEAgLTMyNyw3ICszNjIsMTQgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpZiAobiA8IDApIHsKKyAgICBpZiAobiA9PSAwIHx8IG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIEFMT0dJKCJFUlJPUl9FTkRfT0ZfU1RSRUFNIik7CisKKyAgICAgICAgbU51bVJldHJpZXNMZWZ0ID0gMDsKKyAgICAgICAgbUZpbmFsU3RhdHVzID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKworICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOworICAgIH0gZWxzZSBpZiAobiA8IDApIHsKICAgICAgICAgbUZpbmFsU3RhdHVzID0gbjsKICAgICAgICAgaWYgKG4gPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgbiA9PSAtRVBJUEUpIHsKICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBlcnJvcnMgdGhhdCBhcmUgbm90IGxpa2VseSB0byBnbyBhd2F5IGV2ZW4gaWYgd2UKQEAgLTMzNSwxNCArMzc3LDcgQEAKICAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HRSgic291cmNlIHJldHVybmVkIGVycm9yICVsZCwgJWQgcmV0cmllcyBsZWZ0IiwgbiwgbU51bVJldHJpZXNMZWZ0KTsKLSAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKLSAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICBBTE9HSSgiRVJST1JfRU5EX09GX1NUUkVBTSIpOwotCi0gICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7Ci0gICAgICAgIG1GaW5hbFN0YXR1cyA9IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0KKyAgICAgICAgQUxPR0UoInNvdXJjZSByZXR1cm5lZCBlcnJvciAlemQsICVkIHJldHJpZXMgbGVmdCIsIG4sIG1OdW1SZXRyaWVzTGVmdCk7CiAgICAgICAgIG1DYWNoZS0+cmVsZWFzZVBhZ2UocGFnZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSykgewpAQCAtNDMwLDYgKzQ2NSwxMCBAQAogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7CiAKQEAgLTQ2NiwxNiArNTA1LDE5IEBACiAgICAgc2l6ZV90IGFjdHVhbEJ5dGVzID0gbUNhY2hlLT5yZWxlYXNlRnJvbVN0YXJ0KG1heEJ5dGVzKTsKICAgICBtQ2FjaGVPZmZzZXQgKz0gYWN0dWFsQnl0ZXM7CiAKLSAgICBBTE9HSSgicmVzdGFydGluZyBwcmVmZXRjaGVyLCB0b3RhbFNpemUgPSAlZCIsIG1DYWNoZS0+dG90YWxTaXplKCkpOworICAgIEFMT0dJKCJyZXN0YXJ0aW5nIHByZWZldGNoZXIsIHRvdGFsU2l6ZSA9ICV6dSIsIG1DYWNoZS0+dG90YWxTaXplKCkpOwogICAgIG1GZXRjaGluZyA9IHRydWU7CiB9CiAKIHNzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9TZXJpYWxpemVyKG1TZXJpYWxpemVyKTsKIAotICAgIEFMT0dWKCJyZWFkQXQgb2Zmc2V0ICVsbGQsIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOworICAgIEFMT0dWKCJyZWFkQXQgb2Zmc2V0ICVsbGQsIHNpemUgJXp1Iiwgb2Zmc2V0LCBzaXplKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KIAogICAgIC8vIElmIHRoZSByZXF1ZXN0IGNhbiBiZSBjb21wbGV0ZWx5IHNhdGlzZmllZCBmcm9tIHRoZSBjYWNoZSwgZG8gc28uCiAKQEAgLTQ5NywxMCArNTM5LDE1IEBACiAgICAgQ0hFQ0sobUFzeW5jUmVzdWx0ID09IE5VTEwpOwogICAgIG1zZy0+cG9zdCgpOwogCi0gICAgd2hpbGUgKG1Bc3luY1Jlc3VsdCA9PSBOVUxMKSB7CisgICAgd2hpbGUgKG1Bc3luY1Jlc3VsdCA9PSBOVUxMICYmICFtRGlzY29ubmVjdGluZykgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgIH0KIAorICAgIGlmIChtRGlzY29ubmVjdGluZykgeworICAgICAgICBtQXN5bmNSZXN1bHQuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCiAgICAgaW50MzJfdCByZXN1bHQ7CiAgICAgQ0hFQ0sobUFzeW5jUmVzdWx0LT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKIApAQCAtNTQxLDcgKzU4OCw3IEBACiBzc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEludGVybmFsKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIENIRUNLX0xFKHNpemUsIChzaXplX3QpbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKTsKIAotICAgIEFMT0dWKCJyZWFkSW50ZXJuYWwgb2Zmc2V0ICVsbGQgc2l6ZSAlZCIsIG9mZnNldCwgc2l6ZSk7CisgICAgQUxPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxsZCBzaXplICV6dSIsIG9mZnNldCwgc2l6ZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC02NTAsNyArNjk3LDcgQEAKICAgICBzc2l6ZV90IGxvd3dhdGVyTWFya0tiLCBoaWdod2F0ZXJNYXJrS2I7CiAgICAgaW50IGtlZXBBbGl2ZVNlY3M7CiAKLSAgICBpZiAoc3NjYW5mKHMsICIlbGQvJWxkLyVkIiwKKyAgICBpZiAoc3NjYW5mKHMsICIlemQvJXpkLyVkIiwKICAgICAgICAgICAgICAgICZsb3d3YXRlck1hcmtLYiwgJmhpZ2h3YXRlck1hcmtLYiwgJmtlZXBBbGl2ZVNlY3MpICE9IDMpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSBjYWNoZSBwYXJhbWV0ZXJzIGZyb20gJyVzJy4iLCBzKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNjgxLDcgKzcyOCw3IEBACiAgICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzID0ga0RlZmF1bHRLZWVwQWxpdmVJbnRlcnZhbFVzOwogICAgIH0KIAotICAgIEFMT0dWKCJsb3d3YXRlciA9ICVkIGJ5dGVzLCBoaWdod2F0ZXIgPSAlZCBieXRlcywga2VlcGFsaXZlID0gJWxsZCB1cyIsCisgICAgQUxPR1YoImxvd3dhdGVyID0gJXp1IGJ5dGVzLCBoaWdod2F0ZXIgPSAlenUgYnl0ZXMsIGtlZXBhbGl2ZSA9ICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgIG1Mb3d3YXRlclRocmVzaG9sZEJ5dGVzLAogICAgICAgICAgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzLAogICAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsVXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA3YmM3ZGEyLi5mMjRjZjNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtNTgsNyArNTgsOSBAQAogfQogCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobUltcGwgIT0gTlVMTCkgewpAQCAtNjYsNyArNjgsNyBAQAogICAgIH0KIAogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHBhdGgsIGhlYWRlcnMpOworICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGh0dHBTZXJ2aWNlLCBwYXRoLCBoZWFkZXJzKTsKIAogICAgIGlmIChkYXRhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CkBAIC0zODcsNyArMzg5LDcgQEAKICAgICAgICAgICAgICAgICBpbmZvLT5tRmluYWxSZXN1bHQgPSBlcnI7CiAKICAgICAgICAgICAgICAgICBpZiAoaW5mby0+bUZpbmFsUmVzdWx0ICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlYWQgb24gdHJhY2sgJWQgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVhZCBvbiB0cmFjayAlenUgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tVHJhY2tJbmRleCwgZXJyKTsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCmluZGV4IDlmOTM1MmQuLmNhMDMxYWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcApAQCAtMTYsNiArMTYsMTEgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVhDbGllbnQiCisKKyNpZmRlZiBfX0xQNjRfXworI2RlZmluZSBPTVhfQU5EUk9JRF9DT01QSUxFX0FTXzMyQklUX09OXzY0QklUX1BMQVRGT1JNUworI2VuZGlmCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTczLDYgKzc4LDEwIEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUdyYXBoaWNCdWZmZXJzKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CiAKQEAgLTE0MSw3ICsxNTAsNyBAQAogICAgIGNvbnN0IHNwPElPTVg+ICZnZXRPTVgobm9kZV9pZCBub2RlKSBjb25zdDsKICAgICBjb25zdCBzcDxJT01YPiAmZ2V0T01YX2wobm9kZV9pZCBub2RlKSBjb25zdDsKIAotICAgIHN0YXRpYyBib29sIElzU29mdHdhcmVDb21wb25lbnQoY29uc3QgY2hhciAqbmFtZSk7CisgICAgc3RhdGljIGJvb2wgQ2FuTGl2ZUxvY2FsbHkoY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNdXhPTVgpOwogfTsKQEAgLTE2NCw4ICsxNzMsMTUgQEAKIH0KIAogLy8gc3RhdGljCi1ib29sIE11eE9NWDo6SXNTb2Z0d2FyZUNvbXBvbmVudChjb25zdCBjaGFyICpuYW1lKSB7Citib29sIE11eE9NWDo6Q2FuTGl2ZUxvY2FsbHkoY29uc3QgY2hhciAqbmFtZSkgeworI2lmZGVmIF9fTFA2NF9fCisgICAgKHZvaWQpbmFtZTsgLy8gZGlzYWJsZSB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmcKKyAgICAvLyA2NCBiaXQgcHJvY2Vzc2VzIGFsd2F5cyBydW4gT01YIHJlbW90ZSBvbiBNZWRpYVNlcnZlcgorICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgLy8gMzIgYml0IHByb2Nlc3NlcyBydW4gb25seSBPTVguZ29vZ2xlLiogY29tcG9uZW50cyBsb2NhbGx5CiAgICAgcmV0dXJuICFzdHJuY2FzZWNtcChuYW1lLCAiT01YLmdvb2dsZS4iLCAxMSk7CisjZW5kaWYKIH0KIAogY29uc3Qgc3A8SU9NWD4gJk11eE9NWDo6Z2V0T01YKG5vZGVfaWQgbm9kZSkgY29uc3QgewpAQCAtMTk3LDcgKzIxMyw3IEBACiAKICAgICBzcDxJT01YPiBvbXg7CiAKLSAgICBpZiAoSXNTb2Z0d2FyZUNvbXBvbmVudChuYW1lKSkgeworICAgIGlmIChDYW5MaXZlTG9jYWxseShuYW1lKSkgewogICAgICAgICBpZiAobUxvY2FsT01YID09IE5VTEwpIHsKICAgICAgICAgICAgIG1Mb2NhbE9NWCA9IG5ldyBPTVg7CiAgICAgICAgIH0KQEAgLTI3OSw2ICsyOTUsMTMgQEAKICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIGVuYWJsZSwgbWF4RnJhbWVXaWR0aCwgbWF4RnJhbWVIZWlnaHQpOwogfQogCitzdGF0dXNfdCBNdXhPTVg6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgIHJldHVybiBnZXRPTVgobm9kZSktPmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGUsIHBvcnRJbmRleCwgZW5hYmxlLCBhdWRpb0h3U3luYywgc2lkZWJhbmRIYW5kbGUpOworfQorCiBzdGF0dXNfdCBNdXhPTVg6OmVuYWJsZUdyYXBoaWNCdWZmZXJzKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7CiAgICAgcmV0dXJuIGdldE9NWChub2RlKS0+ZW5hYmxlR3JhcGhpY0J1ZmZlcnMobm9kZSwgcG9ydF9pbmRleCwgZW5hYmxlKTsKQEAgLTM4Miw3ICs0MDUsNyBAQAogICAgIG1PTVggPSBzZXJ2aWNlLT5nZXRPTVgoKTsKICAgICBDSEVDSyhtT01YLmdldCgpICE9IE5VTEwpOwogCi0gICAgaWYgKCFtT01YLT5saXZlc0xvY2FsbHkoTlVMTCAvKiBub2RlICovLCBnZXRwaWQoKSkpIHsKKyAgICBpZiAoIW1PTVgtPmxpdmVzTG9jYWxseSgwIC8qIG5vZGUgKi8sIGdldHBpZCgpKSkgewogICAgICAgICBBTE9HSSgiVXNpbmcgY2xpZW50LXNpZGUgT01YIG11eC4iKTsKICAgICAgICAgbU9NWCA9IG5ldyBNdXhPTVgobU9NWCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IGUxN2Y0ODIuLjNkYTBiN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTE0LDggKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVhDb2RlYyIKKworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFbmNvZGVyLmgiCkBAIC0yOCw2ICszNSw3IEBACiAjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTk0LDYgKzEwMiw3IEBACiAKICNkZWZpbmUgQ09ERUNfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgQ09ERUNfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09ERUNfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgQ09ERUNfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKIAogc3RydWN0IE9NWENvZGVjT2JzZXJ2ZXIgOiBwdWJsaWMgQm5PTVhPYnNlcnZlciB7CkBAIC0xMjcsNiArMTM2LDcgQEAKIAogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShzaXplb2YoT01YX1BUUikgPT0gNCk7IC8vIGNoZWNrIE9NWF9QVFIgaXMgNCBieXRlcy4KICAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOwogICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CkBAIC0xODgsNyArMTk4LDcgQEAKICAgICAgICAgVmVjdG9yPENvZGVjTmFtZUFuZFF1aXJrcz4gKm1hdGNoaW5nQ29kZWNzKSB7CiAgICAgbWF0Y2hpbmdDb2RlY3MtPmNsZWFyKCk7CiAKLSAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIwNCw3ICsyMTQsOSBAQAogCiAgICAgICAgIGluZGV4ID0gbWF0Y2hJbmRleCArIDE7CiAKLSAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSA9IGxpc3QtPmdldENvZGVjTmFtZShtYXRjaEluZGV4KTsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8obWF0Y2hJbmRleCk7CisgICAgICAgIENIRUNLKGluZm8gIT0gTlVMTCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUgPSBpbmZvLT5nZXRDb2RlY05hbWUoKTsKIAogICAgICAgICAvLyBJZiBhIHNwZWNpZmljIGNvZGVjIGlzIHJlcXVlc3RlZCwgc2tpcCB0aGUgbm9uLW1hdGNoaW5nIG9uZXMuCiAgICAgICAgIGlmIChtYXRjaENvbXBvbmVudE5hbWUgJiYgc3RyY21wKGNvbXBvbmVudE5hbWUsIG1hdGNoQ29tcG9uZW50TmFtZSkpIHsKQEAgLTIyMiw3ICsyMzQsNyBAQAogICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1hdGNoaW5nQ29kZWNzLT5hZGQoKTsKICAgICAgICAgICAgIENvZGVjTmFtZUFuZFF1aXJrcyAqZW50cnkgPSAmbWF0Y2hpbmdDb2RlY3MtPmVkaXRJdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgZW50cnktPm1OYW1lID0gU3RyaW5nOChjb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIGVudHJ5LT5tUXVpcmtzID0gZ2V0Q29tcG9uZW50UXVpcmtzKGxpc3QsIG1hdGNoSW5kZXgpOworICAgICAgICAgICAgZW50cnktPm1RdWlya3MgPSBnZXRDb21wb25lbnRRdWlya3MoaW5mbyk7CiAKICAgICAgICAgICAgIEFMT0dWKCJtYXRjaGluZyAnJXMnIHF1aXJrcyAweCUwOHgiLAogICAgICAgICAgICAgICAgICAgZW50cnktPm1OYW1lLnN0cmluZygpLCBlbnRyeS0+bVF1aXJrcyk7CkBAIC0yMzYsMTggKzI0OCwxNSBAQAogCiAvLyBzdGF0aWMKIHVpbnQzMl90IE9NWENvZGVjOjpnZXRDb21wb25lbnRRdWlya3MoCi0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNMaXN0ICpsaXN0LCBzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvKSB7CiAgICAgdWludDMyX3QgcXVpcmtzID0gMDsKLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikpIHsKKyAgICBpZiAoaW5mby0+aGFzUXVpcmsoInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgIH0KLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgInJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpKSB7CisgICAgaWYgKGluZm8tPmhhc1F1aXJrKCJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSkgewogICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOwogICAgIH0KLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgIm91dHB1dC1idWZmZXJzLWFyZS11bnJlYWRhYmxlIikpIHsKKyAgICBpZiAoaW5mby0+aGFzUXVpcmsoIm91dHB1dC1idWZmZXJzLWFyZS11bnJlYWRhYmxlIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZTsKICAgICB9CiAKQEAgLTI1Niw4ICsyNjUsNyBAQAogCiAvLyBzdGF0aWMKIGJvb2wgT01YQ29kZWM6OmZpbmRDb2RlY1F1aXJrcyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCB1aW50MzJfdCAqcXVpcmtzKSB7Ci0gICAgY29uc3QgTWVkaWFDb2RlY0xpc3QgKmxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKLQorICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI2OCw3ICsyNzYsOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgKnF1aXJrcyA9IGdldENvbXBvbmVudFF1aXJrcyhsaXN0LCBpbmRleCk7CisgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaW5kZXgpOworICAgIENIRUNLKGluZm8gIT0gTlVMTCk7CisgICAgKnF1aXJrcyA9IGdldENvbXBvbmVudFF1aXJrcyhpbmZvKTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMzcyLDYgKzM4Miw1NyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzdGF0dXNfdCBPTVhDb2RlYzo6cGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICB1bnNpZ25lZCAqcHJvZmlsZSwgdW5zaWduZWQgKmxldmVsKSB7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgLy8gdmVyaWZ5IG1pbmltdW0gc2l6ZSBhbmQgY29uZmlndXJhdGlvblZlcnNpb24gPT0gMS4KKyAgICBpZiAoc2l6ZSA8IDcgfHwgcHRyWzBdICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAqcHJvZmlsZSA9IChwdHJbMV0gJiAzMSk7CisgICAgKmxldmVsID0gcHRyWzEyXTsKKworICAgIHB0ciArPSAyMjsKKyAgICBzaXplIC09IDIyOworCisgICAgc2l6ZV90IG51bW9mQXJyYXlzID0gKGNoYXIpcHRyWzBdOworICAgIHB0ciArPSAxOworICAgIHNpemUgLT0gMTsKKyAgICBzaXplX3QgaiA9IDAsIGkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1vZkFycmF5czsgaSsrKSB7CisgICAgICAgIHB0ciArPSAxOworICAgICAgICBzaXplIC09IDE7CisKKyAgICAgICAgLy8gTnVtIG9mIG5hbHMKKyAgICAgICAgc2l6ZV90IG51bW9mTmFscyA9IFUxNl9BVChwdHIpOworICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgIGZvciAoaiA9IDA7aiA8IG51bW9mTmFscztqKyspIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKKworICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKHB0ciwgbGVuZ3RoKTsKKworICAgICAgICAgICAgcHRyICs9IGxlbmd0aDsKKyAgICAgICAgICAgIHNpemUgLT0gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgT01YQ29kZWM6OnBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAogICAgICAgICB1bnNpZ25lZCAqcHJvZmlsZSwgdW5zaWduZWQgKmxldmVsKSB7CkBAIC00ODQsMTEgKzU0NSwzMiBAQAogICAgICAgICAgICAgQ09ERUNfTE9HSSgKICAgICAgICAgICAgICAgICAgICAgIkFWQyBwcm9maWxlID0gJXUgKCVzKSwgbGV2ZWwgPSAldSIsCiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIEFWQ1Byb2ZpbGVUb1N0cmluZyhwcm9maWxlKSwgbGV2ZWwpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZAorCisgICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCBsZXZlbDsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgc2l6ZSwgJnByb2ZpbGUsICZsZXZlbCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBIRVZDIGNvZGVjIHNwZWNpZmljIGRhdGEuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09ERUNfTE9HSSgKKyAgICAgICAgICAgICAgICAgICAgIkhFVkMgcHJvZmlsZSA9ICV1ICwgbGV2ZWwgPSAldSIsCisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIGxldmVsKTsKICAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOwogCiAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKICAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShkYXRhLCBzaXplKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjc5LDcgKzc2MSw3IEBACiAgICAgICAgIC8vIENIRUNLX0VRKGZvcm1hdC5uSW5kZXgsIGluZGV4KTsKIAogI2lmIDEKLSAgICAgICAgQ09ERUNfTE9HVigicG9ydEluZGV4OiAlbGQsIGluZGV4OiAlbGQsIGVDb21wcmVzc2lvbkZvcm1hdD0lZCBlQ29sb3JGb3JtYXQ9JWQiLAorICAgICAgICBDT0RFQ19MT0dWKCJwb3J0SW5kZXg6ICV1LCBpbmRleDogJXUsIGVDb21wcmVzc2lvbkZvcm1hdD0lZCBlQ29sb3JGb3JtYXQ9JWQiLAogICAgICAgICAgICAgIHBvcnRJbmRleCwKICAgICAgICAgICAgICBpbmRleCwgZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgZm9ybWF0LmVDb2xvckZvcm1hdCk7CiAjZW5kaWYKQEAgLTc4MSw3ICs4NjMsNyBAQAogICAgICAgICBwb3J0Rm9ybWF0Lm5JbmRleCA9IGluZGV4OwogCiAgICAgICAgIGlmIChpbmRleCA+PSBrTWF4Q29sb3JGb3JtYXRTdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgIENPREVDX0xPR0UoIk1vcmUgdGhhbiAlbGQgY29sb3IgZm9ybWF0cyBhcmUgc3VwcG9ydGVkPz8/IiwgaW5kZXgpOworICAgICAgICAgICAgQ09ERUNfTE9HRSgiTW9yZSB0aGFuICV1IGNvbG9yIGZvcm1hdHMgYXJlIHN1cHBvcnRlZD8/PyIsIGluZGV4KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtODA2LDYgKzg4OCw4IEBACiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwogICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1pbWUpKSB7CisgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0hFVkM7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkpIHsKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewpAQCAtOTEwLDcgKzk5NCw2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBPTVhfVTMyIHJldCA9IGZyYW1lUmF0ZSAqIGlGcmFtZXNJbnRlcnZhbCAtIDE7Ci0gICAgQ0hFQ0socmV0ID4gMSk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTIwMSw2ICsxMjg0LDggQEAKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ01QRUc0OworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbWltZSkpIHsKKyAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nSEVWQzsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsIG1pbWUpKSB7CkBAIC0xMzg3LDEyICsxNDcyLDE2IEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiLCAiYXVkaW9fZW5jb2Rlci5hYWMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgImF1ZGlvX2VuY29kZXIudm9yYmlzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwgImF1ZGlvX2VuY29kZXIub3B1cyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFtbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiwgImF1ZGlvX2VuY29kZXIuZzcxMWFsYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuYXZjIiwgInZpZGVvX2VuY29kZXIuYXZjIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIiwgInZpZGVvX2VuY29kZXIuaGV2YyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IiwgInZpZGVvX2VuY29kZXIubXBlZzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywKQEAgLTE0NjIsNyArMTU1MSw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+ZnJlZU5vZGUobU5vZGUpOwogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgIG1Ob2RlID0gTlVMTDsKKyAgICBtTm9kZSA9IDA7CiAgICAgc2V0U3RhdGUoREVBRCk7CiAKICAgICBjbGVhckNvZGVjU3BlY2lmaWNEYXRhKCk7CkBAIC0xNjE4LDE1ICsxNzA3LDE1IEBACiAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpIHsKLSAgICAgICAgICAgIGlmICghKG1PTVhMaXZlc0xvY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgZG9lcyBub3QgZmlsbCBpbiB0aGUgYnVmZmVyIHB0ciBhdCB0aGlzIHRpbWUsCi0gICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBkZWZlciBjcmVhdGluZyB0aGUgTWVkaWFCdWZmZXIgdW50aWwgcmVjZWl2aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IEZJTExfQlVGRkVSX0RPTkUgbm90aWZpY2F0aW9uIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoaW5mby5tRGF0YSwgaW5mby5tU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmFpbCBkZWZlcnJlZCBNZWRpYUJ1ZmZlciBjcmVhdGlvbiB1bnRpbCBGSUxMX0JVRkZFUl9ET05FOworICAgICAgICAgICAgLy8gdGhpcyBsZWdhY3kgbW9kZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobU9NWExpdmVzTG9jYWxseQorICAgICAgICAgICAgICAgICAgICAmJiAobVF1aXJrcyAmIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cykKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICAiYWxsb2NhdGVCdWZmZXJzT25Qb3J0IGNhbm5vdCBkZWZlciBidWZmZXIgYWxsb2NhdGlvbiIpOworCisgICAgICAgICAgICBpbmZvLm1NZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihpbmZvLm1EYXRhLCBpbmZvLm1TaXplKTsKKyAgICAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKICAgICAgICAgfQogCiAgICAgICAgIG1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdLnB1c2goaW5mbyk7CkBAIC0xNzk3LDIxICsxODg2LDQyIEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KKyAgICAvLyBGSVhNRTogYXNzdW1lIHRoYXQgc3VyZmFjZSBpcyBjb250cm9sbGVkIGJ5IGFwcCAobmF0aXZlIHdpbmRvdworICAgIC8vIHJldHVybnMgdGhlIG51bWJlciBmb3IgdGhlIGNhc2Ugd2hlbiBzdXJmYWNlIGlzIG5vdCBjb250cm9sbGVkIGJ5IGFwcCkKKyAgICAvLyBGSVhNRTI6IFRoaXMgbWVhbnMgdGhhdCBtaW5VbmRlcWV1ZXVkQnVmcyBjYW4gYmUgMSBsYXJnZXIgdGhhbiByZXBvcnRlZAorICAgIC8vIEZvciBub3csIHRyeSB0byBhbGxvY2F0ZSAxIG1vcmUgYnVmZmVyLCBidXQgZG9uJ3QgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwKIAotICAgIC8vIFhYWDogSXMgdGhpcyB0aGUgcmlnaHQgbG9naWMgdG8gdXNlPyAgSXQncyBub3QgY2xlYXIgdG8gbWUgd2hhdCB0aGUgT01YCi0gICAgLy8gYnVmZmVyIGNvdW50cyByZWZlciB0byAtIGhvdyBkbyB0aGV5IGFjY291bnQgZm9yIHRoZSByZW5kZXJlciBob2xkaW5nIG9uCi0gICAgLy8gdG8gYnVmZmVycz8KLSAgICBpZiAoZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA8IGRlZi5uQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmcykgewotICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0gZGVmLm5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZzOworICAgIC8vIFVzZSBjb25zZXJ2YXRpdmUgYWxsb2NhdGlvbiB3aGlsZSBhbHNvIHRyeWluZyB0byByZWR1Y2Ugc3RhcnZhdGlvbgorICAgIC8vCisgICAgLy8gMS4gYWxsb2NhdGUgYXQgbGVhc3QgbkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgLSB0aGF0IGlzIHRoZQorICAgIC8vICAgIG1pbmltdW0gbmVlZGVkIGZvciB0aGUgY29uc3VtZXIgdG8gYmUgYWJsZSB0byB3b3JrCisgICAgLy8gMi4gdHJ5IHRvIGFsbG9jYXRlIHR3byAoMikgYWRkaXRpb25hbCBidWZmZXJzIHRvIHJlZHVjZSBzdGFydmF0aW9uIGZyb20KKyAgICAvLyAgICB0aGUgY29uc3VtZXIKKyAgICAvLyAgICBwbHVzIGFuIGV4dHJhIGJ1ZmZlciB0byBhY2NvdW50IGZvciBpbmNvcnJlY3QgbWluVW5kZXF1ZXVlZEJ1ZnMKKyAgICBDT0RFQ19MT0dJKCJPTVgtYnVmZmVyczogbWluPSV1IGFjdHVhbD0ldSB1bmRlcT0lZCsxIiwKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4sIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIG1pblVuZGVxdWV1ZWRCdWZzKTsKKworICAgIGZvciAoT01YX1UzMiBleHRyYUJ1ZmZlcnMgPSAyICsgMTsgLyogY29uZGl0aW9uIGluc2lkZSBsb29wICovOyBleHRyYUJ1ZmZlcnMtLSkgeworICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0KKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmcyArIGV4dHJhQnVmZmVyczsKICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IG5ld0J1ZmZlckNvdW50OwogICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQ09ERUNfTE9HRSgic2V0dGluZyBuQnVmZmVyQ291bnRBY3R1YWwgdG8gJWx1IGZhaWxlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICBuZXdCdWZmZXJDb3VudCwgZXJyKTsKKworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtaW5VbmRlcXVldWVkQnVmcyArPSBleHRyYUJ1ZmZlcnM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIENPREVDX0xPR1coInNldHRpbmcgbkJ1ZmZlckNvdW50QWN0dWFsIHRvICV1IGZhaWxlZDogJWQiLAorICAgICAgICAgICAgICAgIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICAvKiBleGl0IGNvbmRpdGlvbiAqLworICAgICAgICBpZiAoZXh0cmFCdWZmZXJzID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CisgICAgQ09ERUNfTE9HSSgiT01YLWJ1ZmZlcnM6IG1pbj0ldSBhY3R1YWw9JXUgdW5kZXE9JWQrMSIsCisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50TWluLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBtaW5VbmRlcXVldWVkQnVmcyk7CiAKICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKQEAgLTE4MjEsNyArMTkzMSw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgQ09ERUNfTE9HVigiYWxsb2NhdGluZyAlbHUgYnVmZmVycyBmcm9tIGEgbmF0aXZlIHdpbmRvdyBvZiBzaXplICVsdSBvbiAiCisgICAgQ09ERUNfTE9HVigiYWxsb2NhdGluZyAldSBidWZmZXJzIGZyb20gYSBuYXRpdmUgd2luZG93IG9mIHNpemUgJXUgb24gIgogICAgICAgICAgICAgIm91dHB1dCBwb3J0IiwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgZGVmLm5CdWZmZXJTaXplKTsKIAogICAgIC8vIERlcXVldWUgYnVmZmVycyBhbmQgc2VuZCB0aGVtIHRvIE9NWApAQCAtMTg1NCw3ICsxOTY0LDcgQEAKIAogICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKS5tQnVmZmVyID0gYnVmZmVySWQ7CiAKLSAgICAgICAgQ09ERUNfTE9HVigicmVnaXN0ZXJlZCBncmFwaGljIGJ1ZmZlciB3aXRoIElEICVwIChwb2ludGVyID0gJXApIiwKKyAgICAgICAgQ09ERUNfTE9HVigicmVnaXN0ZXJlZCBncmFwaGljIGJ1ZmZlciB3aXRoIElEICV1IChwb2ludGVyID0gJXApIiwKICAgICAgICAgICAgICAgICBidWZmZXJJZCwgZ3JhcGhpY0J1ZmZlci5nZXQoKSk7CiAgICAgfQogCkBAIC0xODgxLDcgKzE5OTEsNyBAQAogCiBzdGF0dXNfdCBPTVhDb2RlYzo6Y2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coQnVmZmVySW5mbyAqaW5mbykgewogICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClPV05FRF9CWV9VUyk7Ci0gICAgQ09ERUNfTE9HVigiQ2FsbGluZyBjYW5jZWxCdWZmZXIgb24gYnVmZmVyICVwIiwgaW5mby0+bUJ1ZmZlcik7CisgICAgQ09ERUNfTE9HVigiQ2FsbGluZyBjYW5jZWxCdWZmZXIgb24gYnVmZmVyICV1IiwgaW5mby0+bUJ1ZmZlcik7CiAgICAgaW50IGVyciA9IG1OYXRpdmVXaW5kb3ctPmNhbmNlbEJ1ZmZlcigKICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgaW5mby0+bU1lZGlhQnVmZmVyLT5ncmFwaGljQnVmZmVyKCkuZ2V0KCksIC0xKTsKICAgICBpZiAoZXJyICE9IDApIHsKQEAgLTIxMTksNyArMjIyOSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXIgPSBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXI7CiAKLSAgICAgICAgICAgIENPREVDX0xPR1YoIkVNUFRZX0JVRkZFUl9ET05FKGJ1ZmZlcjogJXApIiwgYnVmZmVyKTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIkVNUFRZX0JVRkZFUl9ET05FKGJ1ZmZlcjogJXUpIiwgYnVmZmVyKTsKIAogICAgICAgICAgICAgVmVjdG9yPEJ1ZmZlckluZm8+ICpidWZmZXJzID0gJm1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdOwogICAgICAgICAgICAgc2l6ZV90IGkgPSAwOwpAQCAtMjEyOSw3ICsyMjM5LDcgQEAKIAogICAgICAgICAgICAgQ0hFQ0soaSA8IGJ1ZmZlcnMtPnNpemUoKSk7CiAgICAgICAgICAgICBpZiAoKCpidWZmZXJzKVtpXS5tU3RhdHVzICE9IE9XTkVEX0JZX0NPTVBPTkVOVCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJXZSBhbHJlYWR5IG93biBpbnB1dCBidWZmZXIgJXAsIHlldCByZWNlaXZlZCAiCisgICAgICAgICAgICAgICAgQUxPR1coIldlIGFscmVhZHkgb3duIGlucHV0IGJ1ZmZlciAldSwgeWV0IHJlY2VpdmVkICIKICAgICAgICAgICAgICAgICAgICAgICJhbiBFTVBUWV9CVUZGRVJfRE9ORS4iLCBidWZmZXIpOwogICAgICAgICAgICAgfQogCkBAIC0yMTQzLDcgKzIyNTMsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVBvcnRTdGF0dXNba1BvcnRJbmRleElucHV0XSA9PSBESVNBQkxJTkcpIHsKLSAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJQb3J0IGlzIGRpc2FibGVkLCBmcmVlaW5nIGJ1ZmZlciAlcCIsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgQ09ERUNfTE9HVigiUG9ydCBpcyBkaXNhYmxlZCwgZnJlZWluZyBidWZmZXIgJXUiLCBidWZmZXIpOwogCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZnJlZUJ1ZmZlcihrUG9ydEluZGV4SW5wdXQsIGkpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKQEAgLTIxNjUsNyArMjI3NSw3IEBACiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVyID0gbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyOwogICAgICAgICAgICAgT01YX1UzMiBmbGFncyA9IG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzOwogCi0gICAgICAgICAgICBDT0RFQ19MT0dWKCJGSUxMX0JVRkZFUl9ET05FKGJ1ZmZlcjogJXAsIHNpemU6ICVsZCwgZmxhZ3M6IDB4JTA4bHgsIHRpbWVzdGFtcDogJWxsZCB1cyAoJS4yZiBzZWNzKSkiLAorICAgICAgICAgICAgQ09ERUNfTE9HVigiRklMTF9CVUZGRVJfRE9ORShidWZmZXI6ICV1LCBzaXplOiAldSwgZmxhZ3M6IDB4JTA4eCwgdGltZXN0YW1wOiAlbGxkIHVzICglLjJmIHNlY3MpKSIsCiAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2VfbGVuZ3RoLAogICAgICAgICAgICAgICAgICBmbGFncywKQEAgLTIxODIsMTQgKzIyOTIsMTQgQEAKICAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmYnVmZmVycy0+ZWRpdEl0ZW1BdChpKTsKIAogICAgICAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgIT0gT1dORURfQllfQ09NUE9ORU5UKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIldlIGFscmVhZHkgb3duIG91dHB1dCBidWZmZXIgJXAsIHlldCByZWNlaXZlZCAiCisgICAgICAgICAgICAgICAgQUxPR1coIldlIGFscmVhZHkgb3duIG91dHB1dCBidWZmZXIgJXUsIHlldCByZWNlaXZlZCAiCiAgICAgICAgICAgICAgICAgICAgICAiYSBGSUxMX0JVRkZFUl9ET05FLiIsIGJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBPV05FRF9CWV9VUzsKIAogICAgICAgICAgICAgaWYgKG1Qb3J0U3RhdHVzW2tQb3J0SW5kZXhPdXRwdXRdID09IERJU0FCTElORykgewotICAgICAgICAgICAgICAgIENPREVDX0xPR1YoIlBvcnQgaXMgZGlzYWJsZWQsIGZyZWVpbmcgYnVmZmVyICVwIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJQb3J0IGlzIGRpc2FibGVkLCBmcmVlaW5nIGJ1ZmZlciAldSIsIGJ1ZmZlcik7CiAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmVlQnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQsIGkpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKQEAgLTIyMDQsMjIgKzIzMTQsNiBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChtUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSAhPSBTSFVUVElOR19ET1dOKSB7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSwgKGludClFTkFCTEVEKTsKIAotICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tTWVkaWFCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtT01YTGl2ZXNMb2NhbGx5KTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVF1aXJrcyAmIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cyk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHFjb20gdmlkZW8gZGVjb2RlcnMgb24gTmV4dXMgZG9uJ3QgYWN0dWFsbHkgYWxsb2NhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciBtZW1vcnkgb24gYSBjYWxsIHRvIE9NWF9BbGxvY2F0ZUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgInBCdWZmZXIiIG1lbWJlciBvZiB0aGUgT01YX0JVRkZFUkhFQURFUlRZUEUKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlIGlzIG9ubHkgZmlsbGVkIGluIGxhdGVyLgotCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1NZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5kYXRhX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1NZWRpYUJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IGluZm8tPm1NZWRpYUJ1ZmZlcjsKICAgICAgICAgICAgICAgICBib29sIGlzR3JhcGhpY0J1ZmZlciA9IGJ1ZmZlci0+Z3JhcGhpY0J1ZmZlcigpICE9IE5VTEw7CiAKQEAgLTIyNTQsMTEgKzIzNDgsNyBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNVbnJlYWRhYmxlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRQb2ludGVyKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVBsYXRmb3JtUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnBsYXRmb3JtX3ByaXZhdGUpOwotCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0UG9pbnRlcigKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlCdWZmZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcik7CiAKQEAgLTI0MDAsNyArMjQ5MCw3IEBACiAKICAgICAgICAgY2FzZSBPTVhfRXZlbnRFcnJvcjoKICAgICAgICAgewotICAgICAgICAgICAgQ09ERUNfTE9HRSgiRVJST1IoMHglMDhseCwgJWxkKSIsIGRhdGExLCBkYXRhMik7CisgICAgICAgICAgICBDT0RFQ19MT0dFKCJPTVhfRXZlbnRFcnJvcigweCUwOHgsICV1KSIsIGRhdGExLCBkYXRhMik7CiAKICAgICAgICAgICAgIHNldFN0YXRlKEVSUk9SKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjQwOCwxNiArMjQ5OCwxMCBAQAogCiAgICAgICAgIGNhc2UgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZDoKICAgICAgICAgewotICAgICAgICAgICAgQ09ERUNfTE9HVigiT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZChwb3J0PSVsZCwgZGF0YTI9MHglMDhseCkiLAorICAgICAgICAgICAgQ09ERUNfTE9HVigiT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZChwb3J0PSV1LCBkYXRhMj0weCUwOHgpIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTEsIGRhdGEyKTsKIAogICAgICAgICAgICAgaWYgKGRhdGEyID09IDAgfHwgZGF0YTIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgd2hldGhlciBtRmlsbGVkQnVmZmVycyBpcyBlbXB0eSBvciBub3QKLSAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkIGlzIG5vdCBtZWFudCBmb3IgcmVhbGxvY2F0aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhlIG91dHB1dCBidWZmZXJzLgotICAgICAgICAgICAgICAgIGlmIChkYXRhMSA9PSBrUG9ydEluZGV4T3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1GaWxsZWRCdWZmZXJzLmVtcHR5KCkpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBvblBvcnRTZXR0aW5nc0NoYW5nZWQoZGF0YTEpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhMSA9PSBrUG9ydEluZGV4T3V0cHV0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YTIgPT0gT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCB8fApAQCAtMjQ0OCw3ICsyNTMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzY2FsZSBpcyBpbiAxNi4xNiBmb3JtYXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSAxLjAgPSAweDAxMDAwMC4gV2hlbiB0aGVyZSBpcyBubwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjaGFuZ2UgdGhlIGRpc3BsYXksIHNraXAgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiR2V0IE9NWF9JbmRleENvbmZpZ1NjYWxlOiAweCVseC8weCVseCIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiR2V0IE9NWF9JbmRleENvbmZpZ1NjYWxlOiAweCV4LzB4JXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZS54V2lkdGgsIHNjYWxlLnhIZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGUueFdpZHRoICE9IDB4MDEwMDAwKSB7CkBAIC0yNDgyLDcgKzI1NjYsNyBAQAogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENPREVDX0xPR1YoIkVWRU5UKCVkLCAlbGQsICVsZCkiLCBldmVudCwgZGF0YTEsIGRhdGEyKTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIkVWRU5UKCVkLCAldSwgJXUpIiwgZXZlbnQsIGRhdGExLCBkYXRhMik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTI0OTksNyArMjU4Myw3IEBACiAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RGlzYWJsZToKICAgICAgICAgewogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXggPSBkYXRhOwotICAgICAgICAgICAgQ09ERUNfTE9HVigiUE9SVF9ESVNBQkxFRCglbGQpIiwgcG9ydEluZGV4KTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIlBPUlRfRElTQUJMRUQoJXUpIiwgcG9ydEluZGV4KTsKIAogICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IEVYRUNVVElORyB8fCBtU3RhdGUgPT0gUkVDT05GSUdVUklORyk7CiAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1Qb3J0U3RhdHVzW3BvcnRJbmRleF0sIChpbnQpRElTQUJMSU5HKTsKQEAgLTI1MjMsNyArMjYwNyw3IEBACiAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBlbmFibGVQb3J0QXN5bmMocG9ydEluZGV4KTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIENPREVDX0xPR0UoImVuYWJsZVBvcnRBc3luYyglbGQpIGZhaWxlZCAoZXJyID0gJWQpIiwgcG9ydEluZGV4LCBlcnIpOworICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dFKCJlbmFibGVQb3J0QXN5bmMoJXUpIGZhaWxlZCAoZXJyID0gJWQpIiwgcG9ydEluZGV4LCBlcnIpOwogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShFUlJPUik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWxsb2NhdGVCdWZmZXJzT25Qb3J0KHBvcnRJbmRleCk7CkBAIC0yNTQ0LDcgKzI2MjgsNyBAQAogICAgICAgICBjYXNlIE9NWF9Db21tYW5kUG9ydEVuYWJsZToKICAgICAgICAgewogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXggPSBkYXRhOwotICAgICAgICAgICAgQ09ERUNfTE9HVigiUE9SVF9FTkFCTEVEKCVsZCkiLCBwb3J0SW5kZXgpOworICAgICAgICAgICAgQ09ERUNfTE9HVigiUE9SVF9FTkFCTEVEKCV1KSIsIHBvcnRJbmRleCk7CiAKICAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBFWEVDVVRJTkcgfHwgbVN0YXRlID09IFJFQ09ORklHVVJJTkcpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1twb3J0SW5kZXhdLCAoaW50KUVOQUJMSU5HKTsKQEAgLTI1NjUsNyArMjY0OSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4ID0gZGF0YTsKIAotICAgICAgICAgICAgQ09ERUNfTE9HVigiRkxVU0hfRE9ORSglbGQpIiwgcG9ydEluZGV4KTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIkZMVVNIX0RPTkUoJXUpIiwgcG9ydEluZGV4KTsKIAogICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1twb3J0SW5kZXhdLCAoaW50KVNIVVRUSU5HX0RPV04pOwogICAgICAgICAgICAgbVBvcnRTdGF0dXNbcG9ydEluZGV4XSA9IEVOQUJMRUQ7CkBAIC0yODExLDcgKzI4OTUsNyBAQAogdm9pZCBPTVhDb2RlYzo6b25Qb3J0U2V0dGluZ3NDaGFuZ2VkKE9NWF9VMzIgcG9ydEluZGV4KSB7CiAgICAgQ09ERUNfTE9HVigiUE9SVF9TRVRUSU5HU19DSEFOR0VEKCVsZCkiLCBwb3J0SW5kZXgpOwogCi0gICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRVhFQ1VUSU5HKTsKKyAgICBDSEVDSyhtU3RhdGUgPT0gRVhFQ1VUSU5HIHx8IG1TdGF0ZSA9PSBFWEVDVVRJTkdfVE9fSURMRSk7CiAgICAgQ0hFQ0tfRVEocG9ydEluZGV4LCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKICAgICBDSEVDSyghbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRQZW5kaW5nKTsKIApAQCAtMjk5Myw3ICszMDc3LDggQEAKIAogICAgICAgICBzaXplX3Qgc2l6ZSA9IHNwZWNpZmljLT5tU2l6ZTsKIAotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtTUlNRSkKKyAgICAgICAgaWYgKCghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1NSU1FKSB8fAorICAgICAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1NSU1FKSkKICAgICAgICAgICAgICAgICAmJiAhKG1RdWlya3MgJiBrV2FudHNOQUxGcmFnbWVudHMpKSB7CiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrTkFMU3RhcnRDb2RlWzRdID0KICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAxIH07CkBAIC0zODgzLDcgKzM5NjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBDT0RFQ19MT0dWKCJzZWVraW5nIHRvICVsbGQgdXMgKCUuMmYgc2VjcykiLCBzZWVrVGltZVVzLCBzZWVrVGltZVVzIC8gMUU2KTsKKyAgICAgICAgQ09ERUNfTE9HVigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsIHNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYpOwogCiAgICAgICAgIG1TaWduYWxsZWRFT1MgPSBmYWxzZTsKIApAQCAtNDEyOCw2ICs0MjEzLDcgQEAKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdNUDMiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ1NCQyIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nVk9SQklTIiwKKyAgICAgICAgIk9NWF9BVURJT19Db2RpbmdPUFVTIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdXTUEiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ1JBIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdNSURJIiwKQEAgLTQyMjIsOSArNDMwOCw5IEBACiAgICAgQ0hFQ0soKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgJiYgZGVmLmVEaXIgPT0gT01YX0RpcklucHV0KQogICAgICAgICAgIHx8IChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCAmJiBkZWYuZURpciA9PSBPTVhfRGlyT3V0cHV0KSk7CiAKLSAgICBwcmludGYoIiAgbkJ1ZmZlckNvdW50QWN0dWFsID0gJWxkXG4iLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICBwcmludGYoIiAgbkJ1ZmZlckNvdW50TWluID0gJWxkXG4iLCBkZWYubkJ1ZmZlckNvdW50TWluKTsKLSAgICBwcmludGYoIiAgbkJ1ZmZlclNpemUgPSAlbGRcbiIsIGRlZi5uQnVmZmVyU2l6ZSk7CisgICAgcHJpbnRmKCIgIG5CdWZmZXJDb3VudEFjdHVhbCA9ICUiIFBSSXUzMiAiXG4iLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKyAgICBwcmludGYoIiAgbkJ1ZmZlckNvdW50TWluID0gJSIgUFJJdTMyICJcbiIsIGRlZi5uQnVmZmVyQ291bnRNaW4pOworICAgIHByaW50ZigiICBuQnVmZmVyU2l6ZSA9ICUiIFBSSXUzMiAiXG4iLCBkZWYubkJ1ZmZlclNpemUpOwogCiAgICAgc3dpdGNoIChkZWYuZURvbWFpbikgewogICAgICAgICBjYXNlIE9NWF9Qb3J0RG9tYWluSW1hZ2U6CkBAIC00MjMzLDkgKzQzMTksOSBAQAogCiAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgICBwcmludGYoIiAgLy8gSW1hZ2VcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZVdpZHRoID0gJWxkXG4iLCBpbWFnZURlZi0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZUhlaWdodCA9ICVsZFxuIiwgaW1hZ2VEZWYtPm5GcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICBwcmludGYoIiAgblN0cmlkZSA9ICVsZFxuIiwgaW1hZ2VEZWYtPm5TdHJpZGUpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZVdpZHRoID0gJSIgUFJJdTMyICJcbiIsIGltYWdlRGVmLT5uRnJhbWVXaWR0aCk7CisgICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lSGVpZ2h0ID0gJSIgUFJJdTMyICJcbiIsIGltYWdlRGVmLT5uRnJhbWVIZWlnaHQpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5TdHJpZGUgPSAlIiBQUkl1MzIgIlxuIiwgaW1hZ2VEZWYtPm5TdHJpZGUpOwogCiAgICAgICAgICAgICBwcmludGYoIiAgZUNvbXByZXNzaW9uRm9ybWF0ID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb21wcmVzc2lvbkZvcm1hdFN0cmluZyhpbWFnZURlZi0+ZUNvbXByZXNzaW9uRm9ybWF0KSk7CkBAIC00MjUyLDkgKzQzMzgsOSBAQAogCiAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgICBwcmludGYoIiAgLy8gVmlkZW9cbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZVdpZHRoID0gJWxkXG4iLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZUhlaWdodCA9ICVsZFxuIiwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICBwcmludGYoIiAgblN0cmlkZSA9ICVsZFxuIiwgdmlkZW9EZWYtPm5TdHJpZGUpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZVdpZHRoID0gJSIgUFJJdTMyICJcbiIsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7CisgICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lSGVpZ2h0ID0gJSIgUFJJdTMyICJcbiIsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5TdHJpZGUgPSAlIiBQUkl1MzIgIlxuIiwgdmlkZW9EZWYtPm5TdHJpZGUpOwogCiAgICAgICAgICAgICBwcmludGYoIiAgZUNvbXByZXNzaW9uRm9ybWF0ID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlkZW9Db21wcmVzc2lvbkZvcm1hdFN0cmluZyh2aWRlb0RlZi0+ZUNvbXByZXNzaW9uRm9ybWF0KSk7CkBAIC00MjgzLDEwICs0MzY5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgICAgICAgICAgICAgIHByaW50ZigiICBuU2FtcGxpbmdSYXRlID0gJWxkXG4iLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5DaGFubmVscyA9ICVsZFxuIiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5TYW1wbGluZ1JhdGUgPSAlIiBQUkl1MzIgIlxuIiwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIHByaW50ZigiICBuQ2hhbm5lbHMgPSAlIiBQUkl1MzIgIlxuIiwgcGFyYW1zLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIGJJbnRlcmxlYXZlZCA9ICVkXG4iLCBwYXJhbXMuYkludGVybGVhdmVkKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgbkJpdFBlclNhbXBsZSA9ICVsZFxuIiwgcGFyYW1zLm5CaXRQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIHByaW50ZigiICBuQml0UGVyU2FtcGxlID0gJSIgUFJJdTMyICJcbiIsIHBhcmFtcy5uQml0UGVyU2FtcGxlKTsKIAogICAgICAgICAgICAgICAgIHByaW50ZigiICBlTnVtRGF0YSA9ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFTaWduZWQKQEAgLTQzMDIsNyArNDM4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FtciwgJmFtciwgc2l6ZW9mKGFtcikpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgICAgICAgICAgICAgIHByaW50ZigiICBuQ2hhbm5lbHMgPSAlbGRcbiIsIGFtci5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHByaW50ZigiICBuQ2hhbm5lbHMgPSAlIiBQUkl1MzIgIlxuIiwgYW1yLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIGVBTVJCYW5kTW9kZSA9ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgYW1yQmFuZE1vZGVTdHJpbmcoYW1yLmVBTVJCYW5kTW9kZSkpOwogICAgICAgICAgICAgICAgIHByaW50ZigiICBlQU1SRnJhbWVGb3JtYXQgPSAlc1xuIiwKQEAgLTQ2NTcsNiArNDc0Myw4IEBACiAgICAgfQogCiAgICAgLy8gQ29sb3IgZm9ybWF0IHF1ZXJ5CisgICAgLy8gcmV0dXJuIGNvbG9ycyBpbiB0aGUgb3JkZXIgcmVwb3J0ZWQgYnkgdGhlIE9NWCBjb21wb25lbnQKKyAgICAvLyBwcmVmaXggImZsZXhpYmxlIiBzdGFuZGFyZCBvbmVzIHdpdGggdGhlIGZsZXhpYmxlIGVxdWl2YWxlbnQKICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgcG9ydEZvcm1hdDsKICAgICBJbml0T01YUGFyYW1zKCZwb3J0Rm9ybWF0KTsKICAgICBwb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSAhaXNFbmNvZGVyID8gMSA6IDA7CkBAIC00NjY3LDYgKzQ3NTUsMjEgQEAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBPTVhfVTMyIGZsZXhpYmxlRXF1aXZhbGVudDsKKyAgICAgICAgaWYgKEFDb2RlYzo6aXNGbGV4aWJsZUNvbG9yRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBvbXgsIG5vZGUsIHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0LCAmZmxleGlibGVFcXVpdmFsZW50KSkgeworICAgICAgICAgICAgYm9vbCBtYXJrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy0+bUNvbG9yRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjYXBzLT5tQ29sb3JGb3JtYXRzLml0ZW1BdChpKSA9PSBmbGV4aWJsZUVxdWl2YWxlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFya2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtYXJrZWQpIHsKKyAgICAgICAgICAgICAgICBjYXBzLT5tQ29sb3JGb3JtYXRzLnB1c2goZmxleGlibGVFcXVpdmFsZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBjYXBzLT5tQ29sb3JGb3JtYXRzLnB1c2gocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggZGE5NDU4Ny4uOTAwZTJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICByZXR1cm4gbUV4dHJhY3Rvci0+bUltcGwtPmdldEZvcm1hdCgpOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBpZiAobVN0YXJ0ZWQpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTMyMiwyNSArMzIyLDI5IEBACiAgICAgfQogCiAgICAgc2l6ZV90IGxlZnQgPSAwOwotICAgIHNpemVfdCByaWdodCA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKLSAgICAgICAgc2l6ZV90IGNlbnRlciA9IGxlZnQgLyAyICsgcmlnaHQgLyAyICsgKGxlZnQgJiByaWdodCAmIDEpOworICAgIHNpemVfdCByaWdodF9wbHVzX29uZSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKKyAgICAgICAgc2l6ZV90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7CiAKICAgICAgICAgY29uc3QgVE9DRW50cnkgJmVudHJ5ID0gbVRhYmxlT2ZDb250ZW50cy5pdGVtQXQoY2VudGVyKTsKIAogICAgICAgICBpZiAodGltZVVzIDwgZW50cnkubVRpbWVVcykgewotICAgICAgICAgICAgcmlnaHQgPSBjZW50ZXI7CisgICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKICAgICAgICAgfSBlbHNlIGlmICh0aW1lVXMgPiBlbnRyeS5tVGltZVVzKSB7CiAgICAgICAgICAgICBsZWZ0ID0gY2VudGVyICsgMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlZnQgPSByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgICAgIGxlZnQgPSBjZW50ZXI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChsZWZ0ID09IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpKSB7CisgICAgICAgIC0tbGVmdDsKKyAgICB9CisKICAgICBjb25zdCBUT0NFbnRyeSAmZW50cnkgPSBtVGFibGVPZkNvbnRlbnRzLml0ZW1BdChsZWZ0KTsKIAotICAgIEFMT0dWKCJzZWVraW5nIHRvIGVudHJ5ICVkIC8gJWQgYXQgb2Zmc2V0ICVsbGQiLAorICAgIEFMT0dWKCJzZWVraW5nIHRvIGVudHJ5ICV6dSAvICV6dSBhdCBvZmZzZXQgJWxsZCIsCiAgICAgICAgICBsZWZ0LCBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSwgZW50cnkubVBhZ2VPZmZzZXQpOwogCiAgICAgcmV0dXJuIHNlZWtUb09mZnNldChlbnRyeS5tUGFnZU9mZnNldCk7CkBAIC0zODMsNyArMzg3LDcgQEAKICAgICBzc2l6ZV90IG47CiAgICAgaWYgKChuID0gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCiAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDE2bGx4LCBnb3QgJWxkIGJ5dGVzIiwKKyAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCBvZmZzZXQgMHglMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgb2Zmc2V0LCBuKTsKIAogICAgICAgICBpZiAobiA8IDApIHsKQEAgLTUwNyw3ICs1MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplKTsKIAogICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClwYWNrZXRTaXplKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIGF0IDB4JTAxNmxseCwgZ290ICVsZCBieXRlcyIsCisgICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCAweCUwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgZGF0YU9mZnNldCwgbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQpAQCAtNTQ4LDcgKzU1Miw3IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICVsZCIsIG4pOworICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICV6ZCIsIG4pOwogCiAgICAgICAgICAgICByZXR1cm4gbiA8IDAgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KQEAgLTU5Miw3ICs1OTYsNyBAQAogICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICVkXG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDEpOwogICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgIHBhY2tldCA9IE5VTEw7CkBAIC02MDMsNyArNjA3LDcgQEAKICAgICBpZiAoKGVyciA9IHJlYWROZXh0UGFja2V0KCZwYWNrZXQpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CisgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAzKTsKICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICBwYWNrZXQgPSBOVUxMOwpAQCAtNjE0LDcgKzYxOCw3IEBACiAgICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0KSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJWRcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgNSk7CiAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgcGFja2V0ID0gTlVMTDsKQEAgLTg5NSw3ICs4OTksNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlZCB0cmFpbGluZyBieXRlcyIsCisgICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAogICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7CiAKICAgICBmaWxlTWV0YS0+c2V0RGF0YSgKQEAgLTkzNiw3ICs5NDAsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gMSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAKaW5kZXggZWFlNzIxYi4uMjc0ODM0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcApAQCAtMTMzLDcgKzEzMyw4IEBACiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gZmluZFNhbXBsZVRpbWUoc2FtcGxlSW5kZXgsICZtQ3VycmVudFNhbXBsZVRpbWUpKSAhPSBPSykgeworICAgIGlmICgoZXJyID0gZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKKyAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmbUN1cnJlbnRTYW1wbGVUaW1lLCAmbUN1cnJlbnRTYW1wbGVEdXJhdGlvbikpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJmaW5kU2FtcGxlVGltZSByZXR1cm4gZXJyb3IiKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0yODUsOCArMjg2LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpmaW5kU2FtcGxlVGltZSgKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lKSB7CitzdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pIHsKICAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0zMDksNiArMzEwLDggQEAKIAogICAgICp0aW1lICs9IG1UYWJsZS0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKIAorICAgICpkdXJhdGlvbiA9IG1UVFNEdXJhdGlvbjsKKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCmluZGV4IDExNmYzNTguLmQ3MjUxZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKQEAgLTU0NSw3ICs1NDUsOCBAQAogfQogCiBzdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFNhbXBsZUF0VGltZSgKLSAgICAgICAgdWludDMyX3QgcmVxX3RpbWUsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgICAgIHVpbnQ2NF90IHJlcV90aW1lLCB1aW50NjRfdCBzY2FsZV9udW0sIHVpbnQ2NF90IHNjYWxlX2RlbiwKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBidWlsZFNhbXBsZUVudHJpZXNUYWJsZSgpOwogCiAgICAgaWYgKG1TYW1wbGVUaW1lRW50cmllcyA9PSBOVUxMKSB7CkBAIC01NTMsNzkgKzU1NCw2NyBAQAogICAgIH0KIAogICAgIHVpbnQzMl90IGxlZnQgPSAwOwotICAgIHVpbnQzMl90IHJpZ2h0ID0gbU51bVNhbXBsZVNpemVzOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKLSAgICAgICAgdWludDMyX3QgY2VudGVyID0gKGxlZnQgKyByaWdodCkgLyAyOwotICAgICAgICB1aW50MzJfdCBjZW50ZXJUaW1lID0gbVNhbXBsZVRpbWVFbnRyaWVzW2NlbnRlcl0ubUNvbXBvc2l0aW9uVGltZTsKKyAgICB1aW50MzJfdCByaWdodF9wbHVzX29uZSA9IG1OdW1TYW1wbGVTaXplczsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0X3BsdXNfb25lKSB7CisgICAgICAgIHVpbnQzMl90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7CisgICAgICAgIHVpbnQ2NF90IGNlbnRlclRpbWUgPQorICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShjZW50ZXIsIHNjYWxlX251bSwgc2NhbGVfZGVuKTsKIAogICAgICAgICBpZiAocmVxX3RpbWUgPCBjZW50ZXJUaW1lKSB7Ci0gICAgICAgICAgICByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwogICAgICAgICB9IGVsc2UgaWYgKHJlcV90aW1lID4gY2VudGVyVGltZSkgewogICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZWZ0ID0gY2VudGVyOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqc2FtcGxlX2luZGV4ID0gbVNhbXBsZVRpbWVFbnRyaWVzW2NlbnRlcl0ubVNhbXBsZUluZGV4OworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGxlZnQgPT0gbU51bVNhbXBsZVNpemVzKSB7Ci0gICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0KLSAgICAgICAgLS1sZWZ0OwotICAgIH0KLQogICAgIHVpbnQzMl90IGNsb3Nlc3RJbmRleCA9IGxlZnQ7CiAKKyAgICBpZiAoY2xvc2VzdEluZGV4ID09IG1OdW1TYW1wbGVTaXplcykgeworICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IGtGbGFnQmVmb3JlOworICAgIH0gZWxzZSBpZiAoY2xvc2VzdEluZGV4ID09IDApIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQmVmb3JlKSB7CisgICAgICAgICAgICAvLyBub3JtYWxseSB3ZSBzaG91bGQgcmV0dXJuIG91dCBvZiByYW5nZSwgYnV0IHRoYXQgaXMKKyAgICAgICAgICAgIC8vIHRyZWF0ZWQgYXMgZW5kLW9mLXN0cmVhbS4gIGluc3RlYWQgcmV0dXJuIGZpcnN0IHNhbXBsZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0FmdGVyOworICAgIH0KKwogICAgIHN3aXRjaCAoZmxhZ3MpIHsKICAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKICAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKGNsb3Nlc3RJbmRleCA+IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubUNvbXBvc2l0aW9uVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gcmVxX3RpbWUpIHsKLSAgICAgICAgICAgICAgICAtLWNsb3Nlc3RJbmRleDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0tY2xvc2VzdEluZGV4OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIGtGbGFnQWZ0ZXI6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChjbG9zZXN0SW5kZXggKyAxIDwgbU51bVNhbXBsZVNpemVzCi0gICAgICAgICAgICAgICAgICAgICYmIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1Db21wb3NpdGlvblRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IHJlcV90aW1lKSB7Ci0gICAgICAgICAgICAgICAgKytjbG9zZXN0SW5kZXg7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLKGZsYWdzID09IGtGbGFnQ2xvc2VzdCk7Ci0KLSAgICAgICAgICAgIGlmIChjbG9zZXN0SW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgbGVmdCBuZWlnaGJvdXIgYW5kIHBpY2sgY2xvc2VzdC4KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBhYnNkaWZmMSA9Ci0gICAgICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1Db21wb3NpdGlvblRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RpbWUpOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgYWJzZGlmZjIgPQotICAgICAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4IC0gMV0ubUNvbXBvc2l0aW9uVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdGltZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWJzZGlmZjEgPiBhYnNkaWZmMikgewotICAgICAgICAgICAgICAgICAgICBjbG9zZXN0SW5kZXggPSBjbG9zZXN0SW5kZXggLSAxOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBpY2sgY2xvc2VzdCBiYXNlZCBvbiB0aW1lc3RhbXAuIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5CisgICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZVRpbWUoY2xvc2VzdEluZGV4LCBzY2FsZV9udW0sIHNjYWxlX2RlbiksIHJlcV90aW1lKSA+CisgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgIHJlcV90aW1lLCBnZXRTYW1wbGVUaW1lKGNsb3Nlc3RJbmRleCAtIDEsIHNjYWxlX251bSwgc2NhbGVfZGVuKSkpIHsKKyAgICAgICAgICAgICAgICAtLWNsb3Nlc3RJbmRleDsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAqc2FtcGxlX2luZGV4ID0gbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubVNhbXBsZUluZGV4OwotCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC02NDcsMTA5ICs2MzYsODUgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBsZWZ0ID0gMDsKLSAgICB1aW50MzJfdCByaWdodCA9IG1OdW1TeW5jU2FtcGxlczsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0gICAgICAgIHVpbnQzMl90IGNlbnRlciA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0KSAvIDI7CisgICAgdWludDMyX3QgcmlnaHRfcGx1c19vbmUgPSBtTnVtU3luY1NhbXBsZXM7CisgICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgeworICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0X3BsdXNfb25lIC0gbGVmdCkgLyAyOwogICAgICAgICB1aW50MzJfdCB4ID0gbVN5bmNTYW1wbGVzW2NlbnRlcl07CiAKICAgICAgICAgaWYgKHN0YXJ0X3NhbXBsZV9pbmRleCA8IHgpIHsKLSAgICAgICAgICAgIHJpZ2h0ID0gY2VudGVyOworICAgICAgICAgICAgcmlnaHRfcGx1c19vbmUgPSBjZW50ZXI7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRfc2FtcGxlX2luZGV4ID4geCkgewogICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZWZ0ID0gY2VudGVyOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqc2FtcGxlX2luZGV4ID0geDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChsZWZ0ID09IG1OdW1TeW5jU2FtcGxlcykgewogICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgewogICAgICAgICAgICAgQUxPR0UoInRyaWVkIHRvIGZpbmQgYSBzeW5jIGZyYW1lIGFmdGVyIHRoZSBsYXN0IG9uZTogJWQiLCBsZWZ0KTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIH0KLSAgICAgICAgbGVmdCA9IGxlZnQgLSAxOworICAgICAgICBmbGFncyA9IGtGbGFnQmVmb3JlOworICAgIH0KKyAgICBlbHNlIGlmIChsZWZ0ID09IDApIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQmVmb3JlKSB7CisgICAgICAgICAgICBBTE9HRSgidHJpZWQgdG8gZmluZCBhIHN5bmMgZnJhbWUgYmVmb3JlIHRoZSBmaXJzdCBvbmU6ICVkIiwgbGVmdCk7CisKKyAgICAgICAgICAgIC8vIG5vcm1hbGx5IHdlIHNob3VsZCByZXR1cm4gb3V0IG9mIHJhbmdlLCBidXQgdGhhdCBpcworICAgICAgICAgICAgLy8gdHJlYXRlZCBhcyBlbmQtb2Ytc3RyZWFtLiAgaW5zdGVhZCBzZWVrIHRvIGZpcnN0IHN5bmMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0ga0ZsYWdBZnRlcjsKICAgICB9CiAKLSAgICAvLyBOb3cgc3NpW2xlZnRdIGlzIHRoZSBzeW5jIHNhbXBsZSBpbmRleCBqdXN0IGJlZm9yZSAob3IgYXQpCi0gICAgLy8gc3RhcnRfc2FtcGxlX2luZGV4LgotICAgIC8vIEFsc28gc3RhcnRfc2FtcGxlX2luZGV4IDwgc3NpW2xlZnQgKyAxXSwgaWYgbGVmdCArIDEgPCBtTnVtU3luY1NhbXBsZXMuCi0KLSAgICB1aW50MzJfdCB4ID0gbVN5bmNTYW1wbGVzW2xlZnRdOwotCi0gICAgaWYgKGxlZnQgKyAxIDwgbU51bVN5bmNTYW1wbGVzKSB7Ci0gICAgICAgIHVpbnQzMl90IHkgPSBtU3luY1NhbXBsZXNbbGVmdCArIDFdOwotCi0gICAgICAgIC8vIG91ciBzYW1wbGUgbGllcyBiZXR3ZWVuIHN5bmMgc2FtcGxlcyB4IGFuZCB5LgotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHN0YXJ0X3NhbXBsZV9pbmRleCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IHhfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHkpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgeV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7Ci0KLSAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHhfdGltZSwgc2FtcGxlX3RpbWUpCi0gICAgICAgICAgICAgICAgPiBhYnNfZGlmZmVyZW5jZSh5X3RpbWUsIHNhbXBsZV90aW1lKSkgewotICAgICAgICAgICAgLy8gUGljayB0aGUgc3luYyBzYW1wbGUgY2xvc2VzdCAodGltZXdpc2UpIHRvIHRoZSBzdGFydC1zYW1wbGUuCi0gICAgICAgICAgICB4ID0geTsKLSAgICAgICAgICAgICsrbGVmdDsKLSAgICAgICAgfQotICAgIH0KLQorICAgIC8vIE5vdyBzc2lbbGVmdCAtIDFdIDwoPSkgc3RhcnRfc2FtcGxlX2luZGV4IDw9IHNzaVtsZWZ0XQogICAgIHN3aXRjaCAoZmxhZ3MpIHsKICAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHggPiBzdGFydF9zYW1wbGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBDSEVDSyhsZWZ0ID4gMCk7Ci0KLSAgICAgICAgICAgICAgICB4ID0gbVN5bmNTYW1wbGVzW2xlZnQgLSAxXTsKLQotICAgICAgICAgICAgICAgIGlmICh4ID4gc3RhcnRfc2FtcGxlX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0YWJsZSBvZiBzeW5jIHNhbXBsZSBpbmRpY2VzIHdhcyBub3Qgc29ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb3Blcmx5LgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0tbGVmdDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KICAgICAgICAgY2FzZSBrRmxhZ0FmdGVyOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeCA8IHN0YXJ0X3NhbXBsZV9pbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChsZWZ0ICsgMSA+PSBtTnVtU3luY1NhbXBsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4ID0gbVN5bmNTYW1wbGVzW2xlZnQgKyAxXTsKLQotICAgICAgICAgICAgICAgIGlmICh4IDwgc3RhcnRfc2FtcGxlX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0YWJsZSBvZiBzeW5jIHNhbXBsZSBpbmRpY2VzIHdhcyBub3Qgc29ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb3Blcmx5LgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQogICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIHJvdXRlIGlzIG5vdCB1c2VkLCBidXQgaW1wbGVtZW50IGl0IG5vbmV0aGVsZXNzCisgICAgICAgICAgICBDSEVDSyhmbGFncyA9PSBrRmxhZ0Nsb3Nlc3QpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhzdGFydF9zYW1wbGVfaW5kZXgpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdF0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0IC0gMV0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgICAgIC8vIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5CisgICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UodXBwZXJfdGltZSwgc2FtcGxlX3RpbWUpID4KKyAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZShzYW1wbGVfdGltZSwgbG93ZXJfdGltZSkpIHsKKyAgICAgICAgICAgICAgICAtLWxlZnQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIAotICAgICpzYW1wbGVfaW5kZXggPSB4OwotCisgICAgKnNhbXBsZV9pbmRleCA9IG1TeW5jU2FtcGxlc1tsZWZ0XTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTgwNyw3ICs3NzIsOCBAQAogICAgICAgICBvZmY2NF90ICpvZmZzZXQsCiAgICAgICAgIHNpemVfdCAqc2l6ZSwKICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKLSAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlKSB7CisgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSwKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN0YXR1c190IGVycjsKQEAgLTg0OSw2ICs4MTUsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChzYW1wbGVEdXJhdGlvbikgeworICAgICAgICAqc2FtcGxlRHVyYXRpb24gPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZUR1cmF0aW9uKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCmluZGV4IDRkMTVkN2UuLjFkYTFlNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICAgIGN1dCA9IDA7CiAgICAgfQogCi0gICAgbUZyb250UGFkZGluZyA9IHNraXA7CisgICAgbUZyb250UGFkZGluZyA9IG1Ta2lwID0gc2tpcDsKICAgICBtQmFja1BhZGRpbmcgPSBjdXQ7CiAgICAgbVdyaXRlSGVhZCA9IDA7CiAgICAgbVJlYWRIZWFkID0gMDsKQEAgLTEwMSw2ICsxMDEsNyBAQAogCiB2b2lkIFNraXBDdXRCdWZmZXI6OmNsZWFyKCkgewogICAgIG1Xcml0ZUhlYWQgPSBtUmVhZEhlYWQgPSAwOworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcDsKIH0KIAogdm9pZCBTa2lwQ3V0QnVmZmVyOjp3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCBhZjgxODZjLi40NDQ5ZDU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+CiAKQEAgLTExNyw3ICsxMTgsNyBAQAogfQogCiBNZWRpYVNjYW5SZXN1bHQgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OnByb2Nlc3NGaWxlSW50ZXJuYWwoCi0gICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAorICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICogLyogbWltZVR5cGUgKi8sCiAgICAgICAgIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50KSB7CiAgICAgY29uc3QgY2hhciAqZXh0ZW5zaW9uID0gc3RycmNocihwYXRoLCAnLicpOwogCkBAIC0xNDcsNyArMTQ4LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICAvLyBjb3VsZG4ndCBvcGVuIGl0IGxvY2FsbHksIG1heWJlIHRoZSBtZWRpYSBzZXJ2ZXIgY2FuPwotICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHBhdGgpOworICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0YXR1cyA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZmQsIDAsIDB4N2ZmZmZmZmZmZmZmZmZmTCk7CiAgICAgICAgIGNsb3NlKGZkKTsKQEAgLTIwMiw3ICsyMDMsNyBAQAogICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9PSzsKIH0KIAotY2hhciAqU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OmV4dHJhY3RBbGJ1bUFydChpbnQgZmQpIHsKK01lZGlhQWxidW1BcnQgKlN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpleHRyYWN0QWxidW1BcnQoaW50IGZkKSB7CiAgICAgQUxPR1YoImV4dHJhY3RBbGJ1bUFydCAlZCIsIGZkKTsKIAogICAgIG9mZjY0X3Qgc2l6ZSA9IGxzZWVrNjQoZmQsIDAsIFNFRUtfRU5EKTsKQEAgLTIxNCwxNSArMjE1LDkgQEAKICAgICBzcDxNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBtUmV0cmlldmVyKG5ldyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyKTsKICAgICBpZiAobVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShmZCwgMCwgc2l6ZSkgPT0gT0spIHsKICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbVJldHJpZXZlci0+ZXh0cmFjdEFsYnVtQXJ0KCk7Ci0KICAgICAgICAgaWYgKG1lbSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBNZWRpYUFsYnVtQXJ0ICphcnQgPSBzdGF0aWNfY2FzdDxNZWRpYUFsYnVtQXJ0ICo+KG1lbS0+cG9pbnRlcigpKTsKLQotICAgICAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyICopbWFsbG9jKGFydC0+bVNpemUgKyA0KTsKLSAgICAgICAgICAgICooaW50MzJfdCAqKWRhdGEgPSBhcnQtPm1TaXplOwotICAgICAgICAgICAgbWVtY3B5KCZkYXRhWzRdLCAmYXJ0WzFdLCBhcnQtPm1TaXplKTsKLQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICByZXR1cm4gYXJ0LT5jbG9uZSgpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDE5YWY0ZmIuLjEwMWZjOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0xNiwxMCArMTYsMTQgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CkBAIC0yOCw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01MCw3ICs1NSw5IEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CiAKICAgICBtUGFyc2VkTWV0YURhdGEgPSBmYWxzZTsKQEAgLTU4LDcgKzY1LDcgQEAKICAgICBkZWxldGUgbUFsYnVtQXJ0OwogICAgIG1BbGJ1bUFydCA9IE5VTEw7CiAKLSAgICBtU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmksIGhlYWRlcnMpOworICAgIG1Tb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGh0dHBTZXJ2aWNlLCB1cmksIGhlYWRlcnMpOwogCiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSBmb3IgJyVzJy4iLCB1cmkpOwpAQCAtODMsNyArOTAsNyBAQAogICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgewogICAgIGZkID0gZHVwKGZkKTsKIAotICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogCiAgICAgbVBhcnNlZE1ldGFEYXRhID0gZmFsc2U7CiAgICAgbU1ldGFEYXRhLmNsZWFyKCk7CkBAIC0yMzgsNyArMjQ1LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgICAgICAgICAgQUxPR1YoInRodW1iTmFpbFRpbWUgPSAlbGxkIHVzLCB0aW1lVXMgPSAlbGxkIHVzLCBtaW1lID0gJXMiLAorICAgICAgICAgICAgQUxPR1YoInRodW1iTmFpbFRpbWUgPSAlIiBQUklkNjQgIiB1cywgdGltZVVzID0gJSIgUFJJZDY0ICIgdXMsIG1pbWUgPSAlcyIsCiAgICAgICAgICAgICAgICAgIHRodW1iTmFpbFRpbWUsIHRpbWVVcywgbWltZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjEsNyArMzI4LDcgQEAKIFZpZGVvRnJhbWUgKlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRUaW1lKAogICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikgewogCi0gICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiAlbGxkIHVzIG9wdGlvbjogJWQiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiAlIiBQUklkNjQgIiB1cyBvcHRpb246ICVkIiwgdGltZVVzLCBvcHRpb24pOwogCiAgICAgaWYgKG1FeHRyYWN0b3IuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigibm8gZXh0cmFjdG9yLiIpOwpAQCAtMzc0LDEwICszODEsNyBAQAogICAgIHNpemVfdCBkYXRhU2l6ZTsKICAgICBpZiAoZmlsZU1ldGEtPmZpbmREYXRhKGtLZXlBbGJ1bUFydCwgJnR5cGUsICZkYXRhLCAmZGF0YVNpemUpCiAgICAgICAgICAgICAmJiBtQWxidW1BcnQgPT0gTlVMTCkgewotICAgICAgICBtQWxidW1BcnQgPSBuZXcgTWVkaWFBbGJ1bUFydDsKLSAgICAgICAgbUFsYnVtQXJ0LT5tU2l6ZSA9IGRhdGFTaXplOwotICAgICAgICBtQWxidW1BcnQtPm1EYXRhID0gbmV3IHVpbnQ4X3RbZGF0YVNpemVdOwotICAgICAgICBtZW1jcHkobUFsYnVtQXJ0LT5tRGF0YSwgZGF0YSwgZGF0YVNpemUpOworICAgICAgICBtQWxidW1BcnQgPSBNZWRpYUFsYnVtQXJ0Ojpmcm9tRGF0YShkYXRhU2l6ZSwgZGF0YSk7CiAgICAgfQogCiAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPQpAQCAtNDEwLDcgKzQxNCw3IEBACiAgICAgfQogCiAgICAgaWYgKG1BbGJ1bUFydCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQWxidW1BcnQoKm1BbGJ1bUFydCk7CisgICAgICAgIHJldHVybiBtQWxidW1BcnQtPmNsb25lKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE5VTEw7CkBAIC00NDcsNDggKzQ1MSw3MSBAQAogICAgIHN0cnVjdCBNYXAgewogICAgICAgICBpbnQgZnJvbTsKICAgICAgICAgaW50IHRvOworICAgICAgICBjb25zdCBjaGFyICpuYW1lOwogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgIHsga0tleU1JTUVUeXBlLCBNRVRBREFUQV9LRVlfTUlNRVRZUEUgfSwKLSAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgTUVUQURBVEFfS0VZX0NEX1RSQUNLX05VTUJFUiB9LAotICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCBNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIgfSwKLSAgICAgICAgeyBrS2V5QWxidW0sIE1FVEFEQVRBX0tFWV9BTEJVTSB9LAotICAgICAgICB7IGtLZXlBcnRpc3QsIE1FVEFEQVRBX0tFWV9BUlRJU1QgfSwKLSAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsIE1FVEFEQVRBX0tFWV9BTEJVTUFSVElTVCB9LAotICAgICAgICB7IGtLZXlBdXRob3IsIE1FVEFEQVRBX0tFWV9BVVRIT1IgfSwKLSAgICAgICAgeyBrS2V5Q29tcG9zZXIsIE1FVEFEQVRBX0tFWV9DT01QT1NFUiB9LAotICAgICAgICB7IGtLZXlEYXRlLCBNRVRBREFUQV9LRVlfREFURSB9LAotICAgICAgICB7IGtLZXlHZW5yZSwgTUVUQURBVEFfS0VZX0dFTlJFIH0sCi0gICAgICAgIHsga0tleVRpdGxlLCBNRVRBREFUQV9LRVlfVElUTEUgfSwKLSAgICAgICAgeyBrS2V5WWVhciwgTUVUQURBVEFfS0VZX1lFQVIgfSwKLSAgICAgICAgeyBrS2V5V3JpdGVyLCBNRVRBREFUQV9LRVlfV1JJVEVSIH0sCi0gICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCBNRVRBREFUQV9LRVlfQ09NUElMQVRJT04gfSwKLSAgICAgICAgeyBrS2V5TG9jYXRpb24sIE1FVEFEQVRBX0tFWV9MT0NBVElPTiB9LAorICAgICAgICB7IGtLZXlNSU1FVHlwZSwgTUVUQURBVEFfS0VZX01JTUVUWVBFLCBOVUxMIH0sCisgICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsIE1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIsICJ0cmFja251bWJlciIgfSwKKyAgICAgICAgeyBrS2V5RGlzY051bWJlciwgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLCAiZGlzY251bWJlciIgfSwKKyAgICAgICAgeyBrS2V5QWxidW0sIE1FVEFEQVRBX0tFWV9BTEJVTSwgImFsYnVtIiB9LAorICAgICAgICB7IGtLZXlBcnRpc3QsIE1FVEFEQVRBX0tFWV9BUlRJU1QsICJhcnRpc3QiIH0sCisgICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCBNRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QsICJhbGJ1bWFydGlzdCIgfSwKKyAgICAgICAgeyBrS2V5QXV0aG9yLCBNRVRBREFUQV9LRVlfQVVUSE9SLCBOVUxMIH0sCisgICAgICAgIHsga0tleUNvbXBvc2VyLCBNRVRBREFUQV9LRVlfQ09NUE9TRVIsICJjb21wb3NlciIgfSwKKyAgICAgICAgeyBrS2V5RGF0ZSwgTUVUQURBVEFfS0VZX0RBVEUsIE5VTEwgfSwKKyAgICAgICAgeyBrS2V5R2VucmUsIE1FVEFEQVRBX0tFWV9HRU5SRSwgImdlbnJlIiB9LAorICAgICAgICB7IGtLZXlUaXRsZSwgTUVUQURBVEFfS0VZX1RJVExFLCAidGl0bGUiIH0sCisgICAgICAgIHsga0tleVllYXIsIE1FVEFEQVRBX0tFWV9ZRUFSLCAieWVhciIgfSwKKyAgICAgICAgeyBrS2V5V3JpdGVyLCBNRVRBREFUQV9LRVlfV1JJVEVSLCAid3JpdGVyIiB9LAorICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OLCAiY29tcGlsYXRpb24iIH0sCisgICAgICAgIHsga0tleUxvY2F0aW9uLCBNRVRBREFUQV9LRVlfTE9DQVRJT04sIE5VTEwgfSwKICAgICB9OworCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtTWFwRW50cmllcyA9IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsKIAorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IgKmRldGVjdG9yID0gbmV3IENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewogICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKICAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtNYXBbaV0uZnJvbSwgJnZhbHVlKSkgewotICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChrTWFwW2ldLnRvLCBTdHJpbmc4KHZhbHVlKSk7CisgICAgICAgICAgICBpZiAoa01hcFtpXS5uYW1lKSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRvIGNoYXJzZXQgZGV0ZWN0b3IKKyAgICAgICAgICAgICAgICBkZXRlY3Rvci0+YWRkVGFnKGtNYXBbaV0ubmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBhZGQgdG8gb3V0cHV0IGxpc3QKKyAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKGtNYXBbaV0udG8sIFN0cmluZzgodmFsdWUpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIGRldGVjdG9yLT5kZXRlY3RBbmRDb252ZXJ0KCk7CisgICAgaW50IHNpemUgPSBkZXRlY3Rvci0+c2l6ZSgpOworICAgIGlmIChzaXplKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CisgICAgICAgICAgICBkZXRlY3Rvci0+Z2V0VGFnKGksICZuYW1lLCAmdmFsdWUpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBrTnVtTWFwRW50cmllczsgKytqKSB7CisgICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubmFtZSAmJiAhc3RyY21wKGtNYXBbal0ubmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChrTWFwW2pdLnRvLCBTdHJpbmc4KHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBkZXRlY3RvcjsKKwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgdWludDMyX3QgdHlwZTsKICAgICBzaXplX3QgZGF0YVNpemU7CiAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBbGJ1bUFydCwgJnR5cGUsICZkYXRhLCAmZGF0YVNpemUpCiAgICAgICAgICAgICAmJiBtQWxidW1BcnQgPT0gTlVMTCkgewotICAgICAgICBtQWxidW1BcnQgPSBuZXcgTWVkaWFBbGJ1bUFydDsKLSAgICAgICAgbUFsYnVtQXJ0LT5tU2l6ZSA9IGRhdGFTaXplOwotICAgICAgICBtQWxidW1BcnQtPm1EYXRhID0gbmV3IHVpbnQ4X3RbZGF0YVNpemVdOwotICAgICAgICBtZW1jcHkobUFsYnVtQXJ0LT5tRGF0YSwgZGF0YSwgZGF0YVNpemUpOworICAgICAgICBtQWxidW1BcnQgPSBNZWRpYUFsYnVtQXJ0Ojpmcm9tRGF0YShkYXRhU2l6ZSwgZGF0YSk7CiAgICAgfQogCiAgICAgc2l6ZV90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAKICAgICBjaGFyIHRtcFszMl07Ci0gICAgc3ByaW50Zih0bXAsICIlZCIsIG51bVRyYWNrcyk7CisgICAgc3ByaW50Zih0bXAsICIlenUiLCBudW1UcmFja3MpOwogCiAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgU3RyaW5nOCh0bXApKTsKIApAQCAtNTQ1LDcgKzU3Miw3IEBACiAgICAgfQogCiAgICAgLy8gVGhlIGR1cmF0aW9uIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZHVyYXRpb24gaW4gbXMuCi0gICAgc3ByaW50Zih0bXAsICIlbGxkIiwgKG1heER1cmF0aW9uVXMgKyA1MDApIC8gMTAwMCk7CisgICAgc3ByaW50Zih0bXAsICIlIiBQUklkNjQsIChtYXhEdXJhdGlvblVzICsgNTAwKSAvIDEwMDApOwogICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBTdHJpbmc4KHRtcCkpOwogCiAgICAgaWYgKGhhc0F1ZGlvKSB7CkBAIC01NzMsNyArNjAwLDcgQEAKICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNvdXJjZVNpemUpID09IE9LKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGF2Z0JpdFJhdGUgPSAoaW50NjRfdCkoc291cmNlU2l6ZSAqIDhFNiAvIG1heER1cmF0aW9uVXMpOwogCi0gICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVsbGQiLCBhdmdCaXRSYXRlKTsKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiJSIgUFJJZDY0LCBhdmdCaXRSYXRlKTsKICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0JJVFJBVEUsIFN0cmluZzgodG1wKSk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAppbmRleCA2YjkzNGQ0Li40ZTFjNjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKQEAgLTE2LDYgKzE2LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZU1lZGlhU291cmNlIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC01NCw5ICs1Niw5IEBACiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGRpbWVuc2lvbnMgJWR4JWQiLCBidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKICAgICB9CiAKLSAgICBtQnVmZmVyUXVldWUgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBtQnVmZmVyUXVldWUtPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CisgICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKKyAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiB8CiAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpOwogCiAgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gY29tcG9zZXIoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7CkBAIC02OCw3ICs3MCw3IEBACiAgICAgd3A8Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7CiAgICAgc3A8QnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPSBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOworICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiU3VyZmFjZU1lZGlhU291cmNlOiBlcnJvciBjb25uZWN0aW5nIHRvIEJ1ZmZlclF1ZXVlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKQEAgLTk5LDEzICsxMDEsMTYgQEAKICAgICBkdW1wKHJlc3VsdCwgIiIsIGJ1ZmZlciwgMTAyNCk7CiB9CiAKLXZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpkdW1wKFN0cmluZzgmIHJlc3VsdCwgY29uc3QgY2hhciogcHJlZml4LAotICAgICAgICBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAordm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OmR1bXAoCisgICAgICAgIFN0cmluZzgmIHJlc3VsdCwKKyAgICAgICAgY29uc3QgY2hhciogLyogcHJlZml4ICovLAorICAgICAgICBjaGFyKiBidWZmZXIsCisgICAgICAgIHNpemVfdCAvKiBTSVpFICovKSBjb25zdAogewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5kdW1wKHJlc3VsdCwgIiIpOworICAgIG1Db25zdW1lci0+ZHVtcChyZXN1bHQsICIiKTsKIH0KIAogc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRGcmFtZVJhdGUoaW50MzJfdCBmcHMpCkBAIC0xNjMsNyArMTY4LDcgQEAKICAgICBDSEVDS19HVChtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCwgMSk7CiAKICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICBtQnVmZmVyUXVldWUtPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobU1heEFjcXVpcmVkQnVmZmVyQ291bnQpOworICAgICAgICBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobU1heEFjcXVpcmVkQnVmZmVyQ291bnQpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTc2LDcgKzE4MSw3IEBACiB9CiAKIHN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChzaXplX3QgY291bnQpIHsKLSAgICBBTE9HVigic2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudCglZCkiLCBjb3VudCk7CisgICAgQUxPR1YoInNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoJXp1KSIsIGNvdW50KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCiAgICAgQ0hFQ0tfR1QoY291bnQsIDEpOwpAQCAtMjAyLDggKzIwNywxMSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CisKICAgICB3aGlsZSAobU51bVBlbmRpbmdCdWZmZXJzID4gMCkgewotICAgICAgICBBTE9HSSgiU3RpbGwgd2FpdGluZyBmb3IgJWQgYnVmZmVycyB0byBiZSByZXR1cm5lZC4iLAorICAgICAgICBBTE9HSSgiU3RpbGwgd2FpdGluZyBmb3IgJXp1IGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQuIiwKICAgICAgICAgICAgICAgICBtTnVtUGVuZGluZ0J1ZmZlcnMpOwogCiAjaWYgREVCVUdfUEVORElOR19CVUZGRVJTCkBAIC0yMTUsMTEgKzIyMyw5IEBACiAgICAgICAgIG1NZWRpYUJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24ud2FpdChtTXV0ZXgpOwogICAgIH0KIAotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogICAgIG1NZWRpYUJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CiAKLSAgICByZXR1cm4gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKIH0KIAogc3A8TWV0YURhdGE+IFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkKQEAgLTI2NSwxMyArMjcxLDEyIEBACiAgICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKICAgICBtZW1jcHkoZGF0YSArIDQsICZidWZmZXJIYW5kbGUsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKIAotICAgIEFMT0dWKCJoYW5kbGUgPSAlcCwgLCBvZmZzZXQgPSAlZCwgbGVuZ3RoID0gJWQiLAorICAgIEFMT0dWKCJoYW5kbGUgPSAlcCwgLCBvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSIsCiAgICAgICAgICAgICBidWZmZXJIYW5kbGUsICgqYnVmZmVyKS0+cmFuZ2VfbGVuZ3RoKCksICgqYnVmZmVyKS0+cmFuZ2Vfb2Zmc2V0KCkpOwogfQogCi1zdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnJlYWQoIE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCi17CitzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBBTE9HVigicmVhZCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKQEAgLTI5MCw3ICsyOTUsNyBAQAogICAgIC8vIHdhaXQgaGVyZSB0aWxsIHRoZSBmcmFtZXMgY29tZSBpbiBmcm9tIHRoZSBjbGllbnQgc2lkZQogICAgIHdoaWxlIChtU3RhcnRlZCkgewogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAgICAgICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGEgYnVmZmVyIHRvIGJlIHF1ZXVlZAogICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKQEAgLTMxMyw3ICszMTgsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lTnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm1UaW1lc3RhbXAgPCBtU3RhcnRUaW1lTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZnJhbWUgcHJlZGF0ZXMgc3RhcnQgb2YgcmVjb3JkLCBkaXNjYXJkCi0gICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsIEVHTF9OT19ESVNQTEFZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTM2MCw3ICszNjUsNyBAQAogICAgICgqYnVmZmVyKS0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgKCpidWZmZXIpLT5hZGRfcmVmKCk7CiAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCk7Ci0gICAgQUxPR1YoIkZyYW1lcyBlbmNvZGVkID0gJWQsIHRpbWVzdGFtcCA9ICVsbGQsIHRpbWUgZGlmZiA9ICVsbGQiLAorICAgIEFMT0dWKCJGcmFtZXMgZW5jb2RlZCA9ICVkLCB0aW1lc3RhbXAgPSAlIiBQUklkNjQgIiwgdGltZSBkaWZmID0gJSIgUFJJZDY0LAogICAgICAgICAgICAgbU51bUZyYW1lc0VuY29kZWQsIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCwKICAgICAgICAgICAgIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCAtIHByZXZUaW1lU3RhbXAgLyAxMDAwKTsKIApAQCAtNDEzLDcgKzQxOCw3IEBACiAgICAgICAgICAgICBBTE9HVigiU2xvdCAlZCByZXR1cm5lZCwgbWF0Y2hlcyBoYW5kbGUgPSAlcCIsIGlkLAogICAgICAgICAgICAgICAgICAgICBtU2xvdHNbaWRdLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpOwogCi0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaWQsIG1TbG90c1tpZF0ubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGlkLCBtU2xvdHNbaWRdLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLAogICAgICAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UpOwogCkBAIC00NzQsNCArNDc5LDggQEAKICAgICB9CiB9CiAKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKKyAgICBBTE9HX0FTU0VSVChmYWxzZSwgIlN1cmZhY2VNZWRpYVNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKK30KKwogfSAvLyBlbmQgb2YgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCmluZGV4IDBhZmFjNjkuLjFmZGIyNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcApAQCAtMTcsNyArMTcsMTEgQEAKICN1bmRlZiBfX1NUUklDVF9BTlNJX18KICNkZWZpbmUgX19TVERJTlRfTElNSVRTCiAjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUaW1lZEV2ZW50UXVldWUiCkBAIC0yNiw5ICszMCw2IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oIgogCi0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtMjU4LDcgKzI1OSw3IEBACiAgICAgICAgICAgICAgICAgc3RhdGljIGludDY0X3Qga01heFRpbWVvdXRVcyA9IDEwMDAwMDAwbGw7ICAvLyAxMCBzZWNzCiAgICAgICAgICAgICAgICAgYm9vbCB0aW1lb3V0Q2FwcGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKGRlbGF5X3VzID4ga01heFRpbWVvdXRVcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiZGVsYXlfdXMgZXhjZWVkcyBtYXggdGltZW91dDogJWxsZCB1cyIsIGRlbGF5X3VzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImRlbGF5X3VzIGV4Y2VlZHMgbWF4IHRpbWVvdXQ6ICUiIFBSSWQ2NCAiIHVzIiwgZGVsYXlfdXMpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIG5ldmVyIGJsb2NrIGZvciBtb3JlIHRoYW4gMTAgc2VjcywgaW5zdGVhZAogICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIHNwbGl0IHVwIHRoZSBmdWxsIHRpbWVvdXQgaW50byBjaHVua3Mgb2YKQEAgLTMzNyw3ICszMzgsNyBAQAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIlRpbWVkRXZlbnRRdWV1ZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSk7ICAgIC8vIG5vdCBvbmV3YXkKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOwpAQCAtMzYyLDcgKzM2Myw3IEBACiAgICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuICE9IDApOwogICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCk7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDApOyAgLy8gbm90IG9uZXdheQogICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgICAgIH0KICAgICAgICAgbVdha2VMb2NrVG9rZW4uY2xlYXIoKTsKQEAgLTM3Niw4ICszNzcsOCBAQAogICAgIG1Qb3dlck1hbmFnZXIuY2xlYXIoKTsKIH0KIAotdm9pZCBUaW1lZEV2ZW50UXVldWU6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKLXsKK3ZvaWQgVGltZWRFdmVudFF1ZXVlOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKAorICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgLyogd2hvICovKSB7CiAgICAgbVF1ZXVlLT5jbGVhclBvd2VyTWFuYWdlcigpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggMDkwYzg5MS4uMjE0ZTJmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMTcsMTEgKzE3LDEzIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlV0aWxzIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTEwMCw2ICsxMDIsMTEgQEAKICAgICAgICAgbXNnLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOwogICAgIH0KIAorICAgIGludCBhdmdCaXRSYXRlOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZhdmdCaXRSYXRlKSkgeworICAgICAgICBtc2ctPnNldEludDMyKCJiaXQtcmF0ZSIsIGF2Z0JpdFJhdGUpOworICAgIH0KKwogICAgIGludDMyX3QgaXNTeW5jOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKSAmJiBpc1N5bmMgIT0gMCkgewogICAgICAgICBtc2ctPnNldEludDMyKCJpcy1zeW5jLWZyYW1lIiwgMSk7CkBAIC0xMTksNiArMTI2LDI1IEBACiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJzYXItd2lkdGgiLCBzYXJXaWR0aCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJzYXItaGVpZ2h0Iiwgc2FySGVpZ2h0KTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQ7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBjb2xvckZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisgICAgICAgIGlmIChtZXRhLT5maW5kUmVjdChrS2V5Q3JvcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcEJvdHRvbSkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UmVjdCgiY3JvcCIsIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicm90YXRpb24tZGVncmVlcyIsIHJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOwpAQCAtMTQ1LDYgKzE3MSwxMSBAQAogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc0FEVFMsICZpc0FEVFMpKSB7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJpcy1hZHRzIiwgdHJ1ZSk7CiAgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUgPSAtMTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgYWFjUHJvZmlsZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKQEAgLTE1Miw2ICsxODMsMTEgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBtYXhJbnB1dFNpemUpOwogICAgIH0KIAorICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICBtc2ctPnNldEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICB9CisKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CkBAIC0yNTQsNiArMjkwLDcwIEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMSIsIGJ1ZmZlcik7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIGlmIChzaXplIDwgMjMgfHwgcHRyWzBdICE9IDEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgcHJvZmlsZSA9IHB0clsxXSAmIDMxOworICAgICAgICB1aW50OF90IGxldmVsID0gcHRyWzEyXTsKKyAgICAgICAgcHRyICs9IDIyOworICAgICAgICBzaXplIC09IDIyOworCisKKyAgICAgICAgc2l6ZV90IG51bW9mQXJyYXlzID0gKGNoYXIpcHRyWzBdOworICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgc2l6ZSAtPSAxOworICAgICAgICBzaXplX3QgaiA9IDAsIGkgPSAwOworCisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKDEwMjQpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1vZkFycmF5czsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzY4MDc4MCIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgICAgIHNpemUgLT0gMTsKKworICAgICAgICAgICAgLy9OdW0gb2YgbmFscworICAgICAgICAgICAgc2l6ZV90IG51bW9mTmFscyA9IFUxNl9BVChwdHIpOworCisgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bW9mTmFsczsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCAyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKKworICAgICAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvcHlOQUxVVG9BQnVmZmVyKCZidWZmZXIsIHB0ciwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHRyICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzaXplIC09IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOworCiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CiAgICAgICAgIENIRUNLX0VRKGVzZHMuSW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CkBAIC0yOTgsNiArMzk4LDE2IEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMSIsIGJ1ZmZlcik7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5T3B1c0hlYWRlciwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKICAgICB9CiAKICAgICAqZm9ybWF0ID0gbXNnOwpAQCAtMzI0LDcgKzQzNCw3IEBACiAgICAgICAgICAgICAgICAgLy8gdGhlcmUgY2FuJ3QgYmUgYW5vdGhlciBwYXJhbSBoZXJlLCBzbyB1c2UgYWxsIHRoZSByZXN0CiAgICAgICAgICAgICAgICAgaSA9IGNzZDAtPnNpemUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJibG9jayBhdCAlZCwgbGFzdCB3YXMgJWQiLCBpLCBsYXN0cGFyYW1vZmZzZXQpOworICAgICAgICAgICAgQUxPR1YoImJsb2NrIGF0ICV6dSwgbGFzdCB3YXMgJWQiLCBpLCBsYXN0cGFyYW1vZmZzZXQpOwogICAgICAgICAgICAgaWYgKGxhc3RwYXJhbW9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGkgLSBsYXN0cGFyYW1vZmZzZXQ7CiAgICAgICAgICAgICAgICAgYXZjY1thdmNjaWR4KytdID0gc2l6ZSA+PiA4OwpAQCAtMzU1LDcgKzQ2NSw3IEBACiAgICAgICAgICAgICAgICAgLy8gdGhlcmUgY2FuJ3QgYmUgYW5vdGhlciBwYXJhbSBoZXJlLCBzbyB1c2UgYWxsIHRoZSByZXN0CiAgICAgICAgICAgICAgICAgaSA9IGNzZDEtPnNpemUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJibG9jayBhdCAlZCwgbGFzdCB3YXMgJWQiLCBpLCBsYXN0cGFyYW1vZmZzZXQpOworICAgICAgICAgICAgQUxPR1YoImJsb2NrIGF0ICV6dSwgbGFzdCB3YXMgJWQiLCBpLCBsYXN0cGFyYW1vZmZzZXQpOwogICAgICAgICAgICAgaWYgKGxhc3RwYXJhbW9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGkgLSBsYXN0cGFyYW1vZmZzZXQ7CiAgICAgICAgICAgICAgICAgYXZjY1thdmNjaWR4KytdID0gc2l6ZSA+PiA4OwpAQCAtNDQ4LDYgKzU1OCwyNSBAQAogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNBUldpZHRoLCBzYXJXaWR0aCk7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U0FSSGVpZ2h0LCBzYXJIZWlnaHQpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBjb2xvckZvcm1hdDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZFJlY3QoImNyb3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcEJvdHRvbSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldFJlY3Qoa0tleUNyb3BSZWN0LCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtaW1lLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykpIHsKQEAgLTQ5OSw2ICs2MjgsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludDMyX3QgdGltZVNjYWxlOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGltZS1zY2FsZSIsICZ0aW1lU2NhbGUpKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIHRpbWVTY2FsZSk7CisgICAgfQorCiAgICAgLy8gWFhYIFRPRE8gYWRkIHdoYXRldmVyIG90aGVyIGtleXMgdGhlcmUgYXJlCiAKICNpZiAwCkBAIC01NzAsNiArNzA0LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgICAgICBBVURJT19GT1JNQVRfQU1SX1dCIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICAgICAgICAgQVVESU9fRk9STUFUX0FBQyB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAgICAgIEFVRElPX0ZPUk1BVF9WT1JCSVMgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICAgICAgICBBVURJT19GT1JNQVRfT1BVU30sCiAgICAgeyAwLCBBVURJT19GT1JNQVRfSU5WQUxJRCB9CiB9OwogCkBAIC01ODcsMTAgKzcyMiw0NiBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKK3N0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCB7CisgICAgT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFIGVBYWNQcm9maWxlVHlwZTsKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFhY19mb3JtYXRfY29udl90IHByb2ZpbGVMb29rdXBbXSA9IHsKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RNYWluLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ19NQUlOfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RMQywgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MQ30sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0U1NSLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfU1NSfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RMVFAsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MVFB9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEhFLCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YxfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RTY2FsYWJsZSwgICAgQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRX0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0RVJMQywgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRVJMQ30sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TEQsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTER9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTLCAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YyfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RFTEQsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FTER9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdE51bGwsICAgICAgICBBVURJT19GT1JNQVRfQUFDfSwKK307CisKK3ZvaWQgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoIGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsIHVpbnQ2NF90IGVBYWNQcm9maWxlKQoreworY29uc3Qgc3RydWN0IGFhY19mb3JtYXRfY29udl90KiBwID0gJnByb2ZpbGVMb29rdXBbMF07CisgICAgd2hpbGUgKHAtPmVBYWNQcm9maWxlVHlwZSAhPSBPTVhfQVVESU9fQUFDT2JqZWN0TnVsbCkgeworICAgICAgICBpZiAoZUFhY1Byb2ZpbGUgPT0gcC0+ZUFhY1Byb2ZpbGVUeXBlKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBwLT5mb3JtYXQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgKytwOworICAgIH0KKyAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfQUFDOworICAgIHJldHVybjsKK30KKwogYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCiB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCiAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CkBAIC02MDksMTUgKzc4MCwxMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLy8gY2hlY2sgd2hldGhlciBpdCBpcyBFTEQvTEQgY29udGVudCAtPiBubyBvZmZsb2FkaW5nCi0gICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGRlcGVuZCBvbiBhdWRpbyBEU1AgY2FwYWJpbGl0aWVzLiBtYXBNaW1lVG9BdWRpb0Zvcm1hdCgpIHNob3VsZCB1c2UgdGhlCi0gICAgLy8gbWV0YWRhdGEgdG8gcmVmaW5lIHRoZSBBQUMgZm9ybWF0IGFuZCB0aGUgYXVkaW8gSEFMIHNob3VsZCBvbmx5IGxpc3Qgc3VwcG9ydGVkIHByb2ZpbGVzLgorICAgIC8vIFJlZGVmaW5lIGFhYyBmb3JtYXQgYWNjb3JkaW5nIHRvIGl0cyBwcm9maWxlCisgICAgLy8gT2ZmbG9hZGluZyBkZXBlbmRzIG9uIGF1ZGlvIERTUCBjYXBhYmlsaXRpZXMuCiAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNhb3QpKSB7Ci0gICAgICAgIGlmIChhYWNhb3QgPT0gMjMgfHwgYWFjYW90ID09IDM5ICkgewotICAgICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBpcyBFTEQvTEQgY29udGVudCIsIG1pbWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8uZm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CiAgICAgfQogCiAgICAgaW50MzJfdCBzcmF0ZSA9IC0xOwpAQCAtNjYyLDUgKzgyOSw0MCBAQAogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCitBU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnVyaSwgYm9vbCBpbmNvZ25pdG8pIHsKKyAgICBpZiAoaW5jb2duaXRvKSB7CisgICAgICAgIHJldHVybiBBU3RyaW5nKCI8VVJJIHN1cHByZXNzZWQ+Iik7CisgICAgfQorCisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQubG9nLXVyaSIsIHByb3AsICJmYWxzZSIpICYmCisgICAgICAgICghc3RyY21wKHByb3AsICIxIikgfHwgIXN0cmNtcChwcm9wLCAidHJ1ZSIpKSkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKworICAgIC8vIGZpbmQgc2NoZW1lCisgICAgQVN0cmluZyBzY2hlbWU7CisgICAgY29uc3QgY2hhciAqY2hhcnMgPSB1cmkuY19zdHIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVyaS5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyIGMgPSBjaGFyc1tpXTsKKyAgICAgICAgaWYgKCFpc2FzY2lpKGMpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChpc2FscGhhKGMpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGEgbGV0dGVyCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KGMpIHx8IGMgPT0gJysnIHx8IGMgPT0gJy4nIHx8IGMgPT0nLScpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJzonKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzY2hlbWUgPSBBU3RyaW5nKHVyaSwgMCwgaSk7CisgICAgICAgIHNjaGVtZS5hcHBlbmQoIjovLzxzdXBwcmVzc2VkPiIpOworICAgICAgICByZXR1cm4gc2NoZW1lOworICAgIH0KKyAgICByZXR1cm4gQVN0cmluZygiPG5vLXNjaGVtZSBVUkkgc3VwcHJlc3NlZD4iKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcAppbmRleCBhMjQ1ZjJjLi5lOTg4ZjZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcApAQCAtMTYsNiArMTYsOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlZCUklTZWVrZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL1ZCUklTZWVrZXIuaCIKQEAgLTc1LDcgKzc4LDcgQEAKICAgICBzaXplX3QgZW50cnlTaXplID0gVTE2X0FUKCZ2YnJpSGVhZGVyWzIyXSk7CiAgICAgc2l6ZV90IHNjYWxlID0gVTE2X0FUKCZ2YnJpSGVhZGVyWzIwXSk7CiAKLSAgICBBTE9HVigiJWQgZW50cmllcywgc2NhbGU9JWQsIHNpemVfcGVyX2VudHJ5PSVkIiwKKyAgICBBTE9HVigiJXp1IGVudHJpZXMsIHNjYWxlPSV6dSwgc2l6ZV9wZXJfZW50cnk9JXp1IiwKICAgICAgICAgIG51bUVudHJpZXMsCiAgICAgICAgICBzY2FsZSwKICAgICAgICAgIGVudHJ5U2l6ZSk7CkBAIC0xMTksNyArMTIyLDcgQEAKIAogICAgICAgICBzZWVrZXItPm1TZWdtZW50cy5wdXNoKG51bUJ5dGVzKTsKIAotICAgICAgICBBTE9HVigiZW50cnkgIyVkOiAlZCBvZmZzZXQgMHglMDhseCIsIGksIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICBBTE9HVigiZW50cnkgIyV6dTogJXUgb2Zmc2V0IDB4JTAxNmxseCIsIGksIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgICAgICBvZmZzZXQgKz0gbnVtQnl0ZXM7CiAgICAgfQogCkBAIC0xNjAsNyArMTYzLDcgQEAKICAgICAgICAgKnBvcyArPSBtU2VnbWVudHMuaXRlbUF0KHNlZ21lbnRJbmRleCsrKTsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0T2Zmc2V0Rm9yVGltZSAlbGxkIHVzID0+IDB4JTA4bHgiLCAqdGltZVVzLCAqcG9zKTsKKyAgICBBTE9HVigiZ2V0T2Zmc2V0Rm9yVGltZSAlIiBQUklkNjQgIiB1cyA9PiAweCUwMTZsbHgiLCAqdGltZVVzLCAqcG9zKTsKIAogICAgICp0aW1lVXMgPSBub3dVczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKaW5kZXggMjJhZjZmYi4uYTRhNjUxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCkBAIC0xMjcsNyArMTI3LDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTM1OCw3ICszNTgsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBXQVZTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CkBAIC00MTQsNyArNDE0LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBvcyA9IChzZWVrVGltZVVzICogbVNhbXBsZVJhdGUpIC8gMTAwMDAwMCAqIG1OdW1DaGFubmVscyAqIChtQml0c1BlclNhbXBsZSA+PiAzKTsKICAgICAgICAgfQotICAgICAgICBpZiAocG9zID4gbVNpemUpIHsKKyAgICAgICAgaWYgKHBvcyA+IChvZmY2NF90KW1TaXplKSB7CiAgICAgICAgICAgICBwb3MgPSBtU2l6ZTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFBvcyA9IHBvcyArIG1PZmZzZXQ7CkBAIC00MzksNiArNDM5LDEwIEBACiAgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbWF4Qnl0ZXNBdmFpbGFibGU7CiAgICAgfQogCisgICAgLy8gcmVhZCBvbmx5IGludGVncmFsIGFtb3VudHMgb2YgYXVkaW8gdW5pdCBmcmFtZXMuCisgICAgY29uc3Qgc2l6ZV90IGlucHV0VW5pdEZyYW1lU2l6ZSA9IG1OdW1DaGFubmVscyAqIG1CaXRzUGVyU2FtcGxlIC8gODsKKyAgICBtYXhCeXRlc1RvUmVhZCAtPSBtYXhCeXRlc1RvUmVhZCAlIGlucHV0VW5pdEZyYW1lU2l6ZTsKKwogICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewogICAgICAgICAvLyBNaWNyb3NvZnQgcGFja3MgMiBmcmFtZXMgaW50byA2NSBieXRlcywgcmF0aGVyIHRoYW4gdXNpbmcgc2VwYXJhdGUgMzMtYnl0ZSBmcmFtZXMsCiAgICAgICAgIC8vIHNvIHJlYWQgbXVsdGlwbGVzIG9mIDY1LCBhbmQgdXNlIHNtYWxsZXIgYnVmZmVycyB0byBhY2NvdW50IGZvciB+MTA6MSBleHBhbnNpb24gcmF0aW8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmluZGV4IGI4MjI4NjguLjM4YTFmNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtNDAsNiArNDAsMjUgQEAKICAgICByZXR1cm4geCArICgxdSA8PCBudW1aZXJvZXMpIC0gMTsKIH0KIAorc2lnbmVkIHBhcnNlU0UoQUJpdFJlYWRlciAqYnIpIHsKKyAgICB1bnNpZ25lZCBjb2RlTnVtID0gcGFyc2VVRShicik7CisKKyAgICByZXR1cm4gKGNvZGVOdW0gJiAxKSA/IChjb2RlTnVtICsgMSkgLyAyIDogLShjb2RlTnVtIC8gMik7Cit9CisKK3N0YXRpYyB2b2lkIHNraXBTY2FsaW5nTGlzdChBQml0UmVhZGVyICpiciwgc2l6ZV90IHNpemVPZlNjYWxpbmdMaXN0KSB7CisgICAgc2l6ZV90IGxhc3RTY2FsZSA9IDg7CisgICAgc2l6ZV90IG5leHRTY2FsZSA9IDg7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplT2ZTY2FsaW5nTGlzdDsgKytqKSB7CisgICAgICAgIGlmIChuZXh0U2NhbGUgIT0gMCkgeworICAgICAgICAgICAgc2lnbmVkIGRlbHRhX3NjYWxlID0gcGFyc2VTRShicik7CisgICAgICAgICAgICBuZXh0U2NhbGUgPSAobGFzdFNjYWxlICsgZGVsdGFfc2NhbGUgKyAyNTYpICUgMjU2OworICAgICAgICB9CisKKyAgICAgICAgbGFzdFNjYWxlID0gKG5leHRTY2FsZSA9PSAwKSA/IGxhc3RTY2FsZSA6IG5leHRTY2FsZTsKKyAgICB9Cit9CisKIC8vIERldGVybWluZSB2aWRlbyBkaW1lbnNpb25zIGZyb20gdGhlIHNlcXVlbmNlIHBhcmFtZXRlcnNldC4KIHZvaWQgRmluZEFWQ0RpbWVuc2lvbnMoCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzZXFQYXJhbVNldCwKQEAgLTYzLDcgKzgyLDI0IEBACiAgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIGJpdF9kZXB0aF9sdW1hX21pbnVzOAogICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOAogICAgICAgICBici5za2lwQml0cygxKTsgIC8vIHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZwotICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAwdSk7ICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnCisKKyAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHNlcV9zY2FsaW5nX2xpc3RfcHJlc2VudF9mbGFnW2ldCisKKyAgICAgICAgICAgICAgICAgICAgLy8gV0FSTklORzogdGhlIGNvZGUgYmVsb3cgaGFzIG5vdCBldmVyIGJlZW4gZXhlcmNpc2VkLi4uCisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgYSByZWFsLXdvcmxkIGV4YW1wbGUuCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2FsaW5nTGlzdDR4NFtpXSwxNiwuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsaW5nTGlzdCgmYnIsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmdMaXN0OHg4W2ktNl0sNjQsLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwU2NhbGluZ0xpc3QoJmJyLCA2NCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwYXJzZVVFKCZicik7ICAvLyBsb2cyX21heF9mcmFtZV9udW1fbWludXM0CkBAIC0yNTEsOSArMjg3LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXRpYyBzcDxBQnVmZmVyPiBGaW5kTkFMKAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbmFsVHlwZSwKLSAgICAgICAgc2l6ZV90ICpzdG9wT2Zmc2V0KSB7CitzdGF0aWMgc3A8QUJ1ZmZlcj4gRmluZE5BTChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbmFsVHlwZSkgewogICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OwogICAgIHNpemVfdCBuYWxTaXplOwogICAgIHdoaWxlIChnZXROZXh0TkFMVW5pdCgmZGF0YSwgJnNpemUsICZuYWxTdGFydCwgJm5hbFNpemUsIHRydWUpID09IE9LKSB7CkBAIC0yOTMsNyArMzI3LDcgQEAKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYWNjZXNzVW5pdC0+ZGF0YSgpOwogICAgIHNpemVfdCBzaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwogCi0gICAgc3A8QUJ1ZmZlcj4gc2VxUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDcsIE5VTEwpOworICAgIHNwPEFCdWZmZXI+IHNlcVBhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA3KTsKICAgICBpZiAoc2VxUGFyYW1TZXQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zMDMsOCArMzM3LDcgQEAKICAgICBGaW5kQVZDRGltZW5zaW9ucygKICAgICAgICAgICAgIHNlcVBhcmFtU2V0LCAmd2lkdGgsICZoZWlnaHQsICZzYXJXaWR0aCwgJnNhckhlaWdodCk7CiAKLSAgICBzaXplX3Qgc3RvcE9mZnNldDsKLSAgICBzcDxBQnVmZmVyPiBwaWNQYXJhbVNldCA9IEZpbmROQUwoZGF0YSwgc2l6ZSwgOCwgJnN0b3BPZmZzZXQpOworICAgIHNwPEFCdWZmZXI+IHBpY1BhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA4KTsKICAgICBDSEVDSyhwaWNQYXJhbVNldCAhPSBOVUxMKTsKIAogICAgIHNpemVfdCBjc2RTaXplID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5ZTNmZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksIHRydWUpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgXAotICAgICAgICBEYXRhVXJpU291cmNlLmNwcCBcCi0gICAgICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwIFwKLSAgICAgICAgc3VwcG9ydC5jcHAgXAotICAgICAgICBjaHJvbWl1bV9odHRwX3N0dWIuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgICAgIGV4dGVybmFsL2Nocm9taXVtIFwKLSAgICAgICAgZXh0ZXJuYWwvY2hyb21pdW0vYW5kcm9pZAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYnN0bHBvcnQgXAotICAgICAgICBsaWJjaHJvbWl1bV9uZXQgXAotICAgICAgICBsaWJ1dGlscyBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYmN1dGlscyBcCi0gICAgICAgIGxpYmxvZyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGxpYmRybWZyYW1ld29yawotCi1pbmNsdWRlIGV4dGVybmFsL3N0bHBvcnQvbGlic3RscG9ydC5tawotCi1MT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLWVuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1YzI4MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNocm9taXVtSFRUUERhdGFTb3VyY2UiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotI2luY2x1ZGUgInN1cHBvcnQuaCIKLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1DaHJvbWl1bUhUVFBEYXRhU291cmNlOjpDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKQotICAgIDogbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1TdGF0ZShESVNDT05ORUNURUQpLAotICAgICAgbURlbGVnYXRlKG5ldyBTZkRlbGVnYXRlKSwKLSAgICAgIG1DdXJyZW50T2Zmc2V0KDApLAotICAgICAgbUlPUmVzdWx0KE9LKSwKLSAgICAgIG1Db250ZW50U2l6ZSgtMSksCi0gICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKLSAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKLSAgICBtRGVsZWdhdGUtPnNldE93bmVyKHRoaXMpOwotfQotCi1DaHJvbWl1bUhUVFBEYXRhU291cmNlOjp+Q2hyb21pdW1IVFRQRGF0YVNvdXJjZSgpIHsKLSAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICBkZWxldGUgbURlbGVnYXRlOwotICAgIG1EZWxlZ2F0ZSA9IE5VTEw7Ci0KLSAgICBjbGVhckRSTVN0YXRlX2woKTsKLQotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Y29ubmVjdCgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgdWlkX3QgdWlkOwotICAgIGlmIChnZXRVSUQoJnVpZCkpIHsKLSAgICAgICAgbURlbGVnYXRlLT5zZXRVSUQodWlkKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCi0gICAgTE9HX1BSSShBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLCAiY29ubmVjdCBvbiBiZWhhbGYgb2YgdWlkICVkIiwgdWlkKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIGNvbm5lY3RfbCh1cmksIGhlYWRlcnMsIG9mZnNldCk7Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNvbm5lY3RfbCgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgewotICAgICAgICBkaXNjb25uZWN0X2woKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCi0gICAgTE9HX1BSSShBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLAotICAgICAgICAgICAgICAgICJjb25uZWN0IHRvIDxVUkwgc3VwcHJlc3NlZD4gQCVsbGQiLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgICBtVVJJID0gdXJpOwotICAgIG1Db250ZW50VHlwZSA9IFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotCi0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBtSGVhZGVycyA9ICpoZWFkZXJzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1IZWFkZXJzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gQ09OTkVDVElORzsKLSAgICBtQ29udGVudFNpemUgPSAtMTsKLSAgICBtQ3VycmVudE9mZnNldCA9IG9mZnNldDsKLQotICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVDb25uZWN0aW9uKG1VUkkuY19zdHIoKSwgJm1IZWFkZXJzLCBvZmZzZXQpOwotCi0gICAgd2hpbGUgKG1TdGF0ZSA9PSBDT05ORUNUSU5HIHx8IG1TdGF0ZSA9PSBESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1TdGF0ZSA9PSBDT05ORUNURUQgPyBPSyA6IG1JT1Jlc3VsdDsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvblJlZGlyZWN0KGNvbnN0IGNoYXIgKnVybCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVVSSSA9IHVybDsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKLSAgICAgICAgaW50NjRfdCBjb250ZW50U2l6ZSwgY29uc3QgY2hhciAqY29udGVudFR5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUSU5HKSB7Ci0gICAgICAgIC8vIFdlIG1heSBoYXZlIGluaXRpYXRlZCBkaXNjb25uZWN0aW9uLgotICAgICAgICBDSEVDS19FUShtU3RhdGUsIERJU0NPTk5FQ1RJTkcpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgIG1Db250ZW50U2l6ZSA9IChjb250ZW50U2l6ZSA8IDApID8gLTEgOiBjb250ZW50U2l6ZSArIG1DdXJyZW50T2Zmc2V0OwotICAgIG1Db250ZW50VHlwZSA9IFN0cmluZzgoY29udGVudFR5cGUpOwotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25Db25uZWN0aW9uRmFpbGVkKHN0YXR1c190IGVycikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0KLSAgICAvLyBtVVJJLmNsZWFyKCk7Ci0KLSAgICBtSU9SZXN1bHQgPSBlcnI7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZGlzY29ubmVjdCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGRpc2Nvbm5lY3RfbCgpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmRpc2Nvbm5lY3RfbCgpIHsKLSAgICBpZiAobVN0YXRlID09IERJU0NPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVN0YXRlID0gRElTQ09OTkVDVElORzsKLSAgICBtSU9SZXN1bHQgPSAtRUlOVFI7Ci0KLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlRGlzY29ubmVjdCgpOwotCi0gICAgd2hpbGUgKG1TdGF0ZSA9PSBESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRElTQ09OTkVDVEVEKTsKLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gbVN0YXRlID09IENPTk5FQ1RFRCA/IE9LIDogTk9fSU5JVDsKLX0KLQotc3NpemVfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSNpZiAwCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmRpc2FibGUtbmV0IiwgdmFsdWUsIDApCi0gICAgICAgICAgICAmJiAoIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikgfHwgIXN0cmNtcCh2YWx1ZSwgIjEiKSkpIHsKLSAgICAgICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAiU2ltdWxhdGluZyB0aGF0IHRoZSBuZXR3b3JrIGlzIGRvd24uIik7Ci0gICAgICAgIGRpc2Nvbm5lY3RfbCgpOwotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAob2Zmc2V0ICE9IG1DdXJyZW50T2Zmc2V0KSB7Ci0gICAgICAgIEFTdHJpbmcgdG1wID0gbVVSSTsKLSAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gdG1wSGVhZGVycyA9IG1IZWFkZXJzOwotCi0gICAgICAgIGRpc2Nvbm5lY3RfbCgpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IGNvbm5lY3RfbCh0bXAuY19zdHIoKSwgJnRtcEhlYWRlcnMsIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1TdGF0ZSA9IFJFQURJTkc7Ci0KLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotCi0gICAgd2hpbGUgKG1TdGF0ZSA9PSBSRUFESU5HKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgaWYgKG1JT1Jlc3VsdCA8IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSU9SZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQpIHsKLSAgICAgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwotCi0gICAgICAgIC8vIFRoZSByZWFkIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgbUlPUmVzdWx0IGNvbnRhaW5zCi0gICAgICAgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobUlPUmVzdWx0LCBkZWxheVVzKTsKLQotICAgICAgICBtQ3VycmVudE9mZnNldCArPSBtSU9SZXN1bHQ7Ci0gICAgICAgIHJldHVybiBtSU9SZXN1bHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVSUk9SX0lPOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uUmVhZENvbXBsZXRlZChzc2l6ZV90IHNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUlPUmVzdWx0ID0gc2l6ZTsKLQotICAgIGlmIChtU3RhdGUgPT0gUkVBRElORykgewotICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Db250ZW50U2l6ZSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgICpzaXplID0gbUNvbnRlbnRTaXplOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi11aW50MzJfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpmbGFncygpIHsKLSAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpJbml0aWF0ZVJlYWQoCi0gICAgICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIG1lLT5pbml0aWF0ZVJlYWQoZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6aW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgbURlbGVnYXRlLT5pbml0aWF0ZVJlYWQoZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25EaXNjb25uZWN0Q29tcGxldGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClESVNDT05ORUNUSU5HKTsKLQotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICAvLyBtVVJJLmNsZWFyKCk7Ci0gICAgbUlPUmVzdWx0ID0gLUVOT1RDT05OOwotCi0gICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotc3A8RGVjcnlwdEhhbmRsZT4gQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewotICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7Ci0gICAgfQotCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgLyogTm90ZSBpZiByZWRpcmVjdCBvY2N1cnMsIG1VcmkgaXMgdGhlIHJlZGlyZWN0IHVyaSBpbnN0ZWFkIG9mIHRoZQotICAgICAgICAgKiBvcmlnaW5hbCBvbmUKLSAgICAgICAgICovCi0gICAgICAgIG1EZWNyeXB0SGFuZGxlID0gbURybU1hbmFnZXJDbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgICAgICBTdHJpbmc4KG1VUkkuY19zdHIoKSksIG1pbWUpOwotICAgIH0KLQotICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpnZXREcm1JbmZvKAotICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOwotICAgICpjbGllbnQgPSBtRHJtTWFuYWdlckNsaWVudDsKLX0KLQotU3RyaW5nOCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpnZXRVcmkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHJldHVybiBTdHJpbmc4KG1VUkkuY19zdHIoKSk7Ci19Ci0KLVN0cmluZzggQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHJldHVybiBtQ29udGVudFR5cGU7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Y2xlYXJEUk1TdGF0ZV9sKCkgewotICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKLSAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOwotICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtRGVjcnlwdEhhbmRsZSk7Ci0gICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtVVJJLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIlJlY29ubmVjdGluZy4uLiIpOwotICAgIHN0YXR1c190IGVyciA9IGNvbm5lY3RfbChtVVJJLmNfc3RyKCksICZtSGVhZGVycywgb2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIlJlY29ubmVjdCBmYWlsZWQgdy8gZXJyIDB4JTA4eCIsIGVycik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgcmV0dXJuIFNmRGVsZWdhdGU6OlVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0RhdGFVcmlTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9EYXRhVXJpU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmM2ZhMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0RhdGFVcmlTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpbmNsdWRlL0RhdGFVcmlTb3VyY2UuaD4KLQotI2luY2x1ZGUgPG5ldC9iYXNlL2RhdGFfdXJsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xldXJsL3NyYy9ndXJsLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EYXRhVXJpU291cmNlOjpEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSkgOgotICAgIG1EYXRhVXJpKHVyaSksCi0gICAgbUluaXRlZChOT19JTklUKSB7Ci0KLSAgICAvLyBDb3B5MTogY29uc3QgY2hhciAqdXJpIC0+IFN0cmluZzggbURhdGFVcmkuCi0gICAgc3RkOjpzdHJpbmcgbWltZVR5cGVTdHIsIHVudXNlZENoYXJzZXRTdHIsIGRhdGFTdHI7Ci0gICAgLy8gQ29weTI6IFN0cmluZzggbURhdGFVcmkgLT4gc3RkOjpzdHJpbmcKLSAgICBjb25zdCBib29sIHJldCA9IG5ldDo6RGF0YVVSTDo6UGFyc2UoCi0gICAgICAgICAgICBHVVJMKHN0ZDo6c3RyaW5nKG1EYXRhVXJpLnN0cmluZygpKSksCi0gICAgICAgICAgICAmbWltZVR5cGVTdHIsICZ1bnVzZWRDaGFyc2V0U3RyLCAmZGF0YVN0cik7Ci0gICAgLy8gQ29weTM6IHN0ZDo6c3RyaW5nIGRhdGFTdHIgLT4gQVN0cmluZyBtRGF0YQotICAgIG1EYXRhLnNldFRvKGRhdGFTdHIuZGF0YSgpLCBkYXRhU3RyLmxlbmd0aCgpKTsKLSAgICBtSW5pdGVkID0gcmV0ID8gT0sgOiBVTktOT1dOX0VSUk9SOwotCi0gICAgLy8gVGhlIGNocm9taXVtIGRhdGEgdXJsIGltcGxlbWVudGF0aW9uIGRlZmF1bHRzIHRvIHVzaW5nICJ0ZXh0L3BsYWluIgotICAgIC8vIGlmIG5vIG1pbWUgdHlwZSBpcyBzcGVjaWZpZWQuIFdlIHByZWZlciB0byBsZWF2ZSB0aGlzIHVuc3BlY2lmaWVkCi0gICAgLy8gaW5zdGVhZCwgc2luY2UgdGhlIG1pbWUgdHlwZSBpcyBzbmlmZmVkIGluIG1vc3QgY2FzZXMuCi0gICAgaWYgKG1pbWVUeXBlU3RyICE9ICJ0ZXh0L3BsYWluIikgewotICAgICAgICBtTWltZVR5cGUgPSBtaW1lVHlwZVN0ci5jX3N0cigpOwotICAgIH0KLX0KLQotc3NpemVfdCBEYXRhVXJpU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKm91dCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUluaXRlZCAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRlZDsKLSAgICB9Ci0KLSAgICBjb25zdCBvZmY2NF90IGxlbmd0aCA9IG1EYXRhLnNpemUoKTsKLSAgICBpZiAob2Zmc2V0ID49IGxlbmd0aCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyICpkYXRhQnVmID0gbURhdGEuY19zdHIoKTsKLSAgICBjb25zdCBzaXplX3QgYnl0ZXNUb0NvcHkgPQotICAgICAgICAgICAgb2Zmc2V0ICsgc2l6ZSA+PSBsZW5ndGggPyAobGVuZ3RoIC0gb2Zmc2V0KSA6IHNpemU7Ci0KLSAgICBpZiAoYnl0ZXNUb0NvcHkgPiAwKSB7Ci0gICAgICAgIG1lbWNweShvdXQsIGRhdGFCdWYgKyBvZmZzZXQsIGJ5dGVzVG9Db3B5KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnl0ZXNUb0NvcHk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OWY2ZGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi0jaW5jbHVkZSA8aW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL0RhdGFVcmlTb3VyY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1IVFRQQmFzZSAqY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncykgewotICAgIHJldHVybiBuZXcgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZShmbGFncyk7Ci19Ci0KLXN0YXR1c190IFVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgcmV0dXJuIENocm9taXVtSFRUUERhdGFTb3VyY2U6OlVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi1EYXRhU291cmNlICpjcmVhdGVEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSkgewotICAgIHJldHVybiBuZXcgRGF0YVVyaVNvdXJjZSh1cmkpOwotfQotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNDg3Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNocm9taXVtSFRUUERhdGFTb3VyY2VTdXBwb3J0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJzdXBwb3J0LmgiCi0KLSNpbmNsdWRlICJhbmRyb2lkL25ldC9hbmRyb2lkX25ldHdvcmtfbGlicmFyeV9pbXBsLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvY2VydF92ZXJpZmllci5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2Nvb2tpZV9tb25zdGVyLmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvaG9zdF9yZXNvbHZlci5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL3NzbF9jb25maWdfc2VydmljZS5oIgotI2luY2x1ZGUgIm5ldC9odHRwL2h0dHBfYXV0aF9oYW5kbGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJuZXQvaHR0cC9odHRwX2NhY2hlLmgiCi0jaW5jbHVkZSAibmV0L3Byb3h5L3Byb3h5X2NvbmZpZ19zZXJ2aWNlX2FuZHJvaWQuaCIKLQotI2luY2x1ZGUgImluY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggaW50ZXJmYWNlIGRlZmluZWQgaW4gSUF1ZGlvU2VydmljZS5haWRsCi1jbGFzcyBJQXVkaW9TZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvU2VydmljZSk7Ci0KLSAgICB2aXJ0dWFsIGludCB2ZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSkgPSAwOwotfTsKLQotY2xhc3MgQnBBdWRpb1NlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICBCcEF1ZGlvU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQXVkaW9TZXJ2aWNlPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCB2ZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgLy8gVGhlIHZlY3RvciBvZiBzdGQ6OnN0cmluZyB3ZSBnZXQgaXNuJ3QgcmVhbGx5IGEgdmVjdG9yIG9mIHN0cmluZ3MsCi0gICAgICAgIC8vIGJ1dCByYXRoZXIgYSB2ZWN0b3Igb2YgYmluYXJ5IGNlcnRpZmljYXRlIGRhdGEuIElmIHdlIHRyeSB0byBwYXNzCi0gICAgICAgIC8vIGl0IHRvIEphdmEgbGFuZ3VhZ2UgY29kZSBhcyBhIHN0cmluZywgaXQgZW5kcyB1cCBtYW5nbGVkIG9uIHRoZSBvdGhlcgotICAgICAgICAvLyBzaWRlLCBzbyBzZW5kIHRoZW0gYXMgYnl0ZXMgaW5zdGVhZC4KLSAgICAgICAgLy8gU2luY2Ugd2UgY2FuJ3Qgc2VuZCBhbiBhcnJheSBvZiBieXRlIGFycmF5cywgc2VuZCBhIHNpbmdsZSBhcnJheSwKLSAgICAgICAgLy8gd2hpY2ggd2lsbCBiZSBzcGxpdCBvdXQgYnkgdGhlIHJlY2lwaWVudC4KLQotICAgICAgICBpbnQgbnVtY2VydHMgPSBjZXJ0X2NoYWluLnNpemUoKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG51bWNlcnRzKTsKLSAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1jZXJ0czsgaSsrKSB7Ci0gICAgICAgICAgICB0b3RhbCArPSBjZXJ0X2NoYWluW2ldLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgYnl0ZXNpemUgPSB0b3RhbCArIG51bWNlcnRzICogNDsKLSAgICAgICAgdWludDhfdCAqYnl0ZXMgPSAodWludDhfdCopIG1hbGxvYyhieXRlc2l6ZSk7Ci0gICAgICAgIGlmICghYnl0ZXMpIHsKLSAgICAgICAgICAgIHJldHVybiA1OyAvLyBTU0xfSU5WQUxJRAotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCIlZCBjZXJ0czogJWQgLT4gJWQiLCBudW1jZXJ0cywgdG90YWwsIGJ5dGVzaXplKTsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1jZXJ0czsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGNlcnRzaXplID0gY2VydF9jaGFpbltpXS5zaXplKCk7Ci0gICAgICAgICAgICAvLyBzdG9yZSB0aGlzIGluIGEga25vd24gb3JkZXIsIHdoaWNoIGp1c3QgaGFwcGVucyB0byBtYXRjaCB0aGUgZGVmYXVsdAotICAgICAgICAgICAgLy8gYnl0ZSBvcmRlciBvZiBhIGphdmEgQnl0ZUJ1ZmZlcgotICAgICAgICAgICAgaW50MzJfdCBiaWdzaXplID0gaHRvbmwoY2VydHNpemUpOwotICAgICAgICAgICAgQUxPR1YoImNlcnQgJWQsIHNpemUgJWQiLCBpLCBjZXJ0c2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkoYnl0ZXMgKyBvZmZzZXQsICZiaWdzaXplLCBzaXplb2YoYmlnc2l6ZSkpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihiaWdzaXplKTsKLSAgICAgICAgICAgIG1lbWNweShieXRlcyArIG9mZnNldCwgY2VydF9jaGFpbltpXS5kYXRhKCksIGNlcnRzaXplKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBjZXJ0c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlQnl0ZUFycmF5KGJ5dGVzaXplLCBieXRlcyk7Ci0gICAgICAgIGZyZWUoYnl0ZXMpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoaG9zdG5hbWUuY19zdHIoKSkpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoYXV0aF90eXBlLmNfc3RyKCkpKTsKLQotICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgaWYgKHJlbW90ZSgpLT50cmFuc2FjdChJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLCBkYXRhLCAmcmVwbHkpICE9IE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgfHwgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKSA8IDAgfHwgcmVwbHkucmVhZEludDMyKCZyZXN1bHQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gNTsgLy8gU1NMX0lOVkFMSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1NlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1NlcnZpY2UiKTsKLQotCi1zdGF0aWMgTXV0ZXggZ05ldHdvcmtUaHJlYWRMb2NrOwotc3RhdGljIGJhc2U6OlRocmVhZCAqZ05ldHdvcmtUaHJlYWQgPSBOVUxMOwotc3RhdGljIHNjb3BlZF9yZWZwdHI8U2ZSZXF1ZXN0Q29udGV4dD4gZ1JlcUNvbnRleHQ7Ci1zdGF0aWMgc2NvcGVkX3B0cjxuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcj4gZ05ldHdvcmtDaGFuZ2VOb3RpZmllcjsKLQotYm9vbCBsb2dNZXNzYWdlSGFuZGxlcigKLSAgICAgICAgaW50IHNldmVyaXR5LAotICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICBpbnQgbGluZSwKLSAgICAgICAgc2l6ZV90IG1lc3NhZ2Vfc3RhcnQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBpbnQgYW5kcm9pZFNldmVyaXR5ID0gQU5EUk9JRF9MT0dfVkVSQk9TRTsKLSAgICBzd2l0Y2goc2V2ZXJpdHkpIHsKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19GQVRBTDoKLSAgICAgICAgYW5kcm9pZFNldmVyaXR5ID0gQU5EUk9JRF9MT0dfRkFUQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgbG9nZ2luZzo6TE9HX0VSUk9SX1JFUE9SVDoKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19FUlJPUjoKLSAgICAgICAgYW5kcm9pZFNldmVyaXR5ID0gQU5EUk9JRF9MT0dfRVJST1I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgbG9nZ2luZzo6TE9HX1dBUk5JTkc6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX1dBUk47Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX1ZFUkJPU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBhbmRyb2lkX3ByaW50TG9nKGFuZHJvaWRTZXZlcml0eSwgImNocm9taXVtLWxpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgICAgICAgICAgICAgIiVzOiVkOiAlcyIsIGZpbGUsIGxpbmUsIHN0ci5jX3N0cigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0cnVjdCBBdXRvUHJpb3JpdHlTYXZlciB7Ci0gICAgQXV0b1ByaW9yaXR5U2F2ZXIoKQotICAgICAgICA6IG1USUQoYW5kcm9pZEdldFRpZCgpKSwKLSAgICAgICAgICBtUHJldlByaW9yaXR5KGFuZHJvaWRHZXRUaHJlYWRQcmlvcml0eShtVElEKSkgewotICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkobVRJRCwgQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpOwotICAgIH0KLQotICAgIH5BdXRvUHJpb3JpdHlTYXZlcigpIHsKLSAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KG1USUQsIG1QcmV2UHJpb3JpdHkpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBwaWRfdCBtVElEOwotICAgIGludCBtUHJldlByaW9yaXR5OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQXV0b1ByaW9yaXR5U2F2ZXIpOwotfTsKLQotc3RhdGljIHZvaWQgSW5pdGlhbGl6ZU5ldHdvcmtUaHJlYWRJZk5lY2Vzc2FyeSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ05ldHdvcmtUaHJlYWRMb2NrKTsKLQotICAgIGlmIChnTmV0d29ya1RocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbnkgdGhyZWFkcyBzcGF3bmVkIGJ5IHRoZSBjaHJvbWl1bSBmcmFtZXdvcmsgYXJlCi0gICAgICAgIC8vIHJ1bm5pbmcgYXQgbm9ybWFsIHByaW9yaXR5IGluc3RlYWQgb2YgaW5oZXJpdGluZyB0aGlzIHRocmVhZCdzLgotICAgICAgICBBdXRvUHJpb3JpdHlTYXZlciBzYXZlcjsKLQotICAgICAgICBnTmV0d29ya1RocmVhZCA9IG5ldyBiYXNlOjpUaHJlYWQoIm5ldHdvcmsiKTsKLSAgICAgICAgYmFzZTo6VGhyZWFkOjpPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIG9wdGlvbnMubWVzc2FnZV9sb29wX3R5cGUgPSBNZXNzYWdlTG9vcDo6VFlQRV9JTzsKLSAgICAgICAgQ0hFQ0soZ05ldHdvcmtUaHJlYWQtPlN0YXJ0V2l0aE9wdGlvbnMob3B0aW9ucykpOwotCi0gICAgICAgIGdSZXFDb250ZXh0ID0gbmV3IFNmUmVxdWVzdENvbnRleHQ7Ci0KLSAgICAgICAgZ05ldHdvcmtDaGFuZ2VOb3RpZmllci5yZXNldChuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6Q3JlYXRlKCkpOwotCi0gICAgICAgIG5ldDo6QW5kcm9pZE5ldHdvcmtMaWJyYXJ5OjpSZWdpc3RlclNoYXJlZEluc3RhbmNlKAotICAgICAgICAgICAgICAgIG5ldyBTZk5ldHdvcmtMaWJyYXJ5KTsKLSAgICAgICAgbG9nZ2luZzo6U2V0TG9nTWVzc2FnZUhhbmRsZXIobG9nTWVzc2FnZUhhbmRsZXIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgTVlfTE9HSShjb25zdCBjaGFyICpzKSB7Ci0gICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAiJXMiLCBzKTsKLX0KLQotc3RhdGljIHZvaWQgTVlfTE9HVihjb25zdCBjaGFyICpzKSB7Ci0jaWYgIWRlZmluZWQoTE9HX05ERUJVRykgfHwgTE9HX05ERUJVRyA9PSAwCi0gICAgTE9HX1BSSShBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLCAiJXMiLCBzKTsKLSNlbmRpZgotfQotCi1TZk5ldExvZzo6U2ZOZXRMb2coKQotICAgIDogbU5leHRJRCgxKSB7Ci19Ci0KLXZvaWQgU2ZOZXRMb2c6OkFkZEVudHJ5KAotICAgICAgICBFdmVudFR5cGUgdHlwZSwKLSAgICAgICAgY29uc3QgYmFzZTo6VGltZVRpY2tzICZ0aW1lLAotICAgICAgICBjb25zdCBTb3VyY2UgJnNvdXJjZSwKLSAgICAgICAgRXZlbnRQaGFzZSBwaGFzZSwKLSAgICAgICAgRXZlbnRQYXJhbWV0ZXJzICpwYXJhbXMpIHsKLSNpZiAwCi0gICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIkFkZEVudHJ5IHRpbWU9JXMgdHlwZT0lcyBzb3VyY2U9JXMgcGhhc2U9JXNcbiIsCi0gICAgICAgICAgICAgICAgVGlja0NvdW50VG9TdHJpbmcodGltZSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICBFdmVudFR5cGVUb1N0cmluZyh0eXBlKSwKLSAgICAgICAgICAgICAgICBTb3VyY2VUeXBlVG9TdHJpbmcoc291cmNlLnR5cGUpLAotICAgICAgICAgICAgICAgIEV2ZW50UGhhc2VUb1N0cmluZyhwaGFzZSkpLmNfc3RyKCkpOwotI2VuZGlmCi19Ci0KLXVpbnQzMiBTZk5ldExvZzo6TmV4dElEKCkgewotICAgIHJldHVybiBtTmV4dElEKys7Ci19Ci0KLW5ldDo6TmV0TG9nOjpMb2dMZXZlbCBTZk5ldExvZzo6R2V0TG9nTGV2ZWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIExPR19CQVNJQzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotU2ZSZXF1ZXN0Q29udGV4dDo6U2ZSZXF1ZXN0Q29udGV4dCgpIHsKLSAgICBtVXNlckFnZW50ID0gTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCk7Ci0KLSAgICBzZXRfbmV0X2xvZyhuZXcgU2ZOZXRMb2coKSk7Ci0KLSAgICBzZXRfaG9zdF9yZXNvbHZlcigKLSAgICAgICAgbmV0OjpDcmVhdGVTeXN0ZW1Ib3N0UmVzb2x2ZXIoCi0gICAgICAgICAgICAgICAgbmV0OjpIb3N0UmVzb2x2ZXI6OmtEZWZhdWx0UGFyYWxsZWxpc20sCi0gICAgICAgICAgICAgICAgTlVMTCAvKiByZXNvbHZlcl9wcm9jICovLAotICAgICAgICAgICAgICAgIG5ldF9sb2coKSkpOwotCi0gICAgc2V0X3NzbF9jb25maWdfc2VydmljZSgKLSAgICAgICAgbmV0OjpTU0xDb25maWdTZXJ2aWNlOjpDcmVhdGVTeXN0ZW1TU0xDb25maWdTZXJ2aWNlKCkpOwotCi0gICAgbVByb3h5Q29uZmlnU2VydmljZSA9IG5ldyBuZXQ6OlByb3h5Q29uZmlnU2VydmljZUFuZHJvaWQ7Ci0KLSAgICBzZXRfcHJveHlfc2VydmljZShuZXQ6OlByb3h5U2VydmljZTo6Q3JlYXRlV2l0aG91dFByb3h5UmVzb2x2ZXIoCi0gICAgICAgIG1Qcm94eUNvbmZpZ1NlcnZpY2UsIG5ldF9sb2coKSkpOwotCi0gICAgc2V0X2h0dHBfdHJhbnNhY3Rpb25fZmFjdG9yeShuZXcgbmV0OjpIdHRwQ2FjaGUoCi0gICAgICAgICAgICBob3N0X3Jlc29sdmVyKCksCi0gICAgICAgICAgICBuZXcgbmV0OjpDZXJ0VmVyaWZpZXIoKSwKLSAgICAgICAgICAgIGRuc3JyX3Jlc29sdmVyKCksCi0gICAgICAgICAgICBkbnNfY2VydF9jaGVja2VyKCksCi0gICAgICAgICAgICBwcm94eV9zZXJ2aWNlKCksCi0gICAgICAgICAgICBzc2xfY29uZmlnX3NlcnZpY2UoKSwKLSAgICAgICAgICAgIG5ldDo6SHR0cEF1dGhIYW5kbGVyRmFjdG9yeTo6Q3JlYXRlRGVmYXVsdChob3N0X3Jlc29sdmVyKCkpLAotICAgICAgICAgICAgbmV0d29ya19kZWxlZ2F0ZSgpLAotICAgICAgICAgICAgbmV0X2xvZygpLAotICAgICAgICAgICAgTlVMTCkpOyAgLy8gYmFja2VuZF9mYWN0b3J5Ci0KLSAgICBzZXRfY29va2llX3N0b3JlKG5ldyBuZXQ6OkNvb2tpZU1vbnN0ZXIoTlVMTCwgTlVMTCkpOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyAmU2ZSZXF1ZXN0Q29udGV4dDo6R2V0VXNlckFnZW50KGNvbnN0IEdVUkwgJnVybCkgY29uc3QgewotICAgIHJldHVybiBtVXNlckFnZW50OwotfQotCi1zdGF0dXNfdCBTZlJlcXVlc3RDb250ZXh0Ojp1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Qcm94eUNvbmZpZ0xvY2spOwotCi0gICAgaWYgKGhvc3QgPT0gTlVMTCB8fCAqaG9zdCA9PSAnXDAnKSB7Ci0gICAgICAgIE1ZX0xPR1YoInVwZGF0ZVByb3h5Q29uZmlnIE5VTEwiKTsKLQotICAgICAgICBzdGQ6OnN0cmluZyBwcm94eTsKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhMaXN0OwotICAgICAgICBtUHJveHlDb25maWdTZXJ2aWNlLT5VcGRhdGVQcm94eVNldHRpbmdzKHByb3h5LCBleExpc3QpOwotICAgIH0gZWxzZSB7Ci0jaWYgIWRlZmluZWQoTE9HX05ERUJVRykgfHwgTE9HX05ERUJVRyA9PSAwCi0gICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywKLSAgICAgICAgICAgICAgICAidXBkYXRlUHJveHlDb25maWcgJXM6JWQsIGV4Y2x1ZGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci0jZW5kaWYKLQotICAgICAgICBzdGQ6OnN0cmluZyBwcm94eSA9IFN0cmluZ1ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KS5jX3N0cigpOwotICAgICAgICBzdGQ6OnN0cmluZyBleExpc3QgPSBleGNsdXNpb25MaXN0OwotICAgICAgICBtUHJveHlDb25maWdTZXJ2aWNlLT5VcGRhdGVQcm94eVNldHRpbmdzKHByb3h5LCBleExpc3QpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotU2ZOZXR3b3JrTGlicmFyeTo6U2ZOZXR3b3JrTGlicmFyeSgpIHt9Ci0KLVNmTmV0d29ya0xpYnJhcnk6OlZlcmlmeVJlc3VsdCBTZk5ldHdvcmtMaWJyYXJ5OjpWZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNlcnRfY2hhaW4sCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSkgewotCi0gICAgc3A8SUJpbmRlcj4gYmluZGVyID0KLSAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigiYXVkaW8iKSk7Ci0gICAgaWYgKGJpbmRlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJUaHJlYWQgY2Fubm90IGNvbm5lY3QgdG8gdGhlIGF1ZGlvIHNlcnZpY2UiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcDxJQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvU2VydmljZT4oYmluZGVyKTsKLSAgICAgICAgaW50IGNvZGUgPSBzZXJ2aWNlLT52ZXJpZnlYNTA5Q2VydENoYWluKGNlcnRfY2hhaW4sIGhvc3RuYW1lLCBhdXRoX3R5cGUpOwotICAgICAgICBBTE9HVigidmVyaWZpZWQ6ICVkIiwgY29kZSk7Ci0gICAgICAgIGlmIChjb2RlID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkVSSUZZX09LOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMikgeyAvLyBTU0xfSURNSVNNQVRDSAotICAgICAgICAgICAgcmV0dXJuIFZFUklGWV9CQURfSE9TVE5BTUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAzKSB7IC8vIFNTTF9VTlRSVVNURUQKLSAgICAgICAgICAgIHJldHVybiBWRVJJRllfTk9fVFJVU1RFRF9ST09UOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWRVJJRllfSU5WT0NBVElPTl9FUlJPUjsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotU2ZEZWxlZ2F0ZTo6U2ZEZWxlZ2F0ZSgpCi0gICAgOiBtT3duZXIoTlVMTCksCi0gICAgICBtVVJMUmVxdWVzdChOVUxMKSwKLSAgICAgIG1SZWFkQnVmZmVyKG5ldyBuZXQ6OklPQnVmZmVyV2l0aFNpemUoODE5MikpLAotICAgICAgbU51bUJ5dGVzUmVhZCgwKSwKLSAgICAgIG1OdW1CeXRlc1RvdGFsKDApLAotICAgICAgbURhdGFEZXN0aW5hdGlvbihOVUxMKSwKLSAgICAgIG1BdEVPUyhmYWxzZSkgewotICAgIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKTsKLX0KLQotU2ZEZWxlZ2F0ZTo6flNmRGVsZWdhdGUoKSB7Ci0gICAgQ0hFQ0sobVVSTFJlcXVlc3QgPT0gTlVMTCk7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgU2ZEZWxlZ2F0ZTo6VXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKTsKLQotICAgIHJldHVybiBnUmVxQ29udGV4dC0+dXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6c2V0T3duZXIoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqb3duZXIpIHsKLSAgICBtT3duZXIgPSBvd25lcjsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpzZXRVSUQodWlkX3QgdWlkKSB7Ci0gICAgZ1JlcUNvbnRleHQtPnNldFVJRCh1aWQpOwotfQotCi1ib29sIFNmRGVsZWdhdGU6OmdldFVJRCh1aWRfdCAqdWlkKSBjb25zdCB7Ci0gICAgcmV0dXJuIGdSZXFDb250ZXh0LT5nZXRVSUQodWlkKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPblJlY2VpdmVkUmVkaXJlY3QoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGNvbnN0IEdVUkwgJm5ld191cmwsIGJvb2wgKmRlZmVyX3JlZGlyZWN0KSB7Ci0gICAgTVlfTE9HVigiT25SZWNlaXZlZFJlZGlyZWN0Iik7Ci0gICAgbU93bmVyLT5vblJlZGlyZWN0KG5ld191cmwuc3BlYygpLmNfc3RyKCkpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uQXV0aFJlcXVpcmVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OkF1dGhDaGFsbGVuZ2VJbmZvICphdXRoX2luZm8pIHsKLSAgICBNWV9MT0dWKCJPbkF1dGhSZXF1aXJlZCIpOwotCi0gICAgaW5oZXJpdGVkOjpPbkF1dGhSZXF1aXJlZChyZXF1ZXN0LCBhdXRoX2luZm8pOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6U1NMQ2VydFJlcXVlc3RJbmZvICpjZXJ0X3JlcXVlc3RfaW5mbykgewotICAgIE1ZX0xPR1YoIk9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQiKTsKLQotICAgIGluaGVyaXRlZDo6T25DZXJ0aWZpY2F0ZVJlcXVlc3RlZChyZXF1ZXN0LCBjZXJ0X3JlcXVlc3RfaW5mbyk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25TU0xDZXJ0aWZpY2F0ZUVycm9yKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgY2VydF9lcnJvciwgbmV0OjpYNTA5Q2VydGlmaWNhdGUgKmNlcnQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk9uU1NMQ2VydGlmaWNhdGVFcnJvciBjZXJ0X2Vycm9yPSVkXG4iLCBjZXJ0X2Vycm9yKTsKLQotICAgIGluaGVyaXRlZDo6T25TU0xDZXJ0aWZpY2F0ZUVycm9yKHJlcXVlc3QsIGNlcnRfZXJyb3IsIGNlcnQpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uR2V0Q29va2llcyhuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpIHsKLSAgICBNWV9MT0dWKCJPbkdldENvb2tpZXMiKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPblNldENvb2tpZSgKLSAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29va2llX2xpbmUsCi0gICAgICAgIGNvbnN0IG5ldDo6Q29va2llT3B0aW9ucyAmb3B0aW9ucywKLSAgICAgICAgYm9vbCBibG9ja2VkX2J5X3BvbGljeSkgewotICAgIE1ZX0xPR1YoIk9uU2V0Q29va2llIik7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25SZXNwb25zZVN0YXJ0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KSB7Ci0gICAgaWYgKHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpICE9IG5ldDo6VVJMUmVxdWVzdFN0YXR1czo6U1VDQ0VTUykgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzICVkIGFuZCBvc19lcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5vc19lcnJvcigpKS5jX3N0cigpKTsKLQotICAgICAgICBkZWxldGUgbVVSTFJlcXVlc3Q7Ci0gICAgICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgICAgICBtT3duZXItPm9uQ29ubmVjdGlvbkZhaWxlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1SYW5nZVJlcXVlc3RlZCAmJiByZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSAhPSAyMDYpIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJXZSByZXF1ZXN0ZWQgYSBjb250ZW50IHJhbmdlLCBidXQgc2VydmVyIGRpZG4ndCAiCi0gICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IHRoYXQuIChyZXNwb25kZWQgd2l0aCAlZCkiLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgICAgICBtVVJMUmVxdWVzdCA9IE5VTEw7Ci0KLSAgICAgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25GYWlsZWQoLUVQSVBFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoKHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpIC8gMTAwKSAhPSAyKSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHJlc3BvbmRlZCB3aXRoIGh0dHAgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKLSAgICAgICAgbVVSTFJlcXVlc3QgPSBOVUxMOwotCi0gICAgICAgIG1Pd25lci0+b25Db25uZWN0aW9uRmFpbGVkKEVSUk9SX0lPKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE1ZX0xPR1YoIk9uUmVzcG9uc2VTdGFydGVkIik7Ci0KLSAgICBzdGQ6OnN0cmluZyBoZWFkZXJzOwotICAgIHJlcXVlc3QtPkdldEFsbFJlc3BvbnNlSGVhZGVycygmaGVhZGVycyk7Ci0KLSAgICBNWV9MT0dWKFN0cmluZ1ByaW50ZigicmVzcG9uc2UgaGVhZGVyczogJXMiLCBoZWFkZXJzLmNfc3RyKCkpLmNfc3RyKCkpOwotCi0gICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGU7Ci0gICAgcmVxdWVzdC0+R2V0UmVzcG9uc2VIZWFkZXJCeU5hbWUoIkNvbnRlbnQtVHlwZSIsICZjb250ZW50VHlwZSk7Ci0KLSAgICBtT3duZXItPm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKAotICAgICAgICAgICAgcmVxdWVzdC0+R2V0RXhwZWN0ZWRDb250ZW50U2l6ZSgpLCBjb250ZW50VHlwZS5jX3N0cigpKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPblJlYWRDb21wbGV0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgYnl0ZXNfcmVhZCkgewotICAgIGlmIChieXRlc19yZWFkID09IC0xKSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiT25SZWFkQ29tcGxldGVkLCByZWFkIGZhaWxlZCwgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKEVSUk9SX0lPKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE1ZX0xPR1YoU3RyaW5nUHJpbnRmKCJPblJlYWRDb21wbGV0ZWQsIHJlYWQgJWQgYnl0ZXMiLCBieXRlc19yZWFkKS5jX3N0cigpKTsKLQotICAgIGlmIChieXRlc19yZWFkIDwgMCkgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlJlYWQgZmFpbGVkIHcvIHN0YXR1cyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKEVSUk9SX0lPKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7Ci0gICAgICAgIG1BdEVPUyA9IHRydWU7Ci0gICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKG1OdW1CeXRlc1JlYWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0hFQ0tfR1QoYnl0ZXNfcmVhZCwgMCk7Ci0gICAgQ0hFQ0tfTEUobU51bUJ5dGVzUmVhZCArIGJ5dGVzX3JlYWQsIG1OdW1CeXRlc1RvdGFsKTsKLQotICAgIG1lbWNweSgodWludDhfdCAqKW1EYXRhRGVzdGluYXRpb24gKyBtTnVtQnl0ZXNSZWFkLAotICAgICAgICAgICBtUmVhZEJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICBieXRlc19yZWFkKTsKLQotICAgIG1OdW1CeXRlc1JlYWQgKz0gYnl0ZXNfcmVhZDsKLQotICAgIHJlYWRNb3JlKHJlcXVlc3QpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OnJlYWRNb3JlKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCkgewotICAgIHdoaWxlIChtTnVtQnl0ZXNSZWFkIDwgbU51bUJ5dGVzVG90YWwpIHsKLSAgICAgICAgc2l6ZV90IGNvcHkgPSBtTnVtQnl0ZXNUb3RhbCAtIG1OdW1CeXRlc1JlYWQ7Ci0gICAgICAgIGlmIChjb3B5ID4gbVJlYWRCdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgY29weSA9IG1SZWFkQnVmZmVyLT5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbjsKLSAgICAgICAgaWYgKHJlcXVlc3QtPlJlYWQobVJlYWRCdWZmZXIsIGNvcHksICZuKSkgewotICAgICAgICAgICAgTVlfTE9HVihTdHJpbmdQcmludGYoIlJlYWQgJWQgYnl0ZXMgZGlyZWN0bHkuIiwgbikuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIENIRUNLX0xFKChzaXplX3QpbiwgY29weSk7Ci0KLSAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKW1EYXRhRGVzdGluYXRpb24gKyBtTnVtQnl0ZXNSZWFkLAotICAgICAgICAgICAgICAgICAgIG1SZWFkQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgbik7Ci0KLSAgICAgICAgICAgIG1OdW1CeXRlc1JlYWQgKz0gbjsKLQotICAgICAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIG1BdEVPUyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNWV9MT0dWKCJyZWFkTW9yZSBwZW5kaW5nIHJlYWQiKTsKLQotICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpICE9IG5ldDo6VVJMUmVxdWVzdFN0YXR1czo6SU9fUEVORElORykgewotICAgICAgICAgICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXJlY3QgcmVhZCBmYWlsZWQgdy8gc3RhdHVzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKEVSUk9SX0lPKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKG1OdW1CeXRlc1JlYWQpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OmluaXRpYXRlQ29ubmVjdGlvbigKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBHVVJMIHVybCh1cmkpOwotCi0gICAgTWVzc2FnZUxvb3AgKmxvb3AgPSBnTmV0d29ya1RocmVhZC0+bWVzc2FnZV9sb29wKCk7Ci0gICAgbG9vcC0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBOZXdSdW5uYWJsZUZ1bmN0aW9uKAotICAgICAgICAgICAgICAgICZTZkRlbGVnYXRlOjpPbkluaXRpYXRlQ29ubmVjdGlvbldyYXBwZXIsCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICB1cmwsCi0gICAgICAgICAgICAgICAgaGVhZGVycywKLSAgICAgICAgICAgICAgICBvZmZzZXQpKTsKLQotfQotCi0vLyBzdGF0aWMKLXZvaWQgU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyKAotICAgICAgICBTZkRlbGVnYXRlICptZSwgR1VSTCB1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IG9mZnNldCkgewotICAgIG1lLT5vbkluaXRpYXRlQ29ubmVjdGlvbih1cmwsIGhlYWRlcnMsIG9mZnNldCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6b25Jbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgIGNvbnN0IEdVUkwgJnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmV4dHJhLAotICAgICAgICBvZmY2NF90IG9mZnNldCkgewotICAgIENIRUNLKG1VUkxSZXF1ZXN0ID09IE5VTEwpOwotCi0gICAgbVVSTFJlcXVlc3QgPSBuZXcgbmV0OjpVUkxSZXF1ZXN0KHVybCwgdGhpcyk7Ci0gICAgbUF0RU9TID0gZmFsc2U7Ci0KLSAgICBtUmFuZ2VSZXF1ZXN0ZWQgPSBmYWxzZTsKLQotICAgIGlmIChvZmZzZXQgIT0gMCB8fCBleHRyYSAhPSBOVUxMKSB7Ci0gICAgICAgIG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzIGhlYWRlcnMgPQotICAgICAgICAgICAgbVVSTFJlcXVlc3QtPmV4dHJhX3JlcXVlc3RfaGVhZGVycygpOwotCi0gICAgICAgIGlmIChvZmZzZXQgIT0gMCkgewotICAgICAgICAgICAgaGVhZGVycy5BZGRIZWFkZXJGcm9tU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlJhbmdlOiBieXRlcz0lbGxkLSIsIG9mZnNldCkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIG1SYW5nZVJlcXVlc3RlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0cmEgIT0gTlVMTCkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYS0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBBU3RyaW5nIHM7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZXh0cmEtPmtleUF0KGkpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChleHRyYS0+dmFsdWVBdChpKS5zdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBoZWFkZXJzLkFkZEhlYWRlckZyb21TdHJpbmcocy5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1VUkxSZXF1ZXN0LT5TZXRFeHRyYVJlcXVlc3RIZWFkZXJzKGhlYWRlcnMpOwotICAgIH0KLQotICAgIG1VUkxSZXF1ZXN0LT5zZXRfY29udGV4dChnUmVxQ29udGV4dCk7Ci0KLSAgICBtVVJMUmVxdWVzdC0+U3RhcnQoKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZURpc2Nvbm5lY3QoKSB7Ci0gICAgTWVzc2FnZUxvb3AgKmxvb3AgPSBnTmV0d29ya1RocmVhZC0+bWVzc2FnZV9sb29wKCk7Ci0gICAgbG9vcC0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBOZXdSdW5uYWJsZUZ1bmN0aW9uKAotICAgICAgICAgICAgICAgICZTZkRlbGVnYXRlOjpPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIsIHRoaXMpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVEaXNjb25uZWN0V3JhcHBlcihTZkRlbGVnYXRlICptZSkgewotICAgIG1lLT5vbkluaXRpYXRlRGlzY29ubmVjdCgpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVEaXNjb25uZWN0KCkgewotICAgIGlmIChtVVJMUmVxdWVzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtVVJMUmVxdWVzdC0+Q2FuY2VsKCk7Ci0KLSAgICBkZWxldGUgbVVSTFJlcXVlc3Q7Ci0gICAgbVVSTFJlcXVlc3QgPSBOVUxMOwotCi0gICAgbU93bmVyLT5vbkRpc2Nvbm5lY3RDb21wbGV0ZSgpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OmluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOwotICAgIGxvb3AtPlBvc3RUYXNrKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKLSAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZVJlYWRXcmFwcGVyLCB0aGlzLCBkYXRhLCBzaXplKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBTZkRlbGVnYXRlOjpPbkluaXRpYXRlUmVhZFdyYXBwZXIoCi0gICAgICAgIFNmRGVsZWdhdGUgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIG1lLT5vbkluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpvbkluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIENIRUNLKG1VUkxSZXF1ZXN0ICE9IE5VTEwpOwotCi0gICAgbU51bUJ5dGVzUmVhZCA9IDA7Ci0gICAgbU51bUJ5dGVzVG90YWwgPSBzaXplOwotICAgIG1EYXRhRGVzdGluYXRpb24gPSBkYXRhOwotCi0gICAgaWYgKG1BdEVPUykgewotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZCgwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlYWRNb3JlKG1VUkxSZXF1ZXN0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1YTFkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTVVBQT1JUX0hfCi0KLSNkZWZpbmUgU1VQUE9SVF9IXwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJuZXQvYmFzZS9uZXRfbG9nLmgiCi0jaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0X2NvbnRleHQuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9hbmRyb2lkX25ldHdvcmtfbGlicmFyeS5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2lvX2J1ZmZlci5oIgotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIG5ldCB7Ci0gICAgc3RydWN0IFByb3h5Q29uZmlnU2VydmljZUFuZHJvaWQ7Ci19OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTZk5ldExvZyA6IHB1YmxpYyBuZXQ6Ok5ldExvZyB7Ci0gICAgU2ZOZXRMb2coKTsKLQotICAgIHZpcnR1YWwgdm9pZCBBZGRFbnRyeSgKLSAgICAgICAgICAgIEV2ZW50VHlwZSB0eXBlLAotICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZVRpY2tzICZ0aW1lLAotICAgICAgICAgICAgY29uc3QgU291cmNlICZzb3VyY2UsCi0gICAgICAgICAgICBFdmVudFBoYXNlIHBoYXNlLAotICAgICAgICAgICAgRXZlbnRQYXJhbWV0ZXJzICpwYXJhbXMpOwotCi0gICAgdmlydHVhbCB1aW50MzIgTmV4dElEKCk7Ci0gICAgdmlydHVhbCBMb2dMZXZlbCBHZXRMb2dMZXZlbCgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHVpbnQzMiBtTmV4dElEOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZOZXRMb2cpOwotfTsKLQotc3RydWN0IFNmUmVxdWVzdENvbnRleHQgOiBwdWJsaWMgbmV0OjpVUkxSZXF1ZXN0Q29udGV4dCB7Ci0gICAgU2ZSZXF1ZXN0Q29udGV4dCgpOwotCi0gICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyAmR2V0VXNlckFnZW50KGNvbnN0IEdVUkwgJnVybCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLXByaXZhdGU6Ci0gICAgTXV0ZXggbVByb3h5Q29uZmlnTG9jazsKLQotICAgIHN0ZDo6c3RyaW5nIG1Vc2VyQWdlbnQ7Ci0gICAgbmV0OjpQcm94eUNvbmZpZ1NlcnZpY2VBbmRyb2lkICptUHJveHlDb25maWdTZXJ2aWNlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZSZXF1ZXN0Q29udGV4dCk7Ci19OwotCi0vLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBodHRwcyBzdXBwb3J0LCB3ZSBkb24ndCByZWFsbHkgdmVyaWZ5IGNlcnRpZmljYXRlcywKLS8vIHdlIGFjY2VwdCBhbnl0aGluZy4uLgotc3RydWN0IFNmTmV0d29ya0xpYnJhcnkgOiBwdWJsaWMgbmV0OjpBbmRyb2lkTmV0d29ya0xpYnJhcnkgewotICAgIFNmTmV0d29ya0xpYnJhcnkoKTsKLQotICAgIHZpcnR1YWwgVmVyaWZ5UmVzdWx0IFZlcmlmeVg1MDlDZXJ0Q2hhaW4oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNlcnRfY2hhaW4sCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXV0aF90eXBlKTsKLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZk5ldHdvcmtMaWJyYXJ5KTsKLX07Ci0KLXN0cnVjdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOwotCi1zdHJ1Y3QgU2ZEZWxlZ2F0ZSA6IHB1YmxpYyBuZXQ6OlVSTFJlcXVlc3Q6OkRlbGVnYXRlIHsKLSAgICBTZkRlbGVnYXRlKCk7Ci0gICAgdmlydHVhbCB+U2ZEZWxlZ2F0ZSgpOwotCi0gICAgdm9pZCBpbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHZvaWQgaW5pdGlhdGVEaXNjb25uZWN0KCk7Ci0gICAgdm9pZCBpbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBzZXRPd25lcihDaHJvbWl1bUhUVFBEYXRhU291cmNlICptT3duZXIpOwotCi0gICAgLy8gR2V0cyB0aGUgVUlEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MKLSAgICBib29sIGdldFVJRCh1aWRfdCAqdWlkKSBjb25zdDsKLQotICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25SZWNlaXZlZFJlZGlyZWN0KAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBjb25zdCBHVVJMICZuZXdfdXJsLCBib29sICpkZWZlcl9yZWRpcmVjdCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25BdXRoUmVxdWlyZWQoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6QXV0aENoYWxsZW5nZUluZm8gKmF1dGhfaW5mbyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25DZXJ0aWZpY2F0ZVJlcXVlc3RlZCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpTU0xDZXJ0UmVxdWVzdEluZm8gKmNlcnRfcmVxdWVzdF9pbmZvKTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblNTTENlcnRpZmljYXRlRXJyb3IoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBjZXJ0X2Vycm9yLCBuZXQ6Olg1MDlDZXJ0aWZpY2F0ZSAqY2VydCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25HZXRDb29raWVzKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgYm9vbCBibG9ja2VkX2J5X3BvbGljeSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25TZXRDb29raWUoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29va2llX2xpbmUsCi0gICAgICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCi0gICAgICAgICAgICBib29sIGJsb2NrZWRfYnlfcG9saWN5KTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblJlc3BvbnNlU3RhcnRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uUmVhZENvbXBsZXRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBieXRlc19yZWFkKTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBEZWxlZ2F0ZSBpbmhlcml0ZWQ7Ci0KLSAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptT3duZXI7Ci0KLSAgICBuZXQ6OlVSTFJlcXVlc3QgKm1VUkxSZXF1ZXN0OwotICAgIHNjb3BlZF9yZWZwdHI8bmV0OjpJT0J1ZmZlcldpdGhTaXplPiBtUmVhZEJ1ZmZlcjsKLQotICAgIHNpemVfdCBtTnVtQnl0ZXNSZWFkOwotICAgIHNpemVfdCBtTnVtQnl0ZXNUb3RhbDsKLSAgICB2b2lkICptRGF0YURlc3RpbmF0aW9uOwotCi0gICAgYm9vbCBtUmFuZ2VSZXF1ZXN0ZWQ7Ci0gICAgYm9vbCBtQXRFT1M7Ci0KLSAgICB2b2lkIHJlYWRNb3JlKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBPbkluaXRpYXRlQ29ubmVjdGlvbldyYXBwZXIoCi0gICAgICAgICAgICBTZkRlbGVnYXRlICptZSwKLSAgICAgICAgICAgIEdVUkwgdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIoU2ZEZWxlZ2F0ZSAqbWUpOwotCi0gICAgc3RhdGljIHZvaWQgT25Jbml0aWF0ZVJlYWRXcmFwcGVyKAotICAgICAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgb25Jbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgICAgICBjb25zdCBHVVJMICZ1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHZvaWQgb25Jbml0aWF0ZURpc2Nvbm5lY3QoKTsKLSAgICB2b2lkIG9uSW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmRGVsZWdhdGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBTVVBQT1JUX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cF9zdHViLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4YTg3OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBib29sIGdGaXJzdCA9IHRydWU7Ci1zdGF0aWMgdm9pZCAqZ0hhbmRsZTsKLXN0YXRpYyBNdXRleCBnTGliTXV0ZXg7Ci0KLUhUVFBCYXNlICooKmdMaWJfY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSkodWludDMyX3QgZmxhZ3MpOwotRGF0YVNvdXJjZSAqKCpnTGliX2NyZWF0ZURhdGFVcmlTb3VyY2UpKGNvbnN0IGNoYXIgKnVyaSk7Ci0KLXN0YXR1c190ICgqZ0xpYl9VcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcpKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1zdGF0aWMgYm9vbCBsb2FkX2xpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdMaWJNdXRleCk7Ci0gICAgdm9pZCAqc3ltOwotCi0gICAgaWYgKCFnRmlyc3QpIHsKLSAgICAgICAgcmV0dXJuIChnSGFuZGxlICE9IE5VTEwpOwotICAgIH0KLQotICAgIGdGaXJzdCA9IGZhbHNlOwotCi0gICAgZ0hhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cC5zbyIsIFJUTERfTk9XKTsKLSAgICBpZiAoZ0hhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzeW0gPSBkbHN5bShnSGFuZGxlLCAiY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSIpOwotICAgIGlmIChzeW0gPT0gTlVMTCkgewotICAgICAgICBnSGFuZGxlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBnTGliX2NyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UgPSAoSFRUUEJhc2UgKigqKSh1aW50MzJfdCkpc3ltOwotCi0gICAgc3ltID0gZGxzeW0oZ0hhbmRsZSwgImNyZWF0ZURhdGFVcmlTb3VyY2UiKTsKLSAgICBpZiAoc3ltID09IE5VTEwpIHsKLSAgICAgICAgZ0hhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ0xpYl9jcmVhdGVEYXRhVXJpU291cmNlID0gKERhdGFTb3VyY2UgKigqKShjb25zdCBjaGFyICopKXN5bTsKLQotICAgIHN5bSA9IGRsc3ltKGdIYW5kbGUsICJVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWciKTsKLSAgICBpZiAoc3ltID09IE5VTEwpIHsKLSAgICAgICAgZ0hhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ0xpYl9VcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcgPQotICAgICAgICAoc3RhdHVzX3QgKCopKGNvbnN0IGNoYXIgKiwgaW50MzJfdCwgY29uc3QgY2hhciAqKSlzeW07Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotSFRUUEJhc2UgKmNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpIHsKLSAgICBpZiAoIWxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBnTGliX2NyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOwotfQotCi1zdGF0dXNfdCBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIGlmICghbG9hZF9saWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwKCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBnTGliX1VwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi1EYXRhU291cmNlICpjcmVhdGVEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSkgewotICAgIGlmICghbG9hZF9saWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdMaWJfY3JlYXRlRGF0YVVyaVNvdXJjZSh1cmkpOwotfQotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKaW5kZXggZmZhNjRmOS4uYWZiMDBhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5tawpAQCAtMyw3ICszLDggQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotICAgICAgU29mdEFBQzIuY3BwCisgICAgICBTb2Z0QUFDMi5jcHAgXAorICAgICAgRHJjUHJlc01vZGVXcmFwLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCkBAIC0xNyw2ICsxOCw4IEBACiAKIExPQ0FMX0NGTEFHUyA6PQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYkZyYXVuaG9mZXJBQUMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YWQ2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBMT0dfVEFHICJTb2Z0QUFDMl9EcmNXcmFwcGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyNkZWZpbmUgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisKKyNkZWZpbmUgR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMIDY0CisjZGVmaW5lIE1BWF9UQVJHRVRfTEVWRUwgNjQKKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworCisgICAgLyogRGF0YSBmcm9tIHN0cmVhbUluZm8uICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1TdHJlYW1QUkwgPSAtMTsKKyAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSAtMTsKKyAgICBtU3RyZWFtTnJBQUNDaGFuID0gMDsKKyAgICBtU3RyZWFtTnJPdXRDaGFuID0gMDsKKworICAgIC8qIERlc2lyZWQgdmFsdWVzIChzZXQgYnkgdXNlcikuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1EZXNUYXJnZXQgPSAtMTsKKyAgICBtRGVzQXR0RmFjdG9yID0gMDsKKyAgICBtRGVzQm9vc3RGYWN0b3IgPSAwOworICAgIG1EZXNIZWF2eSA9IDA7CisKKyAgICBtRW5jb2RlclRhcmdldCA9IC0xOworCisgICAgLyogVmFsdWVzIGZyb20gbGFzdCB0aW1lLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgZGVzaXJlZCB2YWx1ZXMgKi8KKyAgICBtTGFzdFRhcmdldCA9IC0xOworICAgIG1MYXN0QXR0RmFjdG9yID0gMDsKKyAgICBtTGFzdEJvb3N0RmFjdG9yID0gMDsKKyAgICBtTGFzdEhlYXZ5ID0gMDsKK30KKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6fkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSkKK3sKKyAgICBtSGFuZGxlRGVjb2RlciA9IGhhbmRsZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyogcFN0cmVhbUluZm8pCit7CisgICAgYXNzZXJ0KHBTdHJlYW1JbmZvKTsKKworICAgIGlmIChtU3RyZWFtUFJMICE9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2KSB7CisgICAgICAgIG1TdHJlYW1QUkwgPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldjsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1Byb2dSZWZMZXYgaXMgJWRcbiIsIG1TdHJlYW1QUkwpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1EUkNQcmVzTW9kZSAhPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGUpIHsKKyAgICAgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJlc01vZGUgaXMgJWRcbiIsIG1TdHJlYW1EUkNQcmVzTW9kZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiAhPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGFhY051bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJBQUNDaGFuKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuICE9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJPdXRDaGFuID0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogbnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1Ock91dENoYW4pOworI2VuZGlmCisgICAgfQorCisKKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuPG1TdHJlYW1OckFBQ0NoYW4pIHsKKyAgICAgICAgbUlzRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIChtU3RyZWFtTnJPdXRDaGFuID09IDEpKSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIG1TdHJlYW1Ock91dENoYW4gPT0gMil7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUOgorICAgICAgICBtRGVzVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0F0dEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0Jvb3N0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlk6CisgICAgICAgIG1EZXNIZWF2eSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVDoKKyAgICAgICAgbUVuY29kZXJUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6dXBkYXRlKCkKK3sKKyAgICAvLyBHZXQgRGF0YSBmcm9tIERlY29kZXIKKyAgICBpbnQgcHJvZ1JlZkxldmVsID0gbVN0cmVhbVBSTDsKKyAgICBpbnQgZHJjUHJlc01vZGUgPSBtU3RyZWFtRFJDUHJlc01vZGU7CisKKyAgICAvLyBieSBkZWZhdWx0LCBkbyBhcyBkZXNpcmVkCisgICAgaW50IG5ld1RhcmdldCAgICAgICAgID0gbURlc1RhcmdldDsKKyAgICBpbnQgbmV3QXR0RmFjdG9yICAgICAgPSBtRGVzQXR0RmFjdG9yOworICAgIGludCBuZXdCb29zdEZhY3RvciAgICA9IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbmV3SGVhdnkgICAgICAgICAgPSBtRGVzSGVhdnk7CisKKyAgICBpZiAobURhdGFVcGRhdGUpIHsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrCisgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgTUFYX1RBUkdFVF9MRVZFTCl7CisgICAgICAgICAgICBtRGVzVGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsgIC8vIGxpbWl0IHRhcmdldCBsZXZlbCB0byAtMTYgZEIgb3IgYmVsb3cKKyAgICAgICAgICAgIG5ld1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZywgY2FsY3VsYXRlZCBzY2FsaW5nIG9mIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYXMgbGl0dGxlIGNvbXByZXNzaW9uIGFzIHBvc3NpYmxlICovCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0IDwgbURlc1RhcmdldCkgeyAvLyBpZiBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGNGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FsY0ZhY3Rvcl9ub3JtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAuMGYgPCBjYWxjRmFjdG9yX25vcm0gPCAxLjBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3Rvcl9ub3JtID0gKGZsb2F0KShtRGVzVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1FbmNvZGVyVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yID0gKGludCkoY2FsY0ZhY3Rvcl9ub3JtKjEyNy4wZik7IC8vIDAgPD0gY2FsY0ZhY3RvciA8IDEyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGNGYWN0b3IgaXMgdGhlIGxvd2VyIGxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gKGNhbGNGYWN0b3I+bmV3QXR0RmFjdG9yKSA/IGNhbGNGYWN0b3IgOiBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IEF0dEZhY3RvciB3aWxsIGJlIGFsd2F5cyA9IGNhbGNGYWN0b3IsIGFzIGl0IGlzIHNldCB0byAwIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGxldmVsID4gbUVuY29kZXJUYXJnZXQgPiBQUkwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0PDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQjogbGlnaHQgRFJDIG9ubHkgbmVlZGVkIGlmIHdlIHBlcmZvcm0gZG93bm1peGluZworICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBoYW5kbGUgb3RoZXIgdXNlZCBlbmNvZGVyIHRhcmdldCBsZXZlbHMKKworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgaXMgb25seSBzcGVjaWZpZWQgZm9yIG1heC4gNS4xIGNoYW5uZWxzCisgICAgICAgICAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiA+IDYpIHsKKyAgICAgICAgICAgICAgICBkcmNQcmVzTW9kZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoZHJjUHJlc01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7IC8vIGF0IGxlYXN0LCB1c2UgbGlnaHQgY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldCA8IDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gUHJlc2VudGF0aW9uIG1vZGUgMSBhbmQgMiBhY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0OgorICAgICAgICAgICAgLy8gRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgKERWQik7IFNwZWNpZmljYXRpb24gZm9yIHRoZSB1c2Ugb2YgVmlkZW8gYW5kIEF1ZGlvIENvZGluZworICAgICAgICAgICAgLy8gaW4gQnJvYWRjYXN0aW5nIEFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUgTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0sCisgICAgICAgICAgICAvLyBzZWN0aW9uIEMuNS40LiwgIkRlY29kaW5nIiwgYW5kIFRhYmxlIEMuMzMKKyAgICAgICAgICAgIC8vIElTTyBEUkMgICAgICAgICAgICAtPiBuZXdIZWF2eSA9IDAgIChVc2UgbGlnaHQgY29tcHJlc3Npb24sIE1QRUctc3R5bGUpCisgICAgICAgICAgICAvLyBDb21wcmVzc2lvbl92YWx1ZSAgLT4gbmV3SGVhdnkgPSAxICAoVXNlIGhlYXZ5IGNvbXByZXNzaW9uLCBEVkItc3R5bGUpCisgICAgICAgICAgICAvLyBzY2FsaW5nIHJlc3RyaWN0ZWQgLT4gbmV3QXR0RmFjdG9yID0gMTI3CisKKyAgICAgICAgICAgIGNhc2UgMTogLy8gcHJlc2VudGF0aW9uIG1vZGUgMSwgTGlnaHQ6LTMxL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDIsIExpZ2h0Oi0yMy9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNNb25vRG93bm1peCkgeyAvLyBpZiBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoKCkKKyAgICAgICAgfSAvLyBpZiAobUVuY29kZXJUYXJnZXQgID09IEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCkKKworICAgICAgICAvLyBzYW5pdHkgYWdhaW4KKyAgICAgICAgaWYgKG5ld0hlYXZ5ID09IDEpIHsKKyAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yPTEyNzsgLy8gbm90IHJlYWxseSBuZWVkZWQgYXMgdGhlIHNhbWUgd291bGQgYmUgZG9uZSBieSB0aGUgZGVjb2RlciBhbnl3YXkKKyAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGVjb2RlcgorICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1MYXN0VGFyZ2V0KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgbmV3VGFyZ2V0KTsKKyAgICAgICAgICAgIG1MYXN0VGFyZ2V0ID0gbmV3VGFyZ2V0OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtRGVzVGFyZ2V0KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIHRhcmdldCBsZXZlbCB0byAlZCAoZnJvbSAlZClcbiIsIG5ld1RhcmdldCwgbURlc1RhcmdldCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgdGFyZ2V0IGxldmVsIHRvICVkXG4iLCBuZXdUYXJnZXQpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1MYXN0QXR0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgbmV3QXR0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtRGVzQXR0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGF0dGVudWF0aW9uIGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsIG5ld0F0dEZhY3RvciwgbURlc0F0dEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkXG4iLCBuZXdBdHRGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbUxhc3RCb29zdEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19CT09TVF9GQUNUT1IsIG5ld0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSBuZXdCb29zdEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtRGVzQm9vc3RGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYm9vc3QgZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yLCBtRGVzQm9vc3RGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGJvb3N0IGZhY3RvciB0byAlZFxuIiwgbmV3Qm9vc3RGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3SGVhdnkgIT0gbUxhc3RIZWF2eSkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgbmV3SGVhdnkpOworICAgICAgICAgICAgbUxhc3RIZWF2eSA9IG5ld0hlYXZ5OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1EZXNIZWF2eSkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSwgbURlc0hlYXZ5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZFxuIiwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIGNvbmZpZzogdGd0X2xldjogJTNkLCBjdXQ6ICUzZCwgYm9vc3Q6ICUzZCwgaGVhdnk6ICVkXG4iLCBuZXdUYXJnZXQsCisgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yLCBuZXdCb29zdEZhY3RvciwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIG1EYXRhVXBkYXRlID0gZmFsc2U7CisKKyAgICB9IC8vIGlmIChtRGF0YVVwZGF0ZSkKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjZjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUICAgICAgICAgPSAweDAwMDAsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiAgICAgPSAweDAwMDEsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SICAgPSAweDAwMDIsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkgICAgICAgICAgPSAweDAwMDMsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUICAgICAgICAgPSAweDAwMDQKK30gRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNOworCisKK2NsYXNzIENEcmNQcmVzTW9kZVdyYXBwZXIgeworcHVibGljOgorICAgIENEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB+Q0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIHZvaWQgc2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpOworICAgIHZvaWQgc2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpOworICAgIHZvaWQgc3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyopOworICAgIHZvaWQgdXBkYXRlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtSGFuZGxlRGVjb2RlcjsKKyAgICBpbnQgbURlc1RhcmdldDsKKyAgICBpbnQgbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBtRGVzSGVhdnk7CisKKyAgICBpbnQgbUVuY29kZXJUYXJnZXQ7CisKKyAgICBpbnQgbUxhc3RUYXJnZXQ7CisgICAgaW50IG1MYXN0QXR0RmFjdG9yOworICAgIGludCBtTGFzdEJvb3N0RmFjdG9yOworICAgIGludCBtTGFzdEhlYXZ5OworCisgICAgU0NIQVIgbVN0cmVhbVBSTDsKKyAgICBTQ0hBUiBtU3RyZWFtRFJDUHJlc01vZGU7CisgICAgSU5UIG1TdHJlYW1OckFBQ0NoYW47CisgICAgSU5UIG1TdHJlYW1Ock91dENoYW47CisKKyAgICBib29sIG1Jc0Rvd25taXg7CisgICAgYm9vbCBtSXNNb25vRG93bm1peDsKKyAgICBib29sIG1Jc1N0ZXJlb0Rvd25taXg7CisKKyAgICBib29sIG1EYXRhVXBkYXRlOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggMWIyMGNiYi4uNDA5MjVmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTE0LDI3ICsxNCwzNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJTb2Z0QUFDMiIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEFBQzIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJTb2Z0QUFDMi5oIgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKKyNpbmNsdWRlIDxtYXRoLmg+CisKICNkZWZpbmUgRklMRVJFQURfTUFYX0xBWUVSUyAyCiAKICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCA2NCAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KLSNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA2ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgLTEgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KIC8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCiAjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgogI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01Nyw5ICs2NSw5IEBACiAgICAgICBtU3RyZWFtSW5mbyhOVUxMKSwKICAgICAgIG1Jc0FEVFMoZmFsc2UpLAogICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCisgICAgICBtT3V0cHV0QnVmZmVyQ291bnQoMCksCiAgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAotICAgICAgbUFuY2hvclRpbWVVcygwKSwKLSAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAorICAgICAgbUxhc3RJbkhlYWRlcihOVUxMKSwKICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgewogICAgIGluaXRQb3J0cygpOwogICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CkBAIC02Nyw2ICs3NSw3IEBACiAKIFNvZnRBQUMyOjp+U29mdEFBQzIoKSB7CiAgICAgYWFjRGVjb2Rlcl9DbG9zZShtQUFDRGVjb2Rlcik7CisgICAgZGVsZXRlIG1PdXRwdXREZWxheVJpbmdCdWZmZXI7CiB9CiAKIHZvaWQgU29mdEFBQzI6OmluaXRQb3J0cygpIHsKQEAgLTExMSw2ICsxMjAsNyBAQAogfQogCiBzdGF0dXNfdCBTb2Z0QUFDMjo6aW5pdERlY29kZXIoKSB7CisgICAgQUxPR1YoImluaXREZWNvZGVyKCkiKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOwogICAgIG1BQUNEZWNvZGVyID0gYWFjRGVjb2Rlcl9PcGVuKFRUX01QNF9BRElGLCAvKiBudW0gbGF5ZXJzICovIDEpOwogICAgIGlmIChtQUFDRGVjb2RlciAhPSBOVUxMKSB7CkBAIC0xMTksMzYgKzEyOSw3MyBAQAogICAgICAgICAgICAgc3RhdHVzID0gT0s7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbURlY29kZXJIYXNEYXRhID0gZmFsc2U7CiAKLSAgICAvLyBmb3Igc3RyZWFtcyB0aGF0IGNvbnRhaW4gbWV0YWRhdGEsIHVzZSB0aGUgbW9iaWxlIHByb2ZpbGUgRFJDIHNldHRpbmdzIHVubGVzcyBvdmVycmlkZGVuCi0gICAgLy8gYnkgcGxhdGZvcm0gcHJvcGVydGllczoKKyAgICBtRW5kT2ZJbnB1dCA9IGZhbHNlOworICAgIG1FbmRPZk91dHB1dCA9IGZhbHNlOworICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSA9IDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCAqIGtOdW1EZWxheUJsb2Nrc01heDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyID0gbmV3IHNob3J0W21PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplXTsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkID0gMDsKKworICAgIGlmIChtQUFDRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJBQUMgZGVjb2RlciBpcyBudWxsLiBUT0RPOiBDYW4gbm90IGNhbGwgYWFjRGVjb2Rlcl9TZXRQYXJhbSBpbiB0aGUgZm9sbG93aW5nIGNvZGUiKTsKKyAgICB9CisKKyAgICAvL2FhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUsIDApOworCisgICAgLy9pbml0IERSQyB3cmFwcGVyCisgICAgbURyY1dyYXAuc2V0RGVjb2RlckhhbmRsZShtQUFDRGVjb2Rlcik7CisgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisKKyAgICAvLyBmb3Igc3RyZWFtcyB0aGF0IGNvbnRhaW4gbWV0YWRhdGEsIHVzZSB0aGUgbW9iaWxlIHByb2ZpbGUgRFJDIHNldHRpbmdzIHVubGVzcyBvdmVycmlkZGVuIGJ5IHBsYXRmb3JtIHByb3BlcnRpZXMKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhlIERSQyBzZXR0aW5ncyBkZXBlbmRpbmcgb24gYXVkaW8gb3V0cHV0IGRldmljZSB0eXBlIChIRE1JLCBsb2Fkc3BlYWtlciwgaGVhZHBob25lKQogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAvLyAgKiBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTAorICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQKICAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCwgdmFsdWUsIE5VTEwpKSB7CiAgICAgICAgIHVuc2lnbmVkIHJlZkxldmVsID0gYXRvaSh2YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCBvZiAlZCBpbnN0ZWFkIG9mICVkIiwKLSAgICAgICAgICAgICAgICByZWZMZXZlbCwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCByZWZMZXZlbCk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIG9mICVkIGluc3RlYWQgb2YgJWQiLCByZWZMZXZlbCwKKyAgICAgICAgICAgICAgICBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULCByZWZMZXZlbCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOwogICAgIH0KLSAgICAvLyAgKiBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUgorICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SCiAgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9DVVQsIHZhbHVlLCBOVUxMKSkgewogICAgICAgICB1bnNpZ25lZCBjdXQgPSBhdG9pKHZhbHVlKTsKLSAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SIG9mICVkIGluc3RlYWQgb2YgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY3V0LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCk7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBjdXQpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYXR0ZW51YXRpb24gZmFjdG9yIG9mICVkIGluc3RlYWQgb2YgJWQiLCBjdXQsCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCBjdXQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKICAgICB9Ci0gICAgLy8gICogQUFDX0RSQ19CT09TVF9GQUNUT1IgKG5vdGU6IG5vIGRlZmF1bHQsIHVzaW5nIGN1dCkKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SCiAgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9CT09TVCwgdmFsdWUsIE5VTEwpKSB7CiAgICAgICAgIHVuc2lnbmVkIGJvb3N0ID0gYXRvaSh2YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiBvZiAlZCIsIGJvb3N0KTsKLSAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX0RSQ19CT09TVF9GQUNUT1IsIGJvb3N0KTsKKyAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGJvb3N0IGZhY3RvciBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgYm9vc3QsCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwgYm9vc3QpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfQk9PU1RfRkFDVE9SLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKTsKKyAgICB9CisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9IRUFWWSwgdmFsdWUsIE5VTEwpKSB7CisgICAgICAgIHVuc2lnbmVkIGhlYXZ5ID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNyaWVkIERSQyBoZWF2eSBjb21wcmVzc2lvbiBzd2l0Y2ggb2YgJWQgaW5zdGVhZCBvZiAlZCIsIGhlYXZ5LAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSwgaGVhdnkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZKTsKKyAgICB9CisgICAgLy8gRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwsIHZhbHVlLCBOVUxMKSkgeworICAgICAgICB1bnNpZ25lZCBlbmNvZGVyUmVmTGV2ZWwgPSBhdG9pKHZhbHVlKTsKKyAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGVuY29kZXItc2lkZSBEUkMgcmVmZXJlbmNlIGxldmVsIG9mICVkIGluc3RlYWQgb2YgJWQiLAorICAgICAgICAgICAgICAgIGVuY29kZXJSZWZMZXZlbCwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCwgZW5jb2RlclJlZkxldmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpOwogICAgIH0KIAogICAgIHJldHVybiBzdGF0dXM7CkBAIC0yMzEsNyArMjc4LDcgQEAKIAogT01YX0VSUk9SVFlQRSBTb2Z0QUFDMjo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7Ci0gICAgc3dpdGNoIChpbmRleCkgeworICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQpAQCAtMjY3LDYgKzMxNCw3MSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjUHJlc2VudGF0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFICphYWNQcmVzUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ1BSRVNFTlRBVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICAvLyBmb3IgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG9mIHRoZSBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgc3RydWN0dXJlLAorICAgICAgICAgICAgLy8gYSB2YWx1ZSBvZiAtMSBpbXBsaWVzIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNldCBieSB0aGUgYXBwbGljYXRpb246CisgICAgICAgICAgICAvLyAgIG5NYXhPdXRwdXRDaGFubmVscyAgICAgdXNlcyBkZWZhdWx0IHBsYXRmb3JtIHByb3BlcnRpZXMsIHNlZSBjb25maWd1cmVEb3dubWl4KCkKKyAgICAgICAgICAgIC8vICAgbkRyY0N1dCAgICAgICAgICAgICAgICB1c2VzIGRlZmF1bHQgcGxhdGZvcm0gcHJvcGVydGllcywgc2VlIGluaXREZWNvZGVyKCkKKyAgICAgICAgICAgIC8vICAgbkRyY0Jvb3N0ICAgICAgICAgICAgICAgIGlkZW0KKyAgICAgICAgICAgIC8vICAgbkhlYXZ5Q29tcHJlc3Npb24gICAgICAgIGlkZW0KKyAgICAgICAgICAgIC8vICAgblRhcmdldFJlZmVyZW5jZUxldmVsICAgIGlkZW0KKyAgICAgICAgICAgIC8vICAgbkVuY29kZWRUYXJnZXRMZXZlbCAgICAgIGlkZW0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHMgPj0gMCkgeworICAgICAgICAgICAgICAgIGludCBtYXg7CisgICAgICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVscyA+PSA4KSB7IG1heCA9IDg7IH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHMgPj0gNikgeyBtYXggPSA2OyB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzID49IDIpIHsgbWF4ID0gMjsgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyAtMSBvciAwOiBkaXNhYmxlIGRvd25taXgsICAxOiBtb25vCisgICAgICAgICAgICAgICAgICAgIG1heCA9IGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVsczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuTWF4T3V0cHV0Q2hhbm5lbHM9JWQiLCBtYXgpOworICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgbWF4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdXBkYXRlRHJjV3JhcHBlciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5EcmNCb29zdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRHJjQm9vc3Q9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QpOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5EcmNCb29zdCk7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRHJjQ3V0PSVkIiwgYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCk7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCk7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24gPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkhlYXZ5Q29tcHJlc3Npb249JWQiLCBhYWNQcmVzUGFyYW1zLT5uSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlksCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5UYXJnZXRSZWZlcmVuY2VMZXZlbD0lZCIsIGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRW5jb2RlZFRhcmdldExldmVsID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5FbmNvZGVkVGFyZ2V0TGV2ZWw9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRW5jb2RlZFRhcmdldExldmVsKTsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRW5jb2RlZFRhcmdldExldmVsKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uUENNTGltaXRlckVuYWJsZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChhYWNQcmVzUGFyYW1zLT5uUENNTGltaXRlckVuYWJsZSAhPSAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXBkYXRlRHJjV3JhcHBlcikgeworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMjg4LDE5ICs0MDAsMTAwIEBACiAgICAgcmV0dXJuIG1JbnB1dEJ1ZmZlckNvdW50ID4gMDsKIH0KIAotdm9pZCBTb2Z0QUFDMjo6bWF5YmVDb25maWd1cmVEb3dubWl4KCkgY29uc3QgewotICAgIGlmIChtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgPiAyKSB7Ci0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgaWYgKCEocHJvcGVydHlfZ2V0KCJtZWRpYS5hYWNfNTFfb3V0cHV0X2VuYWJsZWQiLCB2YWx1ZSwgTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkpKSB7Ci0gICAgICAgICAgICBBTE9HSSgiRG93bm1peGluZyBtdWx0aWNoYW5uZWwgQUFDIHRvIHN0ZXJlbyIpOwotICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9PVVRQVVRfQ0hBTk5FTFMsIDIpOwotICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzID0gMjsKLSAgICAgICAgfQordm9pZCBTb2Z0QUFDMjo6Y29uZmlndXJlRG93bm1peCgpIGNvbnN0IHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKCEocHJvcGVydHlfZ2V0KCJtZWRpYS5hYWNfNTFfb3V0cHV0X2VuYWJsZWQiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkpIHsKKyAgICAgICAgQUxPR0koImxpbWl0aW5nIHRvIHN0ZXJlbyBvdXRwdXQiKTsKKyAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTLCAyKTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIGRlY29kZXIgY3JlYXRlcyBhIDUuMSBjaGFubmVsIGRvd25taXggc2lnbmFsCisgICAgICAgIC8vIGZvciBzZXZlbiBhbmQgZWlnaHQgY2hhbm5lbCBpbnB1dCBzdHJlYW1zLiBUbyBlbmFibGUgNi4xIGFuZCA3LjEgY2hhbm5lbCBvdXRwdXQKKyAgICAgICAgLy8gdXNlIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgLTEpCiAgICAgfQogfQogCi12b2lkIFNvZnRBQUMyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Citib29sIFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworICAgIGlmIChudW1TYW1wbGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8IG51bVNhbXBsZXMpIHsKKyAgICAgICAgQUxPR0UoIlJJTkcgQlVGRkVSIFdPVUxEIE9WRVJGTE9XIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUKKyAgICAgICAgICAgICYmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgKyBudW1TYW1wbGVzKSkgeworICAgICAgICAvLyBmYXN0ZXIgbWVtY29weSBsb29wIHdpdGhvdXQgY2hlY2tzLCBpZiB0aGUgcHJlY29uZGl0aW9ucyBhbGxvdyB0aGlzCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MrK10gPSBzYW1wbGVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInNsb3cgU29mdEFBQzI6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3NdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkICs9IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDMyX3QgU29mdEFBQzI6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisKKyAgICBpZiAobnVtU2FtcGxlcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQpIHsKKyAgICAgICAgQUxPR0UoIlJJTkcgQlVGRkVSIFdPVUxEIFVOREVSUlVOIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKyBudW1TYW1wbGVzIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplCisgICAgICAgICAgICAmJiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIDwgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmFzdGVyIG1lbWNvcHkgbG9vcCB3aXRob3V0IGNoZWNrcywgaWYgdGhlIHByZWNvbmRpdGlvbnMgYWxsb3cgdGhpcworICAgICAgICBpZiAoc2FtcGxlcyAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcysrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICs9IG51bVNhbXBsZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJzbG93IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKCkiKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvc107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCAtPSBudW1TYW1wbGVzOworICAgIHJldHVybiBudW1TYW1wbGVzOworfQorCitpbnQzMl90IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworfQorCitpbnQzMl90IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSB7CisgICAgcmV0dXJuIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplIC0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworfQorCisKK3ZvaWQgU29mdEFBQzI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzEyLDI2NiArNTA1LDQ3MyBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCi0gICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOworICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtRW5kT2ZJbnB1dCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgICAgICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIGluQnVmZmVyWzBdID0gaGVhZGVyLT5wQnVmZmVyICsgaGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIG1FbmRPZklucHV0ID0gKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IDA7CiAKLSAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9Ci0gICAgICAgICAgICBhYWNEZWNvZGVyX0NvbmZpZ1JhdyhtQUFDRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgIShpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZpcnN0IGJ1ZmZlciBzaG91bGQgaGF2ZSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyBzZXQiKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpICE9IDApIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKIAotICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShoZWFkZXIpOwotCi0gICAgICAgIC8vIE9ubHkgc2VuZCBvdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2VkIGV2ZW50IGlmIGJvdGggc2FtcGxlIHJhdGUKLSAgICAgICAgLy8gYW5kIG51bUNoYW5uZWxzIGFyZSB2YWxpZC4KLSAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICYmIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgewotICAgICAgICAgICAgbWF5YmVDb25maWd1cmVEb3dubWl4KCk7Ci0gICAgICAgICAgICBBTE9HSSgiSW5pdGlhbGx5IGNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkIEh6LCAlZCBjaGFubmVscyIsCi0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKLQotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKLQotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmIChtRGVjb2Rlckhhc0RhdGEpIHsKLSAgICAgICAgICAgICAgICAvLyBmbHVzaCBvdXQgdGhlIGRlY29kZXIncyBkZWxheWVkIGRhdGEgYnkgY2FsbGluZyBEZWNvZGVGcmFtZQotICAgICAgICAgICAgICAgIC8vIG9uZSBtb3JlIHRpbWUsIHdpdGggdGhlIEFBQ0RFQ19GTFVTSCBmbGFnIHNldAotICAgICAgICAgICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CisgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CiAKICAgICAgICAgICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KLSAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uQWxsb2NMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0ZMVVNIKTsKLSAgICAgICAgICAgICAgICBtRGVjb2Rlckhhc0RhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9Db25maWdSYXcobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CiAKICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0NvbmZpZ1JhdyBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihpbnQxNl90KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBuZXZlciBzdWJtaXR0ZWQgYW55IGRhdGEgdG8gdGhlIGRlY29kZXIsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBmbHVzaCBvdXQKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7IC8vIGZha2UgaW5jcmVhc2Ugb2Ygb3V0cHV0QnVmZmVyQ291bnQgdG8ga2VlcCB0aGUgY291bnRlcnMgYWxpZ25lZAorCisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBjb25maWd1cmVEb3dubWl4KCk7CisgICAgICAgICAgICAgICAgLy8gT25seSBzZW5kIG91dCBwb3J0IHNldHRpbmdzIGNoYW5nZWQgZXZlbnQgaWYgYm90aCBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgICAgIC8vIGFuZCBudW1DaGFubmVscyBhcmUgdmFsaWQuCisgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICYmIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiSW5pdGlhbGx5IGNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkIEh6LCAlZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNBRFRTKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKKyAgICAgICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KKyAgICAgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKIAotICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOwotICAgICAgICBpZiAobUlzQURUUykgewotICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCi0gICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PwotCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLQotICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgNykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCi0gICAgICAgICAgICAgICAgICAgICAgIkdvdCAlbGQgYnl0ZXMuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwotICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwotICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKLQotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPQotICAgICAgICAgICAgICAgICAgICAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls0XSA8PCAzKQotICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzVdID4+IDUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgYWFjX2ZyYW1lX2xlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlbGQgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA8IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGRhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZXZlbiB0aGUgQURUUyBoZWFkZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICVkIGJ5dGVzLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZHRzSGVhZGVyU2l6ZSA9IChwcm90ZWN0aW9uQWJzZW50ID8gNyA6IDkpOworICAgICAgICAgICAgICAgICAgICBib29sIHByb3RlY3Rpb25BYnNlbnQgPSAoYWR0c0hlYWRlclsxXSAmIDEpOwogCi0gICAgICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKFVDSEFSICopYWR0c0hlYWRlciArIGFkdHNIZWFkZXJTaXplOwotICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNF0gPDwgMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNV0gPj4gNSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlZCBieXRlcywgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEFEVFMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSAoVUNIQVIgKilhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsIEVSUk9SX01BTEZPUk1FRCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYnVmZmVyIHNpemUgYW5kIHRpbWUgc3RhbXAKKyAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuYWRkKGluQnVmZmVyTGVuZ3RoWzBdKTsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RJbkhlYWRlciAhPSBpbkhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5hZGQoaW5IZWFkZXItPm5UaW1lU3RhbXApOworICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gaW5IZWFkZXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IG1CdWZmZXJUaW1lc3RhbXBzLnRvcCgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGltZSArPSBtU3RyZWFtSW5mby0+YWFjU2FtcGxlc1BlckZyYW1lICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuYWRkKGN1cnJlbnRUaW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBpbkhlYWRlcjsKKyAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5hZGQoaW5IZWFkZXItPm5UaW1lU3RhbXApOworICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplcy5hZGQoaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKLSAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgLy8gRmlsbCBhbmQgZGVjb2RlCisgICAgICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07CiAKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsCi0gICAgICAgICAgICAgICAgICAgICAgIEVSUk9SX01BTEZPUk1FRCwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBJTlQgcHJldlNhbXBsZVJhdGUgPSBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIElOVCBwcmV2TnVtQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CiAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlsbCBhbmQgZGVjb2RlCi0gICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8SU5UX1BDTSAqPigKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOwotCi0gICAgICAgIGJ5dGVzVmFsaWRbMF0gPSBpbkJ1ZmZlckxlbmd0aFswXTsKLQotICAgICAgICBpbnQgcHJldlNhbXBsZVJhdGUgPSBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKLSAgICAgICAgaW50IHByZXZOdW1DaGFubmVscyA9IG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKLQotICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFM7Ci0gICAgICAgIHdoaWxlIChieXRlc1ZhbGlkWzBdID4gMCAmJiBkZWNvZGVyRXJyID09IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTKSB7CiAgICAgICAgICAgICBhYWNEZWNvZGVyX0ZpbGwobUFBQ0RlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNWYWxpZCk7Ci0gICAgICAgICAgICBtRGVjb2Rlckhhc0RhdGEgPSB0cnVlOwogCi0gICAgICAgICAgICBkZWNvZGVyRXJyID0gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkFsbG9jTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7CisgICAgICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgICAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKyAgICAgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOwogCi0gICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJOb3QgZW5vdWdoIGJpdHMsIGJ5dGVzVmFsaWQgJWQiLCBieXRlc1ZhbGlkWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBudW1PdXRCeXRlcyA9Ci0gICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwotCi0gICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spIHsKICAgICAgICAgICAgIFVJTlQgaW5CdWZmZXJVc2VkTGVuZ3RoID0gaW5CdWZmZXJMZW5ndGhbMF0gLSBieXRlc1ZhbGlkWzBdOwogICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gaW5CdWZmZXJVc2VkTGVuZ3RoOwogICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gaW5CdWZmZXJVc2VkTGVuZ3RoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkLCBzdWJzdGl0dXRpbmcgc2lsZW5jZSIsCi0gICAgICAgICAgICAgICAgICBkZWNvZGVyRXJyKTsKIAotICAgICAgICAgICAgbWVtc2V0KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwgMCwgbnVtT3V0Qnl0ZXMpOworICAgICAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVycjsKKyAgICAgICAgICAgIGludCBudW1Mb29wcyA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gcmluZ2J1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgotICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgIGludCBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzOworICAgICAgICAgICAgICAgIGRlY29kZXJFcnIgPSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7CiAKLSAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19UUERFQ19DTEVBUl9CVUZGRVIsIDEpOworICAgICAgICAgICAgICAgIG51bUNvbnN1bWVkID0gbVN0cmVhbUluZm8tPm51bVRvdGFsQnl0ZXMgLSBudW1Db25zdW1lZDsKKyAgICAgICAgICAgICAgICBudW1Mb29wcysrOwogCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbURlY29kZWRTaXplcy5hZGQobnVtQ29uc3VtZWQpOworCisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChieXRlc1ZhbGlkWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImJ5dGVzVmFsaWRbMF0gIT0gMCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNpemVfdCBudW1PdXRCeXRlcyA9CisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiQUFDIGRlY29kZXIgcmV0dXJuZWQgZXJyb3IgMHglNC40eCwgc3Vic3RpdHV0aW5nIHNpbGVuY2UiLCBkZWNvZGVyRXJyKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQodG1wT3V0QnVmZmVyLCAwLCBudW1PdXRCeXRlcyk7IC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdworCisgICAgICAgICAgICAgICAgICAgIGlmICghb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciBhbiBlcnJvciwgcmVwbGFjZSB0aGUgbGFzdCBlbnRyeSBpbiBtQnVmZmVyU2l6ZXMgd2l0aCB0aGUgc3VtIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IDxudW1Mb29wcz4gZW50cmllcyBmcm9tIG1EZWNvZGVkU2l6ZXMgdG8gcmVzeW5jaHJvbml6ZSB0aGUgaW4vb3V0IGxpc3RzLgorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuICs9IG1EZWNvZGVkU2l6ZXMuaXRlbUF0KG1EZWNvZGVkU2l6ZXMuc2l6ZSgpIC0gbnVtTG9vcHMgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuYWRkKG4pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQUFDKy9lQUFDKyBzdHJlYW1zIGNhbiBiZSBzaWduYWxsZWQgaW4gdHdvIHdheXM6IGVpdGhlciBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCisgICAgICAgICAgICAgICAgICogcmF0ZSBzeXN0ZW0gYW5kIHRoZSBzYW1wbGluZyByYXRlIGluIHRoZSBmaW5hbCBvdXRwdXQgaXMgYWN0dWFsbHkKKyAgICAgICAgICAgICAgICAgKiBkb3VibGVkIGNvbXBhcmVkIHdpdGggdGhlIGNvcmUgQUFDIGRlY29kZXIgc2FtcGxpbmcgcmF0ZS4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIEV4cGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBleHBsaWNpdGx5IGRlZmluaW5nIFNCUiBhdWRpbyBvYmplY3QKKyAgICAgICAgICAgICAgICAgKiB0eXBlIGluIHRoZSBiaXRzdHJlYW0uIEltcGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBlbWJlZGRpbmcKKyAgICAgICAgICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKKyAgICAgICAgICAgICAgICAgKiByZXF1aXJlcyBhbiBBQUMgZGVjb2RlciB0byBwZXJmb3JtIHByZS1jaGVja3Mgb24gYWN0dWFsIGF1ZGlvIGZyYW1lcy4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcworICAgICAgICAgICAgICAgICAqIEFBQysvZUFBQysgdW50aWwgdGhlIGZpcnN0IGRhdGEgZnJhbWUgaXMgZGVjb2RlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPD0gMiB8fCBtT3V0cHV0QnVmZmVyQ291bnQgPiAxKSB7IC8vIFRPRE86IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICE9IHByZXZTYW1wbGVSYXRlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgIT0gcHJldk51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2TnVtQ2hhbm5lbHMsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyICYmIGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgfHwgIW1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiSW52YWxpZCBBQUMgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXIgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJpbkhlYWRlci0+bkZpbGxlZExlbiA9ICVkIiwgaW5IZWFkZXIgPyBpbkhlYWRlci0+bkZpbGxlZExlbiA6IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8gPSBOVUxMOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgaW50MzJfdCBvdXRwdXREZWxheSA9IG1TdHJlYW1JbmZvLT5vdXRwdXREZWxheSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgICAgICBpZiAoIW1FbmRPZklucHV0ICYmIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIDwgb3V0cHV0RGVsYXkpIHsKKyAgICAgICAgICAgIC8vIGRpc2NhcmQgb3V0cHV0RGVsYXkgYXQgdGhlIGJlZ2lubmluZworICAgICAgICAgICAgaW50MzJfdCB0b0NvbXBlbnNhdGUgPSBvdXRwdXREZWxheSAtIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICAgICAgaW50MzJfdCBkaXNjYXJkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgaWYgKGRpc2NhcmQgPiB0b0NvbXBlbnNhdGUpIHsKKyAgICAgICAgICAgICAgICBkaXNjYXJkID0gdG9Db21wZW5zYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBkaXNjYXJkZWQgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKDAsIGRpc2NhcmQpOworICAgICAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgKz0gZGlzY2FyZGVkOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICAvKgotICAgICAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKLSAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCi0gICAgICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5Ci0gICAgICAgICAqIGRvdWJsZWQgY29tcGFyZWQgd2l0aCB0aGUgY29yZSBBQUMgZGVjb2RlciBzYW1wbGluZyByYXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0Ci0gICAgICAgICAqIHR5cGUgaW4gdGhlIGJpdHN0cmVhbS4gSW1wbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGVtYmVkZGluZwotICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKLSAgICAgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcwotICAgICAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPD0gMikgewotICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICE9IHByZXZTYW1wbGVSYXRlIHx8Ci0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykgewotICAgICAgICAgICAgICAgIG1heWJlQ29uZmlndXJlRG93bm1peCgpOwotICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKLSAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgcHJldk51bUNoYW5uZWxzLCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICBpZiAobUVuZE9mSW5wdXQpIHsKKyAgICAgICAgICAgIHdoaWxlIChtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBNQVhfQ0hBTk5FTF9DT1VOVCBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQworICAgICAgICAgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgCisgICAgICAgICAgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgICAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgICAgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOwogCi0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19GTFVTSCk7CisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDMyX3QgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgaWYgKHRtcE91dEJ1ZmZlclNhbXBsZXMgPiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCkgeworICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLCB0bXBPdXRCdWZmZXJTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCAtPSB0bXBPdXRCdWZmZXJTYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpCisgICAgICAgICAgICAgICAgJiYgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA+PSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICAgICAgaWYgKG91dEhlYWRlci0+bk9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm91dEhlYWRlci0+bk9mZnNldCAhPSAwIGlzIG5vdCBoYW5kbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSB8fCAhbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7Ci0gICAgICAgICAgICBBTE9HVygiSW52YWxpZCBBQUMgc3RyZWFtIik7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSyB8fCBtTnVtU2FtcGxlc091dHB1dCA+IDApIHsKLSAgICAgICAgICAgIC8vIFdlJ2xsIG9ubHkgb3V0cHV0IGRhdGEgaWYgd2Ugc3VjY2Vzc2Z1bGx5IGRlY29kZWQgaXQgb3IKLSAgICAgICAgICAgIC8vIHdlJ3ZlIHByZXZpb3VzbHkgZGVjb2RlZCB2YWxpZCBkYXRhLCBpbiB0aGUgbGF0dGVyIGNhc2UKLSAgICAgICAgICAgIC8vIChkZWNvZGUgZmFpbGVkKSB3ZSdsbCBvdXRwdXQgYSBzaWxlbnQgZnJhbWUuCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBudW1PdXRCeXRlczsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SU5UX1BDTSAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworICAgICAgICAgICAgaW50IHNhbXBsZXNpemUgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBpZiAob3V0SGVhZGVyLT5uT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICsgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIHNhbXBsZXNpemUKKyAgICAgICAgICAgICAgICAgICAgPiBvdXRIZWFkZXItPm5BbGxvY0xlbikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgb3ZlcmZsb3ciKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9Ci0gICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICAgICArIChtTnVtU2FtcGxlc091dHB1dCAqIDEwMDAwMDBsbCkgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgKz0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGludCBhdmFpbGFibGUgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICBpbnQgbnVtU2FtcGxlcyA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgaWYgKG51bVNhbXBsZXMgPiBhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzID0gYXZhaWxhYmxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IDA7CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlKSB7CiAKKyAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzID0gbnVtU2FtcGxlcyAvIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogKG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgQUxPR1YoIiVkIHNhbXBsZXMgYXZhaWxhYmxlICglZCksIG9yICVkIGZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLCBhdmFpbGFibGUsIG51bUZyYW1lcyk7CisgICAgICAgICAgICAgICAgaW50NjRfdCAqbmV4dFRpbWVTdGFtcCA9ICZtQnVmZmVyVGltZXN0YW1wcy5lZGl0SXRlbUF0KDApOworICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gKm5leHRUaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgaW50MzJfdCAqY3VycmVudEJ1ZkxlZnQgPSAmbUJ1ZmZlclNpemVzLmVkaXRJdGVtQXQoMCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlY29kZWRTaXplID0gbURlY29kZWRTaXplcy5pdGVtQXQoMCk7CisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkU2l6ZXMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVkICVkIG9mICVkIiwgZGVjb2RlZFNpemUsICpjdXJyZW50QnVmTGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqY3VycmVudEJ1ZkxlZnQgPiBkZWNvZGVkU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0L2ludGVycG9sYXRlIG5leHQgdGltZSBzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgKmN1cnJlbnRCdWZMZWZ0IC09IGRlY29kZWRTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFkanVzdGVkIG5leHRUaW1lU3RhbXAvc2l6ZSB0byAlbGxkLyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAsICpjdXJyZW50QnVmTGVmdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgdGltZXN0YW1wIGluIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyVGltZXN0YW1wcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWVTdGFtcCA9ICZtQnVmZmVyVGltZXN0YW1wcy5lZGl0SXRlbUF0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplcy5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnVmTGVmdCA9ICZtQnVmZmVyU2l6ZXMuZWRpdEl0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibW92ZWQgdG8gbmV4dCB0aW1lL3NpemU6ICVsbGQvJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAsICpjdXJyZW50QnVmTGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gbGltaXQgb3V0cHV0IGJ1ZmZlciBzaXplIHRvIG1hdGNoIGlucHV0IGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChlLmcgd2hlbiBhbiBpbnB1dCBidWZmZXIgY29udGFpbmVkIDQgInN1YiIgZnJhbWVzLCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IG1vc3QgNCBkZWNvZGVkIHVuaXRzIGluIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBidWZmZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG9wdGlvbmFsLiBSZW1vdmUgdGhlIG5leHQgdGhyZWUgbGluZXMgdG8gZmlsbCB0aGUgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgd2l0aCBhcyBtYW55IHVuaXRzIGFzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFMT0dWKCJnZXR0aW5nICVkIGZyb20gcmluZ2J1ZmZlciIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGludDMyX3QgbnMgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKG91dEJ1ZmZlciwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgaWYgKG5zICE9IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBhIGNvbXBsZXRlIGZyYW1lIG9mIHNhbXBsZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICAgICAgaWYgKG1FbmRPZklucHV0ICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgbUVuZE9mT3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBjdXJyZW50VGltZTsKKworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7CiAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgQUxPR1YoIm91dCB0aW1lc3RhbXAgJWxsZCAvICVkIiwgb3V0SGVhZGVyLT5uVGltZVN0YW1wLCBvdXRIZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7Ci0gICAgICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICBpZiAobUVuZE9mSW5wdXQpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgPiAwCisgICAgICAgICAgICAgICAgICAgICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1FbmRPZklucHV0ICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtRW5kT2ZPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBlbXB0eSBibG9jayBzaWduYWxpbmcgRU9TCisgICAgICAgICAgICAgICAgICAgIG1FbmRPZk91dHB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dEhlYWRlci0+bk9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3V0SGVhZGVyLT5uT2Zmc2V0ICE9IDAgaXMgbm90IGhhbmRsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4ob3V0SGVhZGVyLT5wQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbUJ1ZmZlclRpbWVzdGFtcHMuaXRlbUF0KDApOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbURlY29kZWRTaXplcy5jbGVhcigpOworCisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlmIG91dFF1ZXVlIG5vdCBlbXB0eSBidXQgbm8gbW9yZSBvdXRwdXQKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KQEAgLTU4MiwyOCArOTgyLDc3IEBACiAgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KICAgICAgICAgLy8gZHJhaW4gYWxsIGV4aXN0aW5nIGRhdGEKICAgICAgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLmNsZWFyKCk7CisgICAgICAgIG1CdWZmZXJTaXplcy5jbGVhcigpOworICAgICAgICBtRGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBhdmFpbDsKKyAgICAgICAgd2hpbGUgKChhdmFpbCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAoYXZhaWwgPiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgYXZhaWwgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBucyA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoMCwgYXZhaWwpOworICAgICAgICAgICAgaWYgKG5zICE9IGF2YWlsKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBhIGNvbXBsZXRlIGZyYW1lIG9mIHNhbXBsZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvczsKICAgICB9CiB9CiAKIHZvaWQgU29mdEFBQzI6OmRyYWluRGVjb2RlcigpIHsKLSAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciA2IGNoYW5uZWxzIG9mIGRlY29kZWQgSEUtQUFDCi0gICAgc2hvcnQgYnVmIFsyMDQ4KjZdOwotICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCi0gICAgICAgICAgICBidWYsIHNpemVvZihidWYpLCBBQUNERUNfRkxVU0ggfCBBQUNERUNfQ0xSSElTVCB8IEFBQ0RFQ19JTlRSKTsKLSAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAotICAgICAgICAgICAgYnVmLCBzaXplb2YoYnVmKSwgQUFDREVDX0ZMVVNIIHwgQUFDREVDX0NMUkhJU1QgfCBBQUNERUNfSU5UUik7Ci0gICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSk7Ci0gICAgbURlY29kZXJIYXNEYXRhID0gZmFsc2U7CisgICAgaW50MzJfdCBvdXRwdXREZWxheSA9IG1TdHJlYW1JbmZvLT5vdXRwdXREZWxheSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgIC8vIGZsdXNoIGRlY29kZXIgdW50aWwgb3V0cHV0RGVsYXkgaXMgY29tcGVuc2F0ZWQKKyAgICB3aGlsZSAobU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPiAwKSB7CisgICAgICAgIC8vIGEgYnVmZmVyIGJpZyBlbm91Z2ggZm9yIE1BWF9DSEFOTkVMX0NPVU5UIGNoYW5uZWxzIG9mIGRlY29kZWQgSEUtQUFDCisgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisKKyAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKyAgICAgICAgbURyY1dyYXAudXBkYXRlKCk7CisKKyAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9CisgICAgICAgICAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0ZMVVNIKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIGlmICh0bXBPdXRCdWZmZXJTYW1wbGVzID4gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQpIHsKKyAgICAgICAgICAgIHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwgdG1wT3V0QnVmZmVyU2FtcGxlcyk7CisKKyAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgLT0gdG1wT3V0QnVmZmVyU2FtcGxlczsKKyAgICB9CiB9CiAKIHZvaWQgU29mdEFBQzI6Om9uUmVzZXQoKSB7CiAgICAgZHJhaW5EZWNvZGVyKCk7CiAgICAgLy8gcmVzZXQgdGhlICJjb25maWd1cmVkIiBzdGF0ZQogICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKLSAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbU91dHB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKKyAgICBtRW5kT2ZPdXRwdXQgPSBmYWxzZTsKKyAgICBtQnVmZmVyVGltZXN0YW1wcy5jbGVhcigpOworICAgIG1CdWZmZXJTaXplcy5jbGVhcigpOworICAgIG1EZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKyAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKwogICAgIC8vIFRvIG1ha2UgdGhlIGNvZGVjIGJlaGF2ZSB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIGEgcmVzZXQsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUKICAgICAvLyBzdHJlYW1pbmZvIHN0cnVjdC4gVGhpcyBkb2VzIHRoYXQ6Ci0gICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgPSAwOworICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlID0gMDsgLy8gVE9ETzogbVN0cmVhbUluZm8gaXMgcmVhZCBvbmx5CiAKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAppbmRleCAyZDk2MGFiLi5jM2U0NDU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgogCiAjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NywxNiArNDgsMjIgQEAKICAgICBlbnVtIHsKICAgICAgICAga051bUlucHV0QnVmZmVycyAgICAgICAgPSA0LAogICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyAgICAgICA9IDQsCisgICAgICAgIGtOdW1EZWxheUJsb2Nrc01heCAgICAgID0gOCwKICAgICB9OwogCiAgICAgSEFORExFX0FBQ0RFQ09ERVIgbUFBQ0RlY29kZXI7CiAgICAgQ1N0cmVhbUluZm8gKm1TdHJlYW1JbmZvOwogICAgIGJvb2wgbUlzQURUUzsKLSAgICBib29sIG1EZWNvZGVySGFzRGF0YTsKKyAgICBib29sIG1Jc0ZpcnN0OwogICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50OwogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwotICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKLSAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICptTGFzdEluSGVhZGVyOworICAgIFZlY3RvcjxpbnQzMl90PiBtQnVmZmVyU2l6ZXM7CisgICAgVmVjdG9yPGludDMyX3Q+IG1EZWNvZGVkU2l6ZXM7CisgICAgVmVjdG9yPGludDY0X3Q+IG1CdWZmZXJUaW1lc3RhbXBzOworCisgICAgQ0RyY1ByZXNNb2RlV3JhcHBlciBtRHJjV3JhcDsKIAogICAgIGVudW0gewogICAgICAgICBOT05FLApAQCAtNjcsOSArNzQsMjMgQEAKICAgICB2b2lkIGluaXRQb3J0cygpOwogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKLSAgICB2b2lkIG1heWJlQ29uZmlndXJlRG93bm1peCgpIGNvbnN0OworICAgIHZvaWQgY29uZmlndXJlRG93bm1peCgpIGNvbnN0OwogICAgIHZvaWQgZHJhaW5EZWNvZGVyKCk7CiAKKy8vICAgICAgZGVsYXkgY29tcGVuc2F0aW9uCisgICAgYm9vbCBtRW5kT2ZJbnB1dDsKKyAgICBib29sIG1FbmRPZk91dHB1dDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgc2hvcnQgKm1PdXRwdXREZWxheVJpbmdCdWZmZXI7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvczsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7CisgICAgYm9vbCBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCk7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QUFDMik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKaW5kZXggMDU3YzY5Yi4uNThlYzNiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5tawpAQCAtODIsNiArODIsOCBAQAogTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjcKIGVuZGlmCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTEwNiw2ICsxMDgsOCBAQAogCiAgIExPQ0FMX0NGTEFHUyA6PQogCisgIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKICAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJGcmF1bmhvZmVyQUFDCiAKICAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCkBAIC0xMjgsNiArMTMyLDggQEAKIAogICBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKKyAgTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgICBsaWJzdGFnZWZyaWdodF9hYWNlbmMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCmluZGV4IGZmMmI1MDMuLjM1YWE4ODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlNvZnRBQUNFbmNvZGVyMi5oIgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KQEAgLTQ0LDYgKzQ1LDggQEAKICAgICAgIG1OdW1DaGFubmVscygxKSwKICAgICAgIG1TYW1wbGVSYXRlKDQ0MTAwKSwKICAgICAgIG1CaXRSYXRlKDApLAorICAgICAgbVNCUk1vZGUoLTEpLAorICAgICAgbVNCUlJhdGlvKDApLAogICAgICAgbUFBQ1Byb2ZpbGUoT01YX0FVRElPX0FBQ09iamVjdExDKSwKICAgICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEoZmFsc2UpLAogICAgICAgbUlucHV0U2l6ZSgwKSwKQEAgLTE1Niw2ICsxNTksNDEgQEAKICAgICAgICAgICAgIGFhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkZyYW1lTGVuZ3RoID0gMDsKIAorICAgICAgICAgICAgc3dpdGNoIChtU0JSTW9kZSkgeworICAgICAgICAgICAgY2FzZSAxOiAvLyBzYnIgb24KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1TQlJSYXRpbykgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGJvdGggT01YIEFBQyB0b29sIGZsYWdzCisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHNpbmdsZS1yYXRlIFNCUiBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGR1YWwtcmF0ZSBTQlIgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBTQlIgcmF0aW8gJWQiLCBtU0JSUmF0aW8pOworICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMDogIC8vIHNiciBvZmYKKyAgICAgICAgICAgIGNhc2UgLTE6IC8vIHNiciB1bmRlZmluZWQKKyAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoImludmFsaWQgU0JSIG1vZGUgJWQiLCBtU0JSTW9kZSk7CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIH0KKworCisKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKQEAgLTI0Myw2ICsyODEsMjMgQEAKICAgICAgICAgICAgICAgICBtQUFDUHJvZmlsZSA9IGFhY1BhcmFtcy0+ZUFBQ1Byb2ZpbGU7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICghKGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICYgT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUikKKyAgICAgICAgICAgICAgICAgICAgJiYgIShhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlIpKSB7CisgICAgICAgICAgICAgICAgbVNCUk1vZGUgPSAwOworICAgICAgICAgICAgICAgIG1TQlJSYXRpbyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlIpCisgICAgICAgICAgICAgICAgICAgICYmICEoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSKSkgeworICAgICAgICAgICAgICAgIG1TQlJNb2RlID0gMTsKKyAgICAgICAgICAgICAgICBtU0JSUmF0aW8gPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICghKGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICYgT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUikKKyAgICAgICAgICAgICAgICAgICAgJiYgKGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICYgT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUikpIHsKKyAgICAgICAgICAgICAgICBtU0JSTW9kZSA9IDE7CisgICAgICAgICAgICAgICAgbVNCUlJhdGlvID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVNCUk1vZGUgPSAtMTsgLy8gY29kZWMgZGVmYXVsdCBzYnIgbW9kZQorICAgICAgICAgICAgICAgIG1TQlJSYXRpbyA9IDA7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChzZXRBdWRpb1BhcmFtcygpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTMwNSwxMSArMzYwLDExIEBACiB9CiAKIHN0YXR1c190IFNvZnRBQUNFbmNvZGVyMjo6c2V0QXVkaW9QYXJhbXMoKSB7Ci0gICAgLy8gV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMgb3IgYml0cmF0ZSBjaGFuZ2UKKyAgICAvLyBXZSBjYWxsIHRoaXMgd2hlbmV2ZXIgc2FtcGxlIHJhdGUsIG51bWJlciBvZiBjaGFubmVscywgYml0cmF0ZSBvciBTQlIgbW9kZSBjaGFuZ2UKICAgICAvLyBpbiByZXBvbnNlIHRvIHNldFBhcmFtZXRlciBjYWxscy4KIAotICAgIEFMT0dWKCJzZXRBdWRpb1BhcmFtczogJWx1IEh6LCAlbHUgY2hhbm5lbHMsICVsdSBicHMiLAotICAgICAgICAgbVNhbXBsZVJhdGUsIG1OdW1DaGFubmVscywgbUJpdFJhdGUpOworICAgIEFMT0dWKCJzZXRBdWRpb1BhcmFtczogJXUgSHosICV1IGNoYW5uZWxzLCAldSBicHMsICVpIHNiciBtb2RlLCAlaSBzYnIgcmF0aW8iLAorICAgICAgICAgbVNhbXBsZVJhdGUsIG1OdW1DaGFubmVscywgbUJpdFJhdGUsIG1TQlJNb2RlLCBtU0JSUmF0aW8pOwogCiAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQU9ULAogICAgICAgICAgICAgZ2V0QU9URnJvbVByb2ZpbGUobUFBQ1Byb2ZpbGUpKSkgewpAQCAtMzM1LDEwICszOTAsMjggQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCisgICAgaWYgKG1TQlJNb2RlICE9IC0xICYmIG1BQUNQcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RFTEQpIHsKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX01PREUsIG1TQlJNb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTQlIgcmF0aW8gcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25zOgorICAgICAgIDA6IERlZmF1bHQgY29uZmlndXJhdGlvbiB3aGVyZWluIFNCUiByYXRpbyBpcyBjb25maWd1cmVkIGRlcGVuZGluZyBvbiBhdWRpbyBvYmplY3QgdHlwZSBieQorICAgICAgICAgIHRoZSBGREsuCisgICAgICAgMTogRG93bnNhbXBsZWQgU0JSIChkZWZhdWx0IGZvciBFTEQpCisgICAgICAgMjogRHVhbHJhdGUgU0JSIChkZWZhdWx0IGZvciBIRS1BQUMpCisgICAgICovCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX1JBVElPLCBtU0JSUmF0aW8pKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIFNvZnRBQUNFbmNvZGVyMjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QUFDRW5jb2RlcjI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0zNjQsNyArNDM3LDcgQEAKIAogICAgICAgICBPTVhfVTMyIGFjdHVhbEJpdFJhdGUgID0gYWFjRW5jb2Rlcl9HZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUpOwogICAgICAgICBpZiAobUJpdFJhdGUgIT0gYWN0dWFsQml0UmF0ZSkgewotICAgICAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBiaXRyYXRlICVsdSB1bnN1cHBvcnRlZCwgdXNpbmcgJWx1IiwgbUJpdFJhdGUsIGFjdHVhbEJpdFJhdGUpOworICAgICAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBiaXRyYXRlICV1IHVuc3VwcG9ydGVkLCB1c2luZyAldSIsIG1CaXRSYXRlLCBhY3R1YWxCaXRSYXRlKTsKICAgICAgICAgfQogCiAgICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0IGVuY0luZm87CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaAppbmRleCAyNjAzZjRmLi5iY2U5YzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKQEAgLTUzLDYgKzUzLDggQEAKICAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKICAgICBPTVhfVTMyIG1TYW1wbGVSYXRlOwogICAgIE9NWF9VMzIgbUJpdFJhdGU7CisgICAgT01YX1MzMiBtU0JSTW9kZTsKKyAgICBPTVhfUzMyIG1TQlJSYXRpbzsKICAgICBPTVhfVTMyIG1BQUNQcm9maWxlOwogCiAgICAgYm9vbCBtU2VudENvZGVjU3BlY2lmaWNEYXRhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCmluZGV4IGNjMDE5MjcuLjFkMDI5ZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlICJiYXNpY19vcC5oIgogI2luY2x1ZGUgIm9wZXJfMzJiLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogIEZ1bmN0aW9uIExfRXh0cmFjdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCkBAIC0yNDMsNiArMjQ1LDggQEAKIFdvcmQzMiByc3FydChXb3JkMzIgdmFsdWUsICAgICAvKiE8IE9wZXJhbmQgdG8gc3F1YXJlIHJvb3QgKDAuMCAuLi4gMSkgKi8KICAgICAgICAgICAgICBXb3JkMzIgYWNjdXJhY3kpICAvKiE8IE51bWJlciBvZiB2YWxpZCBiaXRzIHRoYXQgd2lsbCBiZSBjYWxjdWxhdGVkICovCiB7CisgICAgVU5VU0VEKGFjY3VyYWN5KTsKKwogICAgIFdvcmQzMiByb290ID0gMDsKIAlXb3JkMzIgc2NhbGU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKaW5kZXggZDFjODYyMS4uNDBkYjkyYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJjbW5NZW1vcnkuaCIKICNpbmNsdWRlICJtZW1hbGlnbi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyoqCiAqIEluaXQgdGhlIGF1ZGlvIGNvZGVjIG1vZHVsZSBhbmQgcmV0dXJuIGNvZGVjIGhhbmRsZQogKiBccGFyYW0gcGhDb2RlYyBbT1VUXSBSZXR1cm4gdGhlIHZpZGVvIGNvZGVjIGhhbmRsZQpAQCAtNDYsNiArNDgsOCBAQAogCVZPX01FTV9PUEVSQVRPUiAqcE1lbU9QOwogCWludCBpbnRlck1lbTsKIAorICAgICAgICBVTlVTRUQodlR5cGUpOworCiAJaW50ZXJNZW0gPSAwOwogCWVycm9yID0gMDsKIApAQCAtNDcxLDYgKzQ3NSwxMCBAQAogKi8KIFZPX1UzMiBWT19BUEkgdm9BQUNFbmNHZXRQYXJhbShWT19IQU5ETEUgaENvZGVjLCBWT19TMzIgdVBhcmFtSUQsIFZPX1BUUiBwRGF0YSkKIHsKKyAgICAgICAgVU5VU0VEKGhDb2RlYyk7CisgICAgICAgIFVOVVNFRCh1UGFyYW1JRCk7CisgICAgICAgIFVOVVNFRChwRGF0YSk7CisKIAlyZXR1cm4gVk9fRVJSX05PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYwppbmRleCBjY2ZlODgzLi40NzE2MzFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCiB7CiAgIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnA7Ci0gIFdvcmQzMiAqcHRockV4cCwgKnBzZmJUaHJlOworICBXb3JkMzIgKnB0aHJFeHAgPSBOVUxMLCAqcHNmYlRocmU7CiAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwogCSBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKaW5kZXggZmNjMTJkZC4uZDFmZDY0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJxY19kYXRhLmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQogCiBzdGF0aWMgY29uc3QgIFdvcmQxNiBnbG9iYWxHYWluT2Zmc2V0ID0gMTAwOwogc3RhdGljIGNvbnN0ICBXb3JkMTYgaWNzUmVzZXJ2ZWRCaXQgICA9IDA7CkBAIC01ODUsNiArNTg2LDggQEAKICAgV29yZDE2IGVsZW1lbnRVc2VkQml0czsKICAgV29yZDE2IGZyYW1lQml0cz0wOwogCisgIFVOVVNFRChhbmNCeXRlcyk7CisKICAgLyogICBzdHJ1Y3QgYml0YnVmZmVyIGJzV3JpdGVDb3B5OyAqLwogICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7CiAgIGlmKHFjT3V0LT5xY0VsZW1lbnQuYWR0c1VzZWQpICAvKiAgd3JpdGUgYWR0cyBoZWFkZXIqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMKaW5kZXggNzc2OTE4OC4uNGQ3NjNkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSAiYml0X2NudC5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBidWlsZEJpdExvb2tVcApAQCAtMjI2LDcgKzIyNSw3IEBACiAgIH0KIAogICB3aGlsZSAoVFJVRSkgewotICAgIFdvcmQxNiBtYXhNZXJnZUdhaW4sIG1heE5keCwgbWF4TmR4TmV4dCwgbWF4TmR4TGFzdDsKKyAgICBXb3JkMTYgbWF4TWVyZ2VHYWluLCBtYXhOZHggPSAwLCBtYXhOZHhOZXh0LCBtYXhOZHhMYXN0OwogCiAgICAgbWF4TWVyZ2VHYWluID0gZmluZE1heE1lcmdlKG1lcmdlR2Fpbkxvb2tVcCwgc2VjdGlvbkluZm8sIG1heFNmYiwgJm1heE5keCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCmluZGV4IDRlOTIxOGMuLjZmMDY3OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYwpAQCAtMzgsNiArMzgsOCBAQAogI2luY2x1ZGUgInRuc19mdW5jLmgiCiAjaW5jbHVkZSAibWVtYWxpZ24uaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzdGFydCAgICAgICBzaG9ydCAgICAgICBzdG9wICovCiBzdGF0aWMgV29yZDE2IGJsb2NrVHlwZTJ3aW5kb3dTaGFwZVtdID0ge0tCRF9XSU5ET1csU0lORV9XSU5ET1csU0lORV9XSU5ET1csS0JEX1dJTkRPV307CiAKQEAgLTE3MCw3ICsxNzIsOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBXb3JkMTYgUHN5T3V0RGVsZXRlKFBTWV9PVVQgKmhQc3lPdXQsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQogewotICBoUHN5T3V0PU5VTEw7CisgIFVOVVNFRChoUHN5T3V0KTsKKyAgVU5VU0VEKHBNZW1PUCk7CisKICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYwppbmRleCA0OGZmMzAwLi5lNWQ3OGFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKICNpbmNsdWRlICJtZW1hbGlnbi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKIAogdHlwZWRlZiBlbnVtewogICBGUkFNRV9MRU5fQllURVNfTU9EVUxPID0gIDEsCkBAIC0yMDQsMTEgKzIwNSw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBRQ0RlbGV0ZShRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKIHsKLQotICAvKgotICAgICBub3RoaW5nIHRvIGRvCi0gICovCi0gIGhRQz1OVUxMOworICBVTlVTRUQoaFFDKTsKKyAgVU5VU0VEKHBNZW1PUCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKaW5kZXggNDU1YTg2NC4uNTE3MjYxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInRuc19mdW5jLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAjZGVmaW5lIFROU19NT0RJRllfQkVHSU4gICAgICAgICAyNjAwICAvKiBIeiAqLwogI2RlZmluZSBSQVRJT19QQVRDSF9MT1dFUl9CT1JERVIgMzgwICAgLyogSHogKi8KICNkZWZpbmUgVE5TX0dBSU5fVEhSRVNICQkJIDE0MSAgIC8qIDEuNDEqMTAwICovCkBAIC02NDMsNiArNjQ1LDggQEAKICAgV29yZDMyIGk7CiAgIFdvcmQzMiB0bnNPcmRlclBsdXMxID0gdG5zT3JkZXIgKyAxOwogCisgIFVOVVNFRCh3aW5kb3cpOworCiAgIGFzc2VydCh0bnNPcmRlciA8PSBUTlNfTUFYX09SREVSKTsgICAgICAvKiByZW1vdmUgYXNzZXJ0cyBsYXRlcj8gKGJ0ZykgKi8KIAogICBmb3IoaT0wO2k8dG5zT3JkZXI7aSsrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggMzBjZTI5Yy4uYTJiM2M4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tawpAQCAtNjksNiArNjksOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfRVhQT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKaW5kZXggOGQ2YzZmOC4uYjA2NzQ1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawpAQCAtNDcsNiArNDcsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpAQCAtNjgsNiArNzAsOCBAQAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyBsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAppbmRleCAzMzIwNjg4Li5kMWIwZjc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKQEAgLTI3NCw3ICsyNzQsNyBAQAogICAgIHJldHVybiBmcmFtZVNpemU7CiB9CiAKLXZvaWQgU29mdEFNUjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QU1SOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKQEAgLTQyOCw3ICs0MjgsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0QU1SOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QU1SOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogfQogCiB2b2lkIFNvZnRBTVI6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKaW5kZXggZjRlNDY3YS4uYWZjMGI4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tawpAQCAtNjksNiArNjksOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJuYmVuYwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCkBAIC04OCw2ICs5MCw4IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAogICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKaW5kZXggNTBiNzM5Yy4uOTQ4OTQ1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFNUk5CRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QU1STkJFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tawppbmRleCA2NzcxMDdmLi5lZmRmOTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tawpAQCAtNTAsNiArNTAsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawppbmRleCBjNWI4ZTBjLi42NGZlOGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawpAQCAtMTEyLDYgKzExMiw4IEBACiBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNwogZW5kaWYKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTI2LDYgKzEyOCw4IEBACiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUgXAogCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCmluZGV4IDljY2I0OWMuLjkxYTUxMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKQEAgLTMxNyw3ICszMTcsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0QU1SV0JFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRBTVJXQkVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCmluZGV4IDg0NTExOTUuLmYyM2I1YTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgICAgLmdsb2JhbCAgRmlsdF82a183a19hc20KICAgICAgICAgICAuZXh0ZXJuICB2b0FXQl9Db3B5CiAgICAgICAgICAgLmV4dGVybiAgZmlyXzZrXzdrCisgICAgICAgICAgLmhpZGRlbiAgZmlyXzZrXzdrCiAKIEZpbHRfNmtfN2tfYXNtOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCmluZGV4IGFjMmRkMTMuLmRlYjdlZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCkBAIC0zMiw2ICszMiw3IEBACiAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKIAkgLmdsb2JhbCAgIHByZWRfbHQ0X2FzbQogCSAuZXh0ZXJuICAgaW50ZXI0XzIKKwkgLmhpZGRlbiAgIGludGVyNF8yCiAKIHByZWRfbHQ0X2FzbToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucwppbmRleCBmYzQyYTAzLi44ZGYwY2FhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucwpAQCAtMjgsNiArMjgsNyBAQAogICAgICAgICAgIC5zZWN0aW9uICAudGV4dAogICAgICAgICAgIC5nbG9iYWwgICBGaWx0XzZrXzdrX2FzbQogICAgICAgICAgIC5leHRlcm4gICBmaXJfNmtfN2sKKyAgICAgICAgICAuaGlkZGVuICAgZmlyXzZrXzdrCiAKIEZpbHRfNmtfN2tfYXNtOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCmluZGV4IDhkMmFhZjIuLjY3YmUxZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0CiAgICAgICAgICAgLmdsb2JhbCAgIHByZWRfbHQ0X2FzbQogICAgICAgICAgIC5leHRlcm4gICBpbnRlcjRfMgorICAgICAgICAgIC5oaWRkZW4gICBpbnRlcjRfMgogCiBwcmVkX2x0NF9hc206CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwppbmRleCA4YzQ3N2NhLi4wYjJlYTg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSAiYWNlbHAuaCIKICNpbmNsdWRlICJoYW1fd2luZC50YWIiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiB2b2lkIEF1dG9jb3JyKAogCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IElucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAqLwogCQlXb3JkMTYgbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IExQQyBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDAsNiArNDIsOCBAQAogCVdvcmQzMiBMX3N1bSwgTF9zdW0xLCBMX3RtcCwgRl9MRU47CiAJV29yZDE2ICpwMSwqcDIsKnAzOwogCWNvbnN0IFdvcmQxNiAqcDQ7CisgICAgICAgIFVOVVNFRChtKTsKKwogCS8qIFdpbmRvd2luZyBvZiBzaWduYWwgKi8KIAlwMSA9IHg7CiAJcDQgPSB2b193aW5kb3c7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKaW5kZXggYWNiYTUzMi4uNGMxZjdkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgInR5cGVkZWYuaCIKICNpbmNsdWRlICJiYXNpY19vcC5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogdm9pZCBDb252b2x2ZSAoCiAJCVdvcmQxNiB4W10sICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAkJV29yZDE2IGhbXSwgICAgICAgIC8qIChpKSAgICAgOiBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzUsNiArMzcsOCBAQAogCVdvcmQzMiAgaSwgbjsKIAlXb3JkMTYgKnRtcEgsKnRtcFg7CiAJV29yZDMyIHM7CisgICAgICAgIFVOVVNFRChMKTsKKwogCWZvciAobiA9IDA7IG4gPCA2NDspCiAJewogCQl0bXBIID0gaCtuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCmluZGV4IDBkNjZjMzEuLmI2NmI1NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKQEAgLTMxLDYgKzMxLDggQEAKICNkZWZpbmUgVVBfU0FNUCAgICAgIDQKICNkZWZpbmUgTF9JTlRFUlBPTDEgIDQKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qIExvY2FsIGZ1bmN0aW9ucyAqLwogCiAjaWZkZWYgQVNNX09QVApAQCAtMTcxLDYgKzE3Myw3IEBACiAJV29yZDMyIGNvcnIsIGV4cF9jb3JyLCBub3JtLCBleHAsIHNjYWxlOwogCVdvcmQxNiBleHBfbm9ybSwgZXhjZltMX1NVQkZSXSwgdG1wOwogCVdvcmQzMiBMX3RtcCwgTF90bXAxLCBMX3RtcDI7CisgICAgICAgIFVOVVNFRChMX3N1YmZyKTsKIAogCS8qIGNvbXB1dGUgdGhlIGZpbHRlcmVkIGV4Y2l0YXRpb24gZm9yIHRoZSBmaXJzdCBkZWxheSB0X21pbiAqLwogCWsgPSAtdF9taW47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKaW5kZXggMWJkYTA1YS4uOTYxYWFkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgIm1hdGhfb3AuaCIKICNpbmNsdWRlICJjbnN0LmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiB2b2lkIFN5bl9maWx0KAogCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICovCiAJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk1LDYgKzk3LDggQEAKIAlXb3JkMzIgaSxhMDsKIAlXb3JkMzIgTF90bXAsIExfdG1wMTsKIAlXb3JkMTYgKnAxLCAqcDIsICpwMzsKKyAgICAgICAgVU5VU0VEKG0pOworCiAJYTAgPSBhWzBdID4+ICg0ICsgUW5ldyk7ICAgICAgICAgIC8qIGlucHV0IC8gMTYgYW5kID4+UW5ldyAqLwogCS8qIERvIHRoZSBmaWx0ZXJpbmcuICovCiAJZm9yIChpID0gMDsgaSA8IGxnOyBpKyspCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCmluZGV4IGVhOWRhNTIuLmRmN2I5YjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCkBAIC0zOSw2ICszOSw4IEBACiAjaW5jbHVkZSAibWVtX2FsaWduLmgiCiAjaW5jbHVkZSAiY21uTWVtb3J5LmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCkBAIC0xNjAyLDYgKzE2MDQsOCBAQAogCVZPX01FTV9PUEVSQVRPUiB2b01lbW9wcmF0b3I7CiAjZW5kaWYKIAlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsKKyAgICAgICAgVU5VU0VEKHZUeXBlKTsKKwogCWludCBpbnRlck1lbSA9IDA7CiAKIAlpZihwVXNlckRhdGEgPT0gTlVMTCB8fCBwVXNlckRhdGEtPm1lbWZsYWcgIT0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUiB8fCBwVXNlckRhdGEtPm1lbURhdGEgPT0gTlVMTCApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vQW5kcm9pZC5tawppbmRleCAyMmRlZTE1Li44NDRlZjBhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL0FuZHJvaWQubWsKQEAgLTE2LDQgKzE2LDYgQEAKIAkkKExPQ0FMX1BBVEgpL3NyYyBcCiAgCSQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawppbmRleCA3ZDE3YzJhLi41MzdiYTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKQEAgLTMwLDYgKzMwLDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfRVhQT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNjksNCArNzEsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGVuYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCmluZGV4IGUyYjllNGYuLmUzZmRjODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKQEAgLTM0LDggKzM0LDEwIEBACiAKICNpbmNsdWRlICJTb2Z0QVZDRW5jb2Rlci5oIgogCi0jaWZuZGVmIElOVDMyX01BWAotI2RlZmluZSBJTlQzMl9NQVggICAyMTQ3NDgzNjQ3CisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKICNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMDksNDUgKzExMSwxNSBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKLWlubGluZSBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAotICAgICAgICB1aW50OF90ICppbnl1diwgdWludDhfdCogb3V0eXV2LAotICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotCi0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdGljIHZvaWQqIE1hbGxvY1dyYXBwZXIoCi0gICAgICAgIHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IHNpemUsIGludDMyX3QgYXR0cnMpIHsKKyAgICAgICAgdm9pZCAqIC8qIHVzZXJEYXRhICovLCBpbnQzMl90IHNpemUsIGludDMyX3QgLyogYXR0cnMgKi8pIHsKICAgICB2b2lkICpwdHIgPSBtYWxsb2Moc2l6ZSk7CiAgICAgaWYgKHB0cikKICAgICAgICAgbWVtc2V0KHB0ciwgMCwgc2l6ZSk7CiAgICAgcmV0dXJuIHB0cjsKIH0KIAotc3RhdGljIHZvaWQgRnJlZVdyYXBwZXIodm9pZCAqdXNlckRhdGEsIHZvaWQqIHB0cikgeworc3RhdGljIHZvaWQgRnJlZVdyYXBwZXIodm9pZCAqIC8qIHVzZXJEYXRhICovLCB2b2lkKiBwdHIpIHsKICAgICBmcmVlKHB0cik7CiB9CiAKQEAgLTE3Niw3ICsxNDgsNyBAQAogICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAogICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCi0gICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICA6IFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbVZpZGVvV2lkdGgoMTc2KSwKICAgICAgIG1WaWRlb0hlaWdodCgxNDQpLAogICAgICAgbVZpZGVvRnJhbWVSYXRlKDMwKSwKQEAgLTIyMSw3ICsxOTMsNyBAQAogICAgIG1IYW5kbGUtPkNCQVZDX0ZyZWUgPSBGcmVlV3JhcHBlcjsKIAogICAgIENIRUNLKG1FbmNQYXJhbXMgIT0gTlVMTCk7Ci0gICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZihtRW5jUGFyYW1zKSk7CisgICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZigqbUVuY1BhcmFtcykpOwogICAgIG1FbmNQYXJhbXMtPnJhdGVfY29udHJvbCA9IEFWQ19PTjsKICAgICBtRW5jUGFyYW1zLT5pbml0UVAgPSAwOwogICAgIG1FbmNQYXJhbXMtPmluaXRfQ0JQX3JlbW92YWxfZGVsYXkgPSAxNjAwOwpAQCAtMjU4LDkgKzIzMCwxMCBAQAogCiAgICAgbUVuY1BhcmFtcy0+dXNlX292ZXJydW5fYnVmZmVyID0gQVZDX09GRjsKIAotICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgeworICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyCisgICAgICAgICAgICB8fCBtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewogICAgICAgICAvLyBDb2xvciBjb252ZXJzaW9uIGlzIG5lZWRlZC4KLSAgICAgICAgQ0hFQ0sobUlucHV0RnJhbWVEYXRhID09IE5VTEwpOworICAgICAgICBmcmVlKG1JbnB1dEZyYW1lRGF0YSk7CiAgICAgICAgIGlmICgoKHVpbnQ2NF90KW1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0KSA+ICgodWludDY0X3QpSU5UMzJfTUFYIC8gMykpIHsKICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgc2l6ZSBpcyB0b28gYmlnLiIpOwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKQEAgLTM1NCwxMCArMzI3LDEwIEBACiAgICAgUFZBVkNDbGVhblVwRW5jb2RlcihtSGFuZGxlKTsKICAgICByZWxlYXNlT3V0cHV0QnVmZmVycygpOwogCi0gICAgZGVsZXRlIG1JbnB1dEZyYW1lRGF0YTsKKyAgICBmcmVlKG1JbnB1dEZyYW1lRGF0YSk7CiAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKIAotICAgIGRlbGV0ZSBtU2xpY2VHcm91cDsKKyAgICBmcmVlKG1TbGljZUdyb3VwKTsKICAgICBtU2xpY2VHcm91cCA9IE5VTEw7CiAKICAgICBkZWxldGUgbUVuY1BhcmFtczsKQEAgLTYwNSw2ICs1NzgsMTcgQEAKICAgICAgICAgICAgICAgICBtVmlkZW9IZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAgICAgICAgICAgICAgICAgbVZpZGVvRnJhbWVSYXRlID0gZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA+PiAxNjsKICAgICAgICAgICAgICAgICBtVmlkZW9Db2xvckZvcm1hdCA9IGRlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdDsKKworICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWYgPQorICAgICAgICAgICAgICAgICAgICAmZWRpdFBvcnRJbmZvKDApLT5tRGVmOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1WaWRlb1dpZHRoOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtVmlkZW9IZWlnaHQ7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpIG1WaWRlb0NvbG9yRm9ybWF0OworICAgICAgICAgICAgICAgIHBvcnREZWYgPSAmZWRpdFBvcnRJbmZvKDEpLT5tRGVmOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1WaWRlb1dpZHRoOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtVmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1WaWRlb0JpdFJhdGUgPSBkZWYtPmZvcm1hdC52aWRlby5uQml0cmF0ZTsKICAgICAgICAgICAgIH0KQEAgLTcwOCwxNSArNjkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgPyAiIHRydWUiIDogImZhbHNlIik7CiAKICAgICAgICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewotICAgICAgICAgICAgICAgIG1WaWRlb0NvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOwotICAgICAgICAgICAgICAgIGlmIChtSW5wdXRGcmFtZURhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCkgPiAoKHVpbnQ2NF90KUlOVDMyX01BWCAvIDMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIHNpemUgaXMgdG9vIGJpZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKSBtYWxsb2MoKG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMyApID4+IDEpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVmlkZW9Db2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKQEAgLTcyNyw3ICs3MDMsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0QVZDRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QVZDRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNhd0lucHV0RU9TKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04MDAsOCArNzc2LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBzcmNCdWZmZXI7IC8vIGZvciBNZXRhRGF0YU1vZGUgb25seQotCiAgICAgICAgIC8vIEdldCBuZXh0IGlucHV0IHZpZGVvIGZyYW1lCiAgICAgICAgIGlmIChtUmVhZHlGb3JOZXh0RnJhbWUpIHsKICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGlucHV0IGJ1ZmZlciBpbmZvIHNvIHRoYXQgaXQgY2FuIGJlCkBAIC04MjIsMTggKzc5NiwyMCBAQAogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuaGVpZ2h0ID0gKChtVmlkZW9IZWlnaHQgICsgMTUpID4+IDQpIDw8IDQ7CiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5waXRjaCA9ICgobVZpZGVvV2lkdGggKyAxNSkgPj4gNCkgPDwgNDsKICAgICAgICAgICAgICAgICB2aWRlb0lucHV0LmNvZGluZ190aW1lc3RhbXAgPSAoaW5IZWFkZXItPm5UaW1lU3RhbXAgKyA1MDApIC8gMTAwMDsgIC8vIGluIG1zCi0gICAgICAgICAgICAgICAgdWludDhfdCAqaW5wdXREYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dERhdGEgPSBOVUxMOwogICAgICAgICAgICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewogICAgICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gIT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1ldGFEYXRhIGJ1ZmZlciBpcyB3cm9uZyBzaXplISAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZ290ICVsdSBieXRlcywgZXhwZWN0ZWQgOCkiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZ290ICV1IGJ5dGVzLCBleHBlY3RlZCA4KSIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0R3JhbGxvY0RhdGEoaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSwgKG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMykgPj4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXREYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZXh0cmFjdCBncmFsbG9jIGJ1ZmZlciBpbiBtZXRhZGF0YSBtb2RlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtODQyLDE2ICs4MTgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBWZXJpZnkvY29udmVydCBwaXhlbCBmb3JtYXQgZW51bQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9ICh1aW50OF90ICopaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEsIG1JbnB1dEZyYW1lRGF0YSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLCBtSW5wdXRGcmFtZURhdGEsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIENIRUNLKGlucHV0RGF0YSAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICB2aWRlb0lucHV0LllDYkNyWzBdID0gaW5wdXREYXRhOworICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMF0gPSAodWludDhfdCAqKWlucHV0RGF0YTsKICAgICAgICAgICAgICAgICB2aWRlb0lucHV0LllDYkNyWzFdID0gdmlkZW9JbnB1dC5ZQ2JDclswXSArIHZpZGVvSW5wdXQuaGVpZ2h0ICogdmlkZW9JbnB1dC5waXRjaDsKICAgICAgICAgICAgICAgICB2aWRlb0lucHV0LllDYkNyWzJdID0gdmlkZW9JbnB1dC5ZQ2JDclsxXSArCiAgICAgICAgICAgICAgICAgICAgICgodmlkZW9JbnB1dC5oZWlnaHQgKiB2aWRlb0lucHV0LnBpdGNoKSA+PiAyKTsKQEAgLTg2OCwxNCArODQ0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyU3RhdHVzIDwgQVZDRU5DX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlbmNvZGVyU3RhdHVzID0gJWQgYXQgbGluZSAlZCIsIGVuY29kZXJTdGF0dXMsIF9fTElORV9fKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlR3JhbGxvY0RhdGEoc3JjQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJlbmNvZGVyU3RhdHVzID0gJWQgYXQgbGluZSAlZCIsIGVuY29kZXJTdGF0dXMsIF9fTElORV9fKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05MTUsNyArODg5LDYgQEAKICAgICAgICAgICAgIGlmIChlbmNvZGVyU3RhdHVzIDwgQVZDRU5DX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZW5jb2RlclN0YXR1cyA9ICVkIGF0IGxpbmUgJWQiLCBlbmNvZGVyU3RhdHVzLCBfX0xJTkVfXyk7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZWxlYXNlR3JhbGxvY0RhdGEoc3JjQnVmZmVyKTsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtOTI1LDcgKzg5OCw2IEBACiAKICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CkBAIC05NjksNTAgKzk0MSwxMCBAQAogfQogCiB2b2lkIFNvZnRBVkNFbmNvZGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGJ1ZmZlcik7CiAgICAgQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkOiAlcCIsIGJ1ZmZlcik7CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdEFWQ0VuY29kZXI6OmdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewotICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpKSB7Ci0gICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLX0KLQotdWludDhfdCAqU29mdEFWQ0VuY29kZXI6OmV4dHJhY3RHcmFsbG9jRGF0YSh2b2lkICpkYXRhLCBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcikgewotICAgIE9NWF9VMzIgdHlwZSA9ICooT01YX1UzMiopZGF0YTsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgaWYgKHR5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgQUxPR0UoIkRhdGEgcGFzc2VkIGluIHdpdGggbWV0YWRhdGEgbW9kZSBkb2VzIG5vdCBoYXZlIHR5cGUgIgotICAgICAgICAgICAgICAgICJrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSAoJWQpLCBoYXMgdHlwZSAlbGQgaW5zdGVhZCIsCi0gICAgICAgICAgICAgICAga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UsIHR5cGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgYnVmZmVyX2hhbmRsZV90IGltZ0J1ZmZlciA9ICooYnVmZmVyX2hhbmRsZV90KikoKHVpbnQ4X3QqKWRhdGEgKyA0KTsKLQotICAgIGNvbnN0IFJlY3QgcmVjdChtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICB1aW50OF90ICppbWc7Ci0gICAgcmVzID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkubG9jayhpbWdCdWZmZXIsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgICAgICAgICByZWN0LCAodm9pZCoqKSZpbWcpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gbG9jayBpbWFnZSBidWZmZXIgJXAgZm9yIGFjY2VzcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBpbWdCdWZmZXIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqYnVmZmVyID0gaW1nQnVmZmVyOwotICAgIHJldHVybiBpbWc7Ci19Ci0KLXZvaWQgU29mdEFWQ0VuY29kZXI6OnJlbGVhc2VHcmFsbG9jRGF0YShidWZmZXJfaGFuZGxlX3QgYnVmZmVyKSB7Ci0gICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7Ci0gICAgICAgIEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLnVubG9jayhidWZmZXIpOwotICAgIH0KLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oCmluZGV4IDIzZDVmZjEuLjEzMDU5M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuaApAQCAtMjIsMTQgKzIyLDE0IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKIHN0cnVjdCBTb2Z0QVZDRW5jb2RlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRBVkNFbmNvZGVyKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKQEAgLTQ1LDExICs0NSw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAKLSAgICAvLyBPdmVycmlkZSBTb2Z0T01YQ29tcG9uZW50IG1ldGhvZHMKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKLQogICAgIC8vIEltcGxlbWVudCBNZWRpYUJ1ZmZlck9ic2VydmVyCiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOwogCkBAIC02NywxMCArNjIsNiBAQAogICAgICAgICBrTnVtQnVmZmVycyA9IDIsCiAgICAgfTsKIAotICAgIGVudW0gewotICAgICAgICBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4ID0gT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQgKyAxCi0gICAgfTsKLQogICAgIC8vIE9NWCBpbnB1dCBidWZmZXIncyB0aW1lc3RhbXAgYW5kIGZsYWdzCiAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CkBAIC0xMDksOSArMTAwLDYgQEAKICAgICBPTVhfRVJST1JUWVBFIHJlbGVhc2VFbmNvZGVyKCk7CiAgICAgdm9pZCByZWxlYXNlT3V0cHV0QnVmZmVycygpOwogCi0gICAgdWludDhfdCogZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKTsKLSAgICB2b2lkIHJlbGVhc2VHcmFsbG9jRGF0YShidWZmZXJfaGFuZGxlX3QgYnVmZmVyKTsKLQogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBVkNFbmNvZGVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAKaW5kZXggMGUzMDM3Zi4uZDcxYzMyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAKQEAgLTEwMyw2ICsxMDMsMTUgQEAKICAgICB7CiAgICAgICAgIG51bV9iaXRzIC09IDg7CiAgICAgICAgIGJ5dGUgPSAoY3VycmVudF93b3JkID4+IG51bV9iaXRzKSAmIDB4RkY7CisgICAgICAgIGlmIChzdHJlYW0tPmNvdW50X3plcm9zID09IDIpCisgICAgICAgIHsgICAvKiBmb3IgbnVtX2JpdHMgPSAzMiwgdGhpcyBjYW4gYWRkIDIgbW9yZSBieXRlcyBleHRyYSBmb3IgRVBCUyAqLworICAgICAgICAgICAgaWYgKGJ5dGUgPD0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqd3JpdGVfcG50KysgPSAweDM7CisgICAgICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAoYnl0ZSAhPSAwKQogICAgICAgICB7CiAgICAgICAgICAgICAqd3JpdGVfcG50KysgPSBieXRlOwpAQCAtMTE0LDEyICsxMjMsNiBAQAogICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcysrOwogICAgICAgICAgICAgKndyaXRlX3BudCsrID0gYnl0ZTsKICAgICAgICAgICAgIHN0cmVhbS0+d3JpdGVfcG9zKys7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtLT5jb3VudF96ZXJvcyA9PSAyKQotICAgICAgICAgICAgeyAgIC8qIGZvciBudW1fYml0cyA9IDMyLCB0aGlzIGNhbiBhZGQgMiBtb3JlIGJ5dGVzIGV4dHJhIGZvciBFUEJTICovCi0gICAgICAgICAgICAgICAgKndyaXRlX3BudCsrID0gMHgzOwotICAgICAgICAgICAgICAgIHN0cmVhbS0+d3JpdGVfcG9zKys7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcyA9IDA7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tawppbmRleCBhMzNjYjkyLi5iMDAxMGZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0xNCw2ICsxNCw4IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKaW5kZXggYTZkNDI4Ni4uYTg0M2NlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKQEAgLTE0LDggKzE0LDEwIEBACiBlbmRpZgogCiAjIERvIHdlIGFsc28gbmVlZCB0byBjaGVjayBvbiBBUkNIX0FSTV9IQVZFX0FSTVY3QT8gLSBwcm9iYWJseSBub3QKLWlmZXEgKCQoQVJDSF9BUk1fSEFWRV9ORU9OKSx0cnVlKQotVk9UVCA6PSB2NworaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQorICBpZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKKyAgICBWT1RUIDo9IHY3CisgIGVuZGlmCiBlbmRpZgogCiBWT1RFU1QgOj0gMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9jbW5NZW1vcnkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vY21uTWVtb3J5LmMKaW5kZXggYWE1MmJkOS4uNWJiNmNjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9jbW5NZW1vcnkuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2Ntbk1lbW9yeS5jCkBAIC0yNiw4ICsyNiwxMiBAQAogCiAvL1ZPX01FTV9PUEVSQVRPUgkJZ19tZW1PUDsKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIFZPX1UzMiBjbW5NZW1BbGxvYyAoVk9fUzMyIHVJRCwgIFZPX01FTV9JTkZPICogcE1lbUluZm8pCiB7CisgICAgICAgIFVOVVNFRCh1SUQpOworCiAJaWYgKCFwTWVtSW5mbykKIAkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKIApAQCAtMzcsMzQgKzQxLDQ4IEBACiAKIFZPX1UzMiBjbW5NZW1GcmVlIChWT19TMzIgdUlELCBWT19QVFIgcE1lbSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAlmcmVlIChwTWVtKTsKIAlyZXR1cm4gMDsKIH0KIAogVk9fVTMyCWNtbk1lbVNldCAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmLCBWT19VOCB1VmFsdWUsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAltZW1zZXQgKHBCdWZmLCB1VmFsdWUsIHVTaXplKTsKIAlyZXR1cm4gMDsKIH0KIAogVk9fVTMyCWNtbk1lbUNvcHkgKFZPX1MzMiB1SUQsIFZPX1BUUiBwRGVzdCwgVk9fUFRSIHBTb3VyY2UsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAltZW1jcHkgKHBEZXN0LCBwU291cmNlLCB1U2l6ZSk7CiAJcmV0dXJuIDA7CiB9CiAKIFZPX1UzMgljbW5NZW1DaGVjayAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisgICAgICAgIFVOVVNFRChwQnVmZmVyKTsKKyAgICAgICAgVU5VU0VEKHVTaXplKTsKKwogCXJldHVybiAwOwogfQogCiBWT19TMzIgY21uTWVtQ29tcGFyZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIxLCBWT19QVFIgcEJ1ZmZlcjIsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAlyZXR1cm4gbWVtY21wKHBCdWZmZXIxLCBwQnVmZmVyMiwgdVNpemUpOwogfQogCiBWT19VMzIJY21uTWVtTW92ZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKQogeworICAgICAgICBVTlVTRUQodUlEKTsKKwogCW1lbW1vdmUgKHBEZXN0LCBwU291cmNlLCB1U2l6ZSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCmluZGV4IGYwMWQ2MDUuLjU5YTExZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCkBAIC05LDYgKzksOCBAQAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICBleHRlcm5hbC9mbGFjL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IGU2NGZlNzIuLjEzMDEwNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC0yNyw2ICsyNywxMiBAQAogI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQgNQogI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01BWCAgICAgOAogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlPGNsYXNzIFQ+CkBAIC0yMDQsNyArMjEwLDcgQEAKIAogICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gcGNtUGFyYW1zLT5uQ2hhbm5lbHM7CiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIEFMT0dWKCJ3aWxsIGVuY29kZSAlbGQgY2hhbm5lbHMgYXQgJWxkSHoiLCBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIEFMT0dWKCJ3aWxsIGVuY29kZSAlZCBjaGFubmVscyBhdCAlZEh6IiwgbU51bUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSk7CiAKICAgICAgICAgICAgIHJldHVybiBjb25maWd1cmVFbmNvZGVyKCk7CiAgICAgICAgIH0KQEAgLTI0MSw3ICsyNDcsNyBAQAogCiAgICAgICAgICAgICBpZiAoZGVmUGFyYW1zLT5uUG9ydEluZGV4ID09IDApIHsKICAgICAgICAgICAgICAgICBpZiAoZGVmUGFyYW1zLT5uQnVmZmVyU2l6ZSA+IGtNYXhJbnB1dEJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBzaXplIG11c3QgYmUgYXQgbW9zdCAlenUgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIHNpemUgbXVzdCBiZSBhdCBtb3N0ICVkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhJbnB1dEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwogICAgICAgICAgICAgICAgIH0KQEAgLTI1Nyw4ICsyNjMsOCBAQAogfQogCiB2b2lkIFNvZnRGbGFjRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewotCi0gICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChwb3J0SW5kZXg9JWxkKSIsIHBvcnRJbmRleCk7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHBvcnRJbmRleCk7CisgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChwb3J0SW5kZXg9JWQpIiwgcG9ydEluZGV4KTsKIAogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMjkwLDcgKzI5Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiBrTWF4SW5wdXRCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWxkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0zNDMsMTYgKzM0OSwxNyBAQAogICAgIH0KIH0KIAotCiBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgU29mdEZsYWNFbmNvZGVyOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAogICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKLSAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywgdW5zaWduZWQgY3VycmVudF9mcmFtZSkgewotICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6Om9uRW5jb2RlZEZsYWNBdmFpbGFibGUoYnl0ZXM9JWQsIHNhbXBsZXM9JWQsIGN1cnJfZnJhbWU9JWQpIiwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpIHsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoY3VycmVudF9mcmFtZSk7CisgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZShieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwKICAgICAgICAgICAgIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKIAogI2lmZGVmIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUgogICAgIGlmIChzYW1wbGVzID09IDApIHsKLSAgICAgICAgQUxPR0koIiBzYXZpbmcgJWQgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOworICAgICAgICBBTE9HSSgiIHNhdmluZyAlenUgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOwogICAgICAgICBtZW1jcHkobUhlYWRlciArIG1IZWFkZXJPZmZzZXQsIGJ1ZmZlciwgYnl0ZXMpOwogICAgICAgICBtSGVhZGVyT2Zmc2V0ICs9IGJ5dGVzOy8vIHdpbGwgY29udGFpbiBoZWFkZXIgc2l6ZSB3aGVuIGZpbmlzaGVkIHJlY2VpdmluZyBoZWFkZXIKICAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKQEAgLTM2Myw3ICszNzAsNyBAQAogICAgIGlmICgoc2FtcGxlcyA9PSAwKSB8fCAhbUVuY29kZXJXcml0ZURhdGEpIHsKICAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBlbmNvZGVyIGJlY2F1c2UgdGhlcmUncyBoZWFkZXIgZGF0YSB0byBzYXZlLCBidXQgaXQncyBub3QgdGhlIHJvbGUKICAgICAgICAgLy8gb2YgdGhpcyBjb21wb25lbnQgKHVubGVzcyBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIgaXMgZGVmaW5lZCkKLSAgICAgICAgQUxPR1YoImlnbm9yaW5nICVkIGJ5dGVzIG9mIGhlYWRlciBkYXRhIChzYW1wbGVzPSVkKSIsIGJ5dGVzLCBzYW1wbGVzKTsKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nICV6dSBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CiAgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CiAgICAgfQogCkBAIC0zODQsOSArMzkxLDkgQEAKICNlbmRpZgogCiAgICAgLy8gd3JpdGUgZW5jb2RlZCBkYXRhCi0gICAgQUxPR1YoIiB3cml0aW5nICVkIGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQgcG9ydCIsIGJ5dGVzKTsKKyAgICBBTE9HVigiIHdyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQgcG9ydCIsIGJ5dGVzKTsKICAgICBpZiAoYnl0ZXMgPiBvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldCAtIG91dEhlYWRlci0+bkZpbGxlZExlbikgewotICAgICAgICBBTE9HRSgiIG5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICV1IGJ5dGVzIiwgYnl0ZXMpOworICAgICAgICBBTE9HRSgiIG5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICV6dSBieXRlcyIsIGJ5dGVzKTsKICAgICAgICAgLy8gYSBmYXRhbCBlcnJvciB3b3VsZCBzdG9wIHRoZSBlbmNvZGluZwogICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOwogICAgIH0KQEAgLTQwNSw3ICs0MTIsNyBAQAogCiAKIE9NWF9FUlJPUlRZUEUgU29mdEZsYWNFbmNvZGVyOjpjb25maWd1cmVFbmNvZGVyKCkgewotICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OmNvbmZpZ3VyZUVuY29kZXIoKSBudW1DaGFubmVsPSVsZCwgc2FtcGxlUmF0ZT0lbGQiLAorICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OmNvbmZpZ3VyZUVuY29kZXIoKSBudW1DaGFubmVsPSVkLCBzYW1wbGVSYXRlPSVkIiwKICAgICAgICAgICAgIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUpOwogCiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCAobUZsYWNTdHJlYW1FbmNvZGVyID09IE5VTEwpKSB7CkBAIC00NDQsOCArNDUxLDEyIEBACiAKIC8vIHN0YXRpYwogRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIFNvZnRGbGFjRW5jb2Rlcjo6ZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqZW5jb2RlciwgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKLSAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywgdW5zaWduZWQgY3VycmVudF9mcmFtZSwgdm9pZCAqY2xpZW50X2RhdGEpIHsKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiAvKiBlbmNvZGVyICovLAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpIHsKICAgICByZXR1cm4gKChTb2Z0RmxhY0VuY29kZXIqKSBjbGllbnRfZGF0YSktPm9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCiAgICAgICAgICAgICBidWZmZXIsIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKaW5kZXggNGM4MGRhNi4uYTAxMTJlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKQEAgLTE0LDQgKzE0LDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2c3MTFkZWMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCmluZGV4IGJjZGQzYzcuLjNhNjkwOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcApAQCAtMTE3LDcgKzExNywxNCBAQAogICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CiAgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGlucHV0IHBvcnQKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gbUlzTUxhdyA/IE9NWF9BVURJT19QQ01Nb2RlTVVMYXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE9NWF9BVURJT19QQ01Nb2RlQUxhdzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gb3V0cHV0IHBvcnQKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1sxXSA9IE9NWF9BVURJT19DaGFubmVsUkY7CiAKQEAgLTE4Miw3ICsxODksNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0RzcxMTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0RzcxMTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIxMiw3ICsyMTksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID4ga01heE51bVNhbXBsZXNQZXJGcmFtZSkgewotICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVsZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAKICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5tawppbmRleCA3MTYxM2QyLi4zMDg2OGQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQubWsKQEAgLTksNiArOSw4IEBACiAgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgIGV4dGVybmFsL2xpYmdzbS9pbmMKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCmluZGV4IDAwZTBjODUuLjRkZWJjNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEdTTTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0R1NNOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjAyLDEzICsyMDIsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglbGQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmKCgoaW5IZWFkZXItPm5GaWxsZWRMZW4gLyA2NSkgKiA2NSkgIT0gaW5IZWFkZXItPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgbm90IG11bHRpcGxlIG9mIDY1ICglbGQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgbm90IG11bHRpcGxlIG9mIDY1ICglZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjNjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAoraWZlcSAoJChpZiAkKHdpbGRjYXJkIGV4dGVybmFsL2xpYmhldmMpLDEsMCksMSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICAgICAgICAgIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfaGV2Y2RlYworTE9DQUxfTU9EVUxFX1RBR1MgICAgICAgOj0gb3B0aW9uYWwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyAgOj0gbGliaGV2Y2RlYworTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgOj0gU29mdEhFVkMuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChUT1ApL2V4dGVybmFsL2xpYmhldmMvZGVjb2RlcgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZXh0ZXJuYWwvbGliaGV2Yy9jb21tb24KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgIDo9IGxpYnN0YWdlZnJpZ2h0CitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJzdGFnZWZyaWdodF9vbXgKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnV0aWxzCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJsb2cKKworIyBXZSBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY3VycmVudCBhc20gZ2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgbGluayBlcnJvcjoKKyMgcmVxdWlyZXMgdW5zdXBwb3J0ZWQgZHluYW1pYyByZWxvYyBSX0FSTV9SRUwzMjsgcmVjb21waWxlIHdpdGggLWZQSUMKKyMgQnVnOiAxNjg1MzI5MQorTE9DQUxfTERGTEFHUyA6PSAtV2wsLUJzeW1ib2xpYworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjYmE1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcApAQCAtMCwwICsxLDc2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEhFVkMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisjaW5jbHVkZSAiaXRocmVhZC5oIgorI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKKyNpbmNsdWRlICJTb2Z0SEVWQy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGNvbXBvbmVudE5hbWUgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKKyNkZWZpbmUgY29kaW5nVHlwZSAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fQ29kaW5nSEVWQworI2RlZmluZSBDT0RFQ19NSU1FX1RZUEUgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMKKworLyoqIEZ1bmN0aW9uIGFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdG8ga2VlcCBjb2RlIHNpbWlsYXIgZm9yIGVhY2ggY29kZWMgKi8KKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfaW5pdF9pcF90ICAgICAgICAgICAgICAgIGloZXZjZF9jeGFfaW5pdF9pcF90CisjZGVmaW5lIGl2ZGV4dF9pbml0X29wX3QgICAgICAgICAgICAgICAgaWhldmNkX2N4YV9pbml0X29wX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90ICAgICAgICBpaGV2Y2RfY3hhX2ZpbGxfbWVtX3JlY19pcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCAgICAgICAgaWhldmNkX2N4YV9maWxsX21lbV9yZWNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfb3BfdAorCisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisKK3N0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0geworICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMSAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDIgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyMSB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMyAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMxIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0ICB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNDEgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorfTsKKworU29mdEhFVkM6OlNvZnRIRVZDKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50KG5hbWUsIGNvbXBvbmVudE5hbWUsIGNvZGluZ1R5cGUsCisgICAgICAgICAgICBrUHJvZmlsZUxldmVscywgQVJSQVlfU0laRShrUHJvZmlsZUxldmVscyksCisgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywKKyAgICAgICAgICAgIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtTWVtUmVjb3JkcyhOVUxMKSwKKyAgICAgIG1GbHVzaE91dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1PbXhDb2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSwKKyAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1OZXdXaWR0aChtV2lkdGgpLAorICAgICAgbU5ld0hlaWdodChtSGVpZ2h0KSwKKyAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24oZmFsc2UpIHsKKyAgICBpbml0UG9ydHMoa051bUJ1ZmZlcnMsIElOUFVUX0JVRl9TSVpFLCBrTnVtQnVmZmVycywKKyAgICAgICAgICAgIENPREVDX01JTUVfVFlQRSk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdEhFVkM6On5Tb2Z0SEVWQygpIHsKKyAgICBBTE9HRCgiSW4gU29mdEhFVkM6On5Tb2Z0SEVWQyIpOworICAgIENIRUNLX0VRKGRlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dEKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKwordm9pZCBTb2Z0SEVWQzo6bG9nVmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19jdGxfaXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfY3RsX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgc19jdGxfaXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfY3RsX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyB2ZXJzaW9uIG51bWJlcjogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIkl0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgICAgKGNoYXIgKilzX2N0bF9pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19jdGxfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgIHNfY3RsX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMilzdHJpZGU7CisgICAgc19jdGxfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKworICAgIHNfY3RsX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfY3RsX2lwLmVfdmlkX2RlY19tb2RlID0gSVZEX0RFQ09ERV9GUkFNRTsKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKworICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyB0aGUgcnVuLXRpbWUgcGFyYW1ldGVyczogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1Jc0luRmx1c2ggPSBmYWxzZTsKKyAgICBtUmVjZWl2ZWRFT1MgPSBmYWxzZTsKKyAgICBtZW1zZXQobVRpbWVTdGFtcHMsIDAsIHNpemVvZihtVGltZVN0YW1wcykpOworICAgIG1lbXNldChtVGltZVN0YW1wc1ZhbGlkLCAwLCBzaXplb2YobVRpbWVTdGFtcHNWYWxpZCkpOworCisgICAgLyogSW5pdGlhbGl6ZSBib3RoIHN0YXJ0IGFuZCBlbmQgdGltZXMgKi8KKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIE5VTEwpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsCisgICAgICAgICAgICAodm9pZCAqKSZzX2N0bF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiByZXNldDogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzICovCisgICAgc2V0UGFyYW1zKG91dHB1dEJ1ZmZlcldpZHRoKCkpOworCisgICAgLyogU2V0IG51bWJlciBvZiBjb3Jlcy90aHJlYWRzIHRvIGJlIHVzZWQgYnkgdGhlIGNvZGVjICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X2NvcmVzX29wOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX3NldF9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX05VTV9DT1JFUyk7CisgICAgc19zZXRfY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgQUxPR0QoIlNldCBudW1iZXIgb2YgY29yZXMgdG8gJXUiLCBzX3NldF9jb3Jlc19pcC51NF9udW1fY29yZXMpOworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfc2V0X2NvcmVzX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc19zZXRfY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyBudW1iZXIgb2YgY29yZXM6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfc2V0X2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc192aWRlb19mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc192aWRlb19mbHVzaF9vcDsKKworICAgIHNfdmlkZW9fZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfdmlkZW9fZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIEFMT0dEKCJTZXQgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZSAiKTsKKworICAgIC8qIFNldCB0aGUgZGVjb2RlciBpbiBGbHVzaCBtb2RlLCBzdWJzZXF1ZW50IGRlY29kZSgpIGNhbGxzIHdpbGwgZmx1c2ggKi8KKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX3ZpZGVvX2ZsdXNoX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc192aWRlb19mbHVzaF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZTogKCVkKSAweCV4Iiwgc3RhdHVzLAorICAgICAgICAgICAgICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1Jc0luRmx1c2ggPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OmluaXREZWNvZGVyKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKworICAgIFVXT1JEMzIgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOworICAgIFVXT1JEMzIgdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgVVdPUkQzMiB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICBXT1JEMzIgaTRfbGV2ZWw7CisKKyAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKworICAgIC8qIEluaXRpYWxpemUgbnVtYmVyIG9mIHJlZiBhbmQgcmVvcmRlciBtb2RlcyAoZm9yIEhFVkMpICovCisgICAgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gMTY7CisgICAgdTRfbnVtX3JlZl9mcmFtZXMgPSAxNjsKKyAgICB1NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgdWludDMyX3QgZGlzcGxheVNpemVZID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisKKyAgICBpZiAoZGlzcGxheVNpemVZID4gKDE5MjAgKiAxMDg4KSkgeworICAgICAgICBpNF9sZXZlbCA9IDUwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDEyODAgKiA3MjApKSB7CisgICAgICAgIGk0X2xldmVsID0gNDA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoOTYwICogNTQwKSkgeworICAgICAgICBpNF9sZXZlbCA9IDMxOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDY0MCAqIDM2MCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAzMDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgzNTIgKiAyODgpKSB7CisgICAgICAgIGk0X2xldmVsID0gMjE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAyMDsKKyAgICB9CisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19pcCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX29wKTsKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisKKyAgICAgICAgQUxPR1YoIkdldCBudW1iZXIgb2YgbWVtIHJlY29yZHMiKTsKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQqKSZzX251bV9tZW1fcmVjX2lwLAorICAgICAgICAgICAgICAgICh2b2lkKikmc19udW1fbWVtX3JlY19vcCk7CisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisgICAgfQorCisgICAgbU1lbVJlY29yZHMgPSAoaXZfbWVtX3JlY190KilpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAxMjgsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmIChtTWVtUmVjb3JkcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1zZXQobU1lbVJlY29yZHMsIDAsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworCisgICAgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1faXA7CisgICAgICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX29wOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9zaXplID0KKyAgICAgICAgICAgIHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX2ZpbGxfbWVtX2lwLmk0X2xldmVsID0gaTRfbGV2ZWw7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X251bV9yZWZfZnJhbWVzID0gdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfc2hhcmVfZGlzcF9idWYgPSB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9udW1fZXh0cmFfZGlzcF9idWYgPSAwOworICAgICAgICBzX2ZpbGxfbWVtX2lwLmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworCisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV93ZCA9IGRpc3BsYXlTdHJpZGU7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV9odCA9IGRpc3BsYXlIZWlnaHQ7CisgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfc2l6ZSA9CisgICAgICAgICAgICBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90KTsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKQorICAgICAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19maWxsX21lbV9pcCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSZzX2ZpbGxfbWVtX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0KKyAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBJVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KKyAgICB7CisgICAgICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgICAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgICAgICB2b2lkICpkZWNfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworCisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX2NtZCA9IChJVkRfQVBJX0NPTU1BTkRfVFlQRV9UKUlWX0NNRF9JTklUOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gZGlzcGxheVN0cmlkZTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gZGlzcGxheUhlaWdodDsKKworICAgICAgICBzX2luaXRfaXAuaTRfbGV2ZWwgPSBpNF9sZXZlbDsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9yZWZfZnJhbWVzID0gdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgICAgIHNfaW5pdF9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IHU0X3NoYXJlX2Rpc3BfYnVmOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX2V4dHJhX2Rpc3BfYnVmID0gMDsKKworICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X3NpemUgPSBzaXplb2Yoc19pbml0X29wKTsKKworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3JGb3JtYXQ7CisKKyAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90KiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgICAgICBtQ29kZWNDdHgtPnB2X2Z4bnMgPSBkZWNfZnhuczsKKyAgICAgICAgbUNvZGVjQ3R4LT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgICAgICBBTE9HRCgiSW5pdGlhbGl6aW5nIGRlY29kZXIiKTsKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19pbml0X2lwLAorICAgICAgICAgICAgICAgICh2b2lkICopJnNfaW5pdF9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGluaXQ6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgcGx1Z2luIHN0YXRlICovCisgICAgcmVzZXRQbHVnaW4oKTsKKworICAgIC8qIFNldCB0aGUgcnVuIHRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KKyAgICBzZXRQYXJhbXMoZGlzcGxheVN0cmlkZSk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGNvcmVzL3RocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgY29kZWMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgLyogR2V0IGNvZGVjIHZlcnNpb24gKi8KKyAgICBsb2dWZXJzaW9uKCk7CisKKyAgICAvKiBBbGxvY2F0ZSBpbnRlcm5hbCBwaWN0dXJlIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U2l6ZVkgKiAzIC8gMjsKKyAgICBtRmx1c2hPdXRCdWZmZXIgPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmIChOVUxMID09IG1GbHVzaE91dEJ1ZmZlcikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbUluaXROZWVkZWQgPSBmYWxzZTsKKyAgICBtRmx1c2hOZWVkZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpkZUluaXREZWNvZGVyKCkgeworICAgIHNpemVfdCBpOworCisgICAgaWYgKG1NZW1SZWNvcmRzKSB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIEFMT0dEKCJGcmVlaW5nIGNvZGVjIG1lbW9yeSIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgaWYocHNfbWVtX3JlYy0+cHZfYmFzZSkgeworICAgICAgICAgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihtRmx1c2hPdXRCdWZmZXIpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtRmx1c2hPdXRCdWZmZXIpOworICAgICAgICBtRmx1c2hPdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpyZUluaXREZWNvZGVyKCkgeworICAgIHN0YXR1c190IHJldDsKKworICAgIGRlSW5pdERlY29kZXIoKTsKKworICAgIHJldCA9IGluaXREZWNvZGVyKCk7CisgICAgaWYgKE9LICE9IHJldCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlIGZhaWx1cmUiKTsKKyAgICAgICAgZGVJbml0RGVjb2RlcigpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU29mdEhFVkM6Om9uUmVzZXQoKSB7CisgICAgQUxPR0QoIm9uUmVzZXQgY2FsbGVkIik7CisgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpOworCisgICAgcmVzZXREZWNvZGVyKCk7CisgICAgcmVzZXRQbHVnaW4oKTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0SEVWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBjb25zdCB1aW50MzJfdCBvbGRXaWR0aCA9IG1XaWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBvbGRIZWlnaHQgPSBtSGVpZ2h0OworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgaWYgKG1XaWR0aCAhPSBvbGRXaWR0aCB8fCBtSGVpZ2h0ICE9IG9sZEhlaWdodCkgeworICAgICAgICByZUluaXREZWNvZGVyKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgU29mdEhFVkM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCkgeworICAgIHNpemVfdCBzaXplWSA9IG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICBzaXplX3Qgc2l6ZVVWOworICAgIHVpbnQ4X3QgKnBCdWY7CisKKyAgICBwc19kZWNfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHBzX2RlY19pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKworICAgIC8qIFdoZW4gaW4gZmx1c2ggYW5kIGFmdGVyIEVPUyB3aXRoIHplcm8gYnl0ZSBpbnB1dCwKKyAgICAgKiBpbkhlYWRlciBpcyBzZXQgdG8gemVyby4gSGVuY2UgY2hlY2sgZm9yIG5vbi1udWxsICovCisgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSB0aW1lU3RhbXBJeDsKKyAgICAgICAgcHNfZGVjX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIKKyAgICAgICAgICAgICAgICArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBOVUxMOworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKG91dEhlYWRlcikgeworICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7CisgICAgfQorCisgICAgc2l6ZVVWID0gc2l6ZVkgLyA0OworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBzaXplWTsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gc2l6ZVVWOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBzaXplVVY7CisKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IHBCdWY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBwQnVmICsgc2l6ZVk7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBwQnVmICsgc2l6ZVkgKyBzaXplVVY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHJldHVybjsKK30KK3ZvaWQgU29mdEhFVkM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgLyogT25jZSB0aGUgb3V0cHV0IGJ1ZmZlcnMgYXJlIGZsdXNoZWQsIGlnbm9yZSBhbnkgYnVmZmVycyB0aGF0IGFyZSBoZWxkIGluIGRlY29kZXIgKi8KKyAgICBpZiAoa091dHB1dFBvcnRJbmRleCA9PSBwb3J0SW5kZXgpIHsKKyAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworCisgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBOVUxMLCBOVUxMLCAwKTsKKworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgIGlmICgwID09IHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0SEVWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIFVOVVNFRChwb3J0SW5kZXgpOworCisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtJbnB1dFBvcnRJbmRleCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKworICAgIC8qIElmIGlucHV0IEVPUyBpcyBzZWVuIGFuZCBkZWNvZGVyIGlzIG5vdCBpbiBmbHVzaCBtb2RlLAorICAgICAqIHNldCB0aGUgZGVjb2RlciBpbiBmbHVzaCBtb2RlLgorICAgICAqIFRoZXJlIGNhbiBiZSBhIGNhc2Ugd2hlcmUgRU9TIGlzIHNlbnQgYWxvbmcgd2l0aCBsYXN0IHBpY3R1cmUgZGF0YQorICAgICAqIEluIHRoYXQgY2FzZSwgb25seSBhZnRlciBkZWNvZGluZyB0aGF0IGlucHV0IGRhdGEsIGRlY29kZXIgaGFzIHRvIGJlCisgICAgICogcHV0IGluIGZsdXNoLiBUaGlzIGNhc2UgaXMgaGFuZGxlZCBoZXJlICAqLworCisgICAgaWYgKG1SZWNlaXZlZEVPUyAmJiAhbUlzSW5GbHVzaCkgeworICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbzsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlcjsKKyAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4OworCisgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICBpZiAoIW1Jc0luRmx1c2gpIHsKKyAgICAgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKKworICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCAmJiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJFT1Mgc2VlbiBvbiBpbnB1dCIpOworICAgICAgICAgICAgbVJlY2VpdmVkRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBhbiBpbml0IHJlcXVpcmVkIGFuZCB0aGUgZGVjb2RlciBpcyBub3QgaW4gZmx1c2ggbW9kZSwKKyAgICAgICAgLy8gdXBkYXRlIG91dHB1dCBwb3J0J3MgZGVmaW5pdGlvbiBhbmQgcmVpbml0aWFsaXplIGRlY29kZXIuCisgICAgICAgIGlmIChtSW5pdE5lZWRlZCAmJiAhbUlzSW5GbHVzaCkgeworICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisKKyAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBhIGZyZWUgc2xvdCBpbiB0aW1lc3RhbXAgYXJyYXkgdG8gaG9sZCBpbnB1dCB0aW1lc3RhbXAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICB0aW1lU3RhbXBJeCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RJTUVfU1RBTVBTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1UaW1lU3RhbXBzVmFsaWRbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZVN0YW1wSXggPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbdGltZVN0YW1wSXhdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1t0aW1lU3RhbXBJeF0gPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgICAgIFdPUkQzMiB0aW1lRGVsYXksIHRpbWVUYWtlbjsKKyAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworCisgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7CisKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKworICAgICAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBDb21wYXJlIHxzdGF0dXN8IHRvIElIRVZDRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TLCB3aGljaCBpcyBub3Qgb25lIG9mIHRoZQorICAgICAgICAgICAgLy8gSVZfQVBJX0NBTExfU1RBVFVTX1QsIHNlZW1zIGJlIHdyb25nLiBCdXQgdGhpcyBpcyB3aGF0IHRoZSBkZWNvZGVyIHJldHVybnMgcmlnaHQgbm93LgorICAgICAgICAgICAgLy8gVGhlIGRlY29kZXIgc2hvdWxkIGJlIGZpeGVkIHNvIHRoYXQgfHU0X2Vycm9yX2NvZGV8IGluc3RlYWQgb2YgfHN0YXR1c3wgcmV0dXJucworICAgICAgICAgICAgLy8gSUhFVkNEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMuCisgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkRGltZW5zaW9ucyA9CisgICAgICAgICAgICAgICAgKChJSEVWQ0RfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHx8IChJSEVWQ0RfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzX2RlY19vcC51NF9lcnJvcl9jb2RlKSk7CisgICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworCisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgTlVMTCk7CisgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKKyAgICAgICAgICAgICAgICAgICBzX2RlY19vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyAmJiAhbUZsdXNoTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChpbkhlYWRlciAhPSBOVUxMKSAmJiAoMSAhPSBzX2RlY19vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpKSB7CisgICAgICAgICAgICAgICAgLyogSWYgdGhlIGlucHV0IGRpZCBub3QgY29udGFpbiBwaWN0dXJlIGRhdGEsIHRoZW4gaWdub3JlCisgICAgICAgICAgICAgICAgICogdGhlIGFzc29jaWF0ZWQgdGltZXN0YW1wICovCisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFt0aW1lU3RhbXBJeF0gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIENUUyBEZWNvZGVyVGVzdCB0ZXN0Q29kZWNSZXNldHNIRVZDV2l0aG91dFN1cmZhY2UsCisgICAgICAgICAgICAvLyB3aGljaCBpcyBub3Qgc2VuZGluZyBTUFMvUFBTIGFmdGVyIHBvcnQgcmVjb25maWd1cmF0aW9uIGFuZCBmbHVzaCB0byB0aGUgY29kZWMuCisgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zICYmICFtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIHNfZGVjX29wLnU0X3BpY193ZCwgc19kZWNfb3AudTRfcGljX2h0KTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKworICAgICAgICAgICAgICAgIGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgY2hhbmdpbmcgcmVzb2x1dGlvbiBtb2RlIGFuZCB0aGVyZSBpcyBubyBvdXRwdXQgcHJlc2VudCwKKyAgICAgICAgICAgIC8vIHRoYXQgbWVhbnMgdGhlIHN3aXRjaGluZyBpcyBkb25lIGFuZCBpdCdzIHJlYWR5IHRvIHJlc2V0IHRoZSBkZWNvZGVyIGFuZCB0aGUgcGx1Z2luLgorICAgICAgICAgICAgaWYgKG1DaGFuZ2luZ1Jlc29sdXRpb24gJiYgIXNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgfHwgcmVzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucykgeworICAgICAgICAgICAgICAgICAgICBtTmV3V2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgICAgIG1OZXdIZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoMCA8IHNfZGVjX29wLnU0X3BpY193ZCkgJiYgKDAgPCBzX2RlY19vcC51NF9waWNfaHQpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gc19kZWNfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtVGltZVN0YW1wc1tzX2RlY19vcC51NF90c107CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFtzX2RlY19vcC51NF90c10gPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIElmIGluIGZsdXNoIG1vZGUgYW5kIG5vIG91dHB1dCBpcyByZXR1cm5lZCBieSB0aGUgY29kZWMsCisgICAgICAgICAgICAgICAgICogdGhlbiBjb21lIG91dCBvZiBmbHVzaCBtb2RlICovCisgICAgICAgICAgICAgICAgbUlzSW5GbHVzaCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLyogSWYgRU9TIHdhcyByZWNpZXZlZCBvbiBpbnB1dCBwb3J0IGFuZCB0aGVyZSBpcyBubyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2RlYywgdGhlbiBzaWduYWwgRU9TIG9uIG91dHB1dCBwb3J0ICovCisgICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlZEVPUykgeworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogSGFuZGxlIG1vcmUgdGhhbiBvbmUgcGljdHVyZSBkYXRhCisgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEhFVkMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxZjUyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfSEVWQ19IXworCisjZGVmaW5lIFNPRlRfSEVWQ19IXworCisjaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCisjZGVmaW5lIGl2ZF9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKKworLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0aW1lLXN0YW1wIGFycmF5ICovCisjZGVmaW5lIE1BWF9USU1FX1NUQU1QUyA2NAorCisvKiogTWF4aW11bSBudW1iZXIgb2YgY29yZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYyAqLworI2RlZmluZSBDT0RFQ19NQVhfTlVNX0NPUkVTIDQKKworI2RlZmluZSBDT0RFQ19NQVhfV0lEVEggICAgIDE5MjAKKworI2RlZmluZSBDT0RFQ19NQVhfSEVJR0hUICAgIDEwODgKKworLyoqIElucHV0IGJ1ZmZlciBzaXplICovCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICgxMDI0ICogMTAyNCkKKworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSkgPyAoYSkgOiAoYikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpOworCitzdHJ1Y3QgU29mdEhFVkM6IHB1YmxpYyBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IHsKKyAgICBTb2Z0SEVWQyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRIRVZDKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7Citwcml2YXRlOgorICAgIC8vIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSA4CisgICAgfTsKKworICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAorICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKworICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHRvIGJlIHVlc2QgYnkgdGhlIGNvZGVjCisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICAgIC8vIEludGVybmFsIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGZsdXNoIG91dCB0aGUgYnVmZmVycyBmcm9tIGRlY29kZXIKKyAgICB1aW50OF90ICptRmx1c2hPdXRCdWZmZXI7CisKKyAgICAvLyBTdGF0dXMgb2YgZW50cmllcyBpbiB0aGUgdGltZXN0YW1wIGFycmF5CisgICAgYm9vbCBtVGltZVN0YW1wc1ZhbGlkW01BWF9USU1FX1NUQU1QU107CisKKyAgICAvLyBUaW1lc3RhbXAgYXJyYXkgLSBTaW5jZSBjb2RlYyBkb2VzIG5vdCB0YWtlIDY0IGJpdCB0aW1lc3RhbXBzLAorICAgIC8vIHRoZXkgYXJlIG1haW50YWluZWQgaW4gdGhlIHBsdWdpbgorICAgIE9NWF9TNjQgbVRpbWVTdGFtcHNbTUFYX1RJTUVfU1RBTVBTXTsKKworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1PbXhDb2xvckZvcm1hdDsgICAgLy8gT01YIENvbG9yIGZvcm1hdAorICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OyAgICAgICAgLy8gSXR0aWFtIENvbG9yIGZvcm1hdAorCisgICAgYm9vbCBtSXNJbkZsdXNoOyAgICAgICAgLy8gY29kZWMgaXMgZmx1c2ggbW9kZQorICAgIGJvb2wgbVJlY2VpdmVkRU9TOyAgICAgIC8vIEVPUyBpcyByZWNlaWV2ZWQgb24gaW5wdXQgcG9ydAorICAgIGJvb2wgbUluaXROZWVkZWQ7CisgICAgdWludDMyX3QgbU5ld1dpZHRoOworICAgIHVpbnQzMl90IG1OZXdIZWlnaHQ7CisgICAgLy8gVGhlIGlucHV0IHN0cmVhbSBoYXMgY2hhbmdlZCB0byBhIGRpZmZlcmVudCByZXNvbHV0aW9uLCB3aGljaCBpcyBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgLy8gY29kZWMuIFNvIHRoZSBjb2RlYyBpcyBzd2l0Y2hpbmcgdG8gZGVjb2RlIHRoZSBuZXcgcmVzb2x1dGlvbi4KKyAgICBib29sIG1DaGFuZ2luZ1Jlc29sdXRpb247CisgICAgYm9vbCBtRmx1c2hOZWVkZWQ7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlSW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSk7CisgICAgdm9pZCBsb2dWZXJzaW9uKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IHJlSW5pdERlY29kZXIoKTsKKworICAgIHZvaWQgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKKyAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTIChTb2Z0SEVWQyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9IRVZDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKaW5kZXggYTNkNTc3OS4uMWQyMzJjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawpAQCAtNDYsNiArNDYsOCBAQAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC03Miw0ICs3NCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IGZiMmE0MzAuLjFmNGI2ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgU29mdE1QRUc0OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRNUEVHNDo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMzQsNiArMTM0LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICB1aW50MzJfdCAqc3RhcnRfY29kZSA9ICh1aW50MzJfdCAqKWJpdHN0cmVhbTsKKyAgICAgICAgYm9vbCB2b2xIZWFkZXIgPSAqc3RhcnRfY29kZSA9PSAweEIwMDEwMDAwOworICAgICAgICBpZiAodm9sSGVhZGVyKSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobUhhbmRsZSk7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7CiAgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXTsKQEAgLTE0MSw3ICsxNDcsNyBAQAogCiAgICAgICAgICAgICB2b2xfZGF0YVswXSA9IE5VTEw7CiAKLSAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKKyAgICAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB8fCB2b2xIZWFkZXIpIHsKICAgICAgICAgICAgICAgICB2b2xfZGF0YVswXSA9IGJpdHN0cmVhbTsKICAgICAgICAgICAgICAgICB2b2xfc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogICAgICAgICAgICAgfQpAQCAtMTUwLDcgKzE1Niw4IEBACiAgICAgICAgICAgICAgICAgKG1Nb2RlID09IE1PREVfTVBFRzQpID8gTVBFRzRfTU9ERSA6IEgyNjNfTU9ERTsKIAogICAgICAgICAgICAgQm9vbCBzdWNjZXNzID0gUFZJbml0VmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtV2lkdGgsIG1IZWlnaHQsIG1vZGUpOworICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJXaWR0aCgpLCBvdXRwdXRCdWZmZXJIZWlnaHQoKSwgbW9kZSk7CiAKICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJQVkluaXRWaWRlb0RlY29kZXIgZmFpbGVkLiBVbnN1cHBvcnRlZCBjb250ZW50PyIpOwpAQCAtMTY5LDIxICsxNzYsMjYgQEAKIAogICAgICAgICAgICAgUFZTZXRQb3N0UHJvY1R5cGUoKFZpZGVvRGVjQ29udHJvbHMgKikgbUhhbmRsZSwgMCk7CiAKKyAgICAgICAgICAgIGJvb2wgaGFzRnJhbWVEYXRhID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CiAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CiAgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKICAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZvbEhlYWRlcikgeworICAgICAgICAgICAgICAgIGhhc0ZyYW1lRGF0YSA9IHRydWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CiAKLSAgICAgICAgICAgIGlmIChtb2RlID09IE1QRUc0X01PREUgJiYgcG9ydFNldHRpbmdzQ2hhbmdlZCgpKSB7CisgICAgICAgICAgICBpZiAobW9kZSA9PSBNUEVHNF9NT0RFICYmIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghaGFzRnJhbWVEYXRhKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CkBAIC0yMjMsNyArMjM1LDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKCkpIHsKKyAgICAgICAgLy8gSDI2MyBkb2Vzbid0IGhhdmUgVk9MIGhlYWRlciwgdGhlIGZyYW1lIHNpemUgaW5mb3JtYXRpb24gaXMgaW4gc2hvcnQgaGVhZGVyLCBpLmUuIHRoZQorICAgICAgICAvLyBkZWNvZGVyIG1heSBkZXRlY3Qgc2l6ZSBjaGFuZ2UgYWZ0ZXIgUFZEZWNvZGVWaWRlb0ZyYW1lLgorICAgICAgICBpZiAoaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yNjksNyArMjgzLDcgQEAKICAgICB9CiB9CiAKLWJvb2wgU29mdE1QRUc0Ojpwb3J0U2V0dGluZ3NDaGFuZ2VkKCkgeworYm9vbCBTb2Z0TVBFRzQ6OmhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgpIHsKICAgICB1aW50MzJfdCBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodDsKICAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtSGFuZGxlLCAoaW50MzIgKikmZGlzcF93aWR0aCwgKGludDMyICopJmRpc3BfaGVpZ2h0KTsKIApAQCAtMjgyLDI1ICsyOTYsMjQgQEAKICAgICBBTE9HVigiZGlzcF93aWR0aCA9ICVkLCBkaXNwX2hlaWdodCA9ICVkLCBidWZfd2lkdGggPSAlZCwgYnVmX2hlaWdodCA9ICVkIiwKICAgICAgICAgICAgIGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0LCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQpOwogCi0gICAgaWYgKG1Dcm9wV2lkdGggIT0gZGlzcF93aWR0aAotICAgICAgICAgICAgfHwgbUNyb3BIZWlnaHQgIT0gZGlzcF9oZWlnaHQpIHsKLSAgICAgICAgbUNyb3BMZWZ0ID0gMDsKLSAgICAgICAgbUNyb3BUb3AgPSAwOwotICAgICAgICBtQ3JvcFdpZHRoID0gZGlzcF93aWR0aDsKLSAgICAgICAgbUNyb3BIZWlnaHQgPSBkaXNwX2hlaWdodDsKKyAgICBDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUgPSBrQ3JvcFVuU2V0OworICAgIGlmIChkaXNwX3dpZHRoICE9IGJ1Zl93aWR0aCB8fCBkaXNwX2hlaWdodCAhPSBidWZfaGVpZ2h0KSB7CisgICAgICAgIGNyb3BTZXR0aW5nc01vZGUgPSBrQ3JvcFNldDsKIAotICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwKLSAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAotICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmIChtQ3JvcFdpZHRoICE9IGRpc3Bfd2lkdGggfHwgbUNyb3BIZWlnaHQgIT0gZGlzcF9oZWlnaHQpIHsKKyAgICAgICAgICAgIG1Dcm9wTGVmdCA9IDA7CisgICAgICAgICAgICBtQ3JvcFRvcCA9IDA7CisgICAgICAgICAgICBtQ3JvcFdpZHRoID0gZGlzcF93aWR0aDsKKyAgICAgICAgICAgIG1Dcm9wSGVpZ2h0ID0gZGlzcF9oZWlnaHQ7CisgICAgICAgICAgICBjcm9wU2V0dGluZ3NNb2RlID0ga0Nyb3BDaGFuZ2VkOworICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGJ1Zl93aWR0aCAhPSBtV2lkdGggfHwgYnVmX2hlaWdodCAhPSBtSGVpZ2h0KSB7Ci0gICAgICAgIG1XaWR0aCA9IGJ1Zl93aWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGJ1Zl9oZWlnaHQ7Ci0KLSAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7Ci0KKyAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICBjb25zdCBib29sIGZha2VTdHJpZGUgPSB0cnVlOworICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKKyAgICAgICAgICAgICZwb3J0V2lsbFJlc2V0LCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQsIGNyb3BTZXR0aW5nc01vZGUsIGZha2VTdHJpZGUpOworICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CiAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX0gyNjMpIHsKICAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtSGFuZGxlKTsKIApAQCAtMzA5LDcgKzMyMiw3IEBACiAKICAgICAgICAgICAgIHZvbF9kYXRhWzBdID0gTlVMTDsKICAgICAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtV2lkdGgsIG1IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG91dHB1dEJ1ZmZlcldpZHRoKCksIG91dHB1dEJ1ZmZlckhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICBIMjYzX01PREUpKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0zMTgsMTMgKzMzMSw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOwotCi0gICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOwotICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHBvcnRXaWxsUmVzZXQ7CiB9CiAKIHZvaWQgU29mdE1QRUc0OjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKaW5kZXggZGUxNGFhZi4uOGEwNmEwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKIAogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLSAgICBib29sIHBvcnRTZXR0aW5nc0NoYW5nZWQoKTsKKyAgICBib29sIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE1QRUc0KTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcAppbmRleCBlMjNmMjNkLi5mZTllN2RjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAKQEAgLTk2LDcgKzk2LDcgQEAKICAgICBvZmZzZXQgPSB3aWR0aCAtIEJfU0laRTsgLyogb2Zmc2V0IGZvciBwcmV2ICovCiAgICAgb2Zmc2V0MiA9IChwcmVkX3dpZHRoX3JuZCA+PiAxKSAtIDQ7IC8qIG9mZnNldCBmb3IgcHJlZF9ibG9jayAqLwogCi0gICAgdG1wID0gKHVpbnQzMilwcmV2ICYgMHgzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDB4MzsKICAgICBwcmVkX2Jsb2NrIC09IG9mZnNldDI7IC8qIHByZXNldCAqLwogCiAgICAgaWYgKHRtcCA9PSAwKSAgLyogd29yZC1hbGlnbmVkICovCkBAIC0yMDMsNyArMjAzLDcgQEAKICAgICAvKiBCcmFuY2ggYmFzZWQgb24gcGl4ZWwgbG9jYXRpb24gKGhhbGYtcGVsIG9yIGZ1bGwtcGVsKSBmb3IgeCBhbmQgeSAqLwogICAgIHByZWRfYmxvY2sgLT0gb2Zmc2V0MjsgLyogcHJlc2V0ICovCiAKLSAgICB0bXAgPSAodWludDMyKXByZXYgJiAzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDM7CiAgICAgbWFzayA9IDI1NDsKICAgICBtYXNrIHw9IChtYXNrIDw8IDgpOwogICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweEZFRkVGRUZFICovCkBAIC01MzIsNyArNTMyLDcgQEAKICAgICAvKiBCcmFuY2ggYmFzZWQgb24gcGl4ZWwgbG9jYXRpb24gKGhhbGYtcGVsIG9yIGZ1bGwtcGVsKSBmb3IgeCBhbmQgeSAqLwogICAgIHByZWRfYmxvY2sgLT0gb2Zmc2V0MjsgLyogcHJlc2V0ICovCiAKLSAgICB0bXAgPSAodWludDMyKXByZXYgJiAzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDM7CiAgICAgbWFzayA9IDI1NDsKICAgICBtYXNrIHw9IChtYXNrIDw8IDgpOwogICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweEZFRkVGRUZFICovCkBAIC04ODQsNyArODg0LDcgQEAKICAgICBtYXNrIHw9IChtYXNrIDw8IDgpOwogICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweDNmM2YzZjNmICovCiAKLSAgICB0bXAgPSAodWludDMyKXByZXYgJiAzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDM7CiAKICAgICBwcmVkX2Jsb2NrIC09IDQ7IC8qIHByZXNldCAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcAppbmRleCBiM2MzNTBmLi5iMDNlYzhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKQEAgLTE0MjYsNyArMTQyNiw3IEBACiAgICAgICAgIHZpZGVvLT5uQml0c0Zvck1CSUQgPSBDYWxjTnVtQml0cygodWludCl2aWRlby0+blRvdGFsTUIgLSAxKTsgLyogb3RoZXJ3aXNlIGNhbGN1bGF0ZSBhYm92ZSAqLwogICAgIH0KICAgICBzaXplID0gKGludDMyKXZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7Ci0gICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCAmJiBzaXplID4gdmlkZW8tPnZpZGVvRGVjQ29udHJvbHMtPnNpemUpCisgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IFBfVk9QICYmIHNpemUgPiB2aWRlby0+dmlkZW9EZWNDb250cm9scy0+c2l6ZSkKICAgICB7CiAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CiAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCmluZGV4IDgzYTJkZDIuLmM5MDA2ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKQEAgLTMzLDYgKzMzLDggQEAKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTcyLDQgKzc0LDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZW5jCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCBlMDJhZjkwLi5jODdkMTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTMzLDYgKzMzLDggQEAKIAogI2luY2x1ZGUgIlNvZnRNUEVHNEVuY29kZXIuaCIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdGVtcGxhdGU8Y2xhc3MgVD4KQEAgLTQ0LDQyICs0NiwxMiBAQAogICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7CiB9CiAKLWlubGluZSBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAotICAgICAgICB1aW50OF90ICppbnl1diwgdWludDhfdCogb3V0eXV2LAotICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotCi0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogU29mdE1QRUc0RW5jb2Rlcjo6U29mdE1QRUc0RW5jb2RlcigKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgIDogU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtRW5jb2RlTW9kZShDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTKSwKICAgICAgIG1WaWRlb1dpZHRoKDE3NiksCiAgICAgICBtVmlkZW9IZWlnaHQoMTQ0KSwKQEAgLTE0Nyw5ICsxMTksMTAgQEAKICAgICBtRW5jUGFyYW1zLT5xdWFudFR5cGVbMF0gPSAwOwogICAgIG1FbmNQYXJhbXMtPm5vRnJhbWVTa2lwcGVkID0gUFZfT0ZGOwogCi0gICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIKKyAgICAgICAgICAgIHx8IG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7CiAgICAgICAgIC8vIENvbG9yIGNvbnZlcnNpb24gaXMgbmVlZGVkLgotICAgICAgICBDSEVDSyhtSW5wdXRGcmFtZURhdGEgPT0gTlVMTCk7CisgICAgICAgIGZyZWUobUlucHV0RnJhbWVEYXRhKTsKICAgICAgICAgbUlucHV0RnJhbWVEYXRhID0KICAgICAgICAgICAgICh1aW50OF90ICopIG1hbGxvYygobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzICkgPj4gMSk7CiAgICAgICAgIENIRUNLKG1JbnB1dEZyYW1lRGF0YSAhPSBOVUxMKTsKQEAgLTIxNCw3ICsxODcsNyBAQAogCiAgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKG1IYW5kbGUpOwogCi0gICAgZGVsZXRlIG1JbnB1dEZyYW1lRGF0YTsKKyAgICBmcmVlKG1JbnB1dEZyYW1lRGF0YSk7CiAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKIAogICAgIGRlbGV0ZSBtRW5jUGFyYW1zOwpAQCAtNDg0LDYgKzQ1NywxNyBAQAogICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKICAgICAgICAgICAgICAgICBtVmlkZW9GcmFtZVJhdGUgPSBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2OwogICAgICAgICAgICAgICAgIG1WaWRlb0NvbG9yRm9ybWF0ID0gZGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0OworCisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZiA9CisgICAgICAgICAgICAgICAgICAgICZlZGl0UG9ydEluZm8oMCktPm1EZWY7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1WaWRlb0hlaWdodDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSkgbVZpZGVvQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICAgICAgcG9ydERlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1WaWRlb0hlaWdodDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVZpZGVvQml0UmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlOwogICAgICAgICAgICAgfQpAQCAtNjA1LDExICs1ODksNyBAQAogICAgICAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluQnVmZmVycyA/ICIgdHJ1ZSIgOiAiZmFsc2UiKTsKIAogICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC02MjAsNyArNjAwLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdE1QRUc0RW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0TVBFRzRFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2F3SW5wdXRFT1MpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTY3NywzNiArNjU3LDM2IEBACiAgICAgICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90IHNyY0J1ZmZlcjsgLy8gZm9yIE1ldGFEYXRhTW9kZSBvbmx5CiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dERhdGEgPSBOVUxMOwogICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICE9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1ldGFEYXRhIGJ1ZmZlciBpcyB3cm9uZyBzaXplISAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIihnb3QgJWx1IGJ5dGVzLCBleHBlY3RlZCA4KSIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdvdCAldSBieXRlcywgZXhwZWN0ZWQgOCkiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYWxsb2NEYXRhKGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEsIChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZXh0cmFjdCBncmFsbG9jIGJ1ZmZlciBpbiBtZXRhZGF0YSBtb2RlIik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5L2NvbnZlcnQgcGl4ZWwgZm9ybWF0IGVudW0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5wdXREYXRhID0gKHVpbnQ4X3QgKilpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IChjb25zdCB1aW50OF90ICopaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLCBtSW5wdXRGcmFtZURhdGEsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBDSEVDSyhpbnB1dERhdGEgIT0gTlVMTCk7CiAKICAgICAgICAgICAgIFZpZGVvRW5jRnJhbWVJTyB2aW4sIHZvdXQ7CkBAIC03MTUsMTcgKzY5NSwxNyBAQAogICAgICAgICAgICAgdmluLmhlaWdodCA9ICgobVZpZGVvSGVpZ2h0ICArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgdmluLnBpdGNoID0gKChtVmlkZW9XaWR0aCArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgdmluLnRpbWVzdGFtcCA9IChpbkhlYWRlci0+blRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKLSAgICAgICAgICAgIHZpbi55Q2hhbiA9IGlucHV0RGF0YTsKKyAgICAgICAgICAgIHZpbi55Q2hhbiA9ICh1aW50OF90ICopaW5wdXREYXRhOwogICAgICAgICAgICAgdmluLnVDaGFuID0gdmluLnlDaGFuICsgdmluLmhlaWdodCAqIHZpbi5waXRjaDsKICAgICAgICAgICAgIHZpbi52Q2hhbiA9IHZpbi51Q2hhbiArICgodmluLmhlaWdodCAqIHZpbi5waXRjaCkgPj4gMik7CiAKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kVGltZU1zID0gMDsKKyAgICAgICAgICAgIFVMb25nIG1vZFRpbWVNcyA9IDA7CiAgICAgICAgICAgICBpbnQzMl90IG5MYXllciA9IDA7CiAgICAgICAgICAgICBNUDRIaW50VHJhY2sgaGludFRyYWNrOwogICAgICAgICAgICAgaWYgKCFQVkVuY29kZVZpZGVvRnJhbWUobUhhbmRsZSwgJnZpbiwgJnZvdXQsCiAgICAgICAgICAgICAgICAgICAgICZtb2RUaW1lTXMsIG91dFB0ciwgJmRhdGFMZW5ndGgsICZuTGF5ZXIpIHx8CiAgICAgICAgICAgICAgICAgIVBWR2V0SGludFRyYWNrKG1IYW5kbGUsICZoaW50VHJhY2spKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUgb3IgZ2V0IGhpbmsgdHJhY2sgYXQgZnJhbWUgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUgb3IgZ2V0IGhpbmsgdHJhY2sgYXQgZnJhbWUgJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICBtTnVtSW5wdXRGcmFtZXMpOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwpAQCAtNzQyLDcgKzcyMiw2IEBACiAKICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CkBAIC03NTcsNDcgKzczNiw2IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRNUEVHNEVuY29kZXI6OmdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewotICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpKSB7Ci0gICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLX0KLQotdWludDhfdCAqU29mdE1QRUc0RW5jb2Rlcjo6ZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKSB7Ci0gICAgT01YX1UzMiB0eXBlID0gKihPTVhfVTMyKilkYXRhOwotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAodHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewotICAgICAgICBBTE9HRSgiRGF0YSBwYXNzZWQgaW4gd2l0aCBtZXRhZGF0YSBtb2RlIGRvZXMgbm90IGhhdmUgdHlwZSAiCi0gICAgICAgICAgICAgICAgImtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlICglZCksIGhhcyB0eXBlICVsZCBpbnN0ZWFkIiwKLSAgICAgICAgICAgICAgICBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBidWZmZXJfaGFuZGxlX3QgaW1nQnVmZmVyID0gKihidWZmZXJfaGFuZGxlX3QqKSgodWludDhfdCopZGF0YSArIDQpOwotCi0gICAgY29uc3QgUmVjdCByZWN0KG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwotICAgIHVpbnQ4X3QgKmltZzsKLSAgICByZXMgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKGltZ0J1ZmZlciwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKLSAgICAgICAgICAgIHJlY3QsICh2b2lkKiopJmltZyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBsb2NrIGltYWdlIGJ1ZmZlciAlcCBmb3IgYWNjZXNzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIGltZ0J1ZmZlcik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgICpidWZmZXIgPSBpbWdCdWZmZXI7Ci0gICAgcmV0dXJuIGltZzsKLX0KLQotdm9pZCBTb2Z0TVBFRzRFbmNvZGVyOjpyZWxlYXNlR3JhbGxvY0RhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlcikgewotICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewotICAgICAgICBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS51bmxvY2soYnVmZmVyKTsKLSAgICB9Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCmluZGV4IGNjNGVhOGYuLmIwNjA1YjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKIAogCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIAotc3RydWN0IFNvZnRNUEVHNEVuY29kZXIgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CitzdHJ1Y3QgU29mdE1QRUc0RW5jb2RlciA6IHB1YmxpYyBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50IHsKICAgICBTb2Z0TVBFRzRFbmNvZGVyKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKQEAgLTQzLDExICs0Myw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAKLSAgICAvLyBPdmVycmlkZSBTb2Z0T01YQ29tcG9uZW50IG1ldGhvZHMKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKLQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflNvZnRNUEVHNEVuY29kZXIoKTsKIApAQCAtNTYsMTAgKzUxLDYgQEAKICAgICAgICAga051bUJ1ZmZlcnMgPSAyLAogICAgIH07CiAKLSAgICBlbnVtIHsKLSAgICAgICAga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkICsgMQotICAgIH07Ci0KICAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncwogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgaW50NjRfdCBtVGltZVVzOwpAQCAtOTAsOSArODEsNiBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW5pdEVuY29kZXIoKTsKICAgICBPTVhfRVJST1JUWVBFIHJlbGVhc2VFbmNvZGVyKCk7CiAKLSAgICB1aW50OF90KiBleHRyYWN0R3JhbGxvY0RhdGEodm9pZCAqZGF0YSwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpOwotICAgIHZvaWQgcmVsZWFzZUdyYWxsb2NEYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIpOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE1QRUc0RW5jb2Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaAppbmRleCBhNTRmZDhiLi45NDUxNDc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKQEAgLTI5LDcgKzI5LDcgQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVNob3J0OwogdHlwZWRlZiBzaG9ydCBTaG9ydDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IEJvb2w7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxvbmc7Cit0eXBlZGVmIHVpbnQzMl90IFVMb25nOwogCiAjZGVmaW5lIFBWX0NPREVDX0lOSVQgIDAKICNkZWZpbmUgUFZfQ09ERUNfU1RPUCAgMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKaW5kZXggZmE1MGVlYi4uZmE0YWUyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgICAgIG91dFs0MF0gPSBrNCA7ICAgLyogcm93IDUgKi8KICAgICAgICAgICAgIG91dCsrOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKyAgICAgICAgd2hpbGUgKCh1aW50cHRyX3Qpb3V0IDwgKHVpbnRwdHJfdClkc3QpIDsKIAogICAgICAgICByZXR1cm4gOwogICAgIH0KQEAgLTQ1NSw3ICs0NTUsNyBAQAogICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLwogICAgICAgICAgICAgb3V0Kys7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworICAgICAgICB3aGlsZSAoKHVpbnRwdHJfdClvdXQgPCAodWludHB0cl90KWRzdCkgOwogCiAgICAgICAgIHJldHVybiA7CiAgICAgfQpAQCAtNjM1LDcgKzYzNSw3IEBACiAgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCiAgICAgICAgICAgICBvdXQrKzsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisgICAgICAgIHdoaWxlICgodWludHB0cl90KW91dCA8ICh1aW50cHRyX3QpZHN0KSA7CiAKICAgICAgICAgcmV0dXJuIDsKICAgICB9CkBAIC04NDYsNyArODQ2LDcgQEAKICAgICAgICAgICAgIG91dFs0MF0gPSBrNCA7ICAgLyogcm93IDUgKi8KICAgICAgICAgICAgIG91dCsrOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKyAgICAgICAgd2hpbGUgKCh1aW50cHRyX3Qpb3V0IDwgKHVpbnRwdHJfdClkc3QpIDsKIAogICAgICAgICByZXR1cm4gOwogICAgIH0KQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCiAgICAgICAgICAgICBvdXQrKzsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisgICAgICAgIHdoaWxlICgodWludHB0cl90KW91dCA8ICh1aW50cHRyX3QpZHN0KSA7CiAKICAgICAgICAgcmV0dXJuIDsKICAgICB9CkBAIC0xMTk1LDcgKzExOTUsNyBAQAogICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLwogICAgICAgICAgICAgb3V0Kys7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworICAgICAgICB3aGlsZSAoKHVpbnRwdHJfdClvdXQgPCAodWludHB0cl90KWRzdCkgOwogCiAgICAgICAgIHJldHVybiA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcAppbmRleCA2ZmQ0MWMzLi4wYWQzOWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcApAQCAtNTcyLDcgKzU3Miw3IEBACiAgICAgICAgIGN1cjIgICAgPSBjdXIyICYgKG1hc2sgPDwgOCk7ICAgLyogbWFzayBmaXJzdCBhbmQgdGhpcmQgYnl0ZXMgKi8KICAgICAgICAgc3VtMiAgICA9IHN1bTIgKyAoKFVJbnQpY3VyMiA+PiA4KTsKICAgICB9Ci0gICAgd2hpbGUgKChVSW50KWN1ckludCA8IChVSW50KWVuZCk7CisgICAgd2hpbGUgKCh1aW50cHRyX3QpY3VySW50IDwgKHVpbnRwdHJfdCllbmQpOwogCiAgICAgY3VyMSA9IHN1bTQgLSAoc3VtMiA8PCA4KTsgIC8qIGdldCBldmVuLXN1bSAqLwogICAgIGN1cjEgPSBjdXIxICsgc3VtMjsgICAgICAgICAvKiBhZGQgMTYgYml0IGV2ZW4tc3VtIGFuZCBvZGQtc3VtKi8KQEAgLTYxMSw3ICs2MTEsNyBAQAogICAgICAgICBsb2FkMiA9IGxvYWQyICYgKG1hc2sgPDwgOCk7IC8qIGV2ZW4gYnl0ZXMgKi8KICAgICAgICAgc3VtMiArPSAoKFVJbnQpbG9hZDIgPj4gOCk7IC8qIHN1bSBldmVuIGJ5dGVzLCAxNiBiaXQgKi8KICAgICB9Ci0gICAgd2hpbGUgKChVSW50KWN1ckludCA8IChVSW50KWVuZCk7CisgICAgd2hpbGUgKCh1aW50cHRyX3QpY3VySW50IDwgKHVpbnRwdHJfdCllbmQpOwogICAgIGxvYWQxID0gc3VtNCAtIChzdW0yIDw8IDgpOyAgICAgLyogZ2V0IGV2ZW4tc3VtICovCiAgICAgbG9hZDEgPSBsb2FkMSArIHN1bTI7ICAgICAgICAgICAvKiBhZGQgMTYgYml0IGV2ZW4tc3VtIGFuZCBvZGQtc3VtKi8KICAgICBsb2FkMSA9IGxvYWQxICsgKGxvYWQxIDw8IDE2KTsgIC8qIGFkZCB1cHBlciBhbmQgbG93ZXIgMTYgYml0IHN1bSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCmluZGV4IGI4MWQyNzguLjlhOTY3YzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgIC8qIGluaXRpYWxpemUgb2Zmc2V0IHRvIGFkanVzdCBwaXhlbCBjb3VudGVyICovCiAgICAgLyogICAgdGhlIG5leHQgcm93OyBmdWxsLXBlbCByZXNvbHV0aW9uICAgICAgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMHgzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDB4MzsKIAogICAgIGlmICh0bXAgPT0gMCkgIC8qIHdvcmQtYWxpZ25lZCAqLwogICAgIHsKQEAgLTQ2Niw3ICs0NjYsNyBAQAogICAgIC8qIEJyYW5jaCBiYXNlZCBvbiBwaXhlbCBsb2NhdGlvbiAoaGFsZi1wZWwgb3IgZnVsbC1wZWwpIGZvciB4IGFuZCB5ICovCiAgICAgcmVjIC09IDEyOyAvKiBwcmVzZXQgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogICAgIG1hc2sgPSAyNTQ7CiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLwpAQCAtNzkxLDcgKzc5MSw3IEBACiAgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KICAgICByZWMgLT0gMTI7IC8qIHByZXNldCAqLwogCi0gICAgdG1wID0gKFVMb25nKXByZXYgJiAzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDM7CiAgICAgbWFzayA9IDI1NDsKICAgICBtYXNrIHw9IChtYXNrIDw8IDgpOwogICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweEZFRkVGRUZFICovCkBAIC0xMTQwLDcgKzExNDAsNyBAQAogICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CiAgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4M2YzZjNmM2YgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogCiAgICAgcmVjIC09IDQ7IC8qIHByZXNldCAqLwogCkBAIC0xOTU5LDcgKzE5NTksNyBAQAogICAgICAgICBkc3QgKz0gb2Zmc2V0OwogICAgICAgICBzcmMgKz0gb2Zmc2V0OwogICAgIH0KLSAgICB3aGlsZSAoKFVJbnQpc3JjIDwgKFVJbnQpZW5kKTsKKyAgICB3aGlsZSAoKHVpbnRwdHJfdClzcmMgPCAodWludHB0cl90KWVuZCk7CiAKICAgICByZXR1cm4gOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaAppbmRleCAwZDVhM2U4Li4yZDQ0NDgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaApAQCAtNjAsNyArNjAsNyBAQAogdHlwZWRlZiBzaG9ydCBTaG9ydDsKIHR5cGVkZWYgc2hvcnQgaW50IFNJbnQ7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBCb29sOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUxvbmc7Cit0eXBlZGVmIHVpbnQzMl90IFVMb25nOwogdHlwZWRlZiB2b2lkIFZvaWQ7CiAKICNkZWZpbmUgUFZfQ09ERUNfSU5JVCAgICAgICAwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmgKaW5kZXggYmE3N2RmZC4uYjg2NWYyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaApAQCAtODUsNyArODUsNyBAQAogCiAgICAgICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCiAKLSAgICAgICAgeDggPSAodWludDMyKXJlZiAmIDB4MzsKKyAgICAgICAgeDggPSAodWludHB0cl90KXJlZiAmIDB4MzsKICAgICAgICAgaWYgKHg4ID09IDMpCiAgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MzsKICAgICAgICAgaWYgKHg4ID09IDIpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKaW5kZXggMTM1YzcxNS4uODI4NDQ5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawpAQCAtNTAsNiArNTAsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9tcDNkZWMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCkBAIC02OSw2ICs3MSw4IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKaW5kZXggN2MzODJmYi4uNTM5NjAyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCkBAIC00OSw2ICs0OSw4IEBACiAgICAgICBtTnVtQ2hhbm5lbHMoMiksCiAgICAgICBtU2FtcGxpbmdSYXRlKDQ0MTAwKSwKICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtU2F3SW5wdXRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBpbml0RGVjb2RlcigpOwpAQCAtMTQ0LDYgKzE0NiwyMyBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9NcDM6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICptcDNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKG1wM1BhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtcDNQYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKKyAgICAgICAgICAgIG1wM1BhcmFtcy0+bkJpdFJhdGUgPSAwIC8qIHVua25vd24gKi87CisgICAgICAgICAgICBtcDNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIC8vIG90aGVyIGZpZWxkcyBhcmUgZW5jb2Rlci1vbmx5CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKICAgICB9CkBAIC0xODYsNyArMjA1LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdE1QMzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0TVAzOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE5NCw0OCArMjEzLDM2IEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IChtU2F3SW5wdXRFb3MgJiYgIW1TaWduYWxsZWRPdXRwdXRFb3MpKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSBOVUxMOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBOVUxMOworICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICB9CiAKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmICghbUlzRmlyc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBwYWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGggNTI5IHNhbXBsZXMsIHNpbmNlIHRoYXQgbWFueSBzYW1wbGVzCi0gICAgICAgICAgICAgICAgLy8gd2VyZSB0cmltbWVkIG9mZiB0aGUgYmVnaW5uaW5nIHdoZW4gZGVjb2Rpbmcgc3RhcnRlZAotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9Ci0gICAgICAgICAgICAgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSAqIG1OdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLQotICAgICAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIsIDAsIG91dEhlYWRlci0+bkZpbGxlZExlbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIG5ldmVyIGRpc2NhcmRlZCBmcmFtZXMgZnJvbSB0aGUgc3RhcnQsIHdlIHdvbid0IGhhdmUKLSAgICAgICAgICAgICAgICAvLyB0byBhZGQgYW55IHBhZGRpbmcgYXQgdGhlIGVuZCBlaXRoZXIuCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCAmJiBpbkhlYWRlci0+bkZpbGxlZExlbikgeworICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIG1TYXdJbnB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gMDsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9Ci0gICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotCi0gICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CiAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CiAKQEAgLTI2MiwxMyArMjY5LDI4IEBACiAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0ga091dHB1dEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAotICAgICAgICAgICAgLy8gcGxheSBzaWxlbmNlIGluc3RlYWQuCi0gICAgICAgICAgICBtZW1zZXQob3V0SGVhZGVyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IgJiYgbVNhd0lucHV0RW9zKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtSXNGaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBwYWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGggNTI5IHNhbXBsZXMsIHNpbmNlIHRoYXQgbWFueSBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgIC8vIHdlcmUgdHJpbW1lZCBvZmYgdGhlIGJlZ2lubmluZyB3aGVuIGRlY29kaW5nIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0ga1BWTVAzRGVjb2RlckRlbGF5ICogbU51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOwogCi0gICAgICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG91dEhlYWRlci0+cEJ1ZmZlciwgMCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAorICAgICAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgorICAgICAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1Db25maWctPnNhbXBsaW5nUmF0ZSAhPSBtU2FtcGxpbmdSYXRlCiAgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy0+bnVtX2NoYW5uZWxzICE9IG1OdW1DaGFubmVscykgewogICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IG1Db25maWctPnNhbXBsaW5nUmF0ZTsKQEAgLTI4OSw3ICszMTEsNyBAQAogCiAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPQogICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAtIG91dEhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmICghbVNpZ25hbGxlZE91dHB1dEVvcykgewogICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKICAgICAgICAgfQpAQCAtMjk4LDIzICszMjAsMjQgQEAKICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKICAgICAgICAgICAgICAgICArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZTsKIAotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CiAKLSAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CisgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CiAKLSAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOwotICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAvIG1OdW1DaGFubmVsczsKIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8gPSBOVUxMOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKLSAgICAgICAgfQotCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgIG91dEluZm8gPSBOVUxMOwpAQCAtMzI5LDYgKzM1Miw5IEBACiAgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KICAgICAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOwogICAgICAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgICAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwogICAgIH0KIH0KIApAQCAtMzYyLDYgKzM4OCw4IEBACiAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOwogICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKaW5kZXggNGFmOTFlYS4uZjllN2I1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKQEAgLTYxLDYgKzYxLDggQEAKIAogICAgIGJvb2wgbUlzRmlyc3Q7CiAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2F3SW5wdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwogCiAgICAgZW51bSB7CiAgICAgICAgIE5PTkUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfYXJtLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfYXJtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmRkNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF85X2FybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLTsgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLTsgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsKLTsKLTsgICBGaWxlbmFtZTogcHZtcDNfZGN0XzkucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFSRUEgIHwuZHJlY3R2ZXwsIERSRUNUVkUKLQotICAgIERDQiAiLWRlZmF1bHRsaWI6Y29yZWRsbC5saWIgIgotICAgIERDQiAiLWRlZmF1bHRsaWI6Y29yZWxpYmMubGliICIKLQotICBJTVBPUlQgcHZtcDNfbWRjdF8xOCA7IHB2bXAzX21kY3RfMTguY3BwCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBBUkVBICB8LnJkYXRhfCwgREFUQSwgUkVBRE9OTFkKLSAgJSA0Ci0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFSRUEgIHwudGV4dHwsIENPREUsIFJFQURPTkxZCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gRVhQT1JUIHxwdm1wM19kY3RfOXwKLQotfHB2bXAzX2RjdF85fCBQUk9DCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjQtcjEwLGxyfQotICAgICAgICBsZHIgICAgICByMiwgW3IwLCAjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjMsIFtyMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyMCwgIzRdCi0gICAgICAgIGFkZCAgICAgIHIxLHIyLHIzCi0gICAgICAgIHN1YiAgICAgIGxyLHIyLHIzCi0gICAgICAgIGxkciAgICAgIHIzLFtyMCwgIzB4MWNdCi0gICAgICAgIGxkciAgICAgIHI0LFtyMCwgIzB4MThdCi0gICAgICAgIGFkZCAgICAgIHIyLHIzLHIxMgotICAgICAgICBsZHIgICAgICByNSxbcjAsIzhdCi0gICAgICAgIHN1YiAgICAgIHIzLHIzLHIxMgotICAgICAgICBhZGQgICAgICByMTIscjQscjUKLSAgICAgICAgc3ViICAgICAgcjQscjQscjUKLSAgICAgICAgbGRyICAgICAgcjUsW3IwLCAjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IwLCAjMHhjXQotICAgICAgICBsZHIgICAgICByOSxbcjAsICMweDEwXQotICAgICAgICBhZGQgICAgICByNixyNSxyNwotICAgICAgICBzdWIgICAgICByNSxyNSxyNwotICAgICAgICBhZGQgICAgICByNyxyMSxyMTIKLSAgICAgICAgYWRkICAgICAgcjgscjkscjIKLSAgICAgICAgYWRkICAgICAgcjcscjcscjYKLSAgICAgICAgYWRkICAgICAgcjEwLHI3LHI4Ci0gICAgICAgIHJzYiAgICAgIHI3LHI4LHI3LGFzciAjMQotICAgICAgICBzdHIgICAgICByNyxbcjAsICMweDE4XQotICAgICAgICByc2IgICAgICByMixyOSxyMixhc3IgIzEKLSAgICAgICAgc3RyICAgICAgcjEwLFtyMF0KLSAgICAgICAgbGRyICAgICAgcjExLHxjb3NfMnBpXzl8Ci0gICAgICAgIHJzYiAgICAgIHI3LHIyLCMwCi0KLSAgICAgICAgbW92ICAgICAgcjkscjEsbHNsICMxCi0JCW1vdiAgICAgIHIxLHI5CQkJOzs7Ozs7ICAhISEhISEKLSAgICAgICAgbW92ICAgICAgcjgscjcKLQotOyAgICB2ZWNbNF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzRdLCB0bXAwPDwxLCBjb3NfMnBpXzkpOyAKLQotICAgICAgICBzbWxhbCAgICByMSxyOCxyMTEscjkKLSAgICAgICAgbGRyICAgICAgcjEwLHxjb3NfNHBpXzl8Ci0gICAgICAgIGxkciAgICAgIHIxMSx8Y29zX3BpXzl8Ci0KLTsgICAgdmVjWzhdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s4XSwgdG1wMDw8MSwgY29zXzRwaV85KTsKLQotICAgICAgICBzbWxhbCAgICByMSxyNyxyMTAscjkKLQotCi0KLTsgICAgdmVjWzJdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1syXSwgdG1wMDw8MSwgY29zX3BpXzkpOwotCi0gICAgICAgIHNtbGFsICAgIHI5LHIyLHIxMSxyOQotICAgICAgICBtb3YgICAgICByMSxyMTIsbHNsICMxCi0gICAgICAgIHJzYiAgICAgIHI5LHIxMCwjMAotICAgICAgICBsZHIgICAgICByMTEsfGNvc181cGlfOXwKLQotICAgICAgICBzbWxhbCAgICByMTIscjIscjkscjEKLQotCi0KLTsgICAgdmVjWzJdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1syXSwgdG1wMjw8MSwgY29zXzVwaV85KTsKLQotICAgICAgICBsZHIgICAgICByOSx8Y29zXzJwaV85fAotICAgICAgICBtb3YgICAgICByMTIscjEJCQk7Ozs7OzsgICEhISEhIQotICAgICAgICBzbWxhbCAgICByMTIscjgscjExLHIxCi0KLQotOyAgICB2ZWNbOF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzhdLCB0bXAyPDwxLCBjb3NfMnBpXzkpOwotCi0gICAgICAgIHNtbGFsICAgIHIxLHI3LHI5LHIxCi0gICAgICAgIG1vdiAgICAgIHIxLHI2LGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjcscjExLHIxCi0gICAgICAgIGFuZCAgICAgIHI2LHIxMCxyMTEsYXNyICMxNAotICAgICAgICBzbWxhbCAgICByMTIscjgscjYscjEKLSAgICAgICAgbGRyICAgICAgcjEwLHxjb3NfMTFwaV8xOHwKLSAgICAgICAgYWRkICAgICAgcjEyLHIxMSxyNgotICAgICAgICBzbWxhbCAgICByMSxyMixyMTIscjEKLSAgICAgICAgbGRyICAgICAgcjksfGNvc184cGlfOXwKLSAgICAgICAgc3RyICAgICAgcjIsW3IwLCM4XQotICAgICAgICBtb3YgICAgICByMSxyNSxsc2wgIzEKLQotOyAgICB2ZWNbOF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzhdLCB0bXAzPDwxLCBjb3NfOHBpXzkpOwotCi0gICAgICAgIHNtdWxsICAgIHIyLHI2LHI5LHIxCi0gICAgICAgIHN0ciAgICAgIHI3LFtyMCwjMHgyMF0KLSAgICAgICAgbW92ICAgICAgcjIscjQsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHI3LHxjb3NfMTNwaV8xOHwKLSAgICAgICAgc21sYWwgICAgcjEyLHI2LHIxMCxyMgotCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotCi07ICAgIHZlY1s1XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbNV0sIHRtcDg8PDEsIGNvc18xM3BpXzE4KTsKLQotICAgICAgICBzbWxhbCAgICByMTIscjYscjcscjMKLSAgICAgICAgYWRkICAgICAgcjQscjUscjQKLSAgICAgICAgbW92ICAgICAgcjEyLGxyLGxzbCAjMQotICAgICAgICBzdWIgICAgICBscixyNCxscgotICAgICAgICBsZHIgICAgICByNyx8Y29zXzE3cGlfMTh8Ci0gICAgICAgIHN0ciAgICAgIHI4LFtyMCwgIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI0LHxjb3NfcGlfNnwKLQotICAgICAgICBtb3YgICAgICBscixscixsc2wgIzEKLQotOyAgICB2ZWNbMV0gID0gZnhwX21hYzMyX1EzMiggdmVjWzFdLCB0bXA4PDwxLCBjb3NfMTdwaV8xOCk7Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjYscjcscjEyCi0KLTsgICAgdmVjWzNdICA9IGZ4cF9tdWwzMl9RMzIoKHRtcDUgKyB0bXA2ICAtIHRtcDgpPDwxLCBjb3NfcGlfNik7Ci0KLSAgICAgICAgc211bGwgICAgcjUsbHIscjQsbHIKLSAgICAgICAgc3RyICAgICAgcjYsW3IwLCAjNF0KLSAgICAgICAgc3RyICAgICAgbHIsW3IwLCAjMHhjXQotCi0KLTsgICAgdmVjWzVdICA9IGZ4cF9tdWwzMl9RMzIodG1wNTw8MSwgY29zXzE3cGlfMTgpOwotICAgICAgICBzbXVsbCAgICByNSxscixyNyxyMQotICAgICAgICByc2IgICAgICByNixyOSwjMAotOyAgICB2ZWNbNV0gID0gZnhwX21hYzMyX1EzMiggdmVjWzVdLCB0bXA2PDwxLCAgY29zXzdwaV8xOCk7Ci0gICAgICAgIHNtbGFsICAgIHI1LGxyLHI2LHIyCi07ICAgIHZlY1s1XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbNV0sIHRtcDc8PDEsICAgIGNvc19waV82KTsKLSAgICAgICAgc21sYWwgICAgcjUsbHIscjQscjMKLTsgICAgdmVjWzVdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s1XSwgdG1wODw8MSwgY29zXzEzcGlfMTgpOwotICAgICAgICBzbWxhbCAgICByNSxscixyMTAscjEyCi0gICAgICAgIHN0ciAgICAgIGxyLFtyMCwgIzB4MTRdCi0gICAgICAgIHJzYiAgICAgIGxyLHIxMCwjMAotCi07ICAgIHZlY1s3XSAgPSBmeHBfbXVsMzJfUTMyKHRtcDU8PDEsIGNvc181cGlfMTgpOwotICAgICAgICBzbXVsbCAgICByNSxyMSxscixyMQotOyAgICB2ZWNbN10gID0gZnhwX21hYzMyX1EzMiggdmVjWzddLCB0bXA2PDwxLCBjb3NfMTdwaV8xOCk7Ci0gICAgICAgIHNtbGFsICAgIHIyLHIxLHI3LHIyCi07ICAgIHZlY1s3XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbN10sIHRtcDc8PDEsICAgIGNvc19waV82KTsKLSAgICAgICAgc21sYWwgICAgcjMscjEscjQscjMKLTsgICAgdmVjWzddICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s3XSwgdG1wODw8MSwgY29zXzExcGlfMTgpOwotICAgICAgICBzbWxhbCAgICByMTIscjEscjkscjEyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyMCwgIzB4MWNdCi0gICAgICAgIGxkbWZkICAgIHNwISx7cjQtcjEwLHBjfQotfGNvc18ycGlfOXwKLSAgICAgICAgRENEICAgICAgMHg2MjBkYmU4MAotfGNvc180cGlfOXwKLSAgICAgICAgRENEICAgICAgMHgxNjNhMWE4MAotfGNvc19waV85fAotICAgICAgICBEQ0QgICAgICAweDc4NDdkOTAwCi18Y29zXzVwaV85fAotICAgICAgICBEQ0QgICAgICAweDg3YjgyNzAwCi18Y29zXzhwaV85fAotICAgICAgICBEQ0QgICAgICAweGQ0MzhhZjAwCi18Y29zXzExcGlfMTh8Ci0gICAgICAgIERDRCAgICAgIDB4YWRiOTIyODAKLXxjb3NfMTNwaV8xOHwKLSAgICAgICAgRENEICAgICAgMHg5MTI2MTQ4MAotfGNvc18xN3BpXzE4fAotICAgICAgICBEQ0QgICAgICAweDgxZjFkMjAwCi18Y29zX3BpXzZ8Ci0gICAgICAgIERDRCAgICAgIDB4NmVkOWViODAKLSAgICAgICAgRU5EUAotCi0KLQotCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF9hcm0ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2FybS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDAxZDhjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2FybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLTsgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLTsgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsKLTsKLTsgICBGaWxlbmFtZTogcHZtcDNfZGN0XzE4LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBFWFBPUlQgcHZtcDNfbWRjdF8xOAotCi0gICAgICAgIElNUE9SVCB8fExpYiQkUmVxdWVzdCQkYXJtbGlifHwgW1dFQUtdCi0gICAgICAgIElNUE9SVCB8fExpYiQkUmVxdWVzdCQkY3BwbGlifHwgW1dFQUtdCi0gICAgICAgIElNUE9SVCBwdm1wM19kY3RfOQotCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIEFSRUEgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXxwdm1wM19tZGN0XzE4fCBQUk9DCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjQtcjEwLGxyfQotICAgICAgICBtb3YgICAgICByNyxyMgotICAgICAgICBsZHIgICAgICByMix0YWJsZQotICAgICAgICBtb3YgICAgICByNixyMQotICAgICAgICBhZGQgICAgICByMyxyMiwjMHgyNAotICAgICAgICBhZGQgICAgICByMTIscjMsIzB4NDQKLSAgICAgICAgYWRkICAgICAgcjEscjAsIzB4NDQKLSAgICAgICAgbW92ICAgICAgcjUscjAKLQotOyAgICBmb3IgKCBpPTk7IGkhPTA7IGktLSkKLTsgICAgewotCi0gICAgICAgIG1vdiAgICAgIHI0LCM5Ci1Mb29wXzEKLQotOyAgICAgICB0bXAgID0gKihwdF92ZWMpOwotOwkJdG1wMSA9ICoocHRfdmVjX28pOwotCi0gICAgICAgIGxkciAgICAgIGxyLFtyMF0JCTs7IHRtcCAgPT0gbHIKLSAgICAgICAgbGRyICAgICAgcjgsW3IzXSwjNAkJOzsgdG1wMSA9PSByOAotCi07ICAgICAgICB0bXAgID0gZnhwX211bDMyX1EzMiggdG1wPDwxLCAgKihwdF9jb3MrKyAgKSk7Ci07ICAgICAgICB0bXAxID0gZnhwX211bDMyX1EyNyggdG1wMSwgKihwdF9jb3NfeC0tKSk7Ci0KLSAgICAgICAgbW92ICAgICAgbHIsbHIsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHIxMCxscixyOCxscgotICAgICAgICBsZHIgICAgICByOCxbcjEyXSwjLTQKLSAgICAgICAgbGRyICAgICAgcjksW3IxXQotICAgICAgICBzdWJzICAgICByNCxyNCwjMQotICAgICAgICBzbXVsbCAgICByOSxyMTAscjgscjkKLSAgICAgICAgbW92ICAgICAgcjgscjksbHNyICMyNwotICAgICAgICBhZGQgICAgICByOCxyOCxyMTAsbHNsICM1Ci0KLTsgICAgICAgICoocHRfdmVjKyspICAgPSAgIHRtcCArIHRtcDEgOwotOyAgICAgICAgKihwdF92ZWNfby0tKSA9IGZ4cF9tdWwzMl9RMjgoICh0bXAgLSB0bXAxKSwgKihwdF9jb3Nfc3BsaXQrKykpOwotCi0gICAgICAgIGFkZCAgICAgIHI5LGxyLHI4Ci0gICAgICAgIHN1YiAgICAgIHI4LGxyLHI4Ci0gICAgICAgIGxkciAgICAgIGxyLFtyMl0sIzQKLSAgICAgICAgc3RyICAgICAgcjksW3IwXSwjNAotICAgICAgICBzbXVsbCAgICByOCxyOSxscixyOAotICAgICAgICBtb3YgICAgICBscixyOCxsc3IgIzI4Ci0gICAgICAgIGFkZCAgICAgIGxyLGxyLHI5LGxzbCAjNAotICAgICAgICBzdHIgICAgICBscixbcjFdLCMtNAotICAgICAgICBibmUgICAgICBMb29wXzEKLQotOwkJfQotCi0gICAgICAgIG1vdiAgICAgIHIwLHI1CQkJOzsgcjAgPSB2ZWMKLSAgICAgICAgYmwgICAgICAgcHZtcDNfZGN0XzkKLSAgICAgICAgYWRkICAgICAgcjAscjUsIzB4MjQJOzsgcjAgPSAmdmVjWzldCi0gICAgICAgIGJsICAgICAgIHB2bXAzX2RjdF85Ci0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMixbcjUsIzB4NDBdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDFjXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MzhdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDE4XQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzBdCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDI4XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDEwXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweGNdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzhdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzRdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzhdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MjRdCi0gICAgICAgIHN1YiAgICAgIHIxMixyMTIscjEKLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjNF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgyY10KLSAgICAgICAgc3ViICAgICAgcjEscjEyLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHhjXQotICAgICAgICBzdWIgICAgICByMSxyMTIscjAKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDE0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIHN1YiAgICAgIHIwLHIxLHIwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgc3ViICAgICAgcjAscjEscjMKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDI0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4M2NdCi0gICAgICAgIHN1YiAgICAgIHIzLHIxLHIzCi0gICAgICAgIHN1YiAgICAgIHIxLHIxLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzNF0KLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDJjXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDRdCi0gICAgICAgIHN1YiAgICAgIHIxLHIxLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzY10KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMF0KLQotTG9vcF8yCi0gICAgICAgIGFkZCAgICAgIHIxLHI1LHI0LGxzbCAjMgotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNixyNCxsc2wgIzJdCi0gICAgICAgIGFkZCAgICAgIHIwLHIwLHIyCi0gICAgICAgIHN0ciAgICAgIHIwLFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LHI0LGxzbCAjMl0KLSAgICAgICAgbGRyICAgICAgcjEsW3IxLCM0XQotICAgICAgICBzbWxhbCAgICByMCxyMyxscixyMAotICAgICAgICBtb3YgICAgICByMCxyMgotICAgICAgICBhZGQgICAgICByMixyMTIscjEKLSAgICAgICAgcnNiICAgICAgcjIscjIsIzAKLSAgICAgICAgc3RyICAgICAgcjMsW3I1LHI0LGxzbCAjMl0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LHI0LGxzbCAjMl0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzEKLSAgICAgICAgY21wICAgICAgcjQsIzYKLSAgICAgICAgbW92ICAgICAgcjEyLHIxCi0KLSAgICAgICAgYmx0ICAgICAgTG9vcF8yCi0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMixbcjYsIzB4MThdCi0gICAgICAgIGFkZCAgICAgIHIzLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LHI0LGxzbCAjMl0KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgc21sYWwgICAgcjMscjIsbHIscjMKLSAgICAgICAgYWRkICAgICAgcjMscjEyLHIwCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I2LCMweDFjXQotICAgICAgICByc2IgICAgICByMyxyMywjMAotICAgICAgICBzdHIgICAgICByMyxbcjYsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgyMF0KLSAgICAgICAgYWRkICAgICAgcjAscjMscjAKLSAgICAgICAgcnNiICAgICAgcjAscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDFjXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgyMF0KLSAgICAgICAgYWRkICAgICAgcjMscjMscjEKLSAgICAgICAgbW92ICAgICAgcjEscjIKLSAgICAgICAgbGRyICAgICAgcjEwLFtyNywjMHgxY10KLSAgICAgICAgbW92ICAgICAgcjIscjMsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyMSxyMTAscjIKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDFjXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgyNF0KLSAgICAgICAgYWRkICAgICAgcjEscjEscjMKLSAgICAgICAgcnNiICAgICAgcjEscjEsIzAKLSAgICAgICAgc3RyICAgICAgcjEsW3I2LCMweDIwXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNywjMHgyMF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyMCxyMyxyMQotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgyNF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDIwXQotICAgICAgICBzbWxhbCAgICByMSxyMyxscixyMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjYsIzB4NDRdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgyNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMyxbcjcsIzB4NDRdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMSxyMTIscjMscjEKLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQwXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDQ0XQotICAgICAgICByc2IgICAgICByOCxyMSwjMAotICAgICAgICBzdHIgICAgICByOCxbcjUsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I3LCMweDQwXQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEscjAscjMscjEKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNiwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDNjXQotICAgICAgICByc2IgICAgICByOSxyMCwjMAotICAgICAgICBzdHIgICAgICByOSxbcjUsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHgzY10KLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLHIxMixyMAotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzOF0KLSAgICAgICAgcnNiICAgICAgcjAscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDMwXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4MzhdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMyxyMSxyMTIscjMKLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjQsW3I3LCMweDM0XQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgzMF0KLSAgICAgICAgc21sYWwgICAgcjAscjEscjQscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNiwjMHgyY10KLSAgICAgICAgbGRyICAgICAgbHIsW3I2LCMweDI4XQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNywjMHgzMF0KLSAgICAgICAgbW92ICAgICAgcjAscjksbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLHIxLHIwCi0gICAgICAgIG1vdiAgICAgIHIwLHI4LGxzbCAjMQotICAgICAgICBsZHIgICAgICByMSxbcjcsIzB4MmNdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgzMF0KLSAgICAgICAgc21sYWwgICAgcjAscjEyLHIxLHIwCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyY10KLSAgICAgICAgc21sYWwgICAgcjIsbHIscjAscjIKLSAgICAgICAgc3RyICAgICAgbHIsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NDhdCi0gICAgICAgIG1vdiAgICAgIHIyLHIxLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNl0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MWNdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNl0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg0Y10KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMwotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2NF0KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCM0XQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2OF0KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCMweDFjXQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2Y10KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCMweDIwXQotICAgICAgICBzbXVsbCAgICBscixyMCxyMTIscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg3MF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDI0XQotICAgICAgICBzbXVsbCAgICByMCxyMixyMTIscjIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDg4XQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MjhdCi0gICAgICAgIHNtdWxsICAgIHIzLHIyLHIwLHIzCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4Y10KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDQwXQotICAgICAgICBzbXVsbCAgICByMixyMSxyMCxyMQotICAgICAgICBzdHIgICAgICByMSxbcjYsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDUwXQotICAgICAgICBtb3YgICAgICByMSxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDE0XQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMQotICAgICAgICBsZHIgICAgICByMTIsW3I2LCMweDEwXQotICAgICAgICBtb3YgICAgICByMyxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweGNdCi0gICAgICAgIG1vdiAgICAgIHIxMixyMTIsbHNsICMxCi0gICAgICAgIG1vdiAgICAgIHIyLHIwLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzhdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDU0XQotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjMKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDU4XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4Y10KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjEyCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1Y10KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweDEwXQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMgotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NjBdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHgxNF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjAKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDc0XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4MThdCi0gICAgICAgIHNtdWxsICAgIHI0LHIwLGxyLHIwCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg3OF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDJjXQotICAgICAgICBzbXVsbCAgICByMCxyMixscixyMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4N2NdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzMF0KLSAgICAgICAgc211bGwgICAgcjEyLHIyLHIwLHIxMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4ODBdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzNF0KLSAgICAgICAgc211bGwgICAgcjMscjIscjAscjMKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDg0XQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzhdCi0gICAgICAgIHNtdWxsICAgIHIyLHIxLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNiwjMHgzY10KLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTAscGN9Ci10YWJsZQotICAgICAgICBEQ0QgICAgICB8fC5jb25zdGRhdGEkMXx8Ci0gICAgICAgIEVORFAKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gQVJFQSB8LmNvbnN0ZGF0YXwsIERBVEEsIFJFQURPTkxZLCBBTElHTj0yCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfHwuY29uc3RkYXRhJDF8fAotY29zVGVybXNfZGN0MTgKLSAgICAgICAgRENEICAgICAgMHgwODA3ZDJiMAotICAgICAgICBEQ0QgICAgICAweDA4NDgzZWUwCi0gICAgICAgIERDRCAgICAgIDB4MDhkM2I3ZDAKLSAgICAgICAgRENEICAgICAgMHgwOWM0MjU3MAotICAgICAgICBEQ0QgICAgICAweDBiNTA0ZjMwCi0gICAgICAgIERDRCAgICAgIDB4MGRmMjk0NDAKLSAgICAgICAgRENEICAgICAgMHgxMmVkZmIyMAotICAgICAgICBEQ0QgICAgICAweDFlZThkZDQwCi0gICAgICAgIERDRCAgICAgIDB4NWJjYTJhMDAKLWNvc1Rlcm1zXzFfb3ZfY29zX3BoaQotICAgICAgICBEQ0QgICAgICAweDQwMGY5YzAwCi0gICAgICAgIERDRCAgICAgIDB4NDA4ZDYwODAKLSAgICAgICAgRENEICAgICAgMHg0MThkY2I4MAotICAgICAgICBEQ0QgICAgICAweDQzMWIxYTAwCi0gICAgICAgIERDRCAgICAgIDB4NDU0NWVhMDAKLSAgICAgICAgRENEICAgICAgMHg0ODI3MDY4MAotICAgICAgICBEQ0QgICAgICAweDRiZTI1NDgwCi0gICAgICAgIERDRCAgICAgIDB4NTBhYjk0ODAKLSAgICAgICAgRENEICAgICAgMHg1NmNlNGQ4MAotICAgICAgICBEQ0QgICAgICAweDA1ZWJiNjMwCi0gICAgICAgIERDRCAgICAgIDB4MDY5MjFhOTgKLSAgICAgICAgRENEICAgICAgMHgwNzcxZDNhOAotICAgICAgICBEQ0QgICAgICAweDA4YTlhODMwCi0gICAgICAgIERDRCAgICAgIDB4MGE3M2Q3NTAKLSAgICAgICAgRENEICAgICAgMHgwZDRkNTI2MAotICAgICAgICBEQ0QgICAgICAweDEyN2IxY2EwCi0gICAgICAgIERDRCAgICAgIDB4MWVhNTJiNDAKLSAgICAgICAgRENEICAgICAgMHg1YmIzY2M4MAotCi0KLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X3dtLmFzbSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X3dtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlNzVkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF93bS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotOyBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotOyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOwotOwotOyAgIEZpbGVuYW1lOiBwdm1wM19kY3RfMTgucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIEVYUE9SVCB8cHZtcDNfbWRjdF8xOHwKLQotICAgICAgICBJTVBPUlQgcHZtcDNfZGN0XzkKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwudGV4dHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi18cHZtcDNfbWRjdF8xOHwgUFJPQwotICAgICAgICBzdG1mZCAgICBzcCEse3I0LXIxMCxscn0KLSAgICAgICAgbW92ICAgICAgcjcscjIKLSAgICAgICAgbGRyICAgICAgcjIsdGFibGUKLSAgICAgICAgbW92ICAgICAgcjYscjEKLSAgICAgICAgYWRkICAgICAgcjMscjIsIzB4MjQKLSAgICAgICAgYWRkICAgICAgcjEyLHIzLCMweDQ0Ci0gICAgICAgIGFkZCAgICAgIHIxLHIwLCMweDQ0Ci0gICAgICAgIG1vdiAgICAgIHI1LHIwCi0KLTsgICAgZm9yICggaT05OyBpIT0wOyBpLS0pCi07ICAgIHsKLQotICAgICAgICBtb3YgICAgICByNCwjOQotTG9vcF8xCi0KLTsgICAgICAgdG1wICA9ICoocHRfdmVjKTsKLTsJCXRtcDEgPSAqKHB0X3ZlY19vKTsKLQotICAgICAgICBsZHIgICAgICBscixbcjBdCQk7OyB0bXAgID09IGxyCi0gICAgICAgIGxkciAgICAgIHI4LFtyM10sIzQJCTs7IHRtcDEgPT0gcjgKLQotOyAgICAgICAgdG1wICA9IGZ4cF9tdWwzMl9RMzIoIHRtcDw8MSwgICoocHRfY29zKysgICkpOwotOyAgICAgICAgdG1wMSA9IGZ4cF9tdWwzMl9RMjcoIHRtcDEsICoocHRfY29zX3gtLSkpOwotCi0gICAgICAgIG1vdiAgICAgIGxyLGxyLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByMTAsbHIscjgsbHIKLSAgICAgICAgbGRyICAgICAgcjgsW3IxMl0sIy00Ci0gICAgICAgIGxkciAgICAgIHI5LFtyMV0KLSAgICAgICAgc3VicyAgICAgcjQscjQsIzEKLSAgICAgICAgc211bGwgICAgcjkscjEwLHI4LHI5Ci0gICAgICAgIG1vdiAgICAgIHI4LHI5LGxzciAjMjcKLSAgICAgICAgYWRkICAgICAgcjgscjgscjEwLGxzbCAjNQotCi07ICAgICAgICAqKHB0X3ZlYysrKSAgID0gICB0bXAgKyB0bXAxIDsKLTsgICAgICAgICoocHRfdmVjX28tLSkgPSBmeHBfbXVsMzJfUTI4KCAodG1wIC0gdG1wMSksICoocHRfY29zX3NwbGl0KyspKTsKLQotICAgICAgICBhZGQgICAgICByOSxscixyOAotICAgICAgICBzdWIgICAgICByOCxscixyOAotICAgICAgICBsZHIgICAgICBscixbcjJdLCM0Ci0gICAgICAgIHN0ciAgICAgIHI5LFtyMF0sIzQKLSAgICAgICAgc211bGwgICAgcjgscjksbHIscjgKLSAgICAgICAgbW92ICAgICAgbHIscjgsbHNyICMyOAotICAgICAgICBhZGQgICAgICBscixscixyOSxsc2wgIzQKLSAgICAgICAgc3RyICAgICAgbHIsW3IxXSwjLTQKLSAgICAgICAgYm5lICAgICAgTG9vcF8xCi0KLTsJCX0KLQotICAgICAgICBtb3YgICAgICByMCxyNQkJCTs7IHIwID0gdmVjCi0gICAgICAgIGJsICAgICAgIHB2bXAzX2RjdF85Ci0gICAgICAgIGFkZCAgICAgIHIwLHI1LCMweDI0CTs7IHIwID0gJnZlY1s5XQotICAgICAgICBibCAgICAgICBwdm1wM19kY3RfOQotCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I1LCMweDQwXQotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDM4XQotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDMwXQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MTRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgxMF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHhjXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDE4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCM4XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDEwXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCM0XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCM4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDI0XQotICAgICAgICBzdWIgICAgICByMTIscjEyLHIxCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MmNdCi0gICAgICAgIHN1YiAgICAgIHIxLHIxMixyMQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4Y10KLSAgICAgICAgc3ViICAgICAgcjEscjEyLHIwCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDM0XQotICAgICAgICBzdWIgICAgICByMCxyMSxyMAotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MWNdCi0gICAgICAgIHN1YiAgICAgIHIwLHIxLHIzCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgyNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDNjXQotICAgICAgICBzdWIgICAgICByMyxyMSxyMwotICAgICAgICBzdWIgICAgICByMSxyMSxyMgotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgyY10KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQ0XQotICAgICAgICBzdWIgICAgICByMSxyMSxyMgotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzBdCi0KLUxvb3BfMgotICAgICAgICBhZGQgICAgICByMSxyNSxyNCxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI4XQotICAgICAgICBsZHIgICAgICByMyxbcjYscjQsbHNsICMyXQotICAgICAgICBhZGQgICAgICByMCxyMCxyMgotICAgICAgICBzdHIgICAgICByMCxbcjEsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNyxyNCxsc2wgIzJdCi0gICAgICAgIGxkciAgICAgIHIxLFtyMSwjNF0KLSAgICAgICAgc21sYWwgICAgcjAscjMsbHIscjAKLSAgICAgICAgbW92ICAgICAgcjAscjIKLSAgICAgICAgYWRkICAgICAgcjIscjEyLHIxCi0gICAgICAgIHJzYiAgICAgIHIyLHIyLCMwCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSxyNCxsc2wgIzJdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNixyNCxsc2wgIzJdCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LCMxCi0gICAgICAgIGNtcCAgICAgIHI0LCM2Ci0gICAgICAgIG1vdiAgICAgIHIxMixyMQotCi0gICAgICAgIGJsdCAgICAgIExvb3BfMgotCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I2LCMweDE4XQotICAgICAgICBhZGQgICAgICByMyxyMCxyMQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNyxyNCxsc2wgIzJdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MWNdCi0gICAgICAgIHNtbGFsICAgIHIzLHIyLGxyLHIzCi0gICAgICAgIGFkZCAgICAgIHIzLHIxMixyMAotICAgICAgICBzdHIgICAgICByMixbcjUsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIyLFtyNiwjMHgxY10KLSAgICAgICAgcnNiICAgICAgcjMscjMsIzAKLSAgICAgICAgc3RyICAgICAgcjMsW3I2LCMweDE4XQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MjBdCi0gICAgICAgIGFkZCAgICAgIHIwLHIzLHIwCi0gICAgICAgIHJzYiAgICAgIHIwLHIwLCMwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4MjBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLHIxCi0gICAgICAgIG1vdiAgICAgIHIxLHIyCi0gICAgICAgIGxkciAgICAgIHIxMCxbcjcsIzB4MWNdCi0gICAgICAgIG1vdiAgICAgIHIyLHIzLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjEscjEwLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MjRdCi0gICAgICAgIGFkZCAgICAgIHIxLHIxLHIzCi0gICAgICAgIHJzYiAgICAgIHIxLHIxLCMwCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNiwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMyxbcjcsIzB4MjBdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjAscjMscjEKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDI0XQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MjRdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgyMF0KLSAgICAgICAgc21sYWwgICAgcjEscjMsbHIscjEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDQwXQotICAgICAgICBsZHIgICAgICByMTIsW3I2LCMweDQ0XQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I3LCMweDQ0XQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEscjEyLHIzLHIxCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHg0MF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHg0NF0KLSAgICAgICAgcnNiICAgICAgcjgscjEsIzAKLSAgICAgICAgc3RyICAgICAgcjgsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNywjMHg0MF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxLHIwLHIzLHIxCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDNjXQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgzY10KLSAgICAgICAgcnNiICAgICAgcjkscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjksW3I1LCMweDJjXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4M2NdCi0gICAgICAgIG1vdiAgICAgIHIwLHIwLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMCxyMyxyMTIscjAKLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDNjXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzhdCi0gICAgICAgIHJzYiAgICAgIHIwLHIwLCMwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDM0XQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDM4XQotICAgICAgICBtb3YgICAgICByMyxyMyxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjMscjEscjEyLHIzCi0gICAgICAgIG1vdiAgICAgIHIwLHIwLGxzbCAjMQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHI0LFtyNywjMHgzNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCMweDM0XQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MzBdCi0gICAgICAgIHNtbGFsICAgIHIwLHIxLHI0LHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjYsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNiwjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDM0XQotICAgICAgICBsZHIgICAgICByMSxbcjcsIzB4MzBdCi0gICAgICAgIG1vdiAgICAgIHIwLHI5LGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMCxyMyxyMSxyMAotICAgICAgICBtb3YgICAgICByMCxyOCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEsW3I3LCMweDJjXQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4MzBdCi0gICAgICAgIHNtbGFsICAgIHIwLHIxMixyMSxyMAotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4MjhdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MmNdCi0gICAgICAgIHNtbGFsICAgIHIyLGxyLHIwLHIyCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCM0XQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDQ4XQotICAgICAgICBtb3YgICAgICByMixyMSxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCMweDIwXQotICAgICAgICBsZHIgICAgICByMCxbcjZdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjEKLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDFjXQotICAgICAgICBzdHIgICAgICBscixbcjZdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NGNdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjMKLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NjRdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjNF0KLSAgICAgICAgc211bGwgICAgcjQsbHIscjEyLHIyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NjhdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjMHgxY10KLSAgICAgICAgc211bGwgICAgcjQsbHIscjEyLHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NmNdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjMHgyMF0KLSAgICAgICAgc211bGwgICAgbHIscjAscjEyLHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NzBdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgyNF0KLSAgICAgICAgc211bGwgICAgcjAscjIscjEyLHIyCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4OF0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDI4XQotICAgICAgICBzbXVsbCAgICByMyxyMixyMCxyMwotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4OGNdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHg0MF0KLSAgICAgICAgc211bGwgICAgcjIscjEscjAscjEKLSAgICAgICAgc3RyICAgICAgcjEsW3I2LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4MThdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1MF0KLSAgICAgICAgbW92ICAgICAgcjEscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgxNF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjEKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNiwjMHgxMF0KLSAgICAgICAgbW92ICAgICAgcjMscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHhjXQotICAgICAgICBtb3YgICAgICByMTIscjEyLGxzbCAjMQotICAgICAgICBtb3YgICAgICByMixyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCM4XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzhdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1NF0KLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIzCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1OF0KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweGNdCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIxMgotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NWNdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHgxMF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjIKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDYwXQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4MTRdCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIwCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg3NF0KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweDE4XQotICAgICAgICBzbXVsbCAgICByNCxyMCxscixyMAotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NzhdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgyY10KLSAgICAgICAgc211bGwgICAgcjAscjIsbHIscjIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDdjXQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzBdCi0gICAgICAgIHNtdWxsICAgIHIxMixyMixyMCxyMTIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDgwXQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzRdCi0gICAgICAgIHNtdWxsICAgIHIzLHIyLHIwLHIzCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4NF0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDM4XQotICAgICAgICBzbXVsbCAgICByMixyMSxyMCxyMQotICAgICAgICBzdHIgICAgICByMSxbcjYsIzB4M2NdCi0gICAgICAgIGxkbWZkICAgIHNwISx7cjQtcjEwLHBjfQotdGFibGUKLSAgICAgICAgRENEICAgICAgY29zVGVybXNfZGN0MTgKLSAgICAgICAgRU5EUAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwuY29uc3RkYXRhfCwgREFUQSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb3NUZXJtc19kY3QxOAotICAgICAgICBEQ0QgICAgICAweDA4MDdkMmIwCi0gICAgICAgIERDRCAgICAgIDB4MDg0ODNlZTAKLSAgICAgICAgRENEICAgICAgMHgwOGQzYjdkMAotICAgICAgICBEQ0QgICAgICAweDA5YzQyNTcwCi0gICAgICAgIERDRCAgICAgIDB4MGI1MDRmMzAKLSAgICAgICAgRENEICAgICAgMHgwZGYyOTQ0MAotICAgICAgICBEQ0QgICAgICAweDEyZWRmYjIwCi0gICAgICAgIERDRCAgICAgIDB4MWVlOGRkNDAKLSAgICAgICAgRENEICAgICAgMHg1YmNhMmEwMAotY29zVGVybXNfMV9vdl9jb3NfcGhpCi0gICAgICAgIERDRCAgICAgIDB4NDAwZjljMDAKLSAgICAgICAgRENEICAgICAgMHg0MDhkNjA4MAotICAgICAgICBEQ0QgICAgICAweDQxOGRjYjgwCi0gICAgICAgIERDRCAgICAgIDB4NDMxYjFhMDAKLSAgICAgICAgRENEICAgICAgMHg0NTQ1ZWEwMAotICAgICAgICBEQ0QgICAgICAweDQ4MjcwNjgwCi0gICAgICAgIERDRCAgICAgIDB4NGJlMjU0ODAKLSAgICAgICAgRENEICAgICAgMHg1MGFiOTQ4MAotICAgICAgICBEQ0QgICAgICAweDU2Y2U0ZDgwCi0gICAgICAgIERDRCAgICAgIDB4MDVlYmI2MzAKLSAgICAgICAgRENEICAgICAgMHgwNjkyMWE5OAotICAgICAgICBEQ0QgICAgICAweDA3NzFkM2E4Ci0gICAgICAgIERDRCAgICAgIDB4MDhhOWE4MzAKLSAgICAgICAgRENEICAgICAgMHgwYTczZDc1MAotICAgICAgICBEQ0QgICAgICAweDBkNGQ1MjYwCi0gICAgICAgIERDRCAgICAgIDB4MTI3YjFjYTAKLSAgICAgICAgRENEICAgICAgMHgxZWE1MmI0MAotICAgICAgICBEQ0QgICAgICAweDViYjNjYzgwCi0KLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2FybS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2FybS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmVjNTk5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19hcm0ucworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi07IGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi07IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ci07Ci07ICAgRmlsZW5hbWU6IHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBFWFBPUlQgcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cKLQotICAgICAgICBJTVBPUlQgfHxMaWIkJFJlcXVlc3QkJGFybWxpYnx8IFtXRUFLXQotICAgICAgICBJTVBPUlQgfHxMaWIkJFJlcXVlc3QkJGNwcGxpYnx8IFtXRUFLXQotICAgICAgICBJTVBPUlQgcHFtZlN5bnRoV2luCi0KLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwudGV4dHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi18cHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3d8IFBST0MKLQotICAgICAgICBzdG1mZCAgICBzcCEse3IwLXIyLHI0LXIxMSxscn0KLQotICAgICAgICBzdWIgICAgICBzcCxzcCwjNAotICAgICAgICBsZHIgICAgICByMixbc3AsIzB4Y10KLSAgICAgICAgbGRyICAgICAgcjEsUG9seVBoX2ZpbHRlcl9jb2VmZgotCQkKLSAgICAgICAgc3ViICAgICAgcjIscjIsIzEKLSAgICAgICAgbW92ICAgICAgcjEwLCMxCi0gICAgICAgIHN0ciAgICAgIHIyLFtzcF0KLQotOyBBY2N1bXVsYXRvcnMgcjksIHIxMTo6PiBJbml0aWFsaXphdGlvbgotCi1Mb29wX2oKLSAgICAgICAgbW92ICAgICAgcjksICAjMHgyMAotICAgICAgICBtb3YgICAgICByMTEsICMweDIwCi0gICAgICAgIG1vdiAgICAgIHI0LCAgIzB4MTAKLUxvb3BfaQotICAgICAgICBhZGQgICAgICByMixyNCxyMTAKLSAgICAgICAgYWRkICAgICAgcjMscjAscjIsbHNsICMyCi0gICAgICAgIHN1YiAgICAgIHIyLHI0LHIxMAotICAgICAgICBsZHIgICAgICByNSxbcjNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyMV0KLSAgICAgICAgYWRkICAgICAgcjEyLHIwLHIyLGxzbCAjMgotICAgICAgICBsZHIgICAgICByNixbcjEyLCMweDc4MF0KLSAgICAgICAgc21sYWwgICAgcjIscjksbHIscjUKLSAgICAgICAgc21sYWwgICAgcjIscjExLGxyLHI2Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IxMiwjMHg4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDcwMF0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzB4MjAwCi0gICAgICAgIHNtbGFsICAgIHI2LHI5LHI1LHI3Ci0gICAgICAgIHNtdWxsICAgIHI2LHIyLHI1LHI4Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjMHhjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHIyCi0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI1LHI4Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyNSxyNwotICAgICAgICBsZHIgICAgICByNSxbcjMsIzB4MTAwXQotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NjgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDE0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDE4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDYwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDFjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI2LHI4Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjUsW3IzLCMweDIwMF0KLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NTgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDI4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDUwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDJjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjkscjYscjgKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMywjMHgzMDBdCi0gICAgICAgIGxkciAgICAgIHI4LFtyMSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg0ODBdCi0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI4LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyOCxyNgotICAgICAgICBsZHIgICAgICByOCxbcjEsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEyLCMweDM4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHI4LHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHI4LHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgzOF0KLQotCi0gICAgICAgIGxkciAgICAgIHIzLFtyMywjMHg0MDBdCi0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI2LHIxMgotICAgICAgICBzbXVsbCAgICByOCxyNyxyNixyMwotICAgICAgICBjbXAgICAgICByNCwjMHgyMTAKLSAgICAgICAgc3ViICAgICAgcjExLHIxMSxyNwotCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgzY10KLSAgICAgICAgYWRkICAgICAgcjEscjEsIzB4NDAKLSAgICAgICAgc21sYWwgICAgcjMscjkscjIscjMKLSAgICAgICAgc21sYWwgICAgcjEyLHIxMSxyMixyMTIKLQotICAgICAgICBibHQgICAgICBMb29wX2kKLQotICAgICAgICBtb3YgICAgICByMyxyOSwgYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHI0LHIzLCBhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLCBhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIyLFtzcF0KLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjQsW3NwLCM4XQotICAgICAgICBtb3YgICAgICByMixyMTAsbHNsIHIyCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LHIyLGxzbCAjMQotICAgICAgICBzdHJoICAgICByMyxbcjRdCi0KLSAgICAgICAgbW92ICAgICAgcjMscjExLGFzciAjNgotICAgICAgICBtb3YgICAgICByNCxyMyxhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLGFzciAjMzEKLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtzcCwjMHhjXQotICAgICAgICBsZHIgICAgICByMTEsW3NwLCM4XQotICAgICAgICByc2IgICAgICByMixyMixyMTIsbHNsICM1Ci0gICAgICAgIGFkZCAgICAgIHIyLHIxMSxyMixsc2wgIzEKLSAgICAgICAgc3RyaCAgICAgcjMsW3IyXQotCi0gICAgICAgIGFkZCAgICAgIHIxMCxyMTAsIzEKLSAgICAgICAgY21wICAgICAgcjEwLCMweDEwCi0gICAgICAgIGJsdCAgICAgIExvb3BfagotCi07IEFjY3VtdWxhdG9ycyByNCwgcjUgSW5pdGlhbGl6YXRpb24KLQotICAgICAgICBtb3YgICAgICByNCwjMHgyMAotICAgICAgICBtb3YgICAgICByNSwjMHgyMAotICAgICAgICBtb3YgICAgICByMywjMHgxMAotUG9seVBoX2ZpbHRlcl9sb29wMgotICAgICAgICBhZGQgICAgICByMixyMCxyMyxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMl0KLSAgICAgICAgbGRyICAgICAgcjgsW3IxXQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4ODBdCi0gICAgICAgIHNtbGFsICAgIHIxMixyNCxyOCxyMTIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IyLCMweDQwXQotICAgICAgICBzbWxhbCAgICByNixyNCxyMTIscjYKLQotICAgICAgICBsZHIgICAgICByMTIsW3IxLCM4XQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4MTgwXQotICAgICAgICBzbWxhbCAgICByNyxyNSxyMTIscjcKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMiwjMHgxMDBdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMSwjMHhjXQotICAgICAgICBsZHIgICAgICByMixbcjIsIzB4MTQwXQotICAgICAgICBzbWxhbCAgICByMTIscjQscjcscjEyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEsIzB4MTBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLCMweDgwCi0gICAgICAgIHNtbGFsICAgIHI2LHI0LHIxMixyNgotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MTRdCi0gICAgICAgIGNtcCAgICAgIHIzLCMweDIxMAotICAgICAgICBzbWxhbCAgICByMixyNSxyNixyMgotICAgICAgICBhZGQgICAgICByMSxyMSwjMHgxOAotCi0gICAgICAgIGJsdCAgICAgIFBvbHlQaF9maWx0ZXJfbG9vcDIKLSAgICAgICAgbW92ICAgICAgcjAscjQsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMSxbc3AsIzhdCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMSwjMF0KLSAgICAgICAgbW92ICAgICAgcjAscjUsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMixbc3BdCi0gICAgICAgIG1vdiAgICAgIHIxLCMweDEwCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixbc3AsIzhdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCByMgotICAgICAgICBhZGQgICAgICByMSxyMTIscjEsbHNsICMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMV0KLSAgICAgICAgYWRkICAgICAgc3Asc3AsIzB4MTAKLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTEscGN9Ci0KLQotUG9seVBoX2ZpbHRlcl9jb2VmZgotICAgICAgICBEQ0QgICAgICBwcW1mU3ludGhXaW4KLUxPV18xNkJJVFMKLSAgICAgICAgRENEICAgICAgMHgwMDAwN2ZmZgotCi0gICAgICAgIEVORFAKLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zCmluZGV4IGI3NGM4NDkuLjExNDBlZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMKQEAgLTM1LDYgKzM1LDcgQEAKIC50ZXh0CiAKIC5leHRlcm4gcHFtZlN5bnRoV2luCisuaGlkZGVuIHBxbWZTeW50aFdpbgogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X3dtLmFzbSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd193bS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTcyNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X3dtLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi07IGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi07IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ci07Ci07ICAgRmlsZW5hbWU6IHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCUNPREUzMgotCi0JQVJFQQl8LmRyZWN0dmV8LCBEUkVDVFZFCi0KLQlFWFBPUlQJfHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93fAotCUlNUE9SVAl8cHFtZlN5bnRoV2lufAotCi0JQVJFQQl8LnBkYXRhfCwgUERBVEEKLQotCUFSRUEJfC50ZXh0fCwgQ09ERSwgQVJNCi0KLXxwdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd3wgUFJPQwotICAgICAgICBzdG1mZCAgICBzcCEse3IwLXIyLHI0LXIxMSxscn0KLQotICAgICAgICBzdWIgICAgICBzcCxzcCwjNAotICAgICAgICBsZHIgICAgICByMixbc3AsIzB4Y10KLSAgICAgICAgbGRyICAgICAgcjEsUG9seVBoX2ZpbHRlcl9jb2VmZgotCQkKLSAgICAgICAgc3ViICAgICAgcjIscjIsIzEKLSAgICAgICAgbW92ICAgICAgcjEwLCMxCi0gICAgICAgIHN0ciAgICAgIHIyLFtzcF0KLQotOyBBY2N1bXVsYXRvcnMgcjksIHIxMTo6PiBJbml0aWFsaXphdGlvbgotCi1Mb29wX2oKLSAgICAgICAgbW92ICAgICAgcjksICAjMHgyMAotICAgICAgICBtb3YgICAgICByMTEsICMweDIwCi0gICAgICAgIG1vdiAgICAgIHI0LCAgIzB4MTAKLUxvb3BfaQotICAgICAgICBhZGQgICAgICByMixyNCxyMTAKLSAgICAgICAgYWRkICAgICAgcjMscjAscjIsbHNsICMyCi0gICAgICAgIHN1YiAgICAgIHIyLHI0LHIxMAotICAgICAgICBsZHIgICAgICByNSxbcjNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyMV0KLSAgICAgICAgYWRkICAgICAgcjEyLHIwLHIyLGxzbCAjMgotICAgICAgICBsZHIgICAgICByNixbcjEyLCMweDc4MF0KLSAgICAgICAgc21sYWwgICAgcjIscjksbHIscjUKLSAgICAgICAgc21sYWwgICAgcjIscjExLGxyLHI2Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IxMiwjMHg4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDcwMF0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzB4MjAwCi0gICAgICAgIHNtbGFsICAgIHI2LHI5LHI1LHI3Ci0gICAgICAgIHNtdWxsICAgIHI2LHIyLHI1LHI4Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjMHhjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHIyCi0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI1LHI4Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyNSxyNwotICAgICAgICBsZHIgICAgICByNSxbcjMsIzB4MTAwXQotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NjgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDE0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDE4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDYwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDFjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI2LHI4Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjUsW3IzLCMweDIwMF0KLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NTgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDI4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDUwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDJjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjkscjYscjgKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMywjMHgzMDBdCi0gICAgICAgIGxkciAgICAgIHI4LFtyMSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg0ODBdCi0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI4LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyOCxyNgotICAgICAgICBsZHIgICAgICByOCxbcjEsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEyLCMweDM4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHI4LHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHI4LHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgzOF0KLQotCi0gICAgICAgIGxkciAgICAgIHIzLFtyMywjMHg0MDBdCi0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI2LHIxMgotICAgICAgICBzbXVsbCAgICByOCxyNyxyNixyMwotICAgICAgICBjbXAgICAgICByNCwjMHgyMTAKLSAgICAgICAgc3ViICAgICAgcjExLHIxMSxyNwotCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgzY10KLSAgICAgICAgYWRkICAgICAgcjEscjEsIzB4NDAKLSAgICAgICAgc21sYWwgICAgcjMscjkscjIscjMKLSAgICAgICAgc21sYWwgICAgcjEyLHIxMSxyMixyMTIKLQotICAgICAgICBibHQgICAgICBMb29wX2kKLQotICAgICAgICBtb3YgICAgICByMyxyOSwgYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHI0LHIzLCBhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLCBhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIyLFtzcF0KLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjQsW3NwLCM4XQotICAgICAgICBtb3YgICAgICByMixyMTAsbHNsIHIyCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LHIyLGxzbCAjMQotICAgICAgICBzdHJoICAgICByMyxbcjRdCi0KLSAgICAgICAgbW92ICAgICAgcjMscjExLGFzciAjNgotICAgICAgICBtb3YgICAgICByNCxyMyxhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLGFzciAjMzEKLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtzcCwjMHhjXQotICAgICAgICBsZHIgICAgICByMTEsW3NwLCM4XQotICAgICAgICByc2IgICAgICByMixyMixyMTIsbHNsICM1Ci0gICAgICAgIGFkZCAgICAgIHIyLHIxMSxyMixsc2wgIzEKLSAgICAgICAgc3RyaCAgICAgcjMsW3IyXQotCi0gICAgICAgIGFkZCAgICAgIHIxMCxyMTAsIzEKLSAgICAgICAgY21wICAgICAgcjEwLCMweDEwCi0gICAgICAgIGJsdCAgICAgIExvb3BfagotCi07IEFjY3VtdWxhdG9ycyByNCwgcjUgSW5pdGlhbGl6YXRpb24KLQotICAgICAgICBtb3YgICAgICByNCwjMHgyMAotICAgICAgICBtb3YgICAgICByNSwjMHgyMAotICAgICAgICBtb3YgICAgICByMywjMHgxMAotUG9seVBoX2ZpbHRlcl9sb29wMgotICAgICAgICBhZGQgICAgICByMixyMCxyMyxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMl0KLSAgICAgICAgbGRyICAgICAgcjgsW3IxXQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4ODBdCi0gICAgICAgIHNtbGFsICAgIHIxMixyNCxyOCxyMTIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IyLCMweDQwXQotICAgICAgICBzbWxhbCAgICByNixyNCxyMTIscjYKLQotICAgICAgICBsZHIgICAgICByMTIsW3IxLCM4XQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4MTgwXQotICAgICAgICBzbWxhbCAgICByNyxyNSxyMTIscjcKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMiwjMHgxMDBdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMSwjMHhjXQotICAgICAgICBsZHIgICAgICByMixbcjIsIzB4MTQwXQotICAgICAgICBzbWxhbCAgICByMTIscjQscjcscjEyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEsIzB4MTBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLCMweDgwCi0gICAgICAgIHNtbGFsICAgIHI2LHI0LHIxMixyNgotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MTRdCi0gICAgICAgIGNtcCAgICAgIHIzLCMweDIxMAotICAgICAgICBzbWxhbCAgICByMixyNSxyNixyMgotICAgICAgICBhZGQgICAgICByMSxyMSwjMHgxOAotCi0gICAgICAgIGJsdCAgICAgIFBvbHlQaF9maWx0ZXJfbG9vcDIKLSAgICAgICAgbW92ICAgICAgcjAscjQsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMSxbc3AsIzhdCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMSwjMF0KLSAgICAgICAgbW92ICAgICAgcjAscjUsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMixbc3BdCi0gICAgICAgIG1vdiAgICAgIHIxLCMweDEwCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixbc3AsIzhdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCByMgotICAgICAgICBhZGQgICAgICByMSxyMTIscjEsbHNsICMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMV0KLSAgICAgICAgYWRkICAgICAgc3Asc3AsIzB4MTAKLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTEscGN9Ci0KLQotUG9seVBoX2ZpbHRlcl9jb2VmZgotICAgICAgICBEQ0QgICAgICBwcW1mU3ludGhXaW4KLUxPV18xNkJJVFMKLSAgICAgICAgRENEICAgICAgMHgwMDAwN2ZmZgotCQotCQlFTkRQICA7IHxwdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd3wKLQkJRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcAppbmRleCBlZTQyZGM1Li40OTk2NzJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwCkBAIC0xMzksNyArMTM5LDcgQEAKICAgICBpbnQxNiBibG9ja251bWJlciA9IDA7CiAKICAgICBncmFudWxlSW5mbyAqZ3JfaW5mbyA9ICYoc2ktPmNoW2NoXS5ncmFuW2dyXSk7Ci0gICAgdWludDMyIHNjYWxlZmFjX2NvbXAsIGludF9zY2FsZWZhY19jb21wLCBuZXdfc2xlbls0XTsKKyAgICB1aW50MzIgc2NhbGVmYWNfY29tcCwgaW50X3NjYWxlZmFjX2NvbXAsIG5ld19zbGVuWzRdID0geyAwLDAsMCwwIH07CiAKICAgICBzY2FsZWZhY19jb21wID0gIGdyX2luZm8tPnNjYWxlZmFjX2NvbXByZXNzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawppbmRleCA3ZjJjNDZkLi45M2ZmNjRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKQEAgLTIwLDQgKzIwLDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAppbmRleCAyYmFlMmFkLi4wOWU4Nzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcApAQCAtMjMsOSArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKLSNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKLSNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCi0jaW5jbHVkZSAidnB4L3ZwOGR4LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDEsNyArMzgsOCBAQAogICAgICAgICAgICAgTlVMTCAvKiBwcm9maWxlTGV2ZWxzICovLCAwIC8qIG51bVByb2ZpbGVMZXZlbHMgKi8sCiAgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1Nb2RlKGNvZGluZ1R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ1ZQOCA/IE1PREVfVlA4IDogTU9ERV9WUDkpLAotICAgICAgbUN0eChOVUxMKSB7CisgICAgICBtQ3R4KE5VTEwpLAorICAgICAgbUltZyhOVUxMKSB7CiAgICAgaW5pdFBvcnRzKGtOdW1CdWZmZXJzLCA3NjggKiAxMDI0IC8qIGlucHV0QnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgIGtOdW1CdWZmZXJzLAogICAgICAgICAgICAgY29kaW5nVHlwZSA9PSBPTVhfVklERU9fQ29kaW5nVlA4ID8gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4IDogTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKQEAgLTg1LDcgKzgzLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgU29mdFZQWDo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0VlBYOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTE4LDY4ICsxMTYsNDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKAotICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKKyAgICAgICAgaWYgKG1JbWcgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAwKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiIpOwogCi0gICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IE5VTEw7CisgICAgICAgICAgICBtSW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSgodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgJml0ZXIpOwogICAgICAgICB9CiAKLSAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKLSAgICAgICAgdnB4X2ltYWdlX3QgKmltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKKyAgICAgICAgaWYgKG1JbWcgIT0gTlVMTCkgeworICAgICAgICAgICAgQ0hFQ0tfRVEobUltZy0+Zm10LCBJTUdfRk1UX0k0MjApOwogCi0gICAgICAgIGlmIChpbWcgIT0gTlVMTCkgewotICAgICAgICAgICAgQ0hFQ0tfRVEoaW1nLT5mbXQsIElNR19GTVRfSTQyMCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoID0gaW1nLT5kX3c7Ci0gICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBpbWctPmRfaDsKLQotICAgICAgICAgICAgaWYgKHdpZHRoICE9IG1XaWR0aCB8fCBoZWlnaHQgIT0gbUhlaWdodCkgewotICAgICAgICAgICAgICAgIG1XaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IG1JbWctPmRfdzsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IG1JbWctPmRfaDsKKyAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAob3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpICogMykgLyAyOwogICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBFT1NzZWVuID8gT01YX0JVRkZFUkZMQUdfRU9TIDogMDsKICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwogCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9ZXTsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2g7ICsraSkgewotICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93KTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tQTEFORV9ZXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tQTEFORV9VXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tQTEFORV9WXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbUltZy0+c3RyaWRlW1BMQU5FX1ldOworICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBtSW1nLT5zdHJpZGVbUExBTkVfVV07CisgICAgICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IG1JbWctPnN0cmlkZVtQTEFORV9WXTsKKyAgICAgICAgICAgIGNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUpOwogCi0gICAgICAgICAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtQTEFORV9ZXTsKLSAgICAgICAgICAgICAgICBkc3QgKz0gaW1nLT5kX3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1VdOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaCAvIDI7ICsraSkgewotICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93IC8gMik7Ci0KLSAgICAgICAgICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1VdOwotICAgICAgICAgICAgICAgIGRzdCArPSBpbWctPmRfdyAvIDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1ZdOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaCAvIDI7ICsraSkgewotICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93IC8gMik7Ci0KLSAgICAgICAgICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1ZdOwotICAgICAgICAgICAgICAgIGRzdCArPSBpbWctPmRfdyAvIDI7Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIG1JbWcgPSBOVUxMOwogICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCBjZDVlYjI4Li44ZjY4NjkzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0yMCw2ICsyMCwxMCBAQAogCiAjaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBTb2Z0VlBYIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewpAQCAtNDcsNiArNTEsOCBAQAogCiAgICAgdm9pZCAqbUN0eDsKIAorICAgIHZweF9pbWFnZV90ICptSW1nOworCiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWUFgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsKaW5kZXggNDA2MGEwYS4uZTI2NTEwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLm1rCkBAIC0xMiwxMCArMTIsNiBAQAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCi1pZmVxICgkKFRBUkdFVF9ERVZJQ0UpLCBtYW50YSkKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURTVVJGQUNFX0lTX0JHUjMyCi1lbmRpZgotCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlidnB4CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAppbmRleCA4Mzc1Y2FjLi5lYjYyMWQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCkBAIC0yNyw3ICsyNyw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotCiB0ZW1wbGF0ZTxjbGFzcyBUPgogc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKICAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOwpAQCAtNTEsMTA3ICs1MCwzNyBAQAogICAgIHJldHVybiBjcHVDb3JlQ291bnQ7CiB9CiAKLQotLy8gVGhpcyBjb2xvciBjb252ZXJzaW9uIHV0aWxpdHkgaXMgY29waWVkIGZyb20gU29mdE1QRUc0RW5jb2Rlci5jcHAKLWlubGluZSBzdGF0aWMgdm9pZCBDb252ZXJ0U2VtaVBsYW5hclRvUGxhbmFyKHVpbnQ4X3QgKmlueXV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0eXV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KSB7Ci0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgQ29udmVydFJHQjMyVG9QbGFuYXIoCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0WSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKLSAgICBDSEVDSygod2lkdGggJiAxKSA9PSAwKTsKLSAgICBDSEVDSygoaGVpZ2h0ICYgMSkgPT0gMCk7Ci0KLSAgICB1aW50OF90ICpkc3RVID0gZHN0WSArIHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKHdpZHRoIC8gMikgKiAoaGVpZ2h0IC8gMik7Ci0KLSAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0jaWZkZWYgU1VSRkFDRV9JU19CR1IzMgotICAgICAgICAgICAgdW5zaWduZWQgYmx1ZSA9IHNyY1s0ICogeF07Ci0gICAgICAgICAgICB1bnNpZ25lZCBncmVlbiA9IHNyY1s0ICogeCArIDFdOwotICAgICAgICAgICAgdW5zaWduZWQgcmVkPSBzcmNbNCAqIHggKyAyXTsKLSNlbHNlCi0gICAgICAgICAgICB1bnNpZ25lZCByZWQ9IHNyY1s0ICogeF07Ci0gICAgICAgICAgICB1bnNpZ25lZCBncmVlbiA9IHNyY1s0ICogeCArIDFdOwotICAgICAgICAgICAgdW5zaWduZWQgYmx1ZSA9IHNyY1s0ICogeCArIDJdOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHVuc2lnbmVkIGx1bWEgPQotICAgICAgICAgICAgICAgICgocmVkICogNjYgKyBncmVlbiAqIDEyOSArIGJsdWUgKiAyNSkgPj4gOCkgKyAxNjsKLQotICAgICAgICAgICAgZHN0WVt4XSA9IGx1bWE7Ci0KLSAgICAgICAgICAgIGlmICgoeCAmIDEpID09IDAgJiYgKHkgJiAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgVSA9Ci0gICAgICAgICAgICAgICAgICAgICgoLXJlZCAqIDM4IC0gZ3JlZW4gKiA3NCArIGJsdWUgKiAxMTIpID4+IDgpICsgMTI4OwotCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgViA9Ci0gICAgICAgICAgICAgICAgICAgICgocmVkICogMTEyIC0gZ3JlZW4gKiA5NCAtIGJsdWUgKiAxOCkgPj4gOCkgKyAxMjg7Ci0KLSAgICAgICAgICAgICAgICBkc3RVW3ggLyAyXSA9IFU7Ci0gICAgICAgICAgICAgICAgZHN0Vlt4IC8gMl0gPSBWOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCh5ICYgMSkgPT0gMCkgewotICAgICAgICAgICAgZHN0VSArPSB3aWR0aCAvIDI7Ci0gICAgICAgICAgICBkc3RWICs9IHdpZHRoIC8gMjsKLSAgICAgICAgfQotCi0gICAgICAgIHNyYyArPSA0ICogd2lkdGg7Ci0gICAgICAgIGRzdFkgKz0gd2lkdGg7Ci0gICAgfQotfQotCiBTb2Z0VlBYRW5jb2Rlcjo6U29mdFZQWEVuY29kZXIoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQotICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgOiBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1Db2RlY0NvbnRleHQoTlVMTCksCiAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKE5VTEwpLAogICAgICAgbUNvZGVjSW50ZXJmYWNlKE5VTEwpLAogICAgICAgbVdpZHRoKDE3NiksCiAgICAgICBtSGVpZ2h0KDE0NCksCiAgICAgICBtQml0cmF0ZSgxOTIwMDApLCAgLy8gaW4gYnBzCisgICAgICBtRnJhbWVyYXRlKDMwIDw8IDE2KSwgLy8gaW4gUTE2IGZvcm1hdAogICAgICAgbUJpdHJhdGVVcGRhdGVkKGZhbHNlKSwKICAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUoVlBYX1ZCUiksICAvLyB2YXJpYWJsZSBiaXRyYXRlCi0gICAgICBtRnJhbWVEdXJhdGlvblVzKDMzMzMzKSwgIC8vIERlZmF1bHRzIHRvIDMwIGZwcwogICAgICAgbURDVFBhcnRpdGlvbnMoMCksCiAgICAgICBtRXJyb3JSZXNpbGllbmNlKE9NWF9GQUxTRSksCiAgICAgICBtQ29sb3JGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciksCiAgICAgICBtTGV2ZWwoT01YX1ZJREVPX1ZQOExldmVsX1ZlcnNpb24wKSwKKyAgICAgIG1LZXlGcmFtZUludGVydmFsKDApLAorICAgICAgbU1pblF1YW50aXplcigwKSwKKyAgICAgIG1NYXhRdWFudGl6ZXIoMCksCisgICAgICBtVGVtcG9yYWxMYXllcnMoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuVHlwZShPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGgoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuSWR4KDApLAorICAgICAgbUxhc3RUaW1lc3RhbXAoMHg3RkZGRkZGRkZGRkZGRkZGTEwpLAogICAgICAgbUNvbnZlcnNpb25CdWZmZXIoTlVMTCksCiAgICAgICBtSW5wdXREYXRhSXNNZXRhKGZhbHNlKSwKLSAgICAgIG1HcmFsbG9jTW9kdWxlKE5VTEwpLAogICAgICAgbUtleUZyYW1lUmVxdWVzdGVkKGZhbHNlKSB7CisgICAgbWVtc2V0KG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLCAwLCBzaXplb2YobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8pKTsKKyAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1swXSA9IDEwMDsKICAgICBpbml0UG9ydHMoKTsKIH0KIApAQCAtMTgwLDkgKzEwOSw4IEBACiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uU3RyaWRlID0gaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGlucHV0UG9ydC5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSAwOwotICAgIC8vIGZyYW1lUmF0ZSBpcyByZWNpcHJvY2FsIG9mIGZyYW1lRHVyYXRpb24sIHdoaWNoIGlzCi0gICAgLy8gaW4gbWljcm9zZWNvbmRzLiBJdCBpcyBhbHNvIGluIFExNiBmb3JtYXQuCi0gICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gKDEwMDAwMDAvbUZyYW1lRHVyYXRpb25VcykgPDwgMTY7CisgICAgLy8gZnJhbWVSYXRlIGlzIGluIFExNiBmb3JtYXQuCisgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gbUZyYW1lcmF0ZTsKICAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKICAgICBpbnB1dFBvcnQublBvcnRJbmRleCA9IGtJbnB1dFBvcnRJbmRleDsKICAgICBpbnB1dFBvcnQuZURpciA9IE9NWF9EaXJJbnB1dDsKQEAgLTIyMCw3ICsxNDgsNyBAQAogICAgIG91dHB1dFBvcnQuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdWUDg7CiAgICAgb3V0cHV0UG9ydC5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKICAgICBvdXRwdXRQb3J0LmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKLSAgICBvdXRwdXRQb3J0Lm5CdWZmZXJTaXplID0gMjU2ICogMTAyNDsgIC8vIGFyYml0cmFyeQorICAgIG91dHB1dFBvcnQubkJ1ZmZlclNpemUgPSAxMDI0ICogMTAyNDsgLy8gYXJiaXRyYXJ5CiAKICAgICBhZGRQb3J0KG91dHB1dFBvcnQpOwogfQpAQCAtMjM2LDcgKzE2NCw5IEBACiAgICAgaWYgKG1Db2RlY0ludGVyZmFjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KLQorICAgIEFMT0dEKCJWUDg6IGluaXRFbmNvZGVyLiBCUk1vZGU6ICV1LiBUU0xheWVyczogJXp1LiBLRjogJXUuIFFQOiAldSAtICV1IiwKKyAgICAgICAgICAodWludDMyX3QpbUJpdHJhdGVDb250cm9sTW9kZSwgbVRlbXBvcmFsTGF5ZXJzLCBtS2V5RnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyKTsKICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KG1Db2RlY0ludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgIC8vIENvZGVjIHNwZWNpZmljIGZsYWdzCkBAIC0yNzcsOCArMjA3LDEyMCBAQAogICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UubnVtID0gMTsKICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLmRlbiA9IDEwMDAwMDA7CiAgICAgLy8gcmNfdGFyZ2V0X2JpdHJhdGUgaXMgaW4ga2JwcywgbUJpdHJhdGUgaW4gYnBzCi0gICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZS8xMDAwOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0gKG1CaXRyYXRlICsgNTAwKSAvIDEwMDA7CiAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZW5kX3VzYWdlID0gbUJpdHJhdGVDb250cm9sTW9kZTsKKyAgICAvLyBEaXNhYmxlIGZyYW1lIGRyb3AgLSBub3QgYWxsb3dlZCBpbiBNZWRpYUNvZGVjIG5vdy4KKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19kcm9wZnJhbWVfdGhyZXNoID0gMDsKKyAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfQ0JSKSB7CisgICAgICAgIC8vIERpc2FibGUgc3BhdGlhbCByZXNpemluZy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfcmVzaXplX2FsbG93ZWQgPSAwOworICAgICAgICAvLyBTaW5nbGUtcGFzcyBtb2RlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Bhc3MgPSBWUFhfUkNfT05FX1BBU1M7CisgICAgICAgIC8vIE1heGltdW0gYW1vdW50IG9mIGJpdHMgdGhhdCBjYW4gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdW5kZXJzaG9vdF9wY3QgPSAxMDA7CisgICAgICAgIC8vIE1heGltdW0gYW1vdW50IG9mIGJpdHMgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHRhcmdldAorICAgICAgICAvLyBiaXRyYXRlIC0gZXhwcmVzc2VkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19vdmVyc2hvb3RfcGN0ID0gMTU7CisgICAgICAgIC8vIEluaXRpYWwgdmFsdWUgb2YgdGhlIGJ1ZmZlciBsZXZlbCBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX2luaXRpYWxfc3ogPSA1MDA7CisgICAgICAgIC8vIEFtb3VudCBvZiBkYXRhIHRoYXQgdGhlIGVuY29kZXIgc2hvdWxkIHRyeSB0byBtYWludGFpbiBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogPSA2MDA7CisgICAgICAgIC8vIFRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSBidWZmZXJlZCBieSB0aGUgZGVjb2RpbmcKKyAgICAgICAgLy8gYXBwbGljYXRpb24gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9zeiA9IDEwMDA7CisgICAgICAgIC8vIEVuYWJsZSBlcnJvciByZXNpbGllbmNlIC0gbmVlZGVkIGZvciBwYWNrZXQgbG9zcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19lcnJvcl9yZXNpbGllbnQgPSAxOworICAgICAgICAvLyBEaXNhYmxlIGxhZ2dlZCBlbmNvZGluZy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19sYWdfaW5fZnJhbWVzID0gMDsKKyAgICAgICAgLy8gTWF4aW11bSBrZXkgZnJhbWUgaW50ZXJ2YWwgLSBmb3IgQ0JSIGJvb3N0IHRvIDMwMDAKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSAzMDAwOworICAgICAgICAvLyBFbmNvZGVyIGRldGVybWluZXMgb3B0aW1hbCBrZXkgZnJhbWUgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHkuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisKKyAgICAvLyBGcmFtZXMgdGVtcG9yYWwgcGF0dGVybiAtIGZvciBub3cgV2ViUlRDIGxpa2UgcGF0dGVybiBpcyBvbmx5IHN1cHBvcnRlZC4KKyAgICBzd2l0Y2ggKG1UZW1wb3JhbExheWVycykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAxOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAxOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzJdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzZdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDM6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAzOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbM10gPSAyOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiV3JvbmcgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAlenUiLCBtVGVtcG9yYWxMYXllcnMpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgYml0cmF0ZSB2YWx1ZXMgZm9yIGVhY2ggbGF5ZXIKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnM7IGkrKykgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c190YXJnZXRfYml0cmF0ZVtpXSA9CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSAqCisgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSAvIDEwMDsKKyAgICB9CisgICAgaWYgKG1LZXlGcmFtZUludGVydmFsID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tYXhfZGlzdCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9taW5fZGlzdCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorICAgIGlmIChtTWluUXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19taW5fcXVhbnRpemVyID0gbU1pblF1YW50aXplcjsKKyAgICB9CisgICAgaWYgKG1NYXhRdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21heF9xdWFudGl6ZXIgPSBtTWF4UXVhbnRpemVyOworICAgIH0KIAogICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfaW5pdChtQ29kZWNDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNJbnRlcmZhY2UsCkBAIC0yOTgsMTMgKzM0MCwzOSBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8IG1JbnB1dERhdGFJc01ldGEpIHsKLSAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKTsKLSAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpbmcgY29udmVyc2lvbiBidWZmZXIgZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIC8vIEV4dHJhIENCUiBzZXR0aW5ncworICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKKyAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICB1aW50MzJfdCByY19tYXhfaW50cmFfdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfb3B0aW1hbF9zeiAqIChtRnJhbWVyYXRlID4+IDE3KSAvIDEwOworICAgICAgICAgICAgLy8gRG9uJ3QgZ28gYmVsb3cgMyB0aW1lcyBwZXIgZnJhbWUgYmFuZHdpZHRoLgorICAgICAgICAgICAgaWYgKHJjX21heF9pbnRyYV90YXJnZXQgPCAzMDApIHsKKyAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0ID0gMzAwOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjX21heF9pbnRyYV90YXJnZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfQ1BVVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgY2JyIHBhcmFtZXRlcnMgZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgfHwgbUlucHV0RGF0YUlzTWV0YSkgeworICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpOworICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpbmcgY29udmVyc2lvbiBidWZmZXIgZmFpbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE9LOwpAQCAtMzI0LDcgKzM5Miw3IEBACiAgICAgfQogCiAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1Db252ZXJzaW9uQnVmZmVyOworICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyKTsKICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBOVUxMOwogICAgIH0KIApAQCAtMzYxLDkgKzQyOSw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwotICAgICAgICAgICAgICAgIC8vIENvbnZlcnRpbmcgZnJvbSBtaWNyb3NlY29uZHMKLSAgICAgICAgICAgICAgICAvLyBBbHNvIGNvbnZlcnRpbmcgdG8gUTE2IGZvcm1hdAotICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9ICgxMDAwMDAwL21GcmFtZUR1cmF0aW9uVXMpIDw8IDE2OworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IG1GcmFtZXJhdGU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSBrT3V0cHV0UG9ydEluZGV4KSB7CiAgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlA4OwpAQCAtNDExLDYgKzQ3NywyNCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQW5kcm9pZFZwOEVuY29kZXI6IHsKKyAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICp2cDhBbmRyb2lkUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgKilwYXJhbTsKKworICAgICAgICAgICAgICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bktleUZyYW1lSW50ZXJ2YWwgPSBtS2V5RnJhbWVJbnRlcnZhbDsKKyAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuID0gbVRlbXBvcmFsUGF0dGVyblR5cGU7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJDb3VudCA9IG1UZW1wb3JhbExheWVyczsKKyAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uTWluUXVhbnRpemVyID0gbU1pblF1YW50aXplcjsKKyAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uTWF4UXVhbnRpemVyID0gbU1heFF1YW50aXplcjsKKyAgICAgICAgICAgICAgICBtZW1jcHkodnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLCBzaXplb2YobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOiB7CiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcHJvZmlsZUFuZExldmVsID0KICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwYXJhbTsKQEAgLTQ5NywxMSArNTgxLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRWcDhQYXJhbXMoCiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9WUDhUWVBFICopcGFyYW0pOwogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyOgorICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgKilwYXJhbSk7CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKICAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldFByb2ZpbGVMZXZlbCgKICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwYXJhbSk7CiAKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZDoKKyAgICAgICAgY2FzZSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OgogICAgICAgICB7CiAgICAgICAgICAgICAvLyBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzCiAgICAgICAgICAgICBjb25zdCBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zICpzdG9yZVBhcmFtID0KQEAgLTYxMCw2ICs2OTgsNTAgQEAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKIH0KIAorT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zKAorICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSogdnA4QW5kcm9pZFBhcmFtcykgeworICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgfQorICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuICE9IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUgJiYKKyAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiAhPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQ291bnQgPiBPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSUykgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgIH0KKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplciA+IHZwOEFuZHJvaWRQYXJhbXMtPm5NYXhRdWFudGl6ZXIpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBtVGVtcG9yYWxQYXR0ZXJuVHlwZSA9IHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm47CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gPT0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDKSB7CisgICAgICAgIG1UZW1wb3JhbExheWVycyA9IHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQ291bnQ7CisgICAgfSBlbHNlIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUpIHsKKyAgICAgICAgbVRlbXBvcmFsTGF5ZXJzID0gMDsKKyAgICB9CisgICAgLy8gQ2hlY2sgdGhlIGJpdHJhdGUgZGlzdHJpYnV0aW9uIGJldHdlZW4gbGF5ZXJzIGlzIGluIGluY3JlYXNpbmcgb3JkZXIKKyAgICBpZiAobVRlbXBvcmFsTGF5ZXJzID4gMSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UZW1wb3JhbExheWVycyAtIDE7IGkrKykgeworICAgICAgICAgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2kgKyAxXSA8PQorICAgICAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBiaXRyYXRlIHJhdGlvIC0gc2hvdWxkIGJlIGluIGluY3JlYXNpbmcgb3JkZXIuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtS2V5RnJhbWVJbnRlcnZhbCA9IHZwOEFuZHJvaWRQYXJhbXMtPm5LZXlGcmFtZUludGVydmFsOworICAgIG1NaW5RdWFudGl6ZXIgPSB2cDhBbmRyb2lkUGFyYW1zLT5uTWluUXVhbnRpemVyOworICAgIG1NYXhRdWFudGl6ZXIgPSB2cDhBbmRyb2lkUGFyYW1zLT5uTWF4UXVhbnRpemVyOworICAgIG1lbWNweShtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sCisgICAgICAgICAgICBzaXplb2YobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8pKTsKKyAgICBBTE9HRCgiVlA4OiBpbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMuIEJSTW9kZTogJXUuIFRTOiAlenUuIEtGOiAldS4iCisgICAgICAgICAgIiBRUDogJXUgLSAldSBCUjA6ICV1LiBCUjE6ICV1LiBCUjI6ICV1IiwKKyAgICAgICAgICAodWludDMyX3QpbUJpdHJhdGVDb250cm9sTW9kZSwgbVRlbXBvcmFsTGF5ZXJzLCBtS2V5RnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyLCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1swXSwKKyAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1sxXSwgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMl0pOworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQogCiBPTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjppbnRlcm5hbFNldEZvcm1hdFBhcmFtcygKICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFKiBmb3JtYXQpIHsKQEAgLTY2MCw5ICs3OTIsNyBAQAogICAgICAgICBtSGVpZ2h0ID0gcG9ydC0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIAogICAgICAgICAvLyB4RnJhbWVyYXRlIGNvbWVzIGluIFExNiBmb3JtYXQsIGluIGZyYW1lcyBwZXIgc2Vjb25kIHVuaXQKLSAgICAgICAgY29uc3QgdWludDMyX3QgZnJhbWVyYXRlID0gcG9ydC0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPj4gMTY7Ci0gICAgICAgIC8vIGZyYW1lIGR1cmF0aW9uIGlzIGluIG1pY3Jvc2Vjb25kcwotICAgICAgICBtRnJhbWVEdXJhdGlvblVzID0gKDEwMDAwMDAvZnJhbWVyYXRlKTsKKyAgICAgICAgbUZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOwogCiAgICAgICAgIGlmIChwb3J0LT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgfHwKICAgICAgICAgICAgIHBvcnQtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgfHwKQEAgLTY3NSwxMiArODA1LDIyIEBACiAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oa0lucHV0UG9ydEluZGV4KS0+bURlZjsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CiAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7Ci0gICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IG1GcmFtZXJhdGU7CiAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IG1Db2xvckZvcm1hdDsKKyAgICAgICAgZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CiAKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfSBlbHNlIGlmIChwb3J0LT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgbUJpdHJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgICAgIG1XaWR0aCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgbUhlaWdodCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gbUJpdHJhdGU7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CkBAIC03MDcsNiArODQ3LDc0IEBACiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKK3ZweF9lbmNfZnJhbWVfZmxhZ3NfdCBTb2Z0VlBYRW5jb2Rlcjo6Z2V0RW5jb2RlRmxhZ3MoKSB7CisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gMDsKKyAgICBpbnQgcGF0dGVybklkeCA9IG1UZW1wb3JhbFBhdHRlcm5JZHggJSBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgrKzsKKyAgICBzd2l0Y2ggKG1UZW1wb3JhbFBhdHRlcm5bcGF0dGVybklkeF0pIHsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZToKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmxhZ3M7Cit9CiAKIHZvaWQgU29mdFZQWEVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkKQEAgLTc0Niw1MSArOTU0LDMzIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICB1aW50OF90ICpzb3VyY2UgPQorICAgICAgICBjb25zdCB1aW50OF90ICpzb3VyY2UgPQogICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIgKyBpbnB1dEJ1ZmZlckhlYWRlci0+bk9mZnNldDsKIAogICAgICAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgewotICAgICAgICAgICAgQ0hFQ0tfR0UoaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4sCi0gICAgICAgICAgICAgICAgICAgICA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwotCi0gICAgICAgICAgICB1aW50MzJfdCBidWZmZXJUeXBlID0gKih1aW50MzJfdCAqKXNvdXJjZTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJ1ZmZlclR5cGUsIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKTsKLQotICAgICAgICAgICAgaWYgKG1HcmFsbG9jTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSgwLCBod19nZXRfbW9kdWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbUdyYWxsb2NNb2R1bGUpKTsKKyAgICAgICAgICAgIHNvdXJjZSA9IGV4dHJhY3RHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciwgbVdpZHRoICogbUhlaWdodCAqIDMgLyAyLAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuLAorICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBleHRyYWN0IGdyYWxsb2MgYnVmZmVyIGluIG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25zdCBncmFsbG9jX21vZHVsZV90ICpncm1vZHVsZSA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKiltR3JhbGxvY01vZHVsZTsKLQotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZSA9ICooYnVmZmVyX2hhbmRsZV90ICopKHNvdXJjZSArIDQpOwotCi0gICAgICAgICAgICB2b2lkICpiaXRzOwotICAgICAgICAgICAgQ0hFQ0tfRVEoMCwKLSAgICAgICAgICAgICAgICAgICAgIGdybW9kdWxlLT5sb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgIGdybW9kdWxlLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIG1XaWR0aCwgbUhlaWdodCwgJmJpdHMpKTsKLQotICAgICAgICAgICAgQ29udmVydFJHQjMyVG9QbGFuYXIoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYml0cywgbUNvbnZlcnNpb25CdWZmZXIsIG1XaWR0aCwgbUhlaWdodCk7Ci0KLSAgICAgICAgICAgIHNvdXJjZSA9IG1Db252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICBDSEVDS19FUSgwLCBncm1vZHVsZS0+dW5sb2NrKGdybW9kdWxlLCBoYW5kbGUpKTsKICAgICAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKLSAgICAgICAgICAgIENvbnZlcnRTZW1pUGxhbmFyVG9QbGFuYXIoCisgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAogICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIG1Db252ZXJzaW9uQnVmZmVyLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgICAgICAgICBzb3VyY2UgPSBtQ29udmVyc2lvbkJ1ZmZlcjsKICAgICAgICAgfQogICAgICAgICB2cHhfaW1hZ2VfdCByYXdfZnJhbWU7CiAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCBtV2lkdGgsIG1IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBrSW5wdXRCdWZmZXJBbGlnbm1lbnQsIHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICBrSW5wdXRCdWZmZXJBbGlnbm1lbnQsICh1aW50OF90ICopc291cmNlKTsKIAogICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAobVRlbXBvcmFsUGF0dGVybkxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZsYWdzID0gZ2V0RW5jb2RlRmxhZ3MoKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUtleUZyYW1lUmVxdWVzdGVkKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CiAgICAgICAgICAgICBtS2V5RnJhbWVSZXF1ZXN0ZWQgPSBmYWxzZTsKQEAgLTgxMSwxMSArMTAwMSwxOCBAQAogICAgICAgICAgICAgbUJpdHJhdGVVcGRhdGVkID0gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICB1aW50MzJfdCBmcmFtZUR1cmF0aW9uOworICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPiBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgLSBtTGFzdFRpbWVzdGFtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KSgoKHVpbnQ2NF90KTEwMDAwMDAgPDwgMTYpIC8gbUZyYW1lcmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RUaW1lc3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY29kZSgKICAgICAgICAgICAgICAgICBtQ29kZWNDb250ZXh0LAogICAgICAgICAgICAgICAgICZyYXdfZnJhbWUsCiAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAsICAvLyBpbiB0aW1lYmFzZSB1bml0cwotICAgICAgICAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMsICAvLyBmcmFtZSBkdXJhdGlvbiBpbiB0aW1lYmFzZSB1bml0cworICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb24sICAvLyBmcmFtZSBkdXJhdGlvbiBpbiB0aW1lYmFzZSB1bml0cwogICAgICAgICAgICAgICAgIGZsYWdzLCAgLy8gZnJhbWUgZmxhZ3MKICAgICAgICAgICAgICAgICBWUFhfRExfUkVBTFRJTUUpOyAgLy8gZW5jb2RpbmcgZGVhZGxpbmUKICAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKQEAgLTg1NCwxNiArMTA1MSw2IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjpnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSkgewotICAgICAgICAqaW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZDsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCAwNzY4MzBmLi5mNGMxNTY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1ZQWF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgogCiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CkBAIC01OSw3ICs1OSw3IEBACiAvLyAgICAtIE9NWCB0aW1lc3RhbXBzIGFyZSBpbiBtaWNyb3NlY29uZHMsIHRoZXJlZm9yZQogLy8gZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZCB0byAxLzEwMDAwMDAKIAotc3RydWN0IFNvZnRWUFhFbmNvZGVyIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworc3RydWN0IFNvZnRWUFhFbmNvZGVyIDogcHVibGljIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRWUFhFbmNvZGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKQEAgLTg3LDEwICs4Nyw0NCBAQAogICAgIC8vIGVuY29kaW5nIG9mIHRoZSBmcmFtZQogICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKLQogcHJpdmF0ZToKKyAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgIC8vIEZvciAxIGxheWVyIGNhc2U6IHJlZmVyZW5jZSBhbGwgKGxhc3QsIGdvbGRlbiwgYW5kIGFsdCByZWYpLCBidXQgb25seQorICAgICAgICAvLyB1cGRhdGUgbGFzdC4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAvLyBGaXJzdCBiYXNlIGxheWVyIGZyYW1lIGZvciAzIHRlbXBvcmFsIGxheWVycywgd2hpY2ggdXBkYXRlcyBsYXN0IGFuZAorICAgICAgICAvLyBnb2xkZW4gd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZiA9IDEwLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWYgPSA5LAorICAgICAgICAvLyBCYXNlIGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgLy8gSGlnaGVzdCBlbmhhY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBnb2xkZW4gd2l0aCBhbHQgcmVmCisgICAgICAgIC8vIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgIC8vIFNlY29uZCBsYXllciBhbmQgbGFzdCBmcmFtZSBpbiBjeWNsZSwgZm9yIDIgbGF5ZXJzLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWYgPSA2LAorICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lID0gNSwKKyAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGZyYW1lcyBpbgorICAgICAgICAvLyB0aGUgc2Vjb25kIGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW4gPSAyLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgIC8vIHRoZSBmaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3kgPSAxLAorICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0ID0gMCwKKyAgICB9OworICAgIGVudW0geworICAgICAgICBrTWF4VGVtcG9yYWxQYXR0ZXJuID0gOAorICAgIH07CisKICAgICAvLyBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgcGVyIHBvcnQKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga051bUJ1ZmZlcnMgPSA0OwogCkBAIC0xMzAsMTYgKzE2NCwxNSBAQAogICAgIC8vIFRhcmdldCBiaXRyYXRlIHNldCBmb3IgdGhlIGVuY29kZXIsIGluIGJpdHMgcGVyIHNlY29uZC4KICAgICB1aW50MzJfdCBtQml0cmF0ZTsKIAorICAgIC8vIFRhcmdldCBmcmFtZXJhdGUgc2V0IGZvciB0aGUgZW5jb2Rlci4KKyAgICB1aW50MzJfdCBtRnJhbWVyYXRlOworCiAgICAgLy8gSWYgYSByZXF1ZXN0IGZvciBhIGNoYW5nZSBpdCBiaXRyYXRlIGhhcyBiZWVuIHJlY2VpdmVkLgogICAgIGJvb2wgbUJpdHJhdGVVcGRhdGVkOwogCiAgICAgLy8gQml0cmF0ZSBjb250cm9sIG1vZGUsIGVpdGhlciBjb25zdGFudCBvciB2YXJpYWJsZQogICAgIHZweF9yY19tb2RlIG1CaXRyYXRlQ29udHJvbE1vZGU7CiAKLSAgICAvLyBGcmFtZSBkdXJhdGlvbiBpcyB0aGUgcmVjaXByb2NhbCBvZiBmcmFtZXJhdGUsIGRlbm90ZWQKLSAgICAvLyBpbiBtaWNyb3NlY29uZHMKLSAgICB1aW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwotCiAgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCiAgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgogICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCkBAIC0xNjAsNiArMTkzLDM2IEBACiAgICAgLy8gc29tZXRoaW5nIGVsc2UuCiAgICAgT01YX1ZJREVPX1ZQOExFVkVMVFlQRSBtTGV2ZWw7CiAKKyAgICAvLyBLZXkgZnJhbWUgaW50ZXJ2YWwgaW4gZnJhbWVzCisgICAgdWludDMyX3QgbUtleUZyYW1lSW50ZXJ2YWw7CisKKyAgICAvLyBNaW5pbXVtIChiZXN0IHF1YWxpdHkpIHF1YW50aXplcgorICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAvLyBNYXhpbXVtICh3b3JzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICB1aW50MzJfdCBtTWF4UXVhbnRpemVyOworCisgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICBzaXplX3QgbVRlbXBvcmFsTGF5ZXJzOworCisgICAgLy8gVGVtcG9yYWwgbGF5ZXIgYml0cmFyZSByYXRpbyBpbiBwZXJjZW50YWdlCisgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlNdOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiB0eXBlCisgICAgT01YX1ZJREVPX0FORFJPSURfVlBYVEVNUE9SQUxMQVlFUlBBVFRFUk5UWVBFIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBsZW5ndGgKKyAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybkxlbmd0aDsKKworICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuSWR4OworCisgICAgLy8gRnJhbWUgdHlwZSB0ZW1wb3JhbCBwYXR0ZXJuCisgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAvLyBMYXN0IGlucHV0IGJ1ZmZlciB0aW1lc3RhbXAKKyAgICBPTVhfVElDS1MgbUxhc3RUaW1lc3RhbXA7CisKICAgICAvLyBDb252ZXJzaW9uIGJ1ZmZlciBpcyBuZWVkZWQgdG8gY29udmVydCBzZW1pCiAgICAgLy8gcGxhbmFyIHl1djQyMCB0byBwbGFuYXIgZm9ybWF0CiAgICAgLy8gSXQgaXMgb25seSBhbGxvY2F0ZWQgaWYgaW5wdXQgZm9ybWF0IGlzCkBAIC0xNjcsNyArMjMwLDYgQEAKICAgICB1aW50OF90KiBtQ29udmVyc2lvbkJ1ZmZlcjsKIAogICAgIGJvb2wgbUlucHV0RGF0YUlzTWV0YTsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbUdyYWxsb2NNb2R1bGU7CiAKICAgICBib29sIG1LZXlGcmFtZVJlcXVlc3RlZDsKIApAQCAtMTg1LDYgKzI0Nyw5IEBACiAgICAgLy8gZHRvci4KICAgICBzdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOwogCisgICAgLy8gR2V0IGN1cnJlbnQgZW5jb2RlIGZsYWdzCisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGdldEVuY29kZUZsYWdzKCk7CisKICAgICAvLyBIYW5kbGVzIHBvcnQgY2hhbmdlcyB3aXRoIHJlc3BlY3QgdG8gY29sb3IgZm9ybWF0cwogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSogZm9ybWF0KTsKQEAgLTIwNiw2ICsyNzEsMTAgQEAKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0VnA4UGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSogdnA4UGFyYW1zKTsKIAorICAgIC8vIEhhbmRsZXMgQW5kcm9pZCB2cDggc3BlY2lmaWMgcGFyYW1ldGVycy4KKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUqIHZwOEFuZHJvaWRQYXJhbXMpOworCiAgICAgLy8gVXBkYXRlcyBlbmNvZGVyIHByb2ZpbGUKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UHJvZmlsZUxldmVsKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSogcHJvZmlsZUFuZExldmVsKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKaW5kZXggNjU1YjJhYi4uYmYwM2FkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKQEAgLTg0LDggKzg0LDggQEAKIAkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMgXAogCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBcCiAKLQotaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCitpZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCisgIGlmZXEgKCQoQVJDSF9BUk1fSEFWRV9ORU9OKSx0cnVlKQogICAgIExPQ0FMX0FSTV9ORU9OICAgOj0gdHJ1ZQogIyAgICBMT0NBTF9DRkxBR1MgICAgIDo9IC1zdGQ9Yzk5IC1ELl9ORU9OIC1ELl9PTVhETAogICAgIExPQ0FMX0NGTEFHUyAgICAgOj0gLURIMjY0REVDX05FT04gLURIMjY0REVDX09NWERMCkBAIC05NCw2ICs5NCw3IEBACiAgICAgTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vYXBpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi92Yy9hcGkgXAogICAgICAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaQorICBlbmRpZgogZW5kaWYKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKaW5kZXggN2RkYjEzYy4uMTY4MjA4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcApAQCAtNTgsNyArNTgsNiBAQAogICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtSGFuZGxlKE5VTEwpLAogICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCi0gICAgICBtUGljdHVyZVNpemUobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKSwKICAgICAgIG1GaXJzdFBpY3R1cmUoTlVMTCksCiAgICAgICBtRmlyc3RQaWN0dXJlSWQoLTEpLAogICAgICAgbVBpY0lkKDApLApAQCAtOTgsNyArOTcsNyBAQAogICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogfQogCi12b2lkIFNvZnRBVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMTgsNyArMTE3LDcgQEAKICAgICB9CiAKICAgICBIMjY0U3dEZWNSZXQgcmV0ID0gSDI2NFNXREVDX1BJQ19SRFk7Ci0gICAgYm9vbCBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gZmFsc2U7CisgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CiAgICAgd2hpbGUgKChtRU9TU3RhdHVzICE9IElOUFVUX0RBVEFfQVZBSUxBQkxFIHx8ICFpblF1ZXVlLmVtcHR5KCkpCiAgICAgICAgICAgICAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKIApAQCAtMTYxLDE3ICsxNjAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyBkZWNvZGVySW5mbzsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSDI2NFN3RGVjR2V0SW5mbyhtSGFuZGxlLCAmZGVjb2RlckluZm8pID09IEgyNjRTV0RFQ19PSyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoJmRlY29kZXJJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckluZm8uY3JvcHBpbmdGbGFnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDcm9wUmVjdEV2ZW50KCZkZWNvZGVySW5mby5jcm9wUGFyYW1zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Q3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNyb3BQYXJhbXMoZGVjb2RlckluZm8pOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRXaWxsUmVzZXQsIGRlY29kZXJJbmZvLnBpY1dpZHRoLCBkZWNvZGVySW5mby5waWNIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcFNldHRpbmdzTW9kZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgewogCkBAIC0xOTksOCArMTk1LDcgQEAKICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAKLSAgICAgICAgaWYgKHBvcnRTZXR0aW5nc0NoYW5nZWQpIHsKLSAgICAgICAgICAgIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMTUsNDQgKzIxMCwzNCBAQAogICAgIH0KIH0KIAotYm9vbCBTb2Z0QVZDOjpoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KGNvbnN0IEgyNjRTd0RlY0luZm8gKmluZm8pIHsKLSAgICBpZiAobVdpZHRoICE9IGluZm8tPnBpY1dpZHRoIHx8IG1IZWlnaHQgIT0gaW5mby0+cGljSGVpZ2h0KSB7Ci0gICAgICAgIG1XaWR0aCAgPSBpbmZvLT5waWNXaWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGluZm8tPnBpY0hlaWdodDsKLSAgICAgICAgbVBpY3R1cmVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOwotICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgIHJldHVybiB0cnVlOworU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Q3JvcFNldHRpbmdzTW9kZSBTb2Z0QVZDOjpoYW5kbGVDcm9wUGFyYW1zKAorICAgICAgICBjb25zdCBIMjY0U3dEZWNJbmZvJiBkZWNJbmZvKSB7CisgICAgaWYgKCFkZWNJbmZvLmNyb3BwaW5nRmxhZykgeworICAgICAgICByZXR1cm4ga0Nyb3BVblNldDsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgU29mdEFWQzo6aGFuZGxlQ3JvcFJlY3RFdmVudChjb25zdCBDcm9wUGFyYW1zICpjcm9wKSB7Ci0gICAgaWYgKG1Dcm9wTGVmdCAhPSBjcm9wLT5jcm9wTGVmdE9mZnNldCB8fAotICAgICAgICBtQ3JvcFRvcCAhPSBjcm9wLT5jcm9wVG9wT2Zmc2V0IHx8Ci0gICAgICAgIG1Dcm9wV2lkdGggIT0gY3JvcC0+Y3JvcE91dFdpZHRoIHx8Ci0gICAgICAgIG1Dcm9wSGVpZ2h0ICE9IGNyb3AtPmNyb3BPdXRIZWlnaHQpIHsKLSAgICAgICAgbUNyb3BMZWZ0ID0gY3JvcC0+Y3JvcExlZnRPZmZzZXQ7Ci0gICAgICAgIG1Dcm9wVG9wID0gY3JvcC0+Y3JvcFRvcE9mZnNldDsKLSAgICAgICAgbUNyb3BXaWR0aCA9IGNyb3AtPmNyb3BPdXRXaWR0aDsKLSAgICAgICAgbUNyb3BIZWlnaHQgPSBjcm9wLT5jcm9wT3V0SGVpZ2h0OwotCi0gICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLAotICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsIE5VTEwpOwotCi0gICAgICAgIHJldHVybiB0cnVlOworICAgIGNvbnN0IENyb3BQYXJhbXMmIGNyb3AgPSBkZWNJbmZvLmNyb3BQYXJhbXM7CisgICAgaWYgKG1Dcm9wTGVmdCA9PSBjcm9wLmNyb3BMZWZ0T2Zmc2V0ICYmCisgICAgICAgIG1Dcm9wVG9wID09IGNyb3AuY3JvcFRvcE9mZnNldCAmJgorICAgICAgICBtQ3JvcFdpZHRoID09IGNyb3AuY3JvcE91dFdpZHRoICYmCisgICAgICAgIG1Dcm9wSGVpZ2h0ID09IGNyb3AuY3JvcE91dEhlaWdodCkgeworICAgICAgICByZXR1cm4ga0Nyb3BTZXQ7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKworICAgIG1Dcm9wTGVmdCA9IGNyb3AuY3JvcExlZnRPZmZzZXQ7CisgICAgbUNyb3BUb3AgPSBjcm9wLmNyb3BUb3BPZmZzZXQ7CisgICAgbUNyb3BXaWR0aCA9IGNyb3AuY3JvcE91dFdpZHRoOworICAgIG1Dcm9wSGVpZ2h0ID0gY3JvcC5jcm9wT3V0SGVpZ2h0OworICAgIHJldHVybiBrQ3JvcENoYW5nZWQ7CiB9CiAKIHZvaWQgU29mdEFWQzo6c2F2ZUZpcnN0T3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QgKmRhdGEpIHsKICAgICBDSEVDSyhtRmlyc3RQaWN0dXJlID09IE5VTEwpOwogICAgIG1GaXJzdFBpY3R1cmVJZCA9IHBpY0lkOwogCi0gICAgbUZpcnN0UGljdHVyZSA9IG5ldyB1aW50OF90W21QaWN0dXJlU2l6ZV07Ci0gICAgbWVtY3B5KG1GaXJzdFBpY3R1cmUsIGRhdGEsIG1QaWN0dXJlU2l6ZSk7CisgICAgdWludDMyX3QgcGljdHVyZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgbUZpcnN0UGljdHVyZSA9IG5ldyB1aW50OF90W3BpY3R1cmVTaXplXTsKKyAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgcGljdHVyZVNpemUpOwogfQogCiB2b2lkIFNvZnRBVkM6OmRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QqIGRhdGEpIHsKQEAgLTI2Myw5ICsyNDgsMTcgQEAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLnZhbHVlRm9yKHBpY0lkKTsKICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7CiAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBoZWFkZXItPm5GbGFnczsKLSAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtUGljdHVyZVNpemU7Ci0gICAgbWVtY3B5KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgIGRhdGEsIG1QaWN0dXJlU2l6ZSk7CisgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOworCisgICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSBzcmNZICsgbVdpZHRoICogbUhlaWdodDsKKyAgICBjb25zdCB1aW50OF90ICpzcmNWID0gc3JjVSArIG1XaWR0aCAqIG1IZWlnaHQgLyA0OworICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbVdpZHRoOworICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbVdpZHRoIC8gMjsKKyAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IHNyY1VTdHJpZGU7CisgICAgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSk7CisKICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbShwaWNJZCk7CiAgICAgZGVsZXRlIGhlYWRlcjsKICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaAppbmRleCBlZTY5OTI2Li4wNjkxMDdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKQEAgLTU1LDggKzU1LDYgQEAKIAogICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKIAotICAgIHVpbnQzMl90IG1QaWN0dXJlU2l6ZTsKLQogICAgIHVpbnQ4X3QgKm1GaXJzdFBpY3R1cmU7CiAgICAgaW50MzJfdCBtRmlyc3RQaWN0dXJlSWQ7CiAKQEAgLTc1LDggKzczLDcgQEAKICAgICB2b2lkIGRyYWluQWxsT3V0cHV0QnVmZmVycyhib29sIGVvcyk7CiAgICAgdm9pZCBkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKTsKICAgICB2b2lkIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpZElkLCB1aW50OF90ICpkYXRhKTsKLSAgICBib29sIGhhbmRsZUNyb3BSZWN0RXZlbnQoY29uc3QgQ3JvcFBhcmFtcyogY3JvcCk7Ci0gICAgYm9vbCBoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KGNvbnN0IEgyNjRTd0RlY0luZm8gKmluZm8pOworICAgIENyb3BTZXR0aW5nc01vZGUgaGFuZGxlQ3JvcFBhcmFtcyhjb25zdCBIMjY0U3dEZWNJbmZvJiBkZWNJbmZvKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBVkMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaAppbmRleCA4YjI5NWE2Li45MTJjYjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oCkBAIC0zMiw2ICszMiw3IEBACiAjZGVmaW5lIF9PTVhUWVBFU19IXwogCiAjaW5jbHVkZSA8bGltaXRzLmg+IAorI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjZGVmaW5lIE9NWF9JTgogI2RlZmluZSBPTVhfT1VUCkBAIC03NSw2NCArNzYsMjIgQEAKIAogIAogLyogT01YX1U4ICovCi0jaWYgVUNIQVJfTUFYID09IDB4ZmYKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7Ci0jZWxpZiBVU0hSVF9NQVggPT0gMHhmZiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VODsgCi0jZWxzZQotI2Vycm9yIE9NWF9VOCB1bmRlZmluZWQKLSNlbmRpZiAKLQordHlwZWRlZiB1aW50OF90IE9NWF9VODsKICAKIC8qIE9NWF9TOCAqLwotI2lmIFNDSEFSX01BWCA9PSAweDdmIAotdHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7Ci0jZWxpZiBTSFJUX01BWCA9PSAweDdmIAotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TODsgCi0jZWxzZQotI2Vycm9yIE9NWF9TOCB1bmRlZmluZWQKLSNlbmRpZgotIAordHlwZWRlZiBpbnQ4X3QgT01YX1M4OwogIAogLyogT01YX1UxNiAqLwotI2lmIFVTSFJUX01BWCA9PSAweGZmZmYKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VMTY7Ci0jZWxpZiBVSU5UX01BWCA9PSAweGZmZmYKLXR5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMTY7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTE2IHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKIAogLyogT01YX1MxNiAqLwotI2lmIFNIUlRfTUFYID09IDB4N2ZmZiAKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzE2OwotI2VsaWYgSU5UX01BWCA9PSAweDdmZmYgCi10eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MxNjsgCi0jZWxzZQotI2Vycm9yIE9NWF9TMTYgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7CiAKIC8qIE9NWF9VMzIgKi8KLSNpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOwotI2VsaWYgTE9OR19NQVggPT0gMHhmZmZmZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBPTVhfVTMyOyAKLSNlbHNlCi0jZXJyb3IgT01YX1UzMiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIHVpbnQzMl90IE9NWF9VMzI7CiAKIC8qIE9NWF9TMzIgKi8KLSNpZiBJTlRfTUFYID09IDB4N2ZmZmZmZmYKLXR5cGVkZWYgc2lnbmVkIGludCBPTVhfUzMyOwotI2VsaWYgTE9OR19NQVggPT0gMHg3ZmZmZmZmZgotdHlwZWRlZiBsb25nIHNpZ25lZCBpbnQgT01YX1MzMjsgCi0jZWxzZQotI2Vycm9yIE9NWF9TMzIgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7CiAKIC8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCiAjaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCkBAIC0xNDMsMTUgKzEwMiwxNCBAQAogICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQogICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQogI2Vsc2UKLSAgICB0eXBlZGVmIGxvbmcgbG9uZyBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiBpbnQ2NF90IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVpbnQ2NF90IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwogICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCiAgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKICAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQogICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCiAjZW5kaWYKIAotCiAvKiBPTVhfU0M4ICovCiB0eXBlZGVmIHN0cnVjdAogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCmluZGV4IDhiMjk1YTYuLjkxMmNiMGQgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgX09NWFRZUEVTX0hfCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4gCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNkZWZpbmUgT01YX0lOCiAjZGVmaW5lIE9NWF9PVVQKQEAgLTc1LDY0ICs3NiwyMiBAQAogCiAgCiAvKiBPTVhfVTggKi8KLSNpZiBVQ0hBUl9NQVggPT0gMHhmZgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKLSNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1U4IHVuZGVmaW5lZAotI2VuZGlmIAotCit0eXBlZGVmIHVpbnQ4X3QgT01YX1U4OwogIAogLyogT01YX1M4ICovCi0jaWYgU0NIQVJfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKLSNlbGlmIFNIUlRfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1M4IHVuZGVmaW5lZAotI2VuZGlmCi0gCit0eXBlZGVmIGludDhfdCBPTVhfUzg7CiAgCiAvKiBPTVhfVTE2ICovCi0jaWYgVVNIUlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKLSNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MTZfdCBPTVhfVTE2OwogCiAvKiBPTVhfUzE2ICovCi0jaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7Ci0jZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKLXR5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDE2X3QgT01YX1MxNjsKIAogLyogT01YX1UzMiAqLwotI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKIAogLyogT01YX1MzMiAqLwotI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKLSNlbHNlCi0jZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDMyX3QgT01YX1MzMjsKIAogLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KICNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKQEAgLTE0MywxNSArMTAyLDE0IEBACiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCiAjZWxzZQotICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIGludDY0X3QgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdWludDY0X3QgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCiAgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKICAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKICNlbmRpZgogCi0KIC8qIE9NWF9TQzggKi8KIHR5cGVkZWYgc3RydWN0CiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKaW5kZXggMDczZGJiYS4uYmNjNmI2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwpAQCAtMTAsNiArMTAsMjIgQEAKICAgICAuZnB1IG5lb24KICAgICAudGV4dAogCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAorICAgIC5leHRlcm4gICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcworICAgIC5leHRlcm4gICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfWmlnWmFnXzR4NAorCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAorICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcworICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfWmlnWmFnXzR4NAorCiAgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcgogICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIKIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKaW5kZXggNDRlYjQyOC4uNWJjNzg3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCkBAIC0yMCw2ICsyMCwxNCBAQAogICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCiAgICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKIAorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeAorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKwogYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQ6CiAgICAgLmJ5dGUgIDAsIDIsIDAsIDIKICAgICAuYnl0ZSAgMiwgMSwgMiwgMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKaW5kZXggOGIyOTVhNi4uOTEyY2IwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oCkBAIC0zMiw2ICszMiw3IEBACiAjZGVmaW5lIF9PTVhUWVBFU19IXwogCiAjaW5jbHVkZSA8bGltaXRzLmg+IAorI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjZGVmaW5lIE9NWF9JTgogI2RlZmluZSBPTVhfT1VUCkBAIC03NSw2NCArNzYsMjIgQEAKIAogIAogLyogT01YX1U4ICovCi0jaWYgVUNIQVJfTUFYID09IDB4ZmYKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7Ci0jZWxpZiBVU0hSVF9NQVggPT0gMHhmZiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VODsgCi0jZWxzZQotI2Vycm9yIE9NWF9VOCB1bmRlZmluZWQKLSNlbmRpZiAKLQordHlwZWRlZiB1aW50OF90IE9NWF9VODsKICAKIC8qIE9NWF9TOCAqLwotI2lmIFNDSEFSX01BWCA9PSAweDdmIAotdHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7Ci0jZWxpZiBTSFJUX01BWCA9PSAweDdmIAotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TODsgCi0jZWxzZQotI2Vycm9yIE9NWF9TOCB1bmRlZmluZWQKLSNlbmRpZgotIAordHlwZWRlZiBpbnQ4X3QgT01YX1M4OwogIAogLyogT01YX1UxNiAqLwotI2lmIFVTSFJUX01BWCA9PSAweGZmZmYKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VMTY7Ci0jZWxpZiBVSU5UX01BWCA9PSAweGZmZmYKLXR5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMTY7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTE2IHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKIAogLyogT01YX1MxNiAqLwotI2lmIFNIUlRfTUFYID09IDB4N2ZmZiAKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzE2OwotI2VsaWYgSU5UX01BWCA9PSAweDdmZmYgCi10eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MxNjsgCi0jZWxzZQotI2Vycm9yIE9NWF9TMTYgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7CiAKIC8qIE9NWF9VMzIgKi8KLSNpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOwotI2VsaWYgTE9OR19NQVggPT0gMHhmZmZmZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBPTVhfVTMyOyAKLSNlbHNlCi0jZXJyb3IgT01YX1UzMiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIHVpbnQzMl90IE9NWF9VMzI7CiAKIC8qIE9NWF9TMzIgKi8KLSNpZiBJTlRfTUFYID09IDB4N2ZmZmZmZmYKLXR5cGVkZWYgc2lnbmVkIGludCBPTVhfUzMyOwotI2VsaWYgTE9OR19NQVggPT0gMHg3ZmZmZmZmZgotdHlwZWRlZiBsb25nIHNpZ25lZCBpbnQgT01YX1MzMjsgCi0jZWxzZQotI2Vycm9yIE9NWF9TMzIgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7CiAKIC8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCiAjaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCkBAIC0xNDMsMTUgKzEwMiwxNCBAQAogICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQogICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQogI2Vsc2UKLSAgICB0eXBlZGVmIGxvbmcgbG9uZyBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiBpbnQ2NF90IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVpbnQ2NF90IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwogICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCiAgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKICAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQogICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCiAjZW5kaWYKIAotCiAvKiBPTVhfU0M4ICovCiB0eXBlZGVmIHN0cnVjdAogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKaW5kZXggMmJiNGM0ZC4uNTI0YTNmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCkBAIC00Miw2ICs0Miw4IEBACiAjaW5jbHVkZSAiaDI2NGJzZF9kZWNvZGVyLmgiCiAjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIFZlcnNpb24gSW5mb3JtYXRpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC03Myw2ICs3NSw3IEBACiAjZW5kaWYKIAogdm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpIHsKKyAgICBVTlVTRUQoc3RyaW5nKTsKIH0KIAogdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYwppbmRleCA0OTNmYjllLi43YTI2MmVkIDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgIGkzMiBmaXJzdFBoYXNlWzE2XTsKICAgICBpMzIgKnBUbXA7CiAgICAgLyogbmVpZ2hib3VycyBhYm92ZSwgYmVsb3csIGxlZnQgYW5kIHJpZ2h0ICovCi0gICAgaTMyIGFbNF0sIGJbNF0sIGxbNF0sIHJbNF07CisgICAgaTMyIGFbNF0gPSB7IDAsMCwwLDAgfSwgYls0XSwgbFs0XSA9IHsgMCwwLDAsMCB9LCByWzRdOwogICAgIHUzMiBBLCBCLCBMLCBSOwogI2lmZGVmIEgyNjRERUNfT01YREwKICAgICB1OCBmaWxsQnVmZlszMioyMSArIDE1ICsgMzJdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKaW5kZXggMTVlYWJmYi4uNTJjODVlNSAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCkBAIC0xMTEwLDcgKzExMTAsNyBAQAogCiAvKiBWYXJpYWJsZXMgKi8KIAotICAgIHUzMiBpLCBqOworICAgIGkzMiBpLCBqOwogICAgIGkzMiBhLCBiLCBjOwogICAgIGkzMiB0bXA7CiAKQEAgLTExMjMsMjAgKzExMjMsMjAgQEAKICAgICBhID0gMTYgKiAoYWJvdmVbMTVdICsgbGVmdFsxNV0pOwogCiAgICAgZm9yIChpID0gMCwgYiA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIGIgKz0gKChpMzIpaSArIDEpICogKGFib3ZlWzgraV0gLSBhYm92ZVs2LWldKTsKKyAgICAgICAgYiArPSAoaSArIDEpICogKGFib3ZlWzgraV0gLSBhYm92ZVs2LWldKTsKICAgICBiID0gKDUgKiBiICsgMzIpID4+IDY7CiAKICAgICBmb3IgKGkgPSAwLCBjID0gMDsgaSA8IDc7IGkrKykKLSAgICAgICAgYyArPSAoKGkzMilpICsgMSkgKiAobGVmdFs4K2ldIC0gbGVmdFs2LWldKTsKKyAgICAgICAgYyArPSAoaSArIDEpICogKGxlZnRbOCtpXSAtIGxlZnRbNi1pXSk7CiAgICAgLyogcFstMSwtMV0gaGFzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYWJvdmUgcG9pbnRlciAqLwotICAgIGMgKz0gKChpMzIpaSArIDEpICogKGxlZnRbOCtpXSAtIGFib3ZlWy0xXSk7CisgICAgYyArPSAoaSArIDEpICogKGxlZnRbOCtpXSAtIGFib3ZlWy0xXSk7CiAgICAgYyA9ICg1ICogYyArIDMyKSA+PiA2OwogCiAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAgICAgewogICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKICAgICAgICAgewotICAgICAgICAgICAgdG1wID0gKGEgKyBiICogKChpMzIpaiAtIDcpICsgYyAqICgoaTMyKWkgLSA3KSArIDE2KSA+PiA1OworICAgICAgICAgICAgdG1wID0gKGEgKyBiICogKGogLSA3KSArIGMgKiAoaSAtIDcpICsgMTYpID4+IDU7CiAgICAgICAgICAgICBkYXRhW2kqMTYral0gPSAodTgpQ0xJUDEodG1wKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKaW5kZXggYzk0ODc3Ni4uYjQwOWEwNiAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJhcm1WQy5oIgogI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMTM2LDcgKzIxMzgsOCBAQAogICBpMzIgY2VudGVyLAogICBpMzIgcmlnaHQpCiB7Ci0KKyAgICBVTlVTRUQobGVmdCk7CisgICAgVU5VU0VEKHJpZ2h0KTsKICAgICBBU1NFUlQocmVmKTsKICAgICBBU1NFUlQoZmlsbCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYwppbmRleCBhN2M2ZjY0Li4yMzQwMWM2IDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCkBAIC00Nyw2ICs0Nyw4IEBACiAjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgogI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQwNyw2ICsxNDA5LDcgQEAKICAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKICAgICBpMzIgaXZhbHVlOwogICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisgICAgVU5VU0VEKG5hbFVuaXRUeXBlKTsKIAogLyogQ29kZSAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYwppbmRleCBjYzgzOGZkLi5mYjk3YTI4IDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKIAogICAgIGlmICggKGJpdHMgPiA4KSB8fAotICAgICAgICAgKChoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpPj4oMzItYml0cykpICE9ICgxIDw8IChiaXRzLTEpKSkgKQorICAgICAgICAgKChoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpPj4oMzItYml0cykpICE9ICgxdWwgPDwgKGJpdHMtMSkpKSApCiAgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CiAgICAgZWxzZQogICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oCmluZGV4IGNiM2FkZGEuLjIxNmFkMDQgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaApAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgImJhc2V0eXBlLmgiCiAjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKICNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCkBAIC0xNTAsNyArMTUxLDcgQEAKIH0KIAogI2RlZmluZSBBTElHTihwdHIsIGJ5dGVQb3MpIFwKLSAgICAgICAgKHB0ciArICggKChieXRlUG9zIC0gKGludClwdHIpICYgKGJ5dGVQb3MgLSAxKSkgLyBzaXplb2YoKnB0cikgKSkKKyAgICAgICAgKHB0ciArICggKChieXRlUG9zIC0gKHVpbnRwdHJfdClwdHIpICYgKGJ5dGVQb3MgLSAxKSkgLyBzaXplb2YoKnB0cikgKSkKIAogZXh0ZXJuIGNvbnN0IHUzMiBoMjY0YnNkUXBDWzUyXTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1YjE3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc5YzVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxOSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgU29mdE9wdXMuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICBleHRlcm5hbC9saWJvcHVzL2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlib3B1cyBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZworCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9vcHVzZGVjCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1MmEzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTAsMCArMSw1NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRPcHVzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU29mdE9wdXMuaCIKKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlIDxvcHVzLmg+CisgICAgI2luY2x1ZGUgPG9wdXNfbXVsdGlzdHJlYW0uaD4KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50IGtSYXRlID0gNDgwMDA7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHMgPSA4OworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKworU29mdE9wdXM6OlNvZnRPcHVzKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbURlY29kZXIoTlVMTCksCisgICAgICBtSGVhZGVyKE5VTEwpLAorICAgICAgbUNvZGVjRGVsYXkoMCksCisgICAgICBtU2Vla1ByZVJvbGwoMCksCisgICAgICBtQW5jaG9yVGltZVVzKDApLAorICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKKyAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgeworICAgIGluaXRQb3J0cygpOworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK1NvZnRPcHVzOjp+U29mdE9wdXMoKSB7CisgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IE5VTEw7CisgICAgfQorICAgIGlmIChtSGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1IZWFkZXI7CisgICAgICAgIG1IZWFkZXIgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBTb2Z0T3B1czo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDk2MCAqIDY7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPQorICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0KKyAgICAgICAgKE9NWF9BVURJT19DT0RJTkdUWVBFKU9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUzsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyICogc2l6ZW9mKGludDE2X3QpICoga01heENoYW5uZWxzOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgIGFkZFBvcnQoZGVmKTsKK30KKworc3RhdHVzX3QgU29mdE9wdXM6OmluaXREZWNvZGVyKCkgeworICAgIHJldHVybiBPSzsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T3B1czo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkF1ZGlvQmFuZFdpZHRoID0gMDsKKyAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5TYW1wbGVSYXRlID0ga1JhdGU7CisgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQml0UmF0ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOworICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0ga1JhdGU7CisKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gbUhlYWRlci0+Y2hhbm5lbHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9wdXM6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoKGludClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworYm9vbCBTb2Z0T3B1czo6aXNDb25maWd1cmVkKCkgY29uc3QgeworICAgIHJldHVybiBtSW5wdXRCdWZmZXJDb3VudCA+PSAxOworfQorCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWFkX29mZnNldCkgeworICAgIGlmIChyZWFkX29mZnNldCArIDEgPiBkYXRhX3NpemUpCisgICAgICAgIHJldHVybiAwOworICAgIHVpbnQxNl90IHZhbDsKKyAgICB2YWwgPSBkYXRhW3JlYWRfb2Zmc2V0XTsKKyAgICB2YWwgfD0gZGF0YVtyZWFkX29mZnNldCArIDFdIDw8IDg7CisgICAgcmV0dXJuIHZhbDsKK30KKworLy8gTWF4aW11bSBwYWNrZXQgc2l6ZSB1c2VkIGluIFhpcGgncyBvcHVzZGVjLgorc3RhdGljIGNvbnN0IGludCBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzID0gOTYwICogNjsKKworLy8gRGVmYXVsdCBhdWRpbyBvdXRwdXQgY2hhbm5lbCBsYXlvdXQuIFVzZWQgdG8gaW5pdGlhbGl6ZSB8c3RyZWFtX21hcHwgaW4KKy8vIE9wdXNIZWFkZXIsIGFuZCBwYXNzZWQgdG8gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSgpIHdoZW4gdGhlIGhlYWRlcgorLy8gZG9lcyBub3QgY29udGFpbiBtYXBwaW5nIGluZm9ybWF0aW9uLiBUaGUgdmFsdWVzIGFyZSB2YWxpZCBvbmx5IGZvciBtb25vIGFuZAorLy8gc3RlcmVvIG91dHB1dDogT3B1cyBzdHJlYW1zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgcmVxdWlyZSBhIHN0cmVhbSBtYXAuCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0ID0gMjsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXRba01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXRdID0geyAwLCAxIH07CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitzdGF0aWMgYm9vbCBQYXJzZU9wdXNIZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICAvLyBTaXplIG9mIHRoZSBPcHVzIGhlYWRlciBleGNsdWRpbmcgb3B0aW9uYWwgbWFwcGluZyBpbmZvcm1hdGlvbi4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKworICAgIC8vIE9mZnNldCB0byB0aGUgZ2FpbiB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyR2Fpbk9mZnNldCA9IDE2OworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBjaGFubmVsIG1hcHBpbmcgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgPSAxODsKKworICAgIC8vIE9wdXMgSGVhZGVyIGNvbnRhaW5zIGEgc3RyZWFtIG1hcC4gVGhlIG1hcHBpbmcgdmFsdWVzIGFyZSBpbiB0aGUgaGVhZGVyCisgICAgLy8gYmV5b25kIHRoZSBhbHdheXMgcHJlc2VudCB8a09wdXNIZWFkZXJTaXplfCBieXRlcyBvZiBkYXRhLiBUaGUgbWFwcGluZworICAgIC8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKyAgICAvLyB2YWx1ZXM6CisgICAgLy8gICAtIEJ5dGUgMDogTnVtYmVyIG9mIHN0cmVhbXMuCisgICAgLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisgICAgLy8gICAtIEJ5dGUgMjogU3RhcnRpbmcgYXQgYnl0ZSAyIGFyZSB8aGVhZGVyLT5jaGFubmVsc3wgdWludDggbWFwcGluZworICAgIC8vICAgICAgICAgICAgIHZhbHVlcy4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0ga09wdXNIZWFkZXJTaXplOworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRPZmZzZXQgPSBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgKyAxOworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCArIDI7CisKKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dWKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9ICooZGF0YSArIGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQpOworCisgICAgaWYgKGhlYWRlci0+Y2hhbm5lbHMgPD0gMCB8fCBoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgd3JvbmcgY2hhbm5lbCBjb3VudDogJWQiLCBoZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPnNraXBfc2FtcGxlcyA9IFJlYWRMRTE2KGRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRMRTE2KGRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gKihkYXRhICsga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCk7CisgICAgaWYgKCFoZWFkZXItPmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIG1pc3Npbmcgc3RyZWFtIG1hcC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXItPm51bV9zdHJlYW1zID0gMTsKKyAgICAgICAgaGVhZGVyLT5udW1fY291cGxlZCA9IGhlYWRlci0+Y2hhbm5lbHMgPiAxOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMF0gPSAwOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMV0gPSAxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBzdHJlYW0gbWFwOyBpbnN1ZmZpY2llbnQgZGF0YSBmb3IgY3VycmVudCBjaGFubmVsICIKKyAgICAgICAgICAgICAgImNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAqKGRhdGEgKyBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQpOworICAgIGhlYWRlci0+bnVtX2NvdXBsZWQgPSAqKGRhdGEgKyBrT3B1c0hlYWRlck51bUNvdXBsZWRPZmZzZXQpOworICAgIGlmIChoZWFkZXItPm51bV9zdHJlYW1zICsgaGVhZGVyLT5udW1fY291cGxlZCAhPSBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbmNvbnNpc3RlbnQgY2hhbm5lbCBtYXBwaW5nLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLT5jaGFubmVsczsgKytpKQorICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gKihkYXRhICsga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVydCBuYW5vc2Vjb25kcyB0byBudW1iZXIgb2Ygc2FtcGxlcy4KK3N0YXRpYyB1aW50NjRfdCBuc190b19zYW1wbGVzKHVpbnQ2NF90IG5zLCBpbnQga1JhdGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihucykgKiBrUmF0ZSAvIDEwMDAwMDAwMDA7Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5wdXRCdWZmZXJDb3VudCA8IDMpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBoZWFkZXItPnBCdWZmZXIgKyBoZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplID0gaGVhZGVyLT5uRmlsbGVkTGVuOworCisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBDSEVDSyhtSGVhZGVyID09IE5VTEwpOworICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7CisgICAgICAgICAgICBtZW1zZXQobUhlYWRlciwgMCwgc2l6ZW9mKCptSGVhZGVyKSk7CisgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcihkYXRhLCBzaXplLCBtSGVhZGVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJzaW5nIE9wdXMgSGVhZGVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwcGluZ1trTWF4Q2hhbm5lbHNdID0gezB9OworICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCk7CisKKyAgICAgICAgICAgIGludCBzdGF0dXMgPSBPUFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX3N0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX2NvdXBsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICAgICAgICAgICAgaWYgKCFtRGVjb2RlciB8fCBzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlIGZhaWxlZCBzdGF0dXM9JXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVVNfU0VUX0dBSU4obUhlYWRlci0+Z2Fpbl9kYikpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkZhaWxlZCB0byBzZXQgT1BVUyBoZWFkZXIgZ2Fpbjsgc3RhdHVzPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgbUNvZGVjRGVsYXkgPSBuc190b19zYW1wbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPihoZWFkZXItPnBCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPm5PZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBuc190b19zYW1wbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaGVhZGVyLT5wQnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+bk9mZnNldCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaGVhZGVyKTsKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiBzZWVraW5nIHRvIHplcm8sIHxtQ29kZWNEZWxheXwgc2FtcGxlcyBoYXMgdG8gYmUgZGlzY2FyZGVkCisgICAgICAgIC8vIGluc3RlYWQgb2YgfG1TZWVrUHJlUm9sbHwgc2FtcGxlcyAoYXMgd2Ugd291bGQgd2hlbiBzZWVraW5nIHRvIGFueQorICAgICAgICAvLyBvdGhlciB0aW1lc3RhbXApLgorICAgICAgICBpZiAoaW5IZWFkZXItPm5UaW1lU3RhbXAgPT0gMCkgeworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgaW50IG51bUZyYW1lcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKW91dEhlYWRlci0+cEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKG51bUZyYW1lcyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZSByZXR1cm5lZCAlZCIsIG51bUZyYW1lcyk7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBpZiAobVNhbXBsZXNUb0Rpc2NhcmQgPiAwKSB7CisgICAgICAgICAgICBpZiAobVNhbXBsZXNUb0Rpc2NhcmQgPiBudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCAtPSBudW1GcmFtZXM7CisgICAgICAgICAgICAgICAgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC09IG1TYW1wbGVzVG9EaXNjYXJkOworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IG1TYW1wbGVzVG9EaXNjYXJkICogc2l6ZW9mKGludDE2X3QpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBudW1GcmFtZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1BbmNob3JUaW1lVXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBsbCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZTsKKworICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG51bUZyYW1lczsKKworICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgbUFuY2hvclRpbWVVcyA9IDA7CisgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbVNlZWtQcmVSb2xsOworICAgIH0KK30KKwordm9pZCBTb2Z0T3B1czo6b25SZXNldCgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IE5VTEw7CisgICAgfQorICAgIGlmIChtSGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1IZWFkZXI7CisgICAgICAgIG1IZWFkZXIgPSBOVUxMOworICAgIH0KKworICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworfQorCit2b2lkIFNvZnRPcHVzOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgIGlmIChwb3J0SW5kZXggIT0gMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVdBSVRJTkdfRElTQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKCFlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UsIChpbnQpQVdBSVRJTkdfRU5BQkxFRCk7CisgICAgICAgICAgICBDSEVDSyhlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdE9wdXMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y2NTYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGUgT3B1cyBzcGVjaWZpY2F0aW9uIGlzIHBhcnQgb2YgSUVURiBSRkMgNjcxNjoKKyAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY3MTYKKyAqLworCisjaWZuZGVmIFNPRlRfT1BVU19IXworCisjZGVmaW5lIFNPRlRfT1BVU19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCitzdHJ1Y3QgT3B1c01TRGVjb2RlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT3B1c0hlYWRlciB7CisgIGludCBjaGFubmVsczsKKyAgaW50IHNraXBfc2FtcGxlczsKKyAgaW50IGNoYW5uZWxfbWFwcGluZzsKKyAgaW50IG51bV9zdHJlYW1zOworICBpbnQgbnVtX2NvdXBsZWQ7CisgIGludDE2X3QgZ2Fpbl9kYjsKKyAgdWludDhfdCBzdHJlYW1fbWFwWzhdOworfTsKKworc3RydWN0IFNvZnRPcHVzIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRPcHVzKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0T3B1cygpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtQnVmZmVycyA9IDQsCisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyID0gOTYwICogNgorICAgIH07CisKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKKyAgICBPcHVzSGVhZGVyICptSGVhZGVyOworCisgICAgaW50NjRfdCBtQ29kZWNEZWxheTsKKyAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbDsKKyAgICBpbnQ2NF90IG1TYW1wbGVzVG9EaXNjYXJkOworICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRPcHVzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9PUFVTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQubWsKaW5kZXggZmU5MGEwMy4uODcwODBlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5tawpAQCAtOCw2ICs4LDggQEAKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKICAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKaW5kZXggMTlkNmYxMy4uOWQ1MTRhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdFJhdzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0UmF3OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKaW5kZXggMjIzMjM1My4uMjE3YTZkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCkBAIC0xNiw0ICsxNiw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF92b3JiaXNkZWMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggYzFjNWU2NC4uYzU1OTY4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTU0LDYgKzU0LDggQEAKICAgICAgIG1BbmNob3JUaW1lVXMoMCksCiAgICAgICBtTnVtRnJhbWVzT3V0cHV0KDApLAogICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UoLTEpLAorICAgICAgbVNhd0lucHV0RW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MoZmFsc2UpLAogICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CiAgICAgaW5pdFBvcnRzKCk7CiAgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKQEAgLTI5MCw0OCArMjkyLDQ3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IChtU2F3SW5wdXRFb3MgJiYgIW1TaWduYWxsZWRPdXRwdXRFb3MpKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSBOVUxMOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBOVUxMOworICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICB9CiAKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzID0gMDsKIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgbVNhd0lucHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIHx8ICFtU2F3SW5wdXRFb3MpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19HRShpbkhlYWRlci0+bkZpbGxlZExlbiwgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZudW1QYWdlU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgaW5IZWFkZXItPm5PZmZzZXQgKyBpbkhlYWRlci0+bkZpbGxlZExlbiAtIDQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworCisgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBzaXplb2YobnVtUGFnZVNhbXBsZXMpOzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7Ci0gICAgICAgIENIRUNLX0dFKGluSGVhZGVyLT5uRmlsbGVkTGVuLCBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKLSAgICAgICAgbWVtY3B5KCZudW1QYWdlU2FtcGxlcywKLSAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyCi0gICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKLSAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwotCiAgICAgICAgIGlmIChudW1QYWdlU2FtcGxlcyA+PSAwKSB7CiAgICAgICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VTYW1wbGVzOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLSAgICAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKTs7Ci0KICAgICAgICAgb2dnX2J1ZmZlciBidWY7Ci0gICAgICAgIGJ1Zi5kYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgYnVmLnNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgYnVmLmRhdGEgPSBpbkhlYWRlciA/IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQgOiBOVUxMOworICAgICAgICBidWYuc2l6ZSA9IGluSGVhZGVyID8gaW5IZWFkZXItPm5GaWxsZWRMZW4gOiAwOwogICAgICAgICBidWYucmVmY291bnQgPSAxOwogICAgICAgICBidWYucHRyLm93bmVyID0gTlVMTDsKIApAQCAtMzUxLDkgKzM1MiwxNSBAQAogCiAgICAgICAgIGludCBudW1GcmFtZXMgPSAwOwogCisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKICAgICAgICAgaW50IGVyciA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOwogICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBsb2cgc3BhbQorI2lmICFkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fYWFyY2g2NF9fKQorICAgICAgICAgICAgQUxPR1YoInZvcmJpc19kc3Bfc3ludGhlc2lzIHJldHVybmVkICVkIiwgZXJyKTsKKyNlbHNlCiAgICAgICAgICAgICBBTE9HVygidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQiLCBlcnIpOworI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSB2b3JiaXNfZHNwX3BjbW91dCgKICAgICAgICAgICAgICAgICAgICAgbVN0YXRlLCAoaW50MTZfdCAqKW91dEhlYWRlci0+cEJ1ZmZlciwKQEAgLTM3MCwxMyArMzc3LDE2IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoImRpc2NhcmRpbmcgJWQgZnJhbWVzIGF0IGVuZCBvZiBwYWdlIiwKICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKICAgICAgICAgICAgICAgICBudW1GcmFtZXMgPSBtTnVtRnJhbWVzTGVmdE9uUGFnZTsKKyAgICAgICAgICAgICAgICBpZiAobVNhd0lucHV0RW9zKSB7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSAtPSBudW1GcmFtZXM7CiAgICAgICAgIH0KIAogICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBudW1GcmFtZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtVmktPmNoYW5uZWxzOwogICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAKICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0KICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKQEAgLTM4NCwxMSArMzk0LDEzIEBACiAKICAgICAgICAgbU51bUZyYW1lc091dHB1dCArPSBudW1GcmFtZXM7CiAKLSAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgaW5JbmZvID0gTlVMTDsKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KIAogICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwpAQCAtNDI1LDYgKzQzNyw4IEBACiAgICAgICAgIG1WaSA9IE5VTEw7CiAgICAgfQogCisgICAgbVNhd0lucHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwogICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKaW5kZXggY2I2MjhhMC4uMWQwMDgxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaApAQCAtNTksNiArNTksOCBAQAogICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CiAgICAgaW50MzJfdCBtTnVtRnJhbWVzTGVmdE9uUGFnZTsKKyAgICBib29sIG1TYXdJbnB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CiAKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCA5OTBkNTU0Li5mOTA2NzU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CkBAIC0zMywzNCArMzMsNzEgQEAKICAgICByZXR1cm4gKHByb3BlcnR5X2dldCgicm8ua2VybmVsLnFlbXUiLCBwcm9wLCBOVUxMKSA+IDApOwogfQogCi1Tb2Z0d2FyZVJlbmRlcmVyOjpTb2Z0d2FyZVJlbmRlcmVyKAotICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCi0gICAgOiBtQ29udmVydGVyKE5VTEwpLAorc3RhdGljIGludCBBTElHTihpbnQgeCwgaW50IHkpIHsKKyAgICAvLyB5IG11c3QgYmUgYSBwb3dlciBvZiAyLgorICAgIHJldHVybiAoeCArIHkgLSAxKSAmIH4oeSAtIDEpOworfQorCitTb2Z0d2FyZVJlbmRlcmVyOjpTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpCisgICAgOiBtQ29sb3JGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFVudXNlZCksCisgICAgICBtQ29udmVydGVyKE5VTEwpLAogICAgICAgbVlVVk1vZGUoTm9uZSksCi0gICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdykgewotICAgIGludDMyX3QgdG1wOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZ0bXApKTsKLSAgICBtQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpdG1wOworICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpLAorICAgICAgbVdpZHRoKDApLAorICAgICAgbUhlaWdodCgwKSwKKyAgICAgIG1Dcm9wTGVmdCgwKSwKKyAgICAgIG1Dcm9wVG9wKDApLAorICAgICAgbUNyb3BSaWdodCgwKSwKKyAgICAgIG1Dcm9wQm90dG9tKDApLAorICAgICAgbUNyb3BXaWR0aCgwKSwKKyAgICAgIG1Dcm9wSGVpZ2h0KDApIHsKK30KIAotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtV2lkdGgpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1IZWlnaHQpKTsKK1NvZnR3YXJlUmVuZGVyZXI6On5Tb2Z0d2FyZVJlbmRlcmVyKCkgeworICAgIGRlbGV0ZSBtQ29udmVydGVyOworICAgIG1Db252ZXJ0ZXIgPSBOVUxMOworfQogCi0gICAgaWYgKCFtZXRhLT5maW5kUmVjdCgKLSAgICAgICAgICAgICAgICBrS2V5Q3JvcFJlY3QsCi0gICAgICAgICAgICAgICAgJm1Dcm9wTGVmdCwgJm1Dcm9wVG9wLCAmbUNyb3BSaWdodCwgJm1Dcm9wQm90dG9tKSkgewotICAgICAgICBtQ3JvcExlZnQgPSBtQ3JvcFRvcCA9IDA7Ci0gICAgICAgIG1Dcm9wUmlnaHQgPSBtV2lkdGggLSAxOwotICAgICAgICBtQ3JvcEJvdHRvbSA9IG1IZWlnaHQgLSAxOwordm9pZCBTb2Z0d2FyZVJlbmRlcmVyOjpyZXNldEZvcm1hdElmQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIENIRUNLKGZvcm1hdCAhPSBOVUxMKTsKKworICAgIGludDMyX3QgY29sb3JGb3JtYXROZXc7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdE5ldykpOworCisgICAgaW50MzJfdCB3aWR0aE5ldywgaGVpZ2h0TmV3OworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmd2lkdGhOZXcpKTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJmhlaWdodE5ldykpOworCisgICAgaW50MzJfdCBjcm9wTGVmdE5ldywgY3JvcFRvcE5ldywgY3JvcFJpZ2h0TmV3LCBjcm9wQm90dG9tTmV3OworICAgIGlmICghZm9ybWF0LT5maW5kUmVjdCgKKyAgICAgICAgICAgICJjcm9wIiwgJmNyb3BMZWZ0TmV3LCAmY3JvcFRvcE5ldywgJmNyb3BSaWdodE5ldywgJmNyb3BCb3R0b21OZXcpKSB7CisgICAgICAgIGNyb3BMZWZ0TmV3ID0gY3JvcFRvcE5ldyA9IDA7CisgICAgICAgIGNyb3BSaWdodE5ldyA9IHdpZHRoTmV3IC0gMTsKKyAgICAgICAgY3JvcEJvdHRvbU5ldyA9IGhlaWdodE5ldyAtIDE7CiAgICAgfQogCisgICAgaWYgKHN0YXRpY19jYXN0PGludDMyX3Q+KG1Db2xvckZvcm1hdCkgPT0gY29sb3JGb3JtYXROZXcgJiYKKyAgICAgICAgbVdpZHRoID09IHdpZHRoTmV3ICYmCisgICAgICAgIG1IZWlnaHQgPT0gaGVpZ2h0TmV3ICYmCisgICAgICAgIG1Dcm9wTGVmdCA9PSBjcm9wTGVmdE5ldyAmJgorICAgICAgICBtQ3JvcFRvcCA9PSBjcm9wVG9wTmV3ICYmCisgICAgICAgIG1Dcm9wUmlnaHQgPT0gY3JvcFJpZ2h0TmV3ICYmCisgICAgICAgIG1Dcm9wQm90dG9tID09IGNyb3BCb3R0b21OZXcpIHsKKyAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkLCBubyBuZWVkIHRvIHJlc2V0IHJlbmRlcmVyLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNvbG9yRm9ybWF0ID0gc3RhdGljX2Nhc3Q8T01YX0NPTE9SX0ZPUk1BVFRZUEU+KGNvbG9yRm9ybWF0TmV3KTsKKyAgICBtV2lkdGggPSB3aWR0aE5ldzsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0TmV3OworICAgIG1Dcm9wTGVmdCA9IGNyb3BMZWZ0TmV3OworICAgIG1Dcm9wVG9wID0gY3JvcFRvcE5ldzsKKyAgICBtQ3JvcFJpZ2h0ID0gY3JvcFJpZ2h0TmV3OworICAgIG1Dcm9wQm90dG9tID0gY3JvcEJvdHRvbU5ldzsKKwogICAgIG1Dcm9wV2lkdGggPSBtQ3JvcFJpZ2h0IC0gbUNyb3BMZWZ0ICsgMTsKICAgICBtQ3JvcEhlaWdodCA9IG1Dcm9wQm90dG9tIC0gbUNyb3BUb3AgKyAxOwogCi0gICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7Ci0gICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwotICAgIH0KLQogICAgIGludCBoYWxGb3JtYXQ7CiAgICAgc2l6ZV90IGJ1ZldpZHRoLCBidWZIZWlnaHQ7CiAKQEAgLTEwNiwxMiArMTQzLDI5IEBACiAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpKTsKIAogICAgIC8vIFdpZHRoIG11c3QgYmUgbXVsdGlwbGUgb2YgMzI/Pz8KLSAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAorICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucygKICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgICAgIGJ1ZldpZHRoLAotICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCwKKyAgICAgICAgICAgICAgICBidWZIZWlnaHQpKTsKKyAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgICAgIGhhbEZvcm1hdCkpOwogCisgICAgLy8gTk9URTogbmF0aXZlIHdpbmRvdyB1c2VzIGV4dGVuZGVkIHJpZ2h0LWJvdHRvbSBjb29yZGluYXRlCisgICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IGNyb3A7CisgICAgY3JvcC5sZWZ0ID0gbUNyb3BMZWZ0OworICAgIGNyb3AudG9wID0gbUNyb3BUb3A7CisgICAgY3JvcC5yaWdodCA9IG1Dcm9wUmlnaHQgKyAxOworICAgIGNyb3AuYm90dG9tID0gbUNyb3BCb3R0b20gKyAxOworICAgIEFMT0dWKCJzZXR0aW5nIGNyb3A6IFslZCwgJWQsICVkLCAlZF0gZm9yIHNpemUgWyV6dSwgJXp1XSIsCisgICAgICAgICAgY3JvcC5sZWZ0LCBjcm9wLnRvcCwgY3JvcC5yaWdodCwgY3JvcC5ib3R0b20sIGJ1ZldpZHRoLCBidWZIZWlnaHQpOworCisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfY3JvcChtTmF0aXZlV2luZG93LmdldCgpLCAmY3JvcCkpOworCisgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7CisgICAgfQogICAgIHVpbnQzMl90IHRyYW5zZm9ybTsKICAgICBzd2l0Y2ggKHJvdGF0aW9uRGVncmVlcykgewogICAgICAgICBjYXNlIDA6IHRyYW5zZm9ybSA9IDA7IGJyZWFrOwpAQCAtMTIxLDI0ICsxNzUsMTUgQEAKICAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKHRyYW5zZm9ybSkgewotICAgICAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSgKLSAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKSk7Ci0gICAgfQotfQotCi1Tb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKLSAgICBkZWxldGUgbUNvbnZlcnRlcjsKLSAgICBtQ29udmVydGVyID0gTlVMTDsKLX0KLQotc3RhdGljIGludCBBTElHTihpbnQgeCwgaW50IHkpIHsKLSAgICAvLyB5IG11c3QgYmUgYSBwb3dlciBvZiAyLgotICAgIHJldHVybiAoeCArIHkgLSAxKSAmIH4oeSAtIDEpOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKAorICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHRyYW5zZm9ybSkpOwogfQogCiB2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlcigKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSkgeworICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcywKKyAgICAgICAgdm9pZCogLypwbGF0Zm9ybVByaXZhdGUqLywgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIHsKKyAgICByZXNldEZvcm1hdElmQ2hhbmdlZChmb3JtYXQpOworCiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOwogICAgIGludCBlcnI7CiAgICAgaWYgKChlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCkBAIC0yMzcsNiArMjgyLDExIEBACiBza2lwX2NvcHlpbmc6CiAgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLnVubG9jayhidWYtPmhhbmRsZSkpOwogCisgICAgaWYgKChlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtTmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgdGltZXN0YW1wTnMpKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJTdXJmYWNlOjpzZXRfYnVmZmVyc190aW1lc3RhbXAgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOworICAgIH0KKwogICAgIGlmICgoZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgYnVmLAogICAgICAgICAgICAgLTEpKSAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJTdXJmYWNlOjpxdWV1ZUJ1ZmZlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk5MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbApAQCAtMCwwICsxLDkxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5tcDMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXBlZyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtMzIwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI3MzUwLDgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5hbGF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtYWxhdyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtbWxhdyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAsOTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjMyMDAwLTUwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2MDAwLTUxMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnJhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9yYXciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEwMDAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTk2MDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmZsYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTgiICBkZWZhdWx0PSI1IiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNRIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9FbmNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV90ZWxlcGhvbnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDkwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5nc20uZGVjb2RlciIgdHlwZT0iYXVkaW8vZ3NtIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMTMwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0RlY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmVmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCkBAIC0wLDAgKzEsMTA0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVTaW1wbGUgOiBMZXZlbDMgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMTItMTE4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMzg0MDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwzMCwgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NQorICAgICAgICAgICAgICAgICAgICBQcm9maWxlSVNXVjIgOiBMZXZlbDMwLCBQcm9maWxlSVNXVjIgOiBMZXZlbDQ1IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjM1MngyODgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTM4NDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtOTgzMDQwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oZXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iOHg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xMzkyNjQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA5LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDkiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS01MDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+CisKKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5lbmNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDUgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxNzZ4MTQ0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyODAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9Ijg5Nng4OTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMTg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMTItMTQ4NSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS02NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0VuY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCmluZGV4IDU0OTljMzIuLmJlYjVjYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmNwcApAQCAtMjcsNiArMjcsOSBAQAogICAgICAgbU51bUJpdHNMZWZ0KDApIHsKIH0KIAorQUJpdFJlYWRlcjo6fkFCaXRSZWFkZXIoKSB7Cit9CisKIHZvaWQgQUJpdFJlYWRlcjo6ZmlsbFJlc2Vydm9pcigpIHsKICAgICBDSEVDS19HVChtU2l6ZSwgMHUpOwogCkBAIC05OSw0ICsxMDIsNjkgQEAKICAgICByZXR1cm4gbURhdGEgLSAobU51bUJpdHNMZWZ0ICsgNykgLyA4OwogfQogCitOQUxCaXRSZWFkZXI6Ok5BTEJpdFJlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkKKyAgICA6IEFCaXRSZWFkZXIoZGF0YSwgc2l6ZSksCisgICAgICBtTnVtWmVyb3MoMCkgeworfQorCitib29sIE5BTEJpdFJlYWRlcjo6YXRMZWFzdE51bUJpdHNMZWZ0KHNpemVfdCBuKSBjb25zdCB7CisgICAgLy8gY2hlY2sgYWdhaW5zdCByYXcgc2l6ZSBhbmQgcmVzZXJ2b2lyIGJpdHMgZmlyc3QKKyAgICBzaXplX3QgbnVtQml0cyA9IG51bUJpdHNMZWZ0KCk7CisgICAgaWYgKG4gPiBudW1CaXRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IG51bUJpdHNSZW1haW5pbmcgPSBuIC0gbU51bUJpdHNMZWZ0OworCisgICAgc2l6ZV90IHNpemUgPSBtU2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbURhdGE7CisgICAgaW50MzJfdCBudW1aZXJvcyA9IG1OdW1aZXJvczsKKyAgICB3aGlsZSAoc2l6ZSA+IDAgJiYgbnVtQml0c1JlbWFpbmluZyA+IDApIHsKKyAgICAgICAgYm9vbCBpc0VtdWxhdGlvblByZXZlbnRpb25CeXRlID0gKG51bVplcm9zID49IDIgJiYgKmRhdGEgPT0gMyk7CisKKyAgICAgICAgaWYgKCpkYXRhID09IDApIHsKKyAgICAgICAgICAgICsrbnVtWmVyb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1aZXJvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRW11bGF0aW9uUHJldmVudGlvbkJ5dGUpIHsKKyAgICAgICAgICAgIG51bUJpdHNSZW1haW5pbmcgLT0gODsKKyAgICAgICAgfQorCisgICAgICAgICsrZGF0YTsKKyAgICAgICAgLS1zaXplOworICAgIH0KKworICAgIHJldHVybiAobnVtQml0c1JlbWFpbmluZyA8PSAwKTsKK30KKwordm9pZCBOQUxCaXRSZWFkZXI6OmZpbGxSZXNlcnZvaXIoKSB7CisgICAgQ0hFQ0tfR1QobVNpemUsIDB1KTsKKworICAgIG1SZXNlcnZvaXIgPSAwOworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAobVNpemUgPiAwICYmIGkgPCA0KSB7CisgICAgICAgIGJvb2wgaXNFbXVsYXRpb25QcmV2ZW50aW9uQnl0ZSA9IChtTnVtWmVyb3MgPj0gMiAmJiAqbURhdGEgPT0gMyk7CisKKyAgICAgICAgaWYgKCptRGF0YSA9PSAwKSB7CisgICAgICAgICAgICArK21OdW1aZXJvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1OdW1aZXJvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwIGVtdWxhdGlvbl9wcmV2ZW50aW9uX3RocmVlX2J5dGUKKyAgICAgICAgaWYgKCFpc0VtdWxhdGlvblByZXZlbnRpb25CeXRlKSB7CisgICAgICAgICAgICBtUmVzZXJ2b2lyID0gKG1SZXNlcnZvaXIgPDwgOCkgfCAqbURhdGE7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgICArK21EYXRhOworICAgICAgICAtLW1TaXplOworICAgIH0KKworICAgIG1OdW1CaXRzTGVmdCA9IDggKiBpOworICAgIG1SZXNlcnZvaXIgPDw9IDMyIC0gbU51bUJpdHNMZWZ0OworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKaW5kZXggNWY1Yzk3Ny4uNDkxM2ZkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCkBAIC0xOSwxMSArMTksMTMgQEAKICNpbmNsdWRlICJBRGVidWcuaCIKICNpbmNsdWRlICJBTG9vcGVyLmgiCiAjaW5jbHVkZSAiQU1lc3NhZ2UuaCIKKyNpbmNsdWRlICJNZWRpYUJ1ZmZlckJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBQnVmZmVyOjpBQnVmZmVyKHNpemVfdCBjYXBhY2l0eSkKLSAgICA6IG1SYW5nZU9mZnNldCgwKSwKKyAgICA6IG1NZWRpYUJ1ZmZlckJhc2UoTlVMTCksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCiAgICAgICBtSW50MzJEYXRhKDApLAogICAgICAgbU93bnNEYXRhKHRydWUpIHsKICAgICBtRGF0YSA9IG1hbGxvYyhjYXBhY2l0eSk7CkBAIC0zNyw3ICszOSw4IEBACiB9CiAKIEFCdWZmZXI6OkFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IGNhcGFjaXR5KQotICAgIDogbURhdGEoZGF0YSksCisgICAgOiBtTWVkaWFCdWZmZXJCYXNlKE5VTEwpLAorICAgICAgbURhdGEoZGF0YSksCiAgICAgICBtQ2FwYWNpdHkoY2FwYWNpdHkpLAogICAgICAgbVJhbmdlT2Zmc2V0KDApLAogICAgICAgbVJhbmdlTGVuZ3RoKGNhcGFjaXR5KSwKQEAgLTQ1LDYgKzQ4LDE0IEBACiAgICAgICBtT3duc0RhdGEoZmFsc2UpIHsKIH0KIAorLy8gc3RhdGljCitzcDxBQnVmZmVyPiBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNhcGFjaXR5KQoreworICAgIHNwPEFCdWZmZXI+IHJlcyA9IG5ldyBBQnVmZmVyKGNhcGFjaXR5KTsKKyAgICBtZW1jcHkocmVzLT5kYXRhKCksIGRhdGEsIGNhcGFjaXR5KTsKKyAgICByZXR1cm4gcmVzOworfQorCiBBQnVmZmVyOjp+QUJ1ZmZlcigpIHsKICAgICBpZiAobU93bnNEYXRhKSB7CiAgICAgICAgIGlmIChtRGF0YSAhPSBOVUxMKSB7CkBAIC01Niw2ICs2Nyw4IEBACiAgICAgaWYgKG1GYXJld2VsbCAhPSBOVUxMKSB7CiAgICAgICAgIG1GYXJld2VsbC0+cG9zdCgpOwogICAgIH0KKworICAgIHNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKIH0KIAogdm9pZCBBQnVmZmVyOjpzZXRSYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewpAQCAtNzcsNSArOTAsMTkgQEAKICAgICByZXR1cm4gbU1ldGE7CiB9CiAKK01lZGlhQnVmZmVyQmFzZSAqQUJ1ZmZlcjo6Z2V0TWVkaWFCdWZmZXJCYXNlKCkgeworICAgIGlmIChtTWVkaWFCdWZmZXJCYXNlICE9IE5VTEwpIHsKKyAgICAgICAgbU1lZGlhQnVmZmVyQmFzZS0+YWRkX3JlZigpOworICAgIH0KKyAgICByZXR1cm4gbU1lZGlhQnVmZmVyQmFzZTsKK30KKwordm9pZCBBQnVmZmVyOjpzZXRNZWRpYUJ1ZmZlckJhc2UoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZmZlcikgeworICAgIGlmIChtTWVkaWFCdWZmZXJCYXNlICE9IE5VTEwpIHsKKyAgICAgICAgbU1lZGlhQnVmZmVyQmFzZS0+cmVsZWFzZSgpOworICAgIH0KKyAgICBtTWVkaWFCdWZmZXJCYXNlID0gbWVkaWFCdWZmZXI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCmluZGV4IGY3YTAwZDguLjVmN2M3MGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApAQCAtNTEsNyArNTEsNyBAQAogQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6fkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7CiB9CiAKLXZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6aGFuZGxlTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHNwPEFTdGF0ZT4gc2F2ZSA9IG1TdGF0ZTsKIAogICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKaW5kZXggZWJmOWQ4ZC4uODhiMWM5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCkBAIC02OCwxNCArNjgsMTQgQEAKIAogQUxvb3Blcjo6QUxvb3BlcigpCiAgICAgOiBtUnVubmluZ0xvY2FsbHkoZmFsc2UpIHsKKyAgICAvLyBjbGVhbiB1cCBzdGFsZSBBSGFuZGxlcnMuIERvaW5nIGl0IGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgZGVzdHJ1Y3RvciBhdm9pZHMKKyAgICAvLyB0aGUgc2lkZSBlZmZlY3Qgb2Ygb2JqZWN0cyBiZWluZyBkZWxldGVkIGZyb20gdGhlIHVucmVnaXN0ZXIgZnVuY3Rpb24gcmVjdXJzaXZlbHkuCisgICAgZ0xvb3BlclJvc3Rlci51bnJlZ2lzdGVyU3RhbGVIYW5kbGVycygpOwogfQogCiBBTG9vcGVyOjp+QUxvb3BlcigpIHsKICAgICBzdG9wKCk7Ci0KLSAgICAvLyBTaW5jZSB0aGlzIGxvb3BlciBpcyAiZGVhZCIgKG9yIGFzIGdvb2QgYXMgZGVhZCBieSBub3cpLAotICAgIC8vIGhhdmUgQUxvb3BlclJvc3RlciB1bnJlZ2lzdGVyIGFueSBoYW5kbGVycyBzdGlsbCByZWdpc3RlcmVkIGZvciBpdC4KLSAgICBnTG9vcGVyUm9zdGVyLnVucmVnaXN0ZXJTdGFsZUhhbmRsZXJzKCk7CisgICAgLy8gc3RhbGUgQUhhbmRsZXJzIGFyZSBub3cgY2xlYW5lZCB1cCBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIG5leHQgQUxvb3BlciB0byBjb21lIGFsb25nCiB9CiAKIHZvaWQgQUxvb3Blcjo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAppbmRleCAwYzE4MWZmLi5lMGRjNzY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKQEAgLTcyLDUwICs3Miw0MCBAQAogfQogCiB2b2lkIEFMb29wZXJSb3N0ZXI6OnVucmVnaXN0ZXJTdGFsZUhhbmRsZXJzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gbUhhbmRsZXJzLnNpemUoKTsgaS0tID4gMDspIHsKLSAgICAgICAgY29uc3QgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMudmFsdWVBdChpKTsKKyAgICBWZWN0b3I8c3A8QUxvb3Blcj4gPiBhY3RpdmVMb29wZXJzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgICAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBpbmZvLm1Mb29wZXIucHJvbW90ZSgpOwotICAgICAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJVbnJlZ2lzdGVyaW5nIHN0YWxlIGhhbmRsZXIgJWQiLCBtSGFuZGxlcnMua2V5QXQoaSkpOwotICAgICAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtSGFuZGxlcnMuc2l6ZSgpOyBpLS0gPiAwOykgeworICAgICAgICAgICAgY29uc3QgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMudmFsdWVBdChpKTsKKworICAgICAgICAgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJVbnJlZ2lzdGVyaW5nIHN0YWxlIGhhbmRsZXIgJWQiLCBtSGFuZGxlcnMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50ICdsb29wZXInIG1pZ2h0IGJlIHRoZSBvbmx5IHNwPD4ga2VlcGluZworICAgICAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgYWxpdmUuIFRvIHByZXZlbnQgaXQgZnJvbSBnb2luZyBvdXQgb2Ygc2NvcGUKKyAgICAgICAgICAgICAgICAvLyBhbmQgaGF2aW5nIH5BTG9vcGVyIGNhbGwgdGhpcyBtZXRob2QgYWdhaW4gcmVjdXJzaXZlbHkKKyAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBkZWFkbG9ja2luZyBiZWNhdXNlIG9mIHRoZSBBdXRvbG9jayBhYm92ZSwgYWRkCisgICAgICAgICAgICAgICAgLy8gaXQgdG8gYSBWZWN0b3Igd2hpY2ggd2lsbCBnbyBvdXQgb2Ygc2NvcGUgYWZ0ZXIgdGhlIGxvY2sKKyAgICAgICAgICAgICAgICAvLyBoYXMgYmVlbiByZWxlYXNlZC4KKyAgICAgICAgICAgICAgICBhY3RpdmVMb29wZXJzLmFkZChsb29wZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiBzdGF0dXNfdCBBTG9vcGVyUm9zdGVyOjpwb3N0TWVzc2FnZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHBvc3RNZXNzYWdlX2wobXNnLCBkZWxheVVzKTsKLX0KIAotc3RhdHVzX3QgQUxvb3BlclJvc3Rlcjo6cG9zdE1lc3NhZ2VfbCgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcykgewotICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShtc2ctPnRhcmdldCgpKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IG1lc3NhZ2UgJyVzJy4gVGFyZ2V0IGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQuIiwKLSAgICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7CisgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gZmluZExvb3Blcihtc2ctPnRhcmdldCgpKTsKIAogICAgIGlmIChsb29wZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZS4gIgotICAgICAgICAgICAgICJUYXJnZXQgaGFuZGxlciAlZCBzdGlsbCByZWdpc3RlcmVkLCBidXQgb2JqZWN0IGdvbmUuIiwKLSAgICAgICAgICAgICBtc2ctPnRhcmdldCgpKTsKLQotICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KLQogICAgIGxvb3Blci0+cG9zdChtc2csIGRlbGF5VXMpOwotCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNjksMTggKzE1OSwyMyBAQAogCiBzdGF0dXNfdCBBTG9vcGVyUm9zdGVyOjpwb3N0QW5kQXdhaXRSZXNwb25zZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBmaW5kTG9vcGVyKG1zZy0+dGFyZ2V0KCkpOworCisgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlLiAiCisgICAgICAgICAgICAgICAgIlRhcmdldCBoYW5kbGVyICVkIHN0aWxsIHJlZ2lzdGVyZWQsIGJ1dCBvYmplY3QgZ29uZS4iLAorICAgICAgICAgICAgICAgIG1zZy0+dGFyZ2V0KCkpOworICAgICAgICByZXNwb25zZS0+Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHVpbnQzMl90IHJlcGx5SUQgPSBtTmV4dFJlcGx5SUQrKzsKIAogICAgIG1zZy0+c2V0SW50MzIoInJlcGx5SUQiLCByZXBseUlEKTsKIAotICAgIHN0YXR1c190IGVyciA9IHBvc3RNZXNzYWdlX2wobXNnLCAwIC8qIGRlbGF5VXMgKi8pOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXNwb25zZS0+Y2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9CisgICAgbG9vcGVyLT5wb3N0KG1zZywgMCAvKiBkZWxheVVzICovKTsKIAogICAgIHNzaXplX3QgaW5kZXg7CiAgICAgd2hpbGUgKChpbmRleCA9IG1SZXBsaWVzLmluZGV4T2ZLZXkocmVwbHlJRCkpIDwgMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcAppbmRleCAxMzAwZjE2Li4yNmJlYTJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcApAQCAtMTQsNiArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQU1lc3NhZ2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgRFVNUF9TVEFUUworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKwogI2luY2x1ZGUgIkFNZXNzYWdlLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtNjAsMTIgKzY1LDE0IEBACiB2b2lkIEFNZXNzYWdlOjpjbGVhcigpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JdGVtczsgKytpKSB7CiAgICAgICAgIEl0ZW0gKml0ZW0gPSAmbUl0ZW1zW2ldOwotICAgICAgICBmcmVlSXRlbShpdGVtKTsKKyAgICAgICAgZGVsZXRlW10gaXRlbS0+bU5hbWU7CisgICAgICAgIGl0ZW0tPm1OYW1lID0gTlVMTDsKKyAgICAgICAgZnJlZUl0ZW1WYWx1ZShpdGVtKTsKICAgICB9CiAgICAgbU51bUl0ZW1zID0gMDsKIH0KIAotdm9pZCBBTWVzc2FnZTo6ZnJlZUl0ZW0oSXRlbSAqaXRlbSkgewordm9pZCBBTWVzc2FnZTo6ZnJlZUl0ZW1WYWx1ZShJdGVtICppdGVtKSB7CiAgICAgc3dpdGNoIChpdGVtLT5tVHlwZSkgewogICAgICAgICBjYXNlIGtUeXBlU3RyaW5nOgogICAgICAgICB7CkBAIC04OCwyNSArOTUsODUgQEAKICAgICB9CiB9CiAKLUFNZXNzYWdlOjpJdGVtICpBTWVzc2FnZTo6YWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICBuYW1lID0gQUF0b21pemVyOjpBdG9taXplKG5hbWUpOworI2lmZGVmIERVTVBfU1RBVFMKKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChpIDwgbU51bUl0ZW1zICYmIG1JdGVtc1tpXS5tTmFtZSAhPSBuYW1lKSB7Ci0gICAgICAgICsraTsKK011dGV4IGdMb2NrOworc3RhdGljIGludDMyX3QgZ0ZpbmRJdGVtQ2FsbHMgPSAxOworc3RhdGljIGludDMyX3QgZ0R1cENhbGxzID0gMTsKK3N0YXRpYyBpbnQzMl90IGdBdmVyYWdlTnVtSXRlbXMgPSAwOworc3RhdGljIGludDMyX3QgZ0F2ZXJhZ2VOdW1DaGVja3MgPSAwOworc3RhdGljIGludDMyX3QgZ0F2ZXJhZ2VOdW1NZW1DaGVja3MgPSAwOworc3RhdGljIGludDMyX3QgZ0F2ZXJhZ2VEdXBJdGVtcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnTGFzdENoZWNrZWQgPSAtMTsKKworc3RhdGljIHZvaWQgcmVwb3J0U3RhdHMoKSB7CisgICAgaW50MzJfdCB0aW1lID0gKEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwKTsKKyAgICBpZiAodGltZSAvIDEwMDAgIT0gZ0xhc3RDaGVja2VkIC8gMTAwMCkgeworICAgICAgICBnTGFzdENoZWNrZWQgPSB0aW1lOworICAgICAgICBBTE9HSSgiY2FsbGVkIGZpbmRJdGVtSXggJXp1IHRpbWVzIChmb3IgbGVuPSUuMWYgaT0lLjFmLyUuMWYgbWVtKSBkdXAgJXp1IHRpbWVzIChmb3IgbGVuPSUuMWYpIiwKKyAgICAgICAgICAgICAgICBnRmluZEl0ZW1DYWxscywKKyAgICAgICAgICAgICAgICBnQXZlcmFnZU51bUl0ZW1zIC8gKGZsb2F0KWdGaW5kSXRlbUNhbGxzLAorICAgICAgICAgICAgICAgIGdBdmVyYWdlTnVtQ2hlY2tzIC8gKGZsb2F0KWdGaW5kSXRlbUNhbGxzLAorICAgICAgICAgICAgICAgIGdBdmVyYWdlTnVtTWVtQ2hlY2tzIC8gKGZsb2F0KWdGaW5kSXRlbUNhbGxzLAorICAgICAgICAgICAgICAgIGdEdXBDYWxscywKKyAgICAgICAgICAgICAgICBnQXZlcmFnZUR1cEl0ZW1zIC8gKGZsb2F0KWdEdXBDYWxscyk7CisgICAgICAgIGdGaW5kSXRlbUNhbGxzID0gZ0R1cENhbGxzID0gMTsKKyAgICAgICAgZ0F2ZXJhZ2VOdW1JdGVtcyA9IGdBdmVyYWdlTnVtQ2hlY2tzID0gZ0F2ZXJhZ2VOdW1NZW1DaGVja3MgPSBnQXZlcmFnZUR1cEl0ZW1zID0gMDsKKyAgICAgICAgZ0xhc3RDaGVja2VkID0gdGltZTsKICAgICB9Cit9CisjZW5kaWYKIAoraW5saW5lIHNpemVfdCBBTWVzc2FnZTo6ZmluZEl0ZW1JbmRleChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSBjb25zdCB7CisjaWZkZWYgRFVNUF9TVEFUUworICAgIHNpemVfdCBtZW1jaGVja3MgPSAwOworI2VuZGlmCisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoOyBpIDwgbU51bUl0ZW1zOyBpKyspIHsKKyAgICAgICAgaWYgKGxlbiAhPSBtSXRlbXNbaV0ubU5hbWVMZW5ndGgpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjaWZkZWYgRFVNUF9TVEFUUworICAgICAgICArK21lbWNoZWNrczsKKyNlbmRpZgorICAgICAgICBpZiAoIW1lbWNtcChtSXRlbXNbaV0ubU5hbWUsIG5hbWUsIGxlbikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2lmZGVmIERVTVBfU1RBVFMKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgICAgICsrZ0ZpbmRJdGVtQ2FsbHM7CisgICAgICAgIGdBdmVyYWdlTnVtSXRlbXMgKz0gbU51bUl0ZW1zOworICAgICAgICBnQXZlcmFnZU51bU1lbUNoZWNrcyArPSBtZW1jaGVja3M7CisgICAgICAgIGdBdmVyYWdlTnVtQ2hlY2tzICs9IGk7CisgICAgICAgIHJlcG9ydFN0YXRzKCk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGk7Cit9CisKKy8vIGFzc3VtZXMgaXRlbSdzIG5hbWUgd2FzIHVuaW5pdGlhbGl6ZWQgb3IgTlVMTAordm9pZCBBTWVzc2FnZTo6SXRlbTo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSB7CisgICAgbU5hbWVMZW5ndGggPSBsZW47CisgICAgbU5hbWUgPSBuZXcgY2hhcltsZW4gKyAxXTsKKyAgICBtZW1jcHkoKHZvaWQqKW1OYW1lLCBuYW1lLCBsZW4gKyAxKTsKK30KKworQU1lc3NhZ2U6Okl0ZW0gKkFNZXNzYWdlOjphbGxvY2F0ZUl0ZW0oY29uc3QgY2hhciAqbmFtZSkgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgc2l6ZV90IGkgPSBmaW5kSXRlbUluZGV4KG5hbWUsIGxlbik7CiAgICAgSXRlbSAqaXRlbTsKIAogICAgIGlmIChpIDwgbU51bUl0ZW1zKSB7CiAgICAgICAgIGl0ZW0gPSAmbUl0ZW1zW2ldOwotICAgICAgICBmcmVlSXRlbShpdGVtKTsKKyAgICAgICAgZnJlZUl0ZW1WYWx1ZShpdGVtKTsKICAgICB9IGVsc2UgewogICAgICAgICBDSEVDSyhtTnVtSXRlbXMgPCBrTWF4TnVtSXRlbXMpOwogICAgICAgICBpID0gbU51bUl0ZW1zKys7CiAgICAgICAgIGl0ZW0gPSAmbUl0ZW1zW2ldOwotCi0gICAgICAgIGl0ZW0tPm1OYW1lID0gbmFtZTsKKyAgICAgICAgaXRlbS0+c2V0TmFtZShuYW1lLCBsZW4pOwogICAgIH0KIAogICAgIHJldHVybiBpdGVtOwpAQCAtMTE0LDE5ICsxODEsMjAgQEAKIAogY29uc3QgQU1lc3NhZ2U6Okl0ZW0gKkFNZXNzYWdlOjpmaW5kSXRlbSgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgVHlwZSB0eXBlKSBjb25zdCB7Ci0gICAgbmFtZSA9IEFBdG9taXplcjo6QXRvbWl6ZShuYW1lKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKKyAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICBpZiAoaSA8IG1OdW1JdGVtcykgewogICAgICAgICBjb25zdCBJdGVtICppdGVtID0gJm1JdGVtc1tpXTsKKyAgICAgICAgcmV0dXJuIGl0ZW0tPm1UeXBlID09IHR5cGUgPyBpdGVtIDogTlVMTDsKIAotICAgICAgICBpZiAoaXRlbS0+bU5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZW0tPm1UeXBlID09IHR5cGUgPyBpdGVtIDogTlVMTDsKLSAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBOVUxMOwogfQogCitib29sIEFNZXNzYWdlOjpjb250YWlucyhjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CisgICAgc2l6ZV90IGkgPSBmaW5kSXRlbUluZGV4KG5hbWUsIHN0cmxlbihuYW1lKSk7CisgICAgcmV0dXJuIGkgPCBtTnVtSXRlbXM7Cit9CisKICNkZWZpbmUgQkFTSUNfVFlQRShOQU1FLEZJRUxETkFNRSxUWVBFTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHZvaWQgQU1lc3NhZ2U6OnNldCMjTkFNRShjb25zdCBjaGFyICpuYW1lLCBUWVBFTkFNRSB2YWx1ZSkgeyAgICAgICAgICAgIFwKICAgICBJdGVtICppdGVtID0gYWxsb2NhdGVJdGVtKG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE2MCw2ICsyMjgsMTEgQEAKICAgICBpdGVtLT51LnN0cmluZ1ZhbHVlID0gbmV3IEFTdHJpbmcocywgbGVuIDwgMCA/IHN0cmxlbihzKSA6IGxlbik7CiB9CiAKK3ZvaWQgQU1lc3NhZ2U6OnNldFN0cmluZygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQVN0cmluZyAmcykgeworICAgIHNldFN0cmluZyhuYW1lLCBzLmNfc3RyKCksIHMuc2l6ZSgpKTsKK30KKwogdm9pZCBBTWVzc2FnZTo6c2V0T2JqZWN0SW50ZXJuYWwoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPFJlZkJhc2U+ICZvYmosIFR5cGUgdHlwZSkgewogICAgIEl0ZW0gKml0ZW0gPSBhbGxvY2F0ZUl0ZW0obmFtZSk7CkBAIC0yNzgsMTEgKzM1MSwyMCBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UobVdoYXQsIG1UYXJnZXQpOwogICAgIG1zZy0+bU51bUl0ZW1zID0gbU51bUl0ZW1zOwogCisjaWZkZWYgRFVNUF9TVEFUUworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICAgICAgKytnRHVwQ2FsbHM7CisgICAgICAgIGdBdmVyYWdlRHVwSXRlbXMgKz0gbU51bUl0ZW1zOworICAgICAgICByZXBvcnRTdGF0cygpOworICAgIH0KKyNlbmRpZgorCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgewogICAgICAgICBjb25zdCBJdGVtICpmcm9tID0gJm1JdGVtc1tpXTsKICAgICAgICAgSXRlbSAqdG8gPSAmbXNnLT5tSXRlbXNbaV07CiAKLSAgICAgICAgdG8tPm1OYW1lID0gZnJvbS0+bU5hbWU7CisgICAgICAgIHRvLT5zZXROYW1lKGZyb20tPm1OYW1lLCBmcm9tLT5tTmFtZUxlbmd0aCk7CiAgICAgICAgIHRvLT5tVHlwZSA9IGZyb20tPm1UeXBlOwogCiAgICAgICAgIHN3aXRjaCAoZnJvbS0+bVR5cGUpIHsKQEAgLTQwMyw3ICs0ODUsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IHN0YXRpY19jYXN0PEFCdWZmZXIgKj4oaXRlbS51LnJlZlZhbHVlKTsKIAotICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCAmJiBidWZmZXItPnNpemUoKSA8PSA2NCkgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCAmJiBidWZmZXItPmRhdGEoKSAhPSBOVUxMICYmIGJ1ZmZlci0+c2l6ZSgpIDw9IDY0KSB7CiAgICAgICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigiQnVmZmVyICVzID0ge1xuIiwgaXRlbS5tTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCBpbmRlbnQgKyA0LCAmdG1wKTsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kSW5kZW50KCZ0bXAsIGluZGVudCArIDIpOwpAQCAtNDY4LDggKzU1MCw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGl0ZW0tPm1OYW1lID0gQUF0b21pemVyOjpBdG9taXplKG5hbWUpOwogICAgICAgICBpdGVtLT5tVHlwZSA9IHN0YXRpY19jYXN0PFR5cGU+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgICAgIC8vIHNldE5hbWUoKSBoYXBwZW5zIGJlbG93IHNvIHRoYXQgd2UgZG9uJ3QgbGVhayBtZW1vcnkgd2hlbiBwYXJzaW5nCisgICAgICAgIC8vIGlzIGFib3J0ZWQgaW4gdGhlIG1pZGRsZS4KICAgICAgICAgc3dpdGNoIChpdGVtLT5tVHlwZSkgewogICAgICAgICAgICAgY2FzZSBrVHlwZUludDMyOgogICAgICAgICAgICAgewpAQCAtNTMxLDYgKzYxNCw4IEBACiAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGl0ZW0tPnNldE5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKICAgICB9CiAKICAgICByZXR1cm4gbXNnOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCmluZGV4IGU2Mjk1ODguLjQ1MDRjMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKQEAgLTUyMSw3ICs1MjEsNyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpkdW1wRnJhZ21lbnRTdGF0cyhjb25zdCBGcmFnbWVudCAmZnJhZykgewordm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmR1bXBGcmFnbWVudFN0YXRzKGNvbnN0IEZyYWdtZW50ICYgLyogZnJhZyAqLykgewogI2lmIDAKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQ2NF90IGRlbGF5TXMgPSAobm93VXMgLSBmcmFnLm1UaW1lVXMpIC8gMTAwMGxsOwpAQCAtNTc5LDcgKzU3OSw3IEBACiAKICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7CiAgICAgICAgICAgICBpZiAoIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCIlZCBkYXRhZ3JhbXMgcmVtYWluIHF1ZXVlZC4iLCBtT3V0RnJhZ21lbnRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR0koIiV6dSBkYXRhZ3JhbXMgcmVtYWluIHF1ZXVlZC4iLCBtT3V0RnJhZ21lbnRzLnNpemUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlcnIgPSBPSzsKICAgICAgICAgfQpAQCAtNjIzLDcgKzYyMyw3IEBACiAgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05ORUNURUQpOwogICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwogCi0gICAgc3NpemVfdCBuOworICAgIHNzaXplX3QgbiA9IC0xOwogICAgIHdoaWxlICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnN0IEZyYWdtZW50ICZmcmFnID0gKm1PdXRGcmFnbWVudHMuYmVnaW4oKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKaW5kZXggZGVlNzg2ZC4uOTgzNWNhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgIkFEZWJ1Zy5oIgogI2luY2x1ZGUgIkFTdHJpbmcuaCIKIApAQCAtNDgsNiArNTAsMTMgQEAKICAgICBzZXRUbyhzLCBzaXplKTsKIH0KIAorQVN0cmluZzo6QVN0cmluZyhjb25zdCBTdHJpbmc4ICZmcm9tKQorICAgIDogbURhdGEoTlVMTCksCisgICAgICBtU2l6ZSgwKSwKKyAgICAgIG1BbGxvY1NpemUoMSkgeworICAgIHNldFRvKGZyb20uc3RyaW5nKCksIGZyb20ubGVuZ3RoKCkpOworfQorCiBBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20pCiAgICAgOiBtRGF0YShOVUxMKSwKICAgICAgIG1TaXplKDApLApAQCAtMTg5LDY0ICsxOTgsNjQgQEAKIAogdm9pZCBBU3RyaW5nOjphcHBlbmQoaW50IHgpIHsKICAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVkIiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWQiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQodW5zaWduZWQgeCkgewogICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJXUiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIldSIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZChsb25nIHgpIHsKLSAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVsZCIsIHgpOwotCisgICAgY2hhciBzWzMyXTsKKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWxkIiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKHVuc2lnbmVkIGxvbmcgeCkgewotICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWx1IiwgeCk7Ci0KKyAgICBjaGFyIHNbMzJdOworICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlbHUiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQobG9uZyBsb25nIHgpIHsKICAgICBjaGFyIHNbMzJdOwotICAgIHNwcmludGYocywgIiVsbGQiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlbGxkIiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKHVuc2lnbmVkIGxvbmcgbG9uZyB4KSB7CiAgICAgY2hhciBzWzMyXTsKLSAgICBzcHJpbnRmKHMsICIlbGx1IiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWxsdSIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZChmbG9hdCB4KSB7CiAgICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlZiIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVmIiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGRvdWJsZSB4KSB7CiAgICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlZiIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVmIiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKHZvaWQgKngpIHsKLSAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVwIiwgeCk7Ci0KKyAgICBjaGFyIHNbMzJdOworICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlcCIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCkBAIC0yOTgsNiArMzA3LDE0IEBACiAgICAgcmV0dXJuIHN0cmNtcChtRGF0YSwgb3RoZXIubURhdGEpOwogfQogCitpbnQgQVN0cmluZzo6Y29tcGFyZUlnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyY2FzZWNtcChtRGF0YSwgb3RoZXIubURhdGEpOworfQorCitib29sIEFTdHJpbmc6OmVxdWFsc0lnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGFyZUlnbm9yZUNhc2Uob3RoZXIpID09IDA7Cit9CisKIHZvaWQgQVN0cmluZzo6dG9sb3dlcigpIHsKICAgICBtYWtlTXV0YWJsZSgpOwogCkBAIC0zMjAsNiArMzM3LDM1IEBACiAgICAgcmV0dXJuICFzdHJjbXAobURhdGEgKyBtU2l6ZSAtIHN1ZmZpeExlbiwgc3VmZml4KTsKIH0KIAorYm9vbCBBU3RyaW5nOjpzdGFydHNXaXRoSWdub3JlQ2FzZShjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gIXN0cm5jYXNlY21wKG1EYXRhLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKTsKK30KKworYm9vbCBBU3RyaW5nOjplbmRzV2l0aElnbm9yZUNhc2UoY29uc3QgY2hhciAqc3VmZml4KSBjb25zdCB7CisgICAgc2l6ZV90IHN1ZmZpeExlbiA9IHN0cmxlbihzdWZmaXgpOworCisgICAgaWYgKG1TaXplIDwgc3VmZml4TGVuKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gIXN0cmNhc2VjbXAobURhdGEgKyBtU2l6ZSAtIHN1ZmZpeExlbiwgc3VmZml4KTsKK30KKworLy8gc3RhdGljCitBU3RyaW5nIEFTdHJpbmc6OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICByZXR1cm4gQVN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KHBhcmNlbC5yZWFkSW5wbGFjZShzaXplKSksIHNpemUpOworfQorCitzdGF0dXNfdCBBU3RyaW5nOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgQ0hFQ0tfTEUobVNpemUsIHN0YXRpY19jYXN0PHNpemVfdD4oSU5UMzJfTUFYKSk7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1TaXplKTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGVyciA9IHBhcmNlbC0+d3JpdGUobURhdGEsIG1TaXplKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogQVN0cmluZyBTdHJpbmdQcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKICAgICB2YV9saXN0IGFwOwogICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCmluZGV4IGFkMmRhYjUuLjkwYTZhMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDcgQEAKICAgICAgICAgbGlidXRpbHMgICAgICAgICAgXAogICAgICAgICBsaWJsb2cKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAppbmRleCA5NTgxOTg2Li43ZGE3ZGI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCkBAIC0zMyw2ICszMywxMCBAQAogCiAgICAgICAgIGlmIChuID49IDIgJiYgcy5jX3N0cigpW24gLSAyXSA9PSAnPScpIHsKICAgICAgICAgICAgIHBhZGRpbmcgPSAyOworCisgICAgICAgICAgICBpZiAobiA+PSAzICYmIHMuY19zdHIoKVtuIC0gM10gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgcGFkZGluZyA9IDM7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc2LDcgKzgwLDcgQEAKICAgICAgICAgaWYgKCgoaSArIDEpICUgNCkgPT0gMCkgewogICAgICAgICAgICAgb3V0W2orK10gPSAoYWNjdW0gPj4gMTYpOwogCi0gICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IChhY2N1bSA+PiA4KSAmIDB4ZmY7IH0gCisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IChhY2N1bSA+PiA4KSAmIDB4ZmY7IH0KICAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gYWNjdW0gJiAweGZmOyB9CiAKICAgICAgICAgICAgIGFjY3VtID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjMzMDdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjggQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSwgdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgIFwKKyAgICAgICAgSFRUUEhlbHBlci5jcHAgICAgICAgICAgXAorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKyAgICAgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKKyAgICAgICAgbGlibWVkaWEKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfaHR0cF9zdXBwb3J0CisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzg0NWUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmNwcApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIVFRQSGVscGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSFRUUEhlbHBlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAiYW5kcm9pZF91dGlsX0JpbmRlci5oIgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvU2NvcGVkTG9jYWxSZWYuaD4KKyNpbmNsdWRlICJqbmkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzcDxJTWVkaWFIVFRQU2VydmljZT4gQ3JlYXRlSFRUUFNlcnZpY2VJbkN1cnJlbnRKYXZhQ29udGV4dCgpIHsKKyAgICBpZiAoQW5kcm9pZFJ1bnRpbWU6OmdldEphdmFWTSgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZUhUVFBTZXJ2aWNlSW5DdXJyZW50SmF2YUNvbnRleHQgY2FsbGVkIG91dHNpZGUgIgorICAgICAgICAgICAgICAiSkFWQSBlbnZpcm9ubWVudC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IGNsYXp6KAorICAgICAgICAgICAgZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIikpOworICAgIENIRUNLKGNsYXp6LmdldCgpICE9IE5VTEwpOworCisgICAgam1ldGhvZElEIGNvbnN0cnVjdElEID0gZW52LT5HZXRNZXRob2RJRChjbGF6ei5nZXQoKSwgIjxpbml0PiIsICIoKVYiKTsKKyAgICBDSEVDSyhjb25zdHJ1Y3RJRCAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3Q+IGh0dHBTZXJ2aWNlT2JqKAorICAgICAgICAgICAgZW52LCBlbnYtPk5ld09iamVjdChjbGF6ei5nZXQoKSwgY29uc3RydWN0SUQpKTsKKworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKKyAgICBpZiAoaHR0cFNlcnZpY2VPYmouZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBqbWV0aG9kSUQgYXNCaW5kZXJJRCA9CisgICAgICAgICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LmdldCgpLCAiYXNCaW5kZXIiLCAiKClMYW5kcm9pZC9vcy9JQmluZGVyOyIpOworICAgICAgICBDSEVDSyhhc0JpbmRlcklEICE9IE5VTEwpOworCisgICAgICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3Q+IGh0dHBTZXJ2aWNlQmluZGVyT2JqKAorICAgICAgICAgICAgICAgIGVudiwgZW52LT5DYWxsT2JqZWN0TWV0aG9kKGh0dHBTZXJ2aWNlT2JqLmdldCgpLCBhc0JpbmRlcklEKSk7CisgICAgICAgIENIRUNLKGh0dHBTZXJ2aWNlQmluZGVyT2JqLmdldCgpICE9IE5VTEwpOworCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgICAgICBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIGh0dHBTZXJ2aWNlQmluZGVyT2JqLmdldCgpKTsKKworICAgICAgICBodHRwU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOworICAgIH0KKworICAgIHJldHVybiBodHRwU2VydmljZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NSUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5oCmluZGV4IDEzY2FjNmQuLjhhZWYxMTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpZm5kZWYgSFRUUF9IRUxQRVJfSF8KIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KKyNkZWZpbmUgSFRUUF9IRUxQRVJfSF8KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLworbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKK3NwPElNZWRpYUhUVFBTZXJ2aWNlPiBDcmVhdGVIVFRQU2VydmljZUluQ3VycmVudEphdmFDb250ZXh0KCk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSFRUUF9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI5OTEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUhUVFAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhSFRUUDo6TWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKKyAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtSFRUUENvbm5lY3Rpb24oY29ubiksCisgICAgICBtQ2FjaGVkU2l6ZVZhbGlkKGZhbHNlKSwKKyAgICAgIG1DYWNoZWRTaXplKDBsbCksCisgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7CisgICAgbUluaXRDaGVjayA9IE9LOworfQorCitNZWRpYUhUVFA6On5NZWRpYUhUVFAoKSB7CisgICAgY2xlYXJEUk1TdGF0ZV9sKCk7Cit9CisKK3N0YXR1c190IE1lZGlhSFRUUDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCAvKiBvZmZzZXQgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBleHRIZWFkZXJzOworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgZXh0SGVhZGVycyA9ICpoZWFkZXJzOworICAgIH0KKyAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKKworICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdCh1cmksICZleHRIZWFkZXJzKTsKKworICAgIG1MYXN0SGVhZGVycyA9IGV4dEhlYWRlcnM7CisgICAgbUxhc3RVUkkgPSB1cmk7CisKKyAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gZmFsc2U7CisKKyAgICByZXR1cm4gc3VjY2VzcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKwordm9pZCBNZWRpYUhUVFA6OmRpc2Nvbm5lY3QoKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1IVFRQQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3NpemVfdCBNZWRpYUhUVFA6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgIHdoaWxlIChudW1CeXRlc1JlYWQgPCBzaXplKSB7CisgICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZSAtIG51bUJ5dGVzUmVhZDsKKworICAgICAgICBpZiAoY29weSA+IDY0ICogMTAyNCkgeworICAgICAgICAgICAgLy8gbGltaXQgdGhlIGJ1ZmZlciBzaXplcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgYmluZGVyIGJvdW5kYXJpZXMKKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNwdXJpb3VzIHRyYW5zYWN0aW9uIGZhaWx1cmVzLgorICAgICAgICAgICAgY29weSA9IDY0ICogMTAyNDsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgbiA9IG1IVFRQQ29ubmVjdGlvbi0+cmVhZEF0KAorICAgICAgICAgICAgICAgIG9mZnNldCArIG51bUJ5dGVzUmVhZCwgKHVpbnQ4X3QgKilkYXRhICsgbnVtQnl0ZXNSZWFkLCBjb3B5KTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBudW1CeXRlc1JlYWQgKz0gbjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisKKyAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlc1JlYWQsIGRlbGF5VXMpOworCisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICAvLyBDYWNoaW5nIHRoZSByZXR1cm5lZCBzaXplIHNvIHRoYXQgaXQgc3RheXMgdmFsaWQgZXZlbiBhZnRlciBhCisgICAgLy8gZGlzY29ubmVjdC4gTnVDYWNoZWRTb3VyY2UyIHJlbGllcyBvbiB0aGlzLgorCisgICAgaWYgKCFtQ2FjaGVkU2l6ZVZhbGlkKSB7CisgICAgICAgIG1DYWNoZWRTaXplID0gbUhUVFBDb25uZWN0aW9uLT5nZXRTaXplKCk7CisgICAgICAgIG1DYWNoZWRTaXplVmFsaWQgPSB0cnVlOworICAgIH0KKworICAgICpzaXplID0gbUNhY2hlZFNpemU7CisKKyAgICByZXR1cm4gKnNpemUgPCAwID8gKnNpemUgOiBPSzsKK30KKwordWludDMyX3QgTWVkaWFIVFRQOjpmbGFncygpIHsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Cit9CisKK3N0YXR1c190IE1lZGlhSFRUUDo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICByZXR1cm4gY29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmbUxhc3RIZWFkZXJzLCBvZmZzZXQpOworfQorCisvLyBEUk0uLi4KKworc3A8RGVjcnlwdEhhbmRsZT4gTWVkaWFIVFRQOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKSB7CisgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOworICAgIH0KKworICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gbURybU1hbmFnZXJDbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgICAgICBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpLCBtaW1lKTsKKyAgICB9CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Cit9CisKK3ZvaWQgTWVkaWFIVFRQOjpnZXREcm1JbmZvKAorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7CisgICAgaGFuZGxlID0gbURlY3J5cHRIYW5kbGU7CisgICAgKmNsaWVudCA9IG1Ecm1NYW5hZ2VyQ2xpZW50OworfQorCitTdHJpbmc4IE1lZGlhSFRUUDo6Z2V0VXJpKCkgeworICAgIFN0cmluZzggdXJpOworICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKTsKK30KKworU3RyaW5nOCBNZWRpYUhUVFA6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IG1pbWVUeXBlOworICAgIHN0YXR1c190IGVyciA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0TUlNRVR5cGUoJm1pbWVUeXBlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIHJldHVybiBtaW1lVHlwZTsKK30KKwordm9pZCBNZWRpYUhUVFA6OmNsZWFyRFJNU3RhdGVfbCgpIHsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCisgICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOworICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKaW5kZXggZjM1MjlmOS4uZThkNTU4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCkBAIC0xMyw2ICsxMyw4IEBACiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAJJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYmluZGVyIFwKICAgICAgICAgbGliY3J5cHRvIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAppbmRleCBlNTNlMzVhLi5mYmE2YjA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzQsNTIgKzM2LDUzIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIExpdmVTZXNzaW9uOjpMaXZlU2Vzc2lvbigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzLCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1GbGFncyhmbGFncyksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAorICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UodHJ1ZSksCi0gICAgICBtSFRUUERhdGFTb3VyY2UoCi0gICAgICAgICAgICAgIEhUVFBCYXNlOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pCi0gICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCi0gICAgICAgICAgICAgICAgICAgIDogMCkpLAotICAgICAgbVByZXZCYW5kd2lkdGhJbmRleCgtMSksCisgICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChtSFRUUFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCisgICAgICBtQ3VyQmFuZHdpZHRoSW5kZXgoLTEpLAogICAgICAgbVN0cmVhbU1hc2soMCksCiAgICAgICBtTmV3U3RyZWFtTWFzaygwKSwKICAgICAgIG1Td2FwTWFzaygwKSwKICAgICAgIG1DaGVja0JhbmR3aWR0aEdlbmVyYXRpb24oMCksCiAgICAgICBtU3dpdGNoR2VuZXJhdGlvbigwKSwKKyAgICAgIG1TdWJ0aXRsZUdlbmVyYXRpb24oMCksCiAgICAgICBtTGFzdERlcXVldWVkVGltZVVzKDBsbCksCiAgICAgICBtUmVhbFRpbWVCYXNlVXMoMGxsKSwKICAgICAgIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKGZhbHNlKSwKICAgICAgIG1Td2l0Y2hJblByb2dyZXNzKGZhbHNlKSwKICAgICAgIG1EaXNjb25uZWN0UmVwbHlJRCgwKSwKLSAgICAgIG1TZWVrUmVwbHlJRCgwKSB7Ci0gICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBtSFRUUERhdGFTb3VyY2UtPnNldFVJRChtVUlEKTsKLSAgICB9CisgICAgICBtU2Vla1JlcGx5SUQoMCksCisgICAgICBtRmlyc3RUaW1lVXNWYWxpZChmYWxzZSksCisgICAgICBtRmlyc3RUaW1lVXMoMCksCisgICAgICBtTGFzdFNlZWtUaW1lVXMoMCkgewogCiAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gU3RyZWFtSXRlbSgiYXVkaW8iKTsKICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBTdHJlYW1JdGVtKCJ2aWRlbyIpOwogICAgIG1TdHJlYW1zW2tTdWJ0aXRsZUluZGV4XSA9IFN0cmVhbUl0ZW0oInN1YnRpdGxlcyIpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIG1EaXNjb250aW51aXRpZXMuYWRkKGluZGV4VG9UeXBlKGkpLCBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMIC8qIG1ldGEgKi8pKTsKICAgICAgICAgbVBhY2tldFNvdXJjZXMuYWRkKGluZGV4VG9UeXBlKGkpLCBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMIC8qIG1ldGEgKi8pKTsKICAgICAgICAgbVBhY2tldFNvdXJjZXMyLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7CisgICAgICAgIG1CdWZmZXJpbmdbaV0gPSBmYWxzZTsKICAgICB9CiB9CiAKQEAgLTExMiwzMSArMTE1LDkwIEBACiAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CiAgICAgfQogCisgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlICA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3Ioc3RyZWFtKTsKKyAgICBpZiAoZGlzY29udGludWl0eVF1ZXVlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAvLyBzZWVraW5nLCB0cmFjayBzd2l0Y2hpbmcKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZE1lc3NhZ2UoImV4dHJhIiwgJmV4dHJhKQorICAgICAgICAgICAgICAgICYmIGV4dHJhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgLy8gc2Vla2luZyBvbmx5CisgICAgICAgICAgICBtTGFzdFNlZWtUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKKyAgICB9CisKICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihzdHJlYW0pOwogCi0gICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgc3NpemVfdCBpZHggPSB0eXBlVG9JbmRleChzdHJlYW0pOwogICAgIGlmICghcGFja2V0U291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgIG1CdWZmZXJpbmdbaWR4XSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQnVmZmVyaW5nW2lkeF0pIHsKKyAgICAgICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzCisgICAgICAgICAgICAgICAgfHwgcGFja2V0U291cmNlLT5pc0ZpbmlzaGVkKDApCisgICAgICAgICAgICAgICAgfHwgcGFja2V0U291cmNlLT5nZXRFc3RpbWF0ZWREdXJhdGlvblVzKCkgPiAxMDAwMDAwMGxsKSB7CisgICAgICAgICAgICBtQnVmZmVyaW5nW2lkeF0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQnVmZmVyaW5nW2lkeF0pIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgLy8gd2FpdCBmb3IgY291bnRlcnBhcnQKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBvdGhlclNvdXJjZTsKKyAgICB1aW50MzJfdCBtYXNrID0gbU5ld1N0cmVhbU1hc2sgJiBtU3RyZWFtTWFzazsKKyAgICB1aW50MzJfdCBmZXRjaGVyc01hc2sgID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgZmV0Y2hlck1hc2sgPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXItPmdldFN0cmVhbVR5cGVNYXNrKCk7CisgICAgICAgIGZldGNoZXJzTWFzayB8PSBmZXRjaGVyTWFzazsKKyAgICB9CisgICAgbWFzayAmPSBmZXRjaGVyc01hc2s7CisgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX0FVRElPICYmIChtYXNrICYgU1RSRUFNVFlQRV9WSURFTykpIHsKKyAgICAgICAgb3RoZXJTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX1ZJREVPKTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX1ZJREVPICYmIChtYXNrICYgU1RSRUFNVFlQRV9BVURJTykpIHsKKyAgICAgICAgb3RoZXJTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX0FVRElPKTsKKyAgICB9CisgICAgaWYgKG90aGVyU291cmNlICE9IE5VTEwgJiYgIW90aGVyU291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewogICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQgPT0gT0sgPyAtRUFHQUlOIDogZmluYWxSZXN1bHQ7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyID0gcGFja2V0U291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKIAorICAgIHNpemVfdCBzdHJlYW1JZHg7CiAgICAgY29uc3QgY2hhciAqc3RyZWFtU3RyOwogICAgIHN3aXRjaCAoc3RyZWFtKSB7CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BVURJTzoKKyAgICAgICAgICAgIHN0cmVhbUlkeCA9IGtBdWRpb0luZGV4OwogICAgICAgICAgICAgc3RyZWFtU3RyID0gImF1ZGlvIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfVklERU86CisgICAgICAgICAgICBzdHJlYW1JZHggPSBrVmlkZW9JbmRleDsKICAgICAgICAgICAgIHN0cmVhbVN0ciA9ICJ2aWRlbyI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKKyAgICAgICAgICAgIHN0cmVhbUlkeCA9IGtTdWJ0aXRsZUluZGV4OwogICAgICAgICAgICAgc3RyZWFtU3RyID0gInN1YnMiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIAorICAgIFN0cmVhbUl0ZW0mIHN0cm0gPSBtU3RyZWFtc1tzdHJlYW1JZHhdOwogICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7CisgICAgICAgIC8vIGFkYXB0aXZlIHN0cmVhbWluZywgZGlzY29udGludWl0aWVzIGluIHRoZSBwbGF5bGlzdAogICAgICAgICBpbnQzMl90IHR5cGU7CiAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKTsKIApAQCAtMTUxLDEwICsyMTMsNyBAQAogICAgICAgICAgICAgICBleHRyYSA9PSBOVUxMID8gIk5VTEwiIDogZXh0cmEtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAgICAgaW50MzJfdCBzd2FwOwotICAgICAgICBpZiAodHlwZSA9PSBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCi0gICAgICAgICAgICAgICAgJiYgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN3YXBQYWNrZXRTb3VyY2UiLCAmc3dhcCkKLSAgICAgICAgICAgICAgICAmJiBzd2FwKSB7Ci0KKyAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2FwUGFja2V0U291cmNlIiwgJnN3YXApICYmIHN3YXApIHsKICAgICAgICAgICAgIGludDMyX3Qgc3dpdGNoR2VuZXJhdGlvbjsKICAgICAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgJnN3aXRjaEdlbmVyYXRpb24pKTsKICAgICAgICAgICAgIHsKQEAgLTE2NywxNiArMjI2LDc1IEBACiAgICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBzZXEgPSBzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxOworICAgICAgICAgICAgaW50NjRfdCBvZmZzZXRUaW1lVXM7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmluZGV4T2ZLZXkoc2VxKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzID0gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLnZhbHVlRm9yKHNlcSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcSArPSAxOworICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmluZGV4T2ZLZXkoc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSkgPj0gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy52YWx1ZUZvcihzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdERlcXVldWVkVGltZVVzIC0gZmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdFNhbXBsZUR1cmF0aW9uVXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5hZGQoc2VxLCBvZmZzZXRUaW1lVXMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKKwogICAgICAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfQVVESU8gfHwgc3RyZWFtID09IFNUUkVBTVRZUEVfVklERU8pIHsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxID0gMDsKICAgICAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAgJnRpbWVVcykpOwotICAgICAgICAgICAgQUxPR1YoIlslc10gcmVhZCBidWZmZXIgYXQgdGltZSAlbGxkIHVzIiwgc3RyZWFtU3RyLCB0aW1lVXMpOworICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmZGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICBzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxID0gZGlzY29udGludWl0eVNlcTsKIAorICAgICAgICAgICAgaW50MzJfdCBkaXNjYXJkID0gMDsKKyAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXM7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuaW5kZXhPZktleShzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJVczsgLy8gYXBwcm94aW1hdGUgc2FtcGxlIGR1cmF0aW9uCisgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+IHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcykgeworICAgICAgICAgICAgICAgICAgICBkdXJVcyA9IHRpbWVVcyAtIHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkdXJVcyA9IHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyAtIHRpbWVVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RybS5tTGFzdFNhbXBsZUR1cmF0aW9uVXMgPSBkdXJVczsKKyAgICAgICAgICAgICAgICBmaXJzdFRpbWVVcyA9IG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLnZhbHVlRm9yKHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY2FyZCIsICZkaXNjYXJkKSAmJiBkaXNjYXJkKSB7CisgICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmFkZChzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICBpZiAodGltZVVzID49IGZpcnN0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgdGltZVVzIC09IGZpcnN0VGltZVVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lVXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZVVzICs9IG1MYXN0U2Vla1RpbWVVczsKKyAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuaW5kZXhPZktleShkaXNjb250aW51aXR5U2VxKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdGltZVVzICs9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihkaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIlslc10gcmVhZCBidWZmZXIgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsIHN0cmVhbVN0ciwgdGltZVVzKTsKKyAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsICB0aW1lVXMpOwogICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcyA9IHRpbWVVczsKICAgICAgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgICAgICBpbnQzMl90IHN1YnRpdGxlR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIGlmICgoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigic3VidGl0bGVHZW5lcmF0aW9uIiwgJnN1YnRpdGxlR2VuZXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgJiYgc3VidGl0bGVHZW5lcmF0aW9uICE9IG1TdWJ0aXRsZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgfTsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICJ0cmFja0luZGV4IiwgbVBsYXlsaXN0LT5nZXRTZWxlY3RlZEluZGV4KCkpOwogICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgiYmFzZVVzIiwgbVJlYWxUaW1lQmFzZVVzKTsKQEAgLTIzNSwxMCArMzUzLDYgQEAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwogCi0gICAgdWludDMyX3QgcmVwbHlJRDsKLSAgICBDSEVDSyhyZXNwb25zZSA9PSBtU2Vla1JlcGx5ICYmIDAgIT0gbVNlZWtSZXBseUlEKTsKLSAgICBtU2Vla1JlcGx5LmNsZWFyKCk7Ci0gICAgbVNlZWtSZXBseUlEID0gMDsKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0yNjQsMTIgKzM3OCwxNiBAQAogCiAgICAgICAgIGNhc2Uga1doYXRTZWVrOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZtU2Vla1JlcGx5SUQpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNlZWtSZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmc2Vla1JlcGx5SUQpKTsKKyAgICAgICAgICAgIG1TZWVrUmVwbHlJRCA9IHNlZWtSZXBseUlEOworICAgICAgICAgICAgbVNlZWtSZXBseSA9IG5ldyBBTWVzc2FnZTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25TZWVrKG1zZyk7CiAKLSAgICAgICAgICAgIG1TZWVrUmVwbHkgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoNTAwMDApOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjkyLDcgKzQxMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db250aW51YXRpb24gIT0gTlVMTCkgewpAQCAtMzAyLDcgKzQyMiwxMCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWVrUmVwbHlJRCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1TZWVrUmVwbHkgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBPSyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUmVwbHktPnBvc3RSZXBseShtU2Vla1JlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMjksNiArNDUyLDIzIEBACiAKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlhYWCBSZWNlaXZlZCBlcnJvciAlZCBmcm9tIFBsYXlsaXN0RmV0Y2hlci4iLCBlcnIpOwogCisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBFT1Mgb24gc3VidGl0bGUgdHJhY2tzIGluZGVwZW5kZW50bHkKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB1cmk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSAmJiBtc2ctPmZpbmRTdHJpbmcoInVyaSIsICZ1cmkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGkgPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxQbGF5bGlzdEZldGNoZXI+ICZmZXRjaGVyID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1GZXRjaGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZXRjaGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSA9IGZldGNoZXItPmdldFN0cmVhbVR5cGVNYXNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUZvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNVFlQRV9TVUJUSVRMRVMpLT5zaWduYWxFT1MoZXJyKTs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGlmIChtSW5QcmVwYXJhdGlvblBoYXNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UHJlcGFyZWQoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzU0LDYgKzQ5NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSk7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvdWxkbid0IGZpbmQgdXJpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBGZXRjaGVySW5mbyAqaW5mbyA9ICZtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUZvcih1cmkpOwogICAgICAgICAgICAgICAgICAgICBpbmZvLT5tSXNQcmVwYXJlZCA9IHRydWU7CiAKQEAgLTQxMCw3ICs1NTQsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvbkNoZWNrQmFuZHdpZHRoKCk7CisgICAgICAgICAgICBvbkNoZWNrQmFuZHdpZHRoKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC00NDMsNiArNTg3LDE5IEBACiAgICAgICAgICAgICBvblN3YXBwZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrU3dpdGNoRG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25DaGVja1N3aXRjaERvd24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFN3aXRjaERvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU3dpdGNoRG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDY2LDYgKzYyMywyMSBAQAogICAgIHJldHVybiAoU3RyZWFtVHlwZSkoMSA8PCBpZHgpOwogfQogCisvLyBzdGF0aWMKK3NzaXplX3QgTGl2ZVNlc3Npb246OnR5cGVUb0luZGV4KGludDMyX3QgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQVVESU86CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1ZJREVPOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9OworICAgIHJldHVybiAtMTsKK30KKwogdm9pZCBMaXZlU2Vzc2lvbjo6b25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgQVN0cmluZyB1cmw7CiAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmwiLCAmdXJsKSk7CkBAIC00ODAsMTEgKzY1Miw4IEBACiAgICAgICAgIGhlYWRlcnMgPSBOVUxMOwogICAgIH0KIAotI2lmIDEKLSAgICBBTE9HSSgib25Db25uZWN0IDxVUkwgc3VwcHJlc3NlZD4iKTsKLSNlbHNlCi0gICAgQUxPR0koIm9uQ29ubmVjdCAlcyIsIHVybC5jX3N0cigpKTsKLSNlbmRpZgorICAgIC8vIFRPRE8gY3VycmVudGx5IHdlIGRvbid0IGtub3cgaWYgd2UgYXJlIGNvbWluZyBoZXJlIGZyb20gaW5jb2duaXRvIG1vZGUKKyAgICBBTE9HSSgib25Db25uZWN0ICVzIiwgdXJpRGVidWdTdHJpbmcodXJsKS5jX3N0cigpKTsKIAogICAgIG1NYXN0ZXJVUkwgPSB1cmw7CiAKQEAgLTQ5Miw3ICs2NjEsNyBAQAogICAgIG1QbGF5bGlzdCA9IGZldGNoUGxheWxpc3QodXJsLmNfc3RyKCksIE5VTEwgLyogY3VyUGxheWxpc3RIYXNoICovLCAmZHVtbXkpOwogCiAgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gZmV0Y2ggbWFzdGVyIHBsYXlsaXN0ICclcycuIiwgdXJsLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCAlcy4iLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOwogCiAgICAgICAgIHBvc3RQcmVwYXJlZChFUlJPUl9JTyk7CiAgICAgICAgIHJldHVybjsKQEAgLTU0NCw4ICs3MTMsOSBAQAogICAgICAgICBtQmFuZHdpZHRoSXRlbXMucHVzaChpdGVtKTsKICAgICB9CiAKKyAgICBtUGxheWxpc3QtPnBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIDBsbCAvKiB0aW1lVXMgKi8sIGluaXRpYWxCYW5kd2lkdGhJbmRleCwgdHJ1ZSAvKiBwaWNrVHJhY2sgKi8pOworICAgICAgICAgICAgMGxsIC8qIHRpbWVVcyAqLywgaW5pdGlhbEJhbmR3aWR0aEluZGV4LCBmYWxzZSAvKiBwaWNrVHJhY2sgKi8pOwogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpmaW5pc2hEaXNjb25uZWN0KCkgewpAQCAtNTU3LDYgKzcyNyw5IEBACiAgICAgLy8gKGZpbmlzaERpc2Nvbm5lY3QsIG9uRmluaXNoRGlzY29ubmVjdDIpCiAgICAgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKCk7CiAKKyAgICAvLyBjYW5jZWwgc3dpdGNoIGRvd24gbW9uaXRvcgorICAgIG1Td2l0Y2hEb3duTW9uaXRvci5jbGVhcigpOworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+c3RvcEFzeW5jKCk7CiAgICAgfQpAQCAtNTk5LDcgKzc3Miw3IEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigic3dpdGNoR2VuZXJhdGlvbiIsIG1Td2l0Y2hHZW5lcmF0aW9uKTsKIAogICAgIEZldGNoZXJJbmZvIGluZm87Ci0gICAgaW5mby5tRmV0Y2hlciA9IG5ldyBQbGF5bGlzdEZldGNoZXIobm90aWZ5LCB0aGlzLCB1cmkpOworICAgIGluZm8ubUZldGNoZXIgPSBuZXcgUGxheWxpc3RGZXRjaGVyKG5vdGlmeSwgdGhpcywgdXJpLCBtU3VidGl0bGVHZW5lcmF0aW9uKTsKICAgICBpbmZvLm1EdXJhdGlvblVzID0gLTFsbDsKICAgICBpbmZvLm1Jc1ByZXBhcmVkID0gZmFsc2U7CiAgICAgaW5mby5tVG9CZVJlbW92ZWQgPSBmYWxzZTsKQEAgLTY3OSw3ICs4NTIsNyBAQAogCiAgICAgc3NpemVfdCBieXRlc1JlYWQgPSAwOwogICAgIC8vIGFkanVzdCByYW5nZV9sZW5ndGggaWYgb25seSByZWFkaW5nIHBhcnRpYWwgYmxvY2sKLSAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCBidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemUgPCByYW5nZV9sZW5ndGgpKSB7CisgICAgaWYgKGJsb2NrX3NpemUgPiAwICYmIChyYW5nZV9sZW5ndGggPT0gLTEgfHwgKGludDY0X3QpKGJ1ZmZlci0+c2l6ZSgpICsgYmxvY2tfc2l6ZSkgPCByYW5nZV9sZW5ndGgpKSB7CiAgICAgICAgIHJhbmdlX2xlbmd0aCA9IGJ1ZmZlci0+c2l6ZSgpICsgYmxvY2tfc2l6ZTsKICAgICB9CiAgICAgZm9yICg7OykgewpAQCAtNjg4LDcgKzg2MSw3IEBACiAgICAgICAgIGlmIChidWZmZXJSZW1haW5pbmcgPT0gMCAmJiBnZXRTaXplRXJyICE9IE9LKSB7CiAgICAgICAgICAgICBidWZmZXJSZW1haW5pbmcgPSAzMjc2ODsKIAotICAgICAgICAgICAgQUxPR1YoImluY3JlYXNpbmcgZG93bmxvYWQgYnVmZmVyIHRvICVkIGJ5dGVzIiwKKyAgICAgICAgICAgIEFMT0dWKCJpbmNyZWFzaW5nIGRvd25sb2FkIGJ1ZmZlciB0byAlenUgYnl0ZXMiLAogICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSArIGJ1ZmZlclJlbWFpbmluZyk7CiAKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNvcHkgPSBuZXcgQUJ1ZmZlcihidWZmZXItPnNpemUoKSArIGJ1ZmZlclJlbWFpbmluZyk7CkBAIC03MDEsNyArODc0LDcgQEAKICAgICAgICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0gYnVmZmVyUmVtYWluaW5nOwogICAgICAgICBpZiAocmFuZ2VfbGVuZ3RoID49IDApIHsKICAgICAgICAgICAgIGludDY0X3QgYnl0ZXNMZWZ0SW5SYW5nZSA9IHJhbmdlX2xlbmd0aCAtIGJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdEluUmFuZ2UgPCBtYXhCeXRlc1RvUmVhZCkgeworICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdEluUmFuZ2UgPCAoaW50NjRfdCltYXhCeXRlc1RvUmVhZCkgewogICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gYnl0ZXNMZWZ0SW5SYW5nZTsKIAogICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlID09IDApIHsKQEAgLTc2OSw5ICs5NDIsNiBAQAogICAgICAgICAvLyBwbGF5bGlzdCB1bmNoYW5nZWQKICAgICAgICAgKnVuY2hhbmdlZCA9IHRydWU7CiAKLSAgICAgICAgQUxPR1YoIlBsYXlsaXN0IHVuY2hhbmdlZCwgcmVmcmVzaCBzdGF0ZSBpcyBub3cgJWQiLAotICAgICAgICAgICAgIChpbnQpbVJlZnJlc2hTdGF0ZSk7Ci0KICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC04MzYsMTQgKzEwMDYsMjIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIENvbnNpZGVyIG9ubHkgODAlIG9mIHRoZSBhdmFpbGFibGUgYmFuZHdpZHRoIHVzYWJsZS4KLSAgICAgICAgYmFuZHdpZHRoQnBzID0gKGJhbmR3aWR0aEJwcyAqIDgpIC8gMTA7Ci0KICAgICAgICAgLy8gUGljayB0aGUgaGlnaGVzdCBiYW5kd2lkdGggc3RyZWFtIGJlbG93IG9yIGVxdWFsIHRvIGVzdGltYXRlZCBiYW5kd2lkdGguCiAKICAgICAgICAgaW5kZXggPSBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpIC0gMTsKLSAgICAgICAgd2hpbGUgKGluZGV4ID4gMCAmJiBtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGluZGV4KS5tQmFuZHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gKHNpemVfdCliYW5kd2lkdGhCcHMpIHsKKyAgICAgICAgd2hpbGUgKGluZGV4ID4gMCkgeworICAgICAgICAgICAgLy8gY29uc2lkZXIgb25seSA4MCUgb2YgdGhlIGF2YWlsYWJsZSBiYW5kd2lkdGgsIGJ1dCBpZiB3ZSBhcmUgc3dpdGNoaW5nIHVwLAorICAgICAgICAgICAgLy8gYmUgZXZlbiBtb3JlIGNvbnNlcnZhdGl2ZSAoNzAlKSB0byBhdm9pZCBvdmVyZXN0aW1hdGluZyBhbmQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIC8vIHN3aXRjaGluZyBiYWNrLgorICAgICAgICAgICAgc2l6ZV90IGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYmFuZHdpZHRoQnBzOworICAgICAgICAgICAgaWYgKGluZGV4ID4gbUN1ckJhbmR3aWR0aEluZGV4KSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBhZGp1c3RlZEJhbmR3aWR0aEJwcyAqIDcgLyAxMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBhZGp1c3RlZEJhbmR3aWR0aEJwcyAqIDggLyAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGluZGV4KS5tQmFuZHdpZHRoIDw9IGFkanVzdGVkQmFuZHdpZHRoQnBzKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAtLWluZGV4OwogICAgICAgICB9CiAgICAgfQpAQCAtODU2LDIwICsxMDM0LDIwIEBACiAgICAgLy8gdG8gbG93ZXN0KQogICAgIGNvbnN0IHNpemVfdCBrTWluSW5kZXggPSAwOwogCi0gICAgc3RhdGljIHNzaXplX3QgbVByZXZCYW5kd2lkdGhJbmRleCA9IC0xOworICAgIHN0YXRpYyBzc2l6ZV90IG1DdXJCYW5kd2lkdGhJbmRleCA9IC0xOwogCiAgICAgc2l6ZV90IGluZGV4OwotICAgIGlmIChtUHJldkJhbmR3aWR0aEluZGV4IDwgMCkgeworICAgIGlmIChtQ3VyQmFuZHdpZHRoSW5kZXggPCAwKSB7CiAgICAgICAgIGluZGV4ID0ga01pbkluZGV4OwogICAgIH0gZWxzZSBpZiAodW5pZm9ybVJhbmQoKSA8IDAuNSkgewotICAgICAgICBpbmRleCA9IChzaXplX3QpbVByZXZCYW5kd2lkdGhJbmRleDsKKyAgICAgICAgaW5kZXggPSAoc2l6ZV90KW1DdXJCYW5kd2lkdGhJbmRleDsKICAgICB9IGVsc2UgewotICAgICAgICBpbmRleCA9IG1QcmV2QmFuZHdpZHRoSW5kZXggKyAxOworICAgICAgICBpbmRleCA9IG1DdXJCYW5kd2lkdGhJbmRleCArIDE7CiAgICAgICAgIGlmIChpbmRleCA9PSBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBpbmRleCA9IGtNaW5JbmRleDsKICAgICAgICAgfQogICAgIH0KLSAgICBtUHJldkJhbmR3aWR0aEluZGV4ID0gaW5kZXg7CisgICAgbUN1ckJhbmR3aWR0aEluZGV4ID0gaW5kZXg7CiAjZWxpZiAwCiAgICAgLy8gUGljayB0aGUgaGlnaGVzdCBiYW5kd2lkdGggc3RyZWFtIGJlbG93IG9yIGVxdWFsIHRvIDEuMiBNYml0L3NlYwogCkBAIC05MDAsMTUgKzEwNzgsMzQgQEAKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKK2ludDY0X3QgTGl2ZVNlc3Npb246OmxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZVVzKCkgeworICAgIHNwPEFNZXNzYWdlPiBhdWRpb01ldGEgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX0FVRElPKS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CisgICAgaW50NjRfdCBtaW5TZWdtZW50U3RhcnRUaW1lVXMgPSAtMSwgdmlkZW9TZWdtZW50U3RhcnRUaW1lVXMgPSAtMTsKKyAgICBpZiAoYXVkaW9NZXRhICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9NZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZtaW5TZWdtZW50U3RhcnRUaW1lVXMpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiB2aWRlb01ldGEgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX1ZJREVPKS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CisgICAgaWYgKHZpZGVvTWV0YSAhPSBOVUxMCisgICAgICAgICAgICAmJiB2aWRlb01ldGEtPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJnZpZGVvU2VnbWVudFN0YXJ0VGltZVVzKSkgeworICAgICAgICBpZiAobWluU2VnbWVudFN0YXJ0VGltZVVzIDwgMCB8fCB2aWRlb1NlZ21lbnRTdGFydFRpbWVVcyA8IG1pblNlZ21lbnRTdGFydFRpbWVVcykgeworICAgICAgICAgICAgbWluU2VnbWVudFN0YXJ0VGltZVVzID0gdmlkZW9TZWdtZW50U3RhcnRUaW1lVXM7CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gbWluU2VnbWVudFN0YXJ0VGltZVVzOworfQorCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6b25TZWVrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAogICAgIGlmICghbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKLSAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbih0aW1lVXMsIGdldEJhbmR3aWR0aEluZGV4KCkpOworICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKHRpbWVVcywgbUN1ckJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CiAgICAgfQotCi0gICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgY29uc3QgewpAQCAtOTM1LDE0ICsxMTMyLDM0IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBMaXZlU2Vzc2lvbjo6Z2V0VHJhY2tJbmZvKFBhcmNlbCAqcmVwbHkpIGNvbnN0IHsKLSAgICByZXR1cm4gbVBsYXlsaXN0LT5nZXRUcmFja0luZm8ocmVwbHkpOworc2l6ZV90IExpdmVTZXNzaW9uOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbVBsYXlsaXN0LT5nZXRUcmFja0NvdW50KCk7CisgICAgfQorfQorCitzcDxBTWVzc2FnZT4gTGl2ZVNlc3Npb246OmdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3QgeworICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbVBsYXlsaXN0LT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgICAgfQogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6c2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCkgeworICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgKyttU3VidGl0bGVHZW5lcmF0aW9uOwogICAgIHN0YXR1c190IGVyciA9IG1QbGF5bGlzdC0+c2VsZWN0VHJhY2soaW5kZXgsIHNlbGVjdCk7CiAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbiwgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiYmFuZHdpZHRoSW5kZXgiLCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworICAgICAgICBtc2ctPnNldEludDMyKCJwaWNrVHJhY2siLCBzZWxlY3QpOworICAgICAgICBtc2ctPnBvc3QoKTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTk2OSwxNSArMTE4NiwxMSBAQAogICAgIENIRUNLKCFtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyk7CiAgICAgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MgPSB0cnVlOwogCi0gICAgbVByZXZCYW5kd2lkdGhJbmRleCA9IGJhbmR3aWR0aEluZGV4OworICAgIG1DdXJCYW5kd2lkdGhJbmRleCA9IGJhbmR3aWR0aEluZGV4OwogCi0gICAgQUxPR1YoImNoYW5nZUNvbmZpZ3VyYXRpb24gPT4gdGltZVVzOiVsbGQgdXMsIGJ3SW5kZXg6JWQsIHBpY2tUcmFjazolZCIsCisgICAgQUxPR1YoImNoYW5nZUNvbmZpZ3VyYXRpb24gPT4gdGltZVVzOiUiIFBSSWQ2NCAiIHVzLCBid0luZGV4OiV6dSwgcGlja1RyYWNrOiVkIiwKICAgICAgICAgICB0aW1lVXMsIGJhbmR3aWR0aEluZGV4LCBwaWNrVHJhY2spOwogCi0gICAgaWYgKHBpY2tUcmFjaykgewotICAgICAgICBtUGxheWxpc3QtPnBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7Ci0gICAgfQotCiAgICAgQ0hFQ0tfTFQoYmFuZHdpZHRoSW5kZXgsIG1CYW5kd2lkdGhJdGVtcy5zaXplKCkpOwogICAgIGNvbnN0IEJhbmR3aWR0aEl0ZW0gJml0ZW0gPSBtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGJhbmR3aWR0aEluZGV4KTsKIApAQCAtMTAwMCwxNCArMTIxMywxNSBAQAogCiAgICAgICAgIC8vIElmIHdlJ3JlIHNlZWtpbmcgYWxsIGN1cnJlbnQgZmV0Y2hlcnMgYXJlIGRpc2NhcmRlZC4KICAgICAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewotICAgICAgICAgICAgLy8gZGVsYXkgZmV0Y2hlciByZW1vdmFsCi0gICAgICAgICAgICBkaXNjYXJkRmV0Y2hlciA9IGZhbHNlOworICAgICAgICAgICAgLy8gZGVsYXkgZmV0Y2hlciByZW1vdmFsIGlmIG5vdCBwaWNraW5nIHRyYWNrcworICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBwaWNrVHJhY2s7CiAKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga01heFN0cmVhbXM7ICsraikgewogICAgICAgICAgICAgICAgIFN0cmVhbVR5cGUgdHlwZSA9IGluZGV4VG9UeXBlKGopOwogICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIHR5cGUpICYmIHVyaSA9PSBVUklzW2pdKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VtZU1hc2sgfD0gdHlwZTsKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayAmPSB+dHlwZTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwMjEsMTYgKzEyMzUsMTcgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBtc2c7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewotICAgICAgICAvLyBza2lwIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgKGRlY29kZXIgZGVzdHJ1Y3Rpb24pIGlmIHN3aXRjaGluZy4KKyAgICAgICAgLy8gc2tpcCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIChkZWNvZGVyIGRlc3RydWN0aW9uKSBpZiBub3Qgc2Vla2luZy4KICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMsIGlkKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24yLCBpZCgpKTsKICAgICB9CiAgICAgbXNnLT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOwogICAgIG1zZy0+c2V0SW50MzIoInJlc3VtZU1hc2siLCByZXN1bWVNYXNrKTsKKyAgICBtc2ctPnNldEludDMyKCJwaWNrVHJhY2siLCBwaWNrVHJhY2spOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7Ci0gICAgICAgIGlmIChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaSkpIHsKKyAgICAgICAgaWYgKChzdHJlYW1NYXNrIHwgcmVzdW1lTWFzaykgJiBpbmRleFRvVHlwZShpKSkgewogICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcobVN0cmVhbXNbaV0udXJpS2V5KCkuY19zdHIoKSwgVVJJc1tpXS5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNDcsMTQgKzEyNjIsMjAgQEAKIAogICAgICAgICBpZiAobVNlZWtSZXBseUlEICE9IDApIHsKICAgICAgICAgICAgIENIRUNLKG1TZWVrUmVwbHkgIT0gTlVMTCk7CisgICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOwogICAgICAgICAgICAgbVNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7CisgICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSAwOworICAgICAgICAgICAgbVNlZWtSZXBseS5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNoYW5nZUNvbmZpZ3VyYXRpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpZiAoIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIGdldEJhbmR3aWR0aEluZGV4KCkpOworICAgICAgICBpbnQzMl90IHBpY2tUcmFjayA9IDAsIGJhbmR3aWR0aEluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4OworICAgICAgICBtc2ctPmZpbmRJbnQzMigicGlja1RyYWNrIiwgJnBpY2tUcmFjayk7CisgICAgICAgIG1zZy0+ZmluZEludDMyKCJiYW5kd2lkdGhJbmRleCIsICZiYW5kd2lkdGhJbmRleCk7CisgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIGJhbmR3aWR0aEluZGV4LCBwaWNrVHJhY2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOyAvLyByZXRyeSBpbiAxIHNlYwogICAgIH0KQEAgLTEwNjUsOCArMTI4NiwxNCBAQAogCiAgICAgLy8gQWxsIGZldGNoZXJzIGFyZSBlaXRoZXIgc3VzcGVuZGVkIG9yIGhhdmUgYmVlbiByZW1vdmVkIG5vdy4KIAotICAgIHVpbnQzMl90IHN0cmVhbU1hc2s7CisgICAgdWludDMyX3Qgc3RyZWFtTWFzaywgcmVzdW1lTWFzazsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopJnN0cmVhbU1hc2spKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdW1lTWFzayIsIChpbnQzMl90ICopJnJlc3VtZU1hc2spKTsKKworICAgIC8vIGN1cnJlbnRseSBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIGlzIG9ubHkgY2FsbGVkIGZvciBzZWVraW5nOworICAgIC8vIHJlbW92ZSB0aGUgZm9sbG93aW5nIENIRUNLIGlmIHVzaW5nIGl0IGVsc2Ugd2hlcmUuCisgICAgQ0hFQ0tfRVEocmVzdW1lTWFzaywgMCk7CisgICAgc3RyZWFtTWFzayB8PSByZXN1bWVNYXNrOwogCiAgICAgQVN0cmluZyBVUklzW2tNYXhTdHJlYW1zXTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKQEAgLTExMjMsMjMgKzEzNTAsMzUgQEAKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopJnN0cmVhbU1hc2spKTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdW1lTWFzayIsIChpbnQzMl90ICopJnJlc3VtZU1hc2spKTsKIAorICAgIGludDY0X3QgdGltZVVzOworICAgIGludDMyX3QgcGlja1RyYWNrOworICAgIGJvb2wgc3dpdGNoaW5nID0gZmFsc2U7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGlja1RyYWNrIiwgJnBpY2tUcmFjaykpOworCisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBpZiAoIXBpY2tUcmFjaykgeworICAgICAgICAgICAgc3dpdGNoaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtUmVhbFRpbWVCYXNlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbUxhc3REZXF1ZXVlZFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBtUmVhbFRpbWVCYXNlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gdGltZVVzOworICAgIH0KKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewogICAgICAgICBpZiAoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSB7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcobVN0cmVhbXNbaV0udXJpS2V5KCkuY19zdHIoKSwgJm1TdHJlYW1zW2ldLm1VcmkpKTsKKyAgICAgICAgICAgIGlmIChzd2l0Y2hpbmcpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcobVN0cmVhbXNbaV0udXJpS2V5KCkuY19zdHIoKSwgJm1TdHJlYW1zW2ldLm1OZXdVcmkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKG1TdHJlYW1zW2ldLnVyaUtleSgpLmNfc3RyKCksICZtU3RyZWFtc1tpXS5tVXJpKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBib29sIHN3aXRjaGluZyA9IGZhbHNlOwotICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICBpZiAodGltZVVzIDwgMGxsKSB7Ci0gICAgICAgIHRpbWVVcyA9IG1MYXN0RGVxdWV1ZWRUaW1lVXM7Ci0gICAgICAgIHN3aXRjaGluZyA9IHRydWU7CisgICAgbU5ld1N0cmVhbU1hc2sgPSBzdHJlYW1NYXNrIHwgcmVzdW1lTWFzazsKKyAgICBpZiAoc3dpdGNoaW5nKSB7CisgICAgICAgIG1Td2FwTWFzayA9IG1TdHJlYW1NYXNrICYgfnJlc3VtZU1hc2s7CiAgICAgfQotICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7Ci0KLSAgICBtTmV3U3RyZWFtTWFzayA9IHN0cmVhbU1hc2s7CiAKICAgICAvLyBPZiBhbGwgZXhpc3RpbmcgZmV0Y2hlcnM6CiAgICAgLy8gKiBSZXN1bWUgZmV0Y2hlcnMgdGhhdCBhcmUgc3RpbGwgbmVlZGVkIGFuZCBhc3NpZ24gdGhlbSBvcmlnaW5hbCBwYWNrZXQgc291cmNlcy4KQEAgLTExNTIsNiArMTM5MSwxNiBAQAogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKICAgICAgICAgICAgIGlmICgocmVzdW1lTWFzayAmIGluZGV4VG9UeXBlKGopKSAmJiB1cmkgPT0gbVN0cmVhbXNbal0ubVVyaSkgewogICAgICAgICAgICAgICAgIHNvdXJjZXNbal0gPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaiAhPSBrU3VidGl0bGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigicXVldWVpbmcgZHVtbXkgZGlzY29udGludWl0eSBmb3Igc3RyZWFtIHR5cGUgJWQiLCBpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTExNzksNDMgKzE0MjgsODYgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFTdHJpbmcgdXJpOwotICAgICAgICB1cmkgPSBtU3RyZWFtc1tpXS5tVXJpOworICAgICAgICB1cmkgPSBzd2l0Y2hpbmcgPyBtU3RyZWFtc1tpXS5tTmV3VXJpIDogbVN0cmVhbXNbaV0ubVVyaTsKIAogICAgICAgICBzcDxQbGF5bGlzdEZldGNoZXI+IGZldGNoZXIgPSBhZGRGZXRjaGVyKHVyaS5jX3N0cigpKTsKICAgICAgICAgQ0hFQ0soZmV0Y2hlciAhPSBOVUxMKTsKIAogICAgICAgICBpbnQzMl90IGxhdGVzdFNlcSA9IC0xOwotICAgICAgICBpbnQ2NF90IGxhdGVzdFRpbWVVcyA9IDBsbDsKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xOworICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGw7CisgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IC0xOwogICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2VzW2tNYXhTdHJlYW1zXTsKIAorICAgICAgICBpZiAoaSA9PSBrU3VidGl0bGVJbmRleCkgeworICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzID0gbGF0ZXN0TWVkaWFTZWdtZW50U3RhcnRUaW1lVXMoKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFRSSUNLWTogbG9vcGluZyBmcm9tIGkgYXMgZWFybGllciBzdHJlYW1zIGFyZSBhbHJlYWR5IHJlbW92ZWQgZnJvbSBzdHJlYW1NYXNrCiAgICAgICAgIGZvciAoc2l6ZV90IGogPSBpOyBqIDwga01heFN0cmVhbXM7ICsraikgewotICAgICAgICAgICAgaWYgKChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaikpICYmIHVyaSA9PSBtU3RyZWFtc1tqXS5tVXJpKSB7CisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZzdHJlYW1VcmkgPSBzd2l0Y2hpbmcgPyBtU3RyZWFtc1tqXS5tTmV3VXJpIDogbVN0cmVhbXNbal0ubVVyaTsKKyAgICAgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGopKSAmJiB1cmkgPT0gc3RyZWFtVXJpKSB7CiAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKIAotICAgICAgICAgICAgICAgIGlmICghc3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gdGltZVVzOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZSA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOworICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywgZXh0cmEsIHRydWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZSwgc2VxOwotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNyY1RpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3RNZXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzcmNTZWdtZW50U3RhcnRUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOworICAgICAgICAgICAgICAgICAgICBpZiAocGlja1RyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYXB0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhID0gc291cmNlc1tqXS0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMICYmICFtZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigic2VxIiwgJnNlcSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcSA+IGxhdGVzdFNlcSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdFNlcSA9IHNlcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdG1wVXM7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0bXBVcykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVVzIDwgMCB8fCB0bXBVcyA8IHN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSB0bXBVczsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnNyY1RpbWVVcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1RpbWVVcyA+IGxhdGVzdFRpbWVVcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdFRpbWVVcyA9IHNyY1RpbWVVczsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmdG1wVXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50U3RhcnRUaW1lVXMgPCAwIHx8IHRtcFVzIDwgc2VnbWVudFN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzID0gdG1wVXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJnNlcSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHlTZXEgPCAwIHx8IHNlcSA8IGRpc2NvbnRpbnVpdHlTZXEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5U2VxID0gc2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzMi52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4dHJhU3RyZWFtcyA9IG1OZXdTdHJlYW1NYXNrICYgKH5tU3RyZWFtTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHRyYVN0cmVhbXMgJiBpbmRleFRvVHlwZShqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+cXVldWVBY2Nlc3NVbml0KGNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigvKiBzd2FwID0gKi8gZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpY2tUcmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHRyYWNrLCBxdWV1ZSBkaXNjb250aW51aXRpZXMgYmVmb3JlIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBrU3VidGl0bGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlOworICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwgTlVMTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGFwdGluZywgcXVldWUgZGlzY29udGludWl0aWVzIGFmdGVyIHJlc3VtZQorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzMi52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXh0cmFTdHJlYW1zID0gbU5ld1N0cmVhbU1hc2sgJiAofm1TdHJlYW1NYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYVN0cmVhbXMgJiBpbmRleFRvVHlwZShqKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPnF1ZXVlQWNjZXNzVW5pdChjcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoLypzd2FwKi8gZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMTIyNywxNCArMTUxOSwxNiBAQAogICAgICAgICAgICAgICAgIHNvdXJjZXNba0F1ZGlvSW5kZXhdLAogICAgICAgICAgICAgICAgIHNvdXJjZXNba1ZpZGVvSW5kZXhdLAogICAgICAgICAgICAgICAgIHNvdXJjZXNba1N1YnRpdGxlSW5kZXhdLAotICAgICAgICAgICAgICAgIHRpbWVVcywKLSAgICAgICAgICAgICAgICBsYXRlc3RUaW1lVXMgLyogbWluIHN0YXJ0IHRpbWUodXMpICovLAotICAgICAgICAgICAgICAgIGxhdGVzdFNlcSA+PSAwID8gbGF0ZXN0U2VxICsgMSA6IC0xIC8qIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciBoaW50ICovICk7CisgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgPCAwID8gbUxhc3RTZWVrVGltZVVzIDogc3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzLAorICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlTZXEsCisgICAgICAgICAgICAgICAgc3dpdGNoaW5nKTsKICAgICB9CiAKICAgICAvLyBBbGwgZmV0Y2hlcnMgaGF2ZSBub3cgYmVlbiBzdGFydGVkLCB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2UKICAgICAvLyBoYXMgY29tcGxldGVkLgogCisgICAgY2FuY2VsQ2hlY2tCYW5kd2lkdGhFdmVudCgpOwogICAgIHNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCgpOwogCiAgICAgQUxPR1YoIlhYWCBjb25maWd1cmF0aW9uIGNoYW5nZSBjb21wbGV0ZWQuIik7CkBAIC0xMjU5LDggKzE1NTMsMTcgQEAKIAogICAgIGludDMyX3Qgc3RyZWFtOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW0iLCAmc3RyZWFtKSk7Ci0gICAgbVN3YXBNYXNrIHw9IHN0cmVhbTsKLSAgICBpZiAobVN3YXBNYXNrICE9IG1TdHJlYW1NYXNrKSB7CisKKyAgICBzc2l6ZV90IGlkeCA9IHR5cGVUb0luZGV4KHN0cmVhbSk7CisgICAgQ0hFQ0soaWR4ID49IDApOworICAgIGlmICgobU5ld1N0cmVhbU1hc2sgJiBzdHJlYW0pICYmIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJzd2FwcGluZyBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLCBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICB9CisgICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOworICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOworCisgICAgbVN3YXBNYXNrICY9IH5zdHJlYW07CisgICAgaWYgKG1Td2FwTWFzayAhPSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEyNzAsMTUgKzE1NzMsNjUgQEAKICAgICAgICAgU3RyZWFtVHlwZSBleHRyYVN0cmVhbSA9IChTdHJlYW1UeXBlKSAoZXh0cmFTdHJlYW1zICYgfihleHRyYVN0cmVhbXMgLSAxKSk7CiAgICAgICAgIHN3YXBQYWNrZXRTb3VyY2UoZXh0cmFTdHJlYW0pOwogICAgICAgICBleHRyYVN0cmVhbXMgJj0gfmV4dHJhU3RyZWFtOworCisgICAgICAgIGlkeCA9IHR5cGVUb0luZGV4KGV4dHJhU3RyZWFtKTsKKyAgICAgICAgQ0hFQ0soaWR4ID49IDApOworICAgICAgICBpZiAobVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBleHRyYSBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICBleHRyYVN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKKyAgICAgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CiAgICAgfQogCiAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKIH0KIAordm9pZCBMaXZlU2Vzc2lvbjo6b25DaGVja1N3aXRjaERvd24oKSB7CisgICAgaWYgKG1Td2l0Y2hEb3duTW9uaXRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvbjsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaSkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IHBhY2tldFNvdXJjZS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CisKKyAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCAmJiBtZXRhLT5maW5kSW50MzIoInRhcmdldER1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uKSApIHsKKyAgICAgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gcGFja2V0U291cmNlLT5nZXRFc3RpbWF0ZWREdXJhdGlvblVzKCk7CisgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvbiAqIDEwMDAwMDBsbDsKKworICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IHRhcmdldER1cmF0aW9uVXMgLyAzKSB7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN3aXRjaERvd24sIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbVN3aXRjaERvd25Nb25pdG9yLT5wb3N0KDEwMDAwMDBsbCk7Cit9CisKK3ZvaWQgTGl2ZVNlc3Npb246Om9uU3dpdGNoRG93bigpIHsKKyAgICBpZiAobVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MgfHwgbVN3aXRjaEluUHJvZ3Jlc3MgfHwgbUN1ckJhbmR3aWR0aEluZGV4ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNzaXplX3QgYmFuZHdpZHRoSW5kZXggPSBnZXRCYW5kd2lkdGhJbmRleCgpOworICAgIGlmIChiYW5kd2lkdGhJbmRleCA8IG1DdXJCYW5kd2lkdGhJbmRleCkgeworICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xLCBiYW5kd2lkdGhJbmRleCwgZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMSwgbUN1ckJhbmR3aWR0aEluZGV4IC0gMSwgZmFsc2UpOworfQorCiAvLyBNYXJrIHN3aXRjaCBkb25lIHdoZW46Ci0vLyAgIDEuIGFsbCBvbGQgYnVmZmVycyBhcmUgc3dhcHBlZCBvdXQsIEFORAotLy8gICAyLiBhbGwgb2xkIGZldGNoZXJzIGFyZSByZW1vdmVkLgorLy8gICAxLiBhbGwgb2xkIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgb3V0CiB2b2lkIExpdmVTZXNzaW9uOjp0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpIHsKKyAgICBpZiAoIW1Td2l0Y2hJblByb2dyZXNzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBib29sIG5lZWRUb1JlbW92ZUZldGNoZXJzID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGlmIChtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubVRvQmVSZW1vdmVkKSB7CkBAIC0xMjg2LDEwICsxNjM5LDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIW5lZWRUb1JlbW92ZUZldGNoZXJzICYmIG1Td2FwTWFzayA9PSBtU3RyZWFtTWFzaykgeworCisgICAgaWYgKCFuZWVkVG9SZW1vdmVGZXRjaGVycyAmJiBtU3dhcE1hc2sgPT0gMCkgeworICAgICAgICBBTE9HSSgibVN3aXRjaEluUHJvZ3Jlc3MgPSBmYWxzZSIpOwogICAgICAgICBtU3RyZWFtTWFzayA9IG1OZXdTdHJlYW1NYXNrOwogICAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICBtU3dhcE1hc2sgPSAwOwogICAgIH0KIH0KIApAQCAtMTMwOCw2ICsxNjYyLDI4IEBACiAgICAgbVN3aXRjaEdlbmVyYXRpb24rKzsKICAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgIG1Td2FwTWFzayA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRmV0Y2hlckluZm8mIGluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5mby5tVG9CZVJlbW92ZWQpIHsKKyAgICAgICAgICAgIGluZm8ubVRvQmVSZW1vdmVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKCFtU3RyZWFtc1tpXS5tTmV3VXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHNzaXplX3QgaiA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleShtU3RyZWFtc1tpXS5tTmV3VXJpKTsKKyAgICAgICAgICAgIGlmIChqIDwgMCkgeworICAgICAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1OZXdVcmkuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaik7CisgICAgICAgICAgICBpbmZvLm1GZXRjaGVyLT5zdG9wQXN5bmMoKTsKKyAgICAgICAgICAgIG1GZXRjaGVySW5mb3MucmVtb3ZlSXRlbXNBdChqKTsKKyAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1OZXdVcmkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogYm9vbCBMaXZlU2Vzc2lvbjo6Y2FuU3dpdGNoQmFuZHdpZHRoVG8oc2l6ZV90IGJhbmR3aWR0aEluZGV4KSB7CkBAIC0xMzE1LDMzICsxNjkxLDI5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAobVByZXZCYW5kd2lkdGhJbmRleCA8IDApIHsKKyAgICBpZiAobUN1ckJhbmR3aWR0aEluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBpZiAoYmFuZHdpZHRoSW5kZXggPT0gKHNpemVfdCltUHJldkJhbmR3aWR0aEluZGV4KSB7CisgICAgaWYgKGJhbmR3aWR0aEluZGV4ID09IChzaXplX3QpbUN1ckJhbmR3aWR0aEluZGV4KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aEluZGV4ID4gKHNpemVfdCltUHJldkJhbmR3aWR0aEluZGV4KSB7CisgICAgfSBlbHNlIGlmIChiYW5kd2lkdGhJbmRleCA+IChzaXplX3QpbUN1ckJhbmR3aWR0aEluZGV4KSB7CiAgICAgICAgIHJldHVybiBjYW5Td2l0Y2hVcCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KIAotdm9pZCBMaXZlU2Vzc2lvbjo6b25DaGVja0JhbmR3aWR0aCgpIHsKK3ZvaWQgTGl2ZVNlc3Npb246Om9uQ2hlY2tCYW5kd2lkdGgoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzaXplX3QgYmFuZHdpZHRoSW5kZXggPSBnZXRCYW5kd2lkdGhJbmRleCgpOwogICAgIGlmIChjYW5Td2l0Y2hCYW5kd2lkdGhUbyhiYW5kd2lkdGhJbmRleCkpIHsKICAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgYmFuZHdpZHRoSW5kZXgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCgpOworICAgICAgICAvLyBDb21lIGJhY2sgYW5kIGNoZWNrIGFnYWluIDEwIHNlY29uZHMgbGF0ZXIgaW4gY2FzZSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4KKyAgICAgICAgLy8gSWYgd2UgRE8gY2hhbmdlIGNvbmZpZ3VyYXRpb24sIG9uY2UgdGhhdCBjb21wbGV0ZXMgaXQnbGwgc2NoZWR1bGUgYSBuZXcKKyAgICAgICAgLy8gY2hlY2sgYmFuZHdpZHRoIGV2ZW50IHdpdGggYW4gaW5jcmVtZW50ZWQgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbi4KKyAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDAwbGwpOwogICAgIH0KLQotICAgIC8vIEhhbmRsaW5nIHRoZSBrV2hhdENoZWNrQmFuZHdpZHRoIGV2ZW4gaGVyZSBkb2VzIF9ub3RfIGF1dG9tYXRpY2FsbHkKLSAgICAvLyBzY2hlZHVsZSBhbm90aGVyIG9uZSBvbiByZXR1cm4sIG9ubHkgYW4gZXhwbGljaXQgY2FsbCB0bwotICAgIC8vIHNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCB3aWxsIGRvIHRoYXQuCi0gICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgb25seSBvbmUgY29uZmlndXJhdGlvbiBjaGFuZ2UgaXMgb25nb2luZyBhdCBhbnkKLSAgICAvLyBvbmUgdGltZSwgb25jZSB0aGF0IGNvbXBsZXRlcyBpdCdsbCBzY2hlZHVsZSBhbm90aGVyIGNoZWNrIGJhbmR3aWR0aAotICAgIC8vIGV2ZW50LgogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpwb3N0UHJlcGFyZWQoc3RhdHVzX3QgZXJyKSB7CkBAIC0xMzU4LDYgKzE3MzAsOSBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA9IGZhbHNlOworCisgICAgbVN3aXRjaERvd25Nb25pdG9yID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hlY2tTd2l0Y2hEb3duLCBpZCgpKTsKKyAgICBtU3dpdGNoRG93bk1vbml0b3ItPnBvc3QoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCmluZGV4IDNmOGZlZTUuLjdhYWNjYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaApAQCAtMjgsNiArMjgsNyBAQAogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKIHN0cnVjdCBIVFRQQmFzZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBMaXZlRGF0YVNvdXJjZTsKIHN0cnVjdCBNM1VQYXJzZXI7CiBzdHJ1Y3QgUGxheWxpc3RGZXRjaGVyOwpAQCAtNDAsNyArNDEsOCBAQAogICAgIH07CiAgICAgTGl2ZVNlc3Npb24oCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCwgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLCB1aWRfdCB1aWQgPSAwKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICBlbnVtIFN0cmVhbUluZGV4IHsKICAgICAgICAga0F1ZGlvSW5kZXggICAgPSAwLApAQCAtNjgsNyArNzAsOCBAQAogICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVVcyk7CiAKICAgICBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSBjb25zdDsKLSAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsICpyZXBseSkgY29uc3Q7CisgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKIAogICAgIGJvb2wgaXNTZWVrYWJsZSgpIGNvbnN0OwpAQCAtMTA1LDYgKzEwOCw4IEBACiAgICAgICAgIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMgICAgICAgPSAnY2hDMycsCiAgICAgICAgIGtXaGF0RmluaXNoRGlzY29ubmVjdDIgICAgICAgICAgPSAnZmluMicsCiAgICAgICAgIGtXaGF0U3dhcHBlZCAgICAgICAgICAgICAgICAgICAgPSAnc3dhcCcsCisgICAgICAgIGtXaGF0Q2hlY2tTd2l0Y2hEb3duICAgICAgICAgICAgPSAnY2tTRCcsCisgICAgICAgIGtXaGF0U3dpdGNoRG93biAgICAgICAgICAgICAgICAgPSAnc0R3bicsCiAgICAgfTsKIAogICAgIHN0cnVjdCBCYW5kd2lkdGhJdGVtIHsKQEAgLTEyMSw5ICsxMjYsMjAgQEAKIAogICAgIHN0cnVjdCBTdHJlYW1JdGVtIHsKICAgICAgICAgY29uc3QgY2hhciAqbVR5cGU7Ci0gICAgICAgIEFTdHJpbmcgbVVyaTsKLSAgICAgICAgU3RyZWFtSXRlbSgpIDogbVR5cGUoIiIpIHt9Ci0gICAgICAgIFN0cmVhbUl0ZW0oY29uc3QgY2hhciAqdHlwZSkgOiBtVHlwZSh0eXBlKSB7fQorICAgICAgICBBU3RyaW5nIG1VcmksIG1OZXdVcmk7CisgICAgICAgIHNpemVfdCBtQ3VyRGlzY29udGludWl0eVNlcTsKKyAgICAgICAgaW50NjRfdCBtTGFzdERlcXVldWVkVGltZVVzOworICAgICAgICBpbnQ2NF90IG1MYXN0U2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgU3RyZWFtSXRlbSgpCisgICAgICAgICAgICA6IG1UeXBlKCIiKSwKKyAgICAgICAgICAgICAgbUN1ckRpc2NvbnRpbnVpdHlTZXEoMCksCisgICAgICAgICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMCksCisgICAgICAgICAgICAgIG1MYXN0U2FtcGxlRHVyYXRpb25VcygwKSB7fQorICAgICAgICBTdHJlYW1JdGVtKGNvbnN0IGNoYXIgKnR5cGUpCisgICAgICAgICAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSgwKSwKKyAgICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwKSwKKyAgICAgICAgICAgICAgbUxhc3RTYW1wbGVEdXJhdGlvblVzKDApIHt9CiAgICAgICAgIEFTdHJpbmcgdXJpS2V5KCkgewogICAgICAgICAgICAgQVN0cmluZyBrZXkobVR5cGUpOwogICAgICAgICAgICAga2V5LmFwcGVuZCgiVVJJIik7CkBAIC0xMzQsMTAgKzE1MCwxMCBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgdWludDMyX3QgbUZsYWdzOwotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7CisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKIAogICAgIGJvb2wgbUluUHJlcGFyYXRpb25QaGFzZTsKKyAgICBib29sIG1CdWZmZXJpbmdba01heFN0cmVhbXNdOwogCiAgICAgc3A8SFRUUEJhc2U+IG1IVFRQRGF0YVNvdXJjZTsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOwpAQCAtMTQ1LDcgKzE2MSw3IEBACiAgICAgQVN0cmluZyBtTWFzdGVyVVJMOwogCiAgICAgVmVjdG9yPEJhbmR3aWR0aEl0ZW0+IG1CYW5kd2lkdGhJdGVtczsKLSAgICBzc2l6ZV90IG1QcmV2QmFuZHdpZHRoSW5kZXg7CisgICAgc3NpemVfdCBtQ3VyQmFuZHdpZHRoSW5kZXg7CiAKICAgICBzcDxNM1VQYXJzZXI+IG1QbGF5bGlzdDsKIApAQCAtMTYxLDYgKzE3Nyw3IEBACiAgICAgLy8gd2UgdXNlIHRoaXMgdG8gdHJhY2sgcmVjb25maWd1cmF0aW9uIHByb2dyZXNzLgogICAgIHVpbnQzMl90IG1Td2FwTWFzazsKIAorICAgIEtleWVkVmVjdG9yPFN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbURpc2NvbnRpbnVpdGllczsKICAgICBLZXllZFZlY3RvcjxTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1QYWNrZXRTb3VyY2VzOwogICAgIC8vIEEgc2Vjb25kIHNldCBvZiBwYWNrZXQgc291cmNlcyB0aGF0IGJ1ZmZlciBjb250ZW50IGZvciB0aGUgdmFyaWFudCB3ZSdyZSBzd2l0Y2hpbmcgdG8uCiAgICAgS2V5ZWRWZWN0b3I8U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtUGFja2V0U291cmNlczI7CkBAIC0xNzIsNiArMTg5LDcgQEAKIAogICAgIGludDMyX3QgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1Td2l0Y2hHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVN1YnRpdGxlR2VuZXJhdGlvbjsKIAogICAgIHNpemVfdCBtQ29udGludWF0aW9uQ291bnRlcjsKICAgICBzcDxBTWVzc2FnZT4gbUNvbnRpbnVhdGlvbjsKQEAgLTE4NSw2ICsyMDMsMTMgQEAKICAgICB1aW50MzJfdCBtRGlzY29ubmVjdFJlcGx5SUQ7CiAgICAgdWludDMyX3QgbVNlZWtSZXBseUlEOwogCisgICAgYm9vbCBtRmlyc3RUaW1lVXNWYWxpZDsKKyAgICBpbnQ2NF90IG1GaXJzdFRpbWVVczsKKyAgICBpbnQ2NF90IG1MYXN0U2Vla1RpbWVVczsKKyAgICBzcDxBTWVzc2FnZT4gbVN3aXRjaERvd25Nb25pdG9yOworICAgIEtleWVkVmVjdG9yPHNpemVfdCwgaW50NjRfdD4gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXM7CisgICAgS2V5ZWRWZWN0b3I8c2l6ZV90LCBpbnQ2NF90PiBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXM7CisKICAgICBzcDxQbGF5bGlzdEZldGNoZXI+IGFkZEZldGNoZXIoY29uc3QgY2hhciAqdXJpKTsKIAogICAgIHZvaWQgb25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTIxNiw5ICsyNDEsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgdWludDhfdCAqY3VyUGxheWxpc3RIYXNoLCBib29sICp1bmNoYW5nZWQpOwogCiAgICAgc2l6ZV90IGdldEJhbmR3aWR0aEluZGV4KCk7CisgICAgaW50NjRfdCBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpOwogCiAgICAgc3RhdGljIGludCBTb3J0QnlCYW5kd2lkdGgoY29uc3QgQmFuZHdpZHRoSXRlbSAqLCBjb25zdCBCYW5kd2lkdGhJdGVtICopOwogICAgIHN0YXRpYyBTdHJlYW1UeXBlIGluZGV4VG9UeXBlKGludCBpZHgpOworICAgIHN0YXRpYyBzc2l6ZV90IHR5cGVUb0luZGV4KGludDMyX3QgdHlwZSk7CiAKICAgICB2b2lkIGNoYW5nZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgc2l6ZV90IGJhbmR3aWR0aEluZGV4LCBib29sIHBpY2tUcmFjayA9IGZhbHNlKTsKQEAgLTIyNiw2ICsyNTMsOCBAQAogICAgIHZvaWQgb25DaGFuZ2VDb25maWd1cmF0aW9uMihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24zKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uU3dhcHBlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkNoZWNrU3dpdGNoRG93bigpOworICAgIHZvaWQgb25Td2l0Y2hEb3duKCk7CiAgICAgdm9pZCB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOwogCiAgICAgdm9pZCBzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQoKTsKQEAgLTIzNyw3ICsyNjYsNyBAQAogICAgIHZvaWQgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKCk7CiAKICAgICBib29sIGNhblN3aXRjaEJhbmR3aWR0aFRvKHNpemVfdCBiYW5kd2lkdGhJbmRleCk7Ci0gICAgdm9pZCBvbkNoZWNrQmFuZHdpZHRoKCk7CisgICAgdm9pZCBvbkNoZWNrQmFuZHdpZHRoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHZvaWQgZmluaXNoRGlzY29ubmVjdCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCBlMzFhZDQwLi4xNjUxZGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgpAQCAtNTgsOCArNTksOCBAQAogCiAgICAgdm9pZCBwaWNrUmFuZG9tTWVkaWFJdGVtcygpOwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOwotICAgIHZvaWQgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OwogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhR3JvdXAoKTsKQEAgLTEyNiw3ICsxMjcsNyBAQAogICAgICAgICAgICAgICAgIG1TZWxlY3RlZEluZGV4ID0gc3RydG91bCh2YWx1ZSwgJmVuZCwgMTApOwogICAgICAgICAgICAgICAgIENIRUNLKGVuZCA+IHZhbHVlICYmICplbmQgPT0gJ1wwJyk7CiAKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggPj0gbU1lZGlhSXRlbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ID49IChzc2l6ZV90KW1NZWRpYUl0ZW1zLnNpemUoKSkgewogICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRJbmRleCA9IG1NZWRpYUl0ZW1zLnNpemUoKSAtIDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE1Niw2NSArMTU3LDcyIEBACiB9CiAKIHN0YXR1c190IE0zVVBhcnNlcjo6TWVkaWFHcm91cDo6c2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCkgewotICAgIGlmIChtVHlwZSAhPSBUWVBFX1NVQlMpIHsKLSAgICAgICAgQUxPR0UoIm9ubHkgc2VsZWN0IHN1YnRpdGlsZSB0cmFja3MgZm9yIG5vdyEiKTsKKyAgICBpZiAobVR5cGUgIT0gVFlQRV9TVUJTICYmIG1UeXBlICE9IFRZUEVfQVVESU8pIHsKKyAgICAgICAgQUxPR0UoIm9ubHkgc2VsZWN0IHN1YnRpdGlsZS9hdWRpbyB0cmFja3MgZm9yIG5vdyEiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIGlmIChzZWxlY3QpIHsKICAgICAgICAgaWYgKGluZGV4ID49IG1NZWRpYUl0ZW1zLnNpemUoKSkgewotICAgICAgICAgICAgQUxPR0UoInRyYWNrICVkIGRvZXMgbm90IGV4aXN0IiwgaW5kZXgpOworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBkb2VzIG5vdCBleGlzdCIsIGluZGV4KTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQotICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggPT0gaW5kZXgpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlZCBhbHJlYWR5IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggPT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgYWxyZWFkeSBzZWxlY3RlZCIsIGluZGV4KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoInNlbGVjdGVkIHRyYWNrICVkIiwgaW5kZXgpOworICAgICAgICBBTE9HVigic2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOwogICAgICAgICBtU2VsZWN0ZWRJbmRleCA9IGluZGV4OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCAhPSBpbmRleCkgewotICAgICAgICAgICAgQUxPR0UoInRyYWNrICVkIGlzIG5vdCBzZWxlY3RlZCIsIGluZGV4KTsKKyAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ICE9IChzc2l6ZV90KWluZGV4KSB7CisgICAgICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGlzIG5vdCBzZWxlY3RlZCIsIGluZGV4KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoInVuc2VsZWN0ZWQgdHJhY2sgJWQiLCBpbmRleCk7CisgICAgICAgIEFMT0dWKCJ1bnNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKICAgICAgICAgbVNlbGVjdGVkSW5kZXggPSAtMTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhSXRlbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMik7IC8vIDIgZmllbGRzCi0KLSAgICAgICAgaWYgKG1UeXBlID09IFRZUEVfQVVESU8pIHsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE1FRElBX1RSQUNLX1RZUEVfQVVESU8pOwotICAgICAgICB9IGVsc2UgaWYgKG1UeXBlID09IFRZUEVfVklERU8pIHsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE1FRElBX1RSQUNLX1RZUEVfVklERU8pOwotICAgICAgICB9IGVsc2UgaWYgKG1UeXBlID09IFRZUEVfU1VCUykgewotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihNRURJQV9UUkFDS19UWVBFX1VOS05PV04pOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgTWVkaWEgJml0ZW0gPSBtTWVkaWFJdGVtcy5pdGVtQXQoaSk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmxhbmcgPSBpdGVtLm1MYW5ndWFnZS5lbXB0eSgpID8gInVuZCIgOiBpdGVtLm1MYW5ndWFnZS5jX3N0cigpOwotICAgICAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihsYW5nKSk7Ci0KLSAgICAgICAgaWYgKG1UeXBlID09IFRZUEVfU1VCUykgewotICAgICAgICAgICAgLy8gVE8tRE86IHBhc3MgaW4gYSBNZWRpYUZvcm1hdCBpbnN0ZWFkCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMighIShpdGVtLm1GbGFncyAmIE1lZGlhR3JvdXA6OkZMQUdfQVVUT1NFTEVDVCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0RFRkFVTFQpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19GT1JDRUQpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc2l6ZV90IE0zVVBhcnNlcjo6TWVkaWFHcm91cDo6Y291bnRUcmFja3MoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1NZWRpYUl0ZW1zLnNpemUoKTsKIH0KIAorc3A8QU1lc3NhZ2U+IE0zVVBhcnNlcjo6TWVkaWFHcm91cDo6Z2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmIChpbmRleCA+PSBtTWVkaWFJdGVtcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworCisgICAgaW50MzJfdCB0cmFja1R5cGU7CisgICAgaWYgKG1UeXBlID09IFRZUEVfQVVESU8pIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICB9IGVsc2UgaWYgKG1UeXBlID09IFRZUEVfVklERU8pIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTzsKKyAgICB9IGVsc2UgaWYgKG1UeXBlID09IFRZUEVfU1VCUykgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTjsKKyAgICB9CisgICAgZm9ybWF0LT5zZXRJbnQzMigidHlwZSIsIHRyYWNrVHlwZSk7CisKKyAgICBjb25zdCBNZWRpYSAmaXRlbSA9IG1NZWRpYUl0ZW1zLml0ZW1BdChpbmRleCk7CisgICAgY29uc3QgY2hhciAqbGFuZyA9IGl0ZW0ubUxhbmd1YWdlLmVtcHR5KCkgPyAidW5kIiA6IGl0ZW0ubUxhbmd1YWdlLmNfc3RyKCk7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgbGFuZyk7CisKKyAgICBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7CisgICAgICAgIC8vIFRPLURPOiBwYXNzIGluIGEgTWVkaWFGb3JtYXQgaW5zdGVhZAorICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1RFWFRfVlRUKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsICEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19BVVRPU0VMRUNUKSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImRlZmF1bHQiLCAhIShpdGVtLm1GbGFncyAmIE1lZGlhR3JvdXA6OkZMQUdfREVGQVVMVCkpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJmb3JjZWQiLCAhIShpdGVtLm1GbGFncyAmIE1lZGlhR3JvdXA6OkZMQUdfRk9SQ0VEKSk7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKwogYm9vbCBNM1VQYXJzZXI6Ok1lZGlhR3JvdXA6OmdldEFjdGl2ZVVSSShBU3RyaW5nICp1cmkpIGNvbnN0IHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUl0ZW1zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCA+PSAwICYmIGkgPT0gKHNpemVfdCltU2VsZWN0ZWRJbmRleCkgewpAQCAtMjM4LDYgKzI0Niw3IEBACiAgICAgICBtSXNWYXJpYW50UGxheWxpc3QoZmFsc2UpLAogICAgICAgbUlzQ29tcGxldGUoZmFsc2UpLAogICAgICAgbUlzRXZlbnQoZmFsc2UpLAorICAgICAgbURpc2NvbnRpbnVpdHlTZXEoMCksCiAgICAgICBtU2VsZWN0ZWRJbmRleCgtMSkgewogICAgIG1Jbml0Q2hlY2sgPSBwYXJzZShkYXRhLCBzaXplKTsKIH0KQEAgLTI2NSw2ICsyNzQsMTAgQEAKICAgICByZXR1cm4gbUlzRXZlbnQ7CiB9CiAKK3NpemVfdCBNM1VQYXJzZXI6OmdldERpc2NvbnRpbnVpdHlTZXEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EaXNjb250aW51aXR5U2VxOworfQorCiBzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjptZXRhKCkgewogICAgIHJldHVybiBtTWV0YTsKIH0KQEAgLTMxOSwxNyArMzMyLDI0IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBNM1VQYXJzZXI6OmdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7CitzaXplX3QgTTNVUGFyc2VyOjpnZXRUcmFja0NvdW50KCkgY29uc3QgewogICAgIHNpemVfdCB0cmFja0NvdW50ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUdyb3Vwcy5zaXplKCk7ICsraSkgewogICAgICAgICB0cmFja0NvdW50ICs9IG1NZWRpYUdyb3Vwcy52YWx1ZUF0KGkpLT5jb3VudFRyYWNrcygpOwogICAgIH0KLSAgICByZXBseS0+d3JpdGVJbnQzMih0cmFja0NvdW50KTsKKyAgICByZXR1cm4gdHJhY2tDb3VudDsKK30KIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhR3JvdXBzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG1NZWRpYUdyb3Vwcy52YWx1ZUF0KGkpLT5nZXRUcmFja0luZm8ocmVwbHkpOworc3A8QU1lc3NhZ2U+IE0zVVBhcnNlcjo6Z2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBpaSA9IGluZGV4OyBpIDwgbU1lZGlhR3JvdXBzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPE1lZGlhR3JvdXA+IGdyb3VwID0gbU1lZGlhR3JvdXBzLnZhbHVlQXQoaSk7CisgICAgICAgIHNpemVfdCB0cmFja3MgPSBncm91cC0+Y291bnRUcmFja3MoKTsKKyAgICAgICAgaWYgKGlpIDwgdHJhY2tzKSB7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXAtPmdldFRyYWNrSW5mbyhpaSk7CisgICAgICAgIH0KKyAgICAgICAgaWkgLT0gdHJhY2tzOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHNzaXplX3QgTTNVUGFyc2VyOjpnZXRTZWxlY3RlZEluZGV4KCkgY29uc3QgewpAQCAtMzk4LDYgKzQxOCw4IEBACiAgICAgICAgIC8vIEJhc2UgVVJMIG11c3QgYmUgYWJzb2x1dGUKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBjb25zdCBzaXplX3Qgc2NoZW1lRW5kID0gKHN0cnN0cihiYXNlVVJMLCAiLy8iKSAtIGJhc2VVUkwpICsgMjsKKyAgICBDSEVDSyhzY2hlbWVFbmQgPT0gNyB8fCBzY2hlbWVFbmQgPT0gOCk7CiAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJsLCA3KSB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJsLCA4KSkgewogICAgICAgICAvLyAidXJsIiBpcyBhbHJlYWR5IGFuIGFic29sdXRlIFVSTCwgaWdub3JlIGJhc2UgVVJMLgpAQCAtNDQyLDcgKzQ2NCw3IEBACiAKICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZm91bmQgc2xhc2ggYWN0dWFsbHkgaXMgcGFydCBvZiB0aGUgcGF0aAogICAgICAgICAvLyBhbmQgbm90IHBhcnQgb2YgdGhlICJodHRwOi8vIi4KLSAgICAgICAgaWYgKGVuZCA+IDYpIHsKKyAgICAgICAgaWYgKGVuZCA+PSBzY2hlbWVFbmQpIHsKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgZW5kKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CkBAIC01NTAsNiArNTcyLDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1NRURJQSIpKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VNZWRpYShsaW5lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRSIpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNlcTsKKyAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZURpc2NvbnRpbnVpdHlTZXF1ZW5jZShsaW5lLCAmc2VxKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1EaXNjb250aW51aXR5U2VxID0gc2VxOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtNzEzLDYgKzc0MSw5IEBACiAKICAgICAgICAgICAgIGtleS50b2xvd2VyKCk7CiAgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZjb2RlY3MgPSB1bnF1b3RlU3RyaW5nKHZhbCk7CisgICAgICAgICAgICBpZiAobWV0YS0+Z2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICptZXRhID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgKCptZXRhKS0+c2V0U3RyaW5nKGtleS5jX3N0cigpLCBjb2RlY3MuY19zdHIoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoImF1ZGlvIiwga2V5LmNfc3RyKCkpCiAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoInZpZGVvIiwga2V5LmNfc3RyKCkpCkBAIC03MzYsNiArNzY3LDkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKKyAgICAgICAgICAgIGlmIChtZXRhLT5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAoKm1ldGEpLT5zZXRTdHJpbmcoa2V5LmNfc3RyKCksIGdyb3VwSUQuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC03OTgsOCArODMyLDggQEAKICAgICAgICAgICAgICAgICBpZiAoTWFrZVVSTChiYXNlVVJJLmNfc3RyKCksIHZhbC5jX3N0cigpLCAmYWJzVVJJKSkgewogICAgICAgICAgICAgICAgICAgICB2YWwgPSBhYnNVUkk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBtYWtlIGFic29sdXRlIHVybCBmb3IgJyVzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBtYWtlIGFic29sdXRlIHVybCBmb3IgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmlEZWJ1Z1N0cmluZyhiYXNlVVJJKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTEwODcsNiArMTEyMSwzMCBAQAogfQogCiAvLyBzdGF0aWMKK3N0YXR1c190IE0zVVBhcnNlcjo6cGFyc2VEaXNjb250aW51aXR5U2VxdWVuY2UoY29uc3QgQVN0cmluZyAmbGluZSwgc2l6ZV90ICpzZXEpIHsKKyAgICBzc2l6ZV90IGNvbG9uUG9zID0gbGluZS5maW5kKCI6Iik7CisKKyAgICBpZiAoY29sb25Qb3MgPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaW50MzJfdCB4OworICAgIHN0YXR1c190IGVyciA9IFBhcnNlSW50MzIobGluZS5jX3N0cigpICsgY29sb25Qb3MgKyAxLCAmeCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICh4IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChzZXEpIHsKKyAgICAgICAgKnNlcSA9IHg7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCiBzdGF0dXNfdCBNM1VQYXJzZXI6OlBhcnNlSW50MzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqeCkgewogICAgIGNoYXIgKmVuZDsKICAgICBsb25nIGx2YWwgPSBzdHJ0b2wocywgJmVuZCwgMTApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaAppbmRleCBjY2Q2NTU2Li5kNTg4YWZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaApAQCAtMzQsNiArMzQsNyBAQAogICAgIGJvb2wgaXNWYXJpYW50UGxheWxpc3QoKSBjb25zdDsKICAgICBib29sIGlzQ29tcGxldGUoKSBjb25zdDsKICAgICBib29sIGlzRXZlbnQoKSBjb25zdDsKKyAgICBzaXplX3QgZ2V0RGlzY29udGludWl0eVNlcSgpIGNvbnN0OwogCiAgICAgc3A8QU1lc3NhZ2U+IG1ldGEoKTsKIApAQCAtNDIsNyArNDMsOCBAQAogCiAgICAgdm9pZCBwaWNrUmFuZG9tTWVkaWFJdGVtcygpOwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOwotICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdDsKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICBzc2l6ZV90IGdldFNlbGVjdGVkSW5kZXgoKSBjb25zdDsKIAogICAgIGJvb2wgZ2V0VHlwZVVSSShzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdXJpKSBjb25zdDsKQEAgLTY1LDYgKzY3LDcgQEAKICAgICBib29sIG1Jc1ZhcmlhbnRQbGF5bGlzdDsKICAgICBib29sIG1Jc0NvbXBsZXRlOwogICAgIGJvb2wgbUlzRXZlbnQ7CisgICAgc2l6ZV90IG1EaXNjb250aW51aXR5U2VxOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1NZXRhOwogICAgIFZlY3RvcjxJdGVtPiBtSXRlbXM7CkBAIC05Myw2ICs5Niw4IEBACiAKICAgICBzdGF0dXNfdCBwYXJzZU1lZGlhKGNvbnN0IEFTdHJpbmcgJmxpbmUpOwogCisgICAgc3RhdGljIHN0YXR1c190IHBhcnNlRGlzY29udGludWl0eVNlcXVlbmNlKGNvbnN0IEFTdHJpbmcgJmxpbmUsIHNpemVfdCAqc2VxKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBQYXJzZUludDMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgKngpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBQYXJzZURvdWJsZShjb25zdCBjaGFyICpzLCBkb3VibGUgKngpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCA2NjhjYmQ0Li4zMGZhODY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KIApAQCAtNDgsMzEgKzQ5LDM2IEBACiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjprTWluQnVmZmVyZWREdXJhdGlvblVzID0gMTAwMDAwMDBsbDsKIGNvbnN0IGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjprTWF4TW9uaXRvckRlbGF5VXMgPSAzMDAwMDAwbGw7Ci1jb25zdCBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6a0Rvd25sb2FkQmxvY2tTaXplID0gMTkyOworY29uc3QgaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmtEb3dubG9hZEJsb2NrU2l6ZSA9IDIwNDg7CiBjb25zdCBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6a051bVNraXBGcmFtZXMgPSAxMDsKIAogUGxheWxpc3RGZXRjaGVyOjpQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICBjb25zdCBzcDxMaXZlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSkKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBpbnQzMl90IHN1YnRpdGxlR2VuZXJhdGlvbikKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1TdGFydFRpbWVVc05vdGlmeShub3RpZnktPmR1cCgpKSwKICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAogICAgICAgbVVSSSh1cmkpLAogICAgICAgbVN0cmVhbVR5cGVNYXNrKDApLAogICAgICAgbVN0YXJ0VGltZVVzKC0xbGwpLAotICAgICAgbU1pblN0YXJ0VGltZVVzKDBsbCksCi0gICAgICBtU3RvcFBhcmFtcyhOVUxMKSwKKyAgICAgIG1TZWdtZW50U3RhcnRUaW1lVXMoLTFsbCksCisgICAgICBtRGlzY29udGludWl0eVNlcSgtMWxsKSwKKyAgICAgIG1TdGFydFRpbWVVc1JlbGF0aXZlKGZhbHNlKSwKICAgICAgIG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcygtMWxsKSwKICAgICAgIG1TZXFOdW1iZXIoLTEpLAogICAgICAgbU51bVJldHJpZXMoMCksCiAgICAgICBtU3RhcnR1cCh0cnVlKSwKKyAgICAgIG1BZGFwdGl2ZShmYWxzZSksCiAgICAgICBtUHJlcGFyZWQoZmFsc2UpLAogICAgICAgbU5leHRQVFNUaW1lVXMoLTFsbCksCiAgICAgICBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbigwKSwKKyAgICAgIG1TdWJ0aXRsZUdlbmVyYXRpb24oc3VidGl0bGVHZW5lcmF0aW9uKSwKICAgICAgIG1SZWZyZXNoU3RhdGUoSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSksCiAgICAgICBtRmlyc3RQVFNWYWxpZChmYWxzZSksCi0gICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMoMGxsKSB7CisgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMoMGxsKSwKKyAgICAgIG1WaWRlb0J1ZmZlcihuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMKSkgewogICAgIG1lbXNldChtUGxheWxpc3RIYXNoLCAwLCBzaXplb2YobVBsYXlsaXN0SGFzaCkpOwogICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7CiAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIDApOwpAQCAtMzE2LDcgKzMyMiw3IEBACiAgICAgICAgIG1heERlbGF5VXMgPSBtaW5EZWxheVVzOwogICAgIH0KICAgICBpZiAoZGVsYXlVcyA+IG1heERlbGF5VXMpIHsKLSAgICAgICAgQUxPR1YoIk5lZWQgdG8gcmVmcmVzaCBwbGF5bGlzdCBpbiAlbGxkIiwgbWF4RGVsYXlVcyk7CisgICAgICAgIEFMT0dWKCJOZWVkIHRvIHJlZnJlc2ggcGxheWxpc3QgaW4gJSIgUFJJZDY0ICwgbWF4RGVsYXlVcyk7CiAgICAgICAgIGRlbGF5VXMgPSBtYXhEZWxheVVzOwogICAgIH0KICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TW9uaXRvclF1ZXVlLCBpZCgpKTsKQEAgLTMzMyw4ICszMzksOSBAQAogICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmdmlkZW9Tb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzdWJ0aXRsZVNvdXJjZSwKICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcywKLSAgICAgICAgaW50NjRfdCBtaW5TdGFydFRpbWVVcywKLSAgICAgICAgaW50MzJfdCBzdGFydFNlcU51bWJlckhpbnQpIHsKKyAgICAgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMsCisgICAgICAgIGludDMyX3Qgc3RhcnREaXNjb250aW51aXR5U2VxLAorICAgICAgICBib29sIGFkYXB0aXZlKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKIAogICAgIHVpbnQzMl90IHN0cmVhbVR5cGVNYXNrID0gMHVsOwpAQCAtMzU2LDggKzM2Myw5IEBACiAKICAgICBtc2ctPnNldEludDMyKCJzdHJlYW1UeXBlTWFzayIsIHN0cmVhbVR5cGVNYXNrKTsKICAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIHN0YXJ0VGltZVVzKTsKLSAgICBtc2ctPnNldEludDY0KCJtaW5TdGFydFRpbWVVcyIsIG1pblN0YXJ0VGltZVVzKTsKLSAgICBtc2ctPnNldEludDMyKCJzdGFydFNlcU51bWJlckhpbnQiLCBzdGFydFNlcU51bWJlckhpbnQpOworICAgIG1zZy0+c2V0SW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsIHNlZ21lbnRTdGFydFRpbWVVcyk7CisgICAgbXNnLT5zZXRJbnQzMigic3RhcnREaXNjb250aW51aXR5U2VxIiwgc3RhcnREaXNjb250aW51aXR5U2VxKTsKKyAgICBtc2ctPnNldEludDMyKCJhZGFwdGl2ZSIsIGFkYXB0aXZlKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtMzY1LDkgKzM3Myw5IEBACiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBpZCgpKSktPnBvc3QoKTsKIH0KIAotdm9pZCBQbGF5bGlzdEZldGNoZXI6OnN0b3BBc3luYyhib29sIHNlbGZUcmlnZ2VyZWQpIHsKK3ZvaWQgUGxheWxpc3RGZXRjaGVyOjpzdG9wQXN5bmMoYm9vbCBjbGVhcikgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKTsKLSAgICBtc2ctPnNldEludDMyKCJzZWxmVHJpZ2dlcmVkIiwgc2VsZlRyaWdnZXJlZCk7CisgICAgbXNnLT5zZXRJbnQzMigiY2xlYXIiLCBjbGVhcik7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTQ0NywxMCArNDU1LDEzIEBACiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0cmVhbVR5cGVNYXNrIiwgKGludDMyX3QgKikmc3RyZWFtVHlwZU1hc2spKTsKIAogICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7Ci0gICAgaW50MzJfdCBzdGFydFNlcU51bWJlckhpbnQ7CisgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXM7CisgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXE7CisgICAgaW50MzJfdCBhZGFwdGl2ZTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3RhcnRUaW1lVXMiLCAmc3RhcnRUaW1lVXMpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgibWluU3RhcnRUaW1lVXMiLCAoaW50NjRfdCAqKSAmbU1pblN0YXJ0VGltZVVzKSk7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0YXJ0U2VxTnVtYmVySGludCIsICZzdGFydFNlcU51bWJlckhpbnQpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJnNlZ21lbnRTdGFydFRpbWVVcykpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdGFydERpc2NvbnRpbnVpdHlTZXEiLCAmc3RhcnREaXNjb250aW51aXR5U2VxKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImFkYXB0aXZlIiwgJmFkYXB0aXZlKSk7CiAKICAgICBpZiAoc3RyZWFtVHlwZU1hc2sgJiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTykgewogICAgICAgICB2b2lkICpwdHI7CkBAIC00ODAsMTYgKzQ5MSwxNiBAQAogICAgIH0KIAogICAgIG1TdHJlYW1UeXBlTWFzayA9IHN0cmVhbVR5cGVNYXNrOwotICAgIG1TdGFydFRpbWVVcyA9IHN0YXJ0VGltZVVzOwogCi0gICAgaWYgKG1TdGFydFRpbWVVcyA+PSAwbGwpIHsKKyAgICBtU2VnbWVudFN0YXJ0VGltZVVzID0gc2VnbWVudFN0YXJ0VGltZVVzOworICAgIG1EaXNjb250aW51aXR5U2VxID0gc3RhcnREaXNjb250aW51aXR5U2VxOworCisgICAgaWYgKHN0YXJ0VGltZVVzID49IDApIHsKKyAgICAgICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lVXM7CiAgICAgICAgIG1TZXFOdW1iZXIgPSAtMTsKICAgICAgICAgbVN0YXJ0dXAgPSB0cnVlOwogICAgICAgICBtUHJlcGFyZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhcnRTZXFOdW1iZXJIaW50ID49IDApIHsKLSAgICAgICAgbVNlcU51bWJlciA9IHN0YXJ0U2VxTnVtYmVySGludDsKKyAgICAgICAgbUFkYXB0aXZlID0gYWRhcHRpdmU7CiAgICAgfQogCiAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOwpAQCAtNTA0LDExICs1MTUsOSBAQAogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uU3RvcChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGNhbmNlbE1vbml0b3JRdWV1ZSgpOwogCi0gICAgaW50MzJfdCBzZWxmVHJpZ2dlcmVkOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxmVHJpZ2dlcmVkIiwgJnNlbGZUcmlnZ2VyZWQpKTsKLSAgICBpZiAoIXNlbGZUcmlnZ2VyZWQpIHsKLSAgICAgICAgLy8gU2VsZiB0cmlnZ2VyZWQgc3RvcHMgb25seSBoYXBwZW4gZHVyaW5nIHN3aXRjaGluZywgaW4gd2hpY2ggY2FzZSB3ZSBkbyBub3Qgd2FudAotICAgICAgICAvLyB0byBjbGVhciB0aGUgZGlzY29udGludWl0aWVzIHF1ZXVlZCBhdCB0aGUgZW5kIG9mIHBhY2tldCBzb3VyY2VzLgorICAgIGludDMyX3QgY2xlYXI7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNsZWFyIiwgJmNsZWFyKSk7CisgICAgaWYgKGNsZWFyKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPmNsZWFyKCk7CkBAIC01NTAsMTUgKzU1OSwxNiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGlmIHdlIHdvdWxkIHN0b3Agd2l0aGluIGEgcmVzdW1lIHRocmVzaG9sZC4KKyAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxOwogICAgICAgICBpbnQ2NF90IGxhdGVzdFRpbWVVcyA9IDAsIHN0b3BUaW1lVXMgPSAwOwotICAgICAgICBzcDxBTWVzc2FnZT4gbGF0ZXN0TWV0YSA9IHBhY2tldFNvdXJjZS0+Z2V0TGF0ZXN0TWV0YSgpOworICAgICAgICBzcDxBTWVzc2FnZT4gbGF0ZXN0TWV0YSA9IHBhY2tldFNvdXJjZS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CiAgICAgICAgIGlmIChsYXRlc3RNZXRhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAmJiAobGF0ZXN0TWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbGF0ZXN0VGltZVVzKQotICAgICAgICAgICAgICAgICYmIHBhcmFtcy0+ZmluZEludDY0KHN0b3BLZXksICZzdG9wVGltZVVzKSkpIHsKLSAgICAgICAgICAgIGludDY0X3QgZGlmZlVzID0gc3RvcFRpbWVVcyAtIGxhdGVzdFRpbWVVczsKLSAgICAgICAgICAgIGlmIChkaWZmVXMgPCByZXN1bWVUaHJlc2hvbGQobGF0ZXN0TWV0YSkpIHsKLSAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAmJiBsYXRlc3RNZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmZGlzY29udGludWl0eVNlcSkKKyAgICAgICAgICAgICAgICAmJiBkaXNjb250aW51aXR5U2VxID09IG1EaXNjb250aW51aXR5U2VxCisgICAgICAgICAgICAgICAgJiYgbGF0ZXN0TWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbGF0ZXN0VGltZVVzKQorICAgICAgICAgICAgICAgICYmIHBhcmFtcy0+ZmluZEludDY0KHN0b3BLZXksICZzdG9wVGltZVVzKQorICAgICAgICAgICAgICAgICYmIHN0b3BUaW1lVXMgLSBsYXRlc3RUaW1lVXMgPCByZXN1bWVUaHJlc2hvbGQobGF0ZXN0TWV0YSkpIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC01NjYsNyArNTc2LDcgQEAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKS0+cXVldWVBY2Nlc3NVbml0KG1TZXNzaW9uLT5jcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoKSk7CiAgICAgICAgIH0KLSAgICAgICAgc3RvcEFzeW5jKC8qIHNlbGZUcmlnZ2VyZWQgPSAqLyB0cnVlKTsKKyAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi8gZmFsc2UpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC01ODYsNyArNTk2LDEwIEBACiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cXVldWVEaXNjb250aW51aXR5KAogICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPnF1ZXVlRGlzY29udGludWl0eSh0eXBlLCBleHRyYSk7CisgICAgICAgIC8vIGRvIG5vdCBkaXNjYXJkIGJ1ZmZlciB1cG9uICNFWFQtWC1ESVNDT05USU5VSVRZIHRhZworICAgICAgICAvLyAoc2VlayB3aWxsIGRpc2NhcmQgYnVmZmVyIGJ5IGFiYW5kb25pbmcgb2xkIGZldGNoZXJzKQorICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgdHlwZSwgZXh0cmEsIGZhbHNlIC8qIGRpc2NhcmQgKi8pOwogICAgIH0KIH0KIApAQCAtNjI3LDcgKzY0MCw3IEBACiAKICAgICAgICAgICAgIGludDY0X3QgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzID0KICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKLSAgICAgICAgICAgIEFMT0dWKCJidWZmZXJlZCAlbGxkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcmVkICUiIFBSSWQ2NCAiIGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMsIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKTsKICAgICAgICAgICAgIGlmIChidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPiBidWZmZXJlZER1cmF0aW9uVXMpIHsKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXM7CkBAIC02NDAsNyArNjUzLDcgQEAKICAgICBpZiAoIW1QcmVwYXJlZCAmJiBidWZmZXJlZER1cmF0aW9uVXMgPiB0YXJnZXREdXJhdGlvblVzICYmIGRvd25sb2FkTW9yZSkgewogICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOwogCi0gICAgICAgIEFMT0dWKCJwcmVwYXJlZCwgYnVmZmVyZWQ9JWxsZCA+ICVsbGQiLAorICAgICAgICBBTE9HVigicHJlcGFyZWQsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiID4gJSIgUFJJZDY0ICIiLAogICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcywgdGFyZ2V0RHVyYXRpb25Vcyk7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VGVtcG9yYXJpbHlEb25lRmV0Y2hpbmcpOwpAQCAtNjQ4LDcgKzY2MSw3IEBACiAgICAgfQogCiAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LICYmIGRvd25sb2FkTW9yZSkgewotICAgICAgICBBTE9HVigibW9uaXRvcmluZywgYnVmZmVyZWQ9JWxsZCA8ICVsbGQiLAorICAgICAgICBBTE9HVigibW9uaXRvcmluZywgYnVmZmVyZWQ9JSIgUFJJZDY0ICIgPCAlIiBQUklkNjQgIiIsCiAgICAgICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzLCBkdXJhdGlvblRvQnVmZmVyVXMpOwogICAgICAgICAvLyBkZWxheSB0aGUgbmV4dCBkb3dubG9hZCBzbGlnaHRseTsgaG9wZWZ1bGx5IHRoaXMgZ2l2ZXMgb3RoZXIgY29uY3VycmVudCBmZXRjaGVycwogICAgICAgICAvLyBhIGJldHRlciBjaGFuY2UgdG8gcnVuLgpAQCAtNjY0LDcgKzY3Nyw3IEBACiAgICAgICAgIG1zZy0+cG9zdCgpOwogCiAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IG1QcmVwYXJlZCA/IGtNYXhNb25pdG9yRGVsYXlVcyA6IHRhcmdldER1cmF0aW9uVXMgLyAyOwotICAgICAgICBBTE9HVigicGF1c2luZyBmb3IgJWxsZCwgYnVmZmVyZWQ9JWxsZCA+ICVsbGQiLAorICAgICAgICBBTE9HVigicGF1c2luZyBmb3IgJSIgUFJJZDY0ICIsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiID4gJSIgUFJJZDY0ICIiLAogICAgICAgICAgICAgICAgIGRlbGF5VXMsIGJ1ZmZlcmVkRHVyYXRpb25VcywgZHVyYXRpb25Ub0J1ZmZlclVzKTsKICAgICAgICAgLy8gOlRSSUNLWTogbmVlZCB0byBlbmZvcmNlIG1pbmltdW0gZGVsYXkgYmVjYXVzZSB0aGUgZGVsYXkgdG8KICAgICAgICAgLy8gcmVmcmVzaCB0aGUgcGxheWxpc3Qgd2lsbCBiZWNvbWUgMApAQCAtNzIxLDM4ICs3MzQsNTUgQEAKICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKICAgICB9CiAKLSAgICBib29sIHNlZWtEaXNjb250aW51aXR5ID0gZmFsc2U7Ci0gICAgYm9vbCBleHBsaWNpdERpc2NvbnRpbnVpdHkgPSBmYWxzZTsKKyAgICBib29sIGRpc2NvbnRpbnVpdHkgPSBmYWxzZTsKIAogICAgIGNvbnN0IGludDMyX3QgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPQogICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyAoaW50MzJfdCltUGxheWxpc3QtPnNpemUoKSAtIDE7CiAKLSAgICBpZiAobVN0YXJ0dXAgJiYgbVNlcU51bWJlciA+PSAwCi0gICAgICAgICAgICAmJiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCB8fCBtU2VxTnVtYmVyID4gbGFzdFNlcU51bWJlckluUGxheWxpc3QpKSB7Ci0gICAgICAgIC8vIGluIGNhc2Ugd2UgZ3Vlc3NlZCB3cm9uZyBkdXJpbmcgcmVjb25maWd1cmF0aW9uLCB0cnkgZmV0Y2hpbmcgdGhlIGxhdGVzdCBjb250ZW50LgotICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgaWYgKG1EaXNjb250aW51aXR5U2VxIDwgMCkgeworICAgICAgICBtRGlzY29udGludWl0eVNlcSA9IG1QbGF5bGlzdC0+Z2V0RGlzY29udGludWl0eVNlcSgpOwogICAgIH0KIAogICAgIGlmIChtU2VxTnVtYmVyIDwgMCkgewogICAgICAgICBDSEVDS19HRShtU3RhcnRUaW1lVXMsIDBsbCk7CiAKLSAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpIHx8IG1QbGF5bGlzdC0+aXNFdmVudCgpKSB7Ci0gICAgICAgICAgICBtU2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyRm9yVGltZShtU3RhcnRUaW1lVXMpOwotICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciB0aW1lICVsbGQgaXMgJWxkIGZyb20gKCVsZCAuLiAlbGQpIiwKKyAgICAgICAgaWYgKG1TZWdtZW50U3RhcnRUaW1lVXMgPCAwKSB7CisgICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpICYmICFtUGxheWxpc3QtPmlzRXZlbnQoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBsaXZlIHNlc3Npb24sIHN0YXJ0IDMgc2VnbWVudHMgZnJvbSB0aGUgZW5kIG9uIGNvbm5lY3QKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3QgLSAzOworICAgICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyRm9yVGltZShtU3RhcnRUaW1lVXMpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVcyAtPSBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhcnRUaW1lVXNSZWxhdGl2ZSA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIHRpbWUgJSIgUFJJZDY0ICIgaXMgJWQgZnJvbSAoJWQgLi4gJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzLCBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBsaXZlIHNlc3Npb24sIHN0YXJ0IDMgc2VnbWVudHMgZnJvbSB0aGUgZW5kLgotICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0IC0gMzsKKyAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TZWdtZW50U3RhcnRUaW1lVXMpOworICAgICAgICAgICAgaWYgKG1BZGFwdGl2ZSkgeworICAgICAgICAgICAgICAgIC8vIGF2b2lkIGRvdWJsZSBmZXRjaC9kZWNvZGUKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc2l6ZV90IG1pblNlcSA9IGdldFNlcU51bWJlckZvckRpc2NvbnRpbnVpdHkobURpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBtaW5TZXEpIHsKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbWluU2VxOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkgewogICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIGxpdmUgZXZlbnQgJWxkIGZyb20gKCVsZCAuLiAlbGQpIiwKKworICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPiBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkgeworICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgbGl2ZSBldmVudCAlZCBmcm9tICglZCAuLiAlZCkiLAogICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICAgICAgfQotCi0gICAgICAgIG1TdGFydFRpbWVVcyA9IC0xbGw7CiAgICAgfQogCiAgICAgaWYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QKQEAgLTc3MSw3ICs4MDEsOCBAQAogICAgICAgICAgICAgICAgIGlmIChkZWxheVVzID4ga01heE1vbml0b3JEZWxheVVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBrTWF4TW9uaXRvckRlbGF5VXM7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBudW1iZXIgaGlnaDogJWxkIGZyb20gKCVsZCAuLiAlbGQpLCBtb25pdG9yIGluICVsbGQgKHJldHJ5PSVkKSIsCisgICAgICAgICAgICAgICAgQUxPR1YoInNlcXVlbmNlIG51bWJlciBoaWdoOiAlZCBmcm9tICglZCAuLiAlZCksICIKKyAgICAgICAgICAgICAgICAgICAgICAibW9uaXRvciBpbiAlIiBQUklkNjQgIiAocmV0cnk9JWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBkZWxheVVzLCBtTnVtUmV0cmllcyk7CiAgICAgICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZShkZWxheVVzKTsKQEAgLTc4OSwxNCArODIwLDE0IEBACiAgICAgICAgICAgICBpZiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkgewogICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHBsaWNpdERpc2NvbnRpbnVpdHkgPSB0cnVlOworICAgICAgICAgICAgZGlzY29udGludWl0eSA9IHRydWU7CiAKICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIHNlcXVlbmNlIG51bWJlciAlZCBpbiBwbGF5bGlzdCAiCiAgICAgICAgICAgICAgICAgICIoY29udGFpbnMgJWQgLSAlZCkiLAogICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCi0gICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIG1QbGF5bGlzdC0+c2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyAoaW50MzJfdCltUGxheWxpc3QtPnNpemUoKSAtIDEpOwogCiAgICAgICAgICAgICBub3RpZnlFcnJvcihFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTgxNCw3ICs4NDUsOCBAQAogCiAgICAgaW50MzJfdCB2YWw7CiAgICAgaWYgKGl0ZW1NZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdmFsKSAmJiB2YWwgIT0gMCkgewotICAgICAgICBleHBsaWNpdERpc2NvbnRpbnVpdHkgPSB0cnVlOworICAgICAgICBtRGlzY29udGludWl0eVNlcSsrOworICAgICAgICBkaXNjb250aW51aXR5ID0gdHJ1ZTsKICAgICB9CiAKICAgICBpbnQ2NF90IHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoOwpAQCAtODQ1LDYgKzg3Nyw3IEBACiAgICAgfQogCiAgICAgLy8gYmxvY2std2lzZSBkb3dubG9hZAorICAgIGJvb2wgc3RhcnR1cCA9IG1TdGFydHVwOwogICAgIHNzaXplX3QgYnl0ZXNSZWFkOwogICAgIGRvIHsKICAgICAgICAgYnl0ZXNSZWFkID0gbVNlc3Npb24tPmZldGNoRmlsZSgKQEAgLTg3NCw3ICs5MDcsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1TdGFydHVwIHx8IHNlZWtEaXNjb250aW51aXR5IHx8IGV4cGxpY2l0RGlzY29udGludWl0eSkgeworICAgICAgICBpZiAoc3RhcnR1cCB8fCBkaXNjb250aW51aXR5KSB7CiAgICAgICAgICAgICAvLyBTaWduYWwgZGlzY29udGludWl0eS4KIAogICAgICAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpIHx8IG1QbGF5bGlzdC0+aXNFdmVudCgpKSB7CkBAIC04ODQsMTYgKzkxNywxNyBAQAogICAgICAgICAgICAgICAgIG1OZXh0UFRTVGltZVVzID0gZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoc2Vla0Rpc2NvbnRpbnVpdHkgfHwgZXhwbGljaXREaXNjb250aW51aXR5KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koInF1ZXVlaW5nIGRpc2NvbnRpbnVpdHkgKHNlZWs9JWQsIGV4cGxpY2l0PSVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBzZWVrRGlzY29udGludWl0eSwgZXhwbGljaXREaXNjb250aW51aXR5KTsKKyAgICAgICAgICAgIGlmIChkaXNjb250aW51aXR5KSB7CisgICAgICAgICAgICAgICAgQUxPR0koInF1ZXVlaW5nIGRpc2NvbnRpbnVpdHkgKGV4cGxpY2l0PSVkKSIsIGRpc2NvbnRpbnVpdHkpOwogCiAgICAgICAgICAgICAgICAgcXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXREaXNjb250aW51aXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGV4dHJhICovKTsKKworICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHkgPSBmYWxzZTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhcnR1cCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgZXJyID0gT0s7CkBAIC05MTMsMjMgKzk0NywxOSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAvLyBiYWQgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIGhpbnQKKyAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciB0b28gbG93L2hpZ2gKKyAgICAgICAgICAgIG1UU1BhcnNlci5jbGVhcigpOwogICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOwogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CiAgICAgICAgICAgICAvLyByZWFjaGVkIHN0b3BwaW5nIHBvaW50Ci0gICAgICAgICAgICBzdG9wQXN5bmMoLyogc2VsZlRyaWdnZXJlZCA9ICovIHRydWUpOworICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi8gZmFsc2UpOwogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIG1TdGFydHVwID0gZmFsc2U7CiAgICAgfSB3aGlsZSAoYnl0ZXNSZWFkICE9IDApOwogCiAgICAgaWYgKGJ1ZmZlclN0YXJ0c1dpdGhUc1N5bmNCeXRlKGJ1ZmZlcikpIHsKQEAgLTk4MSw3ICsxMDExLDE2IEBACiAKICAgICAvLyBidWxrIGV4dHJhY3Qgbm9uLXRzIGZpbGVzCiAgICAgaWYgKHRzQnVmZmVyID09IE5VTEwpIHsKLSAgICAgIGVyciA9IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKGJ1ZmZlciwgaXRlbU1ldGEpOworICAgICAgICBlcnIgPSBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cyhidWZmZXIsIGl0ZW1NZXRhKTsKKyAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7CisgICAgICAgICAgICAvLyBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgdG9vIGxvdy9oaWdoCisgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICAgICAgLy8gcmVhY2hlZCBzdG9wcGluZyBwb2ludAorICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi9mYWxzZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC05OTQsNiArMTAzMyw2NiBAQAogICAgIHBvc3RNb25pdG9yUXVldWUoKTsKIH0KIAoraW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKGludDY0X3QgYW5jaG9yVGltZVVzKSBjb25zdCB7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMCisgICAgICAgICAgICB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigibWVkaWEtc2VxdWVuY2UiLCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgeworICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIH0KKyAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIG1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKKworICAgIGludDMyX3QgaW5kZXggPSBtU2VxTnVtYmVyIC0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IC0gMTsKKyAgICB3aGlsZSAoaW5kZXggPj0gMCAmJiBhbmNob3JUaW1lVXMgPiBtU3RhcnRUaW1lVXMpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdChpbmRleCwgTlVMTCAvKiB1cmkgKi8sICZpdGVtTWV0YSkpOworCisgICAgICAgIGludDY0X3QgaXRlbUR1cmF0aW9uVXM7CisgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmaXRlbUR1cmF0aW9uVXMpKTsKKworICAgICAgICBhbmNob3JUaW1lVXMgLT0gaXRlbUR1cmF0aW9uVXM7CisgICAgICAgIC0taW5kZXg7CisgICAgfQorCisgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleCArIDE7CisgICAgaWYgKG5ld1NlcU51bWJlciA8PSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkgeworICAgICAgICByZXR1cm4gbmV3U2VxTnVtYmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICB9Cit9CisKK2ludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KHNpemVfdCBkaXNjb250aW51aXR5U2VxKSBjb25zdCB7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwKKyAgICAgICAgICAgIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7CisgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IGN1ckRpc2NvbnRpbnVpdHlTZXEgPSBtUGxheWxpc3QtPmdldERpc2NvbnRpbnVpdHlTZXEoKTsKKyAgICBpZiAoZGlzY29udGludWl0eVNlcSA8IGN1ckRpc2NvbnRpbnVpdHlTZXEpIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA8PSAwID8gMCA6IChmaXJzdFNlcU51bWJlckluUGxheWxpc3QgLSAxKTsKKyAgICB9CisKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIHdoaWxlIChpbmRleCA8IG1QbGF5bGlzdC0+c2l6ZSgpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKyAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoIGluZGV4LCBOVUxMIC8qIHVyaSAqLywgJml0ZW1NZXRhKSk7CisKKyAgICAgICAgaW50NjRfdCBkaXNjb250aW51aXR5OworICAgICAgICBpZiAoaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICAgICAgY3VyRGlzY29udGludWl0eVNlcSsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1ckRpc2NvbnRpbnVpdHlTZXEgPT0gZGlzY29udGludWl0eVNlcSkgeworICAgICAgICAgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgKytpbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgbVBsYXlsaXN0LT5zaXplKCk7Cit9CisKIGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJGb3JUaW1lKGludDY0X3QgdGltZVVzKSBjb25zdCB7CiAgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CiAgICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoCkBAIC0xMDI2LDYgKzExMjUsMjMgQEAKICAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXg7CiB9CiAKK2NvbnN0IHNwPEFCdWZmZXI+ICZQbGF5bGlzdEZldGNoZXI6OnNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCwgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnNvdXJjZSwgYm9vbCBkaXNjYXJkKSB7CisgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIC8vIGZvciBzaW1wbGljaXR5LCBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgZm9ybWF0IGluIGVhY2ggdW5pdAorICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldE9iamVjdCgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICB9CisKKyAgICBpZiAoZGlzY2FyZCkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJkaXNjYXJkIiwgZGlzY2FyZCk7CisgICAgfQorCisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eVNlcSIsIG1EaXNjb250aW51aXR5U2VxKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcikpOworICAgIHJldHVybiBhY2Nlc3NVbml0OworfQorCiBzdGF0dXNfdCBQbGF5bGlzdEZldGNoZXI6OmV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzRnJvbVRzKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBpZiAobVRTUGFyc2VyID09IE5VTEwpIHsKICAgICAgICAgLy8gVXNlIFRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFIHNvIHB0cyBjYXJyeSBvdmVyIGJldHdlZW4gZmV0Y2hlcnMuCkBAIC0xMDQxLDcgKzExNTcsOSBAQAogICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssIGV4dHJhKTsKIAorICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSBtTmV4dFBUU1RpbWVVczsKICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSAtMWxsOworICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHNpemVfdCBvZmZzZXQgPSAwOwpAQCAtMTEwMSw0MyArMTIxOSwxMDggQEAKICAgICAgICAgICAgICAgICAmJiBzb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KCZhY2Nlc3NVbml0KSA9PSBPSykgewogCiAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgaWYgKG1NaW5TdGFydFRpbWVVcyA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgbU1pblN0YXJ0VGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gdW50ZXN0ZWQgcGF0aAotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgYSBsYXRlciB0cwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluY3IgPSAobU1pblN0YXJ0VGltZVVzIC0gdGltZVVzKSAvIDEwMDAwMDAgLyB0YXJnZXREdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluY3IgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IG1TZXFOdW1iZXIgYnkgYXQgbGVhc3Qgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMTsKKworICAgICAgICAgICAgaWYgKG1TdGFydHVwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICBtRmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc1JlbGF0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVVcyAtPSBtRmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMgPSAwOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgKz0gaW5jcjsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVBR0FJTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc05vdGlmeSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDY0KGtleSwgJnN0YXJ0VGltZVVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQ2NChrZXksIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1NYXNrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikgJnN0cmVhbU1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayB8PSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBzdHJlYW1NYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciB1cCB0byB0aGUgY2xvc2VzdCBwcmVjZWRpbmcgSURSIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ0aW1lVXMgJSIgUFJJZDY0ICIgdXMgPCBtU3RhcnRUaW1lVXMgJSIgUFJJZDY0ICIgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCAgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBib29sIGlzQXZjID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCAmJiBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNBdmMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0F2YyAmJiBJc0lEUihhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0F2YykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU1hc2sgPT0gbVN0cmVhbVR5cGVNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCAmJiB0aW1lVXMgPiBtU3RhcnRUaW1lVXMpIHsKKworICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOworICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvblNlY3MpKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7CisgICAgICAgICAgICAgICAgLy8gbVN0YXJ0dXAKKyAgICAgICAgICAgICAgICAvLyAgIG1TdGFydHVwIGlzIHRydWUgdW50aWwgd2UgaGF2ZSBxdWV1ZWQgYSBwYWNrZXQgZm9yIGFsbCB0aGUgc3RyZWFtcworICAgICAgICAgICAgICAgIC8vICAgd2UgYXJlIGZldGNoaW5nLiBXZSBxdWV1ZSBwYWNrZXRzIHdob3NlIHRpbWVzdGFtcHMgYXJlIGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgIC8vICAgbVN0YXJ0VGltZVVzLgorICAgICAgICAgICAgICAgIC8vIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAorICAgICAgICAgICAgICAgIC8vICAgbVNlZ21lbnRTdGFydFRpbWVVcyBpcyBub24tbmVnYXRpdmUgd2hlbiBhZGFwdGluZyBvciBzd2l0Y2hpbmcgdHJhY2tzCisgICAgICAgICAgICAgICAgLy8gdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VczoKKyAgICAgICAgICAgICAgICAvLyAgIFRoaXMgYW5kIHRoZSAyIGFib3ZlIGNvbmRpdGlvbnMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gYWRhcHRpbmcgaW4gYSBsaXZlCisgICAgICAgICAgICAgICAgLy8gICBzdHJlYW07IHRoZSBvbGQgZmV0Y2hlciBoYXMgYWxyZWFkeSBmZXRjaGVkIHRvIG1TdGFydFRpbWVVczsgdGhlIG5ldyBmZXRjaGVyCisgICAgICAgICAgICAgICAgLy8gICB3b3VsZCBzdGFydCBmZXRjaGluZyBhZnRlciB0aW1lVXMsIHdoaWNoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gbVN0YXJ0VGltZVVzOworICAgICAgICAgICAgICAgIC8vICAgdGhlIG9sZCBmZXRjaGVyIHdvdWxkIHRoZW4gY29udGludWUgZmV0Y2hpbmcgZGF0YSB1bnRpbCB0aW1lVXMuIFdlIGRvbid0IHdhbnQKKyAgICAgICAgICAgICAgICAvLyAgIHRpbWVVcyB0byBiZSB0b28gZmFyIGFoZWFkIG9mIG1TdGFydFRpbWVVcyBiZWNhdXNlIHdlIHdhbnQgdGhlIG9sZCBmZXRjaGVyIHRvCisgICAgICAgICAgICAgICAgLy8gICBzdG9wIGFzIGVhcmx5IGFzIHBvc3NpYmxlLiBUaGUgZGVmaW5pdGlvbiBvZiBiZWluZyAidG9vIGZhciBhaGVhZCIgaXMKKyAgICAgICAgICAgICAgICAvLyAgIGFyYml0cmFyeTsgaGVyZSB3ZSB1c2UgdGFyZ2V0RHVyYXRpb25VcyBhcyB0aHJlc2hvbGQuCisgICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwICYmIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VcykgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGd1ZXNzZWQgYSBzdGFydGluZyB0aW1lc3RhbXAgdGhhdCBpcyB0b28gaGlnaCB3aGVuIGFkYXB0aW5nIGluIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gbGl2ZSBzdHJlYW07IHJlLWFkanVzdCBiYXNlZCBvbiB0aGUgYWN0dWFsIHRpbWVzdGFtcCBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2VnbWVudDsgaWYgd2UgZGlkbid0IG1vdmUgYmFja3dhcmQgYWZ0ZXIgdGhlIHJlLWFkanVzdG1lbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gKG5ld1NlcU51bWJlciksIHN0YXJ0IGF0IGxlYXN0IDEgc2VnbWVudCBwcmlvci4KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZSh0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VxTnVtYmVyID49IG1TZXFOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tbVNlcU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBuZXdTZXFOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxOworICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmc2VxKSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOworICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50NjQoa2V5LCAmc3RhcnRUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoa2V5LCB0aW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopICZzdHJlYW1NYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayB8PSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NYXNrID09IG1TdHJlYW1UeXBlTWFzaykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0dXAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtU3RvcFBhcmFtcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLy8gUXVldWUgZGlzY29udGludWl0eSBpbiBvcmlnaW5hbCBzdHJlYW0uCisgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxOwogICAgICAgICAgICAgICAgIGludDY0X3Qgc3RvcFRpbWVVczsKLSAgICAgICAgICAgICAgICBpZiAoIW1TdG9wUGFyYW1zLT5maW5kSW50NjQoa2V5LCAmc3RvcFRpbWVVcykgfHwgdGltZVVzID49IHN0b3BUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1TdG9wUGFyYW1zLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmZGlzY29udGludWl0eVNlcSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRpc2NvbnRpbnVpdHlTZXEgPiBtRGlzY29udGludWl0eVNlcQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1TdG9wUGFyYW1zLT5maW5kSW50NjQoa2V5LCAmc3RvcFRpbWVVcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkaXNjb250aW51aXR5U2VxID09IG1EaXNjb250aW51aXR5U2VxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWVVcyA+PSBzdG9wVGltZVVzKSkgewogICAgICAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZU1hc2sgJj0gfnN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMucmVtb3ZlSXRlbXNBdChpKTsKQEAgLTExNDYsMTUgKzEzMjksMTggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIE5PVCBkZXF1ZXVlIGFueSBkaXNjb250aW51aXRpZXMgZXhjZXB0IGZvciBmb3JtYXQgY2hhbmdlLgotCi0gICAgICAgICAgICAvLyBmb3Igc2ltcGxpY2l0eSwgc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGZvcm1hdCBpbiBlYWNoIHVuaXQKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRPYmplY3QoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBkaXNjYXJkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1WaWRlb0J1ZmZlci0+aGFzQnVmZmVyQXZhaWxhYmxlKCZzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IHZpZGVvQnVmZmVyOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPmRlcXVldWVBY2Nlc3NVbml0KCZ2aWRlb0J1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKHZpZGVvQnVmZmVyLCBzb3VyY2UsIGRpc2NhcmQpOworICAgICAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdCh2aWRlb0J1ZmZlcik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBTdGFzaCB0aGUgc2VxdWVuY2UgbnVtYmVyIHNvIHdlIGNhbiBoaW50IGZ1dHVyZSBwbGF5bGlzdCB3aGVyZSB0byBzdGFydCBhdC4KLSAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoInNlcSIsIG1TZXFOdW1iZXIpOworICAgICAgICAgICAgc2V0QWNjZXNzVW5pdFByb3BlcnRpZXMoYWNjZXNzVW5pdCwgc291cmNlKTsKICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICB9CiAKQEAgLTExODAsOSArMTM2NiwzNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorLyogc3RhdGljICovCitib29sIFBsYXlsaXN0RmV0Y2hlcjo6YnVmZmVyU3RhcnRzV2l0aFdlYlZUVE1hZ2ljU2VxdWVuY2UoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKworICAgIC8vIHNraXAgcG9zc2libGUgQk9NCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID49IHBvcyArIDMgJiYKKyAgICAgICAgICAgICFtZW1jbXAoIlx4ZWZceGJiXHhiZiIsIGJ1ZmZlci0+ZGF0YSgpICsgcG9zLCAzKSkgeworICAgICAgICBwb3MgKz0gMzsKKyAgICB9CisKKyAgICAvLyBhY2NlcHQgV0VCVlRUIGZvbGxvd2VkIGJ5IFNQQUNFLCBUQUIgb3IgKENSKSBMRgorICAgIGlmIChidWZmZXItPnNpemUoKSA8IHBvcyArIDYgfHwKKyAgICAgICAgICAgIG1lbWNtcCgiV0VCVlRUIiwgYnVmZmVyLT5kYXRhKCkgKyBwb3MsIDYpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9zICs9IDY7CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPT0gcG9zKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3Qgc2VwID0gYnVmZmVyLT5kYXRhKClbcG9zXTsKKyAgICByZXR1cm4gc2VwID09ICcgJyB8fCBzZXAgPT0gJ1x0JyB8fCBzZXAgPT0gJ1xuJyB8fCBzZXAgPT0gJ1xyJzsKK30KKwogc3RhdHVzX3QgUGxheWxpc3RGZXRjaGVyOjpleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cygKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpdGVtTWV0YSkgewotICAgIGlmIChidWZmZXItPnNpemUoKSA+PSA3ICYmICFtZW1jbXAoIldFQlZUVFxuIiwgYnVmZmVyLT5kYXRhKCksIDcpKSB7CisgICAgaWYgKGJ1ZmZlclN0YXJ0c1dpdGhXZWJWVFRNYWdpY1NlcXVlbmNlKGJ1ZmZlcikpIHsKICAgICAgICAgaWYgKG1TdHJlYW1UeXBlTWFzayAhPSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKICAgICAgICAgICAgIEFMT0dFKCJUaGlzIHN0cmVhbSBvbmx5IGNvbnRhaW5zIHN1YnRpdGxlcy4iKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xMTk1LDcgKzE0MDcsOSBAQAogICAgICAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcikpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCBkdXJhdGlvblVzKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJzZXEiLCBtU2VxTnVtYmVyKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcikpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigic3VidGl0bGVHZW5lcmF0aW9uIiwgbVN1YnRpdGxlR2VuZXJhdGlvbik7CiAKICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYnVmZmVyKTsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTI2MSwxNCArMTQ3NSw2IEBACiAgICAgICAgIGZpcnN0SUQzVGFnID0gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgewotICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7Ci0gICAgICAgIG1GaXJzdFBUUyA9IFBUUzsKLSAgICB9Ci0gICAgUFRTIC09IG1GaXJzdFBUUzsKLQotICAgIGludDY0X3QgdGltZVVzID0gKFBUUyAqIDEwMGxsKSAvIDlsbCArIG1BYnNvbHV0ZVRpbWVBbmNob3JVczsKLQogICAgIGlmIChtU3RyZWFtVHlwZU1hc2sgIT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8pIHsKICAgICAgICAgQUxPR1coIlRoaXMgc3RyZWFtIG9ubHkgY29udGFpbnMgYXVkaW8gZGF0YSEiKTsKIApAQCAtMTMxMSw2ICsxNTE3LDEyIEBACiAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgIENIRUNLKHBhY2tldFNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKIAorICAgIGludDY0X3QgdGltZVVzID0gKFBUUyAqIDEwMGxsKSAvIDlsbDsKKyAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7CisgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbUZpcnN0VGltZVVzID0gdGltZVVzOworICAgIH0KKwogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogICAgIHdoaWxlIChvZmZzZXQgPCBidWZmZXItPnNpemUoKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7CkBAIC0xMzM1LDE5ICsxNTQ3LDcwIEBACiAKICAgICAgICAgQ0hFQ0tfTEUob2Zmc2V0ICsgYWFjX2ZyYW1lX2xlbmd0aCwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgICAgIHNwPEFCdWZmZXI+IHVuaXQgPSBuZXcgQUJ1ZmZlcihhYWNfZnJhbWVfbGVuZ3RoKTsKLSAgICAgICAgbWVtY3B5KHVuaXQtPmRhdGEoKSwgYWR0c0hlYWRlciwgYWFjX2ZyYW1lX2xlbmd0aCk7Ci0KICAgICAgICAgaW50NjRfdCB1bml0VGltZVVzID0gdGltZVVzICsgbnVtU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7Ci0gICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHVuaXRUaW1lVXMpOworICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKIAogICAgICAgICAvLyBFYWNoIEFBQyBmcmFtZSBlbmNvZGVzIDEwMjQgc2FtcGxlcy4KICAgICAgICAgbnVtU2FtcGxlcyArPSAxMDI0OwogCi0gICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0SW50MzIoInNlcSIsIG1TZXFOdW1iZXIpOwotICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdCh1bml0KTsKKyAgICAgICAgaWYgKG1TdGFydHVwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gdW5pdFRpbWVVczsKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNSZWxhdGl2ZSkgeworICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzIC09IG1GaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgb2Zmc2V0ICs9IGFhY19mcmFtZV9sZW5ndGg7CisgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworCisgICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlZCBsb2dpYyBmcm9tIGhvdyB3ZSBoYW5kbGUgLnRzIHBsYXlsaXN0cy4KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbmV3U2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUodGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcU51bWJlciA+PSBtU2VxTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLW1TZXFOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbmV3U2VxTnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoInRpbWVVc0F1ZGlvIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTyk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVN0b3BQYXJhbXMgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gUXVldWUgZGlzY29udGludWl0eSBpbiBvcmlnaW5hbCBzdHJlYW0uCisgICAgICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgICAgICBpbnQ2NF90IHN0b3BUaW1lVXM7CisgICAgICAgICAgICBpZiAoIW1TdG9wUGFyYW1zLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmZGlzY29udGludWl0eVNlcSkKKyAgICAgICAgICAgICAgICAgICAgfHwgZGlzY29udGludWl0eVNlcSA+IG1EaXNjb250aW51aXR5U2VxCisgICAgICAgICAgICAgICAgICAgIHx8ICFtU3RvcFBhcmFtcy0+ZmluZEludDY0KCJ0aW1lVXNBdWRpbyIsICZzdG9wVGltZVVzKQorICAgICAgICAgICAgICAgICAgICB8fCAoZGlzY29udGludWl0eVNlcSA9PSBtRGlzY29udGludWl0eVNlcSAmJiB1bml0VGltZVVzID49IHN0b3BUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQobVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZU1hc2sgPSAwOworICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IHVuaXQgPSBuZXcgQUJ1ZmZlcihhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgbWVtY3B5KHVuaXQtPmRhdGEoKSwgYWR0c0hlYWRlciwgYWFjX2ZyYW1lX2xlbmd0aCk7CisKKyAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdW5pdFRpbWVVcyk7CisgICAgICAgIHNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKHVuaXQsIHBhY2tldFNvdXJjZSk7CisgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KHVuaXQpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKaW5kZXggN2UyMTUyMy4uNzhjMzU4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKQEAgLTQ5LDcgKzQ5LDggQEAKICAgICBQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIGNvbnN0IHNwPExpdmVTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgICAgICBpbnQzMl90IHN1YnRpdGxlR2VuZXJhdGlvbik7CiAKICAgICBzcDxEYXRhU291cmNlPiBnZXREYXRhU291cmNlKCk7CiAKQEAgLTU3LDE2ICs1OCwyMiBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmF1ZGlvU291cmNlLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnZpZGVvU291cmNlLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnN1YnRpdGxlU291cmNlLAotICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xbGwsCi0gICAgICAgICAgICBpbnQ2NF90IG1pblN0YXJ0VGltZVVzID0gMGxsIC8qIHN0YXJ0IGFmdGVyIHRoaXMgdGltZXN0YW1wICovLAotICAgICAgICAgICAgaW50MzJfdCBzdGFydFNlcU51bWJlckhpbnQgPSAtMSAvKiB0cnkgc3RhcnRpbmcgYXQgdGhpcyBzZXF1ZW5jZSBudW1iZXIgKi8pOworICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xbGwsICAgICAgICAgLy8gc3RhcnRpbmcgdGltZXN0YW1wcworICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMgPSAtMWxsLCAvLyBzdGFydGluZyBwb3NpdGlvbiB3aXRoaW4gcGxheWxpc3QKKyAgICAgICAgICAgIC8vIHN0YXJ0VGltZVVzIT1zZWdtZW50U3RhcnRUaW1lVXMgb25seSB3aGVuIHBsYXlsaXN0IGlzIGxpdmUKKyAgICAgICAgICAgIGludDMyX3Qgc3RhcnREaXNjb250aW51aXR5U2VxID0gMCwKKyAgICAgICAgICAgIGJvb2wgYWRhcHRpdmUgPSBmYWxzZSk7CiAKICAgICB2b2lkIHBhdXNlQXN5bmMoKTsKIAotICAgIHZvaWQgc3RvcEFzeW5jKGJvb2wgc2VsZlRyaWdnZXJlZCA9IGZhbHNlKTsKKyAgICB2b2lkIHN0b3BBc3luYyhib29sIGNsZWFyID0gdHJ1ZSk7CiAKICAgICB2b2lkIHJlc3VtZVVudGlsQXN5bmMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOwogCisgICAgdWludDMyX3QgZ2V0U3RyZWFtVHlwZU1hc2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZU1hc2s7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UGxheWxpc3RGZXRjaGVyKCk7CiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTkxLDYgKzk4LDcgQEAKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2tpcEZyYW1lczsKIAogICAgIHN0YXRpYyBib29sIGJ1ZmZlclN0YXJ0c1dpdGhUc1N5bmNCeXRlKGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpOworICAgIHN0YXRpYyBib29sIGJ1ZmZlclN0YXJ0c1dpdGhXZWJWVFRNYWdpY1NlcXVlbmNlKGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpOwogCiAgICAgLy8gbm90aWZpY2F0aW9ucyB0byBtU2Vzc2lvbgogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwpAQCAtMTAxLDcgKzEwOSwxNCBAQAogCiAgICAgdWludDMyX3QgbVN0cmVhbVR5cGVNYXNrOwogICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOwotICAgIGludDY0X3QgbU1pblN0YXJ0VGltZVVzOyAvLyBzdGFydCBmZXRjaGluZyBubyBlYXJsaWVyIHRoYW4gdGhpcyB2YWx1ZQorCisgICAgLy8gU3RhcnQgdGltZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBpbml0aWFsCisgICAgLy8gcGxheWxpc3QuIEl0J3MgdmFsdWUgaXMgaW5pdGlhbGl6ZWQgdG8gYSBub24tbmVnYXRpdmUgdmFsdWUgb25seSB3aGVuIHdlIGFyZQorICAgIC8vIGFkYXB0aW5nIG9yIHN3aXRjaGluZyB0cmFja3MuCisgICAgaW50NjRfdCBtU2VnbWVudFN0YXJ0VGltZVVzOworCisgICAgc3NpemVfdCBtRGlzY29udGludWl0eVNlcTsKKyAgICBib29sIG1TdGFydFRpbWVVc1JlbGF0aXZlOwogICAgIHNwPEFNZXNzYWdlPiBtU3RvcFBhcmFtczsgLy8gbWVzc2FnZSBjb250YWluaW5nIHRoZSBsYXRlc3QgdGltZXN0YW1wcyB3ZSBzaG91bGQgZmV0Y2guCiAKICAgICBLZXllZFZlY3RvcjxMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPgpAQCAtMTE0LDEwICsxMjksMTIgQEAKICAgICBpbnQzMl90IG1TZXFOdW1iZXI7CiAgICAgaW50MzJfdCBtTnVtUmV0cmllczsKICAgICBib29sIG1TdGFydHVwOworICAgIGJvb2wgbUFkYXB0aXZlOwogICAgIGJvb2wgbVByZXBhcmVkOwogICAgIGludDY0X3QgbU5leHRQVFNUaW1lVXM7CiAKICAgICBpbnQzMl90IG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uOworICAgIGNvbnN0IGludDMyX3QgbVN1YnRpdGxlR2VuZXJhdGlvbjsKIAogICAgIGVudW0gUmVmcmVzaFN0YXRlIHsKICAgICAgICAgSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSwKQEAgLTEzMyw3ICsxNTAsOSBAQAogCiAgICAgYm9vbCBtRmlyc3RQVFNWYWxpZDsKICAgICB1aW50NjRfdCBtRmlyc3RQVFM7CisgICAgaW50NjRfdCBtRmlyc3RUaW1lVXM7CiAgICAgaW50NjRfdCBtQWJzb2x1dGVUaW1lQW5jaG9yVXM7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVZpZGVvQnVmZmVyOwogCiAgICAgLy8gU3RvcmVzIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gZGVjcnlwdCB0aGUgbmV4dCBibG9jayBvZiBjaXBoZXIgdGV4dCwgd2hpY2ggY2FuCiAgICAgLy8gZWl0aGVyIGJlIGRlcml2ZWQgZnJvbSB0aGUgc2VxdWVuY2UgbnVtYmVyLCByZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBvciBjb3BpZWQgZnJvbQpAQCAtMTcyLDYgKzE5MSwxMCBAQAogICAgIC8vIFJlc3VtZSBhIGZldGNoZXIgdG8gY29udGludWUgdW50aWwgdGhlIHN0b3BwaW5nIHBvaW50IHN0b3JlZCBpbiBtc2cuCiAgICAgc3RhdHVzX3Qgb25SZXN1bWVVbnRpbChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2V0QWNjZXNzVW5pdFByb3BlcnRpZXMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBib29sIGRpc2NhcmQgPSBmYWxzZSk7CiAgICAgc3RhdHVzX3QgZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNGcm9tVHMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKICAgICBzdGF0dXNfdCBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cygKQEAgLTE4Miw2ICsyMDUsOCBAQAogICAgIHZvaWQgcXVldWVEaXNjb250aW51aXR5KAogICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKIAorICAgIGludDMyX3QgZ2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUoaW50NjRfdCBhbmNob3JUaW1lVXMpIGNvbnN0OworICAgIGludDMyX3QgZ2V0U2VxTnVtYmVyRm9yRGlzY29udGludWl0eShzaXplX3QgZGlzY29udGludWl0eVNlcSkgY29uc3Q7CiAgICAgaW50MzJfdCBnZXRTZXFOdW1iZXJGb3JUaW1lKGludDY0X3QgdGltZVVzKSBjb25zdDsKIAogICAgIHZvaWQgdXBkYXRlRHVyYXRpb24oKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKaW5kZXggYmY2ZjdiYi4uMjE5NGMzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKQEAgLTQsNiArNCw4IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCUlEMy5jcHAKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2lkMwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCkBAIC0xNSw2ICsxNyw4IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCXRlc3RpZDMuY3BwCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYnN0YWdlZnJpZ2h0IGxpYnV0aWxzIGxpYmxvZyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCmluZGV4IGIyNWZjNGQuLmVkMmQ5NDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCkBAIC00MSw5ICs0MSw5IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgb2ZmNjRfdCBhdmFpbGFibGUgPSAob2Zmc2V0ID49IG1TaXplKSA/IDBsbCA6IG1TaXplIC0gb2Zmc2V0OworICAgICAgICBvZmY2NF90IGF2YWlsYWJsZSA9IChvZmZzZXQgPj0gKG9mZjY0X3QpbVNpemUpID8gMGxsIDogbVNpemUgLSBvZmZzZXQ7CiAKLSAgICAgICAgc2l6ZV90IGNvcHkgPSAoYXZhaWxhYmxlID4gc2l6ZSkgPyBzaXplIDogYXZhaWxhYmxlOworICAgICAgICBzaXplX3QgY29weSA9IChhdmFpbGFibGUgPiAob2ZmNjRfdClzaXplKSA/IHNpemUgOiBhdmFpbGFibGU7CiAgICAgICAgIG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgY29weSk7CiAKICAgICAgICAgcmV0dXJuIGNvcHk7CkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IGtNYXhNZXRhZGF0YVNpemUpIHsKLSAgICAgICAgQUxPR0UoInNraXBwaW5nIGh1Z2UgSUQzIG1ldGFkYXRhIG9mIHNpemUgJWQiLCBzaXplKTsKKyAgICAgICAgQUxPR0UoInNraXBwaW5nIGh1Z2UgSUQzIG1ldGFkYXRhIG9mIHNpemUgJXp1Iiwgc2l6ZSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTQ4OCw0OSArNDg4LDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRJU084ODU5VG9TdHJpbmc4KAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgU3RyaW5nOCAqcykgewotICAgIHNpemVfdCB1dGY4bGVuID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBpZiAoZGF0YVtpXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICBzaXplID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGRhdGFbaV0gPCAweDgwKSB7Ci0gICAgICAgICAgICArK3V0ZjhsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1dGY4bGVuICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodXRmOGxlbiA9PSBzaXplKSB7Ci0gICAgICAgIC8vIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBwcmVzZW50LgotCi0gICAgICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjaGFyICp0bXAgPSBuZXcgY2hhclt1dGY4bGVuXTsKLSAgICBjaGFyICpwdHIgPSB0bXA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgaWYgKGRhdGFbaV0gPT0gJ1wwJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA8IDB4ODApIHsKLSAgICAgICAgICAgICpwdHIrKyA9IGRhdGFbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA8IDB4YzApIHsKLSAgICAgICAgICAgICpwdHIrKyA9IDB4YzI7Ci0gICAgICAgICAgICAqcHRyKysgPSBkYXRhW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnB0cisrID0gMHhjMzsKLSAgICAgICAgICAgICpwdHIrKyA9IGRhdGFbaV0gLSA2NDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHMtPnNldFRvKHRtcCwgdXRmOGxlbik7Ci0KLSAgICBkZWxldGVbXSB0bXA7Ci0gICAgdG1wID0gTlVMTDsKLX0KIAogLy8gdGhlIDJuZCBhcmd1bWVudCBpcyB1c2VkIHRvIGdldCB0aGUgZGF0YSBmb2xsb3dpbmcgdGhlIFwwIGluIGEgY29tbWVudCBmaWVsZAogdm9pZCBJRDM6Okl0ZXJhdG9yOjpnZXRTdHJpbmcoU3RyaW5nOCAqaWQsIFN0cmluZzggKmNvbW1lbnQpIGNvbnN0IHsKQEAgLTU2Myw3ICs1MjAsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgY29udmVydElTTzg4NTlUb1N0cmluZzgoZnJhbWVEYXRhLCBtRnJhbWVTaXplLCBpZCk7CisgICAgICAgIC8vIHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgSVNPLTg4NTktMSwgYnV0IHBhc3MgaXQgdXAgYXMtaXMgdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgZmlndXJlCisgICAgICAgIC8vIG91dCB0aGUgcmVhbCBlbmNvZGluZworICAgICAgICBpZC0+c2V0VG8oKGNvbnN0IGNoYXIqKWZyYW1lRGF0YSwgbUZyYW1lU2l6ZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTU4NCwxMyArNTQzLDEzIEBACiAgICAgfQogCiAgICAgaWYgKGVuY29kaW5nID09IDB4MDApIHsKLSAgICAgICAgLy8gSVNPIDg4NTktMQotICAgICAgICBjb252ZXJ0SVNPODg1OVRvU3RyaW5nOChmcmFtZURhdGEgKyAxLCBuLCBpZCk7CisgICAgICAgIC8vIHN1cHBvc2VkbHkgSVNPIDg4NTktMQorICAgICAgICBpZC0+c2V0VG8oKGNvbnN0IGNoYXIqKWZyYW1lRGF0YSArIDEsIG4pOwogICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT0gMHgwMykgewotICAgICAgICAvLyBVVEYtOAorICAgICAgICAvLyBzdXBwb3NlZGx5IFVURi04CiAgICAgICAgIGlkLT5zZXRUbygoY29uc3QgY2hhciAqKShmcmFtZURhdGEgKyAxKSwgbik7CiAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PSAweDAyKSB7Ci0gICAgICAgIC8vIFVURi0xNiBCRSwgbm8gYnl0ZSBvcmRlciBtYXJrLgorICAgICAgICAvLyBzdXBwb3NlZGx5IFVURi0xNiBCRSwgbm8gYnl0ZSBvcmRlciBtYXJrLgogICAgICAgICAvLyBBUEkgd2FudHMgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIG5vdCBudW1iZXIgb2YgYnl0ZXMuLi4KICAgICAgICAgaW50IGxlbiA9IG4gLyAyOwogICAgICAgICBjb25zdCBjaGFyMTZfdCAqZnJhbWVkYXRhID0gKGNvbnN0IGNoYXIxNl90ICopIChmcmFtZURhdGEgKyAxKTsKQEAgLTYwNiw3ICs1NjUsNyBAQAogICAgICAgICBpZiAoZnJhbWVkYXRhY29weSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGVbXSBmcmFtZWRhdGFjb3B5OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09IDB4MDEpIHsKICAgICAgICAgLy8gVUNTLTIKICAgICAgICAgLy8gQVBJIHdhbnRzIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBub3QgbnVtYmVyIG9mIGJ5dGVzLi4uCiAgICAgICAgIGludCBsZW4gPSBuIC8gMjsKQEAgLTYyNSw3ICs1ODQsMjcgQEAKICAgICAgICAgICAgIGZyYW1lZGF0YSsrOwogICAgICAgICAgICAgbGVuLS07CiAgICAgICAgIH0KLSAgICAgICAgaWQtPnNldFRvKGZyYW1lZGF0YSwgbGVuKTsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgcmVzdWx0aW5nIGRhdGEgY29uc2lzdHMgZW50aXJlbHkgb2YgOC1iaXQgdmFsdWVzCisgICAgICAgIGJvb2wgZWlnaHRCaXQgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnJhbWVkYXRhW2ldID4gMHhmZikgeworICAgICAgICAgICAgICAgIGVpZ2h0Qml0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVpZ2h0Qml0KSB7CisgICAgICAgICAgICAvLyBjb2xsYXBzZSB0byA4IGJpdCwgdGhlbiBsZXQgdGhlIG1lZGlhIHNjYW5uZXIgY2xpZW50IGZpZ3VyZSBvdXQgdGhlIHJlYWwgZW5jb2RpbmcKKyAgICAgICAgICAgIGNoYXIgKmZyYW1lOCA9IG5ldyBjaGFyW2xlbl07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZnJhbWU4W2ldID0gZnJhbWVkYXRhW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWQtPnNldFRvKGZyYW1lOCwgbGVuKTsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBmcmFtZTg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZC0+c2V0VG8oZnJhbWVkYXRhLCBsZW4pOworICAgICAgICB9CisKICAgICAgICAgaWYgKGZyYW1lZGF0YWNvcHkgIT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlW10gZnJhbWVkYXRhY29weTsKICAgICAgICAgfQpAQCAtNjgyLDggKzY2MSw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtT2Zmc2V0ICsgbUZyYW1lU2l6ZSA+IG1QYXJlbnQubVNpemUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicGFydGlhbCBmcmFtZSBhdCBvZmZzZXQgJWQgKHNpemUgPSAlZCwgYnl0ZXMtcmVtYWluaW5nID0gJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXQsIG1GcmFtZVNpemUsIG1QYXJlbnQubVNpemUgLSBtT2Zmc2V0IC0gNik7CisgICAgICAgICAgICAgICAgQUxPR1YoInBhcnRpYWwgZnJhbWUgYXQgb2Zmc2V0ICV6dSAoc2l6ZSA9ICV6dSwgYnl0ZXMtcmVtYWluaW5nID0gJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIG1PZmZzZXQsIG1GcmFtZVNpemUsIG1QYXJlbnQubVNpemUgLSBtT2Zmc2V0IC0gKHNpemVfdCk2KTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTczNyw4ICs3MTYsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobU9mZnNldCArIG1GcmFtZVNpemUgPiBtUGFyZW50Lm1TaXplKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInBhcnRpYWwgZnJhbWUgYXQgb2Zmc2V0ICVkIChzaXplID0gJWQsIGJ5dGVzLXJlbWFpbmluZyA9ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0LCBtRnJhbWVTaXplLCBtUGFyZW50Lm1TaXplIC0gbU9mZnNldCAtIDEwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigicGFydGlhbCBmcmFtZSBhdCBvZmZzZXQgJXp1IChzaXplID0gJXp1LCBieXRlcy1yZW1haW5pbmcgPSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgbU9mZnNldCwgbUZyYW1lU2l6ZSwgbVBhcmVudC5tU2l6ZSAtIG1PZmZzZXQgLSAoc2l6ZV90KTEwKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcAppbmRleCBiYzQ1NzJjLi5iMmY0MTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdGlkMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwCkBAIC0zMyw3ICszMyw3IEBACiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopX2RhdGE7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgcHJpbnRmKCIweCUwNHggICIsIG9mZnNldCk7CisgICAgICAgIHByaW50ZigiMHglMDR6eCAgIiwgb2Zmc2V0KTsKIAogICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBvZmZzZXQ7CiAgICAgICAgIGlmIChuID4gMTYpIHsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICBjb25zdCB2b2lkICpkYXRhID0gdGFnLmdldEFsYnVtQXJ0KCZkYXRhU2l6ZSwgJm1pbWUpOwogCiAgICAgICAgIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBwcmludGYoImZvdW5kIGFsYnVtIGFydDogc2l6ZT0lZCBtaW1lPSclcydcbiIsIGRhdGFTaXplLAorICAgICAgICAgICAgcHJpbnRmKCJmb3VuZCBhbGJ1bSBhcnQ6IHNpemU9JXp1IG1pbWU9JyVzJ1xuIiwgZGF0YVNpemUsCiAgICAgICAgICAgICAgICAgICAgbWltZS5zdHJpbmcoKSk7CiAKICAgICAgICAgICAgIGhleGR1bXAoZGF0YSwgZGF0YVNpemUgPiAxMjggPyAxMjggOiBkYXRhU2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IDI3MWRmOGUuLjc3ZDY1ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0zMiw2ICszMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBdWRpb1BsYXllcjsKK3N0cnVjdCBDbG9ja0VzdGltYXRvcjsKIHN0cnVjdCBEYXRhU291cmNlOwogc3RydWN0IE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhRXh0cmFjdG9yOwpAQCAtNjMsNiArNjQsNyBAQAogICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKQEAgLTE1OSw2ICsxNjEsNyBAQAogICAgIFN5c3RlbVRpbWVTb3VyY2UgbVN5c3RlbVRpbWVTb3VyY2U7CiAgICAgVGltZVNvdXJjZSAqbVRpbWVTb3VyY2U7CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogICAgIFN0cmluZzggbVVyaTsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtVXJpSGVhZGVyczsKIApAQCAtMjM0LDYgKzIzNyw3IEBACiAKICAgICBNZWRpYUJ1ZmZlciAqbVZpZGVvQnVmZmVyOwogCisgICAgc3A8Q2xvY2tFc3RpbWF0b3I+IG1DbG9ja0VzdGltYXRvcjsKICAgICBzcDxIVFRQQmFzZT4gbUNvbm5lY3RpbmdEYXRhU291cmNlOwogICAgIHNwPE51Q2FjaGVkU291cmNlMj4gbUNhY2hlZFNvdXJjZTsKIApAQCAtMjQ3LDYgKzI1MSw3IEBACiAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IG1FeHRyYWN0b3I7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApAQCAtMjkzLDYgKzI5OCw3IEBACiAKICAgICBib29sIGdldEJpdHJhdGUoaW50NjRfdCAqYml0cmF0ZSk7CiAKKyAgICBpbnQ2NF90IGVzdGltYXRlUmVhbFRpbWVVcyhUaW1lU291cmNlICp0cywgaW50NjRfdCBzeXN0ZW1UaW1lVXMpOwogICAgIHZvaWQgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KGludDY0X3QgdmlkZW9UaW1lVXMpOwogICAgIHZvaWQgZW5zdXJlQ2FjaGVJc0ZldGNoaW5nX2woKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExODhkZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXwotCi0jZGVmaW5lIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJIVFRQQmFzZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTZkRlbGVnYXRlOwotCi1zdHJ1Y3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSA6IHB1YmxpYyBIVFRQQmFzZSB7Ci0gICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpOwotCi0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc3RhdGljIHN0YXR1c190IFVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkNocm9taXVtSFRUUERhdGFTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IFNmRGVsZWdhdGU7Ci0KLSAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgRElTQ09OTkVDVEVELAotICAgICAgICBDT05ORUNUSU5HLAotICAgICAgICBDT05ORUNURUQsCi0gICAgICAgIFJFQURJTkcsCi0gICAgICAgIERJU0NPTk5FQ1RJTkcKLSAgICB9OwotCi0gICAgY29uc3QgdWludDMyX3QgbUZsYWdzOwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLQotICAgIFN0YXRlIG1TdGF0ZTsKLQotICAgIFNmRGVsZWdhdGUgKm1EZWxlZ2F0ZTsKLQotICAgIEFTdHJpbmcgbVVSSTsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtSGVhZGVyczsKLQotICAgIG9mZjY0X3QgbUN1cnJlbnRPZmZzZXQ7Ci0KLSAgICAvLyBBbnkgY29ubmVjdGlvbiBlcnJvciBvciB0aGUgcmVzdWx0IG9mIGEgcmVhZCBvcGVyYXRpb24KLSAgICAvLyAoZm9yIHRoZSBsYXR0dGVyIHRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBpZiBzdWNjZXNzZnVsKS4KLSAgICBzc2l6ZV90IG1JT1Jlc3VsdDsKLQotICAgIGludDY0X3QgbUNvbnRlbnRTaXplOwotCi0gICAgU3RyaW5nOCBtQ29udGVudFR5cGU7Ci0KLSAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKLSAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKLQotICAgIHZvaWQgZGlzY29ubmVjdF9sKCk7Ci0KLSAgICBzdGF0dXNfdCBjb25uZWN0X2woCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHN0YXRpYyB2b2lkIEluaXRpYXRlUmVhZCgKLSAgICAgICAgICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIGluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKAotICAgICAgICAgICAgaW50NjRfdCBjb250ZW50U2l6ZSwgY29uc3QgY2hhciAqY29udGVudFR5cGUpOwotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25GYWlsZWQoc3RhdHVzX3QgZXJyKTsKLSAgICB2b2lkIG9uUmVhZENvbXBsZXRlZChzc2l6ZV90IHNpemUpOwotICAgIHZvaWQgb25EaXNjb25uZWN0Q29tcGxldGUoKTsKLSAgICB2b2lkIG9uUmVkaXJlY3QoY29uc3QgY2hhciAqdXJsKTsKLQotICAgIHZvaWQgY2xlYXJEUk1TdGF0ZV9sKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDaHJvbWl1bUhUVFBEYXRhU291cmNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQ0hST01FX0hUVFBfREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTAyYjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUEFSU0VSX0hfCi0KLSNkZWZpbmUgUEFSU0VSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgc3RydWN0IFNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgU291cmNlKCkge30KLQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWVrYWJsZSgpID0gMDsKLQotICAgICAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgflNvdXJjZSgpIHt9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU291cmNlKTsKLSAgICB9OwotCi0gICAgRnJhZ21lbnRlZE1QNFBhcnNlcigpOwotCi0gICAgdm9pZCBzdGFydChjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgdm9pZCBzdGFydChjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UpOwotICAgIHZvaWQgc3RhcnQoc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8sIGJvb2wgc3luY2hyb25vdXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQsIGJvb2wgc3luY2hyb25vdXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvKGJvb2wgYXVkaW8sIGludDY0X3QgdGltZVVzKTsKLSAgICBib29sIGlzU2Vla2FibGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5GcmFnbWVudGVkTVA0UGFyc2VyKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U3RhcnQsCi0gICAgICAgIGtXaGF0UHJvY2VlZCwKLSAgICAgICAga1doYXRSZWFkTW9yZSwKLSAgICAgICAga1doYXRHZXRGb3JtYXQsCi0gICAgICAgIGtXaGF0RGVxdWV1ZUFjY2Vzc1VuaXQsCi0gICAgICAgIGtXaGF0U2Vla1RvLAotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudDsKLSAgICBzdHJ1Y3QgRHluYW1pY1RyYWNrRnJhZ21lbnQ7Ci0gICAgc3RydWN0IFN0YXRpY1RyYWNrRnJhZ21lbnQ7Ci0KLSAgICBzdHJ1Y3QgRGlzcGF0Y2hFbnRyeSB7Ci0gICAgICAgIHVpbnQzMl90IG1UeXBlOwotICAgICAgICB1aW50MzJfdCBtUGFyZW50VHlwZTsKLSAgICAgICAgc3RhdHVzX3QgKEZyYWdtZW50ZWRNUDRQYXJzZXI6OiptSGFuZGxlcikodWludDMyX3QsIHNpemVfdCwgdWludDY0X3QpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgQ29udGFpbmVyIHsKLSAgICAgICAgdWludDY0X3QgbU9mZnNldDsKLSAgICAgICAgdWludDY0X3QgbUJ5dGVzUmVtYWluaW5nOwotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgYm9vbCBtRXh0ZW5kc1RvRU9GOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2FtcGxlRGVzY3JpcHRpb24gewotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgdWludDE2X3QgbURhdGFSZWZJbmRleDsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICB9OwotCi0gICAgc3RydWN0IFNhbXBsZUluZm8gewotICAgICAgICBvZmY2NF90IG1PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLSAgICAgICAgdWludDMyX3QgbVByZXNlbnRhdGlvblRpbWU7Ci0gICAgICAgIHNpemVfdCBtU2FtcGxlRGVzY0luZGV4OwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNZWRpYURhdGFJbmZvIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICAgICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2lkeEVudHJ5IHsKLSAgICAgICAgc2l6ZV90IG1TaXplOwotICAgICAgICB1aW50MzJfdCBtRHVyYXRpb25VczsKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrSW5mbyB7Ci0gICAgICAgIGVudW0gRmxhZ3MgewotICAgICAgICAgICAga1RyYWNrRW5hYmxlZCAgICAgPSAweDAxLAotICAgICAgICAgICAga1RyYWNrSW5Nb3ZpZSAgICAgPSAweDAyLAotICAgICAgICAgICAga1RyYWNrSW5QcmV2aWV3ICAgPSAweDA0LAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1UcmFja0lEOwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHVpbnQzMl90IG1EdXJhdGlvbjsgIC8vIFRoaXMgaXMgdGhlIGR1cmF0aW9uIGluIHRlcm1zIG9mIG1vdmllIHRpbWVzY2FsZSEKLSAgICAgICAgdWludDY0X3QgbVNpZHhEdXJhdGlvbjsgLy8gdXNlYywgZnJvbSBzaWR4IGJveCwgd2hpY2ggY2FuIHVzZSBhIGRpZmZlcmVudCB0aW1lc2NhbGUKLQotICAgICAgICB1aW50MzJfdCBtTWVkaWFUaW1lU2NhbGU7Ci0KLSAgICAgICAgdWludDMyX3QgbU1lZGlhSGFuZGxlclR5cGU7Ci0gICAgICAgIFZlY3RvcjxTYW1wbGVEZXNjcmlwdGlvbj4gbVNhbXBsZURlc2NzOwotCi0gICAgICAgIC8vIGZyb20gdHJhY2sgZXh0ZW5kczoKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4OwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0KLSAgICAgICAgdWludDMyX3QgbURlY29kaW5nVGltZTsKLQotICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeDsKLSAgICAgICAgc3A8U3RhdGljVHJhY2tGcmFnbWVudD4gbVN0YXRpY0ZyYWdtZW50OwotICAgICAgICBMaXN0PHNwPFRyYWNrRnJhZ21lbnQ+ID4gbUZyYWdtZW50czsKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvIHsKLSAgICAgICAgZW51bSBGbGFncyB7Ci0gICAgICAgICAgICBrQmFzZURhdGFPZmZzZXRQcmVzZW50ICAgICAgICAgPSAweDAxLAotICAgICAgICAgICAga1NhbXBsZURlc2NyaXB0aW9uSW5kZXhQcmVzZW50ID0gMHgwMiwKLSAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50ICA9IDB4MDgsCi0gICAgICAgICAgICBrRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50ICAgICAgPSAweDEwLAotICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVGbGFnc1ByZXNlbnQgICAgID0gMHgyMCwKLSAgICAgICAgICAgIGtEdXJhdGlvbklzRW1wdHkgICAgICAgICAgICAgICA9IDB4MTAwMDAsCi0gICAgICAgIH07Ci0KLSAgICAgICAgdWludDMyX3QgbVRyYWNrSUQ7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgdWludDY0X3QgbUJhc2VEYXRhT2Zmc2V0OwotICAgICAgICB1aW50MzJfdCBtU2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUZsYWdzOwotCi0gICAgICAgIHVpbnQ2NF90IG1EYXRhT2Zmc2V0OwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRGlzcGF0Y2hFbnRyeSBrRGlzcGF0Y2hUYWJsZVtdOwotCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIG9mZl90IG1CdWZmZXJQb3M7Ci0gICAgYm9vbCBtU3VzcGVuZGVkOwotICAgIGJvb2wgbURvbmVXaXRoTW9vdjsKLSAgICBvZmZfdCBtRmlyc3RNb29mT2Zmc2V0OyAvLyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3Igb2Zmc2V0cyBjYWxjdWxhdGVkIGZyb20gdGhlIHNpZHggYm94Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICBWZWN0b3I8Q29udGFpbmVyPiBtU3RhY2s7Ci0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFRyYWNrSW5mbz4gbVRyYWNrczsgIC8vIFRyYWNrSW5mbyBieSB0cmFja0lECi0gICAgVmVjdG9yPE1lZGlhRGF0YUluZm8+IG1NZWRpYURhdGE7Ci0KLSAgICB1aW50MzJfdCBtQ3VycmVudFRyYWNrSUQ7Ci0KLSAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7Ci0KLSAgICBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyBtVHJhY2tGcmFnbWVudEhlYWRlckluZm87Ci0KLSAgICBzdGF0dXNfdCBvblByb2NlZWQoKTsKLSAgICBzdGF0dXNfdCBvbkRlcXVldWVBY2Nlc3NVbml0KHNpemVfdCB0cmFja0luZGV4LCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7Ci0gICAgc3RhdHVzX3Qgb25TZWVrVG8oYm9vbCB3YW50QXVkaW8sIGludDY0X3QgcG9zaXRpb24pOwotCi0gICAgdm9pZCBlbnRlcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgdHlwZSwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICB1aW50MTZfdCByZWFkVTE2KHNpemVfdCBvZmZzZXQpOwotICAgIHVpbnQzMl90IHJlYWRVMzIoc2l6ZV90IG9mZnNldCk7Ci0gICAgdWludDY0X3QgcmVhZFU2NChzaXplX3Qgb2Zmc2V0KTsKLSAgICB2b2lkIHNraXAob2ZmX3QgZGlzdGFuY2UpOwotICAgIHN0YXR1c190IG5lZWQoc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZml0c0NvbnRhaW5lcih1aW50NjRfdCBzaXplKSBjb25zdDsKLQotICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlTWVkaWFIZWFkZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlTWVkaWFIYW5kbGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRXh0ZW5kcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRnJhZ21lbnRSdW4oCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlVmlzdWFsU2FtcGxlRW50cnkoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQXVkaW9TYW1wbGVFbnRyeSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZU1lZGlhRGF0YSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTZWdtZW50SW5kZXgoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIFRyYWNrSW5mbyAqZWRpdFRyYWNrKHVpbnQzMl90IHRyYWNrSUQsIGJvb2wgY3JlYXRlSWZOZWNlc3NhcnkgPSBmYWxzZSk7Ci0KLSAgICBzc2l6ZV90IGZpbmRUcmFjayhib29sIHdhbnRBdWRpbykgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBtYWtlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbywKLSAgICAgICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvLAotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwotCi0gICAgc3RhdHVzX3QgZ2V0U2FtcGxlKAotICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvLAotICAgICAgICAgICAgc3A8VHJhY2tGcmFnbWVudD4gKmZyYWdtZW50LAotICAgICAgICAgICAgU2FtcGxlSW5mbyAqc2FtcGxlSW5mbyk7Ci0KLSAgICBzdGF0aWMgaW50IENvbXBhcmVTYW1wbGVMb2NhdGlvbigKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmc2FtcGxlLCBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbyk7Ci0KLSAgICB2b2lkIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0KLSAgICB2b2lkIGNvcHlCdWZmZXIoCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiAqZHN0LAotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGcmFnbWVudGVkTVA0UGFyc2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUEFSU0VSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBkNGI3ZjlmLi4xYzNjZDVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC00OCwxNCArNDgsNiBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCYW5kd2lkdGhTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IFVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7Ci0gICAgYm9vbCBnZXRVSUQodWlkX3QgKnVpZCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgc3A8SFRUUEJhc2U+IENyZWF0ZSh1aW50MzJfdCBmbGFncyA9IDApOwotCiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7CiAgICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7CiAKQEAgLTg3LDkgKzc5LDYgQEAKICAgICBpbnQzMl90IG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwczsKICAgICBpbnQzMl90IG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zOwogCi0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKLQogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBCYXNlKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAppbmRleCA3YjRiYzZkLi4xZmU2ZmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCkBAIC0zOSw2ICszOSwxNCBAQAogICAgIHVpbnQzMl90IG1EdXJhdGlvblVzOwogfTsKIAorc3RydWN0IFRyZXggeworICAgIHVpbnQzMl90IHRyYWNrX0lEOworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX3NpemU7CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7Cit9OworCiBjbGFzcyBNUEVHNEV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CiBwdWJsaWM6CiAgICAgLy8gRXh0cmFjdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mICJzb3VyY2UiLgpAQCAtNzQsMTEgKzgyLDEyIEBACiAgICAgfTsKIAogICAgIFZlY3RvcjxTaWR4RW50cnk+IG1TaWR4RW50cmllczsKLSAgICB1aW50NjRfdCBtU2lkeER1cmF0aW9uOwogICAgIG9mZjY0X3QgbU1vb2ZPZmZzZXQ7CiAKICAgICBWZWN0b3I8UHNzaEluZm8+IG1Qc3NoOwogCisgICAgVmVjdG9yPFRyZXg+IG1UcmV4OworCiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1IYXNWaWRlbzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCmluZGV4IDk0OWE0OWUuLmEyOWJkZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaApAQCAtMzcsNiArMzcsOCBAQAogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKQEAgLTEwOCw2ICsxMTAsNyBAQAogICAgIG9mZjY0X3QgbUxhc3RBY2Nlc3NQb3M7CiAgICAgc3A8QU1lc3NhZ2U+IG1Bc3luY1Jlc3VsdDsKICAgICBib29sIG1GZXRjaGluZzsKKyAgICBib29sIG1EaXNjb25uZWN0aW5nOwogICAgIGludDY0X3QgbUxhc3RGZXRjaFRpbWVVczsKIAogICAgIGludDMyX3QgbU51bVJldHJpZXNMZWZ0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKaW5kZXggMmJjMzc1OS4uMmRhNWM2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCkBAIC03NSw2ICs3NSwxMCBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhfZnJhbWVfd2lkdGgsIE9NWF9VMzIgbWF4X2ZyYW1lX2hlaWdodCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKTsKQEAgLTEzNiwxMCArMTQwLDEwIEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwRXZlbnREYXRhKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgT25FbXB0eUJ1ZmZlckRvbmUoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CiAKICAgICBPTVhfRVJST1JUWVBFIE9uRmlsbEJ1ZmZlckRvbmUoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CiAKICAgICB2b2lkIGludmFsaWRhdGVOb2RlSUQobm9kZV9pZCBub2RlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKaW5kZXggMzBkOTU4NC4uYmNkYWE5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCkBAIC02Miw2ICs2MiwxMCBAQAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKICAgICAgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCk7CiAKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSk7CisKICAgICBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpOwpAQCAtMTQzLDEyICsxNDcsMjQgQEAKICAgICAgICAgT01YOjpidWZmZXJfaWQgbUlEOwogICAgIH07CiAgICAgVmVjdG9yPEFjdGl2ZUJ1ZmZlcj4gbUFjdGl2ZUJ1ZmZlcnM7CisgICAgLy8gZm9yIGJ1ZmZlciBwdHIgdG8gYnVmZmVyIGlkIHRyYW5zbGF0aW9uCisgICAgTXV0ZXggbUJ1ZmZlcklETG9jazsKKyAgICB1aW50MzJfdCBtQnVmZmVySURDb3VudDsKKyAgICBLZXllZFZlY3RvcjxPTVg6OmJ1ZmZlcl9pZCwgT01YX0JVRkZFUkhFQURFUlRZUEUgKj4gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXI7CisgICAgS2V5ZWRWZWN0b3I8T01YX0JVRkZFUkhFQURFUlRZUEUgKiwgT01YOjpidWZmZXJfaWQ+IG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklEOwogCiAgICAgfk9NWE5vZGVJbnN0YW5jZSgpOwogCiAgICAgdm9pZCBhZGRBY3RpdmVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIE9NWDo6YnVmZmVyX2lkIGlkKTsKICAgICB2b2lkIHJlbW92ZUFjdGl2ZUJ1ZmZlcihPTVhfVTMyIHBvcnRJbmRleCwgT01YOjpidWZmZXJfaWQgaWQpOwogICAgIHZvaWQgZnJlZUFjdGl2ZUJ1ZmZlcnMoKTsKKworICAgIC8vIEZvciBidWZmZXIgaWQgbWFuYWdlbWVudAorICAgIE9NWDo6YnVmZmVyX2lkIG1ha2VCdWZmZXJJRChPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVySGVhZGVyKTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqZmluZEJ1ZmZlckhlYWRlcihPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpOworICAgIE9NWDo6YnVmZmVyX2lkIGZpbmRCdWZmZXJJRChPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVySGVhZGVyKTsKKyAgICB2b2lkIGludmFsaWRhdGVCdWZmZXJJRChPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpOworCiAgICAgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcjJfbCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwKICAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpOwpAQCAtMTcwLDcgKzE4Niw5IEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKICAgICAgICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CiAKLSAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CisgICAgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgICAgIE9NWF9CT09MIHVzZUdyYXBoaWNCdWZmZXIsIE9NWF9CT09MICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGEpOwogCiAgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwogICAgIHZvaWQgc2V0R3JhcGhpY0J1ZmZlclNvdXJjZShjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgYnVmZmVyU291cmNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCmluZGV4IGNhNTlkYzAuLjJjNGY1NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaApAQCAtMjUsNiArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgSFRUUEJhc2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiAKIHN0cnVjdCBTRFBMb2FkZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzQsNyArMzUsMTAgQEAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRTRFBMb2FkZWQgPSAnc2RwbCcKICAgICB9OwotICAgIFNEUExvYWRlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MgPSAwLCBib29sIHVpZFZhbGlkID0gZmFsc2UsIHVpZF90IHVpZCA9IDApOworICAgIFNEUExvYWRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIHZvaWQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApAQCAtNTUsOCArNTksNiBAQAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIGNvbnN0IGNoYXIqIG1Vcmw7CiAgICAgdWludDMyX3QgbUZsYWdzOwotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7CiAgICAgc3A8QUxvb3Blcj4gbU5ldExvb3BlcjsKICAgICBib29sIG1DYW5jZWxsZWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaAppbmRleCBiNWEwNDNjLi42MGM5ZTdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCkBAIC0zMCw2ICszMCw3IEBACiAgICAgb2ZmNjRfdCBnZXRTYW1wbGVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZU9mZnNldDsgfQogICAgIHNpemVfdCBnZXRTYW1wbGVTaXplKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVTaXplOyB9CiAgICAgdWludDMyX3QgZ2V0U2FtcGxlVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlVGltZTsgfQorICAgIHVpbnQzMl90IGdldFNhbXBsZUR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsgfQogCiAgICAgc3RhdHVzX3QgZ2V0U2FtcGxlU2l6ZURpcmVjdCgKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCBzaXplX3QgKnNpemUpOwpAQCAtNjEsMTEgKzYyLDEyIEBACiAgICAgb2ZmNjRfdCBtQ3VycmVudFNhbXBsZU9mZnNldDsKICAgICBzaXplX3QgbUN1cnJlbnRTYW1wbGVTaXplOwogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlVGltZTsKKyAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOwogCiAgICAgdm9pZCByZXNldCgpOwogICAgIHN0YXR1c190IGZpbmRDaHVua1JhbmdlKHVpbnQzMl90IHNhbXBsZUluZGV4KTsKICAgICBzdGF0dXNfdCBnZXRDaHVua09mZnNldCh1aW50MzJfdCBjaHVuaywgb2ZmNjRfdCAqb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZSh1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUpOworICAgIHN0YXR1c190IGZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24odWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pOwogCiAgICAgU2FtcGxlSXRlcmF0b3IoY29uc3QgU2FtcGxlSXRlcmF0b3IgJik7CiAgICAgU2FtcGxlSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBTYW1wbGVJdGVyYXRvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaAppbmRleCA4NDdkZmY3Li40NjA0OTJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCkBAIC02Niw3ICs2Niw4IEBACiAgICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsCiAgICAgICAgICAgICBzaXplX3QgKnNpemUsCiAgICAgICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAotICAgICAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlID0gTlVMTCk7CisgICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMLAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uID0gTlVMTCk7CiAKICAgICBlbnVtIHsKICAgICAgICAga0ZsYWdCZWZvcmUsCkBAIC03NCw3ICs3NSw4IEBACiAgICAgICAgIGtGbGFnQ2xvc2VzdAogICAgIH07CiAgICAgc3RhdHVzX3QgZmluZFNhbXBsZUF0VGltZSgKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcV90aW1lLCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgICAgICAgICB1aW50NjRfdCByZXFfdGltZSwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4sCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKICAgICBzdGF0dXNfdCBmaW5kU3luY1NhbXBsZU5lYXIoCiAgICAgICAgICAgICB1aW50MzJfdCBzdGFydF9zYW1wbGVfaW5kZXgsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsCkBAIC0xMzcsNiArMTM5LDE0IEBACiAKICAgICBmcmllbmQgc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwogCisgICAgLy8gbm9ybWFsbHkgd2UgZG9uJ3Qgcm91bmQKKyAgICBpbmxpbmUgdWludDY0X3QgZ2V0U2FtcGxlVGltZSgKKyAgICAgICAgICAgIHNpemVfdCBzYW1wbGVfaW5kZXgsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoc2FtcGxlX2luZGV4IDwgKHNpemVfdCltTnVtU2FtcGxlU2l6ZXMgJiYgbVNhbXBsZVRpbWVFbnRyaWVzICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiBzY2FsZV9kZW4gIT0gMCkKKyAgICAgICAgICAgICAgICA/IChtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlX2luZGV4XS5tQ29tcG9zaXRpb25UaW1lICogc2NhbGVfbnVtKSAvIHNjYWxlX2RlbiA6IDA7CisgICAgfQorCiAgICAgc3RhdHVzX3QgZ2V0U2FtcGxlU2l6ZV9sKHVpbnQzMl90IHNhbXBsZV9pbmRleCwgc2l6ZV90ICpzYW1wbGVfc2l6ZSk7CiAgICAgdWludDMyX3QgZ2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHVpbnQzMl90IHNhbXBsZUluZGV4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAppbmRleCBmOGM2MWViLi41OTFiMzhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApAQCAtNTgsNiArNTgsMTEgQEAKICAgICAgICAgfSBtVHJhbnNpdGlvbjsKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCArIDEsCisgICAgICAgIGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4LAorICAgIH07CisKICAgICB2b2lkIGFkZFBvcnQoY29uc3QgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAmZGVmKTsKIAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggZDA1MGZhNi4uOWU5N2ViZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTI3LDggKzI3LDYgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgewpAQCAtNTcsMTIgKzU1LDMxIEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldENvbmZpZygKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKKwogICAgIHZvaWQgaW5pdFBvcnRzKE9NWF9VMzIgbnVtSW5wdXRCdWZmZXJzLAogICAgICAgICAgICAgT01YX1UzMiBpbnB1dEJ1ZmZlclNpemUsCiAgICAgICAgICAgICBPTVhfVTMyIG51bU91dHB1dEJ1ZmZlcnMsCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucyhib29sIHVwZGF0ZUNyb3AgPSB0cnVlKTsKKworICAgIHVpbnQzMl90IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgdWludDMyX3Qgb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisKKyAgICBlbnVtIENyb3BTZXR0aW5nc01vZGUgeworICAgICAgICBrQ3JvcFVuU2V0ID0gMCwKKyAgICAgICAga0Nyb3BTZXQsCisgICAgICAgIGtDcm9wQ2hhbmdlZCwKKyAgICB9OworICAgIHZvaWQgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAorICAgICAgICAgICAgYm9vbCAqcG9ydFdpbGxSZXNldCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wVW5TZXQsIGJvb2wgZmFrZVN0cmlkZSA9IGZhbHNlKTsKKworICAgIHZvaWQgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSk7CiAKICAgICBlbnVtIHsKICAgICAgICAga0lucHV0UG9ydEluZGV4ICA9IDAsCkBAIC03MCw2ICs4Nyw4IEBACiAgICAgICAgIGtNYXhQb3J0SW5kZXggPSAxLAogICAgIH07CiAKKyAgICBib29sIG1Jc0FkYXB0aXZlOworICAgIHVpbnQzMl90IG1BZGFwdGl2ZU1heFdpZHRoLCBtQWRhcHRpdmVNYXhIZWlnaHQ7CiAgICAgdWludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OwogICAgIHVpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjgxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfVklERU9fRU5DT0RFUl9PTVhfQ09NUE9ORU5UX0hfCisKKyNkZWZpbmUgU09GVF9WSURFT19FTkNPREVSX09NWF9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKK3N0cnVjdCBod19tb2R1bGVfdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIENvbnZlcnRGbGV4WVVWVG9QbGFuYXIoCisgICAgICAgICAgICB1aW50OF90ICpkc3QsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLAorICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfeWNiY3IgKnljYmNyLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5ZVlUsIHVpbnQ4X3QqIG91dFlVViwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgc3RhdGljIHZvaWQgQ29udmVydFJHQjMyVG9QbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKKyAgICAgICAgYm9vbCBiZ3IpOworCisgICAgY29uc3QgdWludDhfdCAqZXh0cmFjdEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICB1aW50OF90ICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBzcmNTaXplLAorICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSBjb25zdDsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleChjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0lucHV0UG9ydEluZGV4ID0gMCwKKyAgICAgICAga091dHB1dFBvcnRJbmRleCA9IDEsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIGNvbnN0IGh3X21vZHVsZV90ICptR3JhbGxvY01vZHVsZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX1ZJREVPX0VOQ09ERVJfT01YX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAppbmRleCA3YWIwMDQyLi5mYTNlYTg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaApAQCAtMjQsMTcgKzI0LDE3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1ldGFEYXRhOworc3RydWN0IEFNZXNzYWdlOwogCiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyIHsKIHB1YmxpYzoKLSAgICBTb2Z0d2FyZVJlbmRlcmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKKyAgICBleHBsaWNpdCBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOwogCiAgICAgflNvZnR3YXJlUmVuZGVyZXIoKTsKIAogICAgIHZvaWQgcmVuZGVyKAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSk7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcywKKyAgICAgICAgICAgIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCiBwcml2YXRlOgogICAgIGVudW0gWVVWTW9kZSB7CkBAIC01MSw2ICs1MSw4IEBACiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CisKKyAgICB2b2lkIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IGIwMmVkMGUuLjY2MzJjMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0zMyw2ICszMyw3IEBACiAgICAgdmlydHVhbCB+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgKaW5kZXggM2U4NDI1Ni4uMjk2MzE1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICB9OwogCiAgICAgc3RydWN0IFN0b3BFdmVudCA6IHB1YmxpYyBUaW1lZEV2ZW50UXVldWU6OkV2ZW50IHsKLSAgICAgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCBub3dfdXMpIHsKKyAgICAgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCAvKiBub3dfdXMgKi8pIHsKICAgICAgICAgICAgIHF1ZXVlLT5tU3RvcHBlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmgKaW5kZXggOGU2Mjk0Ni4uYWI3ZThiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oCkBAIC00OSw2ICs0OSw3IEBACiAgICAgdmlydHVhbCBzcDxNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CisgICAgdmlydHVhbCB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSBjYWNoZWQgZnJvbSB0aGUgY3VycmVudAogICAgIC8vIHBsYXliYWNrIHBvc2l0aWlvbiAoaW4gdXMpLgpAQCAtNzQsOCArNzUsNiBAQAogICAgIC8vIGNvZGVjLgogICAgIHZvaWQgc2V0Q3J5cHRvUGx1Z2luTW9kZShib29sIGNyeXB0b1BsdWdpbk1vZGUpOwogCi0gICAgdm9pZCBzZXRVSUQodWlkX3QgdWlkKTsKLQogICAgIHN0YXRpYyBib29sIGdldFZlbmRvckxpYkhhbmRsZSgpOwogCiAgICAgc3RhdHVzX3QgZ2V0RXJyb3IoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY1MWE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDSFJPTUlVTV9IVFRQX1NUVUJfSF8KLSNkZWZpbmUgQ0hST01JVU1fSFRUUF9TVFVCX0hfCi0KLSNpbmNsdWRlIDxpbmNsdWRlL0hUVFBCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1leHRlcm4gIkMiIHsKLUhUVFBCYXNlICpjcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKTsKLQotc3RhdHVzX3QgVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1EYXRhU291cmNlICpjcmVhdGVEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSk7Ci19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKaW5kZXggMmQ4YzFlMS4uNDQ2ZmY4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCkBAIC04LDcgKzgsNyBAQAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tYXRyb3NrYQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKaW5kZXggMjVkMGNmMS4uNDRhMWUyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiAjaW5jbHVkZSAiTWF0cm9za2FFeHRyYWN0b3IuaCIKIAotI2luY2x1ZGUgIm1rdnBhcnNlci5ocHAiCi0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CkBAIC0zNCw2ICszMiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEYXRhU291cmNlUmVhZGVyIDogcHVibGljIG1rdnBhcnNlcjo6SU1rdlJlYWRlciB7CkBAIC04OCw3ICs4OCw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdHJ1Y3QgQmxvY2tJdGVyYXRvciB7Ci0gICAgQmxvY2tJdGVyYXRvcihNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKTsKKyAgICBCbG9ja0l0ZXJhdG9yKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpOwogCiAgICAgYm9vbCBlb3MoKSBjb25zdDsKIApAQCAtMTA0LDcgKzEwNCw4IEBACiAKIHByaXZhdGU6CiAgICAgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7Ci0gICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CisgICAgbG9uZyBsb25nIG1UcmFja051bTsKKyAgICB1bnNpZ25lZCBsb25nIG1JbmRleDsKIAogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbUNsdXN0ZXI7CiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9ja0VudHJ5ICptQmxvY2tFbnRyeTsKQEAgLTE1Niw2ICsxNTcsNTMgQEAKICAgICBNYXRyb3NrYVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1hdHJvc2thU291cmNlICYpOwogfTsKIAorY29uc3QgbWt2cGFyc2VyOjpUcmFjayogTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbzo6Z2V0VHJhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1FeHRyYWN0b3ItPm1TZWdtZW50LT5HZXRUcmFja3MoKS0+R2V0VHJhY2tCeU51bWJlcihtVHJhY2tOdW0pOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgZXhhY3RseSB0aGUgc2FtZSBhcyBta3ZwYXJzZXI6OkN1ZXM6OkZpbmQsIGV4Y2VwdCB0aGF0IGl0CisvLyBzZWFyY2hlcyBpbiBvdXIgb3duIHRyYWNrIGJhc2VkIHZlY3RvcnMuIFdlIHNob3VsZCBub3QgbmVlZCB0aGlzIG9uY2UgbWt2cGFyc2VyCisvLyBhZGRzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuCitjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvOjpmaW5kKAorICAgICAgICBsb25nIGxvbmcgdGltZU5zKSBjb25zdCB7CisgICAgQUxPR1YoIm1DdWVQb2ludHMuc2l6ZSAlenUiLCBtQ3VlUG9pbnRzLnNpemUoKSk7CisgICAgaWYgKG1DdWVQb2ludHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50KiBjcCA9IG1DdWVQb2ludHMuaXRlbUF0KDApOworICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIHRyYWNrID0gZ2V0VHJhY2soKTsKKyAgICBpZiAodGltZU5zIDw9IGNwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KSkgeworICAgICAgICByZXR1cm4gY3AtPkZpbmQodHJhY2spOworICAgIH0KKworICAgIC8vIEJpbmFyeSBzZWFyY2hlcyB0aHJvdWdoIHJlbGV2YW50IGN1ZXM7IGFzc3VtZXMgY3VlcyBhcmUgb3JkZXJlZCBieSB0aW1lY29kZS4KKyAgICAvLyBJZiB3ZSBkbyBkZXRlY3Qgb3V0LW9mLW9yZGVyIGN1ZXMsIHJldHVybiBOVUxMLgorICAgIHNpemVfdCBsbyA9IDA7CisgICAgc2l6ZV90IGhpID0gbUN1ZVBvaW50cy5zaXplKCk7CisgICAgd2hpbGUgKGxvIDwgaGkpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1pZCA9IGxvICsgKGhpIC0gbG8pIC8gMjsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogY29uc3QgbWlkQ3AgPSBtQ3VlUG9pbnRzLml0ZW1BdChtaWQpOworICAgICAgICBjb25zdCBsb25nIGxvbmcgY3VlVGltZU5zID0gbWlkQ3AtPkdldFRpbWUobUV4dHJhY3Rvci0+bVNlZ21lbnQpOworICAgICAgICBpZiAoY3VlVGltZU5zIDw9IHRpbWVOcykgeworICAgICAgICAgICAgbG8gPSBtaWQgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGkgPSBtaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobG8gPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjcCA9IG1DdWVQb2ludHMuaXRlbUF0KGxvIC0gMSk7CisgICAgaWYgKGNwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KSA+IHRpbWVOcykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY3AtPkZpbmQodHJhY2spOworfQorCiBNYXRyb3NrYVNvdXJjZTo6TWF0cm9za2FTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPE1hdHJvc2thRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBzaXplX3QgaW5kZXgpCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCkBAIC0xNjMsNyArMjExLDggQEAKICAgICAgIG1UeXBlKE9USEVSKSwKICAgICAgIG1Jc0F1ZGlvKGZhbHNlKSwKICAgICAgIG1CbG9ja0l0ZXIobUV4dHJhY3Rvci5nZXQoKSwKLSAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSksCisgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0sCisgICAgICAgICAgICAgICAgIGluZGV4KSwKICAgICAgIG1OQUxTaXplTGVuKDApIHsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKIApAQCAtMTg0LDcgKzIzMyw3IEBACiAgICAgICAgIENIRUNLX0dFKGF2Y2NTaXplLCA1dSk7CiAKICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGF2Y2NbNF0gJiAzKTsKLSAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJWQiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6dSIsIG1OQUxTaXplTGVuKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgbVR5cGUgPSBBQUM7CiAgICAgfQpAQCAtMTk0LDcgKzI0Myw3IEBACiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBtQmxvY2tJdGVyLnJlc2V0KCk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMTMsOSArMjYyLDEwIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBCbG9ja0l0ZXJhdG9yOjpCbG9ja0l0ZXJhdG9yKAotICAgICAgICBNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKQorICAgICAgICBNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtLCB1bnNpZ25lZCBsb25nIGluZGV4KQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbVRyYWNrTnVtKHRyYWNrTnVtKSwKKyAgICAgIG1JbmRleChpbmRleCksCiAgICAgICBtQ2x1c3RlcihOVUxMKSwKICAgICAgIG1CbG9ja0VudHJ5KE5VTEwpLAogICAgICAgbUJsb2NrRW50cnlJbmRleCgwKSB7CkBAIC0zMTQsMTQgKzM2NCwxNCBAQAogCiAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gLTFsbDsKIAotICAgIGNvbnN0IGludDY0X3Qgc2Vla1RpbWVOcyA9IHNlZWtUaW1lVXMgKiAxMDAwbGw7CisgICAgY29uc3QgaW50NjRfdCBzZWVrVGltZU5zID0gc2Vla1RpbWVVcyAqIDEwMDBsbCAtIG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zOwogCiAgICAgbWt2cGFyc2VyOjpTZWdtZW50KiBjb25zdCBwU2VnbWVudCA9IG1FeHRyYWN0b3ItPm1TZWdtZW50OwogCiAgICAgLy8gU3BlY2lhbCBjYXNlIHRoZSAwIHNlZWsgdG8gYXZvaWQgbG9hZGluZyBDdWVzIHdoZW4gdGhlIGFwcGxpY2F0aW9uCiAgICAgLy8gZXh0cmFuZW91c2x5IHNlZWtzIHRvIDAgYmVmb3JlIHBsYXlpbmcuCiAgICAgaWYgKHNlZWtUaW1lTnMgPD0gMCkgewotICAgICAgICBBTE9HVigiU2VlayB0byBiZWdpbm5pbmc6ICVsbGQiLCBzZWVrVGltZVVzKTsKKyAgICAgICAgQUxPR1YoIlNlZWsgdG8gYmVnaW5uaW5nOiAlIiBQUklkNjQsIHNlZWtUaW1lVXMpOwogICAgICAgICBtQ2x1c3RlciA9IHBTZWdtZW50LT5HZXRGaXJzdCgpOwogICAgICAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKICAgICAgICAgZG8gewpAQCAtMzMwLDcgKzM4MCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBTE9HVigiU2Vla2luZyB0bzogJWxsZCIsIHNlZWtUaW1lVXMpOworICAgIEFMT0dWKCJTZWVraW5nIHRvOiAlIiBQUklkNjQsIHNlZWtUaW1lVXMpOwogCiAgICAgLy8gSWYgdGhlIEN1ZXMgaGF2ZSBub3QgYmVlbiBsb2NhdGVkIHRoZW4gZmluZCB0aGVtLgogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlcyogcEN1ZXMgPSBwU2VnbWVudC0+R2V0Q3VlcygpOwpAQCAtMzYzLDkgKzQxMywyMCBAQAogICAgIH0KIAogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIHBDUDsKKyAgICBta3ZwYXJzZXI6OlRyYWNrcyBjb25zdCAqcFRyYWNrcyA9IHBTZWdtZW50LT5HZXRUcmFja3MoKTsKKyAgICB1bnNpZ25lZCBsb25nIGludCB0cmFja0NvdW50ID0gcFRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsKICAgICB3aGlsZSAoIXBDdWVzLT5Eb25lUGFyc2luZygpKSB7CiAgICAgICAgIHBDdWVzLT5Mb2FkQ3VlUG9pbnQoKTsKICAgICAgICAgcENQID0gcEN1ZXMtPkdldExhc3QoKTsKKyAgICAgICAgQ0hFQ0socENQKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqcFRyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSAmJiBwQ1AtPkZpbmQocFRyYWNrKSkgeyAvLyBWSURFT19UUkFDSworICAgICAgICAgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8mIHRyYWNrID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB0cmFjay5tQ3VlUG9pbnRzLnB1c2hfYmFjayhwQ1ApOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgaWYgKHBDUC0+R2V0VGltZShwU2VnbWVudCkgPj0gc2Vla1RpbWVOcykgewogICAgICAgICAgICAgQUxPR1YoIlBhcnNlZCBwYXN0IHJlbGV2YW50IEN1ZSIpOwpAQCAtMzczLDIyICs0MzQsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFRoZSBDdWUgaW5kZXggaXMgYnVpbHQgYXJvdW5kIHZpZGVvIGtleWZyYW1lcwotICAgIG1rdnBhcnNlcjo6VHJhY2tzIGNvbnN0ICpwVHJhY2tzID0gcFNlZ21lbnQtPkdldFRyYWNrcygpOwotICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IE5VTEw7Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBUcmFja3MtPkdldFRyYWNrc0NvdW50KCk7ICsraW5kZXgpIHsKLSAgICAgICAgcFRyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKLSAgICAgICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxKSB7IC8vIFZJREVPX1RSQUNLCi0gICAgICAgICAgICBBTE9HVigiVmlkZW8gdHJhY2sgbG9jYXRlZCBhdCAlZCIsIGluZGV4KTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKnBUUCA9IE5VTEw7CisgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdGhpc1RyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KG1JbmRleCk7CisgICAgaWYgKHRoaXNUcmFjay0+R2V0VHlwZSgpID09IDEpIHsgLy8gdmlkZW8KKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyYgdHJhY2sgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQobUluZGV4KTsKKyAgICAgICAgcFRQID0gdHJhY2suZmluZChzZWVrVGltZU5zKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGUgQ3VlIGluZGV4IGlzIGJ1aWx0IGFyb3VuZCB2aWRlbyBrZXlmcmFtZXMKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrQ291bnQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlJbmRleChpbmRleCk7CisgICAgICAgICAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEgJiYgcEN1ZXMtPkZpbmQoc2Vla1RpbWVOcywgcFRyYWNrLCBwQ1AsIHBUUCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW8gdHJhY2sgbG9jYXRlZCBhdCAlenUiLCBpbmRleCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIC8vIEFsd2F5cyAqc2VhcmNoKiBiYXNlZCBvbiB0aGUgdmlkZW8gdHJhY2ssIGJ1dCBmaW5hbGl6ZSBiYXNlZCBvbiBtVHJhY2tOdW0KLSAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uKiBwVFA7Ci0gICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxKSB7Ci0gICAgICAgIHBDdWVzLT5GaW5kKHNlZWtUaW1lTnMsIHBUcmFjaywgcENQLCBwVFApOwotICAgIH0gZWxzZSB7CisgICAgaWYgKCFwVFApIHsKICAgICAgICAgQUxPR0UoIkRpZCBub3QgbG9jYXRlIHRoZSB2aWRlbyB0cmFjayBmb3Igc2Vla2luZyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDA5LDEwICs0NzMsMTMgQEAKIAogICAgICAgICBpZiAoaXNBdWRpbyB8fCBibG9jaygpLT5Jc0tleSgpKSB7CiAgICAgICAgICAgICAvLyBBY2NlcHQgdGhlIGZpcnN0IGtleSBmcmFtZQotICAgICAgICAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gKGJsb2NrKCktPkdldFRpbWUobUNsdXN0ZXIpICsgNTAwTEwpIC8gMTAwMExMOwotICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RlZCBzZWVrIHBvaW50OiAlbGxkIGFjdHVhbDogJWxsZCIsCi0gICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSAoYmxvY2soKS0+R2V0VGltZShtQ2x1c3RlcikgKyA1MDBMTCkgLyAxMDAwTEw7CisgICAgICAgICAgICBpZiAodGhpc1RyYWNrLT5HZXRUeXBlKCkgPT0gMSB8fCBmcmFtZVRpbWVVcyA+PSBzZWVrVGltZVVzKSB7CisgICAgICAgICAgICAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gZnJhbWVUaW1lVXM7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RlZCBzZWVrIHBvaW50OiAlIiBQUklkNjQgIiBhY3R1YWw6ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAqYWN0dWFsRnJhbWVUaW1lVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtNjM0LDcgKzcwMSw4IEBACiAgICAgICBtUmVhZGVyKG5ldyBEYXRhU291cmNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzKGZhbHNlKSwKLSAgICAgIG1Jc1dlYm0oZmFsc2UpIHsKKyAgICAgIG1Jc1dlYm0oZmFsc2UpLAorICAgICAgbVNlZWtQcmVSb2xsTnMoMCkgewogICAgIG9mZjY0X3Qgc2l6ZTsKICAgICBtSXNMaXZlU3RyZWFtaW5nID0KICAgICAgICAgKG1EYXRhU291cmNlLT5mbGFncygpCkBAIC02NjAsMTQgKzcyOCwyMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gZnJvbSBta3ZwYXJzZXI6OlNlZ21lbnQ6OkxvYWQoKSwgYnV0IHN0b3AgYXQgZmlyc3QgY2x1c3RlcgogICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKLSAgICBDSEVDS19FUShyZXQsIDApOwotCi0gICAgbG9uZyBsZW47Ci0gICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKLSAgICBDSEVDS19FUShyZXQsIDApOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgaWYgKHJldCA+PSAxKSB7CisgICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7CisgICAgfQogCiAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR1coIkNvcnJ1cHQgJXMgc291cmNlOiAlcyIsIG1Jc1dlYm0gPyAid2VibSIgOiAibWF0cm9za2EiLAorICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKG1EYXRhU291cmNlLT5nZXRVcmkoKSkuY19zdHIoKSk7CiAgICAgICAgIGRlbGV0ZSBtU2VnbWVudDsKICAgICAgICAgbVNlZ21lbnQgPSBOVUxMOwogICAgICAgICByZXR1cm47CkBAIC05MzgsNiArMTAxNCwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgIGVyciA9IGFkZFZvcmJpc0NvZGVjSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9PUFVTIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXksIHRyYWNrLT5HZXRDb2RlY0RlbGF5KCkpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbE5zID0gdHJhY2stPkdldFNlZWtQcmVSb2xsKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgewogICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTk2Niw2ICsxMDQ4LDcgQEAKICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7CiAgICAgICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOwogICAgICAgICB0cmFja0luZm8tPm1NZXRhID0gbWV0YTsKKyAgICAgICAgdHJhY2tJbmZvLT5tRXh0cmFjdG9yID0gdGhpczsKICAgICB9CiB9CiAKQEAgLTk4MCw3ICsxMDYzLDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIGluZm8tPm1UcmFja051bSk7CisgICAgICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCBpbmZvLT5tVHJhY2tOdW0sIGkpOwogICAgICAgICBpbnQzMl90IGogPSAwOwogICAgICAgICBpbnQ2NF90IHRodW1ibmFpbFRpbWVVcyA9IDA7CiAgICAgICAgIHNpemVfdCBtYXhCbG9ja1NpemUgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKaW5kZXggMTI5NGI0Zi4uZGIzNmJmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC0xOCwxNCArMTgsMTIgQEAKIAogI2RlZmluZSBNQVRST1NLQV9FWFRSQUNUT1JfSF8KIAorI2luY2x1ZGUgIm1rdnBhcnNlci5ocHAiCisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotbmFtZXNwYWNlIG1rdnBhcnNlciB7Ci1zdHJ1Y3QgU2VnbWVudDsKLX07Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwpAQCAtNTgsNiArNTYsMTEgQEAKICAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKICAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CiAgICAgICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKKyAgICAgICAgY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgICAgIFZlY3Rvcjxjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50Kj4gbUN1ZVBvaW50czsKKworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiBnZXRUcmFjaygpIGNvbnN0OworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpmaW5kKGxvbmcgbG9uZyB0aW1lTnMpIGNvbnN0OwogICAgIH07CiAKICAgICBNdXRleCBtTG9jazsKQEAgLTY5LDYgKzcyLDcgQEAKICAgICBib29sIG1FeHRyYWN0ZWRUaHVtYm5haWxzOwogICAgIGJvb2wgbUlzTGl2ZVN0cmVhbWluZzsKICAgICBib29sIG1Jc1dlYm07CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGxOczsKIAogICAgIHZvaWQgYWRkVHJhY2tzKCk7CiAgICAgdm9pZCBmaW5kVGh1bWJuYWlscygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L0ZyYWdtZW50ZWRNUDRQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L0ZyYWdtZW50ZWRNUDRQYXJzZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTAyNjU2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9GcmFnbWVudGVkTVA0UGFyc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRnJhZ21lbnRlZE1QNFBhcnNlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgiCi0jaW5jbHVkZSAiVHJhY2tGcmFnbWVudC5oIgotCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciAqRm91cmNjMlN0cmluZyh1aW50MzJfdCBmb3VyY2MpIHsKLSAgICBzdGF0aWMgY2hhciBidWZmZXJbNV07Ci0gICAgYnVmZmVyWzRdID0gJ1wwJzsKLSAgICBidWZmZXJbMF0gPSBmb3VyY2MgPj4gMjQ7Ci0gICAgYnVmZmVyWzFdID0gKGZvdXJjYyA+PiAxNikgJiAweGZmOwotICAgIGJ1ZmZlclsyXSA9IChmb3VyY2MgPj4gOCkgJiAweGZmOwotICAgIGJ1ZmZlclszXSA9IGZvdXJjYyAmIDB4ZmY7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqSW5kZW50U3RyaW5nKHNpemVfdCBuKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIga1NwYWNlW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICByZXR1cm4ga1NwYWNlICsgc2l6ZW9mKGtTcGFjZSkgLSAyICogbiAtIDE7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RGlzcGF0Y2hFbnRyeSBGcmFnbWVudGVkTVA0UGFyc2VyOjprRGlzcGF0Y2hUYWJsZVtdID0gewotICAgIHsgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JyksIDAsIE5VTEwgfSwKLSAgICB7IEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLCBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKSwgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpLCBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdpJywgJ2wnLCAncycsICd0JyksIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygndCcsICdrJywgJ2gnLCAnZCcpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tIZWFkZXIKLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAndicsICdlJywgJ3gnKSwgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCd0JywgJ3InLCAnZScsICd4JyksIEZPVVJDQygnbScsICd2JywgJ2UnLCAneCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0V4dGVuZHMKLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ2UnLCAnZCcsICd0JywgJ3MnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKSwgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhSGVhZGVyCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyksIEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYUhhbmRsZXIKLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKSwgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygnZCcsICdpJywgJ24nLCAnZicpLCBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksIEZPVVJDQygnbScsICdpJywgJ24nLCAnZicpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAncycsICd6JyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTYW1wbGVTaXplcyB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICd6JywgJzInKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNvbXBhY3RTYW1wbGVTaXplcyB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2MnKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNhbXBsZVRvQ2h1bmsgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDaHVua09mZnNldHMgfSwKLQotICAgIHsgRk9VUkNDKCdjJywgJ28nLCAnNicsICc0JyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDaHVua09mZnNldHM2NCB9LAotCi0gICAgeyBGT1VSQ0MoJ2EnLCAndicsICdjJywgJ0MnKSwgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhIH0sCi0KLSAgICB7IEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpLCBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhIH0sCi0KLSAgICB7IEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpLCBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpLCAwLCAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYURhdGEgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJyksIDAsIE5VTEwgfSwKLSAgICB7IEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpLCBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3QnLCAnZicsICdoJywgJ2QnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIKLSAgICB9LAotICAgIHsgRk9VUkNDKCd0JywgJ3InLCAndScsICduJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0ZyYWdtZW50UnVuCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ2YnLCAncicsICdhJyksIDAsIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ2knLCAnZCcsICd4JyksIDAsICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNlZ21lbnRJbmRleCB9LAotfTsKLQotc3RydWN0IEZpbGVTb3VyY2UgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U291cmNlIHsKLSAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgICAgICA6IG1GaWxlKGZvcGVuKGZpbGVuYW1lLCAicmIiKSkgewotICAgICAgICAgICAgQ0hFQ0sobUZpbGUgIT0gTlVMTCk7Ci0gICAgICAgIH0KLQotICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKSB7Ci0gICAgICAgIGZjbG9zZShtRmlsZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgZnNlZWsobUZpbGUsIG9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICByZXR1cm4gZnJlYWQoZGF0YSwgMSwgc2l6ZSwgbUZpbGUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc1NlZWthYmxlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgIEZJTEUgKm1GaWxlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZVNvdXJjZSk7Ci19OwotCi1zdHJ1Y3QgUmVhZFRyYWNrZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgUmVhZFRyYWNrZXIob2ZmNjRfdCBzaXplKSB7Ci0gICAgICAgIGFsbG9jU2l6ZSA9IDEgKyBzaXplIC8gODE5MjsgLy8gMSBiaXQgcGVyIGtpbG9ieXRlCi0gICAgICAgIGJpdG1hcCA9IChjaGFyKikgY2FsbG9jKDEsIGFsbG9jU2l6ZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgflJlYWRUcmFja2VyKCkgewotICAgICAgICBkdW1wVG9Mb2coKTsKLSAgICAgICAgZnJlZShiaXRtYXApOwotICAgIH0KLSAgICB2b2lkIG1hcmsob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGludCBmaXJzdGJpdCA9IG9mZnNldCAvIDEwMjQ7Ci0gICAgICAgIGludCBsYXN0Yml0ID0gKG9mZnNldCArIHNpemUgLSAxKSAvIDEwMjQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSBmaXJzdGJpdDsgaSA8PSBsYXN0Yml0OyBpKyspIHsKLSAgICAgICAgICAgIGJpdG1hcFtpLzhdIHw9ICgweDgwID4+IChpICYgNykpOwotICAgICAgICB9Ci0gICAgfQotCi0gcHJpdmF0ZToKLSAgICB2b2lkIGR1bXBUb0xvZygpIHsKLSAgICAgICAgLy8gOTYgY2hhcnMgcGVyIGxpbmUsIGVhY2ggY2hhciByZXByZXNlbnRzIG9uZSBraWxvYnl0ZSwgMSBrYiBwZXIgYml0Ci0gICAgICAgIGludCBudW1saW5lcyA9IGFsbG9jU2l6ZSAvIDEyOwotICAgICAgICBjaGFyIGJ1Zls5N107Ci0gICAgICAgIGNoYXIgKmN1ciA9IGJpdG1hcDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1saW5lczsgaSsrICYmIGN1cikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmWyhqICogOCkgKyBrXSA9ICgqY3VyICYgKDB4ODAgPj4gaykpID8gJ1gnIDogJy4nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Zls5Nl0gPSAnXDAnOwotICAgICAgICAgICAgQUxPR0koIiU1ZGs6ICVzIiwgaSAqIDk2LCBidWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2l6ZV90IGFsbG9jU2l6ZTsKLSAgICBjaGFyICpiaXRtYXA7Ci19OwotCi1zdHJ1Y3QgRGF0YVNvdXJjZVNvdXJjZSA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpTb3VyY2UgewotICAgIERhdGFTb3VyY2VTb3VyY2Uoc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpIHsKLSAgICAgICAgICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwpOwotI2lmIDAKLSAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgbVJlYWRUcmFja2VyID0gbmV3IFJlYWRUcmFja2VyKHNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY291bGRuJ3QgZ2V0IGRhdGEgc291cmNlIHNpemUiKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBpZiAobVJlYWRUcmFja2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1SZWFkVHJhY2tlci0+bWFyayhvZmZzZXQsIHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlzU2Vla2FibGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8UmVhZFRyYWNrZXI+IG1SZWFkVHJhY2tlcjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERhdGFTb3VyY2VTb3VyY2UpOwotfTsKLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6RnJhZ21lbnRlZE1QNFBhcnNlcigpCi0gICAgOiBtQnVmZmVyUG9zKDApLAotICAgICAgbVN1c3BlbmRlZChmYWxzZSksCi0gICAgICBtRG9uZVdpdGhNb292KGZhbHNlKSwKLSAgICAgIG1GaXJzdE1vb2ZPZmZzZXQoMCksCi0gICAgICBtRmluYWxSZXN1bHQoT0spIHsKLX0KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6fkZyYWdtZW50ZWRNUDRQYXJzZXIoKSB7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c3RhcnQoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOwotICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgRmlsZVNvdXJjZShmaWxlbmFtZSkpOwotICAgIG1zZy0+cG9zdCgpOwotICAgIEFMT0dWKCJQYXJzZXI6OnN0YXJ0KCVzKSIsIGZpbGVuYW1lKTsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpzdGFydChjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOwotICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwotICAgIG1zZy0+cG9zdCgpOwotICAgIEFMT0dWKCJQYXJzZXI6OnN0YXJ0KFNvdXJjZSkiKTsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpzdGFydChzcDxEYXRhU291cmNlPiAmc291cmNlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKLSAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IERhdGFTb3VyY2VTb3VyY2Uoc291cmNlKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0gICAgQUxPR1YoIlBhcnNlcjo6c3RhcnQoRGF0YVNvdXJjZSkiKTsKLX0KLQotc3A8QU1lc3NhZ2U+IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmdldEZvcm1hdChib29sIGF1ZGlvLCBib29sIHN5bmNocm9ub3VzKSB7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBib29sIG1vb3ZEb25lID0gbURvbmVXaXRoTW9vdjsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldEZvcm1hdCwgaWQoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRGb3JtYXQgcG9zdCBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpICYmIGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKHN5bmNocm9ub3VzICYmIGVyciA9PSAtRVdPVUxEQkxPQ0sgJiYgIW1vb3ZEb25lKSB7Ci0gICAgICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiQGdldEZvcm1hdCBwYXJzZXIgbm90IHJlYWR5IHlldCwgcmV0cnlpbmciKTsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImdldEZvcm1hdCBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7Ci0KLSAgICAgICAgQUxPR1YoInJldHVybmluZyBmb3JtYXQgJXMiLCBmb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmb3JtYXQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpzZWVrVG8oYm9vbCB3YW50QXVkaW8sIGludDY0X3QgdGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWtUbywgaWQoKSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCB3YW50QXVkaW8pOwotICAgIG1zZy0+c2V0SW50NjQoInBvc2l0aW9uIiwgdGltZVVzKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotYm9vbCBGcmFnbWVudGVkTVA0UGFyc2VyOjppc1NlZWthYmxlKCkgY29uc3QgewotICAgIHdoaWxlIChtRmlyc3RNb29mT2Zmc2V0ID09IDAgJiYgbUZpbmFsUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgfQotICAgIGJvb2wgc2Vla2FibGUgPSBtU291cmNlLT5pc1NlZWthYmxlKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IHNlZWthYmxlICYmIGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgIHNlZWthYmxlICY9ICFpbmZvLT5tU2lkeC5lbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gc2Vla2FibGU7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om9uU2Vla1RvKGJvb2wgd2FudEF1ZGlvLCBpbnQ2NF90IHBvc2l0aW9uKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gLUVJTlZBTDsKLSAgICBzc2l6ZV90IHRyYWNrSW5kZXggPSBmaW5kVHJhY2sod2FudEF1ZGlvKTsKLSAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgZXJyID0gdHJhY2tJbmRleDsKLSAgICB9IGVsc2UgewotICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0VmFsdWVBdCh0cmFja0luZGV4KTsKLQotICAgICAgICBpbnQgbnVtU2lkeEVudHJpZXMgPSBpbmZvLT5tU2lkeC5zaXplKCk7Ci0gICAgICAgIGludDY0X3QgdG90YWxUaW1lID0gMDsKLSAgICAgICAgb2ZmX3QgdG90YWxPZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNpZHhFbnRyaWVzOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IFNpZHhFbnRyeSAqc2UgPSAmaW5mby0+bVNpZHhbaV07Ci0gICAgICAgICAgICBpZiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzID4gcG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLDApOwotICAgICAgICAgICAgICAgIG1CdWZmZXJQb3MgPSB0b3RhbE9mZnNldDsKLSAgICAgICAgICAgICAgICBpZiAobUZpbmFsUmVzdWx0ID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOyAvLyBmb3JjZSByZXN1bWUKLSAgICAgICAgICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5mby0+bUZyYWdtZW50cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGluZm8tPm1EZWNvZGluZ1RpbWUgPSB0b3RhbFRpbWUgKiBpbmZvLT5tTWVkaWFUaW1lU2NhbGUgLyAxMDAwMDAwbGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG90YWxUaW1lICs9IHNlLT5tRHVyYXRpb25VczsKLSAgICAgICAgICAgIHRvdGFsT2Zmc2V0ICs9IHNlLT5tU2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigic2Vla1RvIG91dCBvZiByYW5nZSIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeW5jaHJvbm91cykgewotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVBY2Nlc3NVbml0LCBpZCgpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBhdWRpbyk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1YoImRlcXVldWUgZmFpbCAxOiAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpICYmIGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKHN5bmNocm9ub3VzICYmIGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJzZXIgbm90IHJlYWR5IHlldCwgcmV0cnlpbmciKTsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImRlcXVldWUgZmFpbCAyOiAlZCwgJWQiLCBlcnIsIHN5bmNocm9ub3VzKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsIGFjY2Vzc1VuaXQpKTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotfQotCi1zc2l6ZV90IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmZpbmRUcmFjayhib29sIHdhbnRBdWRpbykgY29uc3QgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy52YWx1ZUF0KGkpOwotCi0gICAgICAgIGJvb2wgaXNBdWRpbyA9Ci0gICAgICAgICAgICBpbmZvLT5tTWVkaWFIYW5kbGVyVHlwZSA9PSBGT1VSQ0MoJ3MnLCAnbycsICd1JywgJ24nKTsKLQotICAgICAgICBib29sIGlzVmlkZW8gPQotICAgICAgICAgICAgaW5mby0+bU1lZGlhSGFuZGxlclR5cGUgPT0gRk9VUkNDKCd2JywgJ2knLCAnZCcsICdlJyk7Ci0KLSAgICAgICAgaWYgKCh3YW50QXVkaW8gJiYgaXNBdWRpbykgfHwgKCF3YW50QXVkaW8gJiYgIWlzQXVkaW8pKSB7Ci0gICAgICAgICAgICBpZiAoaW5mby0+bVNhbXBsZURlc2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewotICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwotCi0gICAgICAgICAgICBtU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7Ci0KLSAgICAgICAgICAgIG1CdWZmZXIgPSBuZXcgQUJ1ZmZlcig1MTIgKiAxMDI0KTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwotCi0gICAgICAgICAgICBlbnRlcigwbGwsIDAsIDApOwotCi0gICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VlZCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRQcm9jZWVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDSyghbVN1c3BlbmRlZCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uUHJvY2VlZCgpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3VzcGVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IC1FQUdBSU4pIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgib25Qcm9jZWVkIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UmVhZE1vcmU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNpemVfdCBuZWVkZWQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJuZWVkZWQiLCAmbmVlZGVkKSk7Ci0KLSAgICAgICAgICAgIG1lbW1vdmUobUJ1ZmZlci0+YmFzZSgpLCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICBtQnVmZmVyUG9zICs9IG1CdWZmZXItPm9mZnNldCgpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0gbUJ1ZmZlci0+Y2FwYWNpdHkoKSAtIG1CdWZmZXItPnNpemUoKTsKLQotICAgICAgICAgICAgaWYgKG1heEJ5dGVzVG9SZWFkIDwgbmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlc2l6aW5nIGJ1ZmZlci4iKTsKLQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBQnVmZmVyKChtQnVmZmVyLT5zaXplKCkgKyBuZWVkZWQgKyAxMDIzKSAmIH4xMDIzKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkobmV3QnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBuZXdCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICBtQnVmZmVyID0gbmV3QnVmZmVyOwotICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbUJ1ZmZlci0+Y2FwYWNpdHkoKSAtIG1CdWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0tfR0UobWF4Qnl0ZXNUb1JlYWQsIG5lZWRlZCk7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclBvcyArIG1CdWZmZXItPnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+c2l6ZSgpLCBuZWVkZWQpOwotCi0gICAgICAgICAgICBpZiAobiA8IChzc2l6ZV90KW5lZWRlZCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJSZWFjaGVkIEVPRiB3aGVuIHJlYWRpbmcgJWQgQCAlZCArICVkIiwgbmVlZGVkLCBtQnVmZmVyUG9zLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgKyBuKTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VlZCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEdldEZvcm1hdDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB3YW50QXVkaW87Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmd2FudEF1ZGlvKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IC1FV09VTERCTE9DSzsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLQotICAgICAgICAgICAgc3NpemVfdCB0cmFja0luZGV4ID0gZmluZFRyYWNrKHdhbnRBdWRpbyk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRWYWx1ZUF0KHRyYWNrSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IGluZm8tPm1TYW1wbGVEZXNjcy5pdGVtQXQoMCkubUZvcm1hdDsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby0+bVNpZHhEdXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KCJkdXJhdGlvblVzIiwgaW5mby0+bVNpZHhEdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBnb2luZyB0byBiZSB6ZXJvLiBPaCB3ZWxsLi4uCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoImR1cmF0aW9uVXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAqIGluZm8tPm1EdXJhdGlvbiAvIGluZm8tPm1NZWRpYVRpbWVTY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCIsIGZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0RGVxdWV1ZUFjY2Vzc1VuaXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2FudEF1ZGlvOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJndhbnRBdWRpbykpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgdHJhY2tJbmRleCA9IGZpbmRUcmFjayh3YW50QXVkaW8pOwotCi0gICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSB0cmFja0luZGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwotICAgICAgICAgICAgICAgIGVyciA9IG9uRGVxdWV1ZUFjY2Vzc1VuaXQodHJhY2tJbmRleCwgJmFjY2Vzc1VuaXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0QnVmZmVyKCJhY2Nlc3NVbml0IiwgYWNjZXNzVW5pdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRTZWVrVG86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWtUbyIpOwotICAgICAgICAgICAgaW50MzJfdCB3YW50QXVkaW87Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmd2FudEF1ZGlvKSk7Ci0gICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInBvc2l0aW9uIiwgJnBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IC1FV09VTERCTE9DSzsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLQotICAgICAgICAgICAgc3NpemVfdCB0cmFja0luZGV4ID0gZmluZFRyYWNrKHdhbnRBdWRpbyk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IG9uU2Vla1RvKHdhbnRBdWRpbywgcG9zaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om9uUHJvY2VlZCgpIHsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICBpZiAoKGVyciA9IG5lZWQoOCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdWludDY0X3Qgc2l6ZSA9IHJlYWRVMzIoMCk7Ci0gICAgdWludDMyX3QgdHlwZSA9IHJlYWRVMzIoNCk7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gODsKLQotICAgIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgaWYgKChlcnIgPSBuZWVkKDE2KSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplID0gcmVhZFU2NChvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gODsKLSAgICB9Ci0KLSAgICB1aW50OF90IHVzZXJUeXBlWzE2XTsKLQotICAgIGlmICh0eXBlID09IEZPVVJDQygndScsICd1JywgJ2knLCAnZCcpKSB7Ci0gICAgICAgIGlmICgoZXJyID0gbmVlZChvZmZzZXQgKyAxNikpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KHVzZXJUeXBlLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIDE2KTsKLSAgICAgICAgb2Zmc2V0ICs9IDE2OwotICAgIH0KLQotICAgIENIRUNLKCFtU3RhY2suaXNFbXB0eSgpKTsKLSAgICB1aW50MzJfdCBwdHlwZSA9IG1TdGFjay5pdGVtQXQobVN0YWNrLnNpemUoKSAtIDEpLm1UeXBlOwotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtRGlzcGF0Y2hlcnMgPQotICAgICAgICBzaXplb2Yoa0Rpc3BhdGNoVGFibGUpIC8gc2l6ZW9mKGtEaXNwYXRjaFRhYmxlWzBdKTsKLQotICAgIHNpemVfdCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBrTnVtRGlzcGF0Y2hlcnM7ICsraSkgewotICAgICAgICBpZiAoa0Rpc3BhdGNoVGFibGVbaV0ubVR5cGUgPT0gdHlwZQotICAgICAgICAgICAgICAgICYmIGtEaXNwYXRjaFRhYmxlW2ldLm1QYXJlbnRUeXBlID09IHB0eXBlKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNhbXBsZUVudHJ5IGJveGVzIGFyZSBjb250YWluZXIgYm94ZXMgdGhhdCBzdGFydCB3aXRoIGEgdmFyaWFibGUKLSAgICAvLyBhbW91bnQgb2YgZGF0YSBkZXBlbmRpbmcgb24gdGhlIG1lZGlhIGhhbmRsZXIgdHlwZS4KLSAgICAvLyBXZSBkb24ndCBsb29rIGluc2lkZSAnaGludCcgdHlwZSBTYW1wbGVFbnRyeSBib3hlcy4KLQotICAgIGJvb2wgaXNTYW1wbGVFbnRyeUJveCA9Ci0gICAgICAgIChwdHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkKLSAgICAgICAgJiYgZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1NZWRpYUhhbmRsZXJUeXBlCi0gICAgICAgICE9IEZPVVJDQygnaCcsICdpJywgJ24nLCAndCcpOwotCi0gICAgaWYgKChpIDwga051bURpc3BhdGNoZXJzICYmIGtEaXNwYXRjaFRhYmxlW2ldLm1IYW5kbGVyID09IDApCi0gICAgICAgICAgICB8fCBpc1NhbXBsZUVudHJ5Qm94IHx8IHB0eXBlID09IEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYSBjb250YWluZXIgYm94LgotICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewotICAgICAgICAgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmaXJzdCBtb29mIEAgJTA4eCIsIG1CdWZmZXJQb3MgKyBvZmZzZXQpOwotICAgICAgICAgICAgICAgIG1GaXJzdE1vb2ZPZmZzZXQgPSBtQnVmZmVyUG9zICsgb2Zmc2V0IC0gODsgLy8gcG9pbnQgYXQgdGhlIHNpemUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKSkgewotICAgICAgICAgICAgaWYgKChlcnIgPSBuZWVkKG9mZnNldCArIDQpKSA8IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJykpIHsKLSAgICAgICAgICAgIGlmICgoZXJyID0gbmVlZChvZmZzZXQgKyA4KSkgPCBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZFUzMihvZmZzZXQgKyA0KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBhdCBsZWFzdCBzb21lIGVudHJpZXMuCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICB9IGVsc2UgaWYgKGlzU2FtcGxlRW50cnlCb3gpIHsKLSAgICAgICAgICAgIHNpemVfdCBoZWFkZXJTaXplOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tTWVkaWFIYW5kbGVyVHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCd2JywgJ2knLCAnZCcsICdlJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyA4IGJ5dGVzIFNhbXBsZUVudHJ5ICsgNzAgYnl0ZXMgVmlzdWFsU2FtcGxlRW50cnkKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSA9IDc4OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygncycsICdvJywgJ3UnLCAnbicpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcyBTYW1wbGVFbnRyeSArIDIwIGJ5dGVzIEF1ZGlvU2FtcGxlRW50cnkKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSA9IDI4OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSA9IDg7ICAvLyA4IGJ5dGVzIFNhbXBsZUVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgKyBoZWFkZXJTaXplID4gc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGVyciA9IG5lZWQob2Zmc2V0ICsgaGVhZGVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bU1lZGlhSGFuZGxlclR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygndicsICdpJywgJ2QnLCAnZScpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VWaXN1YWxTYW1wbGVFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvZmZzZXQsIG9mZnNldCArIGhlYWRlclNpemUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygncycsICdvJywgJ3UnLCAnbicpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VBdWRpb1NhbXBsZUVudHJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG9mZnNldCwgb2Zmc2V0ICsgaGVhZGVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBoZWFkZXJTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgc2tpcChvZmZzZXQpOwotCi0gICAgICAgIEFMT0dWKCIlc2VudGVyaW5nIGJveCBvZiB0eXBlICclcyciLAotICAgICAgICAgICAgICAgIEluZGVudFN0cmluZyhtU3RhY2suc2l6ZSgpKSwgRm91cmNjMlN0cmluZyh0eXBlKSk7Ci0KLSAgICAgICAgZW50ZXIobUJ1ZmZlclBvcyAtIG9mZnNldCwgdHlwZSwgc2l6ZSAtIG9mZnNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFmaXRzQ29udGFpbmVyKHNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpIDwga051bURpc3BhdGNoZXJzICYmIGtEaXNwYXRjaFRhYmxlW2ldLm1IYW5kbGVyICE9IDApIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBoYW5kbGVyIGZvciB0aGlzIGJveCB0eXBlLgotCi0gICAgICAgICAgICBpZiAoKGVyciA9IG5lZWQoc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIiVzcGFyc2luZyBib3ggb2YgdHlwZSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgSW5kZW50U3RyaW5nKG1TdGFjay5zaXplKCkpLCBGb3VyY2MyU3RyaW5nKHR5cGUpKTsKLQotICAgICAgICAgICAgaWYgKChlcnIgPSAodGhpcy0+KmtEaXNwYXRjaFRhYmxlW2ldLm1IYW5kbGVyKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvZmZzZXQsIHNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVbmtub3duIGJveCB0eXBlCi0KLSAgICAgICAgICAgIEFMT0dWKCIlc3NraXBwaW5nIGJveCBvZiB0eXBlICclcycsIHNpemUgJWxsdSIsCi0gICAgICAgICAgICAgICAgICAgIEluZGVudFN0cmluZyhtU3RhY2suc2l6ZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgRm91cmNjMlN0cmluZyh0eXBlKSwgc2l6ZSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHNraXAoc2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLWludCBGcmFnbWVudGVkTVA0UGFyc2VyOjpDb21wYXJlU2FtcGxlTG9jYXRpb24oCi0gICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8pIHsKLSAgICBpZiAoc2FtcGxlLm1PZmZzZXQgKyBzYW1wbGUubVNpemUgPCBtZGF0SW5mby5tT2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoc2FtcGxlLm1PZmZzZXQgPj0gbWRhdEluZm8ubU9mZnNldCArIG1kYXRJbmZvLm1CdWZmZXItPnNpemUoKSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2UgbWFrZSBzdXJlIHRoZSBzYW1wbGUgaXMgY29tcGxldGVseSBjb250YWluZWQgd2l0aGluIHRoaXMKLSAgICAvLyBtZWRpYSBkYXRhIGJsb2NrLgotCi0gICAgQ0hFQ0tfR0Uoc2FtcGxlLm1PZmZzZXQsIG1kYXRJbmZvLm1PZmZzZXQpOwotCi0gICAgQ0hFQ0tfTEUoc2FtcGxlLm1PZmZzZXQgKyBzYW1wbGUubVNpemUsCi0gICAgICAgICAgICAgbWRhdEluZm8ubU9mZnNldCArIG1kYXRJbmZvLm1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpyZXN1bWVJZk5lY2Vzc2FyeSgpIHsKLSAgICBpZiAoIW1TdXNwZW5kZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dWKCJyZXN1bWluZy4iKTsKLQotICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VlZCwgaWQoKSkpLT5wb3N0KCk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmdldFNhbXBsZSgKLSAgICAgICAgVHJhY2tJbmZvICppbmZvLCBzcDxUcmFja0ZyYWdtZW50PiAqZnJhZ21lbnQsIFNhbXBsZUluZm8gKnNhbXBsZUluZm8pIHsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChpbmZvLT5tRnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtRmluYWxSZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUZpbmFsUmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICAgICAgfQotCi0gICAgICAgICpmcmFnbWVudCA9ICppbmZvLT5tRnJhZ21lbnRzLmJlZ2luKCk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gKCpmcmFnbWVudCktPmdldFNhbXBsZShzYW1wbGVJbmZvKTsKLQotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWFsbHksIGVuZCBvZiB0aGlzIGZyYWdtZW50Li4uCi0KLSAgICAgICAgaW5mby0+bUZyYWdtZW50cy5lcmFzZShpbmZvLT5tRnJhZ21lbnRzLmJlZ2luKCkpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6b25EZXF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7Ci0gICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdFZhbHVlQXQodHJhY2tJbmRleCk7Ci0KLSAgICBzcDxUcmFja0ZyYWdtZW50PiBmcmFnbWVudDsKLSAgICBTYW1wbGVJbmZvIHNhbXBsZUluZm87Ci0gICAgc3RhdHVzX3QgZXJyID0gZ2V0U2FtcGxlKGluZm8sICZmcmFnbWVudCwgJnNhbXBsZUluZm8pOwotCi0gICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IC1FV09VTERCTE9DSzsKLQotICAgIGJvb2wgY2hlY2tEcm9wcGFibGUgPSBmYWxzZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhRGF0YS5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbyA9IG1NZWRpYURhdGEuaXRlbUF0KGkpOwotCi0gICAgICAgIGludCBjbXAgPSBDb21wYXJlU2FtcGxlTG9jYXRpb24oc2FtcGxlSW5mbywgbWRhdEluZm8pOwotCi0gICAgICAgIGlmIChjbXAgPCAwICYmICFtU291cmNlLT5pc1NlZWthYmxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRVBJUEU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgIGNoZWNrRHJvcHBhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gbWFrZUFjY2Vzc1VuaXQoaW5mbywgc2FtcGxlSW5mbywgbWRhdEluZm8sIGFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZnJhZ21lbnQtPmFkdmFuY2UoKTsKLQotICAgIGlmICghbU1lZGlhRGF0YS5lbXB0eSgpICYmIGNoZWNrRHJvcHBhYmxlKSB7Ci0gICAgICAgIHNpemVfdCBudW1Ecm9wcGFibGUgPSAwOwotICAgICAgICBib29sIGRvbmUgPSBmYWxzZTsKLQotICAgICAgICAvLyBYWFggRklYTUU6IGlmIG9uZSBvZiB0aGUgdHJhY2tzIGlzIG5vdCBhZHZhbmNlZCAoZS5nLiBpZiB5b3UgcGxheSBhbiBhdWRpbyt2aWRlbwotICAgICAgICAvLyBmaWxlIHdpdGggc2YyKSwgdGhlbiBtTWVkaWFEYXRhIHdpbGwgbm90IGJlIHBydW5lZCBhbmQga2VlcHMgZ3Jvd2luZwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgIWRvbmUgJiYgaSA8IG1NZWRpYURhdGEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvID0gbU1lZGlhRGF0YS5pdGVtQXQoaSk7Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVRyYWNrcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRWYWx1ZUF0KGopOwotCi0gICAgICAgICAgICAgICAgc3A8VHJhY2tGcmFnbWVudD4gZnJhZ21lbnQ7Ci0gICAgICAgICAgICAgICAgU2FtcGxlSW5mbyBzYW1wbGVJbmZvOwotICAgICAgICAgICAgICAgIGVyciA9IGdldFNhbXBsZShpbmZvLCAmZnJhZ21lbnQsICZzYW1wbGVJbmZvKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBjbXAgPSBDb21wYXJlU2FtcGxlTG9jYXRpb24oc2FtcGxlSW5mbywgbWRhdEluZm8pOwotCi0gICAgICAgICAgICAgICAgaWYgKGNtcCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZG9uZSkgewotICAgICAgICAgICAgICAgICsrbnVtRHJvcHBhYmxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bURyb3BwYWJsZSA+IDApIHsKLSAgICAgICAgICAgIG1NZWRpYURhdGEucmVtb3ZlSXRlbXNBdCgwLCBudW1Ecm9wcGFibGUpOwotCi0gICAgICAgICAgICBpZiAobU1lZGlhRGF0YS5zaXplKCkgPCA1KSB7Ci0gICAgICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzaXplX3QgcGFyc2VOQUxTaXplKHNpemVfdCBuYWxMZW5ndGhTaXplLCBjb25zdCB1aW50OF90ICpkYXRhKSB7Ci0gICAgc3dpdGNoIChuYWxMZW5ndGhTaXplKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiAqZGF0YTsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcmV0dXJuIFUxNl9BVChkYXRhKTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcmV0dXJuICgoc2l6ZV90KWRhdGFbMF0gPDwgMTYpIHwgVTE2X0FUKCZkYXRhWzFdKTsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcmV0dXJuIFUzMl9BVChkYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGNhbm5vdCBoYXBwZW4sIG1OQUxMZW5ndGhTaXplIHNwcmluZ3MgdG8gbGlmZSBieSBhZGRpbmcgMSB0bwotICAgIC8vIGEgMi1iaXQgaW50ZWdlci4KLSAgICBUUkVTUEFTUygpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om1ha2VBY2Nlc3NVbml0KAotICAgICAgICBUcmFja0luZm8gKmluZm8sCi0gICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwKLSAgICAgICAgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8sCi0gICAgICAgIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7Ci0gICAgaWYgKHNhbXBsZS5tU2FtcGxlRGVzY0luZGV4IDwgMQotICAgICAgICAgICAgfHwgc2FtcGxlLm1TYW1wbGVEZXNjSW5kZXggPiBpbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXMgPQotICAgICAgICAxMDAwMDAwbGwgKiBzYW1wbGUubVByZXNlbnRhdGlvblRpbWUgLyBpbmZvLT5tTWVkaWFUaW1lU2NhbGU7Ci0KLSAgICBjb25zdCBTYW1wbGVEZXNjcmlwdGlvbiAmc2FtcGxlRGVzYyA9Ci0gICAgICAgIGluZm8tPm1TYW1wbGVEZXNjcy5pdGVtQXQoc2FtcGxlLm1TYW1wbGVEZXNjSW5kZXggLSAxKTsKLQotICAgIHNpemVfdCBuYWxMZW5ndGhTaXplOwotICAgIGlmICghc2FtcGxlRGVzYy5tRm9ybWF0LT5maW5kU2l6ZSgibmFsLWxlbmd0aC1zaXplIiwgJm5hbExlbmd0aFNpemUpKSB7Ci0gICAgICAgICphY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoc2FtcGxlLm1TaXplKTsKLQotICAgICAgICBtZW1jcHkoKCphY2Nlc3NVbml0KS0+ZGF0YSgpLAotICAgICAgICAgICAgICAgbWRhdEluZm8ubUJ1ZmZlci0+ZGF0YSgpICsgKHNhbXBsZS5tT2Zmc2V0IC0gbWRhdEluZm8ubU9mZnNldCksCi0gICAgICAgICAgICAgICBzYW1wbGUubVNpemUpOwotCi0gICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHByZXNlbnRhdGlvblRpbWVVcyk7Ci0gICAgICAgIGlmIChJc0lEUigqYWNjZXNzVW5pdCkpIHsKLSAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50MzIoImlzLXN5bmMtZnJhbWUiLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpzcmNQdHIgPQotICAgICAgICBtZGF0SW5mby5tQnVmZmVyLT5kYXRhKCkgKyAoc2FtcGxlLm1PZmZzZXQgLSBtZGF0SW5mby5tT2Zmc2V0KTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMiA7ICsraSkgewotICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNhbXBsZS5tU2l6ZSkgewotICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG5hbExlbmd0aFNpemUgPiBzYW1wbGUubVNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaXplX3QgbmFsU2l6ZSA9IHBhcnNlTkFMU2l6ZShuYWxMZW5ndGhTaXplLCAmc3JjUHRyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aFNpemU7Ci0KLSAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBuYWxTaXplID4gc2FtcGxlLm1TaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAgICAgICAgIG1lbWNweSgoKmFjY2Vzc1VuaXQpLT5kYXRhKCkgKyBkc3RPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgNCk7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKCphY2Nlc3NVbml0KS0+ZGF0YSgpICsgZHN0T2Zmc2V0ICsgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyICsgc3JjT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbFNpemU7Ci0gICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsU2l6ZSArIDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAoKmFjY2Vzc1VuaXQpID0gbmV3IEFCdWZmZXIoZHN0T2Zmc2V0KTsKLSAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICJ0aW1lVXMiLCBwcmVzZW50YXRpb25UaW1lVXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChJc0lEUigqYWNjZXNzVW5pdCkpIHsKLSAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQzMigiaXMtc3luYy1mcmFtZSIsIDEpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6bmVlZChzaXplX3Qgc2l6ZSkgewotICAgIGlmICghZml0c0NvbnRhaW5lcihzaXplKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8PSBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkTW9yZSwgaWQoKSk7Ci0gICAgbXNnLT5zZXRTaXplKCJuZWVkZWQiLCBzaXplIC0gbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBtc2ctPnBvc3QoKTsKLQotICAgIC8vIEFMT0dWKCJuZWVkKCVkKSByZXR1cm5pbmcgLUVBR0FJTiwgb25seSBoYXZlICVkIiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIHJldHVybiAtRUFHQUlOOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OmVudGVyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCB0eXBlLCB1aW50NjRfdCBzaXplKSB7Ci0gICAgQ29udGFpbmVyIGNvbnRhaW5lcjsKLSAgICBjb250YWluZXIubU9mZnNldCA9IG9mZnNldDsKLSAgICBjb250YWluZXIubVR5cGUgPSB0eXBlOwotICAgIGNvbnRhaW5lci5tRXh0ZW5kc1RvRU9GID0gKHNpemUgPT0gMCk7Ci0gICAgY29udGFpbmVyLm1CeXRlc1JlbWFpbmluZyA9IHNpemU7Ci0KLSAgICBtU3RhY2sucHVzaChjb250YWluZXIpOwotfQotCi1ib29sIEZyYWdtZW50ZWRNUDRQYXJzZXI6OmZpdHNDb250YWluZXIodWludDY0X3Qgc2l6ZSkgY29uc3QgewotICAgIENIRUNLKCFtU3RhY2suaXNFbXB0eSgpKTsKLSAgICBjb25zdCBDb250YWluZXIgJmNvbnRhaW5lciA9IG1TdGFjay5pdGVtQXQobVN0YWNrLnNpemUoKSAtIDEpOwotCi0gICAgcmV0dXJuIGNvbnRhaW5lci5tRXh0ZW5kc1RvRU9GIHx8IHNpemUgPD0gY29udGFpbmVyLm1CeXRlc1JlbWFpbmluZzsKLX0KLQotdWludDE2X3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cmVhZFUxNihzaXplX3Qgb2Zmc2V0KSB7Ci0gICAgQ0hFQ0tfTEUob2Zmc2V0ICsgMiwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIG9mZnNldDsKLSAgICByZXR1cm4gKHB0clswXSA8PCA4KSB8IHB0clsxXTsKLX0KLQotdWludDMyX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cmVhZFUzMihzaXplX3Qgb2Zmc2V0KSB7Ci0gICAgQ0hFQ0tfTEUob2Zmc2V0ICsgNCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIG9mZnNldDsKLSAgICByZXR1cm4gKHB0clswXSA8PCAyNCkgfCAocHRyWzFdIDw8IDE2KSB8IChwdHJbMl0gPDwgOCkgfCBwdHJbM107Ci19Ci0KLXVpbnQ2NF90IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnJlYWRVNjQoc2l6ZV90IG9mZnNldCkgewotICAgIHJldHVybiAoKCh1aW50NjRfdClyZWFkVTMyKG9mZnNldCkpIDw8IDMyKSB8IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c2tpcChvZmZfdCBkaXN0YW5jZSkgewotICAgIENIRUNLKCFtU3RhY2suaXNFbXB0eSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gbVN0YWNrLnNpemUoKTsgaS0tID4gMDspIHsKLSAgICAgICAgQ29udGFpbmVyICpjb250YWluZXIgPSAmbVN0YWNrLmVkaXRJdGVtQXQoaSk7Ci0gICAgICAgIGlmICghY29udGFpbmVyLT5tRXh0ZW5kc1RvRU9GKSB7Ci0gICAgICAgICAgICBDSEVDS19MRShkaXN0YW5jZSwgKG9mZl90KWNvbnRhaW5lci0+bUJ5dGVzUmVtYWluaW5nKTsKLQotICAgICAgICAgICAgY29udGFpbmVyLT5tQnl0ZXNSZW1haW5pbmcgLT0gZGlzdGFuY2U7Ci0KLSAgICAgICAgICAgIGlmIChjb250YWluZXItPm1CeXRlc1JlbWFpbmluZyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzbGVhdmluZyBib3ggb2YgdHlwZSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudFN0cmluZyhtU3RhY2suc2l6ZSgpIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VyY2MyU3RyaW5nKGNvbnRhaW5lci0+bVR5cGUpKTsKLQotI2lmIDAKLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLT5tVHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkgewotICAgICAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3JtYXQgIyVkOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuaXRlbUF0KGkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tRm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLT5tVHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSkgewotICAgICAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVN0YXRpY0ZyYWdtZW50LT5zaWduYWxDb21wbGV0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tJbmZvLT5tRnJhZ21lbnRzLmVtcHR5KCkpOwotICAgICAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1GcmFnbWVudHMucHVzaF9iYWNrKHRyYWNrSW5mby0+bVN0YXRpY0ZyYWdtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU3RhdGljRnJhZ21lbnQuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lci0+bVR5cGUgPT0gRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJykpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFRyYWNrKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tGcmFnbWVudD4gJmZyYWdtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICotLXRyYWNrSW5mby0+bUZyYWdtZW50cy5lbmQoKTsKLQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEeW5hbWljVHJhY2tGcmFnbWVudCAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5nZXQoKSktPnNpZ25hbENvbXBsZXRpb24oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lci0+bVR5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykpIHsKLSAgICAgICAgICAgICAgICAgICAgbURvbmVXaXRoTW9vdiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29udGFpbmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtU3RhY2sucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChkaXN0YW5jZSA8IChvZmZfdCltQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UobUJ1ZmZlci0+b2Zmc2V0KCkgKyBkaXN0YW5jZSwgbUJ1ZmZlci0+c2l6ZSgpIC0gZGlzdGFuY2UpOwotICAgICAgICBtQnVmZmVyUG9zICs9IGRpc3RhbmNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0gICAgbUJ1ZmZlclBvcyArPSBkaXN0YW5jZTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0hlYWRlcigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKLSAgICBmbGFncyAmPSAweGZmZmZmZjsKLQotICAgIHVpbnQzMl90IHRyYWNrSUQ7Ci0gICAgdWludDY0X3QgZHVyYXRpb247Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyAzNiA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJhY2tJRCA9IHJlYWRVMzIob2Zmc2V0ICsgMjApOwotICAgICAgICBkdXJhdGlvbiA9IHJlYWRVNjQob2Zmc2V0ICsgMjgpOwotCi0gICAgICAgIG9mZnNldCArPSAzNjsKLSAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgMjQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYWNrSUQgPSByZWFkVTMyKG9mZnNldCArIDEyKTsKLSAgICAgICAgZHVyYXRpb24gPSByZWFkVTMyKG9mZnNldCArIDIwKTsKLQotICAgICAgICBvZmZzZXQgKz0gMjQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKHRyYWNrSUQsIHRydWUgLyogY3JlYXRlSWZOZWNlc3NhcnkgKi8pOwotICAgIGluZm8tPm1GbGFncyA9IGZsYWdzOwotICAgIGluZm8tPm1EdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgIGlmIChpbmZvLT5tRHVyYXRpb24gPT0gMHhmZmZmZmZmZikgewotICAgICAgICAvLyBmZm1wZWcgc2V0cyB0aGlzIHRvIC0xLCB3aGljaCBpcyBpbmNvcnJlY3QuCi0gICAgICAgIGluZm8tPm1EdXJhdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgaW5mby0+bVN0YXRpY0ZyYWdtZW50ID0gbmV3IFN0YXRpY1RyYWNrRnJhZ21lbnQ7Ci0KLSAgICBtQ3VycmVudFRyYWNrSUQgPSB0cmFja0lEOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhSGVhZGVyKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHZlcnNpb25BbmRGbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIGlmICh2ZXJzaW9uQW5kRmxhZ3MgJiAweGZmZmZmZikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IHZlcnNpb24gPSB2ZXJzaW9uQW5kRmxhZ3MgPj4gMjQ7Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgKyAzMiA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGluZm8tPm1NZWRpYVRpbWVTY2FsZSA9IFUzMl9BVChtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQgKyAyMCk7Ci0gICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgKyAyMCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGluZm8tPm1NZWRpYVRpbWVTY2FsZSA9IFUzMl9BVChtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQgKyAxMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFIYW5kbGVyKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAocmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgaGFuZGxlclR5cGUgPSByZWFkVTMyKG9mZnNldCArIDgpOwotCi0gICAgc3dpdGNoIChoYW5kbGVyVHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygndicsICdpJywgJ2QnLCAnZScpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdvJywgJ3UnLCAnbicpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdpJywgJ24nLCAndCcpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tTWVkaWFIYW5kbGVyVHlwZSA9IGhhbmRsZXJUeXBlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVZpc3VhbFNhbXBsZUVudHJ5KAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDc4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MucHVzaCgpOwotICAgIFNhbXBsZURlc2NyaXB0aW9uICpzYW1wbGVEZXNjID0KLSAgICAgICAgJnRyYWNrSW5mby0+bVNhbXBsZURlc2NzLmVkaXRJdGVtQXQoCi0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBzYW1wbGVEZXNjLT5tVHlwZSA9IHR5cGU7Ci0gICAgc2FtcGxlRGVzYy0+bURhdGFSZWZJbmRleCA9IHJlYWRVMTYob2Zmc2V0ICsgNik7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgcmVhZFUxNihvZmZzZXQgKyA4ICsgMTYpKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCByZWFkVTE2KG9mZnNldCArIDggKyAxOCkpOwotCi0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VBdWRpb1NhbXBsZUVudHJ5KAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDI4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MucHVzaCgpOwotICAgIFNhbXBsZURlc2NyaXB0aW9uICpzYW1wbGVEZXNjID0KLSAgICAgICAgJnRyYWNrSW5mby0+bVNhbXBsZURlc2NzLmVkaXRJdGVtQXQoCi0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBzYW1wbGVEZXNjLT5tVHlwZSA9IHR5cGU7Ci0gICAgc2FtcGxlRGVzYy0+bURhdGFSZWZJbmRleCA9IHJlYWRVMTYob2Zmc2V0ICsgNik7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotCi0gICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHJlYWRVMTYob2Zmc2V0ICsgOCArIDgpKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtc2l6ZSIsIHJlYWRVMTYob2Zmc2V0ICsgOCArIDEwKSk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCByZWFkVTMyKG9mZnNldCArIDggKyAxNikgLyA2NTUzNi4wZik7Ci0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnbScsICdyJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMSk7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDgwMDApOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICd3JywgJ2InKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCAxKTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgMTYwMDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZENvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgaW50MzJfdCBpbmRleCwKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgIGJvb2wgaW5zZXJ0U3RhcnRDb2RlID0gZmFsc2UpIHsKLSAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihpbnNlcnRTdGFydENvZGUgPyBzaXplICsgNCA6IHNpemUpOwotCi0gICAgbWVtY3B5KGNzZC0+ZGF0YSgpICsgKGluc2VydFN0YXJ0Q29kZSA/IDQgOiAwKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICBpZiAoaW5zZXJ0U3RhcnRDb2RlKSB7Ci0gICAgICAgIG1lbWNweShjc2QtPmRhdGEoKSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKLSAgICB9Ci0KLSAgICBjc2QtPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwotICAgIGNzZC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMGxsKTsKLQotICAgIGZvcm1hdC0+c2V0QnVmZmVyKFN0cmluZ1ByaW50ZigiY3NkLSVkIiwgaW5kZXgpLmNfc3RyKCksIGNzZCk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICBTYW1wbGVEZXNjcmlwdGlvbiAqc2FtcGxlRGVzYyA9Ci0gICAgICAgICZ0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5lZGl0SXRlbUF0KAotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSAtIDEpOwotCi0gICAgaWYgKHNhbXBsZURlc2MtPm1UeXBlICE9IEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIG9mZnNldDsKLQotICAgIHNpemUgLT0gb2Zmc2V0OwotICAgIG9mZnNldCA9IDA7Ci0KLSAgICBpZiAoc2l6ZSA8IDcgfHwgcHRyWzBdICE9IDB4MDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LT5zZXRTaXplKCJuYWwtbGVuZ3RoLXNpemUiLCAxICsgKHB0cls0XSAmIDMpKTsKLQotICAgIHNpemVfdCBudW1TUFMgPSBwdHJbNV0gJiAzMTsKLQotICAgIHB0ciArPSA2OwotICAgIHNpemUgLT0gNjsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU1BTOyArK2kpIHsKLSAgICAgICAgaWYgKHNpemUgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOwotCi0gICAgICAgIHB0ciArPSAyOwotICAgICAgICBzaXplIC09IDI7Ci0KLSAgICAgICAgaWYgKHNpemUgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgICAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LCBpLCBwdHIsIGxlbmd0aCwKLSAgICAgICAgICAgICAgICB0cnVlIC8qIGluc2VydFN0YXJ0Q29kZSAqLyk7Ci0KLSAgICAgICAgcHRyICs9IGxlbmd0aDsKLSAgICAgICAgc2l6ZSAtPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgc2l6ZV90IG51bVBQUyA9ICpwdHI7Ci0gICAgKytwdHI7Ci0gICAgLS1zaXplOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QUFM7ICsraSkgewotICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7Ci0KLSAgICAgICAgcHRyICs9IDI7Ci0gICAgICAgIHNpemUgLT0gMjsKLQotICAgICAgICBpZiAoc2l6ZSA8IGxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQsIG51bVNQUyArIGksIHB0ciwgbGVuZ3RoLAotICAgICAgICAgICAgICAgIHRydWUgLyogaW5zZXJ0U3RhcnRDb2RlICovKTsKLQotICAgICAgICBwdHIgKz0gbGVuZ3RoOwotICAgICAgICBzaXplIC09IGxlbmd0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIFNhbXBsZURlc2NyaXB0aW9uICpzYW1wbGVEZXNjID0KLSAgICAgICAgJnRyYWNrSW5mby0+bVNhbXBsZURlc2NzLmVkaXRJdGVtQXQoCi0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBpZiAoc2FtcGxlRGVzYy0+bVR5cGUgIT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykKLSAgICAgICAgICAgICYmIHNhbXBsZURlc2MtPm1UeXBlICE9IEZPVVJDQygnbScsICdwJywgJzQnLCAndicpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIG9mZnNldDsKLQotICAgIHNpemUgLT0gb2Zmc2V0OwotICAgIG9mZnNldCA9IDA7Ci0KLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKFUzMl9BVChwdHIpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgcHRyICs9IDQ7Ci0gICAgc2l6ZSAtPTQ7Ci0KLSAgICBFU0RTIGVzZHMocHRyLCBzaXplKTsKLQotICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247Ci0gICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKSAhPSBPSykgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmNzZDsKLSAgICBzaXplX3QgY3NkX3NpemU7Ci0gICAgaWYgKGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oCi0gICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKiopJmNzZCwgJmNzZF9zaXplKSAhPSBPSykgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKHNhbXBsZURlc2MtPm1Gb3JtYXQsIDAsIGNzZCwgY3NkX3NpemUpOwotCi0gICAgaWYgKHNhbXBsZURlc2MtPm1UeXBlICE9IEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoY3NkX3NpemUgPT0gMCkgewotICAgICAgICAvLyBUaGVyZSdzIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb24sIGkuZS4gbm8gY29kZWMgc3BlY2lmaWMgZGF0YQotICAgICAgICAvLyBMZXQncyBhc3N1bWUgdGhhdCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gdGhlIG1wZWc0IGhlYWRlcnMKLSAgICAgICAgLy8gaXMgYWNjdXJhdGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoY3NkX3NpemUgPCAyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgb2JqZWN0VHlwZSA9IGNzZFswXSA+PiAzOwotCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gMzEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZyZXFJbmRleCA9IChjc2RbMF0gJiA3KSA8PCAxIHwgKGNzZFsxXSA+PiA3KTsKLSAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwotICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwotICAgIGlmIChmcmVxSW5kZXggPT0gMTUpIHsKLSAgICAgICAgaWYgKGNzZF9zaXplIDwgNSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHNhbXBsZVJhdGUgPSAoY3NkWzFdICYgMHg3ZikgPDwgMTcKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgY3NkWzJdIDw8IDkKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgY3NkWzNdIDw8IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKGNzZFs0XSA+PiA3KTsKLQotICAgICAgICBudW1DaGFubmVscyA9IChjc2RbNF0gPj4gMykgJiAxNTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0aWMgdWludDMyX3Qga1NhbXBsaW5nUmF0ZVtdID0gewotICAgICAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAotICAgICAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MAotICAgICAgICB9OwotCi0gICAgICAgIGlmIChmcmVxSW5kZXggPT0gMTMgfHwgZnJlcUluZGV4ID09IDE0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKLSAgICAgICAgbnVtQ2hhbm5lbHMgPSAoY3NkWzFdID4+IDMpICYgMTU7Ci0gICAgfQotCi0gICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHNhbXBsZVJhdGUpOwotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbnVtQ2hhbm5lbHMpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhRGF0YSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIEFMT0dWKCJza2lwcGluZyAnbWRhdCcgY2h1bmsgYXQgb2Zmc2V0cyAweCUwOGx4LTB4JTA4bGx4LiIsCi0gICAgICAgICAgbUJ1ZmZlclBvcyArIG9mZnNldCwgbUJ1ZmZlclBvcyArIHNpemUpOwotCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSAtIG9mZnNldCk7Ci0gICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIHNpemUgLSBvZmZzZXQpOwotCi0gICAgbU1lZGlhRGF0YS5wdXNoKCk7Ci0gICAgTWVkaWFEYXRhSW5mbyAqaW5mbyA9ICZtTWVkaWFEYXRhLmVkaXRJdGVtQXQobU1lZGlhRGF0YS5zaXplKCkgLSAxKTsKLSAgICBpbmZvLT5tQnVmZmVyID0gYnVmZmVyOwotICAgIGluZm8tPm1PZmZzZXQgPSBtQnVmZmVyUG9zICsgb2Zmc2V0OwotCi0gICAgaWYgKG1NZWRpYURhdGEuc2l6ZSgpID4gMTApIHsKLSAgICAgICAgQUxPR1YoInN1c3BlbmRpbmcgZm9yIG5vdy4iKTsKLSAgICAgICAgbVN1c3BlbmRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNlZ21lbnRJbmRleCgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIEFMT0dWKCJzaWR4IGJveCB0eXBlICVkLCBvZmZzZXQgJWQsIHNpemUgJWQiLCB0eXBlLCBpbnQob2Zmc2V0KSwgaW50KHNpemUpKTsKLS8vICAgIEFTdHJpbmcgc2lkeHN0cjsKLS8vICAgIGhleGR1bXAobUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBzaXplLCAwIC8qIGluZGVudCAqLywgJnNpZHhzdHIpOwotLy8gICAgQUxPR1YoInJhdyBzaWR4OiIpOwotLy8gICAgQUxPR1YoIiVzIiwgc2lkeHN0ci5jX3N0cigpKTsKLSAgICBpZiAob2Zmc2V0ICsgMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OwotICAgIGZsYWdzICY9IDB4ZmZmZmZmOwotCi0gICAgQUxPR1YoInNpZHggdmVyc2lvbiAlZCIsIHZlcnNpb24pOwotCi0gICAgdWludDMyX3QgcmVmZXJlbmNlSWQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgIHVpbnQzMl90IHRpbWVTY2FsZSA9IHJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0gICAgQUxPR1YoInNpZHggcmVmaWQvdGltZXNjYWxlOiAlZC8lZCIsIHJlZmVyZW5jZUlkLCB0aW1lU2NhbGUpOwotCi0gICAgdWludDY0X3QgZWFybGllc3RQcmVzZW50YXRpb25UaW1lOwotICAgIHVpbnQ2NF90IGZpcnN0T2Zmc2V0OwotCi0gICAgb2Zmc2V0ICs9IDEyOwotCi0gICAgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgZmlyc3RPZmZzZXQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgICAgICBvZmZzZXQgKz0gODsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAob2Zmc2V0ICsgMTYgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUgPSByZWFkVTY0KG9mZnNldCk7Ci0gICAgICAgIGZpcnN0T2Zmc2V0ID0gcmVhZFU2NChvZmZzZXQgKyA4KTsKLSAgICAgICAgb2Zmc2V0ICs9IDE2OwotICAgIH0KLSAgICBBTE9HVigic2lkeCBwcmVzL29mZjogJUxkLyVMZCIsIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSwgZmlyc3RPZmZzZXQpOwotCi0gICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpZiAocmVhZFUxNihvZmZzZXQpICE9IDApIHsgLy8gcmVzZXJ2ZWQKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGludDMyX3QgcmVmZXJlbmNlQ291bnQgPSByZWFkVTE2KG9mZnNldCArIDIpOwotICAgIG9mZnNldCArPSA0OwotICAgIEFMT0dWKCJyZWZjb3VudDogJWQiLCByZWZlcmVuY2VDb3VudCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgcmVmZXJlbmNlQ291bnQgKiAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0gICAgdWludDY0X3QgdG90YWxfZHVyYXRpb24gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlQ291bnQ7IGkrKykgewotICAgICAgICB1aW50MzJfdCBkMSA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgdWludDMyX3QgZDIgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgICAgICB1aW50MzJfdCBkMyA9IHJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0KLSAgICAgICAgaWYgKGQxICYgMHg4MDAwMDAwMCkgewotICAgICAgICAgICAgQUxPR1coInN1Yi1zaWR4IGJveGVzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBzYXAgPSBkMyAmIDB4ODAwMDAwMDA7Ci0gICAgICAgIGJvb2wgc2FwdHlwZSA9IGQzID4+IDI4OwotICAgICAgICBpZiAoIXNhcCB8fCBzYXB0eXBlID4gMikgewotICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICB0b3RhbF9kdXJhdGlvbiArPSBkMjsKLSAgICAgICAgb2Zmc2V0ICs9IDEyOwotICAgICAgICBBTE9HVigiIGl0ZW0gJWQsICUwOHggJTA4eCAlMDh4IiwgaSwgZDEsIGQyLCBkMyk7Ci0gICAgICAgIFNpZHhFbnRyeSBzZTsKLSAgICAgICAgc2UubVNpemUgPSBkMSAmIDB4N2ZmZmZmZmY7Ci0gICAgICAgIHNlLm1EdXJhdGlvblVzID0gMTAwMDAwMExMICogZDIgLyB0aW1lU2NhbGU7Ci0gICAgICAgIGluZm8tPm1TaWR4LmFkZChzZSk7Ci0gICAgfQotCi0gICAgaW5mby0+bVNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKLSAgICBBTE9HVigiZHVyYXRpb246ICVsbGQiLCBpbmZvLT5tU2lkeER1cmF0aW9uKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tFeHRlbmRzKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDI0ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAocmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdHJhY2tJRCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sodHJhY2tJRCwgdHJ1ZSAvKiBjcmVhdGVJZk5lY2Vzc2FyeSAqLyk7Ci0gICAgaW5mby0+bURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4ID0gcmVhZFUzMihvZmZzZXQgKyA4KTsKLSAgICBpbmZvLT5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uID0gcmVhZFUzMihvZmZzZXQgKyAxMik7Ci0gICAgaW5mby0+bURlZmF1bHRTYW1wbGVTaXplID0gcmVhZFUzMihvZmZzZXQgKyAxNik7Ci0gICAgaW5mby0+bURlZmF1bHRTYW1wbGVGbGFncyA9IHJlYWRVMzIob2Zmc2V0ICsgMjApOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpUcmFja0luZm8gKkZyYWdtZW50ZWRNUDRQYXJzZXI6OmVkaXRUcmFjaygKLSAgICAgICAgdWludDMyX3QgdHJhY2tJRCwgYm9vbCBjcmVhdGVJZk5lY2Vzc2FyeSkgewotICAgIHNzaXplX3QgaSA9IG1UcmFja3MuaW5kZXhPZktleSh0cmFja0lEKTsKLQotICAgIGlmIChpID49IDApIHsKLSAgICAgICAgcmV0dXJuICZtVHJhY2tzLmVkaXRWYWx1ZUF0KGkpOwotICAgIH0KLQotICAgIGlmICghY3JlYXRlSWZOZWNlc3NhcnkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvIGluZm87Ci0gICAgaW5mby5tVHJhY2tJRCA9IHRyYWNrSUQ7Ci0gICAgaW5mby5tRmxhZ3MgPSAwOwotICAgIGluZm8ubUR1cmF0aW9uID0gMHhmZmZmZmZmZjsKLSAgICBpbmZvLm1TaWR4RHVyYXRpb24gPSAwOwotICAgIGluZm8ubU1lZGlhVGltZVNjYWxlID0gMDsKLSAgICBpbmZvLm1NZWRpYUhhbmRsZXJUeXBlID0gMDsKLSAgICBpbmZvLm1EZWZhdWx0U2FtcGxlRGVzY3JpcHRpb25JbmRleCA9IDA7Ci0gICAgaW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uID0gMDsKLSAgICBpbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZSA9IDA7Ci0gICAgaW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzID0gMDsKLQotICAgIGluZm8ubURlY29kaW5nVGltZSA9IDA7Ci0KLSAgICBtVHJhY2tzLmFkZCh0cmFja0lELCBpbmZvKTsKLSAgICByZXR1cm4gJm1UcmFja3MuZWRpdFZhbHVlQXQobVRyYWNrcy5pbmRleE9mS2V5KHRyYWNrSUQpKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgaWYgKGZsYWdzICYgMHhmZjAwMDAwMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzID0gZmxhZ3M7Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgIG9mZnNldCArPSA4OwotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtCYXNlRGF0YU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgPSByZWFkVTY0KG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA4OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tU2FtcGxlRGVzY3JpcHRpb25JbmRleCA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbiA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZVNpemUgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmICghKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtCYXNlRGF0YU9mZnNldFByZXNlbnQpKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIHBvaW50IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKLSAgICAgICAgLy8gZW5jbG9zaW5nICdtb29mJyBjb250YWluZXIgZm9yIHRoZSBmaXJzdCB0cmFjayBhbmQKLSAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgZGF0YSBvZiB0aGUgcHJlY2VkaW5nIGZyYWdtZW50IGZvciBzdWJzZXF1ZW50Ci0gICAgICAgIC8vIHRyYWNrcy4KLQotICAgICAgICBDSEVDS19HRShtU3RhY2suc2l6ZSgpLCAydSk7Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldCA9Ci0gICAgICAgICAgICBtU3RhY2suaXRlbUF0KG1TdGFjay5zaXplKCkgLSAyKS5tT2Zmc2V0OwotCi0gICAgICAgIC8vIFhYWCBUT0RPOiBUaGlzIGRvZXMgbm90IGRvIHRoZSByaWdodCB0aGluZyBmb3IgdGhlIDJuZCBhbmQKLSAgICAgICAgLy8gc3Vic2VxdWVudCB0cmFja3MgeWV0LgotICAgIH0KLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldCA9Ci0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQ7Ci0KLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQpOwotCi0gICAgaWYgKHRyYWNrSW5mby0+bUZyYWdtZW50cy5lbXB0eSgpCi0gICAgICAgICAgICB8fCAoKnRyYWNrSW5mby0+bUZyYWdtZW50cy5iZWdpbigpKS0+Y29tcGxldGUoKSkgewotICAgICAgICB0cmFja0luZm8tPm1GcmFnbWVudHMucHVzaF9iYWNrKG5ldyBEeW5hbWljVHJhY2tGcmFnbWVudCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4oCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgZW51bSB7Ci0gICAgICAgIGtEYXRhT2Zmc2V0UHJlc2VudCAgICAgICAgICAgICAgICAgID0gMHgwMSwKLSAgICAgICAga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50ICAgICAgICAgICAgPSAweDA0LAotICAgICAgICBrU2FtcGxlRHVyYXRpb25QcmVzZW50ICAgICAgICAgICAgICA9IDB4MTAwLAotICAgICAgICBrU2FtcGxlU2l6ZVByZXNlbnQgICAgICAgICAgICAgICAgICA9IDB4MjAwLAotICAgICAgICBrU2FtcGxlRmxhZ3NQcmVzZW50ICAgICAgICAgICAgICAgICA9IDB4NDAwLAotICAgICAgICBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCA9IDB4ODAwLAotICAgIH07Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIGlmIChmbGFncyAmIDB4ZmYwMDAwMDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkpIHsKLSAgICAgICAgLy8gVGhlc2UgdHdvIHNoYWxsIG5vdCBiZSB1c2VkIHRvZ2V0aGVyLgotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVDb3VudCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgb2Zmc2V0ICs9IDg7Ci0KLSAgICB1aW50NjRfdCBkYXRhT2Zmc2V0ID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0OwotCi0gICAgdWludDMyX3QgZmlyc3RTYW1wbGVGbGFncyA9IDA7Ci0KLSAgICBpZiAoZmxhZ3MgJiBrRGF0YU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgZGF0YU9mZnNldERlbHRhID0gKGludDMyX3QpcmVhZFUzMihvZmZzZXQpOwotCi0gICAgICAgIGRhdGFPZmZzZXQgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0ICsgZGF0YU9mZnNldERlbHRhOwotCi0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlyc3RTYW1wbGVGbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCk7Ci0KLSAgICBpZiAoaW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZUR1cmF0aW9uID0gMCwgc2FtcGxlU2l6ZSA9IDAsIHNhbXBsZUZsYWdzID0gMCwKLSAgICAgICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwotCi0gICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gMDsKLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUR1cmF0aW9uID0gaW5mby0+bURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgc2FtcGxlU2l6ZSA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlU2l6ZSA9IGluZm8tPm1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBzYW1wbGVGbGFncyA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUZsYWdzID0gaW5mby0+bURlZmF1bHRTYW1wbGVGbGFnczsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG9mZnNldCArIHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZURlc2NJbmRleCA9Ci0gICAgICAgIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQpCi0gICAgICAgICAgICA/IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tU2FtcGxlRGVzY3JpcHRpb25JbmRleAotICAgICAgICAgICAgOiBpbmZvLT5tRGVmYXVsdFNhbXBsZURlc2NyaXB0aW9uSW5kZXg7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7ICsraSkgewotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgICAgICBzYW1wbGVTaXplID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgICAgICBzYW1wbGVGbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoImFkZGluZyBzYW1wbGUgYXQgb2Zmc2V0IDB4JTA4bGx4LCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgotICAgICAgICAgICAgICAic2FtcGxlRGVzY0luZGV4PSV1LCBmbGFncyAweCUwOHgiLAotICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAotICAgICAgICAgICAgICAgIHNhbXBsZURlc2NJbmRleCwKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMAotICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7Ci0KLSAgICAgICAgY29uc3Qgc3A8VHJhY2tGcmFnbWVudD4gJmZyYWdtZW50ID0gKi0taW5mby0+bUZyYWdtZW50cy5lbmQoKTsKLQotICAgICAgICB1aW50MzJfdCBkZWNvZGluZ1RpbWUgPSBpbmZvLT5tRGVjb2RpbmdUaW1lOwotICAgICAgICBpbmZvLT5tRGVjb2RpbmdUaW1lICs9IHNhbXBsZUR1cmF0aW9uOwotICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25UaW1lID0gZGVjb2RpbmdUaW1lICsgc2FtcGxlQ3RzT2Zmc2V0OwotCi0gICAgICAgIHN0YXRpY19jYXN0PER5bmFtaWNUcmFja0ZyYWdtZW50ICo+KAotICAgICAgICAgICAgICAgIGZyYWdtZW50LmdldCgpKS0+YWRkU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25UaW1lLAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICgoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzKTsKLQotICAgICAgICBkYXRhT2Zmc2V0ICs9IHNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0gZGF0YU9mZnNldDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpjb3B5QnVmZmVyKAotICAgICAgICBzcDxBQnVmZmVyPiAqZHN0LCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSBjb25zdCB7Ci0gICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgbWVtY3B5KGJ1Zi0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIHNpemUpOwotCi0gICAgKmRzdCA9IGJ1ZjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5OTAzOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVHJhY2tGcmFnbWVudCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlRyYWNrRnJhZ21lbnQuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjpEeW5hbWljVHJhY2tGcmFnbWVudCgpCi0gICAgOiBtQ29tcGxldGUoZmFsc2UpLAotICAgICAgbVNhbXBsZUluZGV4KDApIHsKLX0KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6On5EeW5hbWljVHJhY2tGcmFnbWVudCgpIHsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OmdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TYW1wbGVJbmRleCA+PSBtU2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIG1Db21wbGV0ZSA/IEVSUk9SX0VORF9PRl9TVFJFQU0gOiAtRVdPVUxEQkxPQ0s7Ci0gICAgfQotCi0gICAgKmluZm8gPSBtU2FtcGxlcy5pdGVtQXQobVNhbXBsZUluZGV4KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6YWR2YW5jZSgpIHsKLSAgICArK21TYW1wbGVJbmRleDsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6YWRkU2FtcGxlKAotICAgICAgICBvZmY2NF90IGRhdGFPZmZzZXQsIHNpemVfdCBzYW1wbGVTaXplLAotICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25UaW1lLAotICAgICAgICBzaXplX3Qgc2FtcGxlRGVzY0luZGV4LAotICAgICAgICB1aW50MzJfdCBmbGFncykgewotICAgIG1TYW1wbGVzLnB1c2goKTsKLSAgICBTYW1wbGVJbmZvICpzYW1wbGVJbmZvID0gJm1TYW1wbGVzLmVkaXRJdGVtQXQobVNhbXBsZXMuc2l6ZSgpIC0gMSk7Ci0KLSAgICBzYW1wbGVJbmZvLT5tT2Zmc2V0ID0gZGF0YU9mZnNldDsKLSAgICBzYW1wbGVJbmZvLT5tU2l6ZSA9IHNhbXBsZVNpemU7Ci0gICAgc2FtcGxlSW5mby0+bVByZXNlbnRhdGlvblRpbWUgPSBwcmVzZW50YXRpb25UaW1lOwotICAgIHNhbXBsZUluZm8tPm1TYW1wbGVEZXNjSW5kZXggPSBzYW1wbGVEZXNjSW5kZXg7Ci0gICAgc2FtcGxlSW5mby0+bUZsYWdzID0gZmxhZ3M7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjpzaWduYWxDb21wbGV0aW9uKCkgewotICAgIG1Db21wbGV0ZSA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OmNvbXBsZXRlKCkgY29uc3QgewotICAgIHJldHVybiBtQ29tcGxldGU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OlN0YXRpY1RyYWNrRnJhZ21lbnQoKQotICAgIDogbVNhbXBsZUluZGV4KDApLAotICAgICAgbVNhbXBsZUNvdW50KDApLAotICAgICAgbUNodW5rSW5kZXgoMCksCi0gICAgICBtU2FtcGxlVG9DaHVua0luZGV4KC0xKSwKLSAgICAgIG1TYW1wbGVUb0NodW5rUmVtYWluaW5nKDApLAotICAgICAgbVByZXZDaHVua0luZGV4KDB4ZmZmZmZmZmYpLAotICAgICAgbU5leHRTYW1wbGVPZmZzZXQoMCkgewotfQotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50Ojp+U3RhdGljVHJhY2tGcmFnbWVudCgpIHsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6Z2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pIHsKLSAgICBpZiAobVNhbXBsZUluZGV4ID49IG1TYW1wbGVDb3VudCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICAqaW5mbyA9IG1TYW1wbGVJbmZvOwotCi0gICAgQUxPR1YoInJldHVybmluZyBzYW1wbGUgJWQgYXQgWzB4JTA4bGx4LCAweCUwOGxseCkiLAotICAgICAgICAgIG1TYW1wbGVJbmRleCwKLSAgICAgICAgICBpbmZvLT5tT2Zmc2V0LCBpbmZvLT5tT2Zmc2V0ICsgaW5mby0+bVNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnVwZGF0ZVNhbXBsZUluZm8oKSB7Ci0gICAgaWYgKG1TYW1wbGVJbmRleCA+PSBtU2FtcGxlQ291bnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtU2FtcGxlU2l6ZXMgIT0gTlVMTCkgewotICAgICAgICB1aW50MzJfdCBkZWZhdWx0U2FtcGxlU2l6ZSA9IFUzMl9BVChtU2FtcGxlU2l6ZXMtPmRhdGEoKSArIDQpOwotICAgICAgICBpZiAoZGVmYXVsdFNhbXBsZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZSA9IGRlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemU9IFUzMl9BVChtU2FtcGxlU2l6ZXMtPmRhdGEoKSArIDEyICsgNCAqIG1TYW1wbGVJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtQ29tcGFjdFNhbXBsZVNpemVzICE9IE5VTEwpOwotCi0gICAgICAgIHVpbnQzMl90IGZpZWxkU2l6ZSA9IFUzMl9BVChtQ29tcGFjdFNhbXBsZVNpemVzLT5kYXRhKCkgKyA0KTsKLQotICAgICAgICBzd2l0Y2ggKGZpZWxkU2l6ZSkgewotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJ5dGUgPSBtQ29tcGFjdFNhbXBsZVNpemVzLT5kYXRhKClbMTIgKyBtU2FtcGxlSW5kZXggLyAyXTsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZSA9IChtU2FtcGxlSW5kZXggJiAxKSA/IGJ5dGUgJiAweDBmIDogYnl0ZSA+PiA0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemUgPSBtQ29tcGFjdFNhbXBsZVNpemVzLT5kYXRhKClbMTIgKyBtU2FtcGxlSW5kZXhdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKGZpZWxkU2l6ZSwgMTYpOwotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplID0KLSAgICAgICAgICAgICAgICAgICAgVTE2X0FUKG1Db21wYWN0U2FtcGxlU2l6ZXMtPmRhdGEoKSArIDEyICsgbVNhbXBsZUluZGV4ICogMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDSEVDS19HVChtU2FtcGxlVG9DaHVua1JlbWFpbmluZywgMCk7Ci0KLSAgICAvLyBUaGUgc2FtcGxlIGRlc2MgaW5kZXggaXMgMS1iYXNlZC4uLiBYWFgKLSAgICBtU2FtcGxlSW5mby5tU2FtcGxlRGVzY0luZGV4ID0KLSAgICAgICAgVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA4ICsgMTIgKiBtU2FtcGxlVG9DaHVua0luZGV4ICsgOCk7Ci0KLSAgICBpZiAobUNodW5rSW5kZXggIT0gbVByZXZDaHVua0luZGV4KSB7Ci0gICAgICAgIG1QcmV2Q2h1bmtJbmRleCA9IG1DaHVua0luZGV4OwotCi0gICAgICAgIGlmIChtQ2h1bmtPZmZzZXRzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBVMzJfQVQobUNodW5rT2Zmc2V0cy0+ZGF0YSgpICsgNCk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2h1bmtJbmRleCA+PSBlbnRyeUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZGV4ID0gbVNhbXBsZUNvdW50OwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU5leHRTYW1wbGVPZmZzZXQgPQotICAgICAgICAgICAgICAgIFUzMl9BVChtQ2h1bmtPZmZzZXRzLT5kYXRhKCkgKyA4ICsgNCAqIG1DaHVua0luZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENIRUNLKG1DaHVua09mZnNldHM2NCAhPSBOVUxMKTsKLQotICAgICAgICAgICAgdWludDMyX3QgZW50cnlDb3VudCA9IFUzMl9BVChtQ2h1bmtPZmZzZXRzNjQtPmRhdGEoKSArIDQpOwotCi0gICAgICAgICAgICBpZiAobUNodW5rSW5kZXggPj0gZW50cnlDb3VudCkgewotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmRleCA9IG1TYW1wbGVDb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1OZXh0U2FtcGxlT2Zmc2V0ID0KLSAgICAgICAgICAgICAgICBVNjRfQVQobUNodW5rT2Zmc2V0czY0LT5kYXRhKCkgKyA4ICsgOCAqIG1DaHVua0luZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1TYW1wbGVJbmZvLm1PZmZzZXQgPSBtTmV4dFNhbXBsZU9mZnNldDsKLQotICAgIG1TYW1wbGVJbmZvLm1QcmVzZW50YXRpb25UaW1lID0gMDsKLSAgICBtU2FtcGxlSW5mby5tRmxhZ3MgPSAwOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OmFkdmFuY2UoKSB7Ci0gICAgbU5leHRTYW1wbGVPZmZzZXQgKz0gbVNhbXBsZUluZm8ubVNpemU7Ci0KLSAgICArK21TYW1wbGVJbmRleDsKLSAgICBpZiAoLS1tU2FtcGxlVG9DaHVua1JlbWFpbmluZyA9PSAwKSB7Ci0gICAgICAgICsrbUNodW5rSW5kZXg7Ci0KLSAgICAgICAgdWludDMyX3QgZW50cnlDb3VudCA9IFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgNCk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgc2FtcGxlIHRvIGNodW5rIHRhYmxlLCB3ZSB3aWxsCi0gICAgICAgIC8vIHN0YXkgb24gdGhpcyBlbnRyeS4KLSAgICAgICAgaWYgKCh1aW50MzJfdCkobVNhbXBsZVRvQ2h1bmtJbmRleCArIDEpIDwgZW50cnlDb3VudCkgewotICAgICAgICAgICAgdWludDMyX3QgbmV4dENodW5rSW5kZXggPQotICAgICAgICAgICAgICAgIFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgOCArIDEyICogKG1TYW1wbGVUb0NodW5rSW5kZXggKyAxKSk7Ci0KLSAgICAgICAgICAgIENIRUNLX0dFKG5leHRDaHVua0luZGV4LCAxdSk7Ci0gICAgICAgICAgICAtLW5leHRDaHVua0luZGV4OwotCi0gICAgICAgICAgICBpZiAobUNodW5rSW5kZXggPj0gbmV4dENodW5rSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtQ2h1bmtJbmRleCwgbmV4dENodW5rSW5kZXgpOwotICAgICAgICAgICAgICAgICsrbVNhbXBsZVRvQ2h1bmtJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1TYW1wbGVUb0NodW5rUmVtYWluaW5nID0KLSAgICAgICAgICAgIFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgOCArIDEyICogbVNhbXBsZVRvQ2h1bmtJbmRleCArIDQpOwotICAgIH0KLQotICAgIHVwZGF0ZVNhbXBsZUluZm8oKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0VTMyQXQodWludDhfdCAqcHRyLCB1aW50MzJfdCB4KSB7Ci0gICAgcHRyWzBdID0geCA+PiAyNDsKLSAgICBwdHJbMV0gPSAoeCA+PiAxNikgJiAweGZmOwotICAgIHB0clsyXSA9ICh4ID4+IDgpICYgMHhmZjsKLSAgICBwdHJbM10gPSB4ICYgMHhmZjsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6c2lnbmFsQ29tcGxldGlvbigpIHsKLSAgICBtU2FtcGxlVG9DaHVua0luZGV4ID0gMDsKLQotICAgIG1TYW1wbGVUb0NodW5rUmVtYWluaW5nID0KLSAgICAgICAgKG1TYW1wbGVUb0NodW5rID09IE5VTEwpCi0gICAgICAgICAgICA/IDAKLSAgICAgICAgICAgIDogVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA4ICsgMTIgKiBtU2FtcGxlVG9DaHVua0luZGV4ICsgNCk7Ci0KLSAgICB1cGRhdGVTYW1wbGVJbmZvKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6Y29tcGxldGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZVNpemUgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0KLSAgICBpZiAoc2FtcGxlU2l6ZSA9PSAwICYmIG9mZnNldCArIDEyICsgc2FtcGxlQ291bnQgKiA0ICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1TYW1wbGVTaXplcywgb2Zmc2V0LCBzaXplKTsKLQotICAgIG1TYW1wbGVDb3VudCA9IHNhbXBsZUNvdW50OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmllbGRTaXplID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgaWYgKGZpZWxkU2l6ZSAhPSA0ICYmIGZpZWxkU2l6ZSAhPSA4ICYmIGZpZWxkU2l6ZSAhPSAxNikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDgpOwotCi0gICAgaWYgKG9mZnNldCArIDEyICsgKHNhbXBsZUNvdW50ICogZmllbGRTaXplICsgNCkgLyA4ICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1Db21wYWN0U2FtcGxlU2l6ZXMsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICBtU2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBpZiAoZW50cnlDb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0ICsgOCArIGVudHJ5Q291bnQgKiAxMiAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtU2FtcGxlVG9DaHVuaywgb2Zmc2V0LCBzaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZW50cnlDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIGlmIChvZmZzZXQgKyA4ICsgZW50cnlDb3VudCAqIDQgIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbUNodW5rT2Zmc2V0cywgb2Zmc2V0LCBzaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgaWYgKG9mZnNldCArIDggKyBlbnRyeUNvdW50ICogOCAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtQ2h1bmtPZmZzZXRzNjQsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFkNDZlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVFJBQ0tfRlJBR01FTlRfSF8KLQotI2RlZmluZSBUUkFDS19GUkFHTUVOVF9IXwotCi0jaW5jbHVkZSAiaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlRyYWNrRnJhZ21lbnQgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgVHJhY2tGcmFnbWVudCgpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbENvbXBsZXRpb24oKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGNvbXBsZXRlKCkgY29uc3QgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+VHJhY2tGcmFnbWVudCgpIHt9Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2tGcmFnbWVudCk7Ci19OwotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6VHJhY2tGcmFnbWVudCB7Ci0gICAgRHluYW1pY1RyYWNrRnJhZ21lbnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pOwotICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlKCk7Ci0KLSAgICB2b2lkIGFkZFNhbXBsZSgKLSAgICAgICAgICAgIG9mZjY0X3QgZGF0YU9mZnNldCwgc2l6ZV90IHNhbXBsZVNpemUsCi0gICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25UaW1lLAotICAgICAgICAgICAgc2l6ZV90IHNhbXBsZURlc2NJbmRleCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIC8vIE5vIG1vcmUgc2FtcGxlcyB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgZnJhZ21lbnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxDb21wbGV0aW9uKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgY29tcGxldGUoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR5bmFtaWNUcmFja0ZyYWdtZW50KCk7Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBtQ29tcGxldGU7Ci0gICAgc2l6ZV90IG1TYW1wbGVJbmRleDsKLSAgICBWZWN0b3I8U2FtcGxlSW5mbz4gbVNhbXBsZXM7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEeW5hbWljVHJhY2tGcmFnbWVudCk7Ci19OwotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudCA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpUcmFja0ZyYWdtZW50IHsKLSAgICBTdGF0aWNUcmFja0ZyYWdtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxDb21wbGV0aW9uKCk7Ci0gICAgdmlydHVhbCBib29sIGNvbXBsZXRlKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZVNpemVzKAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflN0YXRpY1RyYWNrRnJhZ21lbnQoKTsKLQotcHJpdmF0ZToKLSAgICBzaXplX3QgbVNhbXBsZUluZGV4OwotICAgIHNpemVfdCBtU2FtcGxlQ291bnQ7Ci0gICAgdWludDMyX3QgbUNodW5rSW5kZXg7Ci0KLSAgICBTYW1wbGVJbmZvIG1TYW1wbGVJbmZvOwotCi0gICAgc3A8QUJ1ZmZlcj4gbVNhbXBsZVNpemVzOwotICAgIHNwPEFCdWZmZXI+IG1Db21wYWN0U2FtcGxlU2l6ZXM7Ci0KLSAgICBzcDxBQnVmZmVyPiBtU2FtcGxlVG9DaHVuazsKLSAgICBzc2l6ZV90IG1TYW1wbGVUb0NodW5rSW5kZXg7Ci0gICAgc2l6ZV90IG1TYW1wbGVUb0NodW5rUmVtYWluaW5nOwotCi0gICAgc3A8QUJ1ZmZlcj4gbUNodW5rT2Zmc2V0czsKLSAgICBzcDxBQnVmZmVyPiBtQ2h1bmtPZmZzZXRzNjQ7Ci0gICAgdWludDMyX3QgbVByZXZDaHVua0luZGV4OwotICAgIHVpbnQ2NF90IG1OZXh0U2FtcGxlT2Zmc2V0OwotCi0gICAgdm9pZCB1cGRhdGVTYW1wbGVJbmZvKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdGF0aWNUcmFja0ZyYWdtZW50KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gVFJBQ0tfRlJBR01FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCBjYjU3YTJmLi42ZDg4NjZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0zNiw2ICszNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIEkgd2FudCB0aGUgZXhwcmVzc2lvbiAieSIgZXZhbHVhdGVkIGV2ZW4gaWYgdmVyYm9zZSBsb2dnaW5nIGlzIG9mZi4KQEAgLTUwMSwxMSArNTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHNF9WSURFTyk7CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUENNX0FVRElPOgotICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpQQ01fQVVESU8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0xQQ01fQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzOgogICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzMpOwpAQCAtNTUzLDcgKzU1MSw5IEBACiAgICAgICAgIH0KICNlbmRpZgogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgaWYgKCFwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtRXhwZWN0ZWRDb250aW51aXR5Q291bnRlciA9IChjb250aW51aXR5X2NvdW50ZXIgKyAxKSAmIDB4MGY7CkBAIC01ODYsNyArNTg2LDcgQEAKICAgICAgICAgLy8gSW5jcmVtZW50IGluIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKIAotICAgICAgICBBTE9HSSgicmVzaXppbmcgYnVmZmVyIHRvICVkIGJ5dGVzIiwgbmVlZGVkU2l6ZSk7CisgICAgICAgIEFMT0dJKCJyZXNpemluZyBidWZmZXIgdG8gJXp1IGJ5dGVzIiwgbmVlZGVkU2l6ZSk7CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IEFCdWZmZXIobmVlZGVkU2l6ZSk7CiAgICAgICAgIG1lbWNweShuZXdCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwpAQCAtNjE4LDcgKzYxOCw3IEBACiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMV9BVURJTzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUzoKLSAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BDTV9BVURJTzoKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0xQQ01fQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKQEAgLTY2NSw3ICs2NjUsNyBAQAogICAgIH0KIAogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KHR5cGUsIGV4dHJhKTsKKyAgICAgICAgbVNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KHR5cGUsIGV4dHJhLCB0cnVlKTsKICAgICB9CiB9CiAKQEAgLTc0OCw3ICs3NDgsNyBAQAogICAgICAgICAgICAgUFRTIHw9IGJyLT5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAweCUwMTZsbHggKCUuMmYpIiwgUFRTLCBQVFMgLyA5MDAwMC4wKTsKKyAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAweCUwMTYiIFBSSXg2NCAiICglLjJmKSIsIFBUUywgUFRTIC8gOTAwMDAuMCk7CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogCkBAIC03NjQsNyArNzY0LDcgQEAKICAgICAgICAgICAgICAgICBEVFMgfD0gYnItPmdldEJpdHMoMTUpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJWxsdSIsIERUUyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkRUUyA9ICUiIFBSSXU2NCwgRFRTKTsKIAogICAgICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogICAgICAgICAgICAgfQpAQCAtNzgyLDcgKzc4Miw3IEBACiAgICAgICAgICAgICBFU0NSIHw9IGJyLT5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJWxsdSIsIEVTQ1IpOworICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlIiBQUkl1NjQsIEVTQ1IpOwogICAgICAgICAgICAgTVlfTE9HVigiRVNDUl9leHRlbnNpb24gPSAldSIsIGJyLT5nZXRCaXRzKDkpKTsKIAogICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKQEAgLTgxMiw3ICs4MTIsNyBAQAogCiAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCBkYXRhTGVuZ3RoICogOCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQRVMgcGFja2V0IGRvZXMgbm90IGNhcnJ5IGVub3VnaCBkYXRhIHRvIGNvbnRhaW4gIgotICAgICAgICAgICAgICAgICAgICAgInBheWxvYWQuIChudW1CaXRzTGVmdCA9ICVkLCByZXF1aXJlZCA9ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAicGF5bG9hZC4gKG51bUJpdHNMZWZ0ID0gJXp1LCByZXF1aXJlZCA9ICV1KSIsCiAgICAgICAgICAgICAgICAgICAgICBici0+bnVtQml0c0xlZnQoKSwgZGF0YUxlbmd0aCAqIDgpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTgzMiw3ICs4MzIsNyBAQAogICAgICAgICAgICAgc2l6ZV90IHBheWxvYWRTaXplQml0cyA9IGJyLT5udW1CaXRzTGVmdCgpOwogICAgICAgICAgICAgQ0hFQ0tfRVEocGF5bG9hZFNpemVCaXRzICUgOCwgMHUpOwogCi0gICAgICAgICAgICBBTE9HVigiVGhlcmUncyAlZCBieXRlcyBvZiBwYXlsb2FkLiIsIHBheWxvYWRTaXplQml0cyAvIDgpOworICAgICAgICAgICAgQUxPR1YoIlRoZXJlJ3MgJXp1IGJ5dGVzIG9mIHBheWxvYWQuIiwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmVhbV9pZCA9PSAweGJlKSB7ICAvLyBwYWRkaW5nX3N0cmVhbQogICAgICAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOwpAQCAtODUwLDcgKzg1MCw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBBTE9HVigiZmx1c2hpbmcgc3RyZWFtIDB4JTA0eCBzaXplID0gJWQiLCBtRWxlbWVudGFyeVBJRCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVigiZmx1c2hpbmcgc3RyZWFtIDB4JTA0eCBzaXplID0gJXp1IiwgbUVsZW1lbnRhcnlQSUQsIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICBBQml0UmVhZGVyIGJyKG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKIApAQCAtODYyLDcgKzg2Miw3IEBACiB9CiAKIHZvaWQgQVRTUGFyc2VyOjpTdHJlYW06Om9uUGF5bG9hZERhdGEoCi0gICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsIHVpbnQ2NF90IFBUUywgdWludDY0X3QgRFRTLAorICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLCB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IC8qIERUUyAqLywKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICNpZiAwCiAgICAgQUxPR0koInBheWxvYWQgc3RyZWFtVHlwZSAweCUwMngsIFBUUyA9IDB4JTAxNmxseCwgZFBUUyA9ICVsbGQiLApAQCAtODk0LDYgKzg5NCwxMiBAQAogICAgICAgICAgICAgICAgIEFMT0dWKCJTdHJlYW0gUElEIDB4JTA4eCBvZiB0eXBlIDB4JTAyeCBub3cgaGFzIGRhdGEuIiwKICAgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBtU3RyZWFtVHlwZSk7CiAKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIUlzSURSKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICAgICAgfQpAQCAtMTE3Miw3ICsxMTc4LDcgQEAKIAogICAgICAgICAgICAgdWludDY0X3QgUENSID0gUENSX2Jhc2UgKiAzMDAgKyBQQ1JfZXh0OwogCi0gICAgICAgICAgICBBTE9HVigiUElEIDB4JTA0eDogUENSID0gMHglMDE2bGx4ICglLjJmKSIsCisgICAgICAgICAgICBBTE9HVigiUElEIDB4JTA0eDogUENSID0gMHglMDE2IiBQUkl4NjQgIiAoJS4yZikiLAogICAgICAgICAgICAgICAgICAgUElELCBQQ1IsIFBDUiAvIDI3RTYpOwogCiAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGJ5IHRoaXMgcGFyc2VyIHVwIHRvIGFuZApAQCAtMTI2Nyw4ICsxMjczLDggQEAKIH0KIAogdm9pZCBBVFNQYXJzZXI6OnVwZGF0ZVBDUigKLSAgICAgICAgdW5zaWduZWQgUElELCB1aW50NjRfdCBQQ1IsIHNpemVfdCBieXRlT2Zmc2V0RnJvbVN0YXJ0KSB7Ci0gICAgQUxPR1YoIlBDUiAweCUwMTZsbHggQCAlZCIsIFBDUiwgYnl0ZU9mZnNldEZyb21TdGFydCk7CisgICAgICAgIHVuc2lnbmVkIC8qIFBJRCAqLywgdWludDY0X3QgUENSLCBzaXplX3QgYnl0ZU9mZnNldEZyb21TdGFydCkgeworICAgIEFMT0dWKCJQQ1IgMHglMDE2IiBQUkl4NjQgIiBAICV6dSIsIFBDUiwgYnl0ZU9mZnNldEZyb21TdGFydCk7CiAKICAgICBpZiAobU51bVBDUnMgPT0gMikgewogICAgICAgICBtUENSWzBdID0gbVBDUlsxXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDg2YjAyNWYuLjg5ODZhMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtOTMsNyArOTMsOSBAQAogICAgICAgICAvLyBGcm9tIEFUU0MgQS81MyBQYXJ0IDM6MjAwOSwgNi43LjEKICAgICAgICAgU1RSRUFNVFlQRV9BQzMgICAgICAgICAgICAgICAgICA9IDB4ODEsCiAKLSAgICAgICAgU1RSRUFNVFlQRV9QQ01fQVVESU8gICAgICAgICAgICA9IDB4ODMsCisgICAgICAgIC8vIFN0cmVhbSB0eXBlIDB4ODMgaXMgbm9uLXN0YW5kYXJkLAorICAgICAgICAvLyBpdCBjb3VsZCBiZSBMUENNIG9yIFRydWVIRCBBQzMKKyAgICAgICAgU1RSRUFNVFlQRV9MUENNX0FDMyAgICAgICAgICAgICA9IDB4ODMsCiAgICAgfTsKIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCmluZGV4IGMxYTdhOWQuLmMxN2EwYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKQEAgLTEzLDYgKzEzLDggQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tcGVnMnRzCiAKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDJiMGJmMzAuLmEwM2Y2ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMTQsNiArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBbm90aGVyUGFja2V0U291cmNlIgorCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0yNiwxNiArMjksMjEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdCBpbnQ2NF90IGtOZWFyRU9TTWFya1VzID0gMjAwMDAwMGxsOyAvLyAyIHNlY3MKIAogQW5vdGhlclBhY2tldFNvdXJjZTo6QW5vdGhlclBhY2tldFNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCiAgICAgOiBtSXNBdWRpbyhmYWxzZSksCisgICAgICBtSXNWaWRlbyhmYWxzZSksCiAgICAgICBtRm9ybWF0KE5VTEwpLAogICAgICAgbUxhc3RRdWV1ZWRUaW1lVXMoMCksCiAgICAgICBtRU9TUmVzdWx0KE9LKSwKLSAgICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEoTlVMTCkgeworICAgICAgbUxhdGVzdEVucXVldWVkTWV0YShOVUxMKSwKKyAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEoTlVMTCksCisgICAgICBtUXVldWVkRGlzY29udGludWl0eUNvdW50KDApIHsKICAgICBzZXRGb3JtYXQobWV0YSk7CiB9CiAKQEAgLTQzLDYgKzUxLDcgQEAKICAgICBDSEVDSyhtRm9ybWF0ID09IE5VTEwpOwogCiAgICAgbUlzQXVkaW8gPSBmYWxzZTsKKyAgICBtSXNWaWRlbyA9IGZhbHNlOwogCiAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC01NCwxNSArNjMsMTcgQEAKIAogICAgIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgIG1Jc0F1ZGlvID0gdHJ1ZTsKKyAgICB9IGVsc2UgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKTsKKyAgICAgICAgQ0hFQ0soIXN0cm5jYXNlY21wKCJ0ZXh0LyIsIG1pbWUsIDUpKTsKICAgICB9CiB9CiAKIEFub3RoZXJQYWNrZXRTb3VyY2U6On5Bbm90aGVyUGFja2V0U291cmNlKCkgewogfQogCi1zdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPSzsKIH0KIApAQCAtODYsNyArOTcsNyBAQAogCiAgICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKKyAgICAgICAgICAgIHJldHVybiBtRm9ybWF0ID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOwogICAgICAgICB9CiAKICAgICAgICAgKytpdDsKQEAgLTExMiw5ICsxMjMsMTIgQEAKICAgICAgICAgICAgICAgICBtRm9ybWF0LmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC0tbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKICAgICAgICAgICAgIHJldHVybiBJTkZPX0RJU0NPTlRJTlVJVFk7CiAgICAgICAgIH0KIAorICAgICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhID0gKCpidWZmZXIpLT5tZXRhKCktPmR1cCgpOworCiAgICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKICAgICAgICAgaWYgKCgqYnVmZmVyKS0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgewogICAgICAgICAgICAgbUZvcm1hdCA9IHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKQEAgLTEzNiw4ICsxNTAsMTAgQEAKICAgICB9CiAKICAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKKwogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiBidWZmZXIgPSAqbUJ1ZmZlcnMuYmVnaW4oKTsKICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UobUJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEgPSBidWZmZXItPm1ldGEoKS0+ZHVwKCk7CiAKICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgewpAQCAtMTczLDcgKzE4OSwxMSBAQAogICAgICAgICByZXR1cm4gKGRpc2NvbnRpbnVpdHlUeXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0FVRElPX0ZPUk1BVCkgIT0gMDsKICAgICB9CiAKLSAgICByZXR1cm4gKGRpc2NvbnRpbnVpdHlUeXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1ZJREVPX0ZPUk1BVCkgIT0gMDsKKyAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgcmV0dXJuIChkaXNjb250aW51aXR5VHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9WSURFT19GT1JNQVQpICE9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OnF1ZXVlQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CkBAIC0xODYsMTMgKzIwNiwxOCBAQAogICAgIGludDY0X3QgbGFzdFF1ZXVlZFRpbWVVczsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbGFzdFF1ZXVlZFRpbWVVcykpOwogICAgIG1MYXN0UXVldWVkVGltZVVzID0gbGFzdFF1ZXVlZFRpbWVVczsKLSAgICBBTE9HVigicXVldWVBY2Nlc3NVbml0IHRpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpIiwgbUxhc3RRdWV1ZWRUaW1lVXMsIG1MYXN0UXVldWVkVGltZVVzIC8gMUU2KTsKKyAgICBBTE9HVigicXVldWVBY2Nlc3NVbml0IHRpbWVVcz0lIiBQUklpNjQgIiB1cyAoJS4yZiBzZWNzKSIsIG1MYXN0UXVldWVkVGltZVVzLCBtTGFzdFF1ZXVlZFRpbWVVcyAvIDFFNik7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOwogICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAKLSAgICBpZiAoIW1MYXRlc3RFbnF1ZXVlZE1ldGEuZ2V0KCkpIHsKKyAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKKyAgICAgICAgKyttUXVldWVkRGlzY29udGludWl0eUNvdW50OworICAgIH0KKworICAgIGlmIChtTGF0ZXN0RW5xdWV1ZWRNZXRhID09IE5VTEwpIHsKICAgICAgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IGJ1ZmZlci0+bWV0YSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludDY0X3QgbGF0ZXN0VGltZVVzID0gMDsKQEAgLTIwOCw2ICsyMzMsNyBAQAogCiAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKICAgICBtRU9TUmVzdWx0ID0gT0s7CisgICAgbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudCA9IDA7CiAKICAgICBtRm9ybWF0ID0gTlVMTDsKICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhID0gTlVMTDsKQEAgLTIxNSwyNyArMjQxLDMxIEBACiAKIHZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6cXVldWVEaXNjb250aW51aXR5KAogICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpIHsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSwKKyAgICAgICAgYm9vbCBkaXNjYXJkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIC8vIExlYXZlIG9ubHkgZGlzY29udGludWl0aWVzIGluIHRoZSBxdWV1ZS4KLSAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKLSAgICB3aGlsZSAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gb2xkQnVmZmVyID0gKml0OworICAgIGlmIChkaXNjYXJkKSB7CisgICAgICAgIC8vIExlYXZlIG9ubHkgZGlzY29udGludWl0aWVzIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBtQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gb2xkQnVmZmVyID0gKml0OwogCi0gICAgICAgIGludDMyX3Qgb2xkRGlzY29udGludWl0eVR5cGU7Ci0gICAgICAgIGlmICghb2xkQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgImRpc2NvbnRpbnVpdHkiLCAmb2xkRGlzY29udGludWl0eVR5cGUpKSB7Ci0gICAgICAgICAgICBpdCA9IG1CdWZmZXJzLmVyYXNlKGl0KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaW50MzJfdCBvbGREaXNjb250aW51aXR5VHlwZTsKKyAgICAgICAgICAgIGlmICghb2xkQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaXNjb250aW51aXR5IiwgJm9sZERpc2NvbnRpbnVpdHlUeXBlKSkgeworICAgICAgICAgICAgICAgIGl0ID0gbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK2l0OwogICAgICAgICB9Ci0KLSAgICAgICAgKytpdDsKICAgICB9CiAKICAgICBtRU9TUmVzdWx0ID0gT0s7CiAgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSAwOwogICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBOVUxMOworICAgICsrbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKIAogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDApOwogICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eSIsIHN0YXRpY19jYXN0PGludDMyX3Q+KHR5cGUpKTsKQEAgLTI2NSw3ICsyOTUsMTAgQEAKIAogaW50NjRfdCBBbm90aGVyUGFja2V0U291cmNlOjpnZXRCdWZmZXJlZER1cmF0aW9uVXMoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0QnVmZmVyZWREdXJhdGlvblVzX2woZmluYWxSZXN1bHQpOworfQogCitpbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKHN0YXR1c190ICpmaW5hbFJlc3VsdCkgewogICAgICpmaW5hbFJlc3VsdCA9IG1FT1NSZXN1bHQ7CiAKICAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewpAQCAtMjc0LDYgKzMwNyw3IEBACiAKICAgICBpbnQ2NF90IHRpbWUxID0gLTE7CiAgICAgaW50NjRfdCB0aW1lMiA9IC0xOworICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDA7CiAKICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKICAgICB3aGlsZSAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkpIHsKQEAgLTI4MSwyMCArMzE1LDY0IEBACiAKICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgewotICAgICAgICAgICAgaWYgKHRpbWUxIDwgMCkgeworICAgICAgICAgICAgaWYgKHRpbWUxIDwgMCB8fCB0aW1lVXMgPCB0aW1lMSkgewogICAgICAgICAgICAgICAgIHRpbWUxID0gdGltZVVzOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB0aW1lMiA9IHRpbWVVczsKKyAgICAgICAgICAgIGlmICh0aW1lMiA8IDAgfHwgdGltZVVzID4gdGltZTIpIHsKKyAgICAgICAgICAgICAgICB0aW1lMiA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkaXNjb250aW51aXR5LCByZXNldCBldmVyeXRoaW5nLgorICAgICAgICAgICAgZHVyYXRpb25VcyArPSB0aW1lMiAtIHRpbWUxOwogICAgICAgICAgICAgdGltZTEgPSB0aW1lMiA9IC0xOwogICAgICAgICB9CiAKICAgICAgICAgKytpdDsKICAgICB9CiAKLSAgICByZXR1cm4gdGltZTIgLSB0aW1lMTsKKyAgICByZXR1cm4gZHVyYXRpb25VcyArICh0aW1lMiAtIHRpbWUxKTsKK30KKworLy8gQSBjaGVhcGVyIGJ1dCBsZXNzIHByZWNpc2UgdmVyc2lvbiBvZiBnZXRCdWZmZXJlZER1cmF0aW9uVXMgdGhhdCB3ZSB3b3VsZCBsaWtlIHRvIHVzZSBpbgorLy8gTGl2ZVNlc3Npb246OmRlcXVldWVBY2Nlc3NVbml0IHRvIHRyaWdnZXIgZG93bndhcmRzIGFkYXB0YXRpb24uCitpbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEVzdGltYXRlZER1cmF0aW9uVXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAobVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudCA+IDApIHsKKyAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgICAgIHJldHVybiBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbCgmZmluYWxSZXN1bHQpOworICAgIH0KKworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICppdDsKKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnN0YXJ0VGltZVVzKTsKKyAgICBpZiAoc3RhcnRUaW1lVXMgPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGl0ID0gbUJ1ZmZlcnMuZW5kKCk7CisgICAgLS1pdDsKKyAgICBidWZmZXIgPSAqaXQ7CisKKyAgICBpbnQ2NF90IGVuZFRpbWVVczsKKyAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZW5kVGltZVVzKTsKKyAgICBpZiAoZW5kVGltZVVzIDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRpZmZVczsKKyAgICBpZiAoZW5kVGltZVVzID4gc3RhcnRUaW1lVXMpIHsKKyAgICAgICAgZGlmZlVzID0gZW5kVGltZVVzIC0gc3RhcnRUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlmZlVzID0gc3RhcnRUaW1lVXMgLSBlbmRUaW1lVXM7CisgICAgfQorICAgIHJldHVybiBkaWZmVXM7CiB9CiAKIHN0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6Om5leHRCdWZmZXJUaW1lKGludDY0X3QgKnRpbWVVcykgewpAQCAtMzIzLDkgKzQwMSwxNCBAQAogICAgIHJldHVybiAobUVPU1Jlc3VsdCAhPSBPSyk7CiB9CiAKLXNwPEFNZXNzYWdlPiBBbm90aGVyUGFja2V0U291cmNlOjpnZXRMYXRlc3RNZXRhKCkgeworc3A8QU1lc3NhZ2U+IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldExhdGVzdEVucXVldWVkTWV0YSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHJldHVybiBtTGF0ZXN0RW5xdWV1ZWRNZXRhOwogfQogCitzcDxBTWVzc2FnZT4gQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1MYXRlc3REZXF1ZXVlZE1ldGE7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCmluZGV4IDliMTkzYTIuLjgwOWE4NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCkBAIC00OSwxMiArNDksMTYgQEAKICAgICAvLyBwcmVzZW50YXRpb24gdGltZXN0YW1wcyBzaW5jZSB0aGUgbGFzdCBkaXNjb250aW51aXR5IChpZiBhbnkpLgogICAgIGludDY0X3QgZ2V0QnVmZmVyZWREdXJhdGlvblVzKHN0YXR1c190ICpmaW5hbFJlc3VsdCk7CiAKKyAgICBpbnQ2NF90IGdldEVzdGltYXRlZER1cmF0aW9uVXMoKTsKKwogICAgIHN0YXR1c190IG5leHRCdWZmZXJUaW1lKGludDY0X3QgKnRpbWVVcyk7CiAKICAgICB2b2lkIHF1ZXVlQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIHZvaWQgcXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKKyAgICAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEsCisgICAgICAgICAgICBib29sIGRpc2NhcmQpOwogCiAgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgcmVzdWx0KTsKIApAQCAtNjIsNyArNjYsOCBAQAogCiAgICAgYm9vbCBpc0ZpbmlzaGVkKGludDY0X3QgZHVyYXRpb24pIGNvbnN0OwogCi0gICAgc3A8QU1lc3NhZ2U+IGdldExhdGVzdE1ldGEoKTsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgc3A8QU1lc3NhZ2U+IGdldExhdGVzdERlcXVldWVkTWV0YSgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QW5vdGhlclBhY2tldFNvdXJjZSgpOwpAQCAtNzIsMTMgKzc3LDE4IEBACiAgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CiAKICAgICBib29sIG1Jc0F1ZGlvOworICAgIGJvb2wgbUlzVmlkZW87CiAgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7CiAgICAgaW50NjRfdCBtTGFzdFF1ZXVlZFRpbWVVczsKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUJ1ZmZlcnM7CiAgICAgc3RhdHVzX3QgbUVPU1Jlc3VsdDsKICAgICBzcDxBTWVzc2FnZT4gbUxhdGVzdEVucXVldWVkTWV0YTsKKyAgICBzcDxBTWVzc2FnZT4gbUxhdGVzdERlcXVldWVkTWV0YTsKKworICAgIHNpemVfdCAgbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKIAogICAgIGJvb2wgd2FzRm9ybWF0Q2hhbmdlKGludDMyX3QgZGlzY29udGludWl0eVR5cGUpIGNvbnN0OworICAgIGludDY0X3QgZ2V0QnVmZmVyZWREdXJhdGlvblVzX2woc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFub3RoZXJQYWNrZXRTb3VyY2UpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IDJiMDcxMWIuLmVmMWNkM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yNjQsNyArMjY1LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEguMjY0L01QRUcgc3luY3dvcmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IG9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yOTcsNyArMjk4LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEguMjY0L01QRUcgc3luY3dvcmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IG9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMzAsNyArMzMxLDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFBQyBzeW5jd29yZCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTM1OCw3ICszNTksNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUMzIHN5bmN3b3JkIGF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMzg1LDcgKzM4Niw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBNUEVHIGF1ZGlvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bmN3b3JkIGF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jd29yZCBhdCBvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNDA5LDcgKzQxMCw3IEBACiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBuZWVkZWRTaXplID4gbUJ1ZmZlci0+Y2FwYWNpdHkoKSkgewogICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyA2NTUzNSkgJiB+NjU1MzU7CiAKLSAgICAgICAgQUxPR1YoInJlc2l6aW5nIGJ1ZmZlciB0byBzaXplICVkIiwgbmVlZGVkU2l6ZSk7CisgICAgICAgIEFMT0dWKCJyZXNpemluZyBidWZmZXIgdG8gc2l6ZSAlenUiLCBuZWVkZWRTaXplKTsKIAogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihuZWVkZWRTaXplKTsKICAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewpAQCAtNDMyLDcgKzQzMyw3IEBACiAKICNpZiAwCiAgICAgaWYgKG1Nb2RlID09IEFBQykgewotICAgICAgICBBTE9HSSgic2l6ZSA9ICVkLCB0aW1lVXMgPSAlLjJmIHNlY3MiLCBzaXplLCB0aW1lVXMgLyAxRTYpOworICAgICAgICBBTE9HSSgic2l6ZSA9ICV6dSwgdGltZVVzID0gJS4yZiBzZWNzIiwgc2l6ZSwgdGltZVVzIC8gMUU2KTsKICAgICAgICAgaGV4ZHVtcChkYXRhLCBzaXplKTsKICAgICB9CiAjZW5kaWYKQEAgLTYwMyw2ICs2MDQsOCBAQAogICAgIC8vIGhhdmluZyB0byBpbnRlcnBvbGF0ZS4KICAgICAvLyBUaGUgZmluYWwgQUFDIGZyYW1lIG1heSB3ZWxsIGV4dGVuZCBpbnRvIHRoZSBuZXh0IFJhbmdlSW5mbyBidXQKICAgICAvLyB0aGF0J3Mgb2suCisgICAgLy8gVE9ETzogdGhlIGxvZ2ljIGNvbW1lbnRlZCBhYm92ZSBpcyBza2lwcGVkIGJlY2F1c2UgY29kZWMgY2Fubm90IHRha2UKKyAgICAvLyBhcmJpdHJhcnkgc2l6ZWQgaW5wdXQgYnVmZmVyczsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgaW5mby5tTGVuZ3RoKSB7CiAgICAgICAgIGlmIChvZmZzZXQgKyA3ID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CkBAIC02NjcsOSArNjcwLDEyIEBACiAgICAgICAgIHNpemVfdCBoZWFkZXJTaXplID0gcHJvdGVjdGlvbl9hYnNlbnQgPyA3IDogOTsKIAogICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKKyAgICAgICAgLy8gVE9ETzogbW92ZSBiYWNrIHRvIGNvbmNhdGVuYXRpb24gd2hlbiBjb2RlYyBjYW4gc3VwcG9ydCBhcmJpdHJhcnkgaW5wdXQgYnVmZmVycy4KKyAgICAgICAgLy8gRm9yIG5vdyBvbmx5IHF1ZXVlIGEgc2luZ2xlIGJ1ZmZlcgorICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG9mZnNldCk7CisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcEFBQyhvZmZzZXQpOwogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKG9mZnNldCk7CiAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBvZmZzZXQpOwpAQCAtNzE2LDYgKzcyMiw0NSBAQAogICAgIHJldHVybiB0aW1lVXM7CiB9CiAKKy8vIFRPRE86IGF2b2lkIGludGVycG9sYXRpbmcgdGltZXN0YW1wcyBvbmNlIGNvZGVjIHN1cHBvcnRzIGFyYml0cmFyeSBzaXplZCBpbnB1dCBidWZmZXJzCitpbnQ2NF90IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZmV0Y2hUaW1lc3RhbXBBQUMoc2l6ZV90IHNpemUpIHsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IC0xOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgc2l6ZV90IHNhbXBsZXNpemUgPSBzaXplOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBDSEVDSyghbVJhbmdlSW5mb3MuZW1wdHkoKSk7CisKKyAgICAgICAgUmFuZ2VJbmZvICppbmZvID0gJiptUmFuZ2VJbmZvcy5iZWdpbigpOworCisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgdGltZVVzID0gaW5mby0+bVRpbWVzdGFtcFVzOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmZvLT5tTGVuZ3RoID4gc2l6ZSkgeworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworICAgICAgICAgICAgaW5mby0+bUxlbmd0aCAtPSBzaXplOworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSAxMDI0ICogc2l6ZSAvIHNhbXBsZXNpemU7CisgICAgICAgICAgICBpbmZvLT5tVGltZXN0YW1wVXMgKz0gbnVtU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgLT0gaW5mby0+bUxlbmd0aDsKKworICAgICAgICAgICAgbVJhbmdlSW5mb3MuZXJhc2UobVJhbmdlSW5mb3MuYmVnaW4oKSk7CisgICAgICAgICAgICBpbmZvID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKHRpbWVVcyA9PSAwbGwpIHsKKyAgICAgICAgQUxPR1YoIlJldHVybmluZyAwIHRpbWVzdGFtcCIpOworICAgIH0KKworICAgIHJldHVybiB0aW1lVXM7Cit9CisKIHN0cnVjdCBOQUxQb3NpdGlvbiB7CiAgICAgc2l6ZV90IG5hbE9mZnNldDsKICAgICBzaXplX3QgbmFsU2l6ZTsKQEAgLTc3Niw2ICs4MjEsMTIgQEAKIAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBtQnVmZmVyLT5kYXRhKClbcG9zLm5hbE9mZnNldF0gJiAweDFmOwogCisgICAgICAgICAgICAgICAgaWYgKG5hbFR5cGUgPT0gNikgeworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBzZWkgPSBuZXcgQUJ1ZmZlcihwb3MubmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzZWktPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgcG9zLm5hbE9mZnNldCwgcG9zLm5hbFNpemUpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigic2VpIiwgc2VpKTsKKyAgICAgICAgICAgICAgICB9CisKICNpZiAhTE9HX05ERUJVRwogICAgICAgICAgICAgICAgIGNoYXIgdG1wWzEyOF07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIweCUwMngiLCBuYWxUeXBlKTsKQEAgLTc5NCw3ICs4NDUsOSBAQAogICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBwb3MubmFsU2l6ZSArIDQ7CiAgICAgICAgICAgICB9CiAKKyNpZiAhTE9HX05ERUJVRwogICAgICAgICAgICAgQUxPR1YoImFjY2Vzc1VuaXQgY29udGFpbnMgbmFsIHR5cGVzICVzIiwgb3V0LmNfc3RyKCkpOworI2VuZGlmCiAKICAgICAgICAgICAgIGNvbnN0IE5BTFBvc2l0aW9uICZwb3MgPSBuYWxzLml0ZW1BdChuYWxzLnNpemUoKSAtIDEpOwogICAgICAgICAgICAgc2l6ZV90IG5leHRTY2FuID0gcG9zLm5hbE9mZnNldCArIHBvcy5uYWxTaXplOwpAQCAtMTAyNSw3ICsxMDc4LDcgQEAKIAogICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAKLSAgICAgICAgICAgICAgICBBTE9HVigicmV0dXJuaW5nIE1QRUcgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICBBTE9HVigicmV0dXJuaW5nIE1QRUcgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzKTsKIAogICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpOwpAQCAtMTE4NCw3ICsxMjM3LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgTVBFRzQgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJldHVybmluZyBNUEVHNCB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAppbmRleCBhMmNjYTc3Li43YzgxZmYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaApAQCAtNzcsNiArNzcsNyBAQAogICAgIC8vIGNvbnN1bWUgYSBsb2dpY2FsIChjb21wcmVzc2VkKSBhY2Nlc3MgdW5pdCBvZiBzaXplICJzaXplIiwKICAgICAvLyByZXR1cm5zIGl0cyB0aW1lc3RhbXAgaW4gdXMgKG9yIC0xIGlmIG5vIHRpbWUgaW5mb3JtYXRpb24pLgogICAgIGludDY0X3QgZmV0Y2hUaW1lc3RhbXAoc2l6ZV90IHNpemUpOworICAgIGludDY0X3QgZmV0Y2hUaW1lc3RhbXBBQUMoc2l6ZV90IHNpemUpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRWxlbWVudGFyeVN0cmVhbVF1ZXVlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcAppbmRleCBkZDcxNGM5OS4uODU4NTlmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwCkBAIC0zNiw2ICszNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CkBAIC0xMzAsNyArMTMyLDggQEAKICAgICByZXR1cm4gbmV3IFdyYXBwZWRUcmFjayh0aGlzLCBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpKTsKIH0KIAotc3A8TWV0YURhdGE+IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworc3A8TWV0YURhdGE+IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDA4LDcgKzQxMSw3IEBACiAgICAgICAgICAgICBQVFMgfD0gYnIuZ2V0Qml0cygxNSk7CiAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAlbGx1IiwgUFRTKTsKKyAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAlIiBQUkl1NjQsIFBUUyk7CiAgICAgICAgICAgICAvLyBBTE9HSSgiUFRTID0gJS4yZiBzZWNzIiwgUFRTIC8gOTAwMDAuMGYpOwogCiAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKQEAgLTQyNSw3ICs0MjgsNyBAQAogICAgICAgICAgICAgICAgIERUUyB8PSBici5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJWxsdSIsIERUUyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkRUUyA9ICUiIFBSSXU2NCwgRFRTKTsKIAogICAgICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogICAgICAgICAgICAgfQpAQCAtNDQzLDcgKzQ0Niw3IEBACiAgICAgICAgICAgICBFU0NSIHw9IGJyLmdldEJpdHMoMTUpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOwogCi0gICAgICAgICAgICBBTE9HVigiRVNDUiA9ICVsbHUiLCBFU0NSKTsKKyAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJSIgUFJJdTY0LCBFU0NSKTsKICAgICAgICAgICAgIC8qIHVuc2lnbmVkIEVTQ1JfZXh0ZW5zaW9uID0gKi9ici5nZXRCaXRzKDkpOwogCiAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CkBAIC00NzIsNyArNDc1LDcgQEAKIAogICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IGRhdGFMZW5ndGggKiA4KSB7CiAgICAgICAgICAgICBBTE9HRSgiUEVTIHBhY2tldCBkb2VzIG5vdCBjYXJyeSBlbm91Z2ggZGF0YSB0byBjb250YWluICIKLSAgICAgICAgICAgICAgICAgInBheWxvYWQuIChudW1CaXRzTGVmdCA9ICVkLCByZXF1aXJlZCA9ICVkKSIsCisgICAgICAgICAgICAgICAgICJwYXlsb2FkLiAobnVtQml0c0xlZnQgPSAlenUsIHJlcXVpcmVkID0gJXUpIiwKICAgICAgICAgICAgICAgICAgYnIubnVtQml0c0xlZnQoKSwgZGF0YUxlbmd0aCAqIDgpOwogCiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtNjI1LDcgKzYyOCw3IEBACiAKIHN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjphcHBlbmRQRVNEYXRhKAogICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLAotICAgICAgICB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IERUUywKKyAgICAgICAgdWludDY0X3QgUFRTLCB1aW50NjRfdCAvKiBEVFMgKi8sCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgaWYgKG1RdWV1ZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCmluZGV4IGQ0NDljMzQuLjM1Y2ExMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMTQxLDcgKzE0MSw3IEBACiB9CiAKIHNwPE1ldGFEYXRhPiBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICByZXR1cm4gaW5kZXggPCBtU291cmNlSW1wbHMuc2l6ZSgpCiAgICAgICAgID8gbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLT5nZXRGb3JtYXQoKSA6IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCmluZGV4IGNkOTEyZTcuLmFhYTgzMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCkBAIC0xLDYgKzEsMTAgQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKK2lmZXEgKCQoVEFSR0VUX0RFVklDRSksIG1hbnRhKQorICAgIExPQ0FMX0NGTEFHUyArPSAtRFNVUkZBQ0VfSVNfQkdSMzIKK2VuZGlmCisKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBHcmFwaGljQnVmZmVyU291cmNlLmNwcCAgICAgICBcCiAgICAgICAgIE9NWC5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEwLDYgKzE0LDcgQEAKICAgICAgICAgU29mdE9NWENvbXBvbmVudC5jcHAgICAgICAgICAgXAogICAgICAgICBTb2Z0T01YUGx1Z2luLmNwcCAgICAgICAgICAgICBcCiAgICAgICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIFwKKyAgICAgICAgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgXAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApAQCAtMTgsNiArMjMsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGliaGFyZHdhcmUgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlibG9nICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggNDRmMGJlNy4uM2U3MDk1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNkZWZpbmUgTE9HX1RBRyAiR3JhcGhpY0J1ZmZlclNvdXJjZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDEzICsyOSwxNiBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGJvb2wgRVhUUkFfQ0hFQ0sgPSB0cnVlOwogCiAKIEdyYXBoaWNCdWZmZXJTb3VyY2U6OkdyYXBoaWNCdWZmZXJTb3VyY2UoT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCi0gICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50KSA6CisgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50LAorICAgICAgICBib29sIHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIDoKICAgICBtSW5pdENoZWNrKFVOS05PV05fRVJST1IpLAogICAgIG1Ob2RlSW5zdGFuY2Uobm9kZUluc3RhbmNlKSwKICAgICBtRXhlY3V0aW5nKGZhbHNlKSwKQEAgLTQxLDE2ICs0NiwyMiBAQAogICAgIG1OdW1GcmFtZXNBdmFpbGFibGUoMCksCiAgICAgbUVuZE9mU3RyZWFtKGZhbHNlKSwKICAgICBtRW5kT2ZTdHJlYW1TZW50KGZhbHNlKSwKLSAgICBtUmVwZWF0QWZ0ZXJVcygtMWxsKSwKICAgICBtTWF4VGltZXN0YW1wR2FwVXMoLTFsbCksCiAgICAgbVByZXZPcmlnaW5hbFRpbWVVcygtMWxsKSwKICAgICBtUHJldk1vZGlmaWVkVGltZVVzKC0xbGwpLAorICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMoLTFsbCksCisgICAgbVJlcGVhdEFmdGVyVXMoLTFsbCksCiAgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24oMCksCiAgICAgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcCgtMWxsKSwKICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQoLTEpLAogICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSgwKSwKICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQoMCksCi0gICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkKGZhbHNlKSB7CisgICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkKGZhbHNlKSwKKyAgICBtVGltZVBlckNhcHR1cmVVcygtMWxsKSwKKyAgICBtVGltZVBlckZyYW1lVXMoLTFsbCksCisgICAgbVByZXZDYXB0dXJlVXMoLTFsbCksCisgICAgbVByZXZGcmFtZVVzKC0xbGwpLAorICAgIG1Vc2VHcmFwaGljQnVmZmVySW5NZXRhKHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIHsKIAogICAgIEFMT0dWKCJHcmFwaGljQnVmZmVyU291cmNlIHc9JXUgaD0ldSBjPSV1IiwKICAgICAgICAgICAgIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQsIGJ1ZmZlckNvdW50KTsKQEAgLTYzLDEzICs3NCwxMiBAQAogCiAgICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7CiAKLSAgICBtQnVmZmVyUXVldWUgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBtQnVmZmVyUXVldWUtPnNldENvbnN1bWVyTmFtZShuYW1lKTsKLSAgICBtQnVmZmVyUXVldWUtPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSk7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOworICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpOwogCi0gICAgbUluaXRDaGVjayA9IG1CdWZmZXJRdWV1ZS0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CisgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgQlEgbWF4IGFjcXVpcmVkIGJ1ZmZlciBjb3VudCB0byAldTogJWQiLAogICAgICAgICAgICAgICAgIGJ1ZmZlckNvdW50LCBtSW5pdENoZWNrKTsKQEAgLTgzLDcgKzkzLDcgQEAKICAgICB3cDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOwogICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0gbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOwogCi0gICAgbUluaXRDaGVjayA9IG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkVycm9yIGNvbm5lY3RpbmcgdG8gQnVmZmVyUXVldWU6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1tSW5pdENoZWNrKSwgbUluaXRDaGVjayk7CkBAIC05NSw4ICsxMDUsOCBAQAogCiBHcmFwaGljQnVmZmVyU291cmNlOjp+R3JhcGhpY0J1ZmZlclNvdXJjZSgpIHsKICAgICBBTE9HVigifkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKLSAgICBpZiAobUJ1ZmZlclF1ZXVlICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICBpZiAobUNvbnN1bWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coImNvbnN1bWVyRGlzY29ubmVjdCBmYWlsZWQ6ICVkIiwgZXJyKTsKICAgICAgICAgfQpAQCAtMTA1LDcgKzExNSw3IEBACiAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b214RXhlY3V0aW5nKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgIEFMT0dWKCItLT4gZXhlY3V0aW5nOyBhdmFpbD0lZCwgY29kZWMgdmVjIHNpemU9JXpkIiwKKyAgICBBTE9HVigiLS0+IGV4ZWN1dGluZzsgYXZhaWw9JXp1LCBjb2RlYyB2ZWMgc2l6ZT0lemQiLAogICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSwgbUNvZGVjQnVmZmVycy5zaXplKCkpOwogICAgIENIRUNLKCFtRXhlY3V0aW5nKTsKICAgICBtRXhlY3V0aW5nID0gdHJ1ZTsKQEAgLTEyNyw3ICsxMzcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImRvbmUgbG9hZGluZyBpbml0aWFsIGZyYW1lcywgYXZhaWw9JWQiLCBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKKyAgICBBTE9HVigiZG9uZSBsb2FkaW5nIGluaXRpYWwgZnJhbWVzLCBhdmFpbD0lenUiLCBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKIAogICAgIC8vIElmIEVPUyBoYXMgYWxyZWFkeSBiZWVuIHNpZ25hbGVkLCBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgZnJhbWVzIHRvCiAgICAgLy8gc3VibWl0LCB0cnkgdG8gc2VuZCBFT1Mgbm93IGFzIHdlbGwuCkBAIC0xNzksNyArMTg5LDcgQEAKICAgICAgICAgbUxvb3Blci5jbGVhcigpOwogICAgIH0KIAotICAgIEFMT0dWKCItLT4gbG9hZGVkOyBhdmFpbD0lZCBlb3M9JWQgZW9zU2VudD0lZCIsCisgICAgQUxPR1YoIi0tPiBsb2FkZWQ7IGF2YWlsPSV6dSBlb3M9JWQgZW9zU2VudD0lZCIsCiAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlLCBtRW5kT2ZTdHJlYW0sIG1FbmRPZlN0cmVhbVNlbnQpOwogCiAgICAgLy8gQ29kZWMgaXMgbm8gbG9uZ2VyIGV4ZWN1dGluZy4gIERpc2NhcmQgYWxsIGNvZGVjLXJlbGF0ZWQgc3RhdGUuCkBAIC0yMDAsNyArMjEwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJhZGRDb2RlY0J1ZmZlciBoPSVwIHNpemU9JWx1IHA9JXAiLAorICAgIEFMT0dWKCJhZGRDb2RlY0J1ZmZlciBoPSVwIHNpemU9JSIgUFJJdTMyICIgcD0lcCIsCiAgICAgICAgICAgICBoZWFkZXIsIGhlYWRlci0+bkFsbG9jTGVuLCBoZWFkZXItPnBCdWZmZXIpOwogICAgIENvZGVjQnVmZmVyIGNvZGVjQnVmZmVyOwogICAgIGNvZGVjQnVmZmVyLm1IZWFkZXIgPSBoZWFkZXI7CkBAIC0yMjEsNyArMjMxLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJjb2RlY0J1ZmZlckVtcHRpZWQgaD0lcCBzaXplPSVsdSBmaWxsZWQ9JWx1IHA9JXAiLAorICAgIEFMT0dWKCJjb2RlY0J1ZmZlckVtcHRpZWQgaD0lcCBzaXplPSUiIFBSSXUzMiAiIGZpbGxlZD0lIiBQUkl1MzIgIiBwPSVwIiwKICAgICAgICAgICAgIGhlYWRlciwgaGVhZGVyLT5uQWxsb2NMZW4sIGhlYWRlci0+bkZpbGxlZExlbiwKICAgICAgICAgICAgIGhlYWRlci0+cEJ1ZmZlcik7CiAgICAgQ29kZWNCdWZmZXImIGNvZGVjQnVmZmVyKG1Db2RlY0J1ZmZlcnMuZWRpdEl0ZW1BdChjYmkpKTsKQEAgLTI0NiwxMyArMjU2LDI1IEBACiAgICAgICAgIC8vIFB1bGwgdGhlIGdyYXBoaWMgYnVmZmVyIGhhbmRsZSBiYWNrIG91dCBvZiB0aGUgYnVmZmVyLCBhbmQgY29uZmlybQogICAgICAgICAvLyB0aGF0IGl0IG1hdGNoZXMgZXhwZWN0YXRpb25zLgogICAgICAgICBPTVhfVTgqIGRhdGEgPSBoZWFkZXItPnBCdWZmZXI7Ci0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXJIYW5kbGU7Ci0gICAgICAgIG1lbWNweSgmYnVmZmVySGFuZGxlLCBkYXRhICsgNCwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwotICAgICAgICBpZiAoYnVmZmVySGFuZGxlICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlcidzIGhhbmRsZSBpcyAlcCwgZXhwZWN0ZWQgJXAiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXJIYW5kbGUsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpOwotICAgICAgICAgICAgQ0hFQ0soISJjb2RlY0J1ZmZlckVtcHRpZWQ6IG1pc21hdGNoZWQgYnVmZmVyIik7CisgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSB0eXBlID0gKihNZXRhZGF0YUJ1ZmZlclR5cGUgKilkYXRhOworICAgICAgICBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZmZlckhhbmRsZTsKKyAgICAgICAgICAgIG1lbWNweSgmYnVmZmVySGFuZGxlLCBkYXRhICsgNCwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckhhbmRsZSAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlcidzIGhhbmRsZSBpcyAlcCwgZXhwZWN0ZWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySGFuZGxlLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICBDSEVDSyghImNvZGVjQnVmZmVyRW1wdGllZDogbWlzbWF0Y2hlZCBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyKSB7CisgICAgICAgICAgICBHcmFwaGljQnVmZmVyICpidWZmZXI7CisgICAgICAgICAgICBtZW1jcHkoJmJ1ZmZlciwgZGF0YSArIDQsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgQUxPR0UoImNvZGVjQnVmZmVyRW1wdGllZDogYnVmZmVyIGlzICVwLCBleHBlY3RlZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyghImNvZGVjQnVmZmVyRW1wdGllZDogbWlzbWF0Y2hlZCBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjY4LDcgKzI5MCw3IEBACiAgICAgICAgIGlmIChpZCA9PSBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQpIHsKICAgICAgICAgICAgIENIRUNLX0dUKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudC0tLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpZCwgY29kZWNCdWZmZXIubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGlkLCBjb2RlY0J1ZmZlci5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMjgyLDcgKzMwNCw3IEBACiAgICAgaWYgKG1OdW1GcmFtZXNBdmFpbGFibGUpIHsKICAgICAgICAgLy8gRmlsbCB0aGlzIGNvZGVjIGJ1ZmZlci4KICAgICAgICAgQ0hFQ0soIW1FbmRPZlN0cmVhbVNlbnQpOwotICAgICAgICBBTE9HVigiYnVmZmVyIGZyZWVkLCAlZCBmcmFtZXMgYXZhaWwgKGVvcz0lZCkiLAorICAgICAgICBBTE9HVigiYnVmZmVyIGZyZWVkLCAlenUgZnJhbWVzIGF2YWlsIChlb3M9JWQpIiwKICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlLCBtRW5kT2ZTdHJlYW0pOwogICAgICAgICBmaWxsQ29kZWNCdWZmZXJfbCgpOwogICAgIH0gZWxzZSBpZiAobUVuZE9mU3RyZWFtKSB7CkBAIC0zMTEsNyArMzMzLDggQEAKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1PcmlnaW5hbFRpbWVVcy5pbmRleE9mS2V5KGhlYWRlci0+blRpbWVTdGFtcCk7CiAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiT1VUIHRpbWVzdGFtcDogJWxsZCAtPiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uVGltZVN0YW1wLCBtT3JpZ2luYWxUaW1lVXNbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihoZWFkZXItPm5UaW1lU3RhbXApLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1PcmlnaW5hbFRpbWVVc1tpbmRleF0pKTsKICAgICAgICAgICAgIGhlYWRlci0+blRpbWVTdGFtcCA9IG1PcmlnaW5hbFRpbWVVc1tpbmRleF07CiAgICAgICAgICAgICBtT3JpZ2luYWxUaW1lVXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zMjIsNyArMzQ1LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobU9yaWdpbmFsVGltZVVzLnNpemUoKSA+IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSB7CiAgICAgICAgICAgICAvLyBzb21ldGhpbmcgdGVycmlibHkgd3JvbmcgbXVzdCBoYXZlIGhhcHBlbmVkLCBnaXZpbmcgdXAuLi4KLSAgICAgICAgICAgIEFMT0dFKCJtT3JpZ2luYWxUaW1lVXMgaGFzIHRvbyBtYW55IGVudHJpZXMgKCVkKSIsCisgICAgICAgICAgICBBTE9HRSgibU9yaWdpbmFsVGltZVVzIGhhcyB0b28gbWFueSBlbnRyaWVzICglenUpIiwKICAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsVGltZVVzLnNpemUoKSk7CiAgICAgICAgICAgICBtTWF4VGltZXN0YW1wR2FwVXMgPSAtMWxsOwogICAgICAgICB9CkBAIC0zMzcsNyArMzYwLDcgQEAKIAogICAgICAgICB3aGlsZSAobU51bUZyYW1lc0F2YWlsYWJsZSA+IDApIHsKICAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewogICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4uCkBAIC0zNTAsNyArMzczLDcgQEAKIAogICAgICAgICAgICAgLS1tTnVtRnJhbWVzQXZhaWxhYmxlOwogCi0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBpdGVtLm1GZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwpAQCAtMzc5LDE1ICs0MDIsMTUgQEAKICAgICBpbnQgY2JpID0gZmluZEF2YWlsYWJsZUNvZGVjQnVmZmVyX2woKTsKICAgICBpZiAoY2JpIDwgMCkgewogICAgICAgICAvLyBObyBidWZmZXJzIGF2YWlsYWJsZSwgYmFpbC4KLSAgICAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLCBhdmFpbCBub3cgJWQiLAorICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IG5vIGNvZGVjIGJ1ZmZlcnMsIGF2YWlsIG5vdyAlenUiLAogICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBhY3F1aXJpbmcgYnVmZmVyLCBhdmFpbD0lZCIsCisgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBhY3F1aXJpbmcgYnVmZmVyLCBhdmFpbD0lenUiLAogICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSk7CiAgICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewogICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuCiAgICAgICAgIEFMT0dXKCJmaWxsQ29kZWNCdWZmZXJfbDogZnJhbWUgd2FzIG5vdCBhdmFpbGFibGUiKTsKQEAgLTQxNCwxMCArNDM3LDIxIEBACiAgICAgICAgIG1CdWZmZXJTbG90W2l0ZW0ubUJ1Zl0gPSBpdGVtLm1HcmFwaGljQnVmZmVyOwogICAgIH0KIAotICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0sIGNiaSk7CisgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIC8vIG9ubHkgc3VibWl0IHNhbXBsZSBpZiBzdGFydCB0aW1lIGlzIHVuc3BlY2lmaWVkLCBvciBzYW1wbGUKKyAgICAvLyBpcyBxdWV1ZWQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBzdGFydCB0aW1lCisgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPCAwbGwgfHwgaXRlbS5tVGltZXN0YW1wID49IG1Ta2lwRnJhbWVzQmVmb3JlTnMpIHsKKyAgICAgICAgLy8gaWYgc3RhcnQgdGltZSBpcyBzZXQsIG9mZnNldCB0aW1lIHN0YW1wIGJ5IHN0YXJ0IHRpbWUKKyAgICAgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPiAwKSB7CisgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAgLT0gbVNraXBGcmFtZXNCZWZvcmVOczsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBzdWJtaXRCdWZmZXJfbChpdGVtLCBjYmkpOworICAgIH0KKwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR1YoInN1Ym1pdEJ1ZmZlcl9sIGZhaWxlZCwgcmVsZWFzaW5nIGJxIGJ1ZiAlZCIsIGl0ZW0ubUJ1Zik7Ci0gICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAorICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJidWZmZXIgc3VibWl0dGVkIChicSAlZCwgY2JpICVkKSIsIGl0ZW0ubUJ1ZiwgY2JpKTsKQEAgLTQ0MCw3ICs0NzQsNyBAQAogICAgICAgICAvLwogICAgICAgICAvLyBUbyBiZSBvbiB0aGUgc2FmZSBzaWRlIHdlIHRyeSB0byByZWxlYXNlIHRoZSBidWZmZXIuCiAgICAgICAgIEFMT0dEKCJyZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbDogc2xvdCB3YXMgTlVMTCIpOwotICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoCisgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQsCiAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtLAogICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLApAQCAtNDk0LDcgKzUyOCw3IEBACiAKICAgICBpZiAobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkID49IDApIHsKICAgICAgICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCwKICAgICAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwKQEAgLTUyMCw3ICs1NTQsNyBAQAogCiBzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgIEFMT0dWKCJzaWduYWxFbmRPZklucHV0U3RyZWFtOiBleGVjPSVkIGF2YWlsPSVkIGVvcz0lZCIsCisgICAgQUxPR1YoInNpZ25hbEVuZE9mSW5wdXRTdHJlYW06IGV4ZWM9JWQgYXZhaWw9JXp1IGVvcz0lZCIsCiAgICAgICAgICAgICBtRXhlY3V0aW5nLCBtTnVtRnJhbWVzQXZhaWxhYmxlLCBtRW5kT2ZTdHJlYW0pOwogCiAgICAgaWYgKG1FbmRPZlN0cmVhbSkgewpAQCAtNTQ4LDcgKzU4MiwzMiBAQAogaW50NjRfdCBHcmFwaGljQnVmZmVyU291cmNlOjpnZXRUaW1lc3RhbXAoY29uc3QgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gJml0ZW0pIHsKICAgICBpbnQ2NF90IHRpbWVVcyA9IGl0ZW0ubVRpbWVzdGFtcCAvIDEwMDA7CiAKLSAgICBpZiAobU1heFRpbWVzdGFtcEdhcFVzID4gMGxsKSB7CisgICAgaWYgKG1UaW1lUGVyQ2FwdHVyZVVzID4gMGxsKSB7CisgICAgICAgIC8vIFRpbWUgbGFwc2Ugb3Igc2xvdyBtb3Rpb24gbW9kZQorICAgICAgICBpZiAobVByZXZDYXB0dXJlVXMgPCAwbGwpIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNhcHR1cmUKKyAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gdGltZVVzOworICAgICAgICAgICAgbVByZXZGcmFtZVVzID0gdGltZVVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc25hcCB0byBuZWFyZXN0IGNhcHR1cmUgcG9pbnQKKyAgICAgICAgICAgIGludDY0X3QgbkZyYW1lcyA9ICh0aW1lVXMgKyBtVGltZVBlckNhcHR1cmVVcyAvIDIgLSBtUHJldkNhcHR1cmVVcykKKyAgICAgICAgICAgICAgICAgICAgLyBtVGltZVBlckNhcHR1cmVVczsKKyAgICAgICAgICAgIGlmIChuRnJhbWVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIHRoaXMgZnJhbWUgYXMgaXQncyB0b28gY2xvc2UgdG8gcHJldmlvdXMgY2FwdHVyZQorICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbVByZXZDYXB0dXJlVXMgKyBuRnJhbWVzICogbVRpbWVQZXJDYXB0dXJlVXM7CisgICAgICAgICAgICBtUHJldkZyYW1lVXMgKz0gbVRpbWVQZXJGcmFtZVVzICogbkZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCwgY2FwdHVyZVVzICVsbGQsIGZyYW1lVXMgJWxsZCIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZDYXB0dXJlVXMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZGcmFtZVVzKSk7CisKKyAgICAgICAgcmV0dXJuIG1QcmV2RnJhbWVVczsKKyAgICB9IGVsc2UgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA+IDBsbCkgewogICAgICAgICAvKiBDYXAgdGltZXN0YW1wIGdhcCBiZXR3ZWVuIGFkamFjZW50IGZyYW1lcyB0byBzcGVjaWZpZWQgbWF4CiAgICAgICAgICAqCiAgICAgICAgICAqIEluIHRoZSBzY2VuYXJpbyBvZiBjYXN0IG1pcnJvcmluZywgZW5jb2RpbmcgY291bGQgYmUgc3VzcGVuZGVkIGZvcgpAQCAtNTcyLDcgKzYzMSw5IEBACiAgICAgICAgIG1QcmV2T3JpZ2luYWxUaW1lVXMgPSBvcmlnaW5hbFRpbWVVczsKICAgICAgICAgbVByZXZNb2RpZmllZFRpbWVVcyA9IHRpbWVVczsKICAgICAgICAgbU9yaWdpbmFsVGltZVVzLmFkZCh0aW1lVXMsIG9yaWdpbmFsVGltZVVzKTsKLSAgICAgICAgQUxPR1YoIklOICB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsIG9yaWdpbmFsVGltZVVzLCB0aW1lVXMpOworICAgICAgICBBTE9HVigiSU4gIHRpbWVzdGFtcDogJWxsZCAtPiAlbGxkIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3JpZ2luYWxUaW1lVXMpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKICAgICB9CiAKICAgICByZXR1cm4gdGltZVVzOwpAQCAtNTk1LDEwICs2NTYsMjIgQEAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogaGVhZGVyID0gY29kZWNCdWZmZXIubUhlYWRlcjsKICAgICBDSEVDSyhoZWFkZXItPm5BbGxvY0xlbiA+PSA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwogICAgIE9NWF9VOCogZGF0YSA9IGhlYWRlci0+cEJ1ZmZlcjsKLSAgICBjb25zdCBPTVhfVTMyIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKLSAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZTsKLSAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOwotICAgIG1lbWNweShkYXRhICsgNCwgJmhhbmRsZSwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGU7CisgICAgaWYgKCFtVXNlR3JhcGhpY0J1ZmZlckluTWV0YSkgeworICAgICAgICBjb25zdCBPTVhfVTMyIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKKyAgICAgICAgaGFuZGxlID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZTsKKyAgICAgICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKKyAgICAgICAgbWVtY3B5KGRhdGEgKyA0LCAmaGFuZGxlLCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY29kZWNCdWZmZXIgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIEdyYXBoaWNCdWZmZXIsIHNvCisgICAgICAgIC8vIGl0IGlzIHZhbGlkIHdoaWxlIGl0IGlzIHdpdGggdGhlIE9NWCBjb21wb25lbnQKKyAgICAgICAgY29uc3QgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYXBoaWNCdWZmZXI7CisgICAgICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7CisgICAgICAgIC8vIHBhc3NpbmcgYSBub24tcmVmZXJlbmNlLWNvdW50ZWQgZ3JhcGhpY0J1ZmZlcgorICAgICAgICBHcmFwaGljQnVmZmVyICpidWZmZXIgPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci5nZXQoKTsKKyAgICAgICAgaGFuZGxlID0gYnVmZmVyLT5oYW5kbGU7CisgICAgICAgIG1lbWNweShkYXRhICsgNCwgJmJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IG1Ob2RlSW5zdGFuY2UtPmVtcHR5RGlyZWN0QnVmZmVyKGhlYWRlciwgMCwKICAgICAgICAgICAgIDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSwKQEAgLTY4MCw3ICs3NTMsNyBAQAogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkZyYW1lQXZhaWxhYmxlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwogCi0gICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGUgZXhlYz0lZCBhdmFpbD0lZCIsCisgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGUgZXhlYz0lZCBhdmFpbD0lenUiLAogICAgICAgICAgICAgbUV4ZWN1dGluZywgbU51bUZyYW1lc0F2YWlsYWJsZSk7CiAKICAgICBpZiAobUVuZE9mU3RyZWFtIHx8IG1TdXNwZW5kZWQpIHsKQEAgLTY5NCwxNSArNzY3LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBpdGVtOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHNlZWluZyB0aGlzIGJ1ZmZlciwgYWRkIGl0IHRvIG91cgogICAgICAgICAgICAgLy8gc2xvdCB0YWJsZS4KICAgICAgICAgICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IHNldHRpbmcgbUJ1ZmZlclNsb3QgJWQiLCBpdGVtLm1CdWYpOworICAgICAgICAgICAgICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlOiBzZXR0aW5nIG1CdWZmZXJTbG90ICVkIiwgaXRlbS5tQnVmKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyU2xvdFtpdGVtLm1CdWZdID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIGl0ZW0ubUZlbmNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CkBAIC03MjIsMTMgKzc5NSwxMyBAQAogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkJ1ZmZlcnNSZWxlYXNlZCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCi0gICAgdWludDMyX3Qgc2xvdE1hc2s7Ci0gICAgaWYgKG1CdWZmZXJRdWV1ZS0+Z2V0UmVsZWFzZWRCdWZmZXJzKCZzbG90TWFzaykgIT0gTk9fRVJST1IpIHsKKyAgICB1aW50NjRfdCBzbG90TWFzazsKKyAgICBpZiAobUNvbnN1bWVyLT5nZXRSZWxlYXNlZEJ1ZmZlcnMoJnNsb3RNYXNrKSAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HVygib25CdWZmZXJzUmVsZWFzZWQ6IHVuYWJsZSB0byBnZXQgcmVsZWFzZWQgYnVmZmVyIHNldCIpOwotICAgICAgICBzbG90TWFzayA9IDB4ZmZmZmZmZmY7CisgICAgICAgIHNsb3RNYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOwogICAgIH0KIAotICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDh4Iiwgc2xvdE1hc2spOworICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDE2IiBQUkl4NjQsIHNsb3RNYXNrKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewogICAgICAgICBpZiAoKHNsb3RNYXNrICYgMHgwMSkgIT0gMCkgewpAQCAtNzM4LDYgKzgxMSwxMSBAQAogICAgIH0KIH0KIAorLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgY2FsbGJhY2sKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7CisgICAgQUxPR19BU1NFUlQoZmFsc2UsICJHcmFwaGljQnVmZmVyU291cmNlIGNhbid0IGNvbnN1bWUgc2lkZWJhbmQgc3RyZWFtcyIpOworfQorCiBzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcygKICAgICAgICAgaW50NjRfdCByZXBlYXRBZnRlclVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CkBAIC03NjIsNiArODQwLDI3IEBACiAKICAgICByZXR1cm4gT0s7CiB9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U2tpcEZyYW1lc0JlZm9yZVVzKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0KKyAgICAgICAgICAgIChza2lwRnJhbWVzQmVmb3JlVXMgPiAwKSA/IChza2lwRnJhbWVzQmVmb3JlVXMgKiAxMDAwKSA6IC0xbGw7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFRpbWVMYXBzZVVzKGludDY0X3QqIGRhdGEpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nIHx8IGRhdGFbMF0gPD0gMGxsIHx8IGRhdGFbMV0gPD0gMGxsKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtVGltZVBlckZyYW1lVXMgPSBkYXRhWzBdOworICAgIG1UaW1lUGVyQ2FwdHVyZVVzID0gZGF0YVsxXTsKKworICAgIHJldHVybiBPSzsKK30KKwogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFJlcGVhdExhc3RGcmFtZToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IDNiMGU0NTQuLmMwODYwYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtNDksNyArNDksOCBAQAogY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciB7CiBwdWJsaWM6CiAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZShPTVhOb2RlSW5zdGFuY2UqIG5vZGVJbnN0YW5jZSwKLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50LAorICAgICAgICAgICAgYm9vbCB1c2VHcmFwaGljQnVmZmVySW5NZXRhID0gZmFsc2UpOwogICAgIHZpcnR1YWwgfkdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKIAogICAgIC8vIFdlIGNhbid0IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgZmFpbHMsIHNvIHdlIGp1c3Qgc2V0CkBAIC02MSw3ICs2Miw3IEBACiAgICAgLy8gUmV0dXJucyB0aGUgaGFuZGxlIHRvIHRoZSBwcm9kdWNlciBzaWRlIG9mIHRoZSBCdWZmZXJRdWV1ZS4gIEJ1ZmZlcnMKICAgICAvLyBxdWV1ZWQgb24gdGhpcyB3aWxsIGJlIHJlY2VpdmVkIGJ5IEdyYXBoaWNCdWZmZXJTb3VyY2UuCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1CdWZmZXJRdWV1ZTsKKyAgICAgICAgcmV0dXJuIG1Qcm9kdWNlcjsKICAgICB9CiAKICAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIE9NWCB0cmFuc2l0aW9ucyB0byBPTVhfU3RhdGVFeGVjdXRpbmcsIHdoaWNoIG1lYW5zCkBAIC0xMTgsNiArMTE5LDE3IEBACiAgICAgLy8gb2Ygc3VzcGVuc2lvbiBvbiBpbnB1dC4KICAgICBzdGF0dXNfdCBzZXRNYXhUaW1lc3RhbXBHYXBVcyhpbnQ2NF90IG1heEdhcFVzKTsKIAorICAgIC8vIFNldHMgdGhlIHRpbWUgbGFwc2UgKG9yIHNsb3cgbW90aW9uKSBwYXJhbWV0ZXJzLgorICAgIC8vIGRhdGFbMF0gaXMgdGhlIHRpbWUgKHVzKSBiZXR3ZWVuIHR3byBmcmFtZXMgZm9yIHBsYXliYWNrCisgICAgLy8gZGF0YVsxXSBpcyB0aGUgdGltZSAodXMpIGJldHdlZW4gdHdvIGZyYW1lcyBmb3IgY2FwdHVyZQorICAgIC8vIFdoZW4gc2V0LCB0aGUgc2FtcGxlJ3MgdGltZXN0YW1wIHdpbGwgYmUgbW9kaWZpZWQgdG8gcGxheWJhY2sgZnJhbWVyYXRlLAorICAgIC8vIGFuZCBjYXB0dXJlIHRpbWVzdGFtcCB3aWxsIGJlIG1vZGlmaWVkIHRvIGNhcHR1cmUgcmF0ZS4KKyAgICBzdGF0dXNfdCBzZXRUaW1lTGFwc2VVcyhpbnQ2NF90KiBkYXRhKTsKKworICAgIC8vIFNldHMgdGhlIHN0YXJ0IHRpbWUgdXMgKGluIHN5c3RlbSB0aW1lKSwgc2FtcGxlcyBiZWZvcmUgd2hpY2ggc2hvdWxkCisgICAgLy8gYmUgZHJvcHBlZCBhbmQgbm90IHN1Ym1pdHRlZCB0byBlbmNvZGVyCisgICAgdm9pZCBzZXRTa2lwRnJhbWVzQmVmb3JlVXMoaW50NjRfdCBzdGFydFRpbWVVcyk7CisKIHByb3RlY3RlZDoKICAgICAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UsIGNhbGxlZCB3aGVuIGEgbmV3IGZyYW1lIG9mCiAgICAgLy8gZGF0YSBpcyBhdmFpbGFibGUuICBJZiB3ZSdyZSBleGVjdXRpbmcgYW5kIGEgY29kZWMgYnVmZmVyIGlzCkBAIC0xMzIsNiArMTQ0LDExIEBACiAgICAgLy8gc2V0IG9mIG1CdWZmZXJTbG90IGVudHJpZXMuCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7CiAKKyAgICAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UsIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgaGFzCisgICAgLy8gY2hhbmdlZCB0aGUgc2lkZWJhbmQgc3RyZWFtLiBHcmFwaGljQnVmZmVyU291cmNlIGRvZXNuJ3QgaGFuZGxlIHNpZGViYW5kCisgICAgLy8gc3RyZWFtcyBzbyB0aGlzIGlzIGEgbm8tb3AgKGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkKS4KKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKwogcHJpdmF0ZToKICAgICAvLyBLZWVwIHRyYWNrIG9mIGNvZGVjIGlucHV0IGJ1ZmZlcnMuICBUaGV5IG1heSBlaXRoZXIgYmUgYXZhaWxhYmxlCiAgICAgLy8gKG1HcmFwaGljQnVmZmVyID09IE5VTEwpIG9yIGluIHVzZSBieSB0aGUgY29kZWMuCkBAIC0xOTQsOCArMjExLDExIEBACiAKICAgICBib29sIG1TdXNwZW5kZWQ7CiAKLSAgICAvLyBXZSBjb25zdW1lIGdyYXBoaWMgYnVmZmVycyBmcm9tIHRoaXMuCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKKyAgICAvLyBPdXIgQnVmZmVyUXVldWUgaW50ZXJmYWNlcy4gbVByb2R1Y2VyIGlzIHBhc3NlZCB0byB0aGUgcHJvZHVjZXIgdGhyb3VnaAorICAgIC8vIGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGFuZCBtQ29uc3VtZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJldHJpZXZlCisgICAgLy8gdGhlIGJ1ZmZlcnMgcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOwogCiAgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBwZW5kaW5nIGluIEJ1ZmZlclF1ZXVlIHRoYXQgaGF2ZW4ndCB5ZXQgYmVlbgogICAgIC8vIGZvcndhcmRlZCB0byB0aGUgY29kZWMuCkBAIC0yMjMsMTYgKzI0MywxNyBAQAogICAgIGVudW0gewogICAgICAgICBrUmVwZWF0TGFzdEZyYW1lQ291bnQgPSAxMCwKICAgICB9OwotICAgIGludDY0X3QgbVJlcGVhdEFmdGVyVXM7Ci0gICAgaW50NjRfdCBtTWF4VGltZXN0YW1wR2FwVXM7CiAKICAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBpbnQ2NF90PiBtT3JpZ2luYWxUaW1lVXM7CisgICAgaW50NjRfdCBtTWF4VGltZXN0YW1wR2FwVXM7CiAgICAgaW50NjRfdCBtUHJldk9yaWdpbmFsVGltZVVzOwogICAgIGludDY0X3QgbVByZXZNb2RpZmllZFRpbWVVczsKKyAgICBpbnQ2NF90IG1Ta2lwRnJhbWVzQmVmb3JlTnM7CiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+ID4gbVJlZmxlY3RvcjsKIAorICAgIGludDY0X3QgbVJlcGVhdEFmdGVyVXM7CiAgICAgaW50MzJfdCBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbjsKICAgICBpbnQ2NF90IG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXA7CiAgICAgaW50MzJfdCBtUmVwZWF0TGFzdEZyYW1lQ291bnQ7CkBAIC0yNDUsNiArMjY2LDE0IEBACiAgICAgLy8gbm8gY29kZWMgYnVmZmVyIHdhcyBhdmFpbGFibGUgYXQgdGhlIHRpbWUuCiAgICAgYm9vbCBtUmVwZWF0QnVmZmVyRGVmZXJyZWQ7CiAKKyAgICAvLyBUaW1lIGxhcHNlIC8gc2xvdyBtb3Rpb24gY29uZmlndXJhdGlvbgorICAgIGludDY0X3QgbVRpbWVQZXJDYXB0dXJlVXM7CisgICAgaW50NjRfdCBtVGltZVBlckZyYW1lVXM7CisgICAgaW50NjRfdCBtUHJldkNhcHR1cmVVczsKKyAgICBpbnQ2NF90IG1QcmV2RnJhbWVVczsKKworICAgIGJvb2wgbVVzZUdyYXBoaWNCdWZmZXJJbk1ldGE7CisKICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdyYXBoaWNCdWZmZXJTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCA0MTU5MTBhLi4xMWIwZDZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMTkwLDcgKzE5Miw3IEBACiAgICAgcmV0dXJuIChpbnN0YW5jZSA9PSBOVUxMID8gZmFsc2UgOiBpbnN0YW5jZS0+aXNTZWN1cmUoKSk7CiB9CiAKLWJvb2wgT01YOjpsaXZlc0xvY2FsbHkobm9kZV9pZCBub2RlLCBwaWRfdCBwaWQpIHsKK2Jvb2wgT01YOjpsaXZlc0xvY2FsbHkobm9kZV9pZCAvKiBub2RlICovLCBwaWRfdCBwaWQpIHsKICAgICByZXR1cm4gcGlkID09IGdldHBpZCgpOwogfQogCkBAIC0yMzYsNyArMjM4LDcgQEAKICAgICAgICAgICAgIGluc3RhbmNlLCAmaGFuZGxlKTsKIAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBBTE9HVigiRkFJTEVEIHRvIGFsbG9jYXRlIG9teCBjb21wb25lbnQgJyVzJyIsIG5hbWUpOworICAgICAgICBBTE9HRSgiRkFJTEVEIHRvIGFsbG9jYXRlIG9teCBjb21wb25lbnQgJyVzJyIsIG5hbWUpOwogCiAgICAgICAgIGluc3RhbmNlLT5vbkdldEhhbmRsZUZhaWxlZCgpOwogCkBAIC0yOTAsNiArMjkyLDcgQEAKIHN0YXR1c190IE9NWDo6Z2V0UGFyYW1ldGVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTkRFWFRZUEUgaW5kZXgsCiAgICAgICAgIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiZ2V0UGFyYW1ldGVyKCV1ICUjeCAlcCAlemQpIiwgbm9kZSwgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiB9CkBAIC0yOTcsNiArMzAwLDcgQEAKIHN0YXR1c190IE9NWDo6c2V0UGFyYW1ldGVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTkRFWFRZUEUgaW5kZXgsCiAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigic2V0UGFyYW1ldGVyKCV1ICUjeCAlcCAlemQpIiwgbm9kZSwgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiB9CkBAIC0zNDMsNiArMzQ3LDEzIEBACiAgICAgICAgICAgICBwb3J0SW5kZXgsIGVuYWJsZSwgbWF4RnJhbWVXaWR0aCwgbWF4RnJhbWVIZWlnaHQpOwogfQogCitzdGF0dXNfdCBPTVg6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKSB7CisgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgcG9ydEluZGV4LCB0dW5uZWxlZCwgYXVkaW9Id1N5bmMsIHNpZGViYW5kSGFuZGxlKTsKK30KKwogc3RhdHVzX3QgT01YOjp1c2VCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgewpAQCAtNDI5LDggKzQ0MCw4IEBACiAgICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKICAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLAogICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTIsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpIHsKLSAgICBBTE9HVigiT25FdmVudCglZCwgJWxkLCAlbGQpIiwgZUV2ZW50LCBuRGF0YTEsIG5EYXRhMik7CisgICAgICAgIE9NWF9JTiBPTVhfUFRSIC8qIHBFdmVudERhdGEgKi8pIHsKKyAgICBBTE9HVigiT25FdmVudCglZCwgJSIgUFJJdTMyIiwgJSIgUFJJdTMyICIpIiwgZUV2ZW50LCBuRGF0YTEsIG5EYXRhMik7CiAKICAgICAvLyBGb3J3YXJkIHRvIE9NWE5vZGVJbnN0YW5jZS4KICAgICBmaW5kSW5zdGFuY2Uobm9kZSktPm9uRXZlbnQoZUV2ZW50LCBuRGF0YTEsIG5EYXRhMik7CkBAIC00NDgsMTMgKzQ1OSwxMyBAQAogfQogCiBPTVhfRVJST1JUWVBFIE9NWDo6T25FbXB0eUJ1ZmZlckRvbmUoCi0gICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CisgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CiAgICAgQUxPR1YoIk9uRW1wdHlCdWZmZXJEb25lIGJ1ZmZlcj0lcCIsIHBCdWZmZXIpOwogCiAgICAgb214X21lc3NhZ2UgbXNnOwogICAgIG1zZy50eXBlID0gb214X21lc3NhZ2U6OkVNUFRZX0JVRkZFUl9ET05FOwogICAgIG1zZy5ub2RlID0gbm9kZTsKLSAgICBtc2cudS5idWZmZXJfZGF0YS5idWZmZXIgPSBwQnVmZmVyOworICAgIG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciA9IGJ1ZmZlcjsKIAogICAgIGZpbmREaXNwYXRjaGVyKG5vZGUpLT5wb3N0KG1zZyk7CiAKQEAgLTQ2MiwxOSArNDczLDE3IEBACiB9CiAKIE9NWF9FUlJPUlRZUEUgT01YOjpPbkZpbGxCdWZmZXJEb25lKAotICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcikgeworICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcikgewogICAgIEFMT0dWKCJPbkZpbGxCdWZmZXJEb25lIGJ1ZmZlcj0lcCIsIHBCdWZmZXIpOwogCiAgICAgb214X21lc3NhZ2UgbXNnOwogICAgIG1zZy50eXBlID0gb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkU7CiAgICAgbXNnLm5vZGUgPSBub2RlOwotICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciA9IHBCdWZmZXI7CisgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyID0gYnVmZmVyOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX29mZnNldCA9IHBCdWZmZXItPm5PZmZzZXQ7CiAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2VfbGVuZ3RoID0gcEJ1ZmZlci0+bkZpbGxlZExlbjsKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5mbGFncyA9IHBCdWZmZXItPm5GbGFnczsKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXAgPSBwQnVmZmVyLT5uVGltZVN0YW1wOwotICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnBsYXRmb3JtX3ByaXZhdGUgPSBwQnVmZmVyLT5wUGxhdGZvcm1Qcml2YXRlOwotICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmRhdGFfcHRyID0gcEJ1ZmZlci0+cEJ1ZmZlcjsKIAogICAgIGZpbmREaXNwYXRjaGVyKG5vZGUpLT5wb3N0KG1zZyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKaW5kZXggNmI2ZDBhYi4uYWUzY2IzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vTW9yZSkgewotICAgICAgICBBTE9HRSgiT01YIHBsdWdpbiBmYWlsZWQgdy8gZXJyb3IgMHglMDh4IGFmdGVyIHJlZ2lzdGVyaW5nICVkICIKKyAgICAgICAgQUxPR0UoIk9NWCBwbHVnaW4gZmFpbGVkIHcvIGVycm9yIDB4JTA4eCBhZnRlciByZWdpc3RlcmluZyAlenUgIgogICAgICAgICAgICAgICJjb21wb25lbnRzIiwgZXJyLCBtUGx1Z2luQnlDb21wb25lbnROYW1lLnNpemUoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCA1NzdlODA0Li5jYzcwYjY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtOTIsMTAgKzkyLDEyIEBACiBPTVhOb2RlSW5zdGFuY2U6Ok9NWE5vZGVJbnN0YW5jZSgKICAgICAgICAgT01YICpvd25lciwgY29uc3Qgc3A8SU9NWE9ic2VydmVyPiAmb2JzZXJ2ZXIsIGNvbnN0IGNoYXIgKm5hbWUpCiAgICAgOiBtT3duZXIob3duZXIpLAotICAgICAgbU5vZGVJRChOVUxMKSwKKyAgICAgIG1Ob2RlSUQoMCksCiAgICAgICBtSGFuZGxlKE5VTEwpLAogICAgICAgbU9ic2VydmVyKG9ic2VydmVyKSwKLSAgICAgIG1EeWluZyhmYWxzZSkgeworICAgICAgbUR5aW5nKGZhbHNlKSwKKyAgICAgIG1CdWZmZXJJRENvdW50KDApCit7CiAgICAgbUlzU2VjdXJlID0gQVN0cmluZyhuYW1lKS5lbmRzV2l0aCgiLnNlY3VyZSIpOwogfQogCkBAIC0xNDYsNiArMTQ4LDExIEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmZyZWVOb2RlKE9NWE1hc3RlciAqbWFzdGVyKSB7CiAgICAgc3RhdGljIGludDMyX3Qga01heE51bUl0ZXJhdGlvbnMgPSAxMDsKIAorICAgIC8vIGV4aXQgaWYgd2UgaGF2ZSBhbHJlYWR5IGZyZWVkIHRoZSBub2RlCisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgLy8gVHJhbnNpdGlvbiB0aGUgbm9kZSBmcm9tIGl0cyBjdXJyZW50IHN0YXRlIGFsbCB0aGUgd2F5IGRvd24KICAgICAvLyB0byAiTG9hZGVkIi4KICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgYWN0aXZlIGJ1ZmZlcnMgYXJlIHByb3Blcmx5IGZyZWVkIGV2ZW4KQEAgLTIzMyw3ICsyNDAsNyBAQAogICAgIH0KIAogICAgIG1Pd25lci0+aW52YWxpZGF0ZU5vZGVJRChtTm9kZUlEKTsKLSAgICBtTm9kZUlEID0gTlVMTDsKKyAgICBtTm9kZUlEID0gMDsKIAogICAgIEFMT0dWKCJPTVhOb2RlSW5zdGFuY2UgZ29pbmcgYXdheS4iKTsKICAgICBkZWxldGUgdGhpczsKQEAgLTI2NywyNiArMjc0LDI2IEBACiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Z2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCBwYXJhbXMpOwotCisgICAgQUxPR0VfSUYoZXJyICE9IE9NWF9FcnJvck5vbmUsICJnZXRQYXJhbWV0ZXIoJWQpIEVSUk9SOiAlI3giLCBpbmRleCwgZXJyKTsKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgbUhhbmRsZSwgaW5kZXgsIGNvbnN0X2Nhc3Q8dm9pZCAqPihwYXJhbXMpKTsKLQorICAgIEFMT0dFX0lGKGVyciAhPSBPTVhfRXJyb3JOb25lLCAic2V0UGFyYW1ldGVyKCVkKSBFUlJPUjogJSN4IiwgaW5kZXgsIGVycik7CiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmdldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCAvKiBzaXplICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldENvbmZpZyhtSGFuZGxlLCBpbmRleCwgcGFyYW1zKTsKQEAgLTI5NCw3ICszMDEsNyBAQAogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCAvKiBzaXplICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX1NldENvbmZpZygKQEAgLTM5MCwyMCArMzk3LDM5IEBACiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAogICAgICAgICBPTVhfQk9PTCBlbmFibGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2wocG9ydEluZGV4LCBlbmFibGUpOworICAgIHJldHVybiBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCisgICAgICAgICAgICBwb3J0SW5kZXgsIGVuYWJsZSwKKyAgICAgICAgICAgIE9NWF9GQUxTRSAvKiB1c2VHcmFwaGljQnVmZmVyICovLCBOVUxMIC8qIHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgKi8pOwogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbCgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCi0gICAgICAgIE9NWF9CT09MIGVuYWJsZSkgeworICAgICAgICBPTVhfQk9PTCBlbmFibGUsCisgICAgICAgIE9NWF9CT09MIHVzZUdyYXBoaWNCdWZmZXIsCisgICAgICAgIE9NWF9CT09MICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhKSB7CiAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKICAgICBPTVhfU1RSSU5HIG5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAogICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIik7CiAKLSAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgIE9NWF9TVFJJTkcgZ3JhcGhpY0J1ZmZlck5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAorICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUdyYXBoaWNCdWZmZXJJbk1ldGFEYXRhIik7CisgICAgaWYgKHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICB1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gJnVzZUdyYXBoaWNCdWZmZXI7CisgICAgfQorCisgICAgT01YX0VSUk9SVFlQRSBlcnIgPQorICAgICAgICAodXNlR3JhcGhpY0J1ZmZlciAmJiBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KQorICAgICAgICAgICAgICAgID8gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIGdyYXBoaWNCdWZmZXJOYW1lLCAmaW5kZXgpCisgICAgICAgICAgICAgICAgOiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gT01YX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgIH0KKwogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICBBTE9HRSgiT01YX0dldEV4dGVuc2lvbkluZGV4ICVzIGZhaWxlZCIsIG5hbWUpOwotCiAgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKICAgICB9CiAKQEAgLTQxOCw2ICs0NDQsNyBAQAogICAgIHBhcmFtcy5iU3RvcmVNZXRhRGF0YSA9IGVuYWJsZTsKICAgICBpZiAoKGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZwYXJhbXMpKSAhPSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgIEFMT0dFKCJPTVhfU2V0UGFyYW1ldGVyKCkgZmFpbGVkIGZvciBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzOiAweCUwOHgiLCBlcnIpOworICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9GQUxTRTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogICAgIHJldHVybiBlcnI7CkBAIC00NTcsNiArNDg0LDQ5IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwgT01YX1UzMiBhdWRpb0h3U3luYywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworCisgICAgT01YX0lOREVYVFlQRSBpbmRleDsKKyAgICBPTVhfU1RSSU5HIG5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAorICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUiKTsKKworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIG5hbWUsICZpbmRleCk7CisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUgZXh0ZW5zaW9uIGlzIG1pc3NpbmchIik7CisgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKKyAgICB9CisKKyAgICBDb25maWd1cmVWaWRlb1R1bm5lbE1vZGVQYXJhbXMgdHVubmVsUGFyYW1zOworICAgIHR1bm5lbFBhcmFtcy5uU2l6ZSA9IHNpemVvZih0dW5uZWxQYXJhbXMpOworICAgIHR1bm5lbFBhcmFtcy5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHR1bm5lbFBhcmFtcy5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHR1bm5lbFBhcmFtcy5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgdHVubmVsUGFyYW1zLm5WZXJzaW9uLnMublN0ZXAgPSAwOworCisgICAgdHVubmVsUGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisgICAgdHVubmVsUGFyYW1zLmJUdW5uZWxlZCA9IHR1bm5lbGVkOworICAgIHR1bm5lbFBhcmFtcy5uQXVkaW9Id1N5bmMgPSBhdWRpb0h3U3luYzsKKyAgICBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmdHVubmVsUGFyYW1zKTsKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSBmYWlsZWQhIChlcnIgJWQpLiIsIGVycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGVyciA9IE9NWF9HZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZ0dW5uZWxQYXJhbXMpOworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBBTE9HRSgiR2V0VmlkZW9UdW5uZWxXaW5kb3cgZmFpbGVkISAoZXJyICVkKS4iLCBlcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKHNpZGViYW5kSGFuZGxlKSB7CisgICAgICAgICpzaWRlYmFuZEhhbmRsZSA9IChuYXRpdmVfaGFuZGxlX3QqKXR1bm5lbFBhcmFtcy5wU2lkZWJhbmRXaW5kb3c7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1c2VCdWZmZXIoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKSB7CkBAIC00ODMsNyArNTUzLDcgQEAKIAogICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlcl9tZXRhKTsKIAotICAgICpidWZmZXIgPSBoZWFkZXI7CisgICAgKmJ1ZmZlciA9IG1ha2VCdWZmZXJJRChoZWFkZXIpOwogCiAgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CiAKQEAgLTUzOSw3ICs2MDksNyBAQAogICAgIENIRUNLX0VRKGhlYWRlci0+cEJ1ZmZlciwgYnVmZmVySGFuZGxlKTsKICAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJNZXRhKTsKIAotICAgICpidWZmZXIgPSBoZWFkZXI7CisgICAgKmJ1ZmZlciA9IG1ha2VCdWZmZXJJRChoZWFkZXIpOwogCiAgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CiAKQEAgLTYwMyw3ICs2NzMsNyBAQAogCiAgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyTWV0YSk7CiAKLSAgICAqYnVmZmVyID0gaGVhZGVyOworICAgICpidWZmZXIgPSBtYWtlQnVmZmVySUQoaGVhZGVyKTsKIAogICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOwogCkBAIC02MTEsMTEgKzY4MSwxMSBAQAogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEoCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlciwKKyAgICAgICAgT01YX1UzMiAvKiBwb3J0SW5kZXggKi8sIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKShidWZmZXIpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBmaW5kQnVmZmVySGVhZGVyKGJ1ZmZlcik7CiAgICAgVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEgKm1ldGFkYXRhID0KICAgICAgICAgKFZpZGVvRGVjb2Rlck91dHB1dE1ldGFEYXRhICopKGhlYWRlci0+cEJ1ZmZlcik7CiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyTWV0YSA9IChCdWZmZXJNZXRhICopKGhlYWRlci0+cEFwcFByaXZhdGUpOwpAQCAtNjM3LDcgKzcwNywxMCBAQAogICAgIH0KIAogICAgIC8vIElucHV0IGJ1ZmZlcnMgd2lsbCBob2xkIG1ldGEtZGF0YSAoZ3JhbGxvYyByZWZlcmVuY2VzKS4KLSAgICBlcnIgPSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2wocG9ydEluZGV4LCBPTVhfVFJVRSk7CisgICAgT01YX0JPT0wgdXNpbmdHcmFwaGljQnVmZmVyID0gT01YX0ZBTFNFOworICAgIGVyciA9IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbCgKKyAgICAgICAgICAgIHBvcnRJbmRleCwgT01YX1RSVUUsCisgICAgICAgICAgICBPTVhfVFJVRSAvKiB1c2VHcmFwaGljQnVmZmVyICovLCAmdXNpbmdHcmFwaGljQnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtNjYzLDcgKzczNiw3IEBACiAKICAgICBHcmFwaGljQnVmZmVyU291cmNlKiBidWZmZXJTb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgKICAgICAgICAgICAgIHRoaXMsIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7CisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCB1c2luZ0dyYXBoaWNCdWZmZXIpOwogICAgIGlmICgoZXJyID0gYnVmZmVyU291cmNlLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKICAgICAgICAgZGVsZXRlIGJ1ZmZlclNvdXJjZTsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTcxMSw3ICs3ODQsNyBAQAogCiAgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyX21ldGEpOwogCi0gICAgKmJ1ZmZlciA9IGhlYWRlcjsKKyAgICAqYnVmZmVyID0gbWFrZUJ1ZmZlcklEKGhlYWRlcik7CiAgICAgKmJ1ZmZlcl9kYXRhID0gaGVhZGVyLT5wQnVmZmVyOwogCiAgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CkBAIC03NDksNyArODIyLDcgQEAKIAogICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlcl9tZXRhKTsKIAotICAgICpidWZmZXIgPSBoZWFkZXI7CisgICAgKmJ1ZmZlciA9IG1ha2VCdWZmZXJJRChoZWFkZXIpOwogCiAgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CiAKQEAgLTc2NywxMyArODQwLDE0IEBACiAKICAgICByZW1vdmVBY3RpdmVCdWZmZXIocG9ydEluZGV4LCBidWZmZXIpOwogCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKWJ1ZmZlcjsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIpOwogICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0gc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihoZWFkZXItPnBBcHBQcml2YXRlKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0ZyZWVCdWZmZXIobUhhbmRsZSwgcG9ydEluZGV4LCBoZWFkZXIpOwogCiAgICAgZGVsZXRlIGJ1ZmZlcl9tZXRhOwogICAgIGJ1ZmZlcl9tZXRhID0gTlVMTDsKKyAgICBpbnZhbGlkYXRlQnVmZmVySUQoYnVmZmVyKTsKIAogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKIH0KQEAgLTc4MSw3ICs4NTUsNyBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpmaWxsQnVmZmVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmZmVyOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBmaW5kQnVmZmVySGVhZGVyKGJ1ZmZlcik7CiAgICAgaGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKICAgICBoZWFkZXItPm5PZmZzZXQgPSAwOwogICAgIGhlYWRlci0+bkZsYWdzID0gMDsKQEAgLTc5Nyw3ICs4NzEsNyBAQAogICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilidWZmZXI7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyKTsKICAgICAvLyByYW5nZUxlbmd0aCBhbmQgcmFuZ2VPZmZzZXQgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgYWxsb2NhdGVkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KICAgICAvLyBjb3JuZXIgY2FzZTogd2UgcGVybWl0IHJhbmdlT2Zmc2V0ID09IGVuZC1vZi1idWZmZXIgd2l0aCByYW5nZUxlbmd0aCA9PSAwLgogICAgIGlmIChyYW5nZU9mZnNldCA+IGhlYWRlci0+bkFsbG9jTGVuCkBAIC04NTcsNiArOTMxLDggQEAKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fU1VTUEVORDoKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0RFTEFZOgogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfVElNRVNUQU1QX0dBUDoKKyAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRToKKyAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSA9CiAgICAgICAgICAgICAgICAgZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwpAQCAtODgxLDcgKzk1Nyw4IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gKihpbnQ2NF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXJTb3VyY2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKGRlbGF5VXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PQorICAgICAgICAgICAgICAgICAgICBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVApewogICAgICAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihpbnQ2NF90KSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgfQpAQCAtODg5LDYgKzk2NiwyMCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgbWF4R2FwVXMgPSAqKGludDY0X3QgKilkYXRhOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclNvdXJjZS0+c2V0TWF4VGltZXN0YW1wR2FwVXMobWF4R2FwVXMpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcyA9ICooaW50NjRfdCAqKWRhdGE7CisKKyAgICAgICAgICAgICAgICBidWZmZXJTb3VyY2UtPnNldFNraXBGcmFtZXNCZWZvcmVVcyhza2lwRnJhbWVzQmVmb3JlVXMpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gSU9NWDo6SU5URVJOQUxfT1BUSU9OX1RJTUVfTEFQU0UKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoaW50NjRfdCkgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWZmZXJTb3VyY2UtPnNldFRpbWVMYXBzZVVzKChpbnQ2NF90ICopZGF0YSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTkwNCw4ICs5OTUsNyBAQAogCiAgICAgaWYgKG1zZy50eXBlID09IG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FKSB7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX0JVRkZFUkhFQURFUlRZUEUgKj4oCi0gICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcik7CisgICAgICAgICAgICBmaW5kQnVmZmVySGVhZGVyKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcik7CiAKICAgICAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPQogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihidWZmZXItPnBBcHBQcml2YXRlKTsKQEAgLTkzMCw4ICsxMDIwLDcgQEAKICAgICAgICAgICAgIC8vIGJlIHZlcnkgY29uZnVzZWQuCiAKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE9NWF9CVUZGRVJIRUFERVJUWVBFICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBmaW5kQnVmZmVySGVhZGVyKG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlcik7CiAKICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+Y29kZWNCdWZmZXJFbXB0aWVkKGJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm47CkBAIC05NjgsNyArMTA1Nyw3IEBACiAKIC8vIHN0YXRpYwogT01YX0VSUk9SVFlQRSBPTVhOb2RlSW5zdGFuY2U6Ok9uRXZlbnQoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgLyogaENvbXBvbmVudCAqLywKICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCiAgICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKICAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLApAQCAtOTg0LDI2ICsxMDczLDI4IEBACiAKIC8vIHN0YXRpYwogT01YX0VSUk9SVFlQRSBPTVhOb2RlSW5zdGFuY2U6Ok9uRW1wdHlCdWZmZXJEb25lKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIC8qIGhDb21wb25lbnQgKi8sCiAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAogICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpIHsKICAgICBPTVhOb2RlSW5zdGFuY2UgKmluc3RhbmNlID0gc3RhdGljX2Nhc3Q8T01YTm9kZUluc3RhbmNlICo+KHBBcHBEYXRhKTsKICAgICBpZiAoaW5zdGFuY2UtPm1EeWluZykgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlLT5vd25lcigpLT5PbkVtcHR5QnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksIHBCdWZmZXIpOworICAgIHJldHVybiBpbnN0YW5jZS0+b3duZXIoKS0+T25FbXB0eUJ1ZmZlckRvbmUoaW5zdGFuY2UtPm5vZGVJRCgpLAorICAgICAgICAgICAgaW5zdGFuY2UtPmZpbmRCdWZmZXJJRChwQnVmZmVyKSwgcEJ1ZmZlcik7CiB9CiAKIC8vIHN0YXRpYwogT01YX0VSUk9SVFlQRSBPTVhOb2RlSW5zdGFuY2U6Ok9uRmlsbEJ1ZmZlckRvbmUoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgLyogaENvbXBvbmVudCAqLywKICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCiAgICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcikgewogICAgIE9NWE5vZGVJbnN0YW5jZSAqaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxPTVhOb2RlSW5zdGFuY2UgKj4ocEFwcERhdGEpOwogICAgIGlmIChpbnN0YW5jZS0+bUR5aW5nKSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2UtPm93bmVyKCktPk9uRmlsbEJ1ZmZlckRvbmUoaW5zdGFuY2UtPm5vZGVJRCgpLCBwQnVmZmVyKTsKKyAgICByZXR1cm4gaW5zdGFuY2UtPm93bmVyKCktPk9uRmlsbEJ1ZmZlckRvbmUoaW5zdGFuY2UtPm5vZGVJRCgpLAorICAgICAgICAgICAgaW5zdGFuY2UtPmZpbmRCdWZmZXJJRChwQnVmZmVyKSwgcEJ1ZmZlcik7CiB9CiAKIHZvaWQgT01YTm9kZUluc3RhbmNlOjphZGRBY3RpdmVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIE9NWDo6YnVmZmVyX2lkIGlkKSB7CkBAIC0xMDM4LDQgKzExMjksNDYgQEAKICAgICB9CiB9CiAKK09NWDo6YnVmZmVyX2lkIE9NWE5vZGVJbnN0YW5jZTo6bWFrZUJ1ZmZlcklEKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZWFkZXIpIHsKKyAgICBpZiAoYnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKKyAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXI7CisgICAgZG8geyAvLyBoYW5kbGUgdGhlIHZlcnkgdW5saWtlbHkgY2FzZSBvZiBJRCBvdmVyZmxvdworICAgICAgICBpZiAoKyttQnVmZmVySURDb3VudCA9PSAwKSB7CisgICAgICAgICAgICsrbUJ1ZmZlcklEQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyID0gKE9NWDo6YnVmZmVyX2lkKW1CdWZmZXJJRENvdW50OworICAgIH0gd2hpbGUgKG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLmluZGV4T2ZLZXkoYnVmZmVyKSA+PSAwKTsKKyAgICBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5hZGQoYnVmZmVyLCBidWZmZXJIZWFkZXIpOworICAgIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELmFkZChidWZmZXJIZWFkZXIsIGJ1ZmZlcik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworT01YX0JVRkZFUkhFQURFUlRZUEUgKk9NWE5vZGVJbnN0YW5jZTo6ZmluZEJ1ZmZlckhlYWRlcihPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKKyAgICByZXR1cm4gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIudmFsdWVGb3IoYnVmZmVyKTsKK30KKworT01YOjpidWZmZXJfaWQgT01YTm9kZUluc3RhbmNlOjpmaW5kQnVmZmVySUQoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlckhlYWRlcikgeworICAgIGlmIChidWZmZXJIZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOworICAgIHJldHVybiBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC52YWx1ZUZvcihidWZmZXJIZWFkZXIpOworfQorCit2b2lkIE9NWE5vZGVJbnN0YW5jZTo6aW52YWxpZGF0ZUJ1ZmZlcklEKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgeworICAgIGlmIChidWZmZXIgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKKyAgICBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC5yZW1vdmVJdGVtKG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnZhbHVlRm9yKGJ1ZmZlcikpOworICAgIG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnJlbW92ZUl0ZW0oYnVmZmVyKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCBiMWMzNGRjLi42NDZjZDMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCkBAIC0yNTcsNjkgKzI1Nyw2OSBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZW5kQ29tbWFuZCgKLSAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1UzMiBwYXJhbSwgT01YX1BUUiBkYXRhKSB7CisgICAgICAgIE9NWF9DT01NQU5EVFlQRSAvKiBjbWQgKi8sIE9NWF9VMzIgLyogcGFyYW0gKi8sIE9NWF9QVFIgLyogZGF0YSAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgICAgICBPTVhfSU5ERVhUWVBFIC8qIGluZGV4ICovLCBPTVhfUFRSIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6c2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgICAgICBPTVhfSU5ERVhUWVBFIC8qIGluZGV4ICovLCBjb25zdCBPTVhfUFRSIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgICAgICBPTVhfSU5ERVhUWVBFIC8qIGluZGV4ICovLCBPTVhfUFRSIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgICAgICBPTVhfSU5ERVhUWVBFIC8qIGluZGV4ICovLCBjb25zdCBPTVhfUFRSIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKiAvKiBuYW1lICovLCBPTVhfSU5ERVhUWVBFICogLyogaW5kZXggKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCi0gICAgICAgIE9NWF9VMzIgc2l6ZSwKLSAgICAgICAgT01YX1U4ICpwdHIpIHsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiogLyogYnVmZmVyICovLAorICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLywKKyAgICAgICAgT01YX1BUUiAvKiBhcHBQcml2YXRlICovLAorICAgICAgICBPTVhfVTMyIC8qIHNpemUgKi8sCisgICAgICAgIE9NWF9VOCAqIC8qIHB0ciAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6YWxsb2NhdGVCdWZmZXIoCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKLSAgICAgICAgT01YX1BUUiBhcHBQcml2YXRlLAotICAgICAgICBPTVhfVTMyIHNpemUpIHsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiogLyogYnVmZmVyICovLAorICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLywKKyAgICAgICAgT01YX1BUUiAvKiBhcHBQcml2YXRlICovLAorICAgICAgICBPTVhfVTMyIC8qIHNpemUgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmZyZWVCdWZmZXIoCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgICAgIE9NWF9VMzIgLyogcG9ydEluZGV4ICovLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqIC8qIGJ1ZmZlciAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6ZW1wdHlUaGlzQnVmZmVyKAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICogLyogYnVmZmVyICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpmaWxsVGhpc0J1ZmZlcigKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqIC8qIGJ1ZmZlciAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0U3RhdGUoT01YX1NUQVRFVFlQRSAqc3RhdGUpIHsKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0U3RhdGUoT01YX1NUQVRFVFlQRSAqIC8qIHN0YXRlICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCmluZGV4IGQ2Y2RlNzMuLjliNjk1OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTQyLDYgKzQyLDcgQEAKICAgICB7ICJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiLCAiYW1yd2JlbmMiLCAiYXVkaW9fZW5jb2Rlci5hbXJ3YiIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIsICJoMjY0ZGVjIiwgInZpZGVvX2RlY29kZXIuYXZjIiB9LAogICAgIHsgIk9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiwgImgyNjRlbmMiLCAidmlkZW9fZW5jb2Rlci5hdmMiIH0sCisgICAgeyAiT01YLmdvb2dsZS5oZXZjLmRlY29kZXIiLCAiaGV2Y2RlYyIsICJ2aWRlb19kZWNvZGVyLmhldmMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIsICJnNzExZGVjIiwgImF1ZGlvX2RlY29kZXIuZzcxMWFsYXciIH0sCiAgICAgeyAiT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIsICJnNzExZGVjIiwgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciIH0sCiAgICAgeyAiT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiLCAibXBlZzRkZWMiLCAidmlkZW9fZGVjb2Rlci5oMjYzIiB9LApAQCAtNTAsNiArNTEsNyBAQAogICAgIHsgIk9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIsICJtcGVnNGVuYyIsICJ2aWRlb19lbmNvZGVyLm1wZWc0IiB9LAogICAgIHsgIk9NWC5nb29nbGUubXAzLmRlY29kZXIiLCAibXAzZGVjIiwgImF1ZGlvX2RlY29kZXIubXAzIiB9LAogICAgIHsgIk9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiLCAidm9yYmlzZGVjIiwgImF1ZGlvX2RlY29kZXIudm9yYmlzIiB9LAorICAgIHsgIk9NWC5nb29nbGUub3B1cy5kZWNvZGVyIiwgIm9wdXNkZWMiLCAiYXVkaW9fZGVjb2Rlci5vcHVzIiB9LAogICAgIHsgIk9NWC5nb29nbGUudnA4LmRlY29kZXIiLCAidnB4ZGVjIiwgInZpZGVvX2RlY29kZXIudnA4IiB9LAogICAgIHsgIk9NWC5nb29nbGUudnA5LmRlY29kZXIiLCAidnB4ZGVjIiwgInZpZGVvX2RlY29kZXIudnA5IiB9LAogICAgIHsgIk9NWC5nb29nbGUudnA4LmVuY29kZXIiLCAidnB4ZW5jIiwgInZpZGVvX2VuY29kZXIudnA4IiB9LApAQCAtMTU0LDcgKzE1Niw3IEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWFBsdWdpbjo6ZW51bWVyYXRlQ29tcG9uZW50cygKICAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgc2l6ZV90IC8qIHNpemUgKi8sCiAgICAgICAgIE9NWF9VMzIgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0ga051bUNvbXBvbmVudHMpIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCAwOGEzZDQyLi4yZjgzNjEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0xNCwxMiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKIAorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC00OCw2ICs1MSw5IEBACiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCiAgICAgICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICAgIG1Jc0FkYXB0aXZlKGZhbHNlKSwKKyAgICAgICAgbUFkYXB0aXZlTWF4V2lkdGgoMCksCisgICAgICAgIG1BZGFwdGl2ZU1heEhlaWdodCgwKSwKICAgICAgICAgbVdpZHRoKHdpZHRoKSwKICAgICAgICAgbUhlaWdodChoZWlnaHQpLAogICAgICAgICBtQ3JvcExlZnQoMCksCkBAIC0xMTcsMTYgKzEyMywxOCBAQAogICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOwogfQogCi12b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnVwZGF0ZVBvcnREZWZpbml0aW9ucygpIHsKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6dXBkYXRlUG9ydERlZmluaXRpb25zKGJvb2wgdXBkYXRlQ3JvcCkgewogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oa0lucHV0UG9ydEluZGV4KS0+bURlZjsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKKyAgICBkZWYtPm5CdWZmZXJTaXplID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzIC8gMjsKKwogICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7Ci0gICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7Ci0gICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIApAQCAtMTM0LDEwICsxNDIsMTA1IEBACiAgICAgICAgICAgICAoZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKgogICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAqIDMpIC8gMjsKIAotICAgIG1Dcm9wTGVmdCA9IDA7Ci0gICAgbUNyb3BUb3AgPSAwOwotICAgIG1Dcm9wV2lkdGggPSBtV2lkdGg7Ci0gICAgbUNyb3BIZWlnaHQgPSBtSGVpZ2h0OworICAgIGlmICh1cGRhdGVDcm9wKSB7CisgICAgICAgIG1Dcm9wTGVmdCA9IDA7CisgICAgICAgIG1Dcm9wVG9wID0gMDsKKyAgICAgICAgbUNyb3BXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbUNyb3BIZWlnaHQgPSBtSGVpZ2h0OworICAgIH0KK30KKworCit1aW50MzJfdCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvdXRwdXRCdWZmZXJXaWR0aCgpIHsKKyAgICByZXR1cm4gbUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhXaWR0aCA6IG1XaWR0aDsKK30KKwordWludDMyX3QgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b3V0cHV0QnVmZmVySGVpZ2h0KCkgeworICAgIHJldHVybiBtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heEhlaWdodCA6IG1IZWlnaHQ7Cit9CisKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAorICAgICAgICBib29sICpwb3J0V2lsbFJlc2V0LCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUsIGJvb2wgZmFrZVN0cmlkZSkgeworICAgICpwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgYm9vbCBzaXplQ2hhbmdlZCA9ICh3aWR0aCAhPSBtV2lkdGggfHwgaGVpZ2h0ICE9IG1IZWlnaHQpOworICAgIGJvb2wgdXBkYXRlQ3JvcCA9IChjcm9wU2V0dGluZ3NNb2RlID09IGtDcm9wVW5TZXQpOworICAgIGJvb2wgY3JvcENoYW5nZWQgPSAoY3JvcFNldHRpbmdzTW9kZSA9PSBrQ3JvcENoYW5nZWQpOworICAgIGJvb2wgc3RyaWRlQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChmYWtlU3RyaWRlKSB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7CisgICAgICAgIGlmIChkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICE9IHdpZHRoIHx8IGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAhPSBoZWlnaHQpIHsKKyAgICAgICAgICAgIHN0cmlkZUNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemVDaGFuZ2VkIHx8IGNyb3BDaGFuZ2VkIHx8IHN0cmlkZUNoYW5nZWQpIHsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgaWYgKChzaXplQ2hhbmdlZCAmJiAhbUlzQWRhcHRpdmUpCisgICAgICAgICAgICB8fCB3aWR0aCA+IG1BZGFwdGl2ZU1heFdpZHRoCisgICAgICAgICAgICB8fCBoZWlnaHQgPiBtQWRhcHRpdmVNYXhIZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChtSXNBZGFwdGl2ZSkgeworICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IG1BZGFwdGl2ZU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPiBtQWRhcHRpdmVNYXhIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4SGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucyh1cGRhdGVDcm9wKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCBrT3V0cHV0UG9ydEluZGV4LCAwLCBOVUxMKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICpwb3J0V2lsbFJlc2V0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucyh1cGRhdGVDcm9wKTsKKworICAgICAgICAgICAgaWYgKGZha2VTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBNQUpPUiBIQUNLIHRoYXQgaXMgbm90IHByZXR0eSwgaXQncyBqdXN0IHRvIGZvb2wgdGhlIHJlbmRlcmVyIHRvIHJlYWQgdGhlIGNvcnJlY3QKKyAgICAgICAgICAgICAgICAvLyBkYXRhLgorICAgICAgICAgICAgICAgIC8vIFNvbWUgc29mdHdhcmUgZGVjb2RlcnMgKGUuZy4gU29mdE1QRUc0KSBmaWxsIGRlY29kZWQgZnJhbWUgZGlyZWN0bHkgdG8gb3V0cHV0CisgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG91dHB1dCBidWZmZXIgc3RyaWRlIGFuZCBzbGljZSBoZWlnaHQuIFNvIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIHNpZ25hbCBob3cgdGhlIGJ1ZmZlciBpcyBhcnJhbmdlZC4gIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byByZS1hcnJhbmdlIHRoZQorICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgaW4gU29mdE1QRUc0LCBidXQgdGhhdCByZXN1bHRzIGluIG1lbWNvcGllcy4KKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBtV2lkdGg7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gbUhlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIGtPdXRwdXRQb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Y29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKAorICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUpIHsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gZHN0WVN0cmlkZSAvIDI7CisgICAgc2l6ZV90IGRzdEhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIG1XaWR0aCk7CisgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBkc3RIZWlnaHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCBtV2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArICg1ICogZHN0WVN0cmlkZSAqIGRzdEhlaWdodCkgLyA0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgbVdpZHRoIC8gMik7CisgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKApAQCAtMTc3LDE2ICsyODAsMTYgQEAKICAgICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqKSBwYXJhbXM7CiAKICAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggIT0ga0lucHV0UG9ydEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgcG9ydCBpbmRleDogJWxkIiwgcHJvZmlsZUxldmVsLT5uUG9ydEluZGV4KTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBwb3J0IGluZGV4OiAlIiBQUkl1MzIsIHByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSBtTnVtUHJvZmlsZUxldmVscykgeworICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleCA+PSBtTnVtUHJvZmlsZUxldmVscykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBtUHJvZmlsZUxldmVsc1tpbmRleF0ubVByb2ZpbGU7Ci0gICAgICAgICAgICBwcm9maWxlTGV2ZWwtPmVMZXZlbCAgID0gbVByb2ZpbGVMZXZlbHNbaW5kZXhdLm1MZXZlbDsKKyAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBtUHJvZmlsZUxldmVsc1twcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXhdLm1Qcm9maWxlOworICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lTGV2ZWwgICA9IG1Qcm9maWxlTGV2ZWxzW3Byb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleF0ubUxldmVsOwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIApAQCAtMTk3LDcgKzMwMCwxMCBAQAogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAvLyBJbmNsdWRlIGV4dGVuc2lvbiBpbmRleCBPTVhfSU5ERVhFWFRUWVBFLgorICAgIGNvbnN0IGludDMyX3QgaW5kZXhGdWxsID0gaW5kZXg7CisKKyAgICBzd2l0Y2ggKGluZGV4RnVsbCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQpAQCAtMjI4LDYgKzMzNCw1OCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja1BhcmFtcyogYWRhcHRpdmVQbGF5YmFja1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja1BhcmFtcyAqKXBhcmFtczsKKyAgICAgICAgICAgIG1Jc0FkYXB0aXZlID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+YkVuYWJsZTsKKyAgICAgICAgICAgIGlmIChtSXNBZGFwdGl2ZSkgeworICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+bk1heEZyYW1lV2lkdGg7CisgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4SGVpZ2h0ID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+bk1heEZyYW1lSGVpZ2h0OworICAgICAgICAgICAgICAgIG1XaWR0aCA9IG1BZGFwdGl2ZU1heFdpZHRoOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBtQWRhcHRpdmVNYXhIZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoID0gMDsKKyAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhIZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqbmV3UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKyAgICAgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvX2RlZiA9ICZuZXdQYXJhbXMtPmZvcm1hdC52aWRlbzsKKyAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8obmV3UGFyYW1zLT5uUG9ydEluZGV4KS0+bURlZjsKKworICAgICAgICAgICAgdWludDMyX3Qgb2xkV2lkdGggPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IG9sZEhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld1dpZHRoID0gdmlkZW9fZGVmLT5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld0hlaWdodCA9IHZpZGVvX2RlZi0+bkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgaWYgKG5ld1dpZHRoICE9IG9sZFdpZHRoIHx8IG5ld0hlaWdodCAhPSBvbGRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBib29sIG91dHB1dFBvcnQgPSAobmV3UGFyYW1zLT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgKG1Jc0FkYXB0aXZlICYmIG91dHB1dFBvcnQpID8gbUFkYXB0aXZlTWF4V2lkdGggOiBuZXdXaWR0aDsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICAobUlzQWRhcHRpdmUgJiYgb3V0cHV0UG9ydCkgPyBtQWRhcHRpdmVNYXhIZWlnaHQgOiBuZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICBkZWYtPm5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UG9ydCkgeworICAgICAgICAgICAgICAgICAgICBtV2lkdGggPSBuZXdXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbUhlaWdodCA9IG5ld0hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BMZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BUb3AgPSAwOworICAgICAgICAgICAgICAgICAgICBtQ3JvcFdpZHRoID0gbmV3V2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1Dcm9wSGVpZ2h0ID0gbmV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXdQYXJhbXMtPm5CdWZmZXJTaXplID0gZGVmLT5uQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CiAgICAgfQpAQCAtMjU3LDYgKzQxNSwxNiBAQAogICAgIH0KIH0KIAorT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIikpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4OworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9CisKKyAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOworfQorCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKSB7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmZjE0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgorCisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUdyYWxsb2NNb2R1bGUoTlVMTCkgeworfQorCisvLyBzdGF0aWMKK3ZvaWQgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Q29udmVydEZsZXhZVVZUb1BsYW5hcigKKyAgICAgICAgdWludDhfdCAqZHN0LCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwKKyAgICAgICAgc3RydWN0IGFuZHJvaWRfeWNiY3IgKnljYmNyLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IChjb25zdCB1aW50OF90ICopeWNiY3ItPnk7CisgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopeWNiY3ItPmNiOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKXljYmNyLT5jcjsKKyAgICB1aW50OF90ICpkc3RVID0gZHN0ICsgZHN0VlN0cmlkZSAqIGRzdFN0cmlkZTsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0VSArIChkc3RWU3RyaWRlID4+IDEpICogKGRzdFN0cmlkZSA+PiAxKTsKKworICAgIGZvciAoc2l6ZV90IHkgPSBoZWlnaHQ7IHkgPiAwOyAtLXkpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7CisgICAgICAgIHNyYyArPSB5Y2Jjci0+eXN0cmlkZTsKKyAgICB9CisgICAgaWYgKHljYmNyLT5jc3RyaWRlID09IHljYmNyLT55c3RyaWRlID4+IDEgJiYgeWNiY3ItPmNocm9tYV9zdGVwID09IDEpIHsKKyAgICAgICAgLy8gcGxhbmFyCisgICAgICAgIGZvciAoc2l6ZV90IHkgPSBoZWlnaHQgPj4gMTsgeSA+IDA7IC0teSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoID4+IDEpOworICAgICAgICAgICAgZHN0VSArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIHNyY1UgKz0geWNiY3ItPmNzdHJpZGU7CisgICAgICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggPj4gMSk7CisgICAgICAgICAgICBkc3RWICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICAgICAgc3JjViArPSB5Y2Jjci0+Y3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGFyYml0cmFyeQorICAgICAgICBmb3IgKHNpemVfdCB5ID0gaGVpZ2h0ID4+IDE7IHkgPiAwOyAtLXkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHggPSB3aWR0aCA+PiAxOyB4ID4gMDsgLS14KSB7CisgICAgICAgICAgICAgICAgKmRzdFUrKyA9ICpzcmNVOworICAgICAgICAgICAgICAgICpkc3RWKysgPSAqc3JjVjsKKyAgICAgICAgICAgICAgICBzcmNVICs9IHljYmNyLT5jaHJvbWFfc3RlcDsKKyAgICAgICAgICAgICAgICBzcmNWICs9IHljYmNyLT5jaHJvbWFfc3RlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFUgKz0gKGRzdFN0cmlkZSA+PiAxKSAtICh3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgIGRzdFYgKz0gKGRzdFN0cmlkZSA+PiAxKSAtICh3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgIHNyY1UgKz0geWNiY3ItPmNzdHJpZGUgLSAod2lkdGggPj4gMSkgKiB5Y2Jjci0+Y2hyb21hX3N0ZXA7CisgICAgICAgICAgICBzcmNWICs9IHljYmNyLT5jc3RyaWRlIC0gKHdpZHRoID4+IDEpICogeWNiY3ItPmNocm9tYV9zdGVwOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Q29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5ZVlUsIHVpbnQ4X3QqIG91dFlVViwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3Igc3RyaWRlCisgICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIHVpbnQzMl90ICpvdXRZICA9ICh1aW50MzJfdCAqKSBvdXRZVVY7CisgICAgdWludDE2X3QgKm91dENiID0gKHVpbnQxNl90ICopIChvdXRZVVYgKyBvdXRZc2l6ZSk7CisgICAgdWludDE2X3QgKm91dENyID0gKHVpbnQxNl90ICopIChvdXRZVVYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7CisKKyAgICAvKiBZIGNvcHlpbmcgKi8KKyAgICBtZW1jcHkob3V0WSwgaW5ZVlUsIG91dFlzaXplKTsKKworICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KKyAgICAvLyBGSVhNRSB0aGlzIG9ubHkgd29ya3MgaWYgd2lkdGggaXMgbXVsdGlwbGUgb2YgNAorICAgIHVpbnQzMl90ICppbllWVV80ID0gKHVpbnQzMl90ICopIChpbllWVSArIG91dFlzaXplKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IGhlaWdodCA+PiAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gd2lkdGggPj4gMjsgaiA+IDA7IC0taikgeworICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9ICppbllWVV80Kys7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wVSA9IHRlbXAgJiAweEZGOworICAgICAgICAgICAgdGVtcFUgPSB0ZW1wVSB8ICgodGVtcCA+PiA4KSAmIDB4RkYwMCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXBWID0gKHRlbXAgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgdGVtcFYgPSB0ZW1wViB8ICgodGVtcCA+PiAxNikgJiAweEZGMDApOworCisgICAgICAgICAgICAqb3V0Q2IrKyA9IHRlbXBVOworICAgICAgICAgICAgKm91dENyKysgPSB0ZW1wVjsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OkNvbnZlcnRSR0IzMlRvUGxhbmFyKAorICAgICAgICB1aW50OF90ICpkc3RZLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCisgICAgICAgIGJvb2wgYmdyKSB7CisgICAgQ0hFQ0soKHdpZHRoICYgMSkgPT0gMCk7CisgICAgQ0hFQ0soKGhlaWdodCAmIDEpID09IDApOworCisgICAgdWludDhfdCAqZHN0VSA9IGRzdFkgKyBkc3RTdHJpZGUgKiBkc3RWU3RyaWRlOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKGRzdFN0cmlkZSA+PiAxKSAqIChkc3RWU3RyaWRlID4+IDEpOworCisjaWZkZWYgU1VSRkFDRV9JU19CR1IzMgorICAgIGJnciA9ICFiZ3I7CisjZW5kaWYKKworICAgIGNvbnN0IHNpemVfdCByZWRPZmZzZXQgICA9IGJnciA/IDIgOiAwOworICAgIGNvbnN0IHNpemVfdCBncmVlbk9mZnNldCA9IDE7CisgICAgY29uc3Qgc2l6ZV90IGJsdWVPZmZzZXQgID0gYmdyID8gMCA6IDI7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgdW5zaWduZWQgcmVkICAgPSBzcmNbcmVkT2Zmc2V0XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGdyZWVuID0gc3JjW2dyZWVuT2Zmc2V0XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGJsdWUgID0gc3JjW2JsdWVPZmZzZXRdOworCisgICAgICAgICAgICAvLyB1c2luZyBJVFUtUiBCVC42MDEgY29udmVyc2lvbiBtYXRyaXgKKyAgICAgICAgICAgIHVuc2lnbmVkIGx1bWEgPQorICAgICAgICAgICAgICAgICgocmVkICogNjYgKyBncmVlbiAqIDEyOSArIGJsdWUgKiAyNSkgPj4gOCkgKyAxNjsKKworICAgICAgICAgICAgZHN0WVt4XSA9IGx1bWE7CisKKyAgICAgICAgICAgIGlmICgoeCAmIDEpID09IDAgJiYgKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgVSA9CisgICAgICAgICAgICAgICAgICAgICgoLXJlZCAqIDM4IC0gZ3JlZW4gKiA3NCArIGJsdWUgKiAxMTIpID4+IDgpICsgMTI4OworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgViA9CisgICAgICAgICAgICAgICAgICAgICgocmVkICogMTEyIC0gZ3JlZW4gKiA5NCAtIGJsdWUgKiAxOCkgPj4gOCkgKyAxMjg7CisKKyAgICAgICAgICAgICAgICBkc3RVW3ggPj4gMV0gPSBVOworICAgICAgICAgICAgICAgIGRzdFZbeCA+PiAxXSA9IFY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoeSAmIDEpID09IDApIHsKKyAgICAgICAgICAgIGRzdFUgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgICAgICBkc3RWICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICB9CisKKyAgICAgICAgc3JjICs9IHNyY1N0cmlkZSAtIDQgKiB3aWR0aDsKKyAgICAgICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgfQorfQorCitjb25zdCB1aW50OF90ICpTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjpleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgdWludDhfdCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgc2l6ZV90IGRzdFN0cmlkZSA9IHdpZHRoOworICAgIHNpemVfdCBkc3RWU3RyaWRlID0gaGVpZ2h0OworCisgICAgTWV0YWRhdGFCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSAqKE1ldGFkYXRhQnVmZmVyVHlwZSAqKXNyYzsKKyAgICBib29sIHVzaW5nR3JhcGhpY0J1ZmZlciA9IGJ1ZmZlclR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYXBoaWNCdWZmZXI7CisgICAgaWYgKCF1c2luZ0dyYXBoaWNCdWZmZXIgJiYgYnVmZmVyVHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWV0YWRhdGEgdHlwZSAoJWQpIiwgYnVmZmVyVHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtR3JhbGxvY01vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgIENIRUNLX0VRKDAsIGh3X2dldF9tb2R1bGUoR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZtR3JhbGxvY01vZHVsZSkpOworICAgIH0KKworICAgIGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKmdybW9kdWxlID0KKyAgICAgICAgKGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKiltR3JhbGxvY01vZHVsZTsKKworICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGU7CisgICAgaW50IGZvcm1hdDsKKyAgICBzaXplX3Qgc3JjU3RyaWRlOworICAgIHNpemVfdCBzcmNWU3RyaWRlOworICAgIGlmICh1c2luZ0dyYXBoaWNCdWZmZXIpIHsKKyAgICAgICAgaWYgKHNyY1NpemUgPCA0ICsgc2l6ZW9mKEdyYXBoaWNCdWZmZXIgKikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgNCArIHNpemVvZihHcmFwaGljQnVmZmVyICopKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyID0gKihHcmFwaGljQnVmZmVyICoqKShzcmMgKyA0KTsKKyAgICAgICAgaGFuZGxlID0gYnVmZmVyLT5oYW5kbGU7CisgICAgICAgIGZvcm1hdCA9IGJ1ZmZlci0+Zm9ybWF0OworICAgICAgICBzcmNTdHJpZGUgPSBidWZmZXItPnN0cmlkZTsKKyAgICAgICAgc3JjVlN0cmlkZSA9IGJ1ZmZlci0+aGVpZ2h0OworICAgICAgICAvLyBjb252ZXJ0IHN0cmlkZSBmcm9tIHBpeGVscyB0byBieXRlcworICAgICAgICBpZiAoZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMiAmJgorICAgICAgICAgICAgZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgeworICAgICAgICAgICAgLy8gVE9ETyBkbyB3ZSBuZWVkIHRvIHN1cHBvcnQgb3RoZXIgZm9ybWF0cz8KKyAgICAgICAgICAgIHNyY1N0cmlkZSAqPSA0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgcGFydC4gIENoZWNrIGlmIGFueW9uZSB1c2VzIHRoaXMuCisKKyAgICAgICAgaWYgKHNyY1NpemUgPCA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlID0gKihidWZmZXJfaGFuZGxlX3QgKikoc3JjICsgNCk7CisgICAgICAgIC8vIGFzc3VtZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OAorICAgICAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBzcmMgc3RyaWRlIHdpdGhvdXQgdGhlIGdyYXBoaWMgYnVmZmVyCisgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OworICAgICAgICBzcmNTdHJpZGUgPSB3aWR0aCAqIDQ7CisgICAgICAgIHNyY1ZTdHJpZGUgPSBoZWlnaHQ7CisgICAgfQorCisgICAgc2l6ZV90IG5lZWRlZFNpemUgPQorICAgICAgICBkc3RTdHJpZGUgKiBkc3RWU3RyaWRlICsgKHdpZHRoID4+IDEpCisgICAgICAgICAgICAgICAgKyAoZHN0U3RyaWRlID4+IDEpICogKChkc3RWU3RyaWRlID4+IDEpICsgKGhlaWdodCA+PiAxKSAtIDEpOworICAgIGlmIChkc3RTaXplIDwgbmVlZGVkU2l6ZSkgeworICAgICAgICBBTE9HRSgiZGVzdGluYXRpb24gYnVmZmVyIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBkc3RTaXplLCBuZWVkZWRTaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdm9pZCAqYml0cyA9IE5VTEw7CisgICAgc3RydWN0IGFuZHJvaWRfeWNiY3IgeWNiY3I7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7CisgICAgICAgIHJlcyA9IGdybW9kdWxlLT5sb2NrX3ljYmNyKAorICAgICAgICAgICAgICAgICBncm1vZHVsZSwgaGFuZGxlLAorICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSLAorICAgICAgICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmeWNiY3IpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IGdybW9kdWxlLT5sb2NrKAorICAgICAgICAgICAgICAgICBncm1vZHVsZSwgaGFuZGxlLAorICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSLAorICAgICAgICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmYml0cyk7CisgICAgfQorICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2NrIGltYWdlIGJ1ZmZlciAlcCBmb3IgYWNjZXNzIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6ICAvLyBZQ3JDYiAvIFlWVSBwbGFuYXIKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZmxleCBZVVYKKyAgICAgICAgICAgIHljYmNyLnkgPSBiaXRzOworICAgICAgICAgICAgeWNiY3IuY3IgPSAodWludDhfdCAqKWJpdHMgKyBzcmNTdHJpZGUgKiBzcmNWU3RyaWRlOworICAgICAgICAgICAgeWNiY3IuY2IgPSAodWludDhfdCAqKXljYmNyLmNyICsgKHNyY1N0cmlkZSA+PiAxKSAqIChzcmNWU3RyaWRlID4+IDEpOworICAgICAgICAgICAgeWNiY3IuY2hyb21hX3N0ZXAgPSAxOworICAgICAgICAgICAgeWNiY3IuY3N0cmlkZSA9IHNyY1ZTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIHljYmNyLnlzdHJpZGUgPSBzcmNWU3RyaWRlOworICAgICAgICAgICAgQ29udmVydEZsZXhZVVZUb1BsYW5hcihkc3QsIGRzdFN0cmlkZSwgZHN0VlN0cmlkZSwgJnljYmNyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOiAgLy8gWUNyQ2IgLyBZVlUgc2VtaXBsYW5hciwgTlYyMQorICAgICAgICAgICAgLy8gY29udmVydCB0byBmbGV4IFlVVgorICAgICAgICAgICAgeWNiY3IueSA9IGJpdHM7CisgICAgICAgICAgICB5Y2Jjci5jciA9ICh1aW50OF90ICopYml0cyArIHNyY1N0cmlkZSAqIHNyY1ZTdHJpZGU7CisgICAgICAgICAgICB5Y2Jjci5jYiA9ICh1aW50OF90ICopeWNiY3IuY3IgKyAxOworICAgICAgICAgICAgeWNiY3IuY2hyb21hX3N0ZXAgPSAyOworICAgICAgICAgICAgeWNiY3IuY3N0cmlkZSA9IHNyY1ZTdHJpZGU7CisgICAgICAgICAgICB5Y2Jjci55c3RyaWRlID0gc3JjVlN0cmlkZTsKKyAgICAgICAgICAgIENvbnZlcnRGbGV4WVVWVG9QbGFuYXIoZHN0LCBkc3RTdHJpZGUsIGRzdFZTdHJpZGUsICZ5Y2Jjciwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODg6CisgICAgICAgICAgICBDb252ZXJ0RmxleFlVVlRvUGxhbmFyKGRzdCwgZHN0U3RyaWRlLCBkc3RWU3RyaWRlLCAmeWNiY3IsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgICAgICBDb252ZXJ0UkdCMzJUb1BsYW5hcigKKyAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3RTdHJpZGUsIGRzdFZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYml0cywgd2lkdGgsIGhlaWdodCwgc3JjU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgICAgICBkc3QgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGdybW9kdWxlLT51bmxvY2soZ3Jtb2R1bGUsIGhhbmRsZSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB1bmxvY2sgaW1hZ2UgYnVmZmVyICVwIGZvciBhY2Nlc3MiLCBoYW5kbGUpOworICAgIH0KKworICAgIHJldHVybiBkc3Q7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIikgfHwKKyAgICAgICAgIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlR3JhcGhpY0J1ZmZlckluTWV0YURhdGEiKSkgeworICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleChuYW1lLCBpbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDEwNjFjMzkuLjQ0N2IyOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xMSw4ICsxMSwxMiBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBvbXhfdGVzdHMKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCA0YmVlODA4Li5mNGRmZDZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YSGFybmVzcyIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiT01YSGFybmVzcy5oIgpAQCAtMjUsNiArMjYsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CkBAIC0yNDEsNyArMjQzLDggQEAKIH07CiAKIHN0YXRpYyBzcDxNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRXh0cmFjdG9yRnJvbVVSSShjb25zdCBjaGFyICp1cmkpIHsKLSAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSk7CisgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0KKyAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCB1cmkpOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDYwLDYgKzQ2Myw3IEBACiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuYWFjIiwgImF1ZGlvL21wNGEtbGF0bSIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5tcDMiLCAiYXVkaW8vbXBlZyIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCAiYXVkaW8vdm9yYmlzIiB9LAorICAgICAgICB7ICJhdWRpb19kZWNvZGVyLm9wdXMiLCAiYXVkaW8vb3B1cyIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyB9LAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXIH0sCiAgICAgfTsKQEAgLTQ5Miw2ICs0OTYsNyBAQAogICAgICAgICB7ICJhdWRpby9tcGVnIiwKICAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL211c2ljL01QM180OEtIel8xMjhrYnBzX3NfMV8xN19DQlIubXAzIiB9LAogICAgICAgICB7ICJhdWRpby92b3JiaXMiLCBOVUxMIH0sCisgICAgICAgIHsgImF1ZGlvL29wdXMiLCBOVUxMIH0sCiAgICAgICAgIHsgInZpZGVvL3gtdm5kLm9uMi52cDgiLAogICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vYmlnLWJ1Y2stYnVubnlfdHJhaWxlci53ZWJtIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgImZpbGU6Ly8vc2RjYXJkL00xRjEtQWxhdy1BRnNwLndhdiIgfSwKQEAgLTcxMSwxMSArNzE2LDExIEBACiAgICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlclRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmJ1ZmZlclRpbWVVcykpOwogICAgICAgICAgICAgaWYgKCFDbG9zZUVub3VnaChidWZmZXJUaW1lVXMsIGFjdHVhbFNlZWtUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBBdHRlbXB0ZWQgc2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIEF0dGVtcHRlZCBzZWVraW5nIHRvICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2Vla1RpbWVVcywgcmVxdWVzdGVkU2Vla1RpbWVVcyAvIDFFNik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBOZWFyZXN0IGtleWZyYW1lIGlzIGF0ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICogTmVhcmVzdCBrZXlmcmFtZSBpcyBhdCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNlZWtUaW1lVXMsIGFjdHVhbFNlZWtUaW1lVXMgLyAxRTYpOwotICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICogUmV0dXJuZWQgYnVmZmVyIHdhcyBhdCAlbGxkIHVzICglLjJmIHNlY3MpXG5cbiIsCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBSZXR1cm5lZCBidWZmZXIgd2FzIGF0ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpXG5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclRpbWVVcywgYnVmZmVyVGltZVVzIC8gMUU2KTsKIAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKaW5kZXggYTY4MjVlYi4uNGJjNjdlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCkBAIC0xMjQsNyArMTI0LDcgQEAKIH0KIAogdm9pZCBBQVZDQXNzZW1ibGVyOjphZGRTaW5nbGVOQUxVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICBBTE9HVigiYWRkU2luZ2xlTkFMVW5pdCBvZiBzaXplICVkIiwgYnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWKCJhZGRTaW5nbGVOQUxVbml0IG9mIHNpemUgJXp1IiwgYnVmZmVyLT5zaXplKCkpOwogI2lmICFMT0dfTkRFQlVHCiAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogI2VuZGlmCkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICBDSEVDSygoaW5kaWNhdG9yICYgMHgxZikgPT0gMjgpOwogCiAgICAgaWYgKHNpemUgPCAyKSB7Ci0gICAgICAgIEFMT0dWKCJJZ25vcmluZyBtYWxmb3JtZWQgRlUgYnVmZmVyIChzaXplID0gJWQpIiwgc2l6ZSk7CisgICAgICAgIEFMT0dWKCJJZ25vcmluZyBtYWxmb3JtZWQgRlUgYnVmZmVyIChzaXplID0gJXp1KSIsIHNpemUpOwogCiAgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CiAgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOwpAQCAtMjI1LDcgKzIyNSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9ICsrcXVldWUtPmJlZ2luKCk7CiAgICAgICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBsZW5ndGggJWQiLCB0b3RhbENvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBsZW5ndGggJXp1IiwgdG90YWxDb3VudCk7CiAKICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CiAKQEAgLTI5NCw3ICsyOTQsNyBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG90YWxDb3VudDsgKytpKSB7CiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CiAKLSAgICAgICAgQUxPR1YoInBpZWNlICMlZC8lZCIsIGkgKyAxLCB0b3RhbENvdW50KTsKKyAgICAgICAgQUxPR1YoInBpZWNlICMlenUvJXp1IiwgaSArIDEsIHRvdGFsQ291bnQpOwogI2lmICFMT0dfTkRFQlVHCiAgICAgICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICNlbmRpZgpAQCAtMzE3LDcgKzMxNyw3IEBACiB2b2lkIEFBVkNBc3NlbWJsZXI6OnN1Ym1pdEFjY2Vzc1VuaXQoKSB7CiAgICAgQ0hFQ0soIW1OQUxVbml0cy5lbXB0eSgpKTsKIAotICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJWQgbmFsIHVuaXRzKSIsIG1OQUxVbml0cy5zaXplKCkpOworICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJXp1IG5hbCB1bml0cykiLCBtTkFMVW5pdHMuc2l6ZSgpKTsKIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOwogICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1OQUxVbml0cy5iZWdpbigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAppbmRleCA0YzliZjViLi5kY2E1Yzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcApAQCAtMzQsNyArMzQsOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBTVBFRzJUU0Fzc2VtYmxlcjo6QU1QRUcyVFNBc3NlbWJsZXIoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBjaGFyICpkZXNjLCBjb25zdCBBU3RyaW5nICZwYXJhbXMpCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBjaGFyICogLyogZGVzYyAqLywKKyAgICAgICAgY29uc3QgQVN0cmluZyAmIC8qIHBhcmFtcyAqLykKICAgICA6IG1Ob3RpZnlNc2cobm90aWZ5KSwKICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKGZhbHNlKSwKICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObygwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAppbmRleCBlZWZjZWJhLi43ZWI2NTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKQEAgLTI0OSwxMSArMjQ5LDE1IEBACiAgICAgICAgIG1QYWNrZXRzLnB1c2hfYmFjayhidWZmZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgMikgeworICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgIH0KIAotICAgICAgICBDSEVDS19HRShidWZmZXItPnNpemUoKSwgMnUpOwogICAgICAgICB1bnNpZ25lZCBBVV9oZWFkZXJzX2xlbmd0aCA9IFUxNl9BVChidWZmZXItPmRhdGEoKSk7ICAvLyBpbiBiaXRzCiAKLSAgICAgICAgQ0hFQ0tfR0UoYnVmZmVyLT5zaXplKCksIDIgKyAoQVVfaGVhZGVyc19sZW5ndGggKyA3KSAvIDgpOworICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCAyICsgKEFVX2hlYWRlcnNfbGVuZ3RoICsgNykgLyA4KSB7CisgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgfQogCiAgICAgICAgIExpc3Q8QVVIZWFkZXI+IGhlYWRlcnM7CiAKQEAgLTM0Miw3ICszNDYsOSBAQAogICAgICAgICAgICAgIGl0ICE9IGhlYWRlcnMuZW5kKCk7ICsraXQpIHsKICAgICAgICAgICAgIGNvbnN0IEFVSGVhZGVyICZoZWFkZXIgPSAqaXQ7CiAKLSAgICAgICAgICAgIENIRUNLX0xFKG9mZnNldCArIGhlYWRlci5tU2l6ZSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgb2Zmc2V0ICsgaGVhZGVyLm1TaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihoZWFkZXIubVNpemUpOwogICAgICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGhlYWRlci5tU2l6ZSk7CkBAIC0zNTMsNyArMzU5LDEwIEBACiAgICAgICAgICAgICBtUGFja2V0cy5wdXNoX2JhY2soYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIAotICAgICAgICBDSEVDS19FUShvZmZzZXQsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKG9mZnNldCAhPSBidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1coInBvdGVudGlhbGx5IG1hbGZvcm1lZCBwYWNrZXQgKG9mZnNldCAlZCwgc2l6ZSAlZCkiLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CkBAIC0zNjUsNyArMzc0LDcgQEAKIHZvaWQgQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcjo6c3VibWl0QWNjZXNzVW5pdCgpIHsKICAgICBDSEVDSyghbVBhY2tldHMuZW1wdHkoKSk7CiAKLSAgICBBTE9HVigiQWNjZXNzIHVuaXQgY29tcGxldGUgKCVkIG5hbCB1bml0cykiLCBtUGFja2V0cy5zaXplKCkpOworICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJXp1IG5hbCB1bml0cykiLCBtUGFja2V0cy5zaXplKCkpOwogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKIApAQCAtNDAwLDYgKzQwOSw3IEBACiAgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBBc3NlbWJseVN0YXR1cyBzdGF0dXMgPSBhZGRQYWNrZXQoc291cmNlKTsKICAgICBpZiAoc3RhdHVzID09IE1BTEZPUk1FRF9QQUNLRVQpIHsKKyAgICAgICAgQUxPR0koImFjY2VzcyB1bml0IGlzIGRhbWFnZWQiKTsKICAgICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDQ2MmMzODQuLjA5ZjUyYmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkFSYXdBdWRpb0Fzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKIAotI2luY2x1ZGUgImF2Y191dGlscy5oIgorI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCmluZGV4IGFmMzY5YjUuLjM3MmZiZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCkBAIC01NjMsNyArNTYzLDcgQEAKIAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiVW5rbm93biBSVENQIHBhY2tldCB0eXBlICV1IG9mIHNpemUgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIFJUQ1AgcGFja2V0IHR5cGUgJXUgb2Ygc2l6ZSAlenUiLAogICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWRhdGFbMV0sIGhlYWRlckxlbmd0aCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAppbmRleCAwZDA3MDQzLi43OTNkMTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIHJldHVybiAobUZsYWdzICYga0ZsYWdFT1MpICE9IDA7CiB9CiAKLXN0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobUZsYWdzICYga0ZsYWdTdGFydGVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICAgIH0KIAogICAgIGlmIChtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWFkIGJ1ZmZlciBvZiBzaXplICVkIiwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgQUxPR1YoInJlYWQgYnVmZmVyIG9mIHNpemUgJXp1IiwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKTsKIAogICAgICAgICBpZiAobU1vZGUgPT0gSDI2NCkgewogICAgICAgICAgICAgU3RyaXBTdGFydGNvZGUobWVkaWFCdWYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IGVmZGU3YTkuLmYyNTUzOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KIAotI2luY2x1ZGUgIkhUVFBCYXNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTIzOSw3ICsyMzksNyBAQAogICAgICAgICAvLyByaWdodCBoZXJlLCBzaW5jZSB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2YgYXNraW5nIHRoZSB1c2VyCiAgICAgICAgIC8vIGZvciB0aGlzIGluZm9ybWF0aW9uLgogCi0gICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgcnRzcCB1cmwgJXMiLCB1cmwuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgcnRzcCB1cmwgJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOwogCiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgRVJST1JfTUFMRk9STUVEKTsKICAgICAgICAgcmVwbHktPnBvc3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcAppbmRleCAwZGE1ZGQyLi4xNjdmN2E0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwCkBAIC0zNCw3ICszNCw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEFSYXdBdWRpb0Fzc2VtYmxlcjo6QVJhd0F1ZGlvQXNzZW1ibGVyKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgY29uc3QgY2hhciAqZGVzYywgY29uc3QgQVN0cmluZyAmcGFyYW1zKQorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3QgY2hhciAqIC8qIGRlc2MgKi8sCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJiAvKiBwYXJhbXMgKi8pCiAgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCiAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCiAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggYTliMzMzMC4uOTg0OThlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0zMTksNiArMzE5LDExIEBACiAKICAgICBzID0gZW5kICsgMTsgIC8vIHNraXAgdGhlIGRhc2guCiAKKyAgICBpZiAoKnMgPT0gJ1wwJykgeworICAgICAgICAqbnB0MiA9IEZMVF9NQVg7ICAvLyBvcGVuIGVuZGVkLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBpZiAoIXN0cm5jbXAoIm5vdyIsIHMsIDMpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIGFic29sdXRlIGVuZCB0aW1lIGF2YWlsYWJsZQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawppbmRleCBlNzdjNjljLi5kNjBkYzJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgICAgIFNEUExvYWRlci5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIApAQCAtMzAsNiArMzAsMTAgQEAKICAgICBMT0NBTF9DRkxBR1MgKz0gLVduby1wc2FiaQogZW5kaWYKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKworTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTU1LDQgKzU5LDYgQEAKIAogTE9DQUxfTU9EVUxFOj0gcnRwX3Rlc3QKIAorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rCisKICMgaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBjZDc3YWEwLi40MjNhNDIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTE5LDcgKzE5LDExIEBACiAjZGVmaW5lIE1ZX0hBTkRMRVJfSF8KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaWZuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiTXlIYW5kbGVyIgorI2VuZGlmCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkFQYWNrZXRTb3VyY2UuaCIKQEAgLTQyLDYgKzQ2LDEyIEBACiAKICNpbmNsdWRlICJIVFRQQmFzZS5oIgogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiAvLyBJZiBubyBhY2Nlc3MgdW5pdHMgYXJlIHJlY2VpdmVkIHdpdGhpbiA1IHNlY3MsIGFzc3VtZSB0aGF0IHRoZSBydHAKIC8vIHN0cmVhbSBoYXMgZW5kZWQgYW5kIHNpZ25hbCBlbmQgb2Ygc3RyZWFtLgogc3RhdGljIGludDY0X3Qga0FjY2Vzc1VuaXRUaW1lb3V0VXMgPSAxMDAwMDAwMGxsOwpAQCAtMTQ5LDcgKzE1OSw3IEBACiAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChwYXRoKTsKIAotICAgICAgICAgICAgQUxPR0koInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR1YoInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbVNlc3Npb25Ib3N0ID0gaG9zdDsKQEAgLTE3OCw3ICsxODgsNyBAQAogICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICB9CiAKLSAgICBBU3RyaW5nIGdldENvbnRyb2xVUkwoc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gZGVzYykgeworICAgIEFTdHJpbmcgZ2V0Q29udHJvbFVSTCgpIHsKICAgICAgICAgQVN0cmluZyBzZXNzaW9uTGV2ZWxDb250cm9sVVJMOwogICAgICAgICBpZiAobVNlc3Npb25EZXNjLT5maW5kQXR0cmlidXRlKAogICAgICAgICAgICAgICAgIDAsCkBAIC0yNDQsNyArMjU0LDkgQEAKICAgICBzdGF0aWMgdm9pZCBhZGRTREVTKGludCBzLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogICAgICAgICBzb2NrbGVuX3QgYWRkclNpemUgPSBzaXplb2YoYWRkcik7Ci0gICAgICAgIENIRUNLX0VRKDAsIGdldHNvY2tuYW1lKHMsIChzb2NrYWRkciAqKSZhZGRyLCAmYWRkclNpemUpKTsKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKHMsIChzb2NrYWRkciAqKSZhZGRyLCAmYWRkclNpemUpICE9IDApIHsKKyAgICAgICAgICAgIGluZXRfYXRvbigiMC4wLjAuMCIsICYoYWRkci5zaW5fYWRkcikpOworICAgICAgICB9CiAKICAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CiAgICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMTsKQEAgLTQ3OCwyMSArNDkwLDMyIEBACiAgICAgICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDMwMikgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDMwMSB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgPT0gMzAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgibG9jYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKGksIDApOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsU2Vzc2lvblVSTCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwgPSBtT3JpZ2luYWxTZXNzaW9uVVJMOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gIkRFU0NSSUJFICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvblVSTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkFjY2VwdDogYXBwbGljYXRpb24vc2RwXHJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIGFueSBhdXRoZW50aWNhdGlvbiBpbmZvIGZyb20gdGhlIHNlc3Npb24gdXJsLCB3ZSBkb24ndAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FudCB0byB0cmFuc21pdCB1c2VyL3Bhc3MgaW4gY2xlYXJ0ZXh0LgorICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBob3N0LCBwYXRoLCB1c2VyLCBwYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBUlRTUENvbm5lY3Rpb246OlBhcnNlVVJMKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuY19zdHIoKSwgJmhvc3QsICZwb3J0LCAmcGF0aCwgJnVzZXIsICZwYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZCgicnRzcDovLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChob3N0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGVzYycsIGlkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU0NSw3ICs1NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmFzZVVSTCA9IHRtcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwobVNlc3Npb25EZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkRlc2MtPmNvdW50VHJhY2tzKCkgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gYWN0dWFsIHRyYWNrcyBpbiB0aGlzIHNlc3Npb24uCkBAIC01OTEsNyArNjE0LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWthYmxlID0gIWlzTGl2ZVN0cmVhbShtU2Vzc2lvbkRlc2MpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwobVNlc3Npb25EZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sVVJMID0gZ2V0Q29udHJvbFVSTCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb25EZXNjLT5jb3VudFRyYWNrcygpIDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gYWN0dWFsIHRyYWNrcyBpbiB0aGlzIHNlc3Npb24uCkBAIC0xODA1LDYgKzE4MjgsOCBAQAogICAgIGJvb2wgYWRkTWVkaWFUaW1lc3RhbXAoCiAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXgsIGNvbnN0IFRyYWNrSW5mbyAqdHJhY2ssCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgICAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UodHJhY2tJbmRleCk7CisKICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCBlZDNmYTdlLi40MjRiYWRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0xOCwzNCArMTgsMzAgQEAKICNkZWZpbmUgTE9HX1RBRyAiU0RQTG9hZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiU0RQTG9hZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9TRFBMb2FkZXIuaCIKIAogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKLSNpbmNsdWRlICJIVFRQQmFzZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2RlZmluZSBERUZBVUxUX1NEUF9TSVpFIDEwMDAwMAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLVNEUExvYWRlcjo6U0RQTG9hZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKQorU0RQTG9hZGVyOjpTRFBMb2FkZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1GbGFncyhmbGFncyksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAogICAgICAgbU5ldExvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtQ2FuY2VsbGVkKGZhbHNlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgSFRUUEJhc2U6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKSkgewotICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgbUhUVFBEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7Ci0gICAgfQotCisgICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKQEAgLTk0LDExICs5MCw3IEBACiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMOwogICAgIG1zZy0+ZmluZFBvaW50ZXIoImhlYWRlcnMiLCAodm9pZCAqKikmaGVhZGVycyk7CiAKLSAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykpIHsKLSAgICAgICAgQUxPR0koIm9uTG9hZCAnJXMnIiwgdXJsLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJvbkxvYWQgPFVSTCBzdXBwcmVzc2VkPiIpOwotICAgIH0KKyAgICBBTE9HVigib25Mb2FkICVzIiwgdXJpRGVidWdTdHJpbmcodXJsLCBtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykuY19zdHIoKSk7CiAKICAgICBpZiAoIW1DYW5jZWxsZWQpIHsKICAgICAgICAgZXJyID0gbUhUVFBEYXRhU291cmNlLT5jb25uZWN0KHVybC5jX3N0cigpLCBoZWFkZXJzKTsKQEAgLTEzMCw3ICsxMjIsNyBAQAogICAgICAgICBzc2l6ZV90IHJlYWRTaXplID0gbUhUVFBEYXRhU291cmNlLT5yZWFkQXQoMCwgYnVmZmVyLT5kYXRhKCksIHNkcFNpemUpOwogCiAgICAgICAgIGlmIChyZWFkU2l6ZSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBTRFAsIGVycm9yIGNvZGUgPSAlbGQiLCByZWFkU2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgU0RQLCBlcnJvciBjb2RlID0gJXp1IiwgcmVhZFNpemUpOwogICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRlc2MgPSBuZXcgQVNlc3Npb25EZXNjcmlwdGlvbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDA2Y2UxNmIuLjk5YjQ4MGFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTksNyArOSw3IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIFN1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcCBcCisJU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIFwKIAlEdW1teVJlY29yZGVyLmNwcCBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApAQCAtMzMsMTggKzMzLDU1IEBACiAJbGliZ3Rlc3RfbWFpbiBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGJpb25pYyBcCi0gICAgYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2VuZGlmCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBVdGlsc190ZXN0CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJVXRpbHNfdGVzdC5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorCWxpYmxvZyBcCisJbGlibWVkaWEgXAorCWxpYnN0YWdlZnJpZ2h0IFwKKwlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKwlsaWJzdGFnZWZyaWdodF9vbXggXAorCWxpYnN0bHBvcnQgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKwlsaWJndGVzdCBcCisJbGliZ3Rlc3RfbWFpbiBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCWZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKLWVuZGlmCi0KICMgSW5jbHVkZSBzdWJkaXJlY3RvcnkgbWFrZWZpbGVzCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCmluZGV4IGFjMzdiMjguLjhmMTcwODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCkBAIC02MSw3ICs2MSw3IEBACiAgICAgbVNvdXJjZS0+c3RvcCgpOwogICAgIHZvaWQgKmR1bW15OwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwotICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7CisgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogCiAgICAgQUxPR1YoIkVuZGluZyB0aGUgcmVhZGluZyB0aHJlYWQiKTsKICAgICByZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCmluZGV4IDQ5ZmZjZDYuLmZkODg5ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgpAQCAtMTEwLDcgKzEwOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiTm8gYWN0dWFsIGRpc3BsYXkuIENob29zaW5nIEVHTFN1cmZhY2UgYmFzZWQgb24gU3VyZmFjZU1lZGlhU291cmNlIik7CiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBzbXMgPSAobmV3IFN1cmZhY2VNZWRpYVNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSkpLT5nZXRCdWZmZXJRdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpKSktPmdldFByb2R1Y2VyKCk7CiAgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShzbXMpOwogICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gc3RjOwogCkBAIC0zNjEsOSArMzYwLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CiAgICAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLQotICAgICAgICAvLyBNYW51YWwgY2FzdCBpcyByZXF1aXJlZCB0byBhdm9pZCBjb25zdHJ1Y3RvciBhbWJpZ3VpdHkKLSAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKHN0YXRpY19jYXN0PHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ID4oIG1TTVMtPmdldEJ1ZmZlclF1ZXVlKCkpKTsKKyAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwogICAgICAgICBtQU5XID0gbVNUQzsKICAgICB9CiAKQEAgLTM5OCw3ICszOTUsNyBAQAogICAgICAgICBBTE9HVigiU01TLUdMVGVzdDo6U2V0VXAoKSIpOwogICAgICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShzdGF0aWNfY2FzdDxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+KCBtU01TLT5nZXRCdWZmZXJRdWV1ZSgpKSk7CisgICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShtU01TLT5nZXRQcm9kdWNlcigpKTsKICAgICAgICAgbUFOVyA9IG1TVEM7CiAKICAgICAgICAgLy8gRG9pbmcgdGhlIHNldHVwIHJlbGF0ZWQgdG8gdGhlIEdMIFNpZGUKQEAgLTUyNyw3ICs1MjQsOCBAQAogfQogCiAvLyBEZXF1ZXVpbmcgYW5kIHF1ZXVpbmcgdGhlIGJ1ZmZlciB3aXRob3V0IHJlYWxseSBmaWxsaW5nIGl0IGluLgotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpvbmVCdWZmZXJQYXNzTm9GaWxsKGludCB3aWR0aCwgaW50IGhlaWdodCApIHsKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlVGVzdDo6b25lQnVmZmVyUGFzc05vRmlsbCgKKyAgICAgICAgaW50IC8qIHdpZHRoICovLCBpbnQgLyogaGVpZ2h0ICAqLykgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobUFOVy5nZXQoKSwgJmFuYikpOwogICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKQEAgLTc0Niw5ICs3NDQsOCBAQAogICAgIENIRUNLKGZkID49IDApOwogCiAgICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBTdXJmYWNlTWVkaWFTb3VyY2VHTFRlc3Q6OnNldFVwTWVkaWFSZWNvcmRlcihmZCwKLSAgICAgICAgICAgIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiwKLSAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwKLSAgICAgICAgICAgIG1ZdXZUZXhIZWlnaHQsIDMwKTsKKyAgICAgICAgICAgIFZJREVPX1NPVVJDRV9TVVJGQUNFLCBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LAorICAgICAgICAgICAgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7CiAgICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KICAgICAvLyBtZWRpYXNlcnZlciB0aGF0IGlzIGNyZWF0ZWQgYnkgc3RhZ2VmcmlnaHRyZWNvcmRlcgogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlTVCA9IG1yLT5xdWVyeVN1cmZhY2VNZWRpYVNvdXJjZUZyb21NZWRpYVNlcnZlcigpOwpAQCAtNzgzLDcgKzc4MCw3IEBACiAgICAgQUxPR1YoIlZlcmlmeSBjcmVhdGluZyBhIHN1cmZhY2Ugdy8gcmlnaHQgY29uZmlnICsgZHVtbXkgd3JpdGVyKioqKioqKioqIik7CiAKICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShzdGF0aWNfY2FzdDxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+KCBtU01TLT5nZXRCdWZmZXJRdWV1ZSgpKSk7CisgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwogICAgIG1BTlcgPSBtU1RDOwogCiAgICAgRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7CkBAIC04ODAsNyArODc3LDcgQEAKICAgICB9CiAgICAgQ0hFQ0soZmQgPj0gMCk7CiAKLSAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IHNldFVwTWVkaWFSZWNvcmRlcihmZCwgVklERU9fU09VUkNFX0dSQUxMT0NfQlVGRkVSLAorICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfU1VSRkFDRSwKICAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwogCiAgICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KQEAgLTkyMyw3ICs5MjAsNyBAQAogICAgIH0KICAgICBDSEVDSyhmZCA+PSAwKTsKIAotICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIsCisgICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9TVVJGQUNFLAogICAgICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7CiAKICAgICAvLyBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGxpdmluZyBpbgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcAppbmRleCAyMmM0YTczLi4xYzEzZjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcApAQCAtMzIsNyArMzIsNjQgQEAKIGNsYXNzIFV0aWxzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewogfTsKIAorVEVTVF9GKFV0aWxzVGVzdCwgVGVzdEZvdXJDQykgeworICAgIEFTU0VSVF9FUShGT1VSQ0MoJ3MnLCAndCcsICdtJyAsICd1JyksICdzdG11Jyk7Cit9CisKIFRFU1RfRihVdGlsc1Rlc3QsIFRlc3RNYXRoVGVtcGxhdGVzKSB7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMCwgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTExLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTIsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMywgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTE0LCAtNCksIDQpOworCisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEwLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTEsIC00KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMiwgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEzLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTQsIC00KSwgLTQpOworCisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMCwgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTExLCA0KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTIsIDQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMywgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTE0LCA0KSwgLTQpOworCisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEwLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDExLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEyLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEzLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDE0LCA0KSwgNCk7CisKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTExLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZVcCgtMTIsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMywgLTQpLCA0KTsKKworICAgIEFTU0VSVF9FUShkaXZVcCgxMSwgLTQpLCAtMik7CisgICAgQVNTRVJUX0VRKGRpdlVwKDEyLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTMsIC00KSwgLTMpOworCisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMSwgNCksIC0yKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTEyLCA0KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZVcCgtMTMsIDQpLCAtMyk7CisKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTEsIDQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTIsIDQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTMsIDQpLCA0KTsKKworICAgIEFTU0VSVF9FUShhYnMoNUwpLCA1TCk7CisgICAgQVNTRVJUX0VRKGFicygtMjUpLCAyNSk7CisKKyAgICBBU1NFUlRfRVEobWluKDUuNmYsIDYuMGYpLCA1LjZmKTsKKyAgICBBU1NFUlRfRVEobWluKDYuMGYsIDUuNmYpLCA1LjZmKTsKKyAgICBBU1NFUlRfRVEobWluKC00LjMsIDguNiksIC00LjMpOworICAgIEFTU0VSVF9FUShtaW4oOC42LCAtNC4zKSwgLTQuMyk7CisKKyAgICBBU1NFUlRfRVEobWF4KDUuNmYsIDYuMGYpLCA2LjBmKTsKKyAgICBBU1NFUlRfRVEobWF4KDYuMGYsIDUuNmYpLCA2LjBmKTsKKyAgICBBU1NFUlRfRVEobWF4KC00LjMsIDguNiksIDguNik7CisgICAgQVNTRVJUX0VRKG1heCg4LjYsIC00LjMpLCA4LjYpOworCiAgICAgQVNTRVJUX0ZBTFNFKGlzSW5SYW5nZSgtNDMsIDg2dSwgLTQ0KSk7CiAgICAgQVNTRVJUX1RSVUUoaXNJblJhbmdlKC00MywgODd1LCAtNDMpKTsKICAgICBBU1NFUlRfVFJVRShpc0luUmFuZ2UoLTQzLCA4OHUsIC0xKSk7CkBAIC0xMTMsNiArMTcwLDEzIEBACiAgICAgQVNTRVJUX0ZBTFNFKGlzSW5SYW5nZSg0M3UsIDkxdSwgMTM0dSwgfjZ1KSk7CiAgICAgQVNTRVJUX0ZBTFNFKGlzSW5SYW5nZSg0M3UsIDkydSwgMTM2dSwgMHUpKTsKICAgICBBU1NFUlRfRkFMU0UoaXNJblJhbmdlKDQzdSwgOTJ1LCAxMzZ1LCAxdSkpOworCisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoMTI0LCAxMDApLCAyNCk7CisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoMjg4LCAxMDApLCAxMik7CisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoLTM0NSwgMTAwKSwgNDUpOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKC00OTMsIDEwMCksIDcpOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKC01NTAsIDEwMCksIDUwKTsKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigtNjAwLCAxMDApLCAwKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5tawppbmRleCBmMDk5YmJkLi42YThiOWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5tawpAQCAtOSw3ICs5LDggQEAKICAgICAgICAgVGltZWRUZXh0U1JUU291cmNlLmNwcCAgICBcCiAgICAgICAgIFRpbWVkVGV4dFBsYXllci5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvcgorCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dCBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCmluZGV4IDEyZmQ3ZjQuLjcxYWEyMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KQEAgLTQwLDkgKzQxLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFRpbWVkVGV4dERyaXZlcjo6VGltZWRUZXh0RHJpdmVyKAotICAgICAgICBjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcikKKyAgICAgICAgY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpCiAgICAgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1MaXN0ZW5lcihsaXN0ZW5lciksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpLAogICAgICAgbUN1cnJlbnRUcmFja0luZGV4KFVJTlRfTUFYKSB7CiAgICAgbUxvb3Blci0+c2V0TmFtZSgiVGltZWRUZXh0RHJpdmVyIik7CkBAIC0yMDcsNyArMjEwLDcgQEAKICAgICB9CiAKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkodXJpKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobUhUVFBTZXJ2aWNlLCB1cmkpOwogICAgIHJldHVybiBjcmVhdGVPdXRPZkJhbmRUZXh0U291cmNlKHRyYWNrSW5kZXgsIG1pbWVUeXBlLCBkYXRhU291cmNlKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcAppbmRleCA5ZmIwYWZlLi5hMDcwNDg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJUaW1lZFRleHRQbGF5ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjcxLDcgKzI3Miw3IEBACiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CiAgICAgaWYgKGxpc3RlbmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gVE9ETzogaXQgbWF5IGJlIGJldHRlciB0byByZXR1cm4ga0ludmFsaWRUaW1lVXMKLSAgICAgICAgQUxPR0UoIiVzOiBMaXN0ZW5lciBpcyBOVUxMLiAoZmlyZVRpbWVVcyA9ICVsbGQpIiwKKyAgICAgICAgQUxPR0UoIiVzOiBMaXN0ZW5lciBpcyBOVUxMLiAoZmlyZVRpbWVVcyA9ICUiIFBSSWQ2NCIgKSIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZmlyZVRpbWVVcyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTb3VyY2UuaAppbmRleCA3NTZjYzMxLi44YzFjMWNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNvdXJjZS5oCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgICAgaW50NjRfdCAqZW5kVGltZVVzLAogICAgICAgICAgIFBhcmNlbCAqcGFyY2VsLAogICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKLSAgdmlydHVhbCBzdGF0dXNfdCBleHRyYWN0R2xvYmFsRGVzY3JpcHRpb25zKFBhcmNlbCAqcGFyY2VsKSB7CisgIHZpcnR1YWwgc3RhdHVzX3QgZXh0cmFjdEdsb2JhbERlc2NyaXB0aW9ucyhQYXJjZWwgKiAvKiBwYXJjZWwgKi8pIHsKICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgfQogICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCmluZGV4IGE1ZTdiYTIuLjlhOWZkZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tawpAQCAtMiw3ICsyLDYgQEAKIAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjIFVuaXQgdGVzdHMgZm9yIGxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dAotIyBTZWUgYWxzbyAvZGV2ZWxvcG1lbnQvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xOCwxMCArMTcsMTMgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChUT1ApL2V4dGVybmFsL2V4cGF0L2xpYiBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYmluZGVyIFwKICAgICBsaWJleHBhdCBcCi0gICAgbGlic3RhZ2VmcmlnaHQKKyAgICBsaWJzdGFnZWZyaWdodCBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlidXRpbHMKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODE0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ1BQRkxBR1MgKz0gLURfX1NURElOVF9MSU1JVFMgXAorICAgICAgICAgICAgICAgICAgLVdlcnJvcgorCitMT0NBTF9TUkNfRklMRVM6PSBFYm1sVXRpbC5jcHAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFdlYm1FbGVtZW50LmNwcCAgICAgXAorICAgICAgICAgICAgICAgICAgV2VibUZyYW1lLmNwcCAgICAgICBcCisgICAgICAgICAgICAgICAgICBXZWJtRnJhbWVUaHJlYWQuY3BwIFwKKyAgICAgICAgICAgICAgICAgIFdlYm1Xcml0ZXIuY3BwCisKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlidXRpbHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJsb2cKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfd2VibQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWZlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHsKKworLy8gVGFibGUgZm9yIFNlYWwncyBhbGdvcml0aG0gZm9yIE51bWJlciBvZiBUcmFpbGluZyBaZXJvcy4gSGFja2VyJ3MgRGVsaWdodAorLy8gb25saW5lLCBGaWd1cmUgNS0xOCAoaHR0cDovL3d3dy5oYWNrZXJzZGVsaWdodC5vcmcvcmV2aXNpb25zLnBkZikKKy8vIFRoZSBlbnRyaWVzIHdob3NlIHZhbHVlIGlzIC0xIGFyZSBuZXZlciByZWZlcmVuY2VkLgoraW50IE5UWl9UQUJMRVtdID0geworICAgIDMyLCAgMCwgIDEsIDEyLCAgMiwgIDYsIC0xLCAxMywgICAzLCAtMSwgIDcsIC0xLCAtMSwgLTEsIC0xLCAxNCwKKyAgICAxMCwgIDQsIC0xLCAtMSwgIDgsIC0xLCAtMSwgMjUsICAtMSwgLTEsIC0xLCAtMSwgLTEsIDIxLCAyNywgMTUsCisgICAgMzEsIDExLCAgNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgIDksIC0xLCAtMSwgMjQsIC0xLCAtMSwgMjAsIDI2LAorICAgIDMwLCAtMSwgLTEsIC0xLCAtMSwgMjMsIC0xLCAxOSwgIDI5LCAtMSwgMjIsIDE4LCAyOCwgMTcsIDE2LCAtMQorfTsKKworaW50IG51bWJlck9mVHJhaWxpbmdaZXJvczMyKGludDMyX3QgaSkgeworICAgIHVpbnQzMl90IHUgPSAoaSAmIC1pKSAqIDB4MDQ1MEZCQUY7CisgICAgcmV0dXJuIE5UWl9UQUJMRVsodSkgPj4gMjZdOworfQorCit1aW50NjRfdCBoaWdoZXN0T25lQml0KHVpbnQ2NF90IG4pIHsKKyAgICBuIHw9IChuID4+IDEpOworICAgIG4gfD0gKG4gPj4gMik7CisgICAgbiB8PSAobiA+PiA0KTsKKyAgICBuIHw9IChuID4+IDgpOworICAgIG4gfD0gKG4gPj4gMTYpOworICAgIG4gfD0gKG4gPj4gMzIpOworICAgIHJldHVybiBuIC0gKG4gPj4gMSk7Cit9CisKK3VpbnQ2NF90IF9wb3dlck9mMih1aW50NjRfdCB1KSB7CisgICAgdWludDY0X3QgcG93ZXJPZjIgPSBoaWdoZXN0T25lQml0KHUpOworICAgIHJldHVybiBwb3dlck9mMiA/IHBvd2VyT2YyIDogMTsKK30KKworLy8gQmFzZWQgb24gTG9uZy5udW1iZXJPZlRyYWlsaW5nWmVyb3MgaW4gTG9uZy5qYXZhCitpbnQgbnVtYmVyT2ZUcmFpbGluZ1plcm9zKHVpbnQ2NF90IHUpIHsKKyAgICBpbnQzMl90IGxvdyA9IHU7CisgICAgcmV0dXJuIGxvdyAhPTAgPyBudW1iZXJPZlRyYWlsaW5nWmVyb3MzMihsb3cpCisgICAgICAgICAgICAgICAgICAgOiAzMiArIG51bWJlck9mVHJhaWxpbmdaZXJvczMyKChpbnQzMl90KSAodSA+PiAzMikpOworfQorfQorCituYW1lc3BhY2Ugd2VibSB7CisKKy8vIEVuY29kZSB0aGUgaWQgYW5kL29yIHNpemUgb2YgYW4gRUJNTCBlbGVtZW50IGJ5dGVzIGJ5IHNldHRpbmcgYSBsZWFkaW5nIGxlbmd0aCBkZXNjcmlwdG9yIGJpdDoKKy8vCisvLyAgIDF4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMS1ieXRlIHZhbHVlcworLy8gICAwMXh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMXh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMXh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAuLi4KKy8vICAgMDAwMDF4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAwMDF4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDAwMDF4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgIC0KKy8vICAgMDAwMDAwMDEgeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggLSA4LWJ5dGUgdmFsdWVzCisvLworLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBsZWFzdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBvc3NpYmxlLgordWludDY0X3QgZW5jb2RlVW5zaWduZWQodWludDY0X3QgdSkgeworICAgIHVpbnQ2NF90IHBvd2VyT2YyID0gX3Bvd2VyT2YyKHUpOworICAgIGlmICh1ICsgMSA9PSBwb3dlck9mMiA8PCAxKQorICAgICAgICBwb3dlck9mMiA8PD0gMTsKKyAgICBpbnQgc2hpZnRXaWR0aCA9ICg3ICsgbnVtYmVyT2ZUcmFpbGluZ1plcm9zKHBvd2VyT2YyKSkgLyA3ICogNzsKKyAgICBsb25nIGxlbmd0aERlc2NyaXB0b3IgPSAxIDw8IHNoaWZ0V2lkdGg7CisgICAgcmV0dXJuIGxlbmd0aERlc2NyaXB0b3IgfCB1OworfQorCisvLyBMaWtlIGFib3ZlIGJ1dCBwYWRzIHRoZSBpbnB1dCB2YWx1ZSB3aXRoIGxlYWRpbmcgemVyb3MgdXAgdG8gdGhlIHNwZWNpZmllZCB3aWR0aC4gVGhlIGxlbmd0aAorLy8gZGVzY3JpcHRvciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHdpZHRoLgordWludDY0X3QgZW5jb2RlVW5zaWduZWQodWludDY0X3QgdSwgaW50IHdpZHRoKSB7CisgICAgaW50IHNoaWZ0V2lkdGggPSA3ICogd2lkdGg7CisgICAgdWludDY0X3QgbGVuZ3RoRGVzY3JpcHRvciA9IDE7CisgICAgbGVuZ3RoRGVzY3JpcHRvciA8PD0gc2hpZnRXaWR0aDsKKyAgICByZXR1cm4gbGVuZ3RoRGVzY3JpcHRvciB8IHU7Cit9CisKKy8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGFuIEVCTUwgY29kZWQgaWQgb3Igc2l6ZSBmcm9tIGl0cyBsZW5ndGggZGVzY3JpcHRvci4KK2ludCBzaXplT2YodWludDY0X3QgdSkgeworICAgIHVpbnQ2NF90IHBvd2VyT2YyID0gX3Bvd2VyT2YyKHUpOworICAgIGludCB1bnNpZ25lZExlbmd0aCA9IG51bWJlck9mVHJhaWxpbmdaZXJvcyhwb3dlck9mMikgLyA4ICsgMTsKKyAgICByZXR1cm4gdW5zaWduZWRMZW5ndGg7Cit9CisKKy8vIFNlcmlhbGl6ZSBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgaW4gYmlnLWVuZGlhbiBvcmRlci4KK2ludCBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKHVpbnQ2NF90IHUsIHVpbnQ4X3QqIGJhcnkpIHsKKyAgICBpbnQgdW5zaWduZWRMZW5ndGggPSBzaXplT2YodSk7CisgICAgZm9yIChpbnQgaSA9IHVuc2lnbmVkTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgYmFyeVtpXSA9IHUgJiAweGZmOworICAgICAgICB1ID4+PSA4OworICAgIH0KKyAgICByZXR1cm4gdW5zaWduZWRMZW5ndGg7Cit9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjljMzdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEVCTUxVVElMX0hfCisjZGVmaW5lIEVCTUxVVElMX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHdlYm0geworCisvLyBFbmNvZGUgdGhlIGlkIGFuZC9vciBzaXplIG9mIGFuIEVCTUwgZWxlbWVudCBieXRlcyBieSBzZXR0aW5nIGEgbGVhZGluZyBsZW5ndGggZGVzY3JpcHRvciBiaXQ6CisvLworLy8gICAxeHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEtYnl0ZSB2YWx1ZXMKKy8vICAgMDF4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDF4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDF4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gLi4uCisvLyAgIDAwMDAxeHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAxeHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAwMDAxeCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAtCisvLyAgIDAwMDAwMDAxIHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IC0gOC1ieXRlIHZhbHVlcworLy8KKy8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGVhc3QgdGhlIG51bWJlciBvZiBieXRlcyBwb3NzaWJsZS4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUpOworCisvLyBMaWtlIGFib3ZlIGJ1dCBwYWRzIHRoZSBpbnB1dCB2YWx1ZSB3aXRoIGxlYWRpbmcgemVyb3MgdXAgdG8gdGhlIHNwZWNpZmllZCB3aWR0aC4gVGhlIGxlbmd0aAorLy8gZGVzY3JpcHRvciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHdpZHRoLgordWludDY0X3QgZW5jb2RlVW5zaWduZWQodWludDY0X3QgdSwgaW50IHdpZHRoKTsKKworLy8gU2VyaWFsaXplIGFuIEVCTUwgY29kZWQgaWQgb3Igc2l6ZSBpbiBiaWctZW5kaWFuIG9yZGVyLgoraW50IHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQodWludDY0X3QgdSwgdWludDhfdCogYmFyeSk7CisKKy8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGFuIEVCTUwgY29kZWQgaWQgb3Igc2l6ZSBmcm9tIGl0cyBsZW5ndGggZGVzY3JpcHRvci4KK2ludCBzaXplT2YodWludDY0X3QgdSk7CisKK30KKworI2VuZGlmIC8qIEVCTUxVVElMX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmE5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBMSU5LRURCTE9DS0lOR1FVRVVFX0hfCisjZGVmaW5lIExJTktFREJMT0NLSU5HUVVFVUVfSF8KKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBMaW5rZWRCbG9ja2luZ1F1ZXVlIHsKKyAgICBMaXN0PFQ+IG1MaXN0OworICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQ29udGVudEF2YWlsYWJsZUNvbmRpdGlvbjsKKworICAgIFQgZnJvbnQoYm9vbCByZW1vdmUpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgd2hpbGUgKG1MaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Db250ZW50QXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgICAgICB9CisgICAgICAgIFQgZSA9ICoobUxpc3QuYmVnaW4oKSk7CisgICAgICAgIGlmIChyZW1vdmUpIHsKKyAgICAgICAgICAgIG1MaXN0LmVyYXNlKG1MaXN0LmJlZ2luKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExpbmtlZEJsb2NraW5nUXVldWUpOworCitwdWJsaWM6CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSgpIHsKKyAgICB9CisKKyAgICB+TGlua2VkQmxvY2tpbmdRdWV1ZSgpIHsKKyAgICB9CisKKyAgICBib29sIGVtcHR5KCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICByZXR1cm4gbUxpc3QuZW1wdHkoKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICBtTGlzdC5jbGVhcigpOworICAgIH0KKworICAgIFQgcGVlaygpIHsKKyAgICAgICAgcmV0dXJuIGZyb250KGZhbHNlKTsKKyAgICB9CisKKyAgICBUIHRha2UoKSB7CisgICAgICAgIHJldHVybiBmcm9udCh0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2goVCBlKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgIG1MaXN0LnB1c2hfYmFjayhlKTsKKyAgICAgICAgbUNvbnRlbnRBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworI2VuZGlmIC8qIExJTktFREJMT0NLSU5HUVVFVUVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUNvbnN0YW50cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtQ29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzZjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUNvbnN0YW50cy5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXRUJNQ09OU1RBTlRTX0hfCisjZGVmaW5lIFdFQk1DT05TVEFOVFNfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2Ugd2VibSB7CisKK2NvbnN0IGludCBrTWluRWJtbFZvaWRTaXplID0gMjsKK2NvbnN0IGludDY0X3Qga01heE1ldGFTZWVrU2l6ZSA9IDY0OworY29uc3QgaW50NjRfdCBrTWt2VW5rbm93bkxlbmd0aCA9IDB4MDFmZmZmZmZmZmZmZmZmZmw7CisKKy8vIEVCTUwgZWxlbWVudCBpZCdzIGZyb20gaHR0cDovL21hdHJvc2thLm9yZy90ZWNobmljYWwvc3BlY3MvaW5kZXguaHRtbAorZW51bSBNa3YgeworICAgIGtNa3ZFYm1sID0gMHgxQTQ1REZBMywKKyAgICBrTWt2RWJtbFZlcnNpb24gPSAweDQyODYsCisgICAga01rdkVibWxSZWFkVmVyc2lvbiA9IDB4NDJGNywKKyAgICBrTWt2RWJtbE1heElkbGVuZ3RoID0gMHg0MkYyLAorICAgIGtNa3ZFYm1sTWF4U2l6ZUxlbmd0aCA9IDB4NDJGMywKKyAgICBrTWt2RG9jVHlwZSA9IDB4NDI4MiwKKyAgICBrTWt2RG9jVHlwZVZlcnNpb24gPSAweDQyODcsCisgICAga01rdkRvY1R5cGVSZWFkVmVyc2lvbiA9IDB4NDI4NSwKKyAgICBrTWt2Vm9pZCA9IDB4RUMsCisgICAga01rdlNpZ25hdHVyZVNsb3QgPSAweDFCNTM4NjY3LAorICAgIGtNa3ZTaWduYXR1cmVBbGdvID0gMHg3RThBLAorICAgIGtNa3ZTaWduYXR1cmVIYXNoID0gMHg3RTlBLAorICAgIGtNa3ZTaWduYXR1cmVQdWJsaWNLZXkgPSAweDdFQTUsCisgICAga01rdlNpZ25hdHVyZSA9IDB4N0VCNSwKKyAgICBrTWt2U2lnbmF0dXJlRWxlbWVudHMgPSAweDdFNUIsCisgICAga01rdlNpZ25hdHVyZUVsZW1lbnRMaXN0ID0gMHg3RTdCLAorICAgIGtNa3ZTaWduZWRFbGVtZW50ID0gMHg2NTMyLAorICAgIGtNa3ZTZWdtZW50ID0gMHgxODUzODA2NywKKyAgICBrTWt2U2Vla0hlYWQgPSAweDExNEQ5Qjc0LAorICAgIGtNa3ZTZWVrID0gMHg0REJCLAorICAgIGtNa3ZTZWVrSWQgPSAweDUzQUIsCisgICAga01rdlNlZWtQb3NpdGlvbiA9IDB4NTNBQywKKyAgICBrTWt2SW5mbyA9IDB4MTU0OUE5NjYsCisgICAga01rdlRpbWVjb2RlU2NhbGUgPSAweDJBRDdCMSwKKyAgICBrTWt2U2VnbWVudER1cmF0aW9uID0gMHg0NDg5LAorICAgIGtNa3ZEYXRlVXRjID0gMHg0NDYxLAorICAgIGtNa3ZNdXhpbmdBcHAgPSAweDREODAsCisgICAga01rdldyaXRpbmdBcHAgPSAweDU3NDEsCisgICAga01rdkNsdXN0ZXIgPSAweDFGNDNCNjc1LAorICAgIGtNa3ZUaW1lY29kZSA9IDB4RTcsCisgICAga01rdlByZXZTaXplID0gMHhBQiwKKyAgICBrTWt2QmxvY2tHcm91cCA9IDB4QTAsCisgICAga01rdkJsb2NrID0gMHhBMSwKKyAgICBrTWt2QmxvY2tBZGRpdGlvbnMgPSAweDc1QTEsCisgICAga01rdkJsb2NrTW9yZSA9IDB4QTYsCisgICAga01rdkJsb2NrQWRkSWQgPSAweEVFLAorICAgIGtNa3ZCbG9ja0FkZGl0aW9uYWwgPSAweEE1LAorICAgIGtNa3ZCbG9ja0R1cmF0aW9uID0gMHg5QiwKKyAgICBrTWt2UmVmZXJlbmNlQmxvY2sgPSAweEZCLAorICAgIGtNa3ZMYWNlTnVtYmVyID0gMHhDQywKKyAgICBrTWt2U2ltcGxlQmxvY2sgPSAweEEzLAorICAgIGtNa3ZUcmFja3MgPSAweDE2NTRBRTZCLAorICAgIGtNa3ZUcmFja0VudHJ5ID0gMHhBRSwKKyAgICBrTWt2VHJhY2tOdW1iZXIgPSAweEQ3LAorICAgIGtNa3ZUcmFja1VpZCA9IDB4NzNDNSwKKyAgICBrTWt2VHJhY2tUeXBlID0gMHg4MywKKyAgICBrTWt2RmxhZ0VuYWJsZWQgPSAweEI5LAorICAgIGtNa3ZGbGFnRGVmYXVsdCA9IDB4ODgsCisgICAga01rdkZsYWdGb3JjZWQgPSAweDU1QUEsCisgICAga01rdkZsYWdMYWNpbmcgPSAweDlDLAorICAgIGtNa3ZEZWZhdWx0RHVyYXRpb24gPSAweDIzRTM4MywKKyAgICBrTWt2TWF4QmxvY2tBZGRpdGlvbklkID0gMHg1NUVFLAorICAgIGtNa3ZOYW1lID0gMHg1MzZFLAorICAgIGtNa3ZMYW5ndWFnZSA9IDB4MjJCNTlDLAorICAgIGtNa3ZDb2RlY0lkID0gMHg4NiwKKyAgICBrTWt2Q29kZWNQcml2YXRlID0gMHg2M0EyLAorICAgIGtNa3ZDb2RlY05hbWUgPSAweDI1ODY4OCwKKyAgICBrTWt2VmlkZW8gPSAweEUwLAorICAgIGtNa3ZGbGFnSW50ZXJsYWNlZCA9IDB4OUEsCisgICAga01rdlN0ZXJlb01vZGUgPSAweDUzQjgsCisgICAga01rdkFscGhhTW9kZSA9IDB4NTNDMCwKKyAgICBrTWt2UGl4ZWxXaWR0aCA9IDB4QjAsCisgICAga01rdlBpeGVsSGVpZ2h0ID0gMHhCQSwKKyAgICBrTWt2UGl4ZWxDcm9wQm90dG9tID0gMHg1NEFBLAorICAgIGtNa3ZQaXhlbENyb3BUb3AgPSAweDU0QkIsCisgICAga01rdlBpeGVsQ3JvcExlZnQgPSAweDU0Q0MsCisgICAga01rdlBpeGVsQ3JvcFJpZ2h0ID0gMHg1NERELAorICAgIGtNa3ZEaXNwbGF5V2lkdGggPSAweDU0QjAsCisgICAga01rdkRpc3BsYXlIZWlnaHQgPSAweDU0QkEsCisgICAga01rdkRpc3BsYXlVbml0ID0gMHg1NEIyLAorICAgIGtNa3ZBc3BlY3RSYXRpb1R5cGUgPSAweDU0QjMsCisgICAga01rdkZyYW1lUmF0ZSA9IDB4MjM4M0UzLAorICAgIGtNa3ZBdWRpbyA9IDB4RTEsCisgICAga01rdlNhbXBsaW5nRnJlcXVlbmN5ID0gMHhCNSwKKyAgICBrTWt2T3V0cHV0U2FtcGxpbmdGcmVxdWVuY3kgPSAweDc4QjUsCisgICAga01rdkNoYW5uZWxzID0gMHg5RiwKKyAgICBrTWt2Qml0RGVwdGggPSAweDYyNjQsCisgICAga01rdkN1ZXMgPSAweDFDNTNCQjZCLAorICAgIGtNa3ZDdWVQb2ludCA9IDB4QkIsCisgICAga01rdkN1ZVRpbWUgPSAweEIzLAorICAgIGtNa3ZDdWVUcmFja1Bvc2l0aW9ucyA9IDB4QjcsCisgICAga01rdkN1ZVRyYWNrID0gMHhGNywKKyAgICBrTWt2Q3VlQ2x1c3RlclBvc2l0aW9uID0gMHhGMSwKKyAgICBrTWt2Q3VlQmxvY2tOdW1iZXIgPSAweDUzNzgKK307CisKK2VudW0gVHJhY2tUeXBlcyB7CisgICAga0ludmFsaWRUeXBlID0gLTEsCisgICAga1ZpZGVvVHlwZSA9IDB4MSwKKyAgICBrQXVkaW9UeXBlID0gMHgyLAorICAgIGtDb21wbGV4VHlwZSA9IDB4MywKKyAgICBrTG9nb1R5cGUgPSAweDEwLAorICAgIGtTdWJ0aXRsZVR5cGUgPSAweDExLAorICAgIGtCdXR0b25zVHlwZSA9IDB4MTIsCisgICAga0NvbnRyb2xUeXBlID0gMHgyMAorfTsKKworZW51bSBUcmFja051bSB7CisgICAga1ZpZGVvVHJhY2tOdW0gPSAweDEsCisgICAga0F1ZGlvVHJhY2tOdW0gPSAweDIKK307Cit9CisKKyNlbmRpZiAvKiBXRUJNQ09OU1RBTlRTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDhjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1FbGVtZW50IgorCisjaW5jbHVkZSAiRWJtbFV0aWwuaCIKKyNpbmNsdWRlICJXZWJtRWxlbWVudC5oIgorI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugd2VibTsKKworbmFtZXNwYWNlIHsKKworaW50NjRfdCB2b2lkU2l6ZShpbnQ2NF90IHRvdGFsU2l6ZSkgeworICAgIGlmICh0b3RhbFNpemUgPCAyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHRvdGFsU2l6ZSA8IDkpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZSAtIDI7CisgICAgfQorICAgIHJldHVybiB0b3RhbFNpemUgLSA5OworfQorCit1aW50NjRfdCBjaGlsZHJlblN1bShjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbikgeworICAgIHVpbnQ2NF90IHRvdGFsID0gMDsKKyAgICBmb3IgKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IGNoaWxkcmVuLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHRvdGFsICs9ICgqaXQpLT50b3RhbFNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCit2b2lkIHBvcHVsYXRlQ29tbW9uVHJhY2tFbnRyaWVzKAorICAgICAgICBpbnQgbnVtLAorICAgICAgICB1aW50NjRfdCB1aWQsCisgICAgICAgIGJvb2wgbGFjaW5nLAorICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICBjb25zdCBjaGFyICpjb2RlYywKKyAgICAgICAgVHJhY2tUeXBlcyB0eXBlLAorICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+ICZscykgeworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZUcmFja051bWJlciwgbnVtKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRyYWNrVWlkLCB1aWQpKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RmxhZ0xhY2luZywgbGFjaW5nKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZMYW5ndWFnZSwgbGFuZykpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2Q29kZWNJZCwgY29kZWMpKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2VHJhY2tUeXBlLCB0eXBlKSk7Cit9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworV2VibUVsZW1lbnQ6OldlYm1FbGVtZW50KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBzaXplKQorICAgIDogbUlkKGlkKSwgbVNpemUoc2l6ZSkgeworfQorCitXZWJtRWxlbWVudDo6fldlYm1FbGVtZW50KCkgeworfQorCitpbnQgV2VibUVsZW1lbnQ6OnNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1ZikgeworICAgIHJldHVybiBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGVuY29kZVVuc2lnbmVkKG1TaXplKSwgYnVmKTsKK30KKwordWludDY0X3QgV2VibUVsZW1lbnQ6OnNlcmlhbGl6ZUludG8odWludDhfdCAqYnVmKSB7CisgICAgdWludDhfdCAqY3VyID0gYnVmOworICAgIGludCBoZWFkID0gc2VyaWFsaXplQ29kZWRVbnNpZ25lZChtSWQsIGN1cik7CisgICAgY3VyICs9IGhlYWQ7CisgICAgaW50IG5lY2sgPSBzZXJpYWxpemVQYXlsb2FkU2l6ZShjdXIpOworICAgIGN1ciArPSBuZWNrOworICAgIHNlcmlhbGl6ZVBheWxvYWQoY3VyKTsKKyAgICBjdXIgKz0gbVNpemU7CisgICAgcmV0dXJuIGN1ciAtIGJ1ZjsKK30KKwordWludDY0X3QgV2VibUVsZW1lbnQ6OnRvdGFsU2l6ZSgpIHsKKyAgICB1aW50OF90IGJ1Zls4XTsKKyAgICAvLy4uLi4uLi4uLi4uLi4uLiArIHNpemVPZihlbmNvZGVVbnNpZ25lZChzaXplKSkKKyAgICByZXR1cm4gc2l6ZU9mKG1JZCkgKyBzZXJpYWxpemVQYXlsb2FkU2l6ZShidWYpICsgbVNpemU7Cit9CisKK3VpbnQ4X3QgKldlYm1FbGVtZW50OjpzZXJpYWxpemUodWludDY0X3QmIHNpemUpIHsKKyAgICBzaXplID0gdG90YWxTaXplKCk7CisgICAgdWludDhfdCAqYnVmID0gbmV3IHVpbnQ4X3Rbc2l6ZV07CisgICAgc2VyaWFsaXplSW50byhidWYpOworICAgIHJldHVybiBidWY7Cit9CisKK2ludCBXZWJtRWxlbWVudDo6d3JpdGUoaW50IGZkLCB1aW50NjRfdCYgc2l6ZSkgeworICAgIHVpbnQ4X3QgYnVmWzhdOworICAgIHNpemUgPSB0b3RhbFNpemUoKTsKKyAgICBvZmY2NF90IG9mZiA9IDo6bHNlZWs2NChmZCwgKHNpemUgLSAxKSwgU0VFS19DVVIpIC0gKHNpemUgLSAxKTsKKyAgICA6OndyaXRlKGZkLCBidWYsIDEpOyAvLyBleHRlbmQgZmlsZQorCisgICAgb2ZmNjRfdCBjdXJPZmYgPSBvZmYgKyBzaXplOworICAgIG9mZjY0X3QgYWxpZ25lZE9mZiA9IG9mZiAmIH4oOjpzeXNjb25mKF9TQ19QQUdFX1NJWkUpIC0gMSk7CisgICAgb2ZmNjRfdCBtYXBTaXplID0gY3VyT2ZmIC0gYWxpZ25lZE9mZjsKKyAgICBvZmY2NF90IHBhZ2VPZmYgPSBvZmYgLSBhbGlnbmVkT2ZmOworICAgIHZvaWQgKmRzdCA9IDo6bW1hcDY0KE5VTEwsIG1hcFNpemUsIFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCBhbGlnbmVkT2ZmKTsKKyAgICBpZiAoZHN0ID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgQUxPR0UoIm1tYXA2NCBmYWlsZWQ7IGVycm5vID0gJWQiLCBlcnJubyk7CisgICAgICAgIEFMT0dFKCJmZCAlZDsgZmxhZ3M6ICVvIiwgZmQsIDo6ZmNudGwoZmQsIEZfR0VURkwsIDApKTsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlcmlhbGl6ZUludG8oKHVpbnQ4X3QqKSBkc3QgKyBwYWdlT2ZmKTsKKyAgICAgICAgOjptc3luYyhkc3QsIG1hcFNpemUsIE1TX1NZTkMpOworICAgICAgICByZXR1cm4gOjptdW5tYXAoZHN0LCBtYXBTaXplKTsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtVW5zaWduZWQ6OldlYm1VbnNpZ25lZCh1aW50NjRfdCBpZCwgdWludDY0X3QgdmFsdWUpCisgICAgOiBXZWJtRWxlbWVudChpZCwgc2l6ZU9mKHZhbHVlKSksIG1WYWx1ZSh2YWx1ZSkgeworfQorCit2b2lkIFdlYm1VbnNpZ25lZDo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKG1WYWx1ZSwgYnVmKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1GbG9hdDo6V2VibUZsb2F0KHVpbnQ2NF90IGlkLCBkb3VibGUgdmFsdWUpCisgICAgOiBXZWJtRWxlbWVudChpZCwgc2l6ZW9mKGRvdWJsZSkpLCBtVmFsdWUodmFsdWUpIHsKK30KKworV2VibUZsb2F0OjpXZWJtRmxvYXQodWludDY0X3QgaWQsIGZsb2F0IHZhbHVlKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHNpemVvZihmbG9hdCkpLCBtVmFsdWUodmFsdWUpIHsKK30KKwordm9pZCBXZWJtRmxvYXQ6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgdWludDY0X3QgZGF0YTsKKyAgICBpZiAobVNpemUgPT0gc2l6ZW9mKGZsb2F0KSkgeworICAgICAgICBmbG9hdCBmID0gbVZhbHVlOworICAgICAgICBkYXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oJm1WYWx1ZSk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSBtU2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGJ1ZltpXSA9IGRhdGEgJiAweGZmOworICAgICAgICBkYXRhID4+PSA4OworICAgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1CaW5hcnk6OldlYm1CaW5hcnkodWludDY0X3QgaWQsIGNvbnN0IHNwPEFCdWZmZXI+ICZyZWYpCisgICAgOiBXZWJtRWxlbWVudChpZCwgcmVmLT5zaXplKCkpLCBtUmVmKHJlZikgeworfQorCit2b2lkIFdlYm1CaW5hcnk6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgbWVtY3B5KGJ1ZiwgbVJlZi0+ZGF0YSgpLCBtUmVmLT5zaXplKCkpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibVN0cmluZzo6V2VibVN0cmluZyh1aW50NjRfdCBpZCwgY29uc3QgY2hhciAqc3RyKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHN0cmxlbihzdHIpKSwgbVN0cihzdHIpIHsKK30KKwordm9pZCBXZWJtU3RyaW5nOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIG1lbWNweShidWYsIG1TdHIsIHN0cmxlbihtU3RyKSk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtU2ltcGxlQmxvY2s6OldlYm1TaW1wbGVCbG9jaygKKyAgICAgICAgaW50IHRyYWNrTnVtLAorICAgICAgICBpbnQxNl90IHJlbFRpbWVjb2RlLAorICAgICAgICBib29sIGtleSwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4mIG9yaWcpCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiB0cmFja051bSoxICsgdGltZWNvZGUqMiArIGZsYWdzKjEKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eCisgICAgLy8gT25seSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiB0cmFja051bSBpcyBlbmNvZGVkCisgICAgOiBXZWJtRWxlbWVudChrTWt2U2ltcGxlQmxvY2ssIG9yaWctPnNpemUoKSArIDQpLAorICAgICAgbVRyYWNrTnVtKHRyYWNrTnVtKSwKKyAgICAgIG1SZWxUaW1lY29kZShyZWxUaW1lY29kZSksCisgICAgICBtS2V5KGtleSksCisgICAgICBtUmVmKG9yaWcpIHsKK30KKwordm9pZCBXZWJtU2ltcGxlQmxvY2s6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgc2VyaWFsaXplQ29kZWRVbnNpZ25lZChlbmNvZGVVbnNpZ25lZChtVHJhY2tOdW0pLCBidWYpOworICAgIGJ1ZlsxXSA9IChtUmVsVGltZWNvZGUgJiAweGZmMDApID4+IDg7CisgICAgYnVmWzJdID0gbVJlbFRpbWVjb2RlICYgMHhmZjsKKyAgICBidWZbM10gPSBtS2V5ID8gMHg4MCA6IDA7CisgICAgbWVtY3B5KGJ1ZiArIDQsIG1SZWYtPmRhdGEoKSwgbVNpemUgLSA0KTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0VibWxWb2lkOjpFYm1sVm9pZCh1aW50NjRfdCB0b3RhbFNpemUpCisgICAgOiBXZWJtRWxlbWVudChrTWt2Vm9pZCwgdm9pZFNpemUodG90YWxTaXplKSksCisgICAgICBtU2l6ZVdpZHRoKHRvdGFsU2l6ZSAtIHNpemVPZihrTWt2Vm9pZCkgLSB2b2lkU2l6ZSh0b3RhbFNpemUpKSB7CisgICAgQ0hFQ0tfR0Uodm9pZFNpemUodG90YWxTaXplKSwgMCk7Cit9CisKK2ludCBFYm1sVm9pZDo6c2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKSB7CisgICAgcmV0dXJuIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoZW5jb2RlVW5zaWduZWQobVNpemUsIG1TaXplV2lkdGgpLCBidWYpOworfQorCit2b2lkIEVibWxWb2lkOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIDo6bWVtc2V0KGJ1ZiwgMCwgbVNpemUpOworICAgIHJldHVybjsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1NYXN0ZXI6OldlYm1NYXN0ZXIodWludDY0X3QgaWQsIGNvbnN0IExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKQorICAgIDogV2VibUVsZW1lbnQoaWQsIGNoaWxkcmVuU3VtKGNoaWxkcmVuKSksIG1DaGlsZHJlbihjaGlsZHJlbikgeworfQorCitXZWJtTWFzdGVyOjpXZWJtTWFzdGVyKHVpbnQ2NF90IGlkKQorICAgIDogV2VibUVsZW1lbnQoaWQsIDApIHsKK30KKworaW50IFdlYm1NYXN0ZXI6OnNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1ZikgeworICAgIGlmIChtU2l6ZSA9PSAwKXsKKyAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoa01rdlVua25vd25MZW5ndGgsIGJ1Zik7CisgICAgfQorICAgIHJldHVybiBXZWJtRWxlbWVudDo6c2VyaWFsaXplUGF5bG9hZFNpemUoYnVmKTsKK30KKwordm9pZCBXZWJtTWFzdGVyOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHVpbnQ2NF90IG9mZiA9IDA7CisgICAgZm9yIChMaXN0PHNwPFdlYm1FbGVtZW50PiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1DaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBtQ2hpbGRyZW4uZW5kKCk7CisgICAgICAgICAgICArK2l0KSB7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBjaGlsZCA9ICgqaXQpOworICAgICAgICBjaGlsZC0+c2VyaWFsaXplSW50byhidWYgKyBvZmYpOworICAgICAgICBvZmYgKz0gY2hpbGQtPnRvdGFsU2l6ZSgpOworICAgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6Q3VlUG9pbnRFbnRyeSh1aW50NjRfdCB0aW1lLCBpbnQgdHJhY2ssIHVpbnQ2NF90IG9mZikgeworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gY3VlUG9pbnRFbnRyeUZpZWxkczsKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZDdWVUcmFjaywgdHJhY2spKTsKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZDdWVDbHVzdGVyUG9zaXRpb24sIG9mZikpOworICAgIFdlYm1FbGVtZW50ICpjdWVUcmFja1Bvc2l0aW9ucyA9IG5ldyBXZWJtTWFzdGVyKGtNa3ZDdWVUcmFja1Bvc2l0aW9ucywgY3VlUG9pbnRFbnRyeUZpZWxkcyk7CisKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLmNsZWFyKCk7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q3VlVGltZSwgdGltZSkpOworICAgIGN1ZVBvaW50RW50cnlGaWVsZHMucHVzaF9iYWNrKGN1ZVRyYWNrUG9zaXRpb25zKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdkN1ZVBvaW50LCBjdWVQb2ludEVudHJ5RmllbGRzKTsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpTZWVrRW50cnkodWludDY0X3QgaWQsIHVpbnQ2NF90IG9mZikgeworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gc2Vla0VudHJ5RmllbGRzOworICAgIHNlZWtFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2U2Vla0lkLCBpZCkpOworICAgIHNlZWtFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2U2Vla1Bvc2l0aW9uLCBvZmYpKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdlNlZWssIHNlZWtFbnRyeUZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6RWJtbEhlYWRlcigKKyAgICAgICAgaW50IHZlciwKKyAgICAgICAgaW50IHJlYWRWZXIsCisgICAgICAgIGludCBtYXhJZExlbiwKKyAgICAgICAgaW50IG1heFNpemVMZW4sCisgICAgICAgIGludCBkb2NWZXIsCisgICAgICAgIGludCBkb2NSZWFkVmVyKSB7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBoZWFkZXJGaWVsZHM7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sVmVyc2lvbiwgdmVyKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sUmVhZFZlcnNpb24sIHJlYWRWZXIpKTsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkVibWxNYXhJZGxlbmd0aCwgbWF4SWRMZW4pKTsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkVibWxNYXhTaXplTGVuZ3RoLCBtYXhTaXplTGVuKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2RG9jVHlwZSwgIndlYm0iKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZEb2NUeXBlVmVyc2lvbiwgZG9jVmVyKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZEb2NUeXBlUmVhZFZlcnNpb24sIGRvY1JlYWRWZXIpKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdkVibWwsIGhlYWRlckZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6U2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUsIGRvdWJsZSBkdXIpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHNlZ21lbnRJbmZvOworICAgIC8vIHBsYWNlIGR1cmF0aW9uIGZpcnN0OyBlYXNpZXIgdG8gcGF0Y2gKKyAgICBzZWdtZW50SW5mby5wdXNoX2JhY2sobmV3IFdlYm1GbG9hdChrTWt2U2VnbWVudER1cmF0aW9uLCBkdXIpKTsKKyAgICBzZWdtZW50SW5mby5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2VGltZWNvZGVTY2FsZSwgc2NhbGUpKTsKKyAgICBzZWdtZW50SW5mby5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdk11eGluZ0FwcCwgImFuZHJvaWQiKSk7CisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZXcml0aW5nQXBwLCAiYW5kcm9pZCIpKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdkluZm8sIHNlZ21lbnRJbmZvKTsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgIGludCBjaGFucywKKyAgICAgICAgZG91YmxlIHJhdGUsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYsCisgICAgICAgIGludCBicHMsCisgICAgICAgIHVpbnQ2NF90IHVpZCwKKyAgICAgICAgYm9vbCBsYWNpbmcsCisgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcpIHsKKyAgICBpZiAodWlkID09IDApIHsKKyAgICAgICAgdWlkID0ga0F1ZGlvVHJhY2tOdW07CisgICAgfQorCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiB0cmFja0VudHJ5RmllbGRzOworICAgIHBvcHVsYXRlQ29tbW9uVHJhY2tFbnRyaWVzKAorICAgICAgICAgICAga0F1ZGlvVHJhY2tOdW0sCisgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICBsYWNpbmcsCisgICAgICAgICAgICBsYW5nLAorICAgICAgICAgICAgIkFfVk9SQklTIiwKKyAgICAgICAgICAgIGtBdWRpb1R5cGUsCisgICAgICAgICAgICB0cmFja0VudHJ5RmllbGRzKTsKKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gYXVkaW9JbmZvOworICAgIGF1ZGlvSW5mby5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q2hhbm5lbHMsIGNoYW5zKSk7CisgICAgYXVkaW9JbmZvLnB1c2hfYmFjayhuZXcgV2VibUZsb2F0KGtNa3ZTYW1wbGluZ0ZyZXF1ZW5jeSwgcmF0ZSkpOworICAgIGlmIChicHMpIHsKKyAgICAgICAgV2VibUVsZW1lbnQgKmJpdERlcHRoID0gbmV3IFdlYm1VbnNpZ25lZChrTWt2Qml0RGVwdGgsIGJwcyk7CisgICAgICAgIGF1ZGlvSW5mby5wdXNoX2JhY2soYml0RGVwdGgpOworICAgIH0KKworICAgIHRyYWNrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtTWFzdGVyKGtNa3ZBdWRpbywgYXVkaW9JbmZvKSk7CisgICAgdHJhY2tFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1CaW5hcnkoa01rdkNvZGVjUHJpdmF0ZSwgYnVmKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZUcmFja0VudHJ5LCB0cmFja0VudHJ5RmllbGRzKTsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpWaWRlb1RyYWNrRW50cnkoCisgICAgICAgIHVpbnQ2NF90IHdpZHRoLAorICAgICAgICB1aW50NjRfdCBoZWlnaHQsCisgICAgICAgIHVpbnQ2NF90IHVpZCwKKyAgICAgICAgYm9vbCBsYWNpbmcsCisgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcpIHsKKyAgICBpZiAodWlkID09IDApIHsKKyAgICAgICAgdWlkID0ga1ZpZGVvVHJhY2tOdW07CisgICAgfQorCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiB0cmFja0VudHJ5RmllbGRzOworICAgIHBvcHVsYXRlQ29tbW9uVHJhY2tFbnRyaWVzKAorICAgICAgICAgICAga1ZpZGVvVHJhY2tOdW0sCisgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICBsYWNpbmcsCisgICAgICAgICAgICBsYW5nLAorICAgICAgICAgICAgIlZfVlA4IiwKKyAgICAgICAgICAgIGtWaWRlb1R5cGUsCisgICAgICAgICAgICB0cmFja0VudHJ5RmllbGRzKTsKKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gdmlkZW9JbmZvOworICAgIHZpZGVvSW5mby5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2UGl4ZWxXaWR0aCwgd2lkdGgpKTsKKyAgICB2aWRlb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlBpeGVsSGVpZ2h0LCBoZWlnaHQpKTsKKworICAgIHRyYWNrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtTWFzdGVyKGtNa3ZWaWRlbywgdmlkZW9JbmZvKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZUcmFja0VudHJ5LCB0cmFja0VudHJ5RmllbGRzKTsKK30KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk5MzNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXRUJNRUxFTUVOVF9IXworI2RlZmluZSBXRUJNRUxFTUVOVF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBXZWJtRWxlbWVudCA6IHB1YmxpYyBMaWdodFJlZkJhc2U8V2VibUVsZW1lbnQ+IHsKKyAgICBjb25zdCB1aW50NjRfdCBtSWQsIG1TaXplOworCisgICAgV2VibUVsZW1lbnQodWludDY0X3QgaWQsIHVpbnQ2NF90IHNpemUpOworICAgIHZpcnR1YWwgfldlYm1FbGVtZW50KCk7CisKKyAgICB2aXJ0dWFsIGludCBzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpOworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik9MDsKKyAgICB1aW50NjRfdCB0b3RhbFNpemUoKTsKKyAgICB1aW50NjRfdCBzZXJpYWxpemVJbnRvKHVpbnQ4X3QgKmJ1Zik7CisgICAgdWludDhfdCAqc2VyaWFsaXplKHVpbnQ2NF90JiBzaXplKTsKKyAgICBpbnQgd3JpdGUoaW50IGZkLCB1aW50NjRfdCYgc2l6ZSk7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEVibWxIZWFkZXIoCisgICAgICAgICAgICBpbnQgdmVyID0gMSwKKyAgICAgICAgICAgIGludCByZWFkVmVyID0gMSwKKyAgICAgICAgICAgIGludCBtYXhJZExlbiA9IDQsCisgICAgICAgICAgICBpbnQgbWF4U2l6ZUxlbiA9IDgsCisgICAgICAgICAgICBpbnQgZG9jVmVyID0gMiwKKyAgICAgICAgICAgIGludCBkb2NSZWFkVmVyID0gMik7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFNlZ21lbnRJbmZvKHVpbnQ2NF90IHNjYWxlID0gMTAwMDAwMCwgZG91YmxlIGR1ciA9IDApOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBBdWRpb1RyYWNrRW50cnkoCisgICAgICAgICAgICBpbnQgY2hhbnMsCisgICAgICAgICAgICBkb3VibGUgcmF0ZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYsCisgICAgICAgICAgICBpbnQgYnBzID0gMCwKKyAgICAgICAgICAgIHVpbnQ2NF90IHVpZCA9IDAsCisgICAgICAgICAgICBib29sIGxhY2luZyA9IGZhbHNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZyA9ICJ1bmQiKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gVmlkZW9UcmFja0VudHJ5KAorICAgICAgICAgICAgdWludDY0X3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50NjRfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50NjRfdCB1aWQgPSAwLAorICAgICAgICAgICAgYm9vbCBsYWNpbmcgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcgPSAidW5kIik7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFNlZWtFbnRyeSh1aW50NjRfdCBpZCwgdWludDY0X3Qgb2ZmKTsKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEN1ZVBvaW50RW50cnkodWludDY0X3QgdGltZSwgaW50IHRyYWNrLCB1aW50NjRfdCBvZmYpOworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2ltcGxlQmxvY2soCisgICAgICAgICAgICBpbnQgdHJhY2tOdW0sCisgICAgICAgICAgICBpbnQxNl90IHRpbWVjb2RlLAorICAgICAgICAgICAgYm9vbCBrZXksCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgdWludDY0X3QgZGF0YVNpemUpOworfTsKKworc3RydWN0IFdlYm1VbnNpZ25lZCA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgV2VibVVuc2lnbmVkKHVpbnQ2NF90IGlkLCB1aW50NjRfdCB2YWx1ZSk7CisgICAgY29uc3QgdWludDY0X3QgbVZhbHVlOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1GbG9hdCA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgZG91YmxlIG1WYWx1ZTsKKyAgICBXZWJtRmxvYXQodWludDY0X3QgaWQsIGZsb2F0IHZhbHVlKTsKKyAgICBXZWJtRmxvYXQodWludDY0X3QgaWQsIGRvdWJsZSB2YWx1ZSk7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibUJpbmFyeSA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gbVJlZjsKKyAgICBXZWJtQmluYXJ5KHVpbnQ2NF90IGlkLCBjb25zdCBzcDxBQnVmZmVyPiAmcmVmKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtU3RyaW5nIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBjaGFyICpjb25zdCBtU3RyOworICAgIFdlYm1TdHJpbmcodWludDY0X3QgaWQsIGNvbnN0IGNoYXIgKnN0cik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibVNpbXBsZUJsb2NrIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBpbnQgbVRyYWNrTnVtOworICAgIGNvbnN0IGludDE2X3QgbVJlbFRpbWVjb2RlOworICAgIGNvbnN0IGJvb2wgbUtleTsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiBtUmVmOworCisgICAgV2VibVNpbXBsZUJsb2NrKGludCB0cmFja051bSwgaW50MTZfdCB0aW1lY29kZSwgYm9vbCBrZXksIGNvbnN0IHNwPEFCdWZmZXI+JiBvcmlnKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBFYm1sVm9pZCA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgdWludDY0X3QgbVNpemVXaWR0aDsKKyAgICBFYm1sVm9pZCh1aW50NjRfdCB0b3RhbFNpemUpOworICAgIGludCBzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1NYXN0ZXIgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gbUNoaWxkcmVuOworICAgIFdlYm1NYXN0ZXIodWludDY0X3QgaWQpOworICAgIFdlYm1NYXN0ZXIodWludDY0X3QgaWQsIGNvbnN0IExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gJmNoaWxkcmVuKTsKKyAgICBpbnQgc2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKyNlbmRpZiAvKiBXRUJNRUxFTUVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTM0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV2VibUZyYW1lIgorCisjaW5jbHVkZSAiV2VibUZyYW1lLmgiCisjaW5jbHVkZSAiV2VibUNvbnN0YW50cy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugd2VibTsKKworbmFtZXNwYWNlIHsKK3NwPEFCdWZmZXI+IHRvQUJ1ZmZlcihNZWRpYUJ1ZmZlciAqbWJ1ZikgeworICAgIHNwPEFCdWZmZXI+IGFidWYgPSBuZXcgQUJ1ZmZlcihtYnVmLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgbWVtY3B5KGFidWYtPmRhdGEoKSwgKHVpbnQ4X3QqKSBtYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIHJldHVybiBhYnVmOworfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IHNwPFdlYm1GcmFtZT4gV2VibUZyYW1lOjpFT1MgPSBuZXcgV2VibUZyYW1lKCk7CisKK1dlYm1GcmFtZTo6V2VibUZyYW1lKCkKKyAgICA6IG1UeXBlKGtJbnZhbGlkVHlwZSksCisgICAgICBtS2V5KGZhbHNlKSwKKyAgICAgIG1BYnNUaW1lY29kZShVSU5UNjRfTUFYKSwKKyAgICAgIG1EYXRhKG5ldyBBQnVmZmVyKDApKSwKKyAgICAgIG1Fb3ModHJ1ZSkgeworfQorCitXZWJtRnJhbWU6OldlYm1GcmFtZShpbnQgdHlwZSwgYm9vbCBrZXksIHVpbnQ2NF90IGFic1RpbWVjb2RlLCBNZWRpYUJ1ZmZlciAqbWJ1ZikKKyAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgbUtleShrZXkpLAorICAgICAgbUFic1RpbWVjb2RlKGFic1RpbWVjb2RlKSwKKyAgICAgIG1EYXRhKHRvQUJ1ZmZlcihtYnVmKSksCisgICAgICBtRW9zKGZhbHNlKSB7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRnJhbWU6OlNpbXBsZUJsb2NrKHVpbnQ2NF90IGJhc2VUaW1lY29kZSkgY29uc3QgeworICAgIHJldHVybiBuZXcgV2VibVNpbXBsZUJsb2NrKAorICAgICAgICAgICAgbVR5cGUgPT0ga1ZpZGVvVHlwZSA/IGtWaWRlb1RyYWNrTnVtIDoga0F1ZGlvVHJhY2tOdW0sCisgICAgICAgICAgICBtQWJzVGltZWNvZGUgLSBiYXNlVGltZWNvZGUsCisgICAgICAgICAgICBtS2V5LAorICAgICAgICAgICAgbURhdGEpOworfQorCitib29sIFdlYm1GcmFtZTo6b3BlcmF0b3I8KGNvbnN0IFdlYm1GcmFtZSAmb3RoZXIpIGNvbnN0IHsKKyAgICBpZiAodGhpcy0+bUVvcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChvdGhlci5tRW9zKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAodGhpcy0+bUFic1RpbWVjb2RlID09IG90aGVyLm1BYnNUaW1lY29kZSkgeworICAgICAgICBpZiAodGhpcy0+bVR5cGUgPT0ga0F1ZGlvVHlwZSAmJiBvdGhlci5tVHlwZSA9PSBrVmlkZW9UeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy0+bVR5cGUgPT0ga1ZpZGVvVHlwZSAmJiBvdGhlci5tVHlwZSA9PSBrQXVkaW9UeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdGhpcy0+bUFic1RpbWVjb2RlIDwgb3RoZXIubUFic1RpbWVjb2RlOworfQorfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwYjA1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUZSQU1FX0hfCisjZGVmaW5lIFdFQk1GUkFNRV9IXworCisjaW5jbHVkZSAiV2VibUVsZW1lbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgV2VibUZyYW1lIDogTGlnaHRSZWZCYXNlPFdlYm1GcmFtZT4geworcHVibGljOgorICAgIGNvbnN0IGludCBtVHlwZTsKKyAgICBjb25zdCBib29sIG1LZXk7CisgICAgY29uc3QgdWludDY0X3QgbUFic1RpbWVjb2RlOworICAgIGNvbnN0IHNwPEFCdWZmZXI+IG1EYXRhOworICAgIGNvbnN0IGJvb2wgbUVvczsKKworICAgIFdlYm1GcmFtZSgpOworICAgIFdlYm1GcmFtZShpbnQgdHlwZSwgYm9vbCBrZXksIHVpbnQ2NF90IGFic1RpbWVjb2RlLCBNZWRpYUJ1ZmZlciAqYnVmKTsKKyAgICB+V2VibUZyYW1lKCkge30KKworICAgIHNwPFdlYm1FbGVtZW50PiBTaW1wbGVCbG9jayh1aW50NjRfdCBiYXNlVGltZWNvZGUpIGNvbnN0OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgV2VibUZyYW1lICZvdGhlcikgY29uc3Q7CisKKyAgICBzdGF0aWMgY29uc3Qgc3A8V2VibUZyYW1lPiBFT1M7Citwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdlYm1GcmFtZSk7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisjZW5kaWYgLyogV0VCTUZSQU1FX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiOGE0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcApAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV2VibUZyYW1lVGhyZWFkIgorCisjaW5jbHVkZSAiV2VibUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIldlYm1GcmFtZVRocmVhZC5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCAqV2VibUZyYW1lVGhyZWFkOjp3cmFwKHZvaWQgKmFyZykgeworICAgIFdlYm1GcmFtZVRocmVhZCAqd29ya2VyID0gcmVpbnRlcnByZXRfY2FzdDxXZWJtRnJhbWVUaHJlYWQqPihhcmcpOworICAgIHdvcmtlci0+cnVuKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZVRocmVhZDo6c3RhcnQoKSB7CisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBXZWJtRnJhbWVUaHJlYWQ6OndyYXAsIHRoaXMpOworICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZVRocmVhZDo6c3RvcCgpIHsKKyAgICB2b2lkICpzdGF0dXM7CisgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZzdGF0dXMpOworICAgIHJldHVybiAoc3RhdHVzX3QpKGludHB0cl90KXN0YXR1czsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1GcmFtZVNvdXJjZVRocmVhZDo6V2VibUZyYW1lU291cmNlVGhyZWFkKAorICAgIGludCB0eXBlLAorICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rKQorICAgIDogbVR5cGUodHlwZSksIG1TaW5rKHNpbmspIHsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1GcmFtZVNpbmtUaHJlYWQ6OldlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgIGNvbnN0IGludCYgZmQsCisgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gdmlkZW9UaHJlYWQsCisgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gYXVkaW9UaHJlYWQsCisgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGN1ZXMpCisgICAgOiBtRmQoZmQpLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQob2ZmKSwKKyAgICAgIG1WaWRlb0ZyYW1lcyh2aWRlb1RocmVhZC0+bVNpbmspLAorICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvVGhyZWFkLT5tU2luayksCisgICAgICBtQ3VlcyhjdWVzKSwKKyAgICAgIG1Eb25lKHRydWUpIHsKK30KKworV2VibUZyYW1lU2lua1RocmVhZDo6V2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgY29uc3QgaW50JiBmZCwKKyAgICAgICAgY29uc3QgdWludDY0X3QmIG9mZiwKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHZpZGVvU291cmNlLAorICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgYXVkaW9Tb3VyY2UsCisgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGN1ZXMpCisgICAgOiBtRmQoZmQpLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQob2ZmKSwKKyAgICAgIG1WaWRlb0ZyYW1lcyh2aWRlb1NvdXJjZSksCisgICAgICBtQXVkaW9GcmFtZXMoYXVkaW9Tb3VyY2UpLAorICAgICAgbUN1ZXMoY3VlcyksCisgICAgICBtRG9uZSh0cnVlKSB7Cit9CisKKy8vIEluaXRpYWxpemVzIGEgd2VibSBjbHVzdGVyIHdpdGggaXRzIHN0YXJ0aW5nIHRpbWVjb2RlLgorLy8KKy8vIGZyYW1lczoKKy8vICAgc2VxdWVuY2Ugb2YgaW5wdXQgYXVkaW8vdmlkZW8gZnJhbWVzIHJlY2VpdmVkIGZyb20gdGhlIHNvdXJjZS4KKy8vCisvLyBjbHVzdGVyVGltZWNvZGVMOgorLy8gICB0aGUgc3RhcnRpbmcgdGltZWNvZGUgb2YgdGhlIGNsdXN0ZXI7IHRoaXMgaXMgdGhlIHRpbWVjb2RlIG9mIHRoZSBmaXJzdAorLy8gICBmcmFtZSBzaW5jZSBmcmFtZXMgYXJlIG9yZGVyZWQgYnkgdGltZXN0YW1wLgorLy8KKy8vIGNoaWxkcmVuOgorLy8gICBsaXN0IHRvIGhvbGQgY2hpbGQgZWxlbWVudHMgaW4gYSB3ZWJtIGNsdXN0ZXIgKHN0YXJ0IHRpbWVjb2RlIGFuZAorLy8gICBzaW1wbGUgYmxvY2tzKS4KKy8vCisvLyBzdGF0aWMKK3ZvaWQgV2VibUZyYW1lU2lua1RocmVhZDo6aW5pdENsdXN0ZXIoCisgICAgTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGZyYW1lcywKKyAgICB1aW50NjRfdCYgY2x1c3RlclRpbWVjb2RlTCwKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbikgeworICAgIENIRUNLKCFmcmFtZXMuZW1wdHkoKSAmJiBjaGlsZHJlbi5lbXB0eSgpKTsKKworICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gZiA9ICooZnJhbWVzLmJlZ2luKCkpOworICAgIGNsdXN0ZXJUaW1lY29kZUwgPSBmLT5tQWJzVGltZWNvZGU7CisgICAgV2VibVVuc2lnbmVkICpjbHVzdGVyVGltZWNvZGUgPSBuZXcgV2VibVVuc2lnbmVkKGtNa3ZUaW1lY29kZSwgY2x1c3RlclRpbWVjb2RlTCk7CisgICAgY2hpbGRyZW4uY2xlYXIoKTsKKyAgICBjaGlsZHJlbi5wdXNoX2JhY2soY2x1c3RlclRpbWVjb2RlKTsKK30KKwordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjp3cml0ZUNsdXN0ZXIoTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pIHsKKyAgICAvLyBjaGlsZHJlbiBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHNpbXBsZWJsb2NrIGFuZCBpdHMgdGltZWNvZGUKKyAgICBDSEVDS19HRShjaGlsZHJlbi5zaXplKCksIDIpOworCisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICBzcDxXZWJtRWxlbWVudD4gY2x1c3RlciA9IG5ldyBXZWJtTWFzdGVyKGtNa3ZDbHVzdGVyLCBjaGlsZHJlbik7CisgICAgY2x1c3Rlci0+d3JpdGUobUZkLCBzaXplKTsKKyAgICBjaGlsZHJlbi5jbGVhcigpOworfQorCisvLyBXcml0ZSBvdXQgKHBvc3NpYmx5IG11bHRpcGxlKSB3ZWJtIGNsdXN0ZXIocykgZnJvbSBmcmFtZXMgc3BsaXQgb24gdmlkZW8ga2V5IGZyYW1lcy4KKy8vCisvLyBsYXN0OgorLy8gICBjdXJyZW50IGZsdXNoIGlzIHRyaWdnZXJlZCBieSBFT1MgaW5zdGVhZCBvZiBhIHNlY29uZCBvdXRzdGFuZGluZyB2aWRlbyBrZXkgZnJhbWUuCit2b2lkIFdlYm1GcmFtZVNpbmtUaHJlYWQ6OmZsdXNoRnJhbWVzKExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsIGJvb2wgbGFzdCkgeworICAgIGlmIChmcmFtZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3QgY2x1c3RlclRpbWVjb2RlTDsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGNoaWxkcmVuOworICAgIGluaXRDbHVzdGVyKGZyYW1lcywgY2x1c3RlclRpbWVjb2RlTCwgY2hpbGRyZW4pOworCisgICAgdWludDY0X3QgY3VlVGltZSA9IGNsdXN0ZXJUaW1lY29kZUw7CisgICAgb2ZmX3QgZnBvcyA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0NVUik7CisgICAgc2l6ZV90IG4gPSBmcmFtZXMuc2l6ZSgpOworICAgIGlmICghbGFzdCkgeworICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGZsdXNoaW5nIHRoZSBsYXN0IHNlcXVlbmNlIG9mIG91dHN0YW5kaW5nIGZyYW1lcywgZmx1c2hGcmFtZXMKKyAgICAgICAgLy8gbXVzdCBoYXZlIGJlZW4gY2FsbGVkIHJpZ2h0IGFmdGVyIHdlIGhhdmUgcHVzaGVkIGEgc2Vjb25kIG91dHN0YW5kaW5nIHZpZGVvIGtleQorICAgICAgICAvLyBmcmFtZSAodGhlIGxhc3QgZnJhbWUpLCB3aGljaCBiZWxvbmdzIHRvIHRoZSBuZXh0IGNsdXN0ZXI7IGFsc28gaG9sZCBiYWNrIG9uCisgICAgICAgIC8vIGZsdXNoaW5nIHRoZSBzZWNvbmQgdG8gbGFzdCBmcmFtZSBiZWZvcmUgd2UgY2hlY2sgaXRzIHR5cGUuIEEgYXVkaW8gZnJhbWUKKyAgICAgICAgLy8gc2hvdWxkIHByZWNlZGUgdGhlIGFmb3JlbWVudGlvbmVkIHZpZGVvIGtleSBmcmFtZSBpbiB0aGUgbmV4dCBzZXF1ZW5jZSwgYSB2aWRlbworICAgICAgICAvLyBmcmFtZSBzaG91bGQgYmUgdGhlIGxhc3QgZnJhbWUgaW4gdGhlIGN1cnJlbnQgKHRvLWJlLWZsdXNoZWQpIHNlcXVlbmNlLgorICAgICAgICBDSEVDS19HRShuLCAyKTsKKyAgICAgICAgbiAtPSAyOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gZiA9ICooZnJhbWVzLmJlZ2luKCkpOworICAgICAgICBpZiAoZi0+bVR5cGUgPT0ga1ZpZGVvVHlwZSAmJiBmLT5tS2V5KSB7CisgICAgICAgICAgICBjdWVUaW1lID0gZi0+bUFic1RpbWVjb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGYtPm1BYnNUaW1lY29kZSAtIGNsdXN0ZXJUaW1lY29kZUwgPiBJTlQxNl9NQVgpIHsKKyAgICAgICAgICAgIHdyaXRlQ2x1c3RlcihjaGlsZHJlbik7CisgICAgICAgICAgICBpbml0Q2x1c3RlcihmcmFtZXMsIGNsdXN0ZXJUaW1lY29kZUwsIGNoaWxkcmVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lcy5lcmFzZShmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhmLT5TaW1wbGVCbG9jayhjbHVzdGVyVGltZWNvZGVMKSk7CisgICAgfQorCisgICAgLy8gZXF1aXZhbGVudCB0byBsYXN0PT1mYWxzZQorICAgIGlmICghZnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gZGVjaWRlIHdoZXRoZXIgdG8gd3JpdGUgb3V0IHRoZSBzZWNvbmQgdG8gbGFzdCBmcmFtZS4KKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBzZWNvbmRMYXN0RnJhbWUgPSAqKGZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgaWYgKHNlY29uZExhc3RGcmFtZS0+bVR5cGUgPT0ga1ZpZGVvVHlwZSkgeworICAgICAgICAgICAgZnJhbWVzLmVyYXNlKGZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhzZWNvbmRMYXN0RnJhbWUtPlNpbXBsZUJsb2NrKGNsdXN0ZXJUaW1lY29kZUwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdyaXRlQ2x1c3RlcihjaGlsZHJlbik7CisgICAgc3A8V2VibUVsZW1lbnQ+IGN1ZVBvaW50ID0gV2VibUVsZW1lbnQ6OkN1ZVBvaW50RW50cnkoY3VlVGltZSwgMSwgZnBvcyAtIG1TZWdtZW50RGF0YVN0YXJ0KTsKKyAgICBtQ3Vlcy5wdXNoX2JhY2soY3VlUG9pbnQpOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpzdGFydCgpIHsKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0YXJ0KCk7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZVNpbmtUaHJlYWQ6OnN0b3AoKSB7CisgICAgbURvbmUgPSB0cnVlOworICAgIG1WaWRlb0ZyYW1lcy5wdXNoKFdlYm1GcmFtZTo6RU9TKTsKKyAgICBtQXVkaW9GcmFtZXMucHVzaChXZWJtRnJhbWU6OkVPUyk7CisgICAgcmV0dXJuIFdlYm1GcmFtZVRocmVhZDo6c3RvcCgpOworfQorCit2b2lkIFdlYm1GcmFtZVNpbmtUaHJlYWQ6OnJ1bigpIHsKKyAgICBpbnQgbnVtVmlkZW9LZXlGcmFtZXMgPSAwOworICAgIExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+IG91dHN0YW5kaW5nRnJhbWVzOworICAgIHdoaWxlICghbURvbmUpIHsKKyAgICAgICAgQUxPR1YoIndhaXQgdiBmcmFtZSIpOworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IHZpZGVvRnJhbWUgPSBtVmlkZW9GcmFtZXMucGVlaygpOworICAgICAgICBBTE9HVigidiBmcmFtZTogJXAiLCB2aWRlb0ZyYW1lLmdldCgpKTsKKworICAgICAgICBBTE9HVigid2FpdCBhIGZyYW1lIik7CisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gYXVkaW9GcmFtZSA9IG1BdWRpb0ZyYW1lcy5wZWVrKCk7CisgICAgICAgIEFMT0dWKCJhIGZyYW1lOiAlcCIsIGF1ZGlvRnJhbWUuZ2V0KCkpOworCisgICAgICAgIGlmICh2aWRlb0ZyYW1lLT5tRW9zICYmIGF1ZGlvRnJhbWUtPm1Fb3MpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCphdWRpb0ZyYW1lIDwgKnZpZGVvRnJhbWUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ0YWtlIGEgZnJhbWUiKTsKKyAgICAgICAgICAgIG1BdWRpb0ZyYW1lcy50YWtlKCk7CisgICAgICAgICAgICBvdXRzdGFuZGluZ0ZyYW1lcy5wdXNoX2JhY2soYXVkaW9GcmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigidGFrZSB2IGZyYW1lIik7CisgICAgICAgICAgICBtVmlkZW9GcmFtZXMudGFrZSgpOworICAgICAgICAgICAgb3V0c3RhbmRpbmdGcmFtZXMucHVzaF9iYWNrKHZpZGVvRnJhbWUpOworICAgICAgICAgICAgaWYgKHZpZGVvRnJhbWUtPm1LZXkpCisgICAgICAgICAgICAgICAgbnVtVmlkZW9LZXlGcmFtZXMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1WaWRlb0tleUZyYW1lcyA9PSAyKSB7CisgICAgICAgICAgICBmbHVzaEZyYW1lcyhvdXRzdGFuZGluZ0ZyYW1lcywgLyogbGFzdCA9ICovIGZhbHNlKTsKKyAgICAgICAgICAgIG51bVZpZGVvS2V5RnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImZsdXNoaW5nIGxhc3QgY2x1c3RlciAoc2l6ZSAlenUpIiwgb3V0c3RhbmRpbmdGcmFtZXMuc2l6ZSgpKTsKKyAgICBmbHVzaEZyYW1lcyhvdXRzdGFuZGluZ0ZyYW1lcywgLyogbGFzdCA9ICovIHRydWUpOworICAgIG1Eb25lID0gdHJ1ZTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtJbml0aWFsRGVsYXlUaW1lVXMgPSA3MDAwMDBMTDsKKwordm9pZCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6Y2xlYXJGbGFncygpIHsKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKK30KKworV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OldlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkKAorICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rLAorICAgICAgICB1aW50NjRfdCB0aW1lQ29kZVNjYWxlLAorICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlYWxVcywKKyAgICAgICAgaW50MzJfdCBzdGFydFRpbWVPZmZzZXRNcywKKyAgICAgICAgaW50IG51bVRyYWNrcywKKyAgICAgICAgYm9vbCByZWFsVGltZVJlY29yZGluZykKKyAgICA6IFdlYm1GcmFtZVNvdXJjZVRocmVhZCh0eXBlLCBzaW5rKSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1UaW1lQ29kZVNjYWxlKHRpbWVDb2RlU2NhbGUpLAorICAgICAgbVRyYWNrRHVyYXRpb25VcygwKSB7CisgICAgY2xlYXJGbGFncygpOworICAgIG1TdGFydFRpbWVVcyA9IHN0YXJ0VGltZVJlYWxVczsKKyAgICBpZiAocmVhbFRpbWVSZWNvcmRpbmcgJiYgbnVtVHJhY2tzID4gMSkgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3BpZWQgZnJvbSBNUEVHNFdyaXRlcgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGV4dHJhIGRlbGF5IG9mIGFjY2VwdGluZyBpbmNvbWluZyBhdWRpby92aWRlbyBzaWduYWxzCisgICAgICAgICAqIGhlbHBzIHRvIGFsaWduIGEvdiBzdGFydCB0aW1lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSByZWNvcmRpbmcKKyAgICAgICAgICogc2Vzc2lvbiwgYW5kIGl0IGFsc28gaGVscHMgZWxpbWluYXRlIHRoZSAicmVjb3JkaW5nIiBzb3VuZCBmb3IKKyAgICAgICAgICogY2FtY29yZGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgY2xpZW50IGRvZXMgbm90IHNldCB0aGUgc3RhcnQgdGltZSBvZmZzZXQsIHdlIGZhbGwgYmFjayB0bworICAgICAgICAgKiB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbCBkZWxheSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lT2Zmc2V0VXMgPSBzdGFydFRpbWVPZmZzZXRNcyAqIDEwMDBMTDsKKyAgICAgICAgaWYgKHN0YXJ0VGltZU9mZnNldFVzIDwgMCkgeyAgLy8gU3RhcnQgdGltZSBvZmZzZXQgd2FzIG5vdCBzZXQKKyAgICAgICAgICAgIHN0YXJ0VGltZU9mZnNldFVzID0ga0luaXRpYWxEZWxheVRpbWVVczsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRUaW1lVXMgKz0gc3RhcnRUaW1lT2Zmc2V0VXM7CisgICAgICAgIEFMT0dJKCJTdGFydCB0aW1lIG9mZnNldDogJSIgUFJJZDY0ICIgdXMiLCBzdGFydFRpbWVPZmZzZXRVcyk7CisgICAgfQorfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6c3RhcnQoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIG1TdGFydFRpbWVVcyk7CisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQobWV0YS5nZXQoKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRG9uZSA9IHRydWU7CisgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0YXJ0KCk7CisgICAgfQorfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6cmVzdW1lKCkgeworICAgIGlmICghbURvbmUgJiYgbVBhdXNlZCkgeworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIG1QYXVzZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpzdG9wKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBtRG9uZSA9IHRydWU7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgcmV0dXJuIFdlYm1GcmFtZVRocmVhZDo6c3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnJ1bigpIHsKKyAgICBpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzID0gMHhkZWFkYmVlZjsKKyAgICBpbnQ2NF90IGxhc3RUaW1lc3RhbXBVcyA9IDA7IC8vIFByZXZpb3VzIHNhbXBsZSB0aW1lIHN0YW1wCisgICAgaW50NjRfdCBsYXN0RHVyYXRpb25VcyA9IDA7IC8vIFByZXZpb3VzIHNhbXBsZSBkdXJhdGlvbgorICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKKworICAgIGNvbnN0IHVpbnQ2NF90IGtVbmluaXRpYWxpemVkID0gMHhmZmZmZmZmZmZmZmZmZmZmTDsKKyAgICBtU3RhcnRUaW1lVXMgPSBrVW5pbml0aWFsaXplZDsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyLCBOVUxMKSkgPT0gT0spIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZXRhRGF0YT4gbWQgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBDSEVDSyhtZC0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgaWYgKG1TdGFydFRpbWVVcyA9PSBrVW5pbml0aWFsaXplZCkgeworICAgICAgICAgICAgbVN0YXJ0VGltZVVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wVXMgLT0gbVN0YXJ0VGltZVVzOworCisgICAgICAgIGlmIChtUGF1c2VkICYmICFtUmVzdW1lZCkgeworICAgICAgICAgICAgbGFzdER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGxhc3RUaW1lc3RhbXBVczsKKyAgICAgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKytjb3VudDsKKworICAgICAgICAvLyBhZGp1c3QgdGltZS1zdGFtcHMgYWZ0ZXIgcGF1c2UvcmVzdW1lCisgICAgICAgIGlmIChtUmVzdW1lZCkgeworICAgICAgICAgICAgaW50NjRfdCBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPSB0aW1lc3RhbXBVcyAtIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKyAgICAgICAgICAgIENIRUNLX0dFKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcywgMGxsKTsKKyAgICAgICAgICAgIGludDY0X3QgcGF1c2VkRHVyYXRpb25VcyA9IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyAtIG1UcmFja0R1cmF0aW9uVXM7CisgICAgICAgICAgICBDSEVDS19HRShwYXVzZWREdXJhdGlvblVzLCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gcGF1c2VkRHVyYXRpb25VcyAtIGxhc3REdXJhdGlvblVzOworICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOworCisgICAgICAgIGludDMyX3QgaXNTeW5jID0gZmFsc2U7CisgICAgICAgIG1kLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKTsKKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBmID0gbmV3IFdlYm1GcmFtZSgKKyAgICAgICAgICAgIG1UeXBlLAorICAgICAgICAgICAgaXNTeW5jLAorICAgICAgICAgICAgdGltZXN0YW1wVXMgKiAxMDAwIC8gbVRpbWVDb2RlU2NhbGUsCisgICAgICAgICAgICBidWZmZXIpOworICAgICAgICBtU2luay5wdXNoKGYpOworCisgICAgICAgIEFMT0dWKAorICAgICAgICAgICAgIiVzICVzIGZyYW1lIGF0ICUiIFBSSWQ2NCAiIHNpemUgJXp1XG4iLAorICAgICAgICAgICAgbVR5cGUgPT0ga1ZpZGVvVHlwZSA/ICJ2aWRlbyIgOiAiYXVkaW8iLAorICAgICAgICAgICAgaXNTeW5jID8gIkkiIDogIlAiLAorICAgICAgICAgICAgdGltZXN0YW1wVXMgKiAxMDAwIC8gbVRpbWVDb2RlU2NhbGUsCisgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtVHJhY2tEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgbGFzdER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGxhc3RUaW1lc3RhbXBVczsKKyAgICAgICAgbGFzdFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgfQorCisgICAgbVRyYWNrRHVyYXRpb25VcyArPSBsYXN0RHVyYXRpb25VczsKKyAgICBtU2luay5wdXNoKFdlYm1GcmFtZTo6RU9TKTsKK30KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWQ5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXRUJNRlJBTUVUSFJFQURfSF8KKyNkZWZpbmUgV0VCTUZSQU1FVEhSRUFEX0hfCisKKyNpbmNsdWRlICJXZWJtRnJhbWUuaCIKKyNpbmNsdWRlICJMaW5rZWRCbG9ja2luZ1F1ZXVlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBXZWJtRnJhbWVUaHJlYWQgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFdlYm1GcmFtZVRocmVhZD4geworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBydW4oKSA9IDA7CisgICAgdmlydHVhbCBib29sIHJ1bm5pbmcoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgeyByZXR1cm4gT0s7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpIHsgcmV0dXJuIE9LOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCB+V2VibUZyYW1lVGhyZWFkKCkgeyBzdG9wKCk7IH0KKyAgICBzdGF0aWMgdm9pZCAqd3JhcCh2b2lkICphcmcpOworCitwcm90ZWN0ZWQ6CisgICAgV2VibUZyYW1lVGhyZWFkKCkKKyAgICAgICAgOiBtVGhyZWFkKDApIHsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgcHRocmVhZF90IG1UaHJlYWQ7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2VibUZyYW1lVGhyZWFkKTsKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBXZWJtRnJhbWVTb3VyY2VUaHJlYWQ7CitjbGFzcyBXZWJtRnJhbWVTaW5rVGhyZWFkIDogcHVibGljIFdlYm1GcmFtZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IGludCYgZmQsCisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCYgb2ZmLAorICAgICAgICAgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiB2aWRlb1RocmVhZCwKKyAgICAgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gYXVkaW9UaHJlYWQsCisgICAgICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKTsKKworICAgIFdlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICAgICAgY29uc3QgdWludDY0X3QmIG9mZiwKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiB2aWRlb1NvdXJjZSwKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGN1ZXMpOworCisgICAgdm9pZCBydW4oKTsKKyAgICBib29sIHJ1bm5pbmcoKSB7CisgICAgICAgIHJldHVybiAhbURvbmU7CisgICAgfQorICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgc3RhdHVzX3Qgc3RvcCgpOworCitwcml2YXRlOgorICAgIGNvbnN0IGludCYgbUZkOworICAgIGNvbnN0IHVpbnQ2NF90JiBtU2VnbWVudERhdGFTdGFydDsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgbVZpZGVvRnJhbWVzOworICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBtQXVkaW9GcmFtZXM7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgbUN1ZXM7CisKKyAgICB2b2xhdGlsZSBib29sIG1Eb25lOworCisgICAgc3RhdGljIHZvaWQgaW5pdENsdXN0ZXIoCisgICAgICAgICAgICBMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgZnJhbWVzLAorICAgICAgICAgICAgdWludDY0X3QmIGNsdXN0ZXJUaW1lY29kZUwsCisgICAgICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbik7CisgICAgdm9pZCB3cml0ZUNsdXN0ZXIoTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pOworICAgIHZvaWQgZmx1c2hGcmFtZXMoTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGZyYW1lcywgYm9vbCBsYXN0KTsKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBXZWJtRnJhbWVTb3VyY2VUaHJlYWQgOiBwdWJsaWMgV2VibUZyYW1lVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBXZWJtRnJhbWVTb3VyY2VUaHJlYWQoaW50IHR5cGUsIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rKTsKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RHVyYXRpb25VcygpID0gMDsKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBpbnQgbVR5cGU7CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIG1TaW5rOworCisgICAgZnJpZW5kIGNsYXNzIFdlYm1GcmFtZVNpbmtUaHJlYWQ7Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lRW1wdHlTb3VyY2VUaHJlYWQgOiBwdWJsaWMgV2VibUZyYW1lU291cmNlVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBXZWJtRnJhbWVFbXB0eVNvdXJjZVRocmVhZChpbnQgdHlwZSwgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHNpbmspCisgICAgICAgIDogV2VibUZyYW1lU291cmNlVGhyZWFkKHR5cGUsIHNpbmspIHsKKyAgICB9CisgICAgdm9pZCBydW4oKSB7IG1TaW5rLnB1c2goV2VibUZyYW1lOjpFT1MpOyB9CisgICAgaW50NjRfdCBnZXREdXJhdGlvblVzKCkgeyByZXR1cm4gMDsgfQorfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOiBwdWJsaWMgV2VibUZyYW1lU291cmNlVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaywKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVDb2RlU2NhbGUsCisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlYWxVcywKKyAgICAgICAgICAgIGludDMyX3Qgc3RhcnRUaW1lT2Zmc2V0TXMsCisgICAgICAgICAgICBpbnQgbnVtUGVlcnMsCisgICAgICAgICAgICBib29sIHJlYWxUaW1lUmVjb3JkaW5nKTsKKworICAgIHZvaWQgcnVuKCk7CisgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICBzdGF0dXNfdCByZXN1bWUoKTsKKyAgICBzdGF0dXNfdCBwYXVzZSgpOworICAgIHN0YXR1c190IHN0b3AoKTsKKyAgICBpbnQ2NF90IGdldER1cmF0aW9uVXMoKSB7CisgICAgICAgIHJldHVybiBtVHJhY2tEdXJhdGlvblVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBjb25zdCB1aW50NjRfdCBtVGltZUNvZGVTY2FsZTsKKyAgICB1aW50NjRfdCBtU3RhcnRUaW1lVXM7CisKKyAgICB2b2xhdGlsZSBib29sIG1Eb25lOworICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZDsKKyAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkOworICAgIHZvbGF0aWxlIGJvb2wgbVN0YXJ0ZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVhY2hlZEVPUzsKKyAgICBpbnQ2NF90IG1UcmFja0R1cmF0aW9uVXM7CisKKyAgICB2b2lkIGNsZWFyRmxhZ3MoKTsKK307Cit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisKKyNlbmRpZiAvKiBXRUJNRlJBTUVUSFJFQURfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzY2Y5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC0wLDAgKzEsNTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV2VibVdyaXRlciIKKworI2luY2x1ZGUgIkVibWxVdGlsLmgiCisjaW5jbHVkZSAiV2VibVdyaXRlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSB7CitzaXplX3QgWGlwaExhY2VDb2RlTGVuKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHNpemUgLyAweGZmICsgMTsKK30KKworc2l6ZV90IFhpcGhMYWNlRW5jKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBzaXplID49IDB4ZmY7ICsraSwgc2l6ZSAtPSAweGZmKSB7CisgICAgICAgIGJ1ZltpXSA9IDB4ZmY7CisgICAgfQorICAgIGJ1ZltpKytdID0gc2l6ZTsKKyAgICByZXR1cm4gaTsKK30KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluU3RyZWFtYWJsZUZpbGVTaXplSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAyNDsKKworV2VibVdyaXRlcjo6V2VibVdyaXRlcihpbnQgZmQpCisgICAgOiBtRmQoZHVwKGZkKSksCisgICAgICBtSW5pdENoZWNrKG1GZCA8IDAgPyBOT19JTklUIDogT0spLAorICAgICAgbVRpbWVDb2RlU2NhbGUoMTAwMDAwMCksCisgICAgICBtU3RhcnRUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygwKSwKKyAgICAgIG1TZWdtZW50T2Zmc2V0KDApLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQoMCksCisgICAgICBtSW5mb09mZnNldCgwKSwKKyAgICAgIG1JbmZvU2l6ZSgwKSwKKyAgICAgIG1UcmFja3NPZmZzZXQoMCksCisgICAgICBtQ3Vlc09mZnNldCgwKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAorICAgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcoZmFsc2UpLAorICAgICAgbVN0cmVhbWFibGVGaWxlKHRydWUpLAorICAgICAgbUVzdGltYXRlZEN1ZXNTaXplKDApIHsKKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0gPSBXZWJtU3RyZWFtKGtBdWRpb1R5cGUsICJBdWRpbyIsICZXZWJtV3JpdGVyOjphdWRpb1RyYWNrKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBXZWJtU3RyZWFtKGtWaWRlb1R5cGUsICJWaWRlbyIsICZXZWJtV3JpdGVyOjp2aWRlb1RyYWNrKTsKKyAgICBtU2lua1RocmVhZCA9IG5ldyBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgbUZkLAorICAgICAgICAgICAgbVNlZ21lbnREYXRhU3RhcnQsCisgICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtQ3VlUG9pbnRzKTsKK30KKworV2VibVdyaXRlcjo6V2VibVdyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSkKKyAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtVGltZUNvZGVTY2FsZSgxMDAwMDAwKSwKKyAgICAgIG1TdGFydFRpbWVzdGFtcFVzKDApLAorICAgICAgbVN0YXJ0VGltZU9mZnNldE1zKDApLAorICAgICAgbVNlZ21lbnRPZmZzZXQoMCksCisgICAgICBtU2VnbWVudERhdGFTdGFydCgwKSwKKyAgICAgIG1JbmZvT2Zmc2V0KDApLAorICAgICAgbUluZm9TaXplKDApLAorICAgICAgbVRyYWNrc09mZnNldCgwKSwKKyAgICAgIG1DdWVzT2Zmc2V0KDApLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZChmYWxzZSksCisgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyhmYWxzZSksCisgICAgICBtU3RyZWFtYWJsZUZpbGUodHJ1ZSksCisgICAgICBtRXN0aW1hdGVkQ3Vlc1NpemUoMCkgeworICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgQUxPR1YoImZkICVkOyBmbGFnczogJW8iLCBtRmQsIGZjbnRsKG1GZCwgRl9HRVRGTCwgMCkpOworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgfQorICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XSA9IFdlYm1TdHJlYW0oa0F1ZGlvVHlwZSwgIkF1ZGlvIiwgJldlYm1Xcml0ZXI6OmF1ZGlvVHJhY2spOworICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XSA9IFdlYm1TdHJlYW0oa1ZpZGVvVHlwZSwgIlZpZGVvIiwgJldlYm1Xcml0ZXI6OnZpZGVvVHJhY2spOworICAgIG1TaW5rVGhyZWFkID0gbmV3IFdlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgICAgICBtRmQsCisgICAgICAgICAgICBtU2VnbWVudERhdGFTdGFydCwKKyAgICAgICAgICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tU2luaywKKyAgICAgICAgICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tU2luaywKKyAgICAgICAgICAgIG1DdWVQb2ludHMpOworfQorCisvLyBzdGF0aWMKK3NwPFdlYm1FbGVtZW50PiBXZWJtV3JpdGVyOjp2aWRlb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpIHsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgQ0hFQ0sobWQtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworICAgIHJldHVybiBXZWJtRWxlbWVudDo6VmlkZW9UcmFja0VudHJ5KHdpZHRoLCBoZWlnaHQpOworfQorCisvLyBzdGF0aWMKK3NwPFdlYm1FbGVtZW50PiBXZWJtV3JpdGVyOjphdWRpb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpIHsKKyAgICBpbnQzMl90IG5DaGFubmVscywgc2FtcGxlcmF0ZTsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGExOworICAgIGNvbnN0IGNoYXIgaGVhZGVyRGF0YTJbXSA9IHsgMywgJ3YnLCAnbycsICdyJywgJ2InLCAnaScsICdzJywgNywgMCwgMCwgMCwKKyAgICAgICAgICAgICdhJywgJ24nLCAnZCcsICdyJywgJ28nLCAnaScsICdkJywgMCwgMCwgMCwgMCwgMSB9OworICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGEzOworICAgIHNpemVfdCBoZWFkZXJTaXplMSwgaGVhZGVyU2l6ZTIgPSBzaXplb2YoaGVhZGVyRGF0YTIpLCBoZWFkZXJTaXplMzsKKworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpOworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKSk7CisgICAgQ0hFQ0sobWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpKTsKKyAgICBDSEVDSyhtZC0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmhlYWRlckRhdGEzLCAmaGVhZGVyU2l6ZTMpKTsKKworICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMTsKKyAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7CisgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOworICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTEgKyBoZWFkZXJTaXplMiArIGhlYWRlclNpemUzOworCisgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKKyAgICB1aW50OF90ICpjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7CisgICAgY29kZWNQcml2YXRlRGF0YVtvZmYrK10gPSAyOworCisgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKKyAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTIpOworCisgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGExLCBoZWFkZXJTaXplMSk7CisgICAgb2ZmICs9IGhlYWRlclNpemUxOworICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMiwgaGVhZGVyU2l6ZTIpOworICAgIG9mZiArPSBoZWFkZXJTaXplMjsKKyAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTMsIGhlYWRlclNpemUzKTsKKworICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICBzYW1wbGVyYXRlLAorICAgICAgICAgICAgY29kZWNQcml2YXRlQnVmKTsKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3NpemVfdCBXZWJtV3JpdGVyOjpudW1UcmFja3MoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKworICAgIHNpemVfdCBudW1UcmFja3MgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVRyYWNrRW50cnkgIT0gTlVMTCkgeworICAgICAgICAgICAgbnVtVHJhY2tzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVtVHJhY2tzOworfQorCit1aW50NjRfdCBXZWJtV3JpdGVyOjplc3RpbWF0ZUN1ZXNTaXplKGludDMyX3QgYml0UmF0ZSkgeworICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gZXN0aW1hdGVNb292Qm94U2l6ZSBpbiBNUEVHNFdyaXRlci4KKyAgICAvLworICAgIC8vIFN0YXRpc3RpY2FsIGFuYWx5c2lzIHNob3dzIHRoYXQgbWV0YWRhdGEgdXN1YWxseSBhY2NvdW50cworICAgIC8vIGZvciBhIHNtYWxsIHBvcnRpb24gb2YgdGhlIHRvdGFsIGZpbGUgc2l6ZSwgdXN1YWxseSA8IDAuNiUuCisKKyAgICAvLyBUaGUgZGVmYXVsdCBNSU5fTU9PVl9CT1hfU0laRSBpcyBzZXQgdG8gMC42JSB4IDFNQiAvIDIsCisgICAgLy8gd2hlcmUgMU1CIGlzIHRoZSBjb21tb24gZmlsZSBzaXplIGxpbWl0IGZvciBNTVMgYXBwbGljYXRpb24uCisgICAgLy8gVGhlIGRlZmF1bHQgTUFYIF9NT09WX0JPWF9TSVpFIHZhbHVlIGlzIGJhc2VkIG9uIGFib3V0IDMKKyAgICAvLyBtaW51dGUgdmlkZW8gcmVjb3JkaW5nIHdpdGggYSBiaXQgcmF0ZSBhYm91dCAzIE1icHMsIGJlY2F1c2UKKyAgICAvLyBzdGF0aXN0aWNzIGFsc28gc2hvdyB0aGF0IG1vc3Qgb2YgdGhlIHZpZGVvIGNhcHR1cmVkIGFyZSBnb2luZworICAgIC8vIHRvIGJlIGxlc3MgdGhhbiAzIG1pbnV0ZXMuCisKKyAgICAvLyBJZiB0aGUgZXN0aW1hdGlvbiBpcyB3cm9uZywgd2Ugd2lsbCBwYXkgdGhlIHByaWNlIG9mIHdhc3RpbmcKKyAgICAvLyBzb21lIHJlc2VydmVkIHNwYWNlLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHNvIG9mdGVuIHN0YXRpc3RpY2FsbHkuCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgZmFjdG9yID0gMjsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBNSU5fQ1VFU19TSVpFID0gMyAqIDEwMjQ7ICAvLyAzIEtCCisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTUFYX0NVRVNfU0laRSA9ICgxODAgKiAzMDAwMDAwICogNkxMIC8gODAwMCk7CisgICAgaW50NjRfdCBzaXplID0gTUlOX0NVRVNfU0laRTsKKworICAgIC8vIE1heCBmaWxlIHNpemUgbGltaXQgaXMgc2V0CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCAmJiBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCkgeworICAgICAgICBzaXplID0gbU1heEZpbGVTaXplTGltaXRCeXRlcyAqIDYgLyAxMDAwOworICAgIH0KKworICAgIC8vIE1heCBmaWxlIGR1cmF0aW9uIGxpbWl0IGlzIHNldAorICAgIGlmIChtTWF4RmlsZUR1cmF0aW9uTGltaXRVcyAhPSAwKSB7CisgICAgICAgIGlmIChiaXRSYXRlID4gMCkgeworICAgICAgICAgICAgaW50NjRfdCBzaXplMiA9ICgobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgKiBiaXRSYXRlICogNikgLyAxMDAwIC8gODAwMDAwMCk7CisgICAgICAgICAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyAhPSAwICYmIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGZpbGUgc2l6ZSBhbmQgZHVyYXRpb24gbGltaXRzIGFyZSBzZXQsCisgICAgICAgICAgICAgICAgLy8gd2UgdXNlIHRoZSBzbWFsbGVyIGxpbWl0IG9mIHRoZSB0d28uCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBzaXplMikgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IG1heCBmaWxlIGR1cmF0aW9uIGxpbWl0IGlzIHNldAorICAgICAgICAgICAgICAgIHNpemUgPSBzaXplMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplIDwgTUlOX0NVRVNfU0laRSkgeworICAgICAgICBzaXplID0gTUlOX0NVRVNfU0laRTsKKyAgICB9CisKKyAgICAvLyBBbnkgbG9uZyBkdXJhdGlvbiByZWNvcmRpbmcgd2lsbCBiZSBwcm9iYWJseSBlbmQgdXAgd2l0aAorICAgIC8vIG5vbi1zdHJlYW1hYmxlIHdlYm0gZmlsZS4KKyAgICBpZiAoc2l6ZSA+IE1BWF9DVUVTX1NJWkUpIHsKKyAgICAgICAgc2l6ZSA9IE1BWF9DVUVTX1NJWkU7CisgICAgfQorCisgICAgQUxPR1YoImxpbWl0czogJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgYnl0ZXMvdXMsIgorICAgICAgICAgICAgIiBiaXQgcmF0ZTogJWQgYnBzIGFuZCB0aGUgZXN0aW1hdGVkIGN1ZXMgc2l6ZSAlIiBQUklkNjQgIiBieXRlcyIsCisgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcywgYml0UmF0ZSwgc2l6ZSk7CisgICAgcmV0dXJuIGZhY3RvciAqIHNpemU7Cit9CisKK3ZvaWQgV2VibVdyaXRlcjo6aW5pdFN0cmVhbShzaXplX3QgaWR4KSB7CisgICAgaWYgKG1TdHJlYW1zW2lkeF0ubVRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1TdHJlYW1zW2lkeF0ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJhZGRpbmcgZHVtbXkgc291cmNlIC4uLiAiKTsKKyAgICAgICAgbVN0cmVhbXNbaWR4XS5tVGhyZWFkID0gbmV3IFdlYm1GcmFtZUVtcHR5U291cmNlVGhyZWFkKAorICAgICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVR5cGUsIG1TdHJlYW1zW2lkeF0ubVNpbmspOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJhZGRpbmcgc291cmNlICVwIiwgbVN0cmVhbXNbaWR4XS5tU291cmNlLmdldCgpKTsKKyAgICAgICAgbVN0cmVhbXNbaWR4XS5tVGhyZWFkID0gbmV3IFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkKAorICAgICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVNvdXJjZSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1UeXBlLAorICAgICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVNpbmssCisgICAgICAgICAgICAgICAgbVRpbWVDb2RlU2NhbGUsCisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZU9mZnNldE1zLAorICAgICAgICAgICAgICAgIG51bVRyYWNrcygpLAorICAgICAgICAgICAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKTsKKyAgICB9Cit9CisKK3ZvaWQgV2VibVdyaXRlcjo6cmVsZWFzZSgpIHsKKyAgICBjbG9zZShtRmQpOworICAgIG1GZCA9IC0xOworICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOworICAgIG1TdGFydGVkID0gZmFsc2U7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OnJlc2V0KCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICByZWxlYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAwOworICAgIGludDY0X3QgbWluRHVyYXRpb25VcyA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVRocmVhZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW1zW2ldLm1UaHJlYWQtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IG1TdHJlYW1zW2ldLm1UaHJlYWQtPmdldER1cmF0aW9uVXMoKTsKKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiBtYXhEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtYXhEdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHVyYXRpb25VcyA8IG1pbkR1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1pbkR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG51bVRyYWNrcygpID4gMSkgeworICAgICAgICBBTE9HRCgiRHVyYXRpb24gZnJvbSB0cmFja3MgcmFuZ2UgaXMgWyUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIl0gdXMiLCBtaW5EdXJhdGlvblVzLCBtYXhEdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBtU2lua1RocmVhZC0+c3RvcCgpOworCisgICAgLy8gRG8gbm90IHdyaXRlIG91dCBtb3ZpZSBoZWFkZXIgb24gZXJyb3IuCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3A8V2VibUVsZW1lbnQ+IGN1ZXMgPSBuZXcgV2VibU1hc3RlcihrTWt2Q3VlcywgbUN1ZVBvaW50cyk7CisgICAgdWludDY0X3QgY3Vlc1NpemUgPSBjdWVzLT50b3RhbFNpemUoKTsKKyAgICAvLyBUUklDS1kgRXZlbiB3aGVuIHRoZSBjdWVzIGRvIGZpdCBpbiB0aGUgc3BhY2Ugd2UgcmVzZXJ2ZWQsIGlmIHRoZXkgZG8gbm90IGZpdAorICAgIC8vIHBlcmZlY3RseSwgd2Ugc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggImV4dHJhIHNwYWNlIiB0byB3cml0ZSBhbgorICAgIC8vIEVCTUwgdm9pZCBlbGVtZW50LgorICAgIGlmIChjdWVzU2l6ZSAhPSBtRXN0aW1hdGVkQ3Vlc1NpemUgJiYgY3Vlc1NpemUgPiBtRXN0aW1hdGVkQ3Vlc1NpemUgLSBrTWluRWJtbFZvaWRTaXplKSB7CisgICAgICAgIG1DdWVzT2Zmc2V0ID0gOjpsc2VlayhtRmQsIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgY3Vlcy0+d3JpdGUobUZkLCBjdWVzU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDY0X3Qgc3BhY2VTaXplOworICAgICAgICA6OmxzZWVrKG1GZCwgbUN1ZXNPZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgY3Vlcy0+d3JpdGUobUZkLCBjdWVzU2l6ZSk7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBzcGFjZSA9IG5ldyBFYm1sVm9pZChtRXN0aW1hdGVkQ3Vlc1NpemUgLSBjdWVzU2l6ZSk7CisgICAgICAgIHNwYWNlLT53cml0ZShtRmQsIHNwYWNlU2l6ZSk7CisgICAgfQorCisgICAgbUN1ZVBvaW50cy5jbGVhcigpOworICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tU2luay5jbGVhcigpOworICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tU2luay5jbGVhcigpOworCisgICAgdWludDhfdCBiYXJ5W3NpemVvZih1aW50NjRfdCldOworICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0VORCk7CisgICAgdWludDY0X3Qgc2VnbWVudFNpemUgPSB0b3RhbFNpemUgLSBtU2VnbWVudERhdGFTdGFydDsKKyAgICA6OmxzZWVrKG1GZCwgbVNlZ21lbnRPZmZzZXQgKyBzaXplT2Yoa01rdlNlZ21lbnQpLCBTRUVLX1NFVCk7CisgICAgdWludDY0X3Qgc2VnbWVudFNpemVDb2RlZCA9IGVuY29kZVVuc2lnbmVkKHNlZ21lbnRTaXplLCBzaXplT2Yoa01rdlVua25vd25MZW5ndGgpKTsKKyAgICBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKHNlZ21lbnRTaXplQ29kZWQsIGJhcnkpOworICAgIDo6d3JpdGUobUZkLCBiYXJ5LCBzaXplT2Yoa01rdlVua25vd25MZW5ndGgpKTsKKworICAgIHVpbnQ2NF90IHNpemU7CisgICAgdWludDY0X3QgZHVyYXRpb25PZmZzZXQgPSBtSW5mb09mZnNldCArIHNpemVPZihrTWt2SW5mbykgKyBzaXplT2YobUluZm9TaXplKQorICAgICAgICArIHNpemVPZihrTWt2U2VnbWVudER1cmF0aW9uKSArIHNpemVPZihzaXplb2YoZG91YmxlKSk7CisgICAgc3A8V2VibUVsZW1lbnQ+IGR1cmF0aW9uID0gbmV3IFdlYm1GbG9hdCgKKyAgICAgICAgICAgIGtNa3ZTZWdtZW50RHVyYXRpb24sCisgICAgICAgICAgICAoZG91YmxlKSAobWF4RHVyYXRpb25VcyAqIDEwMDAgLyBtVGltZUNvZGVTY2FsZSkpOworICAgIGR1cmF0aW9uLT5zZXJpYWxpemVQYXlsb2FkKGJhcnkpOworICAgIDo6bHNlZWsobUZkLCBkdXJhdGlvbk9mZnNldCwgU0VFS19TRVQpOworICAgIDo6d3JpdGUobUZkLCBiYXJ5LCBzaXplb2YoZG91YmxlKSk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHNlZWtFbnRyaWVzOworICAgIHNlZWtFbnRyaWVzLnB1c2hfYmFjayhXZWJtRWxlbWVudDo6U2Vla0VudHJ5KGtNa3ZJbmZvLCBtSW5mb09mZnNldCAtIG1TZWdtZW50RGF0YVN0YXJ0KSk7CisgICAgc2Vla0VudHJpZXMucHVzaF9iYWNrKFdlYm1FbGVtZW50OjpTZWVrRW50cnkoa01rdlRyYWNrcywgbVRyYWNrc09mZnNldCAtIG1TZWdtZW50RGF0YVN0YXJ0KSk7CisgICAgc2Vla0VudHJpZXMucHVzaF9iYWNrKFdlYm1FbGVtZW50OjpTZWVrRW50cnkoa01rdkN1ZXMsIG1DdWVzT2Zmc2V0IC0gbVNlZ21lbnREYXRhU3RhcnQpKTsKKyAgICBzcDxXZWJtRWxlbWVudD4gc2Vla0hlYWQgPSBuZXcgV2VibU1hc3RlcihrTWt2U2Vla0hlYWQsIHNlZWtFbnRyaWVzKTsKKworICAgIHVpbnQ2NF90IG1ldGFTZWVrU2l6ZTsKKyAgICA6OmxzZWVrKG1GZCwgbVNlZ21lbnREYXRhU3RhcnQsIFNFRUtfU0VUKTsKKyAgICBzZWVrSGVhZC0+d3JpdGUobUZkLCBtZXRhU2Vla1NpemUpOworCisgICAgdWludDY0X3Qgc3BhY2VTaXplOworICAgIHNwPFdlYm1FbGVtZW50PiBzcGFjZSA9IG5ldyBFYm1sVm9pZChrTWF4TWV0YVNlZWtTaXplIC0gbWV0YVNlZWtTaXplKTsKKyAgICBzcGFjZS0+d3JpdGUobUZkLCBzcGFjZVNpemUpOworCisgICAgcmVsZWFzZSgpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gYWRkIHNvdXJjZSBBRlRFUiByZWNvcmRpbmcgaXMgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBBdCBtb3N0IDIgdHJhY2tzIGNhbiBiZSBzdXBwb3J0ZWQuCisgICAgaWYgKG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tVHJhY2tFbnRyeSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRyYWNrRW50cnkgIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiVG9vIG1hbnkgdHJhY2tzICgyKSB0byBhZGQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKKworICAgIC8vIEEgdHJhY2sgb2YgdHlwZSBvdGhlciB0aGFuIHZpZGVvIG9yIGF1ZGlvIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBjb25zdCBjaGFyICp2cDggPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDg7CisgICAgY29uc3QgY2hhciAqdm9yYmlzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworCisgICAgc2l6ZV90IHN0cmVhbUluZGV4OworICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgdnA4LCBzdHJsZW4odnA4KSkpIHsKKyAgICAgICAgc3RyZWFtSW5kZXggPSBrVmlkZW9JbmRleDsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2b3JiaXMsIHN0cmxlbih2b3JiaXMpKSkgeworICAgICAgICBzdHJlYW1JbmRleCA9IGtBdWRpb0luZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMgb3IgJXMgaXMgbm90IHN1cHBvcnRlZCIsIG1pbWUsIHZwOCwgdm9yYmlzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIE5vIG1vcmUgdGhhbiBvbmUgdmlkZW8gb3Igb25lIGF1ZGlvIHRyYWNrIGlzIHN1cHBvcnRlZC4KKyAgICBpZiAobVN0cmVhbXNbc3RyZWFtSW5kZXhdLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzIHRyYWNrIGFscmVhZHkgZXhpc3RzIiwgbVN0cmVhbXNbc3RyZWFtSW5kZXhdLm1OYW1lKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHRyYWNrIG9mIGVpdGhlciBhdWRpbyBvciB2aWRlby4KKyAgICAvLyBHbyBhaGVhZCB0byBhZGQgdGhlIHRyYWNrLgorICAgIG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tU291cmNlID0gc291cmNlOworICAgIG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tVHJhY2tFbnRyeSA9IG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tTWFrZVRyYWNrKHNvdXJjZS0+Z2V0Rm9ybWF0KCkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tVHJhY2tFbnRyeSA9PSBOVUxMCisgICAgICAgICAgICAmJiBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRyYWNrRW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiTm8gc291cmNlIGFkZGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyAhPSAwKSB7CisgICAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocGFyYW1zKSB7CisgICAgICAgIGludDMyX3QgaXNSZWFsVGltZVJlY29yZGluZzsKKyAgICAgICAgcGFyYW1zLT5maW5kSW50MzIoa0tleVJlYWxUaW1lUmVjb3JkaW5nLCAmaXNSZWFsVGltZVJlY29yZGluZyk7CisgICAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nID0gaXNSZWFsVGltZVJlY29yZGluZzsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tVGhyZWFkLT5yZXN1bWUoKTsKKyAgICAgICAgICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tVGhyZWFkLT5yZXN1bWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBpbnQzMl90IHRjc2w7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihrS2V5VGltZVNjYWxlLCAmdGNzbCkpIHsKKyAgICAgICAgICAgIG1UaW1lQ29kZVNjYWxlID0gdGNzbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBDSEVDS19HVChtVGltZUNvZGVTY2FsZSwgMCk7CisgICAgQUxPR1YoIm1vdmllIHRpbWUgc2NhbGU6ICUiIFBSSXU2NCwgbVRpbWVDb2RlU2NhbGUpOworCisgICAgLyoKKyAgICAgKiBXaGVuIHRoZSByZXF1ZXN0ZWQgZmlsZSBzaXplIGxpbWl0IGlzIHNtYWxsLCB0aGUgcHJpb3JpdHkKKyAgICAgKiBpcyB0byBtZWV0IHRoZSBmaWxlIHNpemUgbGltaXQgcmVxdWlyZW1lbnQsIHJhdGhlciB0aGFuCisgICAgICogdG8gbWFrZSB0aGUgZmlsZSBzdHJlYW1hYmxlLiBtU3RyZWFtYWJsZUZpbGUgZG9lcyBub3QgdGVsbAorICAgICAqIHdoZXRoZXIgdGhlIGFjdHVhbCByZWNvcmRlZCBmaWxlIGlzIHN0cmVhbWFibGUgb3Igbm90LgorICAgICAqLworICAgIG1TdHJlYW1hYmxlRmlsZSA9ICghbU1heEZpbGVTaXplTGltaXRCeXRlcykKKyAgICAgICAgfHwgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPj0ga01pblN0cmVhbWFibGVGaWxlU2l6ZUluQnl0ZXMpOworCisgICAgLyoKKyAgICAgKiBXcml0ZSB2YXJpb3VzIG1ldGFkYXRhLgorICAgICAqLworICAgIHNwPFdlYm1FbGVtZW50PiBlYm1sLCBzZWdtZW50LCBpbmZvLCBzZWVrSGVhZCwgdHJhY2tzLCBjdWVzOworICAgIGVibWwgPSBXZWJtRWxlbWVudDo6RWJtbEhlYWRlcigpOworICAgIHNlZ21lbnQgPSBuZXcgV2VibU1hc3RlcihrTWt2U2VnbWVudCk7CisgICAgc2Vla0hlYWQgPSBuZXcgRWJtbFZvaWQoa01heE1ldGFTZWVrU2l6ZSk7CisgICAgaW5mbyA9IFdlYm1FbGVtZW50OjpTZWdtZW50SW5mbyhtVGltZUNvZGVTY2FsZSwgMCk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGNoaWxkcmVuOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVRyYWNrRW50cnkgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hpbGRyZW4ucHVzaF9iYWNrKG1TdHJlYW1zW2ldLm1UcmFja0VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0cmFja3MgPSBuZXcgV2VibU1hc3RlcihrTWt2VHJhY2tzLCBjaGlsZHJlbik7CisKKyAgICBpZiAoIW1TdHJlYW1hYmxlRmlsZSkgeworICAgICAgICBjdWVzID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IGJpdFJhdGUgPSAtMTsKKyAgICAgICAgaWYgKHBhcmFtcykgeworICAgICAgICAgICAgcGFyYW1zLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICAgICAgfQorICAgICAgICBtRXN0aW1hdGVkQ3Vlc1NpemUgPSBlc3RpbWF0ZUN1ZXNTaXplKGJpdFJhdGUpOworICAgICAgICBDSEVDS19HRShtRXN0aW1hdGVkQ3Vlc1NpemUsIDgpOworICAgICAgICBjdWVzID0gbmV3IEVibWxWb2lkKG1Fc3RpbWF0ZWRDdWVzU2l6ZSk7CisgICAgfQorCisgICAgc3A8V2VibUVsZW1lbnQ+IGVsZW1zW10gPSB7IGVibWwsIHNlZ21lbnQsIHNlZWtIZWFkLCBpbmZvLCB0cmFja3MsIGN1ZXMgfTsKKyAgICBzaXplX3QgbkVsZW1zID0gc2l6ZW9mKGVsZW1zKSAvIHNpemVvZihlbGVtc1swXSk7CisgICAgdWludDY0X3Qgb2Zmc2V0c1tuRWxlbXNdOworICAgIHVpbnQ2NF90IHNpemVzW25FbGVtc107CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5FbGVtczsgaSsrKSB7CisgICAgICAgIFdlYm1FbGVtZW50ICplID0gZWxlbXNbaV0uZ2V0KCk7CisgICAgICAgIGlmICghZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCBzaXplOworICAgICAgICBvZmZzZXRzW2ldID0gOjpsc2VlayhtRmQsIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgc2l6ZXNbaV0gPSBlLT5tU2l6ZTsKKyAgICAgICAgZS0+d3JpdGUobUZkLCBzaXplKTsKKyAgICB9CisKKyAgICBtU2VnbWVudE9mZnNldCA9IG9mZnNldHNbMV07CisgICAgbVNlZ21lbnREYXRhU3RhcnQgPSBvZmZzZXRzWzJdOworICAgIG1JbmZvT2Zmc2V0ID0gb2Zmc2V0c1szXTsKKyAgICBtSW5mb1NpemUgPSBzaXplc1szXTsKKyAgICBtVHJhY2tzT2Zmc2V0ID0gb2Zmc2V0c1s0XTsKKyAgICBtQ3Vlc09mZnNldCA9IG9mZnNldHNbNV07CisKKyAgICAvLyBzdGFydCB0aHJlYWRzCisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJm1TdGFydFRpbWVzdGFtcFVzKTsKKyAgICB9CisKKyAgICBpbml0U3RyZWFtKGtBdWRpb0luZGV4KTsKKyAgICBpbml0U3RyZWFtKGtWaWRlb0luZGV4KTsKKworICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tVGhyZWFkLT5zdGFydCgpOworICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tVGhyZWFkLT5zdGFydCgpOworICAgIG1TaW5rVGhyZWFkLT5zdGFydCgpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibVdyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UaHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbXNbaV0ubVRocmVhZC0+cGF1c2UoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OnN0b3AoKSB7CisgICAgcmV0dXJuIHJlc2V0KCk7Cit9CisKK2Jvb2wgV2VibVdyaXRlcjo6cmVhY2hlZEVPUygpIHsKKyAgICByZXR1cm4gIW1TaW5rVGhyZWFkLT5ydW5uaW5nKCk7Cit9Cit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YjY5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTVdSSVRFUl9IXworI2RlZmluZSBXRUJNV1JJVEVSX0hfCisKKyNpbmNsdWRlICJXZWJtQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiV2VibUZyYW1lVGhyZWFkLmgiCisjaW5jbHVkZSAiTGlua2VkQmxvY2tpbmdRdWV1ZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgV2VibVdyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CitwdWJsaWM6CisgICAgV2VibVdyaXRlcihpbnQgZmQpOworICAgIFdlYm1Xcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIH5XZWJtV3JpdGVyKCkgeyByZXNldCgpOyB9CisKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbSA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOworCisgICAgdmlydHVhbCB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykgeyBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtczsgfQorICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRNcygpIGNvbnN0IHsgcmV0dXJuIG1TdGFydFRpbWVPZmZzZXRNczsgfQorCitwcml2YXRlOgorICAgIGludCBtRmQ7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIHVpbnQ2NF90IG1UaW1lQ29kZVNjYWxlOworICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CisKKyAgICB1aW50NjRfdCBtU2VnbWVudE9mZnNldDsKKyAgICB1aW50NjRfdCBtU2VnbWVudERhdGFTdGFydDsKKyAgICB1aW50NjRfdCBtSW5mb09mZnNldDsKKyAgICB1aW50NjRfdCBtSW5mb1NpemU7CisgICAgdWludDY0X3QgbVRyYWNrc09mZnNldDsKKyAgICB1aW50NjRfdCBtQ3Vlc09mZnNldDsKKworICAgIGJvb2wgbVBhdXNlZDsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQ7CisgICAgYm9vbCBtSXNSZWFsVGltZVJlY29yZGluZzsKKyAgICBib29sIG1TdHJlYW1hYmxlRmlsZTsKKyAgICB1aW50NjRfdCBtRXN0aW1hdGVkQ3Vlc1NpemU7CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IG1DdWVQb2ludHM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0F1ZGlvSW5kZXggICAgID0gIDAsCisgICAgICAgIGtWaWRlb0luZGV4ICAgICA9ICAxLAorICAgICAgICBrTWF4U3RyZWFtcyAgICAgPSAgMiwKKyAgICB9OworCisgICAgc3RydWN0IFdlYm1TdHJlYW0geworICAgICAgICBpbnQgbVR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgKm1OYW1lOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gKCptTWFrZVRyYWNrKShjb25zdCBzcDxNZXRhRGF0YT4mKTsKKworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IG1UcmFja0VudHJ5OworICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IG1UaHJlYWQ7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+IG1TaW5rOworCisgICAgICAgIFdlYm1TdHJlYW0oKQorICAgICAgICAgICAgOiBtVHlwZShrSW52YWxpZFR5cGUpLAorICAgICAgICAgICAgICBtTmFtZSgiSW52YWxpZCIpLAorICAgICAgICAgICAgICBtTWFrZVRyYWNrKE5VTEwpIHsKKyAgICAgICAgfQorCisgICAgICAgIFdlYm1TdHJlYW0oaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIHNwPFdlYm1FbGVtZW50PiAoKm1ha2VUcmFjaykoY29uc3Qgc3A8TWV0YURhdGE+JikpCisgICAgICAgICAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgICAgICAgICBtTmFtZShuYW1lKSwKKyAgICAgICAgICAgICAgbU1ha2VUcmFjayhtYWtlVHJhY2spIHsKKyAgICAgICAgfQorCisgICAgICAgIFdlYm1TdHJlYW0gJm9wZXJhdG9yPShjb25zdCBXZWJtU3RyZWFtICZvdGhlcikgeworICAgICAgICAgICAgbVR5cGUgPSBvdGhlci5tVHlwZTsKKyAgICAgICAgICAgIG1OYW1lID0gb3RoZXIubU5hbWU7CisgICAgICAgICAgICBtTWFrZVRyYWNrID0gb3RoZXIubU1ha2VUcmFjazsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgIH07CisgICAgV2VibVN0cmVhbSBtU3RyZWFtc1trTWF4U3RyZWFtc107CisKKyAgICBzcDxXZWJtRnJhbWVTaW5rVGhyZWFkPiBtU2lua1RocmVhZDsKKworICAgIHNpemVfdCBudW1UcmFja3MoKTsKKyAgICB1aW50NjRfdCBlc3RpbWF0ZUN1ZXNTaXplKGludDMyX3QgYml0UmF0ZSk7CisgICAgdm9pZCBpbml0U3RyZWFtKHNpemVfdCBpZHgpOworICAgIHZvaWQgcmVsZWFzZSgpOworICAgIHN0YXR1c190IHJlc2V0KCk7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IHZpZGVvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCk7CisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBhdWRpb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2VibVdyaXRlcik7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisjZW5kaWYgLyogV0VCTVdSSVRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwCmluZGV4IDE4ODdiOGIuLmU4OGEzYmQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwCkBAIC02ODUsOSArNjg1LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFJUUFNlbmRlcjo6cGFyc2VSZWNlaXZlclJlcG9ydChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIC8vIGhleGR1bXAoZGF0YSwgc2l6ZSk7Ci0KK3N0YXR1c190IFJUUFNlbmRlcjo6cGFyc2VSZWNlaXZlclJlcG9ydCgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBmbG9hdCBmcmFjdGlvbkxvc3QgPSBkYXRhWzEyXSAvIDI1Ni4wZjsKIAogICAgIEFMT0dJKCJsb3N0ICUuMmYgJSUgb2YgcGFja2V0cyBkdXJpbmcgcmVwb3J0IGludGVydmFsLiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAKaW5kZXggNzUzYjNlYy4uMjgzNGE2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcApAQCAtNzQsMTkgKzc0LDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIFJlbGVhc2VNZWRpYUJ1ZmZlclJlZmVyZW5jZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgewotICAgIHZvaWQgKm1idWY7Ci0gICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1idWYpCi0gICAgICAgICAgICAmJiBtYnVmICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2luZyBtYnVmICVwIiwgbWJ1Zik7Ci0KLSAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIE5VTEwpOwotCi0gICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVyICo+KG1idWYpLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1idWYgPSBOVUxMOwotICAgIH0KLX0KLQogdm9pZCBDb252ZXJ0ZXI6OnJlbGVhc2VFbmNvZGVyKCkgewogICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTk1LDE4ICs4Miw3IEBACiAgICAgbUVuY29kZXItPnJlbGVhc2UoKTsKICAgICBtRW5jb2Rlci5jbGVhcigpOwogCi0gICAgd2hpbGUgKCFtSW5wdXRCdWZmZXJRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSAqbUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKTsKLSAgICAgICAgbUlucHV0QnVmZmVyUXVldWUuZXJhc2UobUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKSk7Ci0KLSAgICAgICAgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGFjY2Vzc1VuaXQpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChpKTsKLSAgICAgICAgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGFjY2Vzc1VuaXQpOwotICAgIH0KLQorICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmNsZWFyKCk7CiAgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKICAgICBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKIH0KQEAgLTMyOCw3ICszMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImFjY2Vzc1VuaXQiLCAmYWNjZXNzVW5pdCkpOwogCi0gICAgICAgICAgICAgICAgICAgIFJlbGVhc2VNZWRpYUJ1ZmZlclJlZmVyZW5jZShhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTM1MSwxNSArMzI3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZHJvcHBpbmcgZnJhbWUuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBSZWxlYXNlTWVkaWFCdWZmZXJSZWZlcmVuY2UoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAjaWYgMAotICAgICAgICAgICAgICAgIHZvaWQgKm1idWY7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1idWYpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9CisgICAgICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlciAqKShhY2Nlc3NVbml0LT5nZXRNZWRpYUJ1ZmZlckJhc2UoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgbWJ1ZiAlcCIsIG1idWYpOworICAgICAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgfQogI2VuZGlmCiAKQEAgLTY0NywxMyArNjI0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgICAgICAgICB2b2lkICptZWRpYUJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1lZGlhQnVmZmVyKQotICAgICAgICAgICAgICAgICAgICAmJiBtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KS0+bWV0YSgpCi0gICAgICAgICAgICAgICAgICAgIC0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBtZWRpYUJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPQorICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlciAqKShidWZmZXItPmdldE1lZGlhQnVmZmVyQmFzZSgpKTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KS0+c2V0TWVkaWFCdWZmZXJCYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXIpOwogCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgTlVMTCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmbGFncyA9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAKaW5kZXggN2U4ODkxZC4uODZiOTE4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvIGVuY29kZXIgd2lsbCByZWxlYXNlIE1lZGlhQnVmZmVyIHdoZW4gZG9uZQogICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHVuZGVybHlpbmcgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIG1idWYpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UobWJ1Zik7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCmluZGV4IDI4NmVhMTMuLjJjYjQ3ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTc0OSw3ICs3NTAsOCBAQAogCiAgICAgbUV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShtTWVkaWFQYXRoLmNfc3RyKCkpOworICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBtTWVkaWFQYXRoLmNfc3RyKCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTA1Myw3ICsxMDU1LDcgQEAKICAgICBlcnIgPSBzb3VyY2UtPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobnVtSW5wdXRCdWZmZXJzKTsKICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKLSAgICBtQnVmZmVyUXVldWUgPSBzb3VyY2UtPmdldEJ1ZmZlclF1ZXVlKCk7CisgICAgbVByb2R1Y2VyID0gc291cmNlLT5nZXRQcm9kdWNlcigpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTA3Nyw3ICsxMDc5LDcgQEAKIH0KIAogc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6Z2V0U3VyZmFjZVRleHR1cmUoKSB7Ci0gICAgcmV0dXJuIG1CdWZmZXJRdWV1ZTsKKyAgICByZXR1cm4gbVByb2R1Y2VyOwogfQogCiB2b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OnJlcXVlc3RJRFJGcmFtZSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oCmluZGV4IDVjOGVlOTQuLjI4MjQxNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaApAQCAtMjUsNyArMjUsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBCdWZmZXJRdWV1ZTsKIHN0cnVjdCBJSERDUDsKIHN0cnVjdCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogc3RydWN0IE1lZGlhUHVsbGVyOwpAQCAtMTExLDcgKzExMCw3IEBACiAKICAgICBpbnQ2NF90IG1MYXN0TGlmZXNpZ25VczsKIAotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogCiAgICAgS2V5ZWRWZWN0b3I8c2l6ZV90LCBzcDxUcmFjaz4gPiBtVHJhY2tzOwogICAgIHNzaXplX3QgbVZpZGVvVHJhY2tJbmRleDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKaW5kZXggY2M4ZGVlMy4uNTlkN2U2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKQEAgLTc5LDYgKzc5LDggQEAKIAogICAgIEFMT0dWKCJzdG9wcGluZyIpOwogCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RvcCgpOworCiAgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgewogICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CiAgICAgICAgIG1Mb29wZXIuY2xlYXIoKTsKQEAgLTkyLDcgKzk0LDYgQEAKICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAgICAgfQogCi0gICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RvcCgpOwogCiAgICAgQUxPR1YoInN0b3BwZWQiKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwCmluZGV4IGVlYjM3MDAuLjUwZDMxN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAKQEAgLTU2NSw3ICs1NjUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2l6ZV90IG51bVBhZGRpbmdCeXRlcyA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkIC0gbnVtQnl0ZXNPZlBheWxvYWQ7CisgICAgICAgIHNpemVfdCBudW1QYWRkaW5nQnl0ZXMgPSBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCAtIG51bUJ5dGVzT2ZQYXlsb2FkOwogICAgICAgICBBTE9HVigicGFja2V0IDEgY29udGFpbnMgJXpkIHBhZGRpbmcgYnl0ZXMgYW5kICV6ZCBieXRlcyBvZiBwYXlsb2FkIiwKICAgICAgICAgICAgICAgbnVtUGFkZGluZ0J5dGVzLCBudW1CeXRlc09mUGF5bG9hZCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKaW5kZXggMDVlNDAxOC4uZGE0MDVlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKQEAgLTc0Niw3ICs3NDYsNyBAQAogfQogCiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTFSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaW50MzJfdCAvKiBzZXNzaW9uSUQgKi8sIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IHN0YXR1c0NvZGU7CiAgICAgaWYgKCFtc2ctPmdldFN0YXR1c0NvZGUoJnN0YXR1c0NvZGUpKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC05OTEsNyArOTkxLDcgQEAKIH0KIAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU01UmVzcG9uc2UoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIGludDMyX3QgLyogc2Vzc2lvbklEICovLCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBzdGF0dXNDb2RlOwogICAgIGlmICghbXNnLT5nZXRTdGF0dXNDb2RlKCZzdGF0dXNDb2RlKSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKIH0KIAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU0xNlJlc3BvbnNlKAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZykgeworICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJiAvKiBtc2cgKi8pIHsKICAgICAvLyBJZiBvbmx5IHRoZSByZXNwb25zZSB3YXMgcmVxdWlyZWQgdG8gaW5jbHVkZSBhICJTZXNzaW9uOiIgaGVhZGVyLi4uCiAKICAgICBDSEVDS19FUShzZXNzaW9uSUQsIG1DbGllbnRTZXNzaW9uSUQpOwpAQCAtMTY4MCw3ICsxNjgwLDcgQEAKIH0KIAogdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6SERDUE9ic2VydmVyOjpub3RpZnkoCi0gICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIHsKKyAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKiAvKiBvYmogKi8pIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigibXNnIiwgbXNnKTsKICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgZXh0MSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCmluZGV4IGIzZjdiMWIuLmJiODZkZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCkBAIC0xMiw1ICsxMiw3IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF95dXYKIAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCmluZGV4IDdiOTAwMGIuLmJiM2UyZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMjI2LDggKzIyNiw4IEBACiAgICAgICAgICAgICAmeVNyY09mZnNldEluY3JlbWVudCwgJnVTcmNPZmZzZXRJbmNyZW1lbnQsICZ2U3JjT2Zmc2V0SW5jcmVtZW50KTsKIAogICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7Ci0gICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdURlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOwogICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKICAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOwogCkBAIC0zMDksNyArMzA5LDcgQEAKIAogICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CiAgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOwogICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKICAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOwogCkBAIC0zOTMsOSArMzkzLDkgQEAKICAgICBmcHJpbnRmKGZwLCAiMjU1XG4iKTsKICAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtSGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVdpZHRoOyArK3gpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlOwotICAgICAgICAgICAgdWludDhfdCB1VmFsdWU7Ci0gICAgICAgICAgICB1aW50OF90IHZWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlID0gMHU7CisgICAgICAgICAgICB1aW50OF90IHVWYWx1ZSA9IDB1OworICAgICAgICAgICAgdWludDhfdCB2VmFsdWUgPSAwdTsKICAgICAgICAgICAgIGdldFBpeGVsVmFsdWUoeCwgeSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJiB2VmFsdWUpOwogCiAgICAgICAgICAgICB1aW50OF90IHJWYWx1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCmluZGV4IDFhYzY0N2EuLjNhMjgwZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTUsNiArMTUsOCBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhdWRpb2ZsaW5nZXIgXAorCWxpYmF1ZGlvcG9saWN5c2VydmljZSBcCisJbGliY2FtZXJhX21ldGFkYXRhXAogCWxpYmNhbWVyYXNlcnZpY2UgXAogCWxpYm1lZGlhbG9nc2VydmljZSBcCiAJbGliY3V0aWxzIFwKQEAgLTIzLDcgKzI1LDggQEAKIAlsaWJtZWRpYXBsYXllcnNlcnZpY2UgXAogCWxpYnV0aWxzIFwKIAlsaWJsb2cgXAotCWxpYmJpbmRlcgorCWxpYmJpbmRlciBcCisJbGlic291bmR0cmlnZ2Vyc2VydmljZQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKIAlsaWJyZWdpc3Rlcm1zZXh0CkBAIC0zMiw4ICszNSwxMiBAQAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZQorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvc291bmR0cmlnZ2VyCiAKIExPQ0FMX01PRFVMRTo9IG1lZGlhc2VydmVyCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCBkNTIwN2Q1Li5hZjFjOWU2IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMzQsMTAgKzM0LDExIEBACiAjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCitpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhcioqIGFyZ3YpCiB7CiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKQEAgLTEyOCw2ICsxMjksNyBAQAogICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIENhbWVyYVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICAgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICByZWdpc3RlckV4dGVuc2lvbnMoKTsKICAgICAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FuZHJvaWQubWsgYi9tZWRpYS9tdHAvQW5kcm9pZC5tawppbmRleCBhYzYwOGExLi4zYWYwOTU2IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvQW5kcm9pZC5taworKysgYi9tZWRpYS9tdHAvQW5kcm9pZC5tawpAQCAtMzksOSArMzksNiBAQAogCiBMT0NBTF9DRkxBR1MgOj0gLURNVFBfREVWSUNFIC1ETVRQX0hPU1QKIAotIyBOZWVkZWQgZm9yIDxiaW9uaWNfdGltZS5oPgotTE9DQUxfQ19JTkNMVURFUyA6PSBiaW9uaWMvbGliYy9wcml2YXRlCi0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlidXRpbHMgbGliY3V0aWxzIGxpYmxvZyBsaWJ1c2Job3N0IGxpYmJpbmRlcgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKaW5kZXggYzRmODdhMC4uZTZlMTllMyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApAQCAtMzYzLDcgKzM2Myw3IEBACiB9CiAKIGludCBNdHBEYXRhUGFja2V0Ojp3cml0ZURhdGEoaW50IGZkLCB2b2lkKiBkYXRhLCB1aW50MzJfdCBsZW5ndGgpIHsKLSAgICBhbGxvY2F0ZShsZW5ndGgpOworICAgIGFsbG9jYXRlKGxlbmd0aCArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOwogICAgIG1lbWNweShtQnVmZmVyICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwgZGF0YSwgbGVuZ3RoKTsKICAgICBsZW5ndGggKz0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKICAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIGxlbmd0aCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCmluZGV4IGQ2NzJkZmYuLmQ2ZDVkZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCkBAIC0xOTUsNyArMTk1LDcgQEAKIAogTXRwRGV2aWNlOjp+TXRwRGV2aWNlKCkgewogICAgIGNsb3NlKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlUHJvcGVydGllcy5zaXplKCk7IGkrKykKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZXZpY2VQcm9wZXJ0aWVzLnNpemUoKTsgaSsrKQogICAgICAgICBkZWxldGUgbURldmljZVByb3BlcnRpZXNbaV07CiAgICAgdXNiX3JlcXVlc3RfZnJlZShtUmVxdWVzdEluMSk7CiAgICAgdXNiX3JlcXVlc3RfZnJlZShtUmVxdWVzdEluMik7CkBAIC0yNTMsNyArMjUzLDcgQEAKICAgICAgICAgICAgIEFMT0dJKCIqKiogRk9STUFUOiAlc1xuIiwgTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKGZvcm1hdCkpOwogICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBwcm9wcyA9IGdldE9iamVjdFByb3BzU3VwcG9ydGVkKGZvcm1hdCk7CiAgICAgICAgICAgICBpZiAocHJvcHMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb3BzLT5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcHJvcHMtPnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3AgPSAoKnByb3BzKVtqXTsKICAgICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gZ2V0T2JqZWN0UHJvcERlc2MocHJvcCwgZm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcAppbmRleCA2NGRkNDViLi5jNTAwOTAxIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCisrKyBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKQEAgLTE2LDYgKzE2LDggQEAKIAogI2RlZmluZSBMT0dfVEFHICJNdHBQcm9wZXJ0eSIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgogI2luY2x1ZGUgIk10cERlYnVnLmgiCiAjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKQEAgLTE4OSw5ICsxOTEsOSBAQAogICAgICAgICAgICAgaWYgKGRldmljZVByb3ApCiAgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1DdXJyZW50VmFsdWUpOwogICAgIH0KLSAgICBwYWNrZXQucHV0VUludDMyKG1Hcm91cENvZGUpOwogICAgIGlmICghZGV2aWNlUHJvcCkKLSAgICAgICAgcGFja2V0LnB1dFVJbnQ4KG1Gb3JtRmxhZyk7CisgICAgICAgIHBhY2tldC5wdXRVSW50MzIobUdyb3VwQ29kZSk7CisgICAgcGFja2V0LnB1dFVJbnQ4KG1Gb3JtRmxhZyk7CiAgICAgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybVJhbmdlKSB7CiAgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CiAgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbU1heGltdW1WYWx1ZSk7CkBAIC0zODUsMTAgKzM4NywxMCBAQAogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWQiLCB2YWx1ZS51LnUzMik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiVsbGQiLCB2YWx1ZS51Lmk2NCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlIiBQUklkNjQsIHZhbHVlLnUuaTY0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiVsbGQiLCB2YWx1ZS51LnU2NCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlIiBQUkl1NjQsIHZhbHVlLnUudTY0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiUwOFglMDhYJTA4WCUwOFgiLCB2YWx1ZS51LmkxMjhbMF0sIHZhbHVlLnUuaTEyOFsxXSwKQEAgLTUxNyw4ICs1MTksMTQgQEAKIAogTXRwUHJvcGVydHlWYWx1ZSogTXRwUHJvcGVydHk6OnJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKSB7CiAgICAgbGVuZ3RoID0gcGFja2V0LmdldFVJbnQzMigpOwotICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAvLyBGYWlsIGlmIHJlc3VsdGluZyBhcnJheSBpcyBvdmVyIDJHQi4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgbWF4aW11bSBhcnJheQorICAgIC8vIHNpemUgbWF5IGJlIGxlc3MgdGhhbiBTSVpFX01BWCBvbiBzb21lIHBsYXRmb3Jtcy4KKyAgICBpZiAoIENDX1VOTElLRUxZKAorICAgICAgICAgICAgbGVuZ3RoID09IDAgfHwKKyAgICAgICAgICAgIGxlbmd0aCA+PSBJTlQzMl9NQVggLyBzaXplb2YoTXRwUHJvcGVydHlWYWx1ZSkpICkgeworICAgICAgICBsZW5ndGggPSAwOwogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgTXRwUHJvcGVydHlWYWx1ZSogcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5VmFsdWVbbGVuZ3RoXTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQogICAgICAgICByZWFkVmFsdWUocGFja2V0LCByZXN1bHRbaV0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAppbmRleCBkZjg3ZGI0Li5hYTQzOTY3IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KQEAgLTkzLDYgKzk0LDcgQEAKICAgICBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsCiAgICAgTVRQX0VWRU5UX1NUT1JFX0FEREVELAogICAgIE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVELAorICAgIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELAogfTsKIAogTXRwU2VydmVyOjpNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgcHRwLApAQCAtMTI0LDcgKzEyNiw3IEBACiB2b2lkIE10cFNlcnZlcjo6cmVtb3ZlU3RvcmFnZShNdHBTdG9yYWdlKiBzdG9yYWdlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtU3RvcmFnZXNbaV0gPT0gc3RvcmFnZSkgewogICAgICAgICAgICAgbVN0b3JhZ2VzLnJlbW92ZUF0KGkpOwogICAgICAgICAgICAgc2VuZFN0b3JlUmVtb3ZlZChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSk7CkBAIC0xMzYsNyArMTM4LDcgQEAKIE10cFN0b3JhZ2UqIE10cFNlcnZlcjo6Z2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpIHsKICAgICBpZiAoaWQgPT0gMCkKICAgICAgICAgcmV0dXJuIG1TdG9yYWdlc1swXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBtU3RvcmFnZXNbaV07CiAgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOwpAQCAtMjYxLDYgKzI2MywxMSBAQAogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwgaWQpOwogfQogCit2b2lkIE10cFNlcnZlcjo6c2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgIEFMT0dWKCJzZW5kRGV2aWNlUHJvcGVydHlDaGFuZ2VkICVkXG4iLCBwcm9wZXJ0eSk7CisgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELCBwcm9wZXJ0eSk7Cit9CisKIHZvaWQgTXRwU2VydmVyOjpzZW5kRXZlbnQoTXRwRXZlbnRDb2RlIGNvZGUsIHVpbnQzMl90IHBhcmFtMSkgewogICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKICAgICAgICAgbUV2ZW50LnNldEV2ZW50Q29kZShjb2RlKTsKQEAgLTMxOCw2ICszMjUsMTQgQEAKICAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKICAgICB9CiAKKyAgICBpbnQgY29udGFpbmVydHlwZSA9IG1SZXF1ZXN0LmdldENvbnRhaW5lclR5cGUoKTsKKyAgICBpZiAoY29udGFpbmVydHlwZSAhPSBNVFBfQ09OVEFJTkVSX1RZUEVfQ09NTUFORCkgeworICAgICAgICBBTE9HRSgid3JvbmcgY29udGFpbmVyIHR5cGUgJWQiLCBjb250YWluZXJ0eXBlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgY29tbWFuZCAlcyAoJXgpIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7CisKICAgICBzd2l0Y2ggKG9wZXJhdGlvbikgewogICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPOgogICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldERldmljZUluZm8oKTsKQEAgLTQwOCw3ICs0MjMsOCBAQAogICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0VuZEVkaXRPYmplY3QoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImdvdCB1bnN1cHBvcnRlZCBjb21tYW5kICVzIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgICAgICAgICAgQUxPR0UoImdvdCB1bnN1cHBvcnRlZCBjb21tYW5kICVzICgleCkiLAorICAgICAgICAgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSwgb3BlcmF0aW9uKTsKICAgICAgICAgICAgIHJlc3BvbnNlID0gTVRQX1JFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNzg2LDcgKzgwMiw3IEBACiAgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOwogICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQogICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBmaWxlTGVuZ3RoKQorICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiAodWludDY0X3QpZmlsZUxlbmd0aCkKICAgICAgICAgbGVuZ3RoID0gZmlsZUxlbmd0aCAtIG9mZnNldDsKIAogICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOwpAQCAtOTQzLDIyICs5NTksMjggQEAKICAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOwogICAgIHVtYXNrKG1hc2spOwogCi0gICAgaWYgKGluaXRpYWxEYXRhID4gMCkKKyAgICBpZiAoaW5pdGlhbERhdGEgPiAwKSB7CiAgICAgICAgIHJldCA9IHdyaXRlKG1mci5mZCwgbURhdGEuZ2V0RGF0YSgpLCBpbml0aWFsRGF0YSk7CisgICAgfQogCi0gICAgaWYgKG1TZW5kT2JqZWN0RmlsZVNpemUgLSBpbml0aWFsRGF0YSA+IDApIHsKLSAgICAgICAgbWZyLm9mZnNldCA9IGluaXRpYWxEYXRhOwotICAgICAgICBpZiAobVNlbmRPYmplY3RGaWxlU2l6ZSA9PSAweEZGRkZGRkZGKSB7Ci0gICAgICAgICAgICAvLyB0ZWxsIGRyaXZlciB0byByZWFkIHVudGlsIGl0IHJlY2VpdmVzIGEgc2hvcnQgcGFja2V0Ci0gICAgICAgICAgICBtZnIubGVuZ3RoID0gMHhGRkZGRkZGRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplIC0gaW5pdGlhbERhdGE7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byB3cml0ZSBpbml0aWFsIGRhdGEiKTsKKyAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1TZW5kT2JqZWN0RmlsZVNpemUgLSBpbml0aWFsRGF0YSA+IDApIHsKKyAgICAgICAgICAgIG1mci5vZmZzZXQgPSBpbml0aWFsRGF0YTsKKyAgICAgICAgICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgICAgICAgICAvLyB0ZWxsIGRyaXZlciB0byByZWFkIHVudGlsIGl0IHJlY2VpdmVzIGEgc2hvcnQgcGFja2V0CisgICAgICAgICAgICAgICAgbWZyLmxlbmd0aCA9IDB4RkZGRkZGRkY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplIC0gaW5pdGlhbERhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJyZWNlaXZpbmcgJXNcbiIsIChjb25zdCBjaGFyICopbVNlbmRPYmplY3RGaWxlUGF0aCk7CisgICAgICAgICAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQorICAgICAgICAgICAgcmV0ID0gaW9jdGwobUZELCBNVFBfUkVDRUlWRV9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICAgICAgICAgIEFMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkXG4iLCByZXQpOwogICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoInJlY2VpdmluZyAlc1xuIiwgKGNvbnN0IGNoYXIgKiltU2VuZE9iamVjdEZpbGVQYXRoKTsKLSAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKLSAgICAgICAgcmV0ID0gaW9jdGwobUZELCBNVFBfUkVDRUlWRV9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKLSAgICAgICAgQUxPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAgICAgfQogICAgIGNsb3NlKG1mci5mZCk7CiAKQEAgLTk4Myw3ICsxMDA1LDcgQEAKIAogc3RhdGljIHZvaWQgZGVsZXRlUmVjdXJzaXZlKGNvbnN0IGNoYXIqIHBhdGgpIHsKICAgICBjaGFyIHBhdGhidWZbUEFUSF9NQVhdOwotICAgIGludCBwYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOworICAgIHNpemVfdCBwYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOwogICAgIGlmIChwYXRoTGVuZ3RoID49IHNpemVvZihwYXRoYnVmKSAtIDEpIHsKICAgICAgICAgQUxPR0UoInBhdGggdG9vIGxvbmc6ICVzXG4iLCBwYXRoKTsKICAgICB9CkBAIC0xMTA1LDEyICsxMTI3LDEzIEBACiAKICAgICAvLyBjYW4ndCBzdGFydCB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZQogICAgIGlmIChvZmZzZXQgPiBlZGl0LT5tU2l6ZSkgewotICAgICAgICBBTE9HRCgid3JpdGluZyBwYXN0IGVuZCBvZiBvYmplY3QsIG9mZnNldDogJWxsZCwgZWRpdC0+bVNpemU6ICVsbGQiLCBvZmZzZXQsIGVkaXQtPm1TaXplKTsKKyAgICAgICAgQUxPR0QoIndyaXRpbmcgcGFzdCBlbmQgb2Ygb2JqZWN0LCBvZmZzZXQ6ICUiIFBSSXU2NCAiLCBlZGl0LT5tU2l6ZTogJSIgUFJJdTY0LAorICAgICAgICAgICAgb2Zmc2V0LCBlZGl0LT5tU2l6ZSk7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9CiAKICAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopZWRpdC0+bVBhdGg7Ci0gICAgQUxPR1YoInJlY2VpdmluZyBwYXJ0aWFsICVzICVsbGQgJWxsZFxuIiwgZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigicmVjZWl2aW5nIHBhcnRpYWwgJXMgJSIgUFJJdTY0ICIgJSIgUFJJdTMyLCBmaWxlUGF0aCwgb2Zmc2V0LCBsZW5ndGgpOwogCiAgICAgLy8gcmVhZCB0aGUgaGVhZGVyLCBhbmQgcG9zc2libHkgc29tZSBkYXRhCiAgICAgaW50IHJldCA9IG1EYXRhLnJlYWQobUZEKTsKQEAgLTExMjQsMTUgKzExNDcsMTkgQEAKICAgICAgICAgbGVuZ3RoIC09IGluaXRpYWxEYXRhOwogICAgIH0KIAotICAgIGlmIChsZW5ndGggPiAwKSB7Ci0gICAgICAgIG10cF9maWxlX3JhbmdlICBtZnI7Ci0gICAgICAgIG1mci5mZCA9IGVkaXQtPm1GRDsKLSAgICAgICAgbWZyLm9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgbWZyLmxlbmd0aCA9IGxlbmd0aDsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHdyaXRlIGluaXRpYWwgZGF0YSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOworICAgICAgICAgICAgbWZyLmZkID0gZWRpdC0+bUZEOworICAgICAgICAgICAgbWZyLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgIG1mci5sZW5ndGggPSBsZW5ndGg7CiAKLSAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKLSAgICAgICAgcmV0ID0gaW9jdGwobUZELCBNVFBfUkVDRUlWRV9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKLSAgICAgICAgQUxPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOworICAgICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICAgICAgICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgICAgICAgICBBTE9HVigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZCIsIHJldCk7CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCAwKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaAppbmRleCBkZmE4MjU4Li5iM2ExMWUwIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmgKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCkBAIC0xMDQsNiArMTA0LDcgQEAKIAogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kRGV2aWNlUHJvcGVydHlDaGFuZ2VkKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRTdG9yZUFkZGVkKE10cFN0b3JhZ2VJRCBpZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcAppbmRleCBkY2QzN2NkLi4yYjFhOWFlIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKQEAgLTE2LDYgKzE2LDggQEAKIAogI2RlZmluZSBMT0dfVEFHICJNdHBTdG9yYWdlSW5mbyIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlICJNdHBEZWJ1Zy5oIgogI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBTdG9yYWdlSW5mby5oIgpAQCAtNjMsNyArNjUsNyBAQAogdm9pZCBNdHBTdG9yYWdlSW5mbzo6cHJpbnQoKSB7CiAgICAgQUxPR0QoIlN0b3JhZ2UgSW5mbyAlMDhYOlxuXHRtU3RvcmFnZVR5cGU6ICVkXG5cdG1GaWxlU3lzdGVtVHlwZTogJWRcblx0bUFjY2Vzc0NhcGFiaWxpdHk6ICVkXG4iLAogICAgICAgICAgICAgbVN0b3JhZ2VJRCwgbVN0b3JhZ2VUeXBlLCBtRmlsZVN5c3RlbVR5cGUsIG1BY2Nlc3NDYXBhYmlsaXR5KTsKLSAgICBBTE9HRCgiXHRtTWF4Q2FwYWNpdHk6ICVsbGRcblx0bUZyZWVTcGFjZUJ5dGVzOiAlbGxkXG5cdG1GcmVlU3BhY2VPYmplY3RzOiAlZFxuIiwKKyAgICBBTE9HRCgiXHRtTWF4Q2FwYWNpdHk6ICUiIFBSSXU2NCAiXG5cdG1GcmVlU3BhY2VCeXRlczogJSIgUFJJdTY0ICJcblx0bUZyZWVTcGFjZU9iamVjdHM6ICVkXG4iLAogICAgICAgICAgICAgbU1heENhcGFjaXR5LCBtRnJlZVNwYWNlQnl0ZXMsIG1GcmVlU3BhY2VPYmplY3RzKTsKICAgICBBTE9HRCgiXHRtU3RvcmFnZURlc2NyaXB0aW9uOiAlc1xuXHRtVm9sdW1lSWRlbnRpZmllcjogJXNcbiIsCiAgICAgICAgICAgICBtU3RvcmFnZURlc2NyaXB0aW9uLCBtVm9sdW1lSWRlbnRpZmllcik7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwIGIvbWVkaWEvbXRwL010cFV0aWxzLmNwcAppbmRleCA2ZWM4ODc2Li4wNjY3YmRkIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTE5LDcgKzE5LDggQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAotI2luY2x1ZGUgPGN1dGlscy90enRpbWUuaD4KKyNpbmNsdWRlIDwuLi9wcml2YXRlL2Jpb25pY190aW1lLmg+IC8qIFRPRE86IHN3aXRjaCB0aGlzIGNvZGUgdG8gaWN1NGMhICovCisKICNpbmNsdWRlICJNdHBVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5tayBiL21lZGlhL25kay9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNzk1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvQW5kcm9pZC5tawpAQCAtMCwwICsxLDUyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksIHRydWUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5ka01lZGlhQ29kZWMuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTmRrTWVkaWFDcnlwdG8uY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOZGtNZWRpYUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5ka01lZGlhRm9ybWF0LmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTmRrTWVkaWFNdXhlci5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOZGtNZWRpYURybS5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFuZGsKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgYmlvbmljL2xpYmMvcHJpdmF0ZSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIFwKKyAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbmRrCisKK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EIEVYUE9SVD0nX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKScKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYmluZGVyIFwKKyAgICBsaWJtZWRpYSBcCisgICAgbGlic3RhZ2VmcmlnaHQgXAorICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgIGxpYmxvZyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCisgICAgbGliYmluZGVyIFwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMDBiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKQEAgLTAsMCArMSw1MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUNvZGVjIgorCisjaW5jbHVkZSAiTmRrTWVkaWFDb2RlYy5oIgorI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUNyeXB0b1ByaXYuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSBpZiAoZXJyID09IC1FQUdBSU4pIHsKKyAgICAgICAgcmV0dXJuIChtZWRpYV9zdGF0dXNfdCkgQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVI7CisgICAgfQorICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCitlbnVtIHsKKyAgICBrV2hhdEFjdGl2aXR5Tm90aWZ5LAorICAgIGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywKKyAgICBrV2hhdFN0b3BBY3Rpdml0eU5vdGlmaWNhdGlvbnMsCit9OworCisKK2NsYXNzIENvZGVjSGFuZGxlcjogcHVibGljIEFIYW5kbGVyIHsKK3ByaXZhdGU6CisgICAgQU1lZGlhQ29kZWMqIG1Db2RlYzsKK3B1YmxpYzoKKyAgICBDb2RlY0hhbmRsZXIoQU1lZGlhQ29kZWMgKmNvZGVjKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworfTsKKwordHlwZWRlZiB2b2lkICgqT25Db2RlY0V2ZW50KShBTWVkaWFDb2RlYyAqY29kZWMsIHZvaWQgKnVzZXJkYXRhKTsKKworc3RydWN0IEFNZWRpYUNvZGVjIHsKKyAgICBzcDxhbmRyb2lkOjpNZWRpYUNvZGVjPiBtQ29kZWM7CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxDb2RlY0hhbmRsZXI+IG1IYW5kbGVyOworICAgIHNwPEFNZXNzYWdlPiBtQWN0aXZpdHlOb3RpZmljYXRpb247CisgICAgaW50MzJfdCBtR2VuZXJhdGlvbjsKKyAgICBib29sIG1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbjsKKyAgICBPbkNvZGVjRXZlbnQgbUNhbGxiYWNrOworICAgIHZvaWQgKm1DYWxsYmFja1VzZXJEYXRhOworfTsKKworQ29kZWNIYW5kbGVyOjpDb2RlY0hhbmRsZXIoQU1lZGlhQ29kZWMgKmNvZGVjKSB7CisgICAgbUNvZGVjID0gY29kZWM7Cit9CisKK3ZvaWQgQ29kZWNIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uczoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Db2RlYy0+bVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Db2RlYy0+bUNvZGVjLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obUNvZGVjLT5tQWN0aXZpdHlOb3RpZmljYXRpb24pOworICAgICAgICAgICAgbUNvZGVjLT5tUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb24gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QWN0aXZpdHlOb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQ29kZWMtPm1HZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1Db2RlYy0+bVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ29kZWMtPm1DYWxsYmFjaykgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrKG1Db2RlYywgbUNvZGVjLT5tQ2FsbGJhY2tVc2VyRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgbXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCk7CisKKyAgICAgICAgICAgIG1Db2RlYy0+bUdlbmVyYXRpb24rKzsKKyAgICAgICAgICAgIG1Db2RlYy0+bVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uID0gZmFsc2U7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2hvdWxkbid0IGJlIGhlcmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCisKK3N0YXRpYyB2b2lkIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihBTWVkaWFDb2RlYyAqY29kZWMpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywgY29kZWMtPm1IYW5kbGVyLT5pZCgpKSktPnBvc3QoKTsKK30KKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBBTWVkaWFDb2RlYyAqIGNyZWF0ZUFNZWRpYUNvZGVjKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgbmFtZV9pc190eXBlLCBib29sIGVuY29kZXIpIHsKKyAgICBBTWVkaWFDb2RlYyAqbURhdGEgPSBuZXcgQU1lZGlhQ29kZWMoKTsKKyAgICBtRGF0YS0+bUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1EYXRhLT5tTG9vcGVyLT5zZXROYW1lKCJOREsgTWVkaWFDb2RlY19sb29wZXIiKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtRGF0YS0+bUxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgICAgICAvLyBydW5PbkNhbGxpbmdUaHJlYWQKKyAgICAgICAgICAgIHRydWUsICAgICAgIC8vIGNhbkNhbGxKYXZhIFhYWAorICAgICAgICAgICAgUFJJT1JJVFlfRk9SRUdST1VORCk7CisgICAgaWYgKG5hbWVfaXNfdHlwZSkgeworICAgICAgICBtRGF0YS0+bUNvZGVjID0gYW5kcm9pZDo6TWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKG1EYXRhLT5tTG9vcGVyLCBuYW1lLCBlbmNvZGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRGF0YS0+bUNvZGVjID0gYW5kcm9pZDo6TWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKG1EYXRhLT5tTG9vcGVyLCBuYW1lKTsKKyAgICB9CisgICAgbURhdGEtPm1IYW5kbGVyID0gbmV3IENvZGVjSGFuZGxlcihtRGF0YSk7CisgICAgbURhdGEtPm1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtRGF0YS0+bUhhbmRsZXIpOworICAgIG1EYXRhLT5tR2VuZXJhdGlvbiA9IDE7CisgICAgbURhdGEtPm1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbiA9IGZhbHNlOworICAgIG1EYXRhLT5tQ2FsbGJhY2sgPSBOVUxMOworCisgICAgcmV0dXJuIG1EYXRhOworfQorCitFWFBPUlQKK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIGZhbHNlLCBmYWxzZSk7Cit9CisKK0VYUE9SVAorQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG1pbWVfdHlwZSwgdHJ1ZSwgZmFsc2UpOworfQorCitFWFBPUlQKK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICByZXR1cm4gY3JlYXRlQU1lZGlhQ29kZWMobmFtZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZGVsZXRlKEFNZWRpYUNvZGVjICptRGF0YSkgeworICAgIGlmIChtRGF0YS0+bUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGEtPm1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtRGF0YS0+bUNvZGVjLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKG1EYXRhLT5tTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGEtPm1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1EYXRhLT5tSGFuZGxlci0+aWQoKSk7CisgICAgICAgIG1EYXRhLT5tTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIG1EYXRhLT5tTG9vcGVyLmNsZWFyKCk7CisgICAgfQorICAgIGRlbGV0ZSBtRGF0YTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2NvbmZpZ3VyZSgKKyAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLAorICAgICAgICBjb25zdCBBTWVkaWFGb3JtYXQqIGZvcm1hdCwKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93LAorICAgICAgICBBTWVkaWFDcnlwdG8gKmNyeXB0bywKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbmF0aXZlRm9ybWF0OworICAgIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoZm9ybWF0LCAmbmF0aXZlRm9ybWF0KTsKKyAgICBBTE9HVigiY29uZmlndXJlIHdpdGggZm9ybWF0OiAlcyIsIG5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CisgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IE5VTEw7CisgICAgaWYgKHdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgIHN1cmZhY2UgPSAoU3VyZmFjZSopIHdpbmRvdzsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPmNvbmZpZ3VyZShuYXRpdmVGb3JtYXQsIHN1cmZhY2UsCisgICAgICAgICAgICBjcnlwdG8gPyBjcnlwdG8tPm1DcnlwdG8gOiBOVUxMLCBmbGFncykpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3N0YXJ0KEFNZWRpYUNvZGVjICptRGF0YSkgeworICAgIHN0YXR1c190IHJldCA9ICBtRGF0YS0+bUNvZGVjLT5zdGFydCgpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihyZXQpOworICAgIH0KKyAgICBtRGF0YS0+bUFjdGl2aXR5Tm90aWZpY2F0aW9uID0gbmV3IEFNZXNzYWdlKGtXaGF0QWN0aXZpdHlOb3RpZnksIG1EYXRhLT5tSGFuZGxlci0+aWQoKSk7CisgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRGF0YS0+bUdlbmVyYXRpb24pOworICAgIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtRGF0YSk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zdG9wKEFNZWRpYUNvZGVjICptRGF0YSkgeworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5zdG9wKCkpOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3BBY3Rpdml0eU5vdGlmaWNhdGlvbnMsIG1EYXRhLT5tSGFuZGxlci0+aWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBtRGF0YS0+bUFjdGl2aXR5Tm90aWZpY2F0aW9uLmNsZWFyKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2ZsdXNoKEFNZWRpYUNvZGVjICptRGF0YSkgeworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+Zmx1c2goKSk7Cit9CisKK0VYUE9SVAorc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLCBpbnQ2NF90IHRpbWVvdXRVcykgeworICAgIHNpemVfdCBpZHg7CisgICAgc3RhdHVzX3QgcmV0ID0gbURhdGEtPm1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpZHgsIHRpbWVvdXRVcyk7CisgICAgcmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG1EYXRhKTsKKyAgICBpZiAocmV0ID09IE9LKSB7CisgICAgICAgIHJldHVybiBpZHg7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworRVhQT1JUCit1aW50OF90KiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKKyAgICBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3A8YW5kcm9pZDo6QUJ1ZmZlcj4gPiBhYnVmczsKKyAgICBpZiAobURhdGEtPm1Db2RlYy0+Z2V0SW5wdXRCdWZmZXJzKCZhYnVmcykgPT0gMCkgeworICAgICAgICBzaXplX3QgbiA9IGFidWZzLnNpemUoKTsKKyAgICAgICAgaWYgKGlkeCA+PSBuKSB7CisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIGluZGV4ICV6dSBvdXQgb2YgcmFuZ2UiLCBpZHgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dF9zaXplICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpvdXRfc2l6ZSA9IGFidWZzW2lkeF0tPmNhcGFjaXR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFidWZzW2lkeF0tPmRhdGEoKTsKKyAgICB9CisgICAgQUxPR0UoImNvdWxkbid0IGdldCBpbnB1dCBidWZmZXJzIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVAordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSkgeworICAgIGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpzcDxhbmRyb2lkOjpBQnVmZmVyPiA+IGFidWZzOworICAgIGlmIChtRGF0YS0+bUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKCZhYnVmcykgPT0gMCkgeworICAgICAgICBzaXplX3QgbiA9IGFidWZzLnNpemUoKTsKKyAgICAgICAgaWYgKGlkeCA+PSBuKSB7CisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIGluZGV4ICV6dSBvdXQgb2YgcmFuZ2UiLCBpZHgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dF9zaXplICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpvdXRfc2l6ZSA9IGFidWZzW2lkeF0tPmNhcGFjaXR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFidWZzW2lkeF0tPmRhdGEoKTsKKyAgICB9CisgICAgQUxPR0UoImNvdWxkbid0IGdldCBvdXRwdXQgYnVmZmVycyIpOworICAgIHJldHVybiBOVUxMOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLAorICAgICAgICBzaXplX3QgaWR4LCBvZmZfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncykgeworCisgICAgQVN0cmluZyBlcnJvck1zZzsKKyAgICBzdGF0dXNfdCByZXQgPSBtRGF0YS0+bUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGlkeCwgb2Zmc2V0LCBzaXplLCB0aW1lLCBmbGFncywgJmVycm9yTXNnKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK0VYUE9SVAorc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLCBpbnQ2NF90IHRpbWVvdXRVcykgeworICAgIHNpemVfdCBpZHg7CisgICAgc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVczsKKyAgICBzdGF0dXNfdCByZXQgPSBtRGF0YS0+bUNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKCZpZHgsICZvZmZzZXQsICZzaXplLCAmcHJlc2VudGF0aW9uVGltZVVzLAorICAgICAgICAgICAgJmZsYWdzLCB0aW1lb3V0VXMpOworICAgIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtRGF0YSk7CisgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIGluZm8tPm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgIGluZm8tPnNpemUgPSBzaXplOworICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIGluZm8tPnByZXNlbnRhdGlvblRpbWVVcyA9IHByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIGNhc2UgLUVBR0FJTjoKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUjsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpJTkZPX0ZPUk1BVF9DSEFOR0VEOgorICAgICAgICAgICAgcmV0dXJuIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOworICAgICAgICBjYXNlIElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRDoKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitFWFBPUlQKK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KEFNZWRpYUNvZGVjICptRGF0YSkgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgbURhdGEtPm1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZmb3JtYXQpOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZnJvbU1zZygmZm9ybWF0KTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgYm9vbCByZW5kZXIpIHsKKyAgICBpZiAocmVuZGVyKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShpZHgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaWR4KSk7CisgICAgfQorfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgIEFMT0dWKCJyZW5kZXIgQCAlIiBQUklkNjQsIHRpbWVzdGFtcE5zKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2UoaWR4LCB0aW1lc3RhbXBOcykpOworfQorCisvL0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0Tm90aWZpY2F0aW9uQ2FsbGJhY2soQU1lZGlhQ29kZWMgKm1EYXRhLCBPbkNvZGVjRXZlbnQgY2FsbGJhY2ssIHZvaWQgKnVzZXJkYXRhKSB7CisgICAgbURhdGEtPm1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIG1EYXRhLT5tQ2FsbGJhY2tVc2VyRGF0YSA9IHVzZXJkYXRhOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyB7CisgICAgICAgIGludCBudW1zdWJzYW1wbGVzOworICAgICAgICB1aW50OF90IGtleVsxNl07CisgICAgICAgIHVpbnQ4X3QgaXZbMTZdOworICAgICAgICBjcnlwdG9pbmZvX21vZGVfdCBtb2RlOworICAgICAgICBzaXplX3QgKmNsZWFyYnl0ZXM7CisgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXM7Cit9IEFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICBBTWVkaWFDb2RlYyogY29kZWMsCisgICAgICAgIHNpemVfdCBpZHgsCisgICAgICAgIG9mZl90IG9mZnNldCwKKyAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjcnlwdG8sCisgICAgICAgIHVpbnQ2NF90IHRpbWUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisKKyAgICBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcyA9IG5ldyBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZVtjcnlwdG8tPm51bXN1YnNhbXBsZXNdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3J5cHRvLT5udW1zdWJzYW1wbGVzOyBpKyspIHsKKyAgICAgICAgc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSA9IGNyeXB0by0+Y2xlYXJieXRlc1tpXTsKKyAgICAgICAgc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBjcnlwdG8tPmVuY3J5cHRlZGJ5dGVzW2ldOworICAgIH0KKworICAgIEFTdHJpbmcgZXJyb3Jtc2c7CisgICAgc3RhdHVzX3QgZXJyICA9IGNvZGVjLT5tQ29kZWMtPnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoaWR4LAorICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgc3ViU2FtcGxlcywKKyAgICAgICAgICAgIGNyeXB0by0+bnVtc3Vic2FtcGxlcywKKyAgICAgICAgICAgIGNyeXB0by0+a2V5LAorICAgICAgICAgICAgY3J5cHRvLT5pdiwKKyAgICAgICAgICAgIChDcnlwdG9QbHVnaW46Ok1vZGUpIGNyeXB0by0+bW9kZSwKKyAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICZlcnJvcm1zZyk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJxdWVTZWN1cmVJbnB1dEJ1ZmZlcjogJXMiLCBlcnJvcm1zZy5jX3N0cigpKTsKKyAgICB9CisgICAgZGVsZXRlIFtdIHN1YlNhbXBsZXM7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworfQorCisKKworRVhQT1JUCitBTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcoCisgICAgICAgIGludCBudW1zdWJzYW1wbGVzLAorICAgICAgICB1aW50OF90IGtleVsxNl0sCisgICAgICAgIHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICBjcnlwdG9pbmZvX21vZGVfdCBtb2RlLAorICAgICAgICBzaXplX3QgKmNsZWFyYnl0ZXMsCisgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpIHsKKworICAgIC8vIHNpemUgbmVlZGVkIHRvIHN0b3JlIGFsbCB0aGUgY3J5cHRvIGRhdGEKKyAgICBzaXplX3QgY3J5cHRvc2l6ZSA9IHNpemVvZihBTWVkaWFDb2RlY0NyeXB0b0luZm8pICsgc2l6ZW9mKHNpemVfdCkgKiBudW1zdWJzYW1wbGVzICogMjsKKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8gKnJldCA9IChBTWVkaWFDb2RlY0NyeXB0b0luZm8qKSBtYWxsb2MoY3J5cHRvc2l6ZSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IGFsbG9jYXRlICV6dSBieXRlcyIsIGNyeXB0b3NpemUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0LT5udW1zdWJzYW1wbGVzID0gbnVtc3Vic2FtcGxlczsKKyAgICBtZW1jcHkocmV0LT5rZXksIGtleSwgMTYpOworICAgIG1lbWNweShyZXQtPml2LCBpdiwgMTYpOworICAgIHJldC0+bW9kZSA9IG1vZGU7CisKKyAgICAvLyBjbGVhcmJ5dGVzIGFuZCBlbmNyeXB0ZWRieXRlcyBwb2ludCBhdCB0aGUgYWN0dWFsIGRhdGEsIHdoaWNoIGZvbGxvd3MKKyAgICByZXQtPmNsZWFyYnl0ZXMgPSAoc2l6ZV90KikgKHJldCArIDEpOyAvLyBwb2ludCBpbW1lZGlhdGVseSBhZnRlciB0aGUgc3RydWN0CisgICAgcmV0LT5lbmNyeXB0ZWRieXRlcyA9IHJldC0+Y2xlYXJieXRlcyArIG51bXN1YnNhbXBsZXM7IC8vIHBvaW50IGFmdGVyIHRoZSBjbGVhciBzaXplcworCisgICAgbWVtY3B5KHJldC0+Y2xlYXJieXRlcywgY2xlYXJieXRlcywgbnVtc3Vic2FtcGxlcyAqIHNpemVvZihzaXplX3QpKTsKKyAgICBtZW1jcHkocmV0LT5lbmNyeXB0ZWRieXRlcywgZW5jcnlwdGVkYnl0ZXMsIG51bXN1YnNhbXBsZXMgKiBzaXplb2Yoc2l6ZV90KSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2RlbGV0ZShBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGluZm8pIHsKKyAgICBmcmVlKGluZm8pOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorc2l6ZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXROdW1TdWJTYW1wbGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY2kpIHsKKyAgICByZXR1cm4gY2ktPm51bXN1YnNhbXBsZXM7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEtleShBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGNpLCB1aW50OF90ICpkc3QpIHsKKyAgICBpZiAoIWNpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghZHN0KSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIG1lbWNweShkc3QsIGNpLT5rZXksIDE2KTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRJVihBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGNpLCB1aW50OF90ICpkc3QpIHsKKyAgICBpZiAoIWNpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghZHN0KSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIG1lbWNweShkc3QsIGNpLT5pdiwgMTYpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorY3J5cHRvaW5mb19tb2RlX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE1vZGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSkgeworICAgIGlmICghY2kpIHsKKyAgICAgICAgcmV0dXJuIChjcnlwdG9pbmZvX21vZGVfdCkgQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gY2ktPm1vZGU7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldENsZWFyQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSwgc2l6ZV90ICpkc3QpIHsKKyAgICBpZiAoIWNpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghZHN0KSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIG1lbWNweShkc3QsIGNpLT5jbGVhcmJ5dGVzLCBzaXplb2Yoc2l6ZV90KSAqIGNpLT5udW1zdWJzYW1wbGVzKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRFbmNyeXB0ZWRCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGNpLCBzaXplX3QgKmRzdCkgeworICAgIGlmICghY2kpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFkc3QpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgbWVtY3B5KGRzdCwgY2ktPmVuY3J5cHRlZGJ5dGVzLCBzaXplb2Yoc2l6ZV90KSAqIGNpLT5udW1zdWJzYW1wbGVzKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCit9IC8vIGV4dGVybiAiQyIKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjMmYxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhQ3J5cHRvIgorCisKKyNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgorI2luY2x1ZGUgIk5ka01lZGlhQ29kZWMuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKworCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCisKK3N0YXRpYyBzcDxJQ3J5cHRvPiBtYWtlQ3J5cHRvKCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgIHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7CisKKyAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KKyAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKKworICAgIGlmIChzZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8SUNyeXB0bz4gY3J5cHRvID0gc2VydmljZS0+bWFrZUNyeXB0bygpOworCisgICAgaWYgKGNyeXB0byA9PSBOVUxMIHx8IChjcnlwdG8tPmluaXRDaGVjaygpICE9IE9LICYmIGNyeXB0by0+aW5pdENoZWNrKCkgIT0gTk9fSU5JVCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNyeXB0bzsKK30KKworc3RydWN0IEFNZWRpYUNyeXB0byB7CisgICAgc3A8SUNyeXB0bz4gbUNyeXB0bzsKK307CisKKworZXh0ZXJuICJDIiB7CisKKworRVhQT1JUCitib29sIEFNZWRpYUNyeXB0b19pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCBBTWVkaWFVVUlEIHV1aWQpIHsKKyAgICBzcDxJQ3J5cHRvPiBjcnlwdG8gPSBtYWtlQ3J5cHRvKCk7CisgICAgaWYgKGNyeXB0byA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGNyeXB0by0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFDcnlwdG9fcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBzcDxJQ3J5cHRvPiBjcnlwdG8gPSBtYWtlQ3J5cHRvKCk7CisgICAgaWYgKGNyeXB0byA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGNyeXB0by0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KG1pbWUpOworfQorCitFWFBPUlQKK0FNZWRpYUNyeXB0byogQU1lZGlhQ3J5cHRvX25ldyhjb25zdCBBTWVkaWFVVUlEIHV1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhc2l6ZSkgeworCisgICAgc3A8SUNyeXB0bz4gdG1wID0gbWFrZUNyeXB0bygpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAodG1wLT5jcmVhdGVQbHVnaW4odXVpZCwgZGF0YSwgZGF0YXNpemUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQU1lZGlhQ3J5cHRvICpjcnlwdG8gPSBuZXcgQU1lZGlhQ3J5cHRvKCk7CisgICAgY3J5cHRvLT5tQ3J5cHRvID0gdG1wOworCisgICAgcmV0dXJuIGNyeXB0bzsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUNyeXB0b19kZWxldGUoQU1lZGlhQ3J5cHRvKiBjcnlwdG8pIHsKKyAgICBkZWxldGUgY3J5cHRvOworfQorCisKKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0b1ByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0b1ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVhOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvUHJpdi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0NSWVBUT19QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9DUllQVE9fUFJJVl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RydWN0IEFNZWRpYUNyeXB0byB7CisgICAgc3A8SUNyeXB0bz4gbUNyeXB0bzsKK307CisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0NSWVBUT19QUklWX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTA0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCkBAIC0wLDAgKzEsNzI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURybSIKKworI2luY2x1ZGUgIk5ka01lZGlhRHJtLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lEcm0uaD4KKyNpbmNsdWRlIDxtZWRpYS9JRHJtQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG5kay9OZGtNZWRpYUNyeXB0by5oPgorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit0eXBlZGVmIFZlY3Rvcjx1aW50OF90PiBpZHZlY190OworCitzdHJ1Y3QgRHJtTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIEJuRHJtQ2xpZW50Cit7Citwcml2YXRlOgorICAgIEFNZWRpYURybSAqbU9iajsKKyAgICBBTWVkaWFEcm1FdmVudExpc3RlbmVyIG1MaXN0ZW5lcjsKKworcHVibGljOgorICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSA6IG1PYmoob2JqKSwgbUxpc3RlbmVyKGxpc3RlbmVyKSB7fQorICAgIHZvaWQgbm90aWZ5KERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZSwgaW50IGV4dHJhLCBjb25zdCBQYXJjZWwgKm9iaik7Cit9OworCitzdHJ1Y3QgQU1lZGlhRHJtIHsKKyAgICBzcDxJRHJtPiBtRHJtOworICAgIHNwPElEcm1DbGllbnQ+IG1Ecm1DbGllbnQ7CisgICAgTGlzdDxpZHZlY190PiBtSWRzOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1RdWVyeVJlc3VsdHM7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1LZXlSZXF1ZXN0OworICAgIFZlY3Rvcjx1aW50OF90PiBtUHJvdmlzaW9uUmVxdWVzdDsKKyAgICBTdHJpbmc4IG1Qcm92aXNpb25Vcmw7CisgICAgU3RyaW5nOCBtUHJvcGVydHlTdHJpbmc7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1Qcm9wZXJ0eUJ5dGVBcnJheTsKKyAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+IG1TZWN1cmVTdG9wczsKKyAgICBzcDxEcm1MaXN0ZW5lcj4gbUxpc3RlbmVyOworfTsKKwordm9pZCBEcm1MaXN0ZW5lcjo6bm90aWZ5KERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZSwgaW50IGV4dHJhLCBjb25zdCBQYXJjZWwgKm9iaikgeworICAgIGlmICghbUxpc3RlbmVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTWVkaWFEcm1TZXNzaW9uSWQgc2Vzc2lvbklkID0ge05VTEwsIDB9OworICAgIGludDMyX3Qgc2Vzc2lvbklkU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7CisgICAgaWYgKHNlc3Npb25JZFNpemUpIHsKKyAgICAgICAgdWludDhfdCAqc2Vzc2lvbklkRGF0YSA9IG5ldyB1aW50OF90W3Nlc3Npb25JZFNpemVdOworICAgICAgICBzZXNzaW9uSWQucHRyID0gc2Vzc2lvbklkRGF0YTsKKyAgICAgICAgc2Vzc2lvbklkLmxlbmd0aCA9IHNlc3Npb25JZFNpemU7CisgICAgICAgIG9iai0+cmVhZChzZXNzaW9uSWREYXRhLCBzZXNzaW9uSWQubGVuZ3RoKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGRhdGFTaXplID0gb2JqLT5yZWFkSW50MzIoKTsKKyAgICB1aW50OF90ICpkYXRhID0gTlVMTDsKKyAgICBpZiAoZGF0YVNpemUpIHsKKyAgICAgICAgZGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKKyAgICAgICAgb2JqLT5yZWFkKGRhdGEsIGRhdGFTaXplKTsKKyAgICB9CisKKyAgICAvLyB0cmFuc2xhdGUgRHJtUGx1Z2luIGV2ZW50IHR5cGVzIGludG8gdGhlaXIgTkRLIGVxdWl2YWxlbnRzCisgICAgQU1lZGlhRHJtRXZlbnRUeXBlIG5ka0V2ZW50VHlwZTsKKyAgICBzd2l0Y2goZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRQcm92aXNpb25SZXF1aXJlZDoKKyAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX1BST1ZJU0lPTl9SRVFVSVJFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5TmVlZGVkOgorICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfS0VZX1JFUVVJUkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlFeHBpcmVkOgorICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfS0VZX0VYUElSRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFZlbmRvckRlZmluZWQ6CisgICAgICAgICAgICBuZGtFdmVudFR5cGUgPSBFVkVOVF9WRU5ET1JfREVGSU5FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZXZlbnQgRHJtUGx1Z2luOjpFdmVudFR5cGUgJWQsIGlnbm9yZWQiLCAoaW50KWV2ZW50VHlwZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKCptTGlzdGVuZXIpKG1PYmosICZzZXNzaW9uSWQsIG5ka0V2ZW50VHlwZSwgZXh0cmEsIGRhdGEsIGRhdGFTaXplKTsKKworICAgIGRlbGV0ZSBbXSBzZXNzaW9uSWQucHRyOworICAgIGRlbGV0ZSBbXSBkYXRhOworfQorCisKK2V4dGVybiAiQyIgeworCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlU3RhdHVzKHN0YXR1c190IHN0YXR1cykgeworICAgIG1lZGlhX3N0YXR1c190IHJlc3VsdCA9IEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWToKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fUkVTT1VSQ0VfQlVTWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFuZHJvaWQ6OkVSUk9SX0RSTV9ERVZJQ0VfUkVWT0tFRDoKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fREVWSUNFX1JFVk9LRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRToKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFuZHJvaWQ6OkVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQ6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX1RBTVBFUl9ERVRFQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFuZHJvaWQ6OkVSUk9SX0RSTV9OT19MSUNFTlNFOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9ORUVEX0tFWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFuZHJvaWQ6OkVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX0xJQ0VOU0VfRVhQSVJFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzcDxJRHJtPiBDcmVhdGVEcm0oKSB7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworCisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KKyAgICAgICAgc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKworICAgIHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPQorICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPihiaW5kZXIpOworCisgICAgaWYgKHNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxJRHJtPiBkcm0gPSBzZXJ2aWNlLT5tYWtlRHJtKCk7CisKKyAgICBpZiAoZHJtID09IE5VTEwgfHwgKGRybS0+aW5pdENoZWNrKCkgIT0gT0sgJiYgZHJtLT5pbml0Q2hlY2soKSAhPSBOT19JTklUKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtOworfQorCisKK3N0YXRpYyBzcDxJRHJtPiBDcmVhdGVEcm1Gcm9tVVVJRChjb25zdCBBTWVkaWFVVUlEIHV1aWQpIHsKKyAgICBzcDxJRHJtPiBkcm0gPSBDcmVhdGVEcm0oKTsKKworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBkcm0tPmNyZWF0ZVBsdWdpbih1dWlkKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGRybTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYURybV9pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCBBTWVkaWFVVUlEIHV1aWQsIGNvbnN0IGNoYXIgKm1pbWVUeXBlKSB7CisgICAgc3A8SURybT4gZHJtID0gQ3JlYXRlRHJtKCk7CisKKyAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzggbWltZVN0ciA9IG1pbWVUeXBlID8gU3RyaW5nOChtaW1lVHlwZSkgOiBTdHJpbmc4KCIiKTsKKyAgICByZXR1cm4gZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lU3RyKTsKK30KKworRVhQT1JUCitBTWVkaWFEcm0qIEFNZWRpYURybV9jcmVhdGVCeVVVSUQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKSB7CisgICAgQU1lZGlhRHJtICptT2JqID0gbmV3IEFNZWRpYURybSgpOworICAgIG1PYmotPm1Ecm0gPSBDcmVhdGVEcm1Gcm9tVVVJRCh1dWlkKTsKKyAgICByZXR1cm4gbU9iajsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYURybV9yZWxlYXNlKEFNZWRpYURybSAqbU9iaikgeworICAgIGlmIChtT2JqLT5tRHJtICE9IE5VTEwpIHsKKyAgICAgICAgbU9iai0+bURybS0+c2V0TGlzdGVuZXIoTlVMTCk7CisgICAgICAgIG1PYmotPm1Ecm0tPmRlc3Ryb3lQbHVnaW4oKTsKKyAgICAgICAgbU9iai0+bURybS5jbGVhcigpOworICAgIH0KKyAgICBkZWxldGUgbU9iajsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyKEFNZWRpYURybSAqbU9iaiwgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgbU9iai0+bUxpc3RlbmVyID0gbmV3IERybUxpc3RlbmVyKG1PYmosIGxpc3RlbmVyKTsKKyAgICBtT2JqLT5tRHJtLT5zZXRMaXN0ZW5lcihtT2JqLT5tTGlzdGVuZXIpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKKworc3RhdGljIGJvb2wgZmluZElkKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtQnl0ZUFycmF5ICZpZCwgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgJml0ZXIpIHsKKyAgICBpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOworICAgIHdoaWxlIChpdGVyICE9IG1PYmotPm1JZHMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZXItPmFycmF5KCkgPT0gaWQucHRyICYmIGl0ZXItPnNpemUoKSA9PSBpZC5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fb3BlblNlc3Npb24oQU1lZGlhRHJtICptT2JqLCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb247CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+b3BlblNlc3Npb24oc2Vzc2lvbik7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtT2JqLT5tSWRzLnB1c2hfZnJvbnQoc2Vzc2lvbik7CisgICAgICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXIgPSBtT2JqLT5tSWRzLmJlZ2luKCk7CisgICAgICAgIHNlc3Npb25JZC0+cHRyID0gaXRlci0+YXJyYXkoKTsKKyAgICAgICAgc2Vzc2lvbklkLT5sZW5ndGggPSBpdGVyLT5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbihBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNlc3Npb25JZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNlc3Npb25JZCwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKyAgICBtT2JqLT5tRHJtLT5jbG9zZVNlc3Npb24oKml0ZXIpOworICAgIG1PYmotPm1JZHMuZXJhc2UoaXRlcik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5pdCwgc2l6ZV90IGluaXRTaXplLCBjb25zdCBjaGFyICptaW1lVHlwZSwgQU1lZGlhRHJtS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlWYWx1ZSAqb3B0aW9uYWxQYXJhbWV0ZXJzLCBzaXplX3QgbnVtT3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBjb25zdCB1aW50OF90ICoqa2V5UmVxdWVzdCwgc2l6ZV90ICprZXlSZXF1ZXN0U2l6ZSkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIW1pbWVUeXBlIHx8ICFzY29wZSB8fCAha2V5UmVxdWVzdCB8fCAha2V5UmVxdWVzdFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzY29wZSwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50OF90PiBtZEluaXQ7CisgICAgbWRJbml0LmFwcGVuZEFycmF5KGluaXQsIGluaXRTaXplKTsKKyAgICBEcm1QbHVnaW46OktleVR5cGUgbWRLZXlUeXBlOworICAgIHN3aXRjaCAoa2V5VHlwZSkgeworICAgICAgICBjYXNlIEtFWV9UWVBFX1NUUkVBTUlORzoKKyAgICAgICAgICAgIG1kS2V5VHlwZSA9IERybVBsdWdpbjo6a0tleVR5cGVfU3RyZWFtaW5nOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0VZX1RZUEVfT0ZGTElORToKKyAgICAgICAgICAgIG1kS2V5VHlwZSA9IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtFWV9UWVBFX1JFTEVBU0U6CisgICAgICAgICAgICBtZEtleVR5cGUgPSBEcm1QbHVnaW46OmtLZXlUeXBlX1JlbGVhc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1kT3B0aW9uYWxQYXJhbWV0ZXJzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtT3B0aW9uYWxQYXJhbWV0ZXJzOyBpKyspIHsKKyAgICAgICAgbWRPcHRpb25hbFBhcmFtZXRlcnMuYWRkKFN0cmluZzgob3B0aW9uYWxQYXJhbWV0ZXJzW2ldLm1LZXkpLAorICAgICAgICAgICAgICAgIFN0cmluZzgob3B0aW9uYWxQYXJhbWV0ZXJzW2ldLm1WYWx1ZSkpOworICAgIH0KKyAgICBTdHJpbmc4IGRlZmF1bHRVcmw7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+Z2V0S2V5UmVxdWVzdCgqaXRlciwgbWRJbml0LCBTdHJpbmc4KG1pbWVUeXBlKSwKKyAgICAgICAgICAgIG1kS2V5VHlwZSwgbWRPcHRpb25hbFBhcmFtZXRlcnMsIG1PYmotPm1LZXlSZXF1ZXN0LCBkZWZhdWx0VXJsKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqa2V5UmVxdWVzdCA9IG1PYmotPm1LZXlSZXF1ZXN0LmFycmF5KCk7CisgICAgICAgICprZXlSZXF1ZXN0U2l6ZSA9IG1PYmotPm1LZXlSZXF1ZXN0LnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2NvcGUgKnNjb3BlLAorICAgICAgICBjb25zdCB1aW50OF90ICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlU2l6ZSwgQU1lZGlhRHJtS2V5U2V0SWQgKmtleVNldElkKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2NvcGUgfHwgIXJlc3BvbnNlIHx8ICFyZXNwb25zZVNpemUgfHwgIWtleVNldElkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2NvcGUsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1kUmVzcG9uc2U7CisgICAgbWRSZXNwb25zZS5hcHBlbmRBcnJheShyZXNwb25zZSwgcmVzcG9uc2VTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBtZEtleVNldElkOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPnByb3ZpZGVLZXlSZXNwb25zZSgqaXRlciwgbWRSZXNwb25zZSwgbWRLZXlTZXRJZCk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtT2JqLT5tSWRzLnB1c2hfZnJvbnQobWRLZXlTZXRJZCk7CisgICAgICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXIgPSBtT2JqLT5tSWRzLmJlZ2luKCk7CisgICAgICAgIGtleVNldElkLT5wdHIgPSBpdGVyLT5hcnJheSgpOworICAgICAgICBrZXlTZXRJZC0+bGVuZ3RoID0gaXRlci0+c2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGtleVNldElkLT5wdHIgPSBOVUxMOworICAgICAgICBrZXlTZXRJZC0+bGVuZ3RoID0gMDsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVzdG9yZUtleXMoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5U2V0SWQgKmtleVNldElkKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkIHx8ICFrZXlTZXRJZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldDsKKyAgICBrZXlTZXQuYXBwZW5kQXJyYXkoa2V5U2V0SWQtPnB0ciwga2V5U2V0SWQtPmxlbmd0aCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhtT2JqLT5tRHJtLT5yZXN0b3JlS2V5cygqaXRlciwga2V5U2V0KSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3JlbW92ZUtleXMoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKmtleVNldElkKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIWtleVNldElkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghZmluZElkKG1PYmosICprZXlTZXRJZCwgaXRlcikpIHsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldDsKKyAgICAgICAga2V5U2V0LmFwcGVuZEFycmF5KGtleVNldElkLT5wdHIsIGtleVNldElkLT5sZW5ndGgpOworICAgICAgICBzdGF0dXMgPSBtT2JqLT5tRHJtLT5yZW1vdmVLZXlzKGtleVNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gbU9iai0+bURybS0+cmVtb3ZlS2V5cygqaXRlcik7CisgICAgICAgIG1PYmotPm1JZHMuZXJhc2UoaXRlcik7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcXVlcnlLZXlTdGF0dXMoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgQU1lZGlhRHJtS2V5VmFsdWUgKmtleVZhbHVlUGFpcnMsIHNpemVfdCAqbnVtUGFpcnMpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzZXNzaW9uSWQgfHwgIW51bVBhaXJzKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNlc3Npb25JZCwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPnF1ZXJ5S2V5U3RhdHVzKCppdGVyLCBtT2JqLT5tUXVlcnlSZXN1bHRzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICpudW1QYWlycyA9IDA7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAobU9iai0+bVF1ZXJ5UmVzdWx0cy5zaXplKCkgPiAqbnVtUGFpcnMpIHsKKyAgICAgICAgKm51bVBhaXJzID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy5zaXplKCk7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NIT1JUX0JVRkZFUjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PYmotPm1RdWVyeVJlc3VsdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5VmFsdWVQYWlyc1tpXS5tS2V5ID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy5rZXlBdChpKS5zdHJpbmcoKTsKKyAgICAgICAga2V5VmFsdWVQYWlyc1tpXS5tVmFsdWUgPSBtT2JqLT5tUXVlcnlSZXN1bHRzLmtleUF0KGkpLnN0cmluZygpOworICAgIH0KKyAgICAqbnVtUGFpcnMgPSBtT2JqLT5tUXVlcnlSZXN1bHRzLnNpemUoKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm92aXNpb25SZXF1ZXN0KEFNZWRpYURybSAqbU9iaiwgY29uc3QgdWludDhfdCAqKnByb3Zpc2lvblJlcXVlc3QsCisgICAgICAgIHNpemVfdCAqcHJvdmlzaW9uUmVxdWVzdFNpemUsIGNvbnN0IGNoYXIgKipzZXJ2ZXJVcmwpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghcHJvdmlzaW9uUmVxdWVzdCB8fCAhcHJvdmlzaW9uUmVxdWVzdFNpemUgfHwgISpwcm92aXNpb25SZXF1ZXN0U2l6ZSB8fCAhc2VydmVyVXJsKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+Z2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4KCIiKSwgU3RyaW5nOCgiIiksCisgICAgICAgICAgICBtT2JqLT5tUHJvdmlzaW9uUmVxdWVzdCwgbU9iai0+bVByb3Zpc2lvblVybCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnByb3Zpc2lvblJlcXVlc3QgPSBtT2JqLT5tUHJvdmlzaW9uUmVxdWVzdC5hcnJheSgpOworICAgICAgICAqcHJvdmlzaW9uUmVxdWVzdFNpemUgPSBtT2JqLT5tUHJvdmlzaW9uUmVxdWVzdC5zaXplKCk7CisgICAgICAgICpzZXJ2ZXJVcmwgPSBtT2JqLT5tUHJvdmlzaW9uVXJsLnN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBjb25zdCB1aW50OF90ICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlU2l6ZSkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFyZXNwb25zZSB8fCAhcmVzcG9uc2VTaXplKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1kUmVzcG9uc2U7CisgICAgbWRSZXNwb25zZS5hcHBlbmRBcnJheShyZXNwb25zZSwgcmVzcG9uc2VTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiB1bnVzZWQ7CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhtT2JqLT5tRHJtLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UobWRSZXNwb25zZSwgdW51c2VkLCB1bnVzZWQpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0U2VjdXJlU3RvcHMoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBBTWVkaWFEcm1TZWN1cmVTdG9wICpzZWN1cmVTdG9wcywgc2l6ZV90ICpudW1TZWN1cmVTdG9wcykgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIW51bVNlY3VyZVN0b3BzKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldFNlY3VyZVN0b3BzKG1PYmotPm1TZWN1cmVTdG9wcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAqbnVtU2VjdXJlU3RvcHMgPSAwOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfQorICAgIGlmICgqbnVtU2VjdXJlU3RvcHMgPCBtT2JqLT5tU2VjdXJlU3RvcHMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NIT1JUX0JVRkZFUjsKKyAgICB9CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRlciA9IG1PYmotPm1TZWN1cmVTdG9wcy5iZWdpbigpOworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoaXRlciAhPSBtT2JqLT5tU2VjdXJlU3RvcHMuZW5kKCkpIHsKKyAgICAgICAgc2VjdXJlU3RvcHNbaV0ucHRyID0gaXRlci0+YXJyYXkoKTsKKyAgICAgICAgc2VjdXJlU3RvcHNbaV0ubGVuZ3RoID0gaXRlci0+c2l6ZSgpOworICAgICAgICArK2l0ZXI7CisgICAgICAgICsraTsKKyAgICB9CisgICAgKm51bVNlY3VyZVN0b3BzID0gbU9iai0+bVNlY3VyZVN0b3BzLnNpemUoKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZWxlYXNlU2VjdXJlU3RvcHMoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TZWN1cmVTdG9wICpzc1JlbGVhc2UpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzc1JlbGVhc2UpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDhfdD4gcmVsZWFzZTsKKyAgICByZWxlYXNlLmFwcGVuZEFycmF5KHNzUmVsZWFzZS0+cHRyLCBzc1JlbGVhc2UtPmxlbmd0aCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhtT2JqLT5tRHJtLT5yZWxlYXNlU2VjdXJlU3RvcHMocmVsZWFzZSkpOworfQorCisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqbU9iaiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAorICAgICAgICBjb25zdCBjaGFyICoqcHJvcGVydHlWYWx1ZSkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXByb3BlcnR5TmFtZSB8fCAhcHJvcGVydHlWYWx1ZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICAgICAgICAgIG1PYmotPm1Qcm9wZXJ0eVN0cmluZyk7CisKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICpwcm9wZXJ0eVZhbHVlID0gbU9iai0+bVByb3BlcnR5U3RyaW5nLnN0cmluZygpOworICAgIH0gZWxzZSB7CisgICAgICAgICpwcm9wZXJ0eVZhbHVlID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwgQU1lZGlhRHJtQnl0ZUFycmF5ICpwcm9wZXJ0eVZhbHVlKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXByb3BlcnR5TmFtZSB8fCAhcHJvcGVydHlWYWx1ZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICAgICAgICAgIG1PYmotPm1Qcm9wZXJ0eUJ5dGVBcnJheSk7CisKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIHByb3BlcnR5VmFsdWUtPnB0ciA9IG1PYmotPm1Qcm9wZXJ0eUJ5dGVBcnJheS5hcnJheSgpOworICAgICAgICBwcm9wZXJ0eVZhbHVlLT5sZW5ndGggPSBtT2JqLT5tUHJvcGVydHlCeXRlQXJyYXkuc2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByb3BlcnR5VmFsdWUtPnB0ciA9IE5VTEw7CisgICAgICAgIHByb3BlcnR5VmFsdWUtPmxlbmd0aCA9IDA7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0UHJvcGVydHlTdHJpbmcoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+c2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHZhbHVlKSkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwgY29uc3QgdWludDhfdCAqdmFsdWUsIHNpemVfdCB2YWx1ZVNpemUpIHsKKworICAgIFZlY3Rvcjx1aW50OF90PiBieXRlQXJyYXk7CisgICAgYnl0ZUFycmF5LmFwcGVuZEFycmF5KHZhbHVlLCB2YWx1ZVNpemUpOworCisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhtT2JqLT5tRHJtLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4KHByb3BlcnR5TmFtZSksCisgICAgICAgICAgICAgICAgICAgIGJ5dGVBcnJheSkpOworfQorCisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCBlbmNyeXB0X2RlY3J5cHRfY29tbW9uKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICZzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUsIGJvb2wgZW5jcnlwdCkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosIHNlc3Npb25JZCwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPnNldENpcGhlckFsZ29yaXRobSgqaXRlciwgU3RyaW5nOChjaXBoZXJBbGdvcml0aG0pKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5SWRWZWM7CisgICAgY29uc3Qgc2l6ZV90IGtLZXlJZFNpemUgPSAxNjsKKyAgICBrZXlJZFZlYy5hcHBlbmRBcnJheShrZXlJZCwga0tleUlkU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gaW5wdXRWZWM7CisgICAgaW5wdXRWZWMuYXBwZW5kQXJyYXkoaW5wdXQsIGRhdGFTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBpdlZlYzsKKyAgICBjb25zdCBzaXplX3Qga0l2U2l6ZSA9IDE2OworICAgIGl2VmVjLmFwcGVuZEFycmF5KGl2LCBrSXZTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBvdXRwdXRWZWM7CisgICAgaWYgKGVuY3J5cHQpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+ZW5jcnlwdCgqaXRlciwga2V5SWRWZWMsIGlucHV0VmVjLCBpdlZlYywgb3V0cHV0VmVjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5kZWNyeXB0KCppdGVyLCBrZXlJZFZlYywgaW5wdXRWZWMsIGl2VmVjLCBvdXRwdXRWZWMpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1lbWNweShvdXRwdXQsIG91dHB1dFZlYy5hcnJheSgpLCBvdXRwdXRWZWMuc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9lbmNyeXB0KEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUpIHsKKyAgICBpZiAoIXNlc3Npb25JZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gZW5jcnlwdF9kZWNyeXB0X2NvbW1vbihtT2JqLCAqc2Vzc2lvbklkLCBjaXBoZXJBbGdvcml0aG0sIGtleUlkLCBpdiwKKyAgICAgICAgICAgIGlucHV0LCBvdXRwdXQsIGRhdGFTaXplLCB0cnVlKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZGVjcnlwdChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICppdiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplKSB7CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIGVuY3J5cHRfZGVjcnlwdF9jb21tb24obU9iaiwgKnNlc3Npb25JZCwgY2lwaGVyQWxnb3JpdGhtLCBrZXlJZCwgaXYsCisgICAgICAgICAgICBpbnB1dCwgb3V0cHV0LCBkYXRhU2l6ZSwgZmFsc2UpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zaWduKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKm1hY0FsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKm1lc3NhZ2UsIHNpemVfdCBtZXNzYWdlU2l6ZSwKKyAgICAgICAgdWludDhfdCAqc2lnbmF0dXJlLCBzaXplX3QgKnNpZ25hdHVyZVNpemUpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2Vzc2lvbklkLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+c2V0TWFjQWxnb3JpdGhtKCppdGVyLCBTdHJpbmc4KG1hY0FsZ29yaXRobSkpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50OF90PiBrZXlJZFZlYzsKKyAgICBjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworICAgIGtleUlkVmVjLmFwcGVuZEFycmF5KGtleUlkLCBrS2V5SWRTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBtZXNzYWdlVmVjOworICAgIG1lc3NhZ2VWZWMuYXBwZW5kQXJyYXkobWVzc2FnZSwgbWVzc2FnZVNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNpZ25hdHVyZVZlYzsKKyAgICBzdGF0dXMgPSBtT2JqLT5tRHJtLT5zaWduKCppdGVyLCBrZXlJZFZlYywgbWVzc2FnZVZlYywgc2lnbmF0dXJlVmVjKTsKKyAgICBpZiAoc2lnbmF0dXJlVmVjLnNpemUoKSA+ICpzaWduYXR1cmVTaXplKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NIT1JUX0JVRkZFUjsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtZW1jcHkoc2lnbmF0dXJlLCBzaWduYXR1cmVWZWMuYXJyYXkoKSwgc2lnbmF0dXJlVmVjLnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fdmVyaWZ5KEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKm1hY0FsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIGNvbnN0IHVpbnQ4X3QgKm1lc3NhZ2UsIHNpemVfdCBtZXNzYWdlU2l6ZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc2lnbmF0dXJlLCBzaXplX3Qgc2lnbmF0dXJlU2l6ZSkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNlc3Npb25JZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5zZXRNYWNBbGdvcml0aG0oKml0ZXIsIFN0cmluZzgobWFjQWxnb3JpdGhtKSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjOworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAga2V5SWRWZWMuYXBwZW5kQXJyYXkoa2V5SWQsIGtLZXlJZFNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1lc3NhZ2VWZWM7CisgICAgbWVzc2FnZVZlYy5hcHBlbmRBcnJheShtZXNzYWdlLCBtZXNzYWdlU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gc2lnbmF0dXJlVmVjOworICAgIHNpZ25hdHVyZVZlYy5hcHBlbmRBcnJheShzaWduYXR1cmUsIHNpZ25hdHVyZVNpemUpOworCisgICAgYm9vbCBtYXRjaDsKKyAgICBzdGF0dXMgPSBtT2JqLT5tRHJtLT52ZXJpZnkoKml0ZXIsIGtleUlkVmVjLCBtZXNzYWdlVmVjLCBzaWduYXR1cmVWZWMsIG1hdGNoKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIHJldHVybiBtYXRjaCA/IEFNRURJQV9PSyA6IEFNRURJQV9EUk1fVkVSSUZZX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworfQorCit9IC8vIGV4dGVybiAiQyIKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1N2QwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRXh0cmFjdG9yIgorCisKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKworCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCitzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIHsKKyAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKKyAgICBzcDxBQnVmZmVyPiBtUHNzaEJ1ZjsKKworfTsKKworZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorQU1lZGlhRXh0cmFjdG9yKiBBTWVkaWFFeHRyYWN0b3JfbmV3KCkgeworICAgIEFMT0dWKCJjdG9yIik7CisgICAgQU1lZGlhRXh0cmFjdG9yICptRGF0YSA9IG5ldyBBTWVkaWFFeHRyYWN0b3IoKTsKKyAgICBtRGF0YS0+bUltcGwgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcigpOworICAgIHJldHVybiBtRGF0YTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICBBTE9HVigiZHRvciIpOworICAgIGRlbGV0ZSBtRGF0YTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgbG9jYXRpb24pOworICAgIC8vIFRPRE86IGFkZCBoZWFkZXIgc3VwcG9ydAorCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam9iamVjdCBzZXJ2aWNlID0gTlVMTDsKKyAgICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UocGF0aCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBKYXZhIHRocmVhZCIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSIpOworICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhSHR0cFNlcnZpY2UiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGptZXRob2RJRCBtZWRpYUh0dHBDcmVhdGVNZXRob2QgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1lZGlhaHR0cGNsYXNzLAorICAgICAgICAgICAgImNyZWF0ZUh0dHBTZXJ2aWNlQmluZGVySWZOZWNlc3NhcnkiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyIpOworICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGpzdHJpbmcgamxvYyA9IGVudi0+TmV3U3RyaW5nVVRGKGxvY2F0aW9uKTsKKworICAgIHNlcnZpY2UgPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobWVkaWFodHRwY2xhc3MsIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCwgamxvYyk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqbG9jKTsKKworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKKyAgICBpZiAoc2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgc2VydmljZSk7CisgICAgICAgIGh0dHBTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGJpbmRlcik7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBsb2NhdGlvbiwgTlVMTCk7CisgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKK30KKworRVhQT1JUCitzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIHJldHVybiBtRGF0YS0+bUltcGwtPmNvdW50VHJhY2tzKCk7Cit9CisKK0VYUE9SVAorQU1lZGlhRm9ybWF0KiBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgc2l6ZV90IGlkeCkgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgbURhdGEtPm1JbXBsLT5nZXRUcmFja0Zvcm1hdChpZHgsICZmb3JtYXQpOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZnJvbU1zZygmZm9ybWF0KTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgc2l6ZV90IGlkeCkgeworICAgIEFMT0dWKCJzZWxlY3RUcmFjayglenUpIiwgaWR4KTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tSW1wbC0+c2VsZWN0VHJhY2soaWR4KSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgc2l6ZV90IGlkeCkgeworICAgIEFMT0dWKCJ1bnNlbGVjdFRyYWNrKCV6dSkiLCBpZHgpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT51bnNlbGVjdFRyYWNrKGlkeCkpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIC8vQUxPR1YoImFkdmFuY2UiKTsKKyAgICByZXR1cm4gbURhdGEtPm1JbXBsLT5hZHZhbmNlKCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhBTWVkaWFFeHRyYWN0b3IgKmV4LCBpbnQ2NF90IHNlZWtQb3NVcywgU2Vla01vZGUgbW9kZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Ztb2RlOworICAgIGlmIChtb2RlID09IEFNRURJQUVYVFJBQ1RPUl9TRUVLX1BSRVZJT1VTX1NZTkMpIHsKKyAgICAgICAgc2Ztb2RlID0gYW5kcm9pZDo6TWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgfSBlbHNlIGlmIChtb2RlID09IEFNRURJQUVYVFJBQ1RPUl9TRUVLX0NMT1NFU1RfU1lOQykgeworICAgICAgICBzZm1vZGUgPSBhbmRyb2lkOjpNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOworICAgIH0gZWxzZSB7CisgICAgICAgIHNmbW9kZSA9IGFuZHJvaWQ6Ok1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM7CisgICAgfQorCisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihleC0+bUltcGwtPnNlZWtUbyhzZWVrUG9zVXMsIHNmbW9kZSkpOworfQorCitFWFBPUlQKK3NzaXplX3QgQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgLy9BTE9HVigicmVhZFNhbXBsZURhdGEiKTsKKyAgICBzcDxBQnVmZmVyPiB0bXAgPSBuZXcgQUJ1ZmZlcihidWZmZXIsIGNhcGFjaXR5KTsKKyAgICBpZiAobURhdGEtPm1JbXBsLT5yZWFkU2FtcGxlRGF0YSh0bXApID09IE9LKSB7CisgICAgICAgIHJldHVybiB0bXAtPnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitFWFBPUlQKK3VpbnQzMl90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CisgICAgaW50IHNhbXBsZUZsYWdzID0gMDsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUltcGwtPmdldFNhbXBsZU1ldGEoJm1ldGEpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQzMl90IHZhbDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbCkgJiYgdmFsICE9IDApIHsKKyAgICAgICAgc2FtcGxlRmxhZ3MgfD0gQU1FRElBRVhUUkFDVE9SX1NBTVBMRV9GTEFHX1NZTkM7CisgICAgfQorCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHNpemVfdCBzaXplOworICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIHNhbXBsZUZsYWdzIHw9IEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19FTkNSWVBURUQ7CisgICAgfQorICAgIHJldHVybiBzYW1wbGVGbGFnczsKK30KKworRVhQT1JUCitpbnQgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIHNpemVfdCBpZHg7CisgICAgaWYgKG1EYXRhLT5tSW1wbC0+Z2V0U2FtcGxlVHJhY2tJbmRleCgmaWR4KSAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpZHg7Cit9CisKK0VYUE9SVAoraW50NjRfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CisgICAgaW50NjRfdCB0aW1lOworICAgIGlmIChtRGF0YS0+bUltcGwtPmdldFNhbXBsZVRpbWUoJnRpbWUpICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHRpbWU7Cit9CisKK0VYUE9SVAorUHNzaEluZm8qIEFNZWRpYUV4dHJhY3Rvcl9nZXRQc3NoSW5mbyhBTWVkaWFFeHRyYWN0b3IgKmV4KSB7CisKKyAgICBpZiAoZXgtPm1Qc3NoQnVmICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIChQc3NoSW5mbyopIGV4LT5tUHNzaEJ1Zi0+ZGF0YSgpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgZXgtPm1JbXBsLT5nZXRGaWxlRm9ybWF0KCZmb3JtYXQpOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBpZighZm9ybWF0LT5maW5kQnVmZmVyKCJwc3NoIiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gdGhlIGZvcm1hdCBvZiB0aGUgYnVmZmVyIGlzIDEgb3IgbW9yZSBvZjoKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIDE2IGJ5dGUgdXVpZAorICAgIC8vICAgICAgICA0IGJ5dGUgZGF0YSBsZW5ndGggTgorICAgIC8vICAgICAgICBOIGJ5dGVzIG9mIGRhdGEKKyAgICAvLyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzb3VyY2UgZGF0YS4KKyAgICAvLyBTaW5jZSB3ZSBnb3QgdGhlIGRhdGEgZnJvbSBzdGFnZWZyaWdodCwgd2UgdHJ1c3QgaXQgaXMgdmFsaWQgYW5kIHByb3Blcmx5IGZvcm1hdHRlZC4KKyAgICBjb25zdCB1aW50OF90KiBkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IGxlbiA9IGJ1ZmZlci0+c2l6ZSgpOworICAgIHNpemVfdCBudW1lbnRyaWVzID0gMDsKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBudW1lbnRyaWVzKys7CisKKyAgICAgICAgLy8gc2tpcCB1dWlkCisgICAgICAgIGRhdGEgKz0gMTY7CisgICAgICAgIGxlbiAtPSAxNjsKKworICAgICAgICAvLyBnZXQgZGF0YSBsZW5ndGgKKyAgICAgICAgdWludDMyX3QgZGF0YWxlbiA9ICooKHVpbnQzMl90KilkYXRhKTsKKyAgICAgICAgZGF0YSArPSA0OworICAgICAgICBsZW4gLT0gNDsKKworICAgICAgICAvLyBza2lwIHRoZSBkYXRhCisgICAgICAgIGRhdGEgKz0gZGF0YWxlbjsKKyAgICAgICAgbGVuIC09IGRhdGFsZW47CisgICAgfQorCisgICAgLy8gdGhlcmUgYXJlIDxudW1lbnRyaWVzPiBpbiB0aGUgc291cmNlIGJ1ZmZlciwgd2UgbmVlZAorICAgIC8vIChzb3VyY2UgYnVmZmVyIHNpemUpIC0gKHNpemVvZih1aW50MzJfdCkgKiBudW1lbnRyaWVzKSArIHNpemVvZihzaXplX3QpCisgICAgLy8gICsgKChzaXplb2Yodm9pZCopICsgc2l6ZW9mKHNpemVfdCkpICogbnVtZW50cmllcykgYnl0ZXMgZm9yIHRoZSBQc3NoSW5mbyBzdHJ1Y3R1cmUKKyAgICAvLyBPciBpbiBvdGhlciB3b3JkcywgdGhlIGRhdGEgbGVuZ3RocyBpbiB0aGUgc291cmNlIHN0cnVjdHVyZSBhcmUgcmVwbGFjZWQgYnkgc2l6ZV90CisgICAgLy8gKHdoaWNoIG1heSBiZSB0aGUgc2FtZSBzaXplIG9yIGxhcmdlciwgZm9yIDY0IGJpdCksIGFuZCBpbiBhZGRpdGlvbiB0aGVyZSBpcyBhbgorICAgIC8vIGV4dHJhIHBvaW50ZXIgZm9yIGVhY2ggZW50cnksIGFuZCBhbiBleHRyYSBzaXplX3QgZm9yIHRoZSBlbnRpcmUgUHNzaEluZm8uCisgICAgc2l6ZV90IG5ld3NpemUgPSBidWZmZXItPnNpemUoKSAtIChzaXplb2YodWludDMyX3QpICogbnVtZW50cmllcykgKyBzaXplb2Yoc2l6ZV90KQorICAgICAgICAgICAgKyAoKHNpemVvZih2b2lkKikgKyBzaXplb2Yoc2l6ZV90KSkgKiBudW1lbnRyaWVzKTsKKyAgICBleC0+bVBzc2hCdWYgPSBuZXcgQUJ1ZmZlcihuZXdzaXplKTsKKyAgICBleC0+bVBzc2hCdWYtPnNldFJhbmdlKDAsIG5ld3NpemUpOworCisgICAgLy8gY29weSBkYXRhCisgICAgY29uc3QgdWludDhfdCogc3JjID0gYnVmZmVyLT5kYXRhKCk7CisgICAgdWludDhfdCogZHN0ID0gZXgtPm1Qc3NoQnVmLT5kYXRhKCk7CisgICAgdWludDhfdCogZHN0ZGF0YSA9IGRzdCArIHNpemVvZihzaXplX3QpICsgbnVtZW50cmllcyAqIHNpemVvZihQc3NoRW50cnkpOworICAgICooKHNpemVfdCopZHN0KSA9IG51bWVudHJpZXM7CisgICAgZHN0ICs9IHNpemVvZihzaXplX3QpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtZW50cmllczsgaSsrKSB7CisgICAgICAgIC8vIGNvcHkgdXVpZAorICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIDE2KTsKKyAgICAgICAgc3JjICs9IDE2OworICAgICAgICBkc3QgKz0gMTY7CisKKyAgICAgICAgLy8gZ2V0L2NvcHkgZGF0YSBsZW5ndGgKKyAgICAgICAgdWludDMyX3QgZGF0YWxlbiA9ICooKHVpbnQzMl90KilzcmMpOworICAgICAgICAqKChzaXplX3QqKWRzdCkgPSBkYXRhbGVuOworICAgICAgICBzcmMgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgZHN0ICs9IHNpemVvZihzaXplX3QpOworCisgICAgICAgIC8vIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBkZXN0aW5hdGlvbiBpcyBhIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBkYXRhLCB3aGljaCB3ZSBzdG9yZQorICAgICAgICAvLyBhZnRlciB0aGUgYXJyYXkgb2YgUHNzaEVudHJ5CisgICAgICAgICooKHZvaWQqKilkc3QpID0gZHN0ZGF0YTsKKyAgICAgICAgZHN0ICs9IHNpemVvZih2b2lkKik7CisKKyAgICAgICAgLy8gY29weSB0aGUgYWN0dWFsIGRhdGEKKyAgICAgICAgbWVtY3B5KGRzdGRhdGEsIHNyYywgZGF0YWxlbik7CisgICAgICAgIGRzdGRhdGEgKz0gZGF0YWxlbjsKKyAgICAgICAgc3JjICs9IGRhdGFsZW47CisgICAgfQorCisgICAgcmV0dXJuIChQc3NoSW5mbyopIGV4LT5tUHNzaEJ1Zi0+ZGF0YSgpOworfQorCitFWFBPUlQKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8oQU1lZGlhRXh0cmFjdG9yICpleCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhOworICAgIGlmKGV4LT5tSW1wbC0+Z2V0U2FtcGxlTWV0YSgmbWV0YSkgIT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmNyeXB0ZWRkYXRhOworICAgIHNpemVfdCBjcnlwdGVkc2l6ZTsKKyAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZjcnlwdGVkZGF0YSwgJmNyeXB0ZWRzaXplKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMgPSBjcnlwdGVkc2l6ZSAvIHNpemVvZihzaXplX3QpOworCisgICAgY29uc3Qgdm9pZCAqY2xlYXJkYXRhOworICAgIHNpemVfdCBjbGVhcnNpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmdHlwZSwgJmNsZWFyZGF0YSwgJmNsZWFyc2l6ZSkpIHsKKyAgICAgICAgaWYgKGNsZWFyc2l6ZSAhPSBjcnlwdGVkc2l6ZSkgeworICAgICAgICAgICAgLy8gVGhlIHR3byBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqa2V5OworICAgIHNpemVfdCBrZXlzaXplOworICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvSVYsICZ0eXBlLCAma2V5LCAma2V5c2l6ZSkpIHsKKyAgICAgICAgaWYgKGtleXNpemUgIT0gMTYpIHsKKyAgICAgICAgICAgIC8vIElWcyBtdXN0IGJlIDE2IGJ5dGVzIGluIGxlbmd0aC4KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqaXY7CisgICAgc2l6ZV90IGl2c2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUNyeXB0b0lWLCAmdHlwZSwgJml2LCAmaXZzaXplKSkgeworICAgICAgICBpZiAoaXZzaXplICE9IDE2KSB7CisgICAgICAgICAgICAvLyBJVnMgbXVzdCBiZSAxNiBieXRlcyBpbiBsZW5ndGguCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgbW9kZTsKKyAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1vZGUpKSB7CisgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CisgICAgfQorCisgICAgcmV0dXJuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcoCisgICAgICAgICAgICBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgKHVpbnQ4X3QqKSBrZXksCisgICAgICAgICAgICAodWludDhfdCopIGl2LAorICAgICAgICAgICAgKGNyeXB0b2luZm9fbW9kZV90KSBtb2RlLAorICAgICAgICAgICAgKHNpemVfdCopIGNsZWFyZGF0YSwKKyAgICAgICAgICAgIChzaXplX3QqKSBjcnlwdGVkZGF0YSk7Cit9CisKKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNTRkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUZvcm1hdCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdC5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RydWN0IEFNZWRpYUZvcm1hdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7CisgICAgU3RyaW5nOCBtRGVidWc7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVN0cmluZ0NhY2hlOworfTsKKworZXh0ZXJuICJDIiB7CisKKy8vIHByaXZhdGUgZnVuY3Rpb25zIGZvciBjb252ZXJzaW9uIHRvL2Zyb20gQU1lc3NhZ2UKK0FNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2coY29uc3Qgdm9pZCogZGF0YSkgeworICAgIEFMT0dWKCJwcml2YXRlIGN0b3IiKTsKKyAgICBBTWVkaWFGb3JtYXQqIG1EYXRhID0gbmV3IEFNZWRpYUZvcm1hdCgpOworICAgIG1EYXRhLT5tRm9ybWF0ID0gKigoc3A8QU1lc3NhZ2U+KilkYXRhKTsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCB2b2lkKiBkZXN0KSB7CisgICAgKigoc3A8QU1lc3NhZ2U+KilkZXN0KSA9IG1EYXRhLT5tRm9ybWF0OworfQorCisKKy8qCisgKiBwdWJsaWMgZnVuY3Rpb24gZm9sbG93CisgKi8KK0VYUE9SVAorQU1lZGlhRm9ybWF0ICpBTWVkaWFGb3JtYXRfbmV3KCkgeworICAgIEFMT0dWKCJjdG9yIik7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfZGVsZXRlKEFNZWRpYUZvcm1hdCAqbURhdGEpIHsKKyAgICBBTE9HVigiZHRvciIpOworICAgIGRlbGV0ZSBtRGF0YTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCisKK0VYUE9SVAorY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCAqbURhdGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gZiA9IG1EYXRhLT5tRm9ybWF0OworICAgIFN0cmluZzggcmV0OworICAgIGludCBudW0gPSBmLT5jb3VudEVudHJpZXMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdDsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGYtPmdldEVudHJ5TmFtZUF0KGksICZ0KTsKKyAgICAgICAgcmV0LmFwcGVuZChuYW1lKTsKKyAgICAgICAgcmV0LmFwcGVuZCgiOiAiKTsKKyAgICAgICAgc3dpdGNoICh0KSB7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgdmFsOworICAgICAgICAgICAgICAgIGYtPmZpbmRJbnQzMihuYW1lLCAmdmFsKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJpbnQzMiglIiBQUklkMzIgIikiLCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kSW50NjQobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiaW50NjQoJSIgUFJJZDY0ICIpIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU2l6ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgdmFsOworICAgICAgICAgICAgICAgIGYtPmZpbmRTaXplKG5hbWUsICZ2YWwpOworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoInNpemVfdCglenUpIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgdmFsOworICAgICAgICAgICAgICAgIGYtPmZpbmRGbG9hdChuYW1lLCAmdmFsKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJmbG9hdCglZikiLCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kRG91YmxlKG5hbWUsICZ2YWwpOworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoImRvdWJsZSglZikiLCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVN0cmluZyB2YWw7CisgICAgICAgICAgICAgICAgZi0+ZmluZFN0cmluZyhuYW1lLCAmdmFsKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJzdHJpbmcoJXMpIiwgdmFsLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiZGF0YSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJ1bmtub3duKCVkKSIsIHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldC5hcHBlbmQoIn0iKTsKKyAgICBtRGF0YS0+bURlYnVnID0gcmV0OworICAgIHJldHVybiBtRGF0YS0+bURlYnVnLnN0cmluZygpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEludDMyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICpvdXQpIHsKKyAgICByZXR1cm4gZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIobmFtZSwgb3V0KTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCAqb3V0KSB7CisgICAgcmV0dXJuIGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KG5hbWUsIG91dCk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFGb3JtYXRfZ2V0RmxvYXQoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICpvdXQpIHsKKyAgICByZXR1cm4gZm9ybWF0LT5tRm9ybWF0LT5maW5kRmxvYXQobmFtZSwgb3V0KTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXRTaXplKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKm91dCkgeworICAgIHJldHVybiBmb3JtYXQtPm1Gb3JtYXQtPmZpbmRTaXplKG5hbWUsIG91dCk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpvdXRzaXplKSB7CisgICAgc3A8QUJ1ZmZlcj4gYnVmOworICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIobmFtZSwgJmJ1ZikpIHsKKyAgICAgICAgKmRhdGEgPSBidWYtPmRhdGEoKSArIGJ1Zi0+b2Zmc2V0KCk7CisgICAgICAgICpvdXRzaXplID0gYnVmLT5zaXplKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKEFNZWRpYUZvcm1hdCogbURhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipvdXQpIHsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURhdGEtPm1TdHJpbmdDYWNoZS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKG1EYXRhLT5tU3RyaW5nQ2FjaGUua2V5QXQoaSkuc3RyaW5nKCksIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIG1EYXRhLT5tU3RyaW5nQ2FjaGUucmVtb3ZlSXRlbXNBdChpLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQVN0cmluZyB0bXA7CisgICAgaWYgKG1EYXRhLT5tRm9ybWF0LT5maW5kU3RyaW5nKG5hbWUsICZ0bXApKSB7CisgICAgICAgIFN0cmluZzggcmV0KHRtcC5jX3N0cigpKTsKKyAgICAgICAgbURhdGEtPm1TdHJpbmdDYWNoZS5hZGQoU3RyaW5nOChuYW1lKSwgcmV0KTsKKyAgICAgICAgKm91dCA9IHJldC5zdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCB2YWx1ZSkgeworICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0SW50MzIobmFtZSwgdmFsdWUpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEludDY0KEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90IHZhbHVlKSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5zZXRJbnQ2NChuYW1lLCB2YWx1ZSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5zZXRGbG9hdChuYW1lLCB2YWx1ZSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIC8vIEFNZXNzYWdlOjpzZXRTdHJpbmcoKSBtYWtlcyBhIGNvcHkgb2YgdGhlIHN0cmluZworICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0U3RyaW5nKG5hbWUsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgLy8gdGhlIEFCdWZmZXIodm9pZCosIHNpemVfdCkgY29uc3RydWN0b3IgZG9lc24ndCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZGF0YSwgc28gY3JlYXRlCisgICAgLy8gYSBuZXcgYnVmZmVyIGFuZCBjb3B5IHRoZSBkYXRhIGludG8gaXQKKyAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBtZW1jcHkoYnVmLT5kYXRhKCksIGRhdGEsIHNpemUpOworICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgc2l6ZSk7CisgICAgLy8gQU1lc3NhZ2U6OnNldEJ1ZmZlcigpIGluY3JlYXNlcyB0aGUgcmVmY291bnQgb2YgdGhlIGJ1ZmZlcgorICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0QnVmZmVyKG5hbWUsIGJ1Zik7Cit9CisKKworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUgPSAiYWFjLXByb2ZpbGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUgPSAiYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UID0gImNoYW5uZWwtY291bnQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLID0gImNoYW5uZWwtbWFzayI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQgPSAiY29sb3ItZm9ybWF0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OID0gImR1cmF0aW9uVXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCA9ICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUgPSAiZnJhbWUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRUlHSFQgPSAiaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFMgPSAiaXMtYWR0cyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUID0gImlzLWF1dG9zZWxlY3QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCA9ICJpcy1kZWZhdWx0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSA9ICJpcy1mb3JjZWQtc3VidGl0bGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCA9ICJpLWZyYW1lLWludGVydmFsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFID0gImxhbmd1YWdlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSA9ICJtYXgtaW5wdXQtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUUgPSAibWltZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSID0gInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSA9ICJzYW1wbGUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCA9ICJ3aWR0aCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgPSAic3RyaWRlIjsKKworCit9IC8vIGV4dGVybiAiQyIKKworCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzNDJkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKworI2luY2x1ZGUgPE5ka01lZGlhRm9ybWF0Lmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyh2b2lkKik7Cit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiMDM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFNdXhlciIKKworCisjaW5jbHVkZSAiTmRrTWVkaWFNdXhlci5oIgorI2luY2x1ZGUgIk5ka01lZGlhQ29kZWMuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKworCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCitzdHJ1Y3QgQU1lZGlhTXV4ZXIgeworICAgIHNwPE1lZGlhTXV4ZXI+IG1JbXBsOworCit9OworCitleHRlcm4gIkMiIHsKKworRVhQT1JUCitBTWVkaWFNdXhlciogQU1lZGlhTXV4ZXJfbmV3KGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCkgeworICAgIEFMT0dWKCJjdG9yIik7CisgICAgQU1lZGlhTXV4ZXIgKm1EYXRhID0gbmV3IEFNZWRpYU11eGVyKCk7CisgICAgbURhdGEtPm1JbXBsID0gbmV3IE1lZGlhTXV4ZXIoZmQsIChhbmRyb2lkOjpNZWRpYU11eGVyOjpPdXRwdXRGb3JtYXQpZm9ybWF0KTsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfZGVsZXRlKEFNZWRpYU11eGVyICptdXhlcikgeworICAgIEFMT0dWKCJkdG9yIik7CisgICAgZGVsZXRlIG11eGVyOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc2V0TG9jYXRpb24oQU1lZGlhTXV4ZXIgKm11eGVyLCBmbG9hdCBsYXRpdHVkZSwgZmxvYXQgbG9uZ3RpdHVkZSkgeworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobXV4ZXItPm1JbXBsLT5zZXRMb2NhdGlvbihsYXRpdHVkZSAqIDEwMDAwLCBsb25ndGl0dWRlICogMTAwMDApKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQoQU1lZGlhTXV4ZXIgKm11eGVyLCBpbnQgZGVncmVlcykgeworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobXV4ZXItPm1JbXBsLT5zZXRPcmllbnRhdGlvbkhpbnQoZGVncmVlcykpOworfQorCitFWFBPUlQKK3NzaXplX3QgQU1lZGlhTXV4ZXJfYWRkVHJhY2soQU1lZGlhTXV4ZXIgKm11eGVyLCBjb25zdCBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2c7CisgICAgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChmb3JtYXQsICZtc2cpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobXV4ZXItPm1JbXBsLT5hZGRUcmFjayhtc2cpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdGFydChBTWVkaWFNdXhlciAqbXV4ZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG11eGVyLT5tSW1wbC0+c3RhcnQoKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RvcChBTWVkaWFNdXhlciAqbXV4ZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG11eGVyLT5tSW1wbC0+c3RvcCgpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEoQU1lZGlhTXV4ZXIgKm11eGVyLAorICAgICAgICBzaXplX3QgdHJhY2tJZHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbykgeworICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKCh2b2lkKikoZGF0YSArIGluZm8tPm9mZnNldCksIGluZm8tPnNpemUpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoCisgICAgICAgICAgICBtdXhlci0+bUltcGwtPndyaXRlU2FtcGxlRGF0YShidWYsIHRyYWNrSWR4LCBpbmZvLT5wcmVzZW50YXRpb25UaW1lVXMsIGluZm8tPmZsYWdzKSk7Cit9CisKKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggNTQzNzdmMS4uNjk3ZmIzNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKQEAgLTEzLDI1ICsxMywzMyBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBTZXJ2aWNlVXRpbGl0aWVzLmNwcAorCisjIEZJWE1FIE1vdmUgdGhpcyBsaWJyYXJ5IHRvIGZyYW1ld29ya3MvbmF0aXZlCitMT0NBTF9NT0RVTEUgOj0gbGlic2VydmljZXV0aWxpdHkKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKwogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCiAgICAgQXVkaW9GbGluZ2VyLmNwcCAgICAgICAgICAgIFwKICAgICBUaHJlYWRzLmNwcCAgICAgICAgICAgICAgICAgXAogICAgIFRyYWNrcy5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgRWZmZWN0cy5jcHAgICAgICAgICAgICAgICAgIFwKICAgICBBdWRpb01peGVyLmNwcC5hcm0gICAgICAgICAgXAotICAgIEF1ZGlvUmVzYW1wbGVyLmNwcC5hcm0gICAgICBcCi0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCAgICAgIFwKLSAgICBTZXJ2aWNlVXRpbGl0aWVzLmNwcCAgICAgICAgXAotICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwLmFybSBcCi0gICAgQXVkaW9SZXNhbXBsZXJTaW5jLmNwcC5hcm0KKyAgICBQYXRjaFBhbmVsLmNwcAogCiBMT0NBTF9TUkNfRklMRVMgKz0gU3RhdGVRdWV1ZS5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcmVzYW1wbGVyIFwKICAgICBsaWJhdWRpb3V0aWxzIFwKICAgICBsaWJjb21tb25fdGltZV9jbGllbnQgXAogICAgIGxpYmN1dGlscyBcCkBAIC00MywxNyArNTEsMjAgQEAKICAgICBsaWJoYXJkd2FyZSBcCiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKICAgICBsaWJlZmZlY3RzIFwKLSAgICBsaWJkbCBcCiAgICAgbGlicG93ZXJtYW5hZ2VyCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYnNjaGVkdWxpbmdfcG9saWN5IFwKICAgICBsaWJjcHVzdGF0cyBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJzZXJ2aWNldXRpbGl0eQogCiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb2ZsaW5nZXIKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIAogTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RNaXhlci5jcHAgRmFzdE1peGVyU3RhdGUuY3BwIEF1ZGlvV2F0Y2hkb2cuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gRmFzdFRocmVhZC5jcHAgRmFzdFRocmVhZFN0YXRlLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RDYXB0dXJlLmNwcCBGYXN0Q2FwdHVyZVN0YXRlLmNwcAogCiBMT0NBTF9DRkxBR1MgKz0gLURTVEFURV9RVUVVRV9JTlNUQU5USUFUSU9OUz0nIlN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAiJwogCkBAIC03NCwxMiArODUsMTcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLQl0ZXN0LXJlc2FtcGxlLmNwcCAJCQlcCi0gICAgQXVkaW9SZXNhbXBsZXIuY3BwLmFybSAgICAgIFwKLQlBdWRpb1Jlc2FtcGxlckN1YmljLmNwcC5hcm0gXAotICAgIEF1ZGlvUmVzYW1wbGVyU2luYy5jcHAuYXJtCisgICAgdGVzdC1yZXNhbXBsZS5jcHAgICAgICAgICAgIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJzbmRmaWxlCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcmVzYW1wbGVyIFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKICAgICBsaWJkbCBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJ1dGlscyBcCkBAIC05MSw0ICsxMDcsMjQgQEAKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9SZXNhbXBsZXIuY3BwLmFybSBcCisgICAgQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAuYXJtIFwKKyAgICBBdWRpb1Jlc2FtcGxlclNpbmMuY3BwLmFybSBcCisgICAgQXVkaW9SZXNhbXBsZXJEeW4uY3BwLmFybQorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmN1dGlscyBcCisgICAgbGliZGwgXAorICAgIGxpYmxvZworCitMT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9yZXNhbXBsZXIKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDBhZWY1M2YuLjQxM2VjM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC04Miw2ICs4Miw3IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9GbGluZ2VyIG1heSBiZSBkZWFkbG9ja2VkXG4iOwogc3RhdGljIGNvbnN0IGNoYXIga0hhcmR3YXJlTG9ja2VkU3RyaW5nW10gPSAiSGFyZHdhcmUgbG9jayBpcyB0YWtlblxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIGtDbGllbnRMb2NrZWRTdHJpbmdbXSA9ICJDbGllbnQgbG9jayBpcyB0YWtlblxuIjsKIAogCiBuc2Vjc190IEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjcyA9IGtEZWZhdWx0U3RhbmRieVRpbWVJbk5zZWNzOwpAQCAtMTA0LDYgKzEwNSwzNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK2NvbnN0IGNoYXIgKmZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHN3aXRjaCAoZm9ybWF0ICYgQVVESU9fRk9STUFUX01BSU5fTUFTSykgeworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTToKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDogcmV0dXJuICJwY20xNiI7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84X0JJVDogcmV0dXJuICJwY204IjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDogcmV0dXJuICJwY20zMiI7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVDogcmV0dXJuICJwY204LjI0IjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOiByZXR1cm4gInBjbWZsb2F0IjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6IHJldHVybiAicGNtMjQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfTVAzOiByZXR1cm4gIm1wMyI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfQU1SX05COiByZXR1cm4gImFtci1uYiI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfQU1SX1dCOiByZXR1cm4gImFtci13YiI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfQUFDOiByZXR1cm4gImFhYyI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfSEVfQUFDX1YxOiByZXR1cm4gImhlLWFhYy12MSI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfSEVfQUFDX1YyOiByZXR1cm4gImhlLWFhYy12MiI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfVk9SQklTOiByZXR1cm4gInZvcmJpcyI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfT1BVUzogcmV0dXJuICJvcHVzIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6IHJldHVybiAiYWMtMyI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6IHJldHVybiAiZS1hYy0zIjsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuICJ1bmtub3duIjsKK30KKwogc3RhdGljIGludCBsb2FkX2F1ZGlvX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lLCBhdWRpb19od19kZXZpY2VfdCAqKmRldikKIHsKICAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwpAQCAtMTIxLDcgKzE1Miw3IEBACiAgICAgaWYgKHJjKSB7CiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiAhPSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fQ1VSUkVOVCkgeworICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgewogICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKICAgICAgICAgcmMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gb3V0OwpAQCAtMTM4LDYgKzE2OSw3IEBACiBBdWRpb0ZsaW5nZXI6OkF1ZGlvRmxpbmdlcigpCiAgICAgOiBCbkF1ZGlvRmxpbmdlcigpLAogICAgICAgbVByaW1hcnlIYXJkd2FyZURldihOVUxMKSwKKyAgICAgIG1BdWRpb0h3RGV2cyhOVUxMKSwKICAgICAgIG1IYXJkd2FyZVN0YXR1cyhBVURJT19IV19JRExFKSwKICAgICAgIG1NYXN0ZXJWb2x1bWUoMS4wZiksCiAgICAgICBtTWFzdGVyTXV0ZShmYWxzZSksCkBAIC0xNDYsMTQgKzE3OCwxNiBAQAogICAgICAgbUJ0TnJlY0lzT2ZmKGZhbHNlKSwKICAgICAgIG1Jc0xvd1JhbURldmljZSh0cnVlKSwKICAgICAgIG1Jc0RldmljZVR5cGVLbm93bihmYWxzZSksCi0gICAgICBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZSgwKQorICAgICAgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWUoMCksCisgICAgICBtUHJpbWFyeU91dHB1dFNhbXBsZVJhdGUoMCkKIHsKICAgICBnZXRwaWRfY2FjaGVkID0gZ2V0cGlkKCk7CiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGJvb2wgZG9Mb2cgPSAocHJvcGVydHlfZ2V0KCJyby50ZXN0X2hhcm5lc3MiLCB2YWx1ZSwgIjAiKSA+IDApICYmIChhdG9pKHZhbHVlKSA9PSAxKTsKICAgICBpZiAoZG9Mb2cpIHsKLSAgICAgICAgbUxvZ01lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJMb2dXcml0ZXJzIik7CisgICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIsIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpOwogICAgIH0KKwogI2lmZGVmIFRFRV9TSU5LCiAgICAgKHZvaWQpIHByb3BlcnR5X2dldCgicm8uZGVidWdnYWJsZSIsIHZhbHVlLCAiMCIpOwogICAgIGludCBkZWJ1Z2dhYmxlID0gYXRvaSh2YWx1ZSk7CkBAIC0xNjIsMTIgKzE5NiwxNiBAQAogICAgICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJhZi50ZWUiLCB2YWx1ZSwgIjAiKTsKICAgICAgICAgdGVlRW5hYmxlZCA9IGF0b2kodmFsdWUpOwogICAgIH0KLSAgICBpZiAodGVlRW5hYmxlZCAmIDEpCisgICAgLy8gRklYTUUgc3ltYm9saWMgY29uc3RhbnRzIGhlcmUKKyAgICBpZiAodGVlRW5hYmxlZCAmIDEpIHsKICAgICAgICAgbVRlZVNpbmtJbnB1dEVuYWJsZWQgPSB0cnVlOwotICAgIGlmICh0ZWVFbmFibGVkICYgMikKKyAgICB9CisgICAgaWYgKHRlZUVuYWJsZWQgJiAyKSB7CiAgICAgICAgIG1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiA0KQorICAgIH0KKyAgICBpZiAodGVlRW5hYmxlZCAmIDQpIHsKICAgICAgICAgbVRlZVNpbmtUcmFja0VuYWJsZWQgPSB0cnVlOworICAgIH0KICNlbmRpZgogfQogCkBAIC0xOTEsNiArMjI5LDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIG1QYXRjaFBhbmVsID0gbmV3IFBhdGNoUGFuZWwodGhpcyk7CisKICAgICBtTW9kZSA9IEFVRElPX01PREVfTk9STUFMOwogfQogCkBAIC0yMTAsNiArMjUwLDE4IEBACiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZShtQXVkaW9Id0RldnMudmFsdWVBdChpKS0+aHdEZXZpY2UoKSk7CiAgICAgICAgIGRlbGV0ZSBtQXVkaW9Id0RldnMudmFsdWVBdChpKTsKICAgICB9CisKKyAgICAvLyBUZWxsIG1lZGlhLmxvZyBzZXJ2aWNlIGFib3V0IGFueSBvbGQgd3JpdGVycyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUgdW5yZWdpc3RlcmVkCisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmxvZyIpKTsKKyAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgc3A8SU1lZGlhTG9nU2VydmljZT4gbWVkaWFMb2dTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUxvZ1NlcnZpY2U+KGJpbmRlcikpOworICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnNpemUoKTsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBpTWVtb3J5KG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnRvcCgpLT5nZXRJTWVtb3J5KCkpOworICAgICAgICAgICAgbVVucmVnaXN0ZXJlZFdyaXRlcnMucG9wKCk7CisgICAgICAgICAgICBtZWRpYUxvZ1NlcnZpY2UtPnVucmVnaXN0ZXJXcml0ZXIoaU1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9CisKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdWRpb19pbnRlcmZhY2VzW10gPSB7CkBAIC0yNDksNyArMzAxLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0yNzEsMTcgKzMyMywxNyBAQAogICAgIH0KIAogICAgIHJlc3VsdC5hcHBlbmQoIkdsb2JhbCBzZXNzaW9uIHJlZnM6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgc2Vzc2lvbiBwaWQgY291bnRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgc2Vzc2lvbiAgIHBpZCBjb3VudFxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7IGkrKykgewogICAgICAgICBBdWRpb1Nlc3Npb25SZWYgKnIgPSBtQXVkaW9TZXNzaW9uUmVmc1tpXTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICU3ZCAlM2QgJTNkXG4iLCByLT5tU2Vzc2lvbmlkLCByLT5tUGlkLCByLT5tQ250KTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAlN2QgJTVkICU1ZFxuIiwgci0+bVNlc3Npb25pZCwgci0+bVBpZCwgci0+bUNudCk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtMjk2LDcgKzM0OCw3IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtMzQ0LDcgKzM5NiwxNiBAQAogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBib29sIGNsaWVudExvY2tlZCA9IGR1bXBUcnlMb2NrKG1DbGllbnRMb2NrKTsKKyAgICAgICAgaWYgKCFjbGllbnRMb2NrZWQpIHsKKyAgICAgICAgICAgIFN0cmluZzggcmVzdWx0KGtDbGllbnRMb2NrZWRTdHJpbmcpOworICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIH0KICAgICAgICAgZHVtcENsaWVudHMoZmQsIGFyZ3MpOworICAgICAgICBpZiAoY2xpZW50TG9ja2VkKSB7CisgICAgICAgICAgICBtQ2xpZW50TG9jay51bmxvY2soKTsKKyAgICAgICAgfQorCiAgICAgICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwogCiAgICAgICAgIC8vIGR1bXAgcGxheWJhY2sgdGhyZWFkcwpAQCAtMzU3LDYgKzQxOCwxMyBAQAogICAgICAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+ZHVtcChmZCwgYXJncyk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBkdW1wIG9ycGhhbiBlZmZlY3QgY2hhaW5zCisgICAgICAgIGlmIChtT3JwaGFuRWZmZWN0Q2hhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICB3cml0ZShmZCwgIiAgT3JwaGFuIEVmZmVjdCBDaGFpbnNcbiIsIHN0cmxlbigiICBPcnBoYW4gRWZmZWN0IENoYWluc1xuIikpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3JwaGFuRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbU9ycGhhbkVmZmVjdENoYWlucy52YWx1ZUF0KGkpLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAvLyBkdW1wIGFsbCBoYXJkd2FyZSBkZXZzCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCk7CkBAIC0zNzksNyArNDQ3LDcgQEAKICAgICAgICAgaWYgKG1Mb2dNZW1vcnlEZWFsZXIgIT0gMCkgewogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmxvZyIpKTsKICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiXG5tZWRpYS5sb2c6XG4iKTsKKyAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG5tZWRpYS5sb2c6XG4iKTsKICAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CiAgICAgICAgICAgICAgICAgYmluZGVyLT5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgICAgIH0KQEAgLTM4OCw4ICs0NTYsOSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+IEF1ZGlvRmxpbmdlcjo6cmVnaXN0ZXJQaWRfbChwaWRfdCBwaWQpCitzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4gQXVkaW9GbGluZ2VyOjpyZWdpc3RlclBpZChwaWRfdCBwaWQpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CiAgICAgLy8gSWYgcGlkIGlzIGFscmVhZHkgaW4gdGhlIG1DbGllbnRzIHdwPD4gbWFwLCB0aGVuIHVzZSB0aGF0IGVudHJ5CiAgICAgLy8gKGZvciB3aGljaCBwcm9tb3RlKCkgaXMgYWx3YXlzICE9IDApLCBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVudHJ5IGFuZCBDbGllbnQuCiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBtQ2xpZW50cy52YWx1ZUZvcihwaWQpLnByb21vdGUoKTsKQEAgLTQwMywxNiArNDcyLDQ0IEBACiAKIHNwPE5CTG9nOjpXcml0ZXI+IEF1ZGlvRmxpbmdlcjo6bmV3V3JpdGVyX2woc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CisgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbG9ncywgcmV0dXJuIGEgZHVtbXkgd3JpdGVyIHRoYXQgZG9lcyBub3RoaW5nCiAgICAgaWYgKG1Mb2dNZW1vcnlEZWFsZXIgPT0gMCkgewogICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKICAgICB9Ci0gICAgc3A8SU1lbW9yeT4gc2hhcmVkID0gbUxvZ01lbW9yeURlYWxlci0+YWxsb2NhdGUoTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKTsKLSAgICBzcDxOQkxvZzo6V3JpdGVyPiB3cml0ZXIgPSBuZXcgTkJMb2c6OldyaXRlcihzaXplLCBzaGFyZWQpOwogICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5sb2ciKSk7Ci0gICAgaWYgKGJpbmRlciAhPSAwKSB7Ci0gICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUxvZ1NlcnZpY2U+KGJpbmRlciktPnJlZ2lzdGVyV3JpdGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSk7CisgICAgLy8gU2ltaWxhcmx5IGlmIHdlIGNhbid0IGNvbnRhY3QgdGhlIG1lZGlhLmxvZyBzZXJ2aWNlLCBhbHNvIHJldHVybiBhIGR1bW15IHdyaXRlcgorICAgIGlmIChiaW5kZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKICAgICB9Ci0gICAgcmV0dXJuIHdyaXRlcjsKKyAgICBzcDxJTWVkaWFMb2dTZXJ2aWNlPiBtZWRpYUxvZ1NlcnZpY2UoaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTG9nU2VydmljZT4oYmluZGVyKSk7CisgICAgc3A8SU1lbW9yeT4gc2hhcmVkID0gbUxvZ01lbW9yeURlYWxlci0+YWxsb2NhdGUoTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKTsKKyAgICAvLyBJZiBhbGxvY2F0aW9uIGZhaWxzLCBjb25zdWx0IHRoZSB2ZWN0b3Igb2YgcHJldmlvdXNseSB1bnJlZ2lzdGVyZWQgd3JpdGVycworICAgIC8vIGFuZCBnYXJiYWdlLWNvbGxlY3Qgb25lIG9yIG1vcmUgdGhlbSB1bnRpbCBhbiBhbGxvY2F0aW9uIHN1Y2NlZWRzCisgICAgaWYgKHNoYXJlZCA9PSAwKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtVW5yZWdpc3RlcmVkV3JpdGVyc0xvY2spOworICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnNpemUoKTsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gUGljayB0aGUgb2xkZXN0IHN0YWxlIHdyaXRlciB0byBnYXJiYWdlLWNvbGxlY3QKKyAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBpTWVtb3J5KG1VbnJlZ2lzdGVyZWRXcml0ZXJzWzBdLT5nZXRJTWVtb3J5KCkpOworICAgICAgICAgICAgICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgIG1lZGlhTG9nU2VydmljZS0+dW5yZWdpc3RlcldyaXRlcihpTWVtb3J5KTsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdGhlIG1lZGlhLmxvZyByZW1vdGUgcmVmZXJlbmNlIHRvIElNZW1vcnkgaXMgZ29uZS4gIFdoZW4gb3VyIGxhc3QgbG9jYWwKKyAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgdG8gSU1lbW9yeSBhbHNvIGRyb3BzIHRvIHplcm8gYXQgZW5kIG9mIHRoaXMgYmxvY2ssCisgICAgICAgICAgICAgICAgLy8gdGhlIElNZW1vcnkgZGVzdHJ1Y3RvciB3aWxsIGRlYWxsb2NhdGUgdGhlIHJlZ2lvbiBmcm9tIG1Mb2dNZW1vcnlEZWFsZXIuCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZS1hdHRlbXB0IHRoZSBhbGxvY2F0aW9uCisgICAgICAgICAgICBzaGFyZWQgPSBtTG9nTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpOworICAgICAgICAgICAgaWYgKHNoYXJlZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZ290byBzdWNjZXNzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEV2ZW4gYWZ0ZXIgZ2FyYmFnZS1jb2xsZWN0aW5nIGFsbCBvbGQgd3JpdGVycywgdGhlcmUgaXMgc3RpbGwgbm90IGVub3VnaCBtZW1vcnksCisgICAgICAgIC8vIHNvIHJldHVybiBhIGR1bW15IHdyaXRlcgorICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKKyAgICB9CitzdWNjZXNzOgorICAgIG1lZGlhTG9nU2VydmljZS0+cmVnaXN0ZXJXcml0ZXIoc2hhcmVkLCBzaXplLCBuYW1lKTsKKyAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoc2l6ZSwgc2hhcmVkKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OnVucmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8TkJMb2c6OldyaXRlcj4mIHdyaXRlcikKQEAgLTQyNCwxMyArNTIxLDEwIEBACiAgICAgaWYgKGlNZW1vcnkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5sb2ciKSk7Ci0gICAgaWYgKGJpbmRlciAhPSAwKSB7Ci0gICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUxvZ1NlcnZpY2U+KGJpbmRlciktPnVucmVnaXN0ZXJXcml0ZXIoaU1lbW9yeSk7Ci0gICAgICAgIC8vIE5vdyB0aGUgbWVkaWEubG9nIHJlbW90ZSByZWZlcmVuY2UgdG8gSU1lbW9yeSBpcyBnb25lLgotICAgICAgICAvLyBXaGVuIG91ciBsYXN0IGxvY2FsIHJlZmVyZW5jZSB0byBJTWVtb3J5IGFsc28gZHJvcHMgdG8gemVybywKLSAgICAgICAgLy8gdGhlIElNZW1vcnkgZGVzdHJ1Y3RvciB3aWxsIGRlYWxsb2NhdGUgdGhlIHJlZ2lvbiBmcm9tIG1NZW1vcnlEZWFsZXIuCi0gICAgfQorICAgIC8vIFJhdGhlciB0aGFuIHJlbW92aW5nIHRoZSB3cml0ZXIgaW1tZWRpYXRlbHksIGFwcGVuZCBpdCB0byBhIHF1ZXVlIG9mIG9sZCB3cml0ZXJzIHRvCisgICAgLy8gYmUgZ2FyYmFnZS1jb2xsZWN0ZWQgbGF0ZXIuICBUaGlzIGFsbG93cyB1cyB0byBjb250aW51ZSB0byB2aWV3IG9sZCBsb2dzIGZvciBhIHdoaWxlLgorICAgIE11dGV4OjpBdXRvbG9jayBfbChtVW5yZWdpc3RlcmVkV3JpdGVyc0xvY2spOworICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnB1c2god3JpdGVyKTsKIH0KIAogLy8gSUF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKQEAgLTQ0MSwxMyArNTM1LDEyIEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgKmZyYW1lQ291bnQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgIFN0cmluZzgmIG5hbWUsCiAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CkBAIC00NjUsMTAgKzU1OCwyOSBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJzaW9uIG9mIDgtYml0IFBDTSB0byAxNi1iaXQgUENNLAotICAgIC8vIGFuZCB3ZSBkb24ndCB5ZXQgc3VwcG9ydCA4LjI0IG9yIDMyLWJpdCBQQ00KLSAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGZvcm1hdCAlZCIsIGZvcm1hdCk7CisgICAgLy8gZnVydGhlciBzYW1wbGUgcmF0ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVUcmFja19sKCkgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQgdHlwZQorICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBzYW1wbGUgcmF0ZSAldSIsIHNhbXBsZVJhdGUpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gZnVydGhlciBjaGFubmVsIG1hc2sgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlVHJhY2tfbCgpIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkIHR5cGUKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBmdXJ0aGVyIGZvcm1hdCBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVUcmFja19sKCkgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQgdHlwZQorICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCAmJiBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIHNoYXJlZEJ1ZmZlciBpcyBub24tMCBidXQgaGFzIE5VTEwgcG9pbnRlcigpIik7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CkBAIC00NzYsNyArNTg4LDYgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKmVmZmVjdFRocmVhZCA9IE5VTEw7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIm5vIHBsYXliYWNrIHRocmVhZCBmb3VuZCBmb3Igb3V0cHV0IGhhbmRsZSAlZCIsIG91dHB1dCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtNDg0LDI0ICs1OTUsMjMgQEAKICAgICAgICAgfQogCiAgICAgICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKIAotICAgICAgICBjbGllbnQgPSByZWdpc3RlclBpZF9sKHBpZCk7Ci0KLSAgICAgICAgQUxPR1YoImNyZWF0ZVRyYWNrKCkgc2Vzc2lvbklkOiAlZCIsIChzZXNzaW9uSWQgPT0gTlVMTCkgPyAtMiA6ICpzZXNzaW9uSWQpOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKmVmZmVjdFRocmVhZCA9IE5VTEw7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW4gZWZmZWN0IGNoYWluIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCBpcyBwcmVzZW50IG9uIGFub3RoZXIKICAgICAgICAgICAgIC8vIG91dHB1dCB0aHJlYWQgYW5kIG1vdmUgaXQgaGVyZS4KICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0ID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLmtleUF0KGkpICE9IG91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXNzaW9ucyA9IHQtPmhhc0F1ZGlvU2Vzc2lvbigqc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vzc2lvbnMgPSB0LT5oYXNBdWRpb1Nlc3Npb24obFNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9ucyAmIFBsYXliYWNrVGhyZWFkOjpFRkZFQ1RfU0VTU0lPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0VGhyZWFkID0gdC5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBpZiBubyBhdWRpbyBzZXNzaW9uIGlkIGlzIHByb3ZpZGVkLCBjcmVhdGUgb25lIGhlcmUKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSBuZXh0VW5pcXVlSWQoKTsKQEAgLTUxOSwxMyArNjI5LDE0IEBACiAgICAgICAgIC8vIG1vdmUgZWZmZWN0IGNoYWluIHRvIHRoaXMgb3V0cHV0IHRocmVhZCBpZiBhbiBlZmZlY3Qgb24gc2FtZSBzZXNzaW9uIHdhcyB3YWl0aW5nCiAgICAgICAgIC8vIGZvciBhIHRyYWNrIHRvIGJlIGNyZWF0ZWQKICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IgJiYgZWZmZWN0VGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIG5vIHJpc2sgb2YgZGVhZGxvY2sgYmVjYXVzZSBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGlzIGhlbGQKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfZGwodGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKGVmZmVjdFRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgbW92ZUVmZmVjdENoYWluX2wobFNlc3Npb25JZCwgZWZmZWN0VGhyZWFkLCB0aHJlYWQsIHRydWUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gTG9vayBmb3Igc3luYyBldmVudHMgYXdhaXRpbmcgZm9yIGEgc2Vzc2lvbiB0byBiZSB1c2VkLgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbVBlbmRpbmdTeW5jRXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBlbmRpbmdTeW5jRXZlbnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAobVBlbmRpbmdTeW5jRXZlbnRzW2ldLT50cmlnZ2VyU2Vzc2lvbigpID09IGxTZXNzaW9uSWQpIHsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkLT5pc1ZhbGlkU3luY0V2ZW50KG1QZW5kaW5nU3luY0V2ZW50c1tpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTUzOCwyMyArNjQ5LDI3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIHMgZm9yIHNlcnZlcidzIHBpZCwgbiBmb3Igbm9ybWFsIG1peGVyIG5hbWUsIGYgZm9yIGZhc3QgaW5kZXgKLSAgICAgICAgbmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiczolZDtuOiVkO2Y6JWQiLCBnZXRwaWRfY2FjaGVkLCB0cmFjay0+bmFtZSgpIC0gQXVkaW9NaXhlcjo6VFJBQ0swLAotICAgICAgICAgICAgICAgIHRyYWNrLT5mYXN0SW5kZXgoKSk7Ci0gICAgICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBUcmFjayBzbyB0aGF0IHRoZSBDbGllbnQKLSAgICAgICAgLy8gZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIFRyYWNrQmFzZSBkZXN0cnVjdG9yIHdpdGggbUxvY2sgaGVsZAotICAgICAgICBjbGllbnQuY2xlYXIoKTsKLSAgICAgICAgdHJhY2suY2xlYXIoKTsKKwogICAgIH0KIAotRXhpdDoKLSAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgVHJhY2sgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1DbGllbnRMb2NrIGhlbGQKKyAgICAgICAgLy8gRG9uJ3QgaG9sZCBtQ2xpZW50TG9jayB3aGVuIHJlbGVhc2luZyB0aGUgcmVmZXJlbmNlIG9uIHRoZSB0cmFjayBhcyB0aGUKKyAgICAgICAgLy8gZGVzdHJ1Y3RvciB3aWxsIGFjcXVpcmUgaXQuCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2suY2xlYXIoKTsKKyAgICAgICAgZ290byBFeGl0OwogICAgIH0KKworICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CisgICAgdHJhY2tIYW5kbGUgPSBuZXcgVHJhY2tIYW5kbGUodHJhY2spOworCitFeGl0OgorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFja0hhbmRsZTsKIH0KIApAQCAtNTY5LDE3ICs2ODQsNiBAQAogICAgIHJldHVybiB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKIH0KIAotaW50IEF1ZGlvRmxpbmdlcjo6Y2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKLSAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImNoYW5uZWxDb3VudCgpIHVua25vd24gdGhyZWFkICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiB0aHJlYWQtPmNoYW5uZWxDb3VudCgpOwotfQotCiBhdWRpb19mb3JtYXRfdCBBdWRpb0ZsaW5nZXI6OmZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTcwMyw5ICs4MDcsMTQgQEAKICAgICB9CiAKICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTUlDX01VVEU7Ci0gICAgcmV0ID0gZGV2LT5zZXRfbWljX211dGUoZGV2LCBzdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBkZXYtPnNldF9taWNfbXV0ZShkZXYsIHN0YXRlKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0ID0gcmVzdWx0OworICAgICAgICB9CisgICAgfQogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTgwNCw3ICs5MTMsNyBAQAogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBOVUxMOwotICAgIGlmIChvdXRwdXQpIHsKKyAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC04MzksNyArOTQ4LDcgQEAKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS5tdXRlID0gbXV0ZWQ7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKQogICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNldFN0cmVhbU11dGUoc3RyZWFtLCBtdXRlZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC04NTMsNyArOTYyLDcgQEAKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBmbG9hdCB2b2x1bWU7Ci0gICAgaWYgKG91dHB1dCkgeworICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiAwLjBmOwpAQCAtODg2LDggKzk5NSw4IEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICAvLyBpb0hhbmRsZSA9PSAwIG1lYW5zIHRoZSBwYXJhbWV0ZXJzIGFyZSBnbG9iYWwgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZQotICAgIGlmIChpb0hhbmRsZSA9PSAwKSB7CisgICAgLy8gQVVESU9fSU9fSEFORExFX05PTkUgbWVhbnMgdGhlIHBhcmFtZXRlcnMgYXJlIGdsb2JhbCB0byB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlCisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIHN0YXR1c190IGZpbmFsX3Jlc3VsdCA9IE5PX0VSUk9SOwogICAgICAgICB7CkBAIC05NjksNyArMTA3OCw3IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKGlvSGFuZGxlID09IDApIHsKKyAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgU3RyaW5nOCBvdXRfczg7CiAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKQEAgLTEwMDgsNyArMTExNyw3IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19HRVRfSU5QVVRfQlVGRkVSX1NJWkU7Ci0gICAgc3RydWN0IGF1ZGlvX2NvbmZpZyBjb25maWc7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnOwogICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CiAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CkBAIC0xMDIwLDcgKzExMjksNyBAQAogICAgIHJldHVybiBzaXplOwogfQogCi11bnNpZ25lZCBpbnQgQXVkaW9GbGluZ2VyOjpnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OmdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCkBAIC0xMDUyLDcgKzExNjEsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0UmVuZGVyUG9zaXRpb24oc2l6ZV90ICpoYWxGcmFtZXMsIHNpemVfdCAqZHNwRnJhbWVzLAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzLAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0CiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwpAQCAtMTA2OSwyMSArMTE3OCwzMiBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6cmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCkKIHsKLQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCBjbGllbnRBZGRlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CiAKLSAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkocGlkKSA8IDApIHsKLSAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7Ci0gICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgcGlkICVkIiwgbm90aWZpY2F0aW9uQ2xpZW50LmdldCgpLCBwaWQpOworICAgICAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHBpZCkgPCAwKSB7CisgICAgICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCBwaWQgJWQiLCBub3RpZmljYXRpb25DbGllbnQuZ2V0KCksIHBpZCk7CiAKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHBpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZChwaWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CiAKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY2xpZW50LT5hc0JpbmRlcigpOwotICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CisgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBjbGllbnQtPmFzQmluZGVyKCk7CisgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CisgICAgICAgICAgICBjbGllbnRBZGRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CiAKKyAgICAvLyBtQ2xpZW50TG9jayBzaG91bGQgbm90IGJlIGhlbGQgaGVyZSBiZWNhdXNlIFRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KCkgd2lsbCBsb2NrIHRoZQorICAgIC8vIFRocmVhZEJhc2UgbXV0ZXggYW5kIHRoZSBsb2NraW5nIG9yZGVyIGlzIFRocmVhZEJhc2U6Om1Mb2NrIHRoZW4gQXVkaW9GbGluZ2VyOjptQ2xpZW50TG9jay4KKyAgICBpZiAoY2xpZW50QWRkZWQpIHsKICAgICAgICAgLy8gdGhlIGNvbmZpZyBjaGFuZ2UgaXMgYWx3YXlzIHNlbnQgZnJvbSBwbGF5YmFjayBvciByZWNvcmQgdGhyZWFkcyB0byBhdm9pZCBkZWFkbG9jawogICAgICAgICAvLyB3aXRoIEF1ZGlvU3lzdGVtOjpnTG9jawogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKQEAgLTEwOTksOCArMTIxOSwxMCBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0ocGlkKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHBpZCk7CisgICAgfQogCiAgICAgQUxPR1YoIiVkIGRpZWQsIHJlbGVhc2luZyBpdHMgc2Vzc2lvbnMiLCBwaWQpOwogICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7CkBAIC0xMTIzLDE3ICsxMjQ1LDE4IEBACiAgICAgfQogfQogCi0vLyBhdWRpb0NvbmZpZ0NoYW5nZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKQordm9pZCBBdWRpb0ZsaW5nZXI6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnRMb2NrKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5hdWRpb0ZsaW5nZXJDbGllbnQoKS0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIpOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5hdWRpb0ZsaW5nZXJDbGllbnQoKS0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIpOwogICAgIH0KIH0KIAotLy8gcmVtb3ZlQ2xpZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAorLy8gcmVtb3ZlQ2xpZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUNsaWVudExvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OnJlbW92ZUNsaWVudF9sKHBpZF90IHBpZCkKIHsKICAgICBBTE9HVigicmVtb3ZlQ2xpZW50X2woKSBwaWQgJWQsIGNhbGxpbmcgcGlkICVkIiwgcGlkLApAQCAtMTE3MSw3ICsxMjk0LDcgQEAKICAgICAvLyAxIE1CIG9mIGFkZHJlc3Mgc3BhY2UgaXMgZ29vZCBmb3IgMzIgdHJhY2tzLCA4IGJ1ZmZlcnMgZWFjaCwgNCBLQi9idWZmZXIKIH0KIAotLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKKy8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptQ2xpZW50TG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OkNsaWVudDo6fkNsaWVudCgpCiB7CiAgICAgbUF1ZGlvRmxpbmdlci0+cmVtb3ZlQ2xpZW50X2wobVBpZCk7CkBAIC0xMjIwLDcgKzEzNDMsNyBAQAogewogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCit2b2lkIEF1ZGlvRmxpbmdlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCiB7CiAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBrZWVwKHRoaXMpOwogICAgIG1BdWRpb0ZsaW5nZXItPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtUGlkKTsKQEAgLTEyMzgsMjAgKzEzNjEsMjQgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCAqZnJhbWVDb3VudCwKICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgaW50ICpzZXNzaW9uSWQsCisgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKKyAgICAgICAgc3A8SU1lbW9yeT4mIGJ1ZmZlcnMsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgc3A8UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gcmVjb3JkVHJhY2s7CiAgICAgc3A8UmVjb3JkSGFuZGxlPiByZWNvcmRIYW5kbGU7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQ7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKLSAgICBSZWNvcmRUaHJlYWQgKnRocmVhZDsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50OwogICAgIGludCBsU2Vzc2lvbklkOwogCisgICAgY2Jsay5jbGVhcigpOworICAgIGJ1ZmZlcnMuY2xlYXIoKTsKKwogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKICAgICBpZiAoIXJlY29yZGluZ0FsbG93ZWQoKSkgewogICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIHBlcm1pc3Npb24gZGVuaWVkOiByZWNvcmRpbmcgbm90IGFsbG93ZWQiKTsKQEAgLTEyNTksMTYgKzEzODYsMzEgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIGZvcm1hdCAlZCIsIGZvcm1hdCk7CisgICAgLy8gZnVydGhlciBzYW1wbGUgcmF0ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVSZWNvcmRUcmFja19sKCkKKyAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBzYW1wbGUgcmF0ZSAldSIsIHNhbXBsZVJhdGUpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gYWRkIGNsaWVudCB0byBsaXN0Ci0gICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKKyAgICAvLyB3ZSBkb24ndCB5ZXQgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIDE2LWJpdCBQQ00KKyAgICBpZiAoIShhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSAmJgorICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkpIHsKKyAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gZnVydGhlciBjaGFubmVsIG1hc2sgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlUmVjb3JkVHJhY2tfbCgpCisgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgdGhyZWFkID0gY2hlY2tSZWNvcmRUaHJlYWRfbChpbnB1dCk7CisgICAgICAgIFJlY29yZFRocmVhZCAqdGhyZWFkID0gY2hlY2tSZWNvcmRUaHJlYWRfbChpbnB1dCk7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBjaGVja1JlY29yZFRocmVhZF9sIGZhaWxlZCIpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKQEAgLTEyODMsNDIgKzE0MjUsNTggQEAKICAgICAgICAgfQogCiAgICAgICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWRfbChwaWQpOworICAgICAgICBjbGllbnQgPSByZWdpc3RlclBpZChwaWQpOwogCi0gICAgICAgIC8vIElmIG5vIGF1ZGlvIHNlc3Npb24gaWQgaXMgcHJvdmlkZWQsIGNyZWF0ZSBvbmUgaGVyZQotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgewogICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBubyBhdWRpbyBzZXNzaW9uIGlkIGlzIHByb3ZpZGVkLCBjcmVhdGUgb25lIGhlcmUKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSBuZXh0VW5pcXVlSWQoKTsKICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIGNyZWF0ZSBuZXcgcmVjb3JkIHRyYWNrLgotICAgICAgICAvLyBUaGUgcmVjb3JkIHRyYWNrIHVzZXMgb25lIHRyYWNrIGluIG1IYXJkd2FyZU1peGVyVGhyZWFkIGJ5IGNvbnZlbnRpb24uCisgICAgICAgIEFMT0dWKCJvcGVuUmVjb3JkKCkgbFNlc3Npb25JZDogJWQgaW5wdXQgJWQiLCBsU2Vzc2lvbklkLCBpbnB1dCk7CisKICAgICAgICAgLy8gVE9ETzogdGhlIHVpZCBzaG91bGQgYmUgcGFzc2VkIGluIGFzIGEgcGFyYW1ldGVyIHRvIG9wZW5SZWNvcmQKICAgICAgICAgcmVjb3JkVHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVJlY29yZFRyYWNrX2woY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBsU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBsU2Vzc2lvbklkLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHRpZCwgJmxTdGF0dXMpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChsU3RhdHVzID09IE5PX0VSUk9SKSAmJiAocmVjb3JkVHJhY2sgPT0gMCkpOworCisgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBvbmUgZWZmZWN0IGNoYWluIHdhcyBhd2FpdGluZyBmb3IgYW4gQXVkaW9SZWNvcmQgdG8gYmUgY3JlYXRlZCBvbiB0aGlzCisgICAgICAgICAgICAvLyBzZXNzaW9uIGFuZCBtb3ZlIGl0IHRvIHRoaXMgdGhyZWFkLgorICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0T3JwaGFuRWZmZWN0Q2hhaW5fbCgoYXVkaW9fc2Vzc2lvbl90KWxTZXNzaW9uSWQpOworICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICAgICAgdGhyZWFkLT5hZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCBiZWZvcmUgZGVsZXRpbmcgdGhlIFJlY29yZFRyYWNrIHNvIHRoYXQgdGhlCi0gICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIGlzIGNhbGxlZCBieSB0aGUgVHJhY2tCYXNlIGRlc3RydWN0b3Igd2l0aCBtTG9jayBoZWxkCi0gICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIFRyYWNrQmFzZSBkZXN0cnVjdG9yIHdpdGggbUNsaWVudExvY2sgaGVsZAorICAgICAgICAvLyBEb24ndCBob2xkIG1DbGllbnRMb2NrIHdoZW4gcmVsZWFzaW5nIHRoZSByZWZlcmVuY2Ugb24gdGhlIHRyYWNrIGFzIHRoZQorICAgICAgICAvLyBkZXN0cnVjdG9yIHdpbGwgYWNxdWlyZSBpdC4KKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CisgICAgICAgICAgICBjbGllbnQuY2xlYXIoKTsKKyAgICAgICAgfQogICAgICAgICByZWNvcmRUcmFjay5jbGVhcigpOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gcmV0dXJuIHRvIGhhbmRsZSB0byBjbGllbnQKKyAgICBjYmxrID0gcmVjb3JkVHJhY2stPmdldENibGsoKTsKKyAgICBidWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKKworICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CiAgICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7Ci0gICAgbFN0YXR1cyA9IE5PX0VSUk9SOwogCiBFeGl0OgotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiByZWNvcmRIYW5kbGU7CiB9CiAKQEAgLTEzMjgsNiArMTQ4Niw5IEBACiAKIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb0ZsaW5nZXI6OmxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKQogeworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTQwNiw3ICsxNTY3LDcgQEAKICAgICB9CiAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlID0gbmV4dFVuaXF1ZUlkKCk7Ci0gICAgbUF1ZGlvSHdEZXZzLmFkZChoYW5kbGUsIG5ldyBBdWRpb0h3RGV2aWNlKG5hbWUsIGRldiwgZmxhZ3MpKTsKKyAgICBtQXVkaW9Id0RldnMuYWRkKGhhbmRsZSwgbmV3IEF1ZGlvSHdEZXZpY2UoaGFuZGxlLCBuYW1lLCBkZXYsIGZsYWdzKSk7CiAKICAgICBBTE9HSSgibG9hZEh3TW9kdWxlKCkgTG9hZGVkICVzIGF1ZGlvIGludGVyZmFjZSBmcm9tICVzICglcykgaGFuZGxlICVkIiwKICAgICAgICAgICBuYW1lLCBkZXYtPmNvbW1vbi5tb2R1bGUtPm5hbWUsIGRldi0+Y29tbW9uLm1vZHVsZS0+aWQsIGhhbmRsZSk7CkBAIC0xNDQ4LDExNyArMTYwOSwxNTUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK2F1ZGlvX2h3X3N5bmNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICgodGhyZWFkLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAmIFRocmVhZEJhc2U6OlRSQUNLX1NFU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgIC8vIEEgc2Vzc2lvbiBjYW4gb25seSBiZSBvbiBvbmUgdGhyZWFkLCBzbyBleGl0IGFmdGVyIGZpcnN0IG1hdGNoCisgICAgICAgICAgICBTdHJpbmc4IHJlcGx5ID0gdGhyZWFkLT5nZXRQYXJhbWV0ZXJzKFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9IV19BVl9TWU5DKSk7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKHJlcGx5KTsKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQVVESU9fSFdfU1lOQ19JTlZBTElEOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvRmxpbmdlcjo6b3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCisKK3NwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ+IEF1ZGlvRmxpbmdlcjo6b3Blbk91dHB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogewotICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBOVUxMOwotICAgIHN0cnVjdCBhdWRpb19jb25maWcgY29uZmlnOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IChwU2FtcGxpbmdSYXRlICE9IE5VTEwpID8gKnBTYW1wbGluZ1JhdGUgOiAwOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAocENoYW5uZWxNYXNrICE9IE5VTEwpID8gKnBDaGFubmVsTWFzayA6IDA7Ci0gICAgY29uZmlnLmZvcm1hdCA9IChwRm9ybWF0ICE9IE5VTEwpID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICBpZiAob2ZmbG9hZEluZm8pIHsKLSAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICBBdWRpb0h3RGV2aWNlICpvdXRId0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCBkZXZpY2VzKTsKKyAgICBpZiAob3V0SHdEZXYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm91dFN0cmVhbSA9IE5VTEw7Ci0gICAgQXVkaW9Id0RldmljZSAqb3V0SHdEZXY7CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2SGFsID0gb3V0SHdEZXYtPmh3RGV2aWNlKCk7CisgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgKm91dHB1dCA9IG5leHRVbmlxdWVJZCgpOworICAgIH0KIAorICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX09VVFBVVF9PUEVOOworCisgICAgYXVkaW9fc3RyZWFtX291dF90ICpvdXRTdHJlYW0gPSBOVUxMOworCisgICAgLy8gRk9SIFRFU1RJTkcgT05MWToKKyAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgYXVkaW8gcG9saWN5IHNldHRpbmdzCisgICAgLy8gYW5kIGZvcmNpbmcgYSBzcGVjaWZpYyBmb3JtYXQgb3IgY2hhbm5lbCBtYXNrIHRvIHRoZSBIQUwvU2luayBkZXZpY2UgZm9yIHRlc3RpbmcuCisgICAgaWYgKCEoZmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpKSB7CisgICAgICAgIC8vIENoZWNrIG9ubHkgZm9yIE5vcm1hbCBNaXhpbmcgbW9kZQorICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uKSB7CisgICAgICAgICAgICAvLyBTcGVjaWZ5IGZvcm1hdCAodW5jb21tZW50IG9uZSBiZWxvdyB0byBjaG9vc2UpCisgICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICAgICAgICAgIC8vY29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ7CisgICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7CisgICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVDsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJvcGVuT3V0cHV0X2woKSB1cGdyYWRpbmcgZm9ybWF0IHRvICUjMDh4IiwgY29uZmlnLT5mb3JtYXQpOworICAgICAgICB9CisgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgeworICAgICAgICAgICAgLy8gU3BlY2lmeSBjaGFubmVsIG1hc2sgKHVuY29tbWVudCBvbmUgYmVsb3cgdG8gY2hvb3NlKQorICAgICAgICAgICAgLy9jb25maWctPmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudCg0KTsgIC8vIGZvciBVU0IgNGNoCisgICAgICAgICAgICAvL2NvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fcmVwcmVzZW50YXRpb25fYW5kX2JpdHMoCisgICAgICAgICAgICAvLyAgICAgICAgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCwgKDEgPDwgNCkgLSAxKTsgIC8vIGFub3RoZXIgNGNoIGV4YW1wbGUKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IGh3RGV2SGFsLT5vcGVuX291dHB1dF9zdHJlYW0oaHdEZXZIYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOworCisgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKKyAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgb3Blbk91dHB1dFN0cmVhbSByZXR1cm5lZCBvdXRwdXQgJXAsIHNhbXBsZVJhdGUgJWQsIEZvcm1hdCAlI3gsICIKKyAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3gsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICBvdXRTdHJlYW0sCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIHN0YXR1cyk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG91dFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXRTdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1PdXQob3V0SHdEZXYsIG91dFN0cmVhbSwgZmxhZ3MpOworCisgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQ7CisgICAgICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBvZmZsb2FkIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpCisgICAgICAgICAgICAgICAgfHwgIWlzVmFsaWRQY21TaW5rRm9ybWF0KGNvbmZpZy0+Zm9ybWF0KQorICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSkgeworICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMpOworICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgZGlyZWN0IG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBNaXhlclRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMpOworICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgbWl4ZXIgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCAqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICB9CisgICAgICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKCpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6b3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorewogICAgIEFMT0dWKCJvcGVuT3V0cHV0KCksIG1vZHVsZSAlZCBEZXZpY2UgJXgsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICUjMDh4LCBDaGFubmVscyAleCwgZmxhZ3MgJXgiLAogICAgICAgICAgICAgICBtb2R1bGUsCi0gICAgICAgICAgICAgIChwRGV2aWNlcyAhPSBOVUxMKSA/ICpwRGV2aWNlcyA6IDAsCi0gICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKLSAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgKGRldmljZXMgIT0gTlVMTCkgPyAqZGV2aWNlcyA6IDAsCisgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgIEFMT0dWKCJvcGVuT3V0cHV0KCksIG9mZmxvYWRJbmZvICVwIHZlcnNpb24gMHglMDR4IiwKLSAgICAgICAgICBvZmZsb2FkSW5mbywgb2ZmbG9hZEluZm8gPT0gTlVMTCA/IC0xIDogb2ZmbG9hZEluZm8tPnZlcnNpb24gKTsKIAotICAgIGlmIChwRGV2aWNlcyA9PSBOVUxMIHx8ICpwRGV2aWNlcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICgqZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBvdXRId0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCAqcERldmljZXMpOwotICAgIGlmIChvdXRId0RldiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldkhhbCA9IG91dEh3RGV2LT5od0RldmljZSgpOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkID0gbmV4dFVuaXF1ZUlkKCk7Ci0KLSAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19PVVRQVVRfT1BFTjsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IGh3RGV2SGFsLT5vcGVuX291dHB1dF9zdHJlYW0oaHdEZXZIYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyZWFtKTsKLQotICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7Ci0gICAgQUxPR1YoIm9wZW5PdXRwdXQoKSBvcGVuT3V0cHV0U3RyZWFtIHJldHVybmVkIG91dHB1dCAlcCwgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJSMwOHgsICIKLSAgICAgICAgICAgICJDaGFubmVscyAleCwgc3RhdHVzICVkIiwKLSAgICAgICAgICAgIG91dFN0cmVhbSwKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCi0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgc3RhdHVzKTsKLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgb3V0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG5ldyBBdWRpb1N0cmVhbU91dChvdXRId0Rldiwgb3V0U3RyZWFtLCBmbGFncyk7Ci0KLSAgICAgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IE9mZmxvYWRUaHJlYWQodGhpcywgb3V0cHV0LCBpZCwgKnBEZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgY3JlYXRlZCBvZmZsb2FkIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB8fAotICAgICAgICAgICAgKGNvbmZpZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHx8Ci0gICAgICAgICAgICAoY29uZmlnLmNoYW5uZWxfbWFzayAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBuZXcgRGlyZWN0T3V0cHV0VGhyZWFkKHRoaXMsIG91dHB1dCwgaWQsICpwRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgZGlyZWN0IG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBuZXcgTWl4ZXJUaHJlYWQodGhpcywgb3V0cHV0LCBpZCwgKnBEZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgY3JlYXRlZCBtaXhlciBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwotICAgICAgICB9Ci0gICAgICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKGlkLCB0aHJlYWQpOwotCi0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocENoYW5uZWxNYXNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwTGF0ZW5jeU1zICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwTGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7Ci0gICAgICAgIH0KKyAgICBzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkID0gb3Blbk91dHB1dF9sKG1vZHVsZSwgb3V0cHV0LCBjb25maWcsICpkZXZpY2VzLCBhZGRyZXNzLCBmbGFncyk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICpsYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKIAogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IG91dHB1dCBjcmVhdGlvbgotICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKKyAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOwogCiAgICAgICAgIC8vIHRoZSBmaXJzdCBwcmltYXJ5IG91dHB1dCBvcGVuZWQgZGVzaWduYXRlcyB0aGUgcHJpbWFyeSBodyBkZXZpY2UKICAgICAgICAgaWYgKChtUHJpbWFyeUhhcmR3YXJlRGV2ID09IE5VTEwpICYmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpKSB7CiAgICAgICAgICAgICBBTE9HSSgiVXNpbmcgbW9kdWxlICVkIGhhcyB0aGUgcHJpbWFyeSBhdWRpbyBpbnRlcmZhY2UiLCBtb2R1bGUpOwotICAgICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldiA9IG91dEh3RGV2OworICAgICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldiA9IHRocmVhZC0+Z2V0T3V0cHV0KCktPmF1ZGlvSHdEZXY7CiAKICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwogICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01PREU7Ci0gICAgICAgICAgICBod0RldkhhbC0+c2V0X21vZGUoaHdEZXZIYWwsIG1Nb2RlKTsKKyAgICAgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCktPnNldF9tb2RlKG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCksIG1Nb2RlKTsKICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CisKKyAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CiAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvRmxpbmdlcjo6b3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLApAQCAtMTU3MSw3ICsxNzcwLDcgQEAKICAgICBpZiAodGhyZWFkMSA9PSBOVUxMIHx8IHRocmVhZDIgPT0gTlVMTCkgewogICAgICAgICBBTE9HVygib3BlbkR1cGxpY2F0ZU91dHB1dCgpIHdyb25nIG91dHB1dCBtaXhlciB0eXBlIGZvciBvdXRwdXQgJWQgb3IgJWQiLCBvdXRwdXQxLAogICAgICAgICAgICAgICAgIG91dHB1dDIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkID0gbmV4dFVuaXF1ZUlkKCk7CkBAIC0xNTc5LDcgKzE3NzgsNyBAQAogICAgIHRocmVhZC0+YWRkT3V0cHV0VHJhY2sodGhyZWFkMik7CiAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoaWQsIHRocmVhZCk7CiAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBvdXRwdXQgY3JlYXRpb24KLSAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKKyAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CiAgICAgcmV0dXJuIGlkOwogfQogCkBAIC0xNjI4LDIyICsxODI3LDM1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ0xPU0VELCBvdXRwdXQsIE5VTEwpOworICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9DTE9TRUQsIG91dHB1dCwgTlVMTCk7CiAgICAgfQogICAgIHRocmVhZC0+ZXhpdCgpOwogICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCiAgICAgLy8gYnV0IHRoZSBUaHJlYWRCYXNlIGNvbnRhaW5lciBzdGlsbCBleGlzdHMuCiAKICAgICBpZiAoIXRocmVhZC0+aXNEdXBsaWNhdGluZygpKSB7Ci0gICAgICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXQgPSB0aHJlYWQtPmNsZWFyT3V0cHV0KCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKG91dCAhPSBOVUxMLCAib3V0IHNob3VsZG4ndCBiZSBOVUxMIik7Ci0gICAgICAgIC8vIGZyb20gbm93IG9uIHRocmVhZC0+bU91dHB1dCBpcyBOVUxMCi0gICAgICAgIG91dC0+aHdEZXYoKS0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShvdXQtPmh3RGV2KCksIG91dC0+c3RyZWFtKTsKLSAgICAgICAgZGVsZXRlIG91dDsKKyAgICAgICAgY2xvc2VPdXRwdXRGaW5pc2godGhyZWFkKTsKICAgICB9CisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZU91dHB1dEZpbmlzaChzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkKQoreworICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXQgPSB0aHJlYWQtPmNsZWFyT3V0cHV0KCk7CisgICAgQUxPR19BU1NFUlQob3V0ICE9IE5VTEwsICJvdXQgc2hvdWxkbid0IGJlIE5VTEwiKTsKKyAgICAvLyBmcm9tIG5vdyBvbiB0aHJlYWQtPm1PdXRwdXQgaXMgTlVMTAorICAgIG91dC0+aHdEZXYoKS0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShvdXQtPmh3RGV2KCksIG91dC0+c3RyZWFtKTsKKyAgICBkZWxldGUgb3V0OworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQpCit7CisgICAgbVBsYXliYWNrVGhyZWFkcy5yZW1vdmVJdGVtKHRocmVhZC0+bUlkKTsKKyAgICB0aHJlYWQtPmV4aXQoKTsKKyAgICBjbG9zZU91dHB1dEZpbmlzaCh0aHJlYWQpOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xNjc1LDU4ICsxODg3LDc2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb0ZsaW5nZXI6Om9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogewotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IE5VTEw7Ci0gICAgc3RydWN0IGF1ZGlvX2NvbmZpZyBjb25maWc7Ci0gICAgY29uZmlnLnNhbXBsZV9yYXRlID0gKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgPyAqcFNhbXBsaW5nUmF0ZSA6IDA7Ci0gICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgPyAqcENoYW5uZWxNYXNrIDogMDsKLSAgICBjb25maWcuZm9ybWF0ID0gKHBGb3JtYXQgIT0gTlVMTCkgPyAqcEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICB1aW50MzJfdCByZXFTYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgcmVxRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCByZXFDaGFubmVscyA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKmluU3RyZWFtID0gTlVMTDsKLSAgICBBdWRpb0h3RGV2aWNlICppbkh3RGV2OworICAgIGlmICgqZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCi0gICAgaWYgKHBEZXZpY2VzID09IE5VTEwgfHwgKnBEZXZpY2VzID09IDApIHsKKyAgICBzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCA9IG9wZW5JbnB1dF9sKG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZSwgYWRkcmVzcywgc291cmNlLCBmbGFncyk7CisKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBpbnB1dCBjcmVhdGlvbgorICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ+IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgQXVkaW9Id0RldmljZSAqaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCBkZXZpY2UpOworICAgIGlmIChpbkh3RGV2ID09IE5VTEwpIHsKKyAgICAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAqaW5wdXQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICB9CiAKLSAgICBpbkh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsICpwRGV2aWNlcyk7Ci0gICAgaWYgKGluSHdEZXYgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KKyAgICBhdWRpb19jb25maWdfdCBoYWxjb25maWcgPSAqY29uZmlnOwogICAgIGF1ZGlvX2h3X2RldmljZV90ICppbkh3SGFsID0gaW5Id0Rldi0+aHdEZXZpY2UoKTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IG5leHRVbmlxdWVJZCgpOwotCi0gICAgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgaWQsICpwRGV2aWNlcywgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHJlYW0pOwotICAgIEFMT0dWKCJvcGVuSW5wdXQoKSBvcGVuSW5wdXRTdHJlYW0gcmV0dXJuZWQgaW5wdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICVkLCBDaGFubmVscyAleCwgIgotICAgICAgICAgICAgInN0YXR1cyAlZCIsCisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmluU3RyZWFtID0gTlVMTDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCAqaW5wdXQsIGRldmljZSwgJmhhbGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHJlYW0sIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UpOworICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgU2FtcGxpbmdSYXRlICVkIgorICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAleCwgZmxhZ3MgJSN4LCBzdGF0dXMgJWQiLAogICAgICAgICAgICAgaW5TdHJlYW0sCi0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICBjb25maWcuZm9ybWF0LAotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGhhbGNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICBoYWxjb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICBzdGF0dXMpOwogCiAgICAgLy8gSWYgdGhlIGlucHV0IGNvdWxkIG5vdCBiZSBvcGVuZWQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMgYW5kIHdlIGNhbiBoYW5kbGUgdGhlCiAgICAgLy8gY29udmVyc2lvbiBpbnRlcm5hbGx5LCB0cnkgdG8gb3BlbiBhZ2FpbiB3aXRoIHRoZSBwcm9wb3NlZCBwYXJhbWV0ZXJzLiBUaGUgQXVkaW9GbGluZ2VyIGNhbgogICAgIC8vIHJlc2FtcGxlIHRoZSBpbnB1dCBhbmQgZG8gbW9ubyB0byBzdGVyZW8gb3Igc3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbnMgb24gMTYgYml0IFBDTSBpbnB1dHMuCiAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKLSAgICAgICAgcmVxRm9ybWF0ID09IGNvbmZpZy5mb3JtYXQgJiYgY29uZmlnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgotICAgICAgICAoY29uZmlnLnNhbXBsZV9yYXRlIDw9IDIgKiByZXFTYW1wbGluZ1JhdGUpICYmCi0gICAgICAgIChwb3Bjb3VudChjb25maWcuY2hhbm5lbF9tYXNrKSA8PSBGQ0NfMikgJiYgKHBvcGNvdW50KHJlcUNoYW5uZWxzKSA8PSBGQ0NfMikpIHsKLSAgICAgICAgQUxPR1YoIm9wZW5JbnB1dCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgbWFzayIpOworICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQgPT0gaGFsY29uZmlnLmZvcm1hdCAmJiBoYWxjb25maWcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCisgICAgICAgIChoYWxjb25maWcuc2FtcGxlX3JhdGUgPD0gMiAqIGNvbmZpZy0+c2FtcGxlX3JhdGUpICYmCisgICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhoYWxjb25maWcuY2hhbm5lbF9tYXNrKSA8PSBGQ0NfMikgJiYKKyAgICAgICAgKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSA8PSBGQ0NfMikpIHsKKyAgICAgICAgLy8gRklYTUUgZGVzY3JpYmUgdGhlIGNoYW5nZSBwcm9wb3NlZCBieSBIQUwgKHNhdmUgb2xkIHZhbHVlcyBzbyB3ZSBjYW4gbG9nIHRoZW0gaGVyZSkKKyAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgcmVvcGVuaW5nIHdpdGggcHJvcG9zZWQgc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBtYXNrIik7CiAgICAgICAgIGluU3RyZWFtID0gTlVMTDsKLSAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgaWQsICpwRGV2aWNlcywgJmNvbmZpZywgJmluU3RyZWFtKTsKKyAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgKmlucHV0LCBkZXZpY2UsICZoYWxjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSwgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSk7CisgICAgICAgIC8vIEZJWE1FIGxvZyB0aGlzIG5ldyBzdGF0dXM7IEhBTCBzaG91bGQgbm90IHByb3Bvc2UgYW55IGZ1cnRoZXIgY2hhbmdlcwogICAgIH0KIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgaW5TdHJlYW0gIT0gTlVMTCkgewpAQCAtMTc0MCwxNyArMTk3MCwxNyBAQAogICAgICAgICAgICAgVEVFX1NJTktfTkVXLCAgIC8vIGNvcHkgaW5wdXQgdXNpbmcgYSBuZXcgcGlwZQogICAgICAgICAgICAgVEVFX1NJTktfT0xELCAgIC8vIGNvcHkgaW5wdXQgdXNpbmcgYW4gZXhpc3RpbmcgcGlwZQogICAgICAgICB9IGtpbmQ7Ci0gICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKGluU3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZpblN0cmVhbS0+Y29tbW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3Bjb3VudChpblN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmaW5TdHJlYW0tPmNvbW1vbikpKTsKKyAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MoaGFsY29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spLCBoYWxjb25maWcuZm9ybWF0KTsKICAgICAgICAgaWYgKCFtVGVlU2lua0lucHV0RW5hYmxlZCkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBGb3JtYXRfSW52YWxpZCkgeworICAgICAgICB9IGVsc2UgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87CiAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmsgPT0gMCkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luay0+Z2V0U3Ryb25nQ291bnQoKSAhPSAxKSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IG1SZWNvcmRUZWVTaW5rLT5mb3JtYXQoKSkgeworICAgICAgICB9IGVsc2UgaWYgKEZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgbVJlY29yZFRlZVNpbmstPmZvcm1hdCgpKSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX09MRDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7CkBAIC0xNzgwLDM5ICsyMDEwLDI2IEBACiAgICAgICAgIH0KICNlbmRpZgogCi0gICAgICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0ID0gbmV3IEF1ZGlvU3RyZWFtSW4oaW5Id0RldiwgaW5TdHJlYW0pOworICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dFN0cmVhbSA9IG5ldyBBdWRpb1N0cmVhbUluKGluSHdEZXYsIGluU3RyZWFtKTsKIAogICAgICAgICAvLyBTdGFydCByZWNvcmQgdGhyZWFkCiAgICAgICAgIC8vIFJlY29yZFRocmVhZCByZXF1aXJlcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlIGluZGljYXRpb24gdG8gZm9yd2FyZCB0byBhdWRpbwogICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCi0gICAgICAgIHRocmVhZCA9IG5ldyBSZWNvcmRUaHJlYWQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgIHNwPFJlY29yZFRocmVhZD4gdGhyZWFkID0gbmV3IFJlY29yZFRocmVhZCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T3V0cHV0RGV2aWNlX2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERldmljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UKICNpZmRlZiBURUVfU0lOSwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdGVlU2luawogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgbVJlY29yZFRocmVhZHMuYWRkKGlkLCB0aHJlYWQpOwotICAgICAgICBBTE9HVigib3BlbklucHV0KCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKLSAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBTYW1wbGluZ1JhdGUgPSByZXFTYW1wbGluZ1JhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGb3JtYXQgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBGb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBDaGFubmVsTWFzayA9IHJlcUNoYW5uZWxzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBpbnB1dCBjcmVhdGlvbgotICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQpOwotICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIG1SZWNvcmRUaHJlYWRzLmFkZCgqaW5wdXQsIHRocmVhZCk7CisgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIGNyZWF0ZWQgcmVjb3JkIHRocmVhZDogSUQgJWQgdGhyZWFkICVwIiwgKmlucHV0LCB0aHJlYWQuZ2V0KCkpOworICAgICAgICByZXR1cm4gdGhyZWFkOwogICAgIH0KIAorICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xODM0LDI2ICsyMDUxLDcyIEBACiAgICAgICAgIH0KIAogICAgICAgICBBTE9HVigiY2xvc2VJbnB1dCgpICVkIiwgaW5wdXQpOwotICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6SU5QVVRfQ0xPU0VELCBpbnB1dCwgTlVMTCk7CisKKyAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBlZmZlY3QgY2hhaW5zLCBpdCBtZWFucyB0aGF0IGEgY2xpZW50IHN0aWxsIGhvbGRzIGEgaGFuZGxlCisgICAgICAgIC8vIG9uIGF0IGxlYXN0IG9uZSBlZmZlY3QuIFdlIG11c3QgZWl0aGVyIG1vdmUgdGhlIGNoYWluIHRvIGFuIGV4aXN0aW5nIHRocmVhZCB3aXRoIHRoZQorICAgICAgICAvLyBzYW1lIHNlc3Npb24gSUQgb3IgcHV0IGl0IGFzaWRlIGluIGNhc2UgYSBuZXcgcmVjb3JkIHRocmVhZCBpcyBvcGVuZWQgZm9yIGEKKyAgICAgICAgLy8gbmV3IGNhcHR1cmUgb24gdGhlIHNhbWUgc2Vzc2lvbgorICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW47CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfc2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWlucyA9IHRocmVhZC0+Z2V0RWZmZWN0Q2hhaW5zX2woKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IG1heGltdW0gb25lIGNoYWluIHBlciByZWNvcmQgdGhyZWFkCisgICAgICAgICAgICBpZiAoZWZmZWN0Q2hhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgY2hhaW4gPSBlZmZlY3RDaGFpbnNbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIGEgcmVjb3JkIHRocmVhZCBpcyBhbHJlYWR5IG9wZW5lZCB3aXRoIGEgY2xpZW50IG9uIHRoZSBzYW1lIHNlc3Npb24uCisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpbiBjYXNlIG9mIG92ZXJsYXAgYmV0d2VlbiBvbmUgdGhyZWFkIHRlYXIgZG93biBhbmQgdGhlCisgICAgICAgICAgICAvLyBjcmVhdGlvbiBvZiBpdHMgcmVwbGFjZW1lbnQKKyAgICAgICAgICAgIHNpemVfdCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiB0ID0gbVJlY29yZFRocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAodCA9PSB0aHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0LT5oYXNBdWRpb1Nlc3Npb24oY2hhaW4tPnNlc3Npb25JZCgpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0LT5tTG9jayk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjbG9zZUlucHV0KCkgZm91bmQgdGhyZWFkICVkIGZvciBlZmZlY3Qgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPmlkKCksIGNoYWluLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwdXQgdGhlIGNoYWluIGFzaWRlIGlmIHdlIGNvdWxkIG5vdCBmaW5kIGEgcmVjb3JkIHRocmVhZCB3aXRoIHRoZSBzYW1lIHNlc3Npb24gaWQuCisgICAgICAgICAgICBpZiAoaSA9PSBtUmVjb3JkVGhyZWFkcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBwdXRPcnBoYW5FZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRCwgaW5wdXQsIE5VTEwpOwogICAgICAgICBtUmVjb3JkVGhyZWFkcy5yZW1vdmVJdGVtKGlucHV0KTsKICAgICB9Ci0gICAgdGhyZWFkLT5leGl0KCk7Ci0gICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKLSAgICAvLyBidXQgdGhlIFRocmVhZEJhc2UgY29udGFpbmVyIHN0aWxsIGV4aXN0cy4KKyAgICAvLyBGSVhNRTogY2FsbGluZyB0aHJlYWQtPmV4aXQoKSB3aXRob3V0IG1Mb2NrIGhlbGQgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYW55bW9yZSBub3cgdGhhdAorICAgIC8vIHdlIGhhdmUgYSBkaWZmZXJlbnQgbG9jayBmb3Igbm90aWZpY2F0aW9uIGNsaWVudAorICAgIGNsb3NlSW5wdXRGaW5pc2godGhyZWFkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZUlucHV0RmluaXNoKHNwPFJlY29yZFRocmVhZD4gdGhyZWFkKQoreworICAgIHRocmVhZC0+ZXhpdCgpOwogICAgIEF1ZGlvU3RyZWFtSW4gKmluID0gdGhyZWFkLT5jbGVhcklucHV0KCk7CiAgICAgQUxPR19BU1NFUlQoaW4gIT0gTlVMTCwgImluIHNob3VsZG4ndCBiZSBOVUxMIik7CiAgICAgLy8gZnJvbSBub3cgb24gdGhyZWFkLT5tSW5wdXQgaXMgTlVMTAogICAgIGluLT5od0RldigpLT5jbG9zZV9pbnB1dF9zdHJlYW0oaW4tPmh3RGV2KCksIGluLT5zdHJlYW0pOwogICAgIGRlbGV0ZSBpbjsKLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRTdHJlYW1PdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZUlucHV0SW50ZXJuYWxfbChzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCkKK3sKKyAgICBtUmVjb3JkVGhyZWFkcy5yZW1vdmVJdGVtKHRocmVhZC0+bUlkKTsKKyAgICBjbG9zZUlucHV0RmluaXNoKHRocmVhZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6aW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJzZXRTdHJlYW1PdXRwdXQoKSBzdHJlYW0gJWQgdG8gb3V0cHV0ICVkIiwgc3RyZWFtLCBvdXRwdXQpOworICAgIEFMT0dWKCJpbnZhbGlkYXRlU3RyZWFtKCkgc3RyZWFtICVkIiwgc3RyZWFtKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLmdldCgpOwpAQCAtMTg2NCwyNCArMjEyNywzMCBAQAogfQogCiAKLWludCBBdWRpb0ZsaW5nZXI6Om5ld0F1ZGlvU2Vzc2lvbklkKCkKK2F1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvRmxpbmdlcjo6bmV3QXVkaW9VbmlxdWVJZCgpCiB7CiAgICAgcmV0dXJuIG5leHRVbmlxdWVJZCgpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pCit2b2lkIEF1ZGlvRmxpbmdlcjo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBBTE9HVigiYWNxdWlyaW5nICVkIGZyb20gJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlcik7CisgICAgQUxPR1YoImFjcXVpcmluZyAlZCBmcm9tICVkLCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKKyAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKKyAgICAgICAgY2FsbGVyID0gcGlkOworICAgIH0KIAotICAgIC8vIElnbm9yZSByZXF1ZXN0cyByZWNlaXZlZCBmcm9tIHByb2Nlc3NlcyBub3Qga25vd24gYXMgbm90aWZpY2F0aW9uIGNsaWVudC4gVGhlIHJlcXVlc3QKLSAgICAvLyBpcyBsaWtlbHkgcHJveGllZCBieSBtZWRpYXNlcnZlciAoZS5nIENhbWVyYVNlcnZpY2UpIGFuZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoKSBjYW4gYmUKLSAgICAvLyBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBwaWQgbGVhdmluZyBhIHN0YWxlIHNlc3Npb24gcmVmZXJlbmNlLiAgQWxzbyB3ZSBkb24ndCBrbm93IGhvdwotICAgIC8vIHRvIGNsZWFyIHRoaXMgcmVmZXJlbmNlIGlmIHRoZSBjbGllbnQgcHJvY2VzcyBkaWVzLgotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KGNhbGxlcikgPCAwKSB7Ci0gICAgICAgIEFMT0dWKCJhY3F1aXJlQXVkaW9TZXNzaW9uSWQoKSB1bmtub3duIGNsaWVudCAlZCBmb3Igc2Vzc2lvbiAlZCIsIGNhbGxlciwgYXVkaW9TZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CisgICAgICAgIC8vIElnbm9yZSByZXF1ZXN0cyByZWNlaXZlZCBmcm9tIHByb2Nlc3NlcyBub3Qga25vd24gYXMgbm90aWZpY2F0aW9uIGNsaWVudC4gVGhlIHJlcXVlc3QKKyAgICAgICAgLy8gaXMgbGlrZWx5IHByb3hpZWQgYnkgbWVkaWFzZXJ2ZXIgKGUuZyBDYW1lcmFTZXJ2aWNlKSBhbmQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKCkgY2FuIGJlCisgICAgICAgIC8vIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHBpZCBsZWF2aW5nIGEgc3RhbGUgc2Vzc2lvbiByZWZlcmVuY2UuICBBbHNvIHdlIGRvbid0IGtub3cgaG93CisgICAgICAgIC8vIHRvIGNsZWFyIHRoaXMgcmVmZXJlbmNlIGlmIHRoZSBjbGllbnQgcHJvY2VzcyBkaWVzLgorICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShjYWxsZXIpIDwgMCkgeworICAgICAgICAgICAgQUxPR1coImFjcXVpcmVBdWRpb1Nlc3Npb25JZCgpIHVua25vd24gY2xpZW50ICVkIGZvciBzZXNzaW9uICVkIiwgY2FsbGVyLCBhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogCiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKQEAgLTE4OTcsMTEgKzIxNjYsMTQgQEAKICAgICBBTE9HVigiIGFkZGVkIG5ldyBlbnRyeSBmb3IgJWQiLCBhdWRpb1Nlc3Npb24pOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pCit2b2lkIEF1ZGlvRmxpbmdlcjo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBBTE9HVigicmVsZWFzaW5nICVkIGZyb20gJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlcik7CisgICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOworICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgICAgICBjYWxsZXIgPSBwaWQ7CisgICAgfQogICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IG51bTsgaSsrKSB7CiAgICAgICAgIEF1ZGlvU2Vzc2lvblJlZiAqcmVmID0gbUF1ZGlvU2Vzc2lvblJlZnMuaXRlbUF0KGkpOwpAQCAtMTk2Myw3ICsyMjM1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wgKHQtPm1Mb2NrKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0LT5tTG9jayk7CiAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGVmZmVjdHMgZnJvbSB0aGUgY2hhaW4KICAgICAgICAgICAgIHdoaWxlIChlYy0+bUVmZmVjdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBlYy0+bUVmZmVjdHNbMF07CkBAIC0yMDAwLDcgKzIyNzIsNyBAQAogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6Om5leHRVbmlxdWVJZCgpCiB7Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7CisgICAgcmV0dXJuICh1aW50MzJfdCkgYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqQXVkaW9GbGluZ2VyOjpwcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpIGNvbnN0CkBAIC0yMDMzLDcgKzIzMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpc3RlbmVyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNfZXZlbnRfY2FsbGJhY2tfdCBjYWxsQmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCkBAIC0yMTk1LDcgKzI0NjcsNyBAQAogCiAgICAgICAgIC8vIHJldHVybiBlZmZlY3QgZGVzY3JpcHRvcgogICAgICAgICAqcERlc2MgPSBkZXNjOwotICAgICAgICBpZiAoaW8gPT0gMCAmJiBzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CiAgICAgICAgICAgICAvLyBpZiB0aGUgb3V0cHV0IHJldHVybmVkIGJ5IGdldE91dHB1dEZvckVmZmVjdCgpIGlzIHJlbW92ZWQgYmVmb3JlIHdlIGxvY2sgdGhlCiAgICAgICAgICAgICAvLyBtdXRleCBiZWxvdywgdGhlIGNhbGwgdG8gY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvKSBiZWxvdyB3aWxsIGRldGVjdCBpdAogICAgICAgICAgICAgLy8gYW5kIHdlIHdpbGwgZXhpdCBzYWZlbHkKQEAgLTIyMTAsNyArMjQ4Miw3IEBACiAgICAgICAgIC8vIElmIG91dHB1dCBpcyAwIGhlcmUsIHNlc3Npb25JZCBpcyBuZWl0aGVyIFNFU1NJT05fT1VUUFVUX1NUQUdFIG5vciBTRVNTSU9OX09VVFBVVF9NSVgKICAgICAgICAgLy8gYmVjYXVzZSBvZiBjb2RlIGNoZWNraW5nIG91dHB1dCB3aGVuIGVudGVyaW5nIHRoZSBmdW5jdGlvbi4KICAgICAgICAgLy8gTm90ZTogaW8gaXMgbmV2ZXIgMCB3aGVuIGNyZWF0aW5nIGFuIGVmZmVjdCBvbiBhbiBpbnB1dAotICAgICAgICBpZiAoaW8gPT0gMCkgeworICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgbXVzdCBiZSBzcGVjaWZpZWQgYnkgQXVkaW9Qb2xpY3lNYW5hZ2VyIHdoZW4gdXNpbmcgc2Vzc2lvbgogICAgICAgICAgICAgICAgIC8vIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFCkBAIC0yMjM1LDcgKzI1MDcsNyBAQAogICAgICAgICAgICAgLy8gSWYgbm8gb3V0cHV0IHRocmVhZCBjb250YWlucyB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQsIGRlZmF1bHQgdG8KICAgICAgICAgICAgIC8vIGZpcnN0IG91dHB1dC4gVGhlIGVmZmVjdCBjaGFpbiB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjb3JyZWN0IG91dHB1dAogICAgICAgICAgICAgLy8gdGhyZWFkIHdoZW4gYSB0cmFjayB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgaXMgY3JlYXRlZAotICAgICAgICAgICAgaWYgKGlvID09IDAgJiYgbVBsYXliYWNrVGhyZWFkcy5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBtUGxheWJhY2tUaHJlYWRzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgICBpbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiY3JlYXRlRWZmZWN0KCkgZ290IGlvICVkIGZvciBlZmZlY3QgJXMiLCBpbywgZGVzYy5uYW1lKTsKQEAgLTIyNDgsOSArMjUyMCwxNyBAQAogICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb25lIGVmZmVjdCBjaGFpbiB3YXMgYXdhaXRpbmcgZm9yIGFuIGVmZmVjdCB0byBiZSBjcmVhdGVkIG9uIHRoaXMKKyAgICAgICAgICAgIC8vIHNlc3Npb24gYW5kIHVzZWQgaXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuCisgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKChhdWRpb19zZXNzaW9uX3Qpc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgICAgIHRocmVhZC0+YWRkRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IHJlZ2lzdGVyUGlkX2wocGlkKTsKKyAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSByZWdpc3RlclBpZChwaWQpOwogCiAgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3Qgb24gc2VsZWN0ZWQgb3V0cHV0IHRocmVhZAogICAgICAgICBoYW5kbGUgPSB0aHJlYWQtPmNyZWF0ZUVmZmVjdF9sKGNsaWVudCwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgc2Vzc2lvbklkLApAQCAtMjI1OCwxMiArMjUzOCwxNSBAQAogICAgICAgICBpZiAoaGFuZGxlICE9IDAgJiYgaWQgIT0gTlVMTCkgewogICAgICAgICAgICAgKmlkID0gaGFuZGxlLT5pZCgpOwogICAgICAgICB9CisgICAgICAgIGlmIChoYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IHdpdGggbUNsaWVudExvY2sgaGVsZAorICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CisgICAgICAgICAgICBjbGllbnQuY2xlYXIoKTsKKyAgICAgICAgfQogICAgIH0KIAogRXhpdDoKLSAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKQEAgLTIzMDksNiArMjU5MiwxNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZGVzdGluYXRpb24gdGhyZWFkIGhhcyBhIGNoYW5uZWwgY291bnQgb2YgRkNDXzIsIHdoaWNoIGlzCisgICAgLy8gY3VycmVudGx5IHJlcXVpcmVkIGZvciAobW9zdCkgZWZmZWN0cy4gUHJldmVudCBtb3ZpbmcgdGhlIGVmZmVjdCBjaGFpbiBoZXJlIHJhdGhlcgorICAgIC8vIHRoYW4gZGlzYWJsaW5nIHRoZSBhZGRFZmZlY3RfbCgpIGNhbGwgaW4gZHN0VGhyZWFkIGJlbG93LgorICAgIGlmICgoZHN0VGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIgfHwgZHN0VGhyZWFkLT5pc0R1cGxpY2F0aW5nKCkpICYmCisgICAgICAgICAgICBkc3RUaHJlYWQtPm1DaGFubmVsQ291bnQgIT0gRkNDXzIpIHsKKyAgICAgICAgQUxPR1coIm1vdmVFZmZlY3RDaGFpbl9sKCkgZWZmZWN0IGNoYWluIGZhaWxlZCBiZWNhdXNlIgorICAgICAgICAgICAgICAgICIgZGVzdGluYXRpb24gdGhyZWFkICVwIGNoYW5uZWwgY291bnQoJXUpICE9ICV1IiwKKyAgICAgICAgICAgICAgICBkc3RUaHJlYWQsIGRzdFRocmVhZC0+bUNoYW5uZWxDb3VudCwgRkNDXzIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgLy8gcmVtb3ZlIGNoYWluIGZpcnN0LiBUaGlzIGlzIHVzZWZ1bCBvbmx5IGlmIHJlY29uZmlndXJpbmcgZWZmZWN0IGNoYWluIG9uIHNhbWUgb3V0cHV0IHRocmVhZCwKICAgICAvLyBzbyB0aGF0IGEgbmV3IGNoYWluIGlzIGNyZWF0ZWQgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMgd2hlbiBmaXJzdCBlZmZlY3QgaXMgYWRkZWQuIFRoaXMgaXMKICAgICAvLyBvdGhlcndpc2UgdW5uZWNlc3NhcnkgYXMgcmVtb3ZlRWZmZWN0X2woKSB3aWxsIHJlbW92ZSB0aGUgY2hhaW4gd2hlbiBsYXN0IGVmZmVjdCBpcwpAQCAtMjQwNyw2ICsyNzAxLDQ5IEBACiAKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpwdXRPcnBoYW5FZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+JiBjaGFpbikKK3sKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpY2hhaW4tPnNlc3Npb25JZCgpOworICAgIHNzaXplX3QgaW5kZXggPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLmluZGV4T2ZLZXkoc2Vzc2lvbik7CisgICAgQUxPR1YoInB1dE9ycGhhbkVmZmVjdENoYWluX2wgc2Vzc2lvbiAlZCBpbmRleCAlZCIsIHNlc3Npb24sIGluZGV4KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBBTE9HVygicHV0T3JwaGFuRWZmZWN0Q2hhaW5fbCBjaGFpbiBmb3Igc2Vzc2lvbiAlZCBhbHJlYWR5IHByZXNlbnQiLCBzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLmFkZChzZXNzaW9uLCBjaGFpbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiBBdWRpb0ZsaW5nZXI6OmdldE9ycGhhbkVmZmVjdENoYWluX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluOworICAgIHNzaXplX3QgaW5kZXggPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLmluZGV4T2ZLZXkoc2Vzc2lvbik7CisgICAgQUxPR1YoImdldE9ycGhhbkVmZmVjdENoYWluX2wgc2Vzc2lvbiAlZCBpbmRleCAlZCIsIHNlc3Npb24sIGluZGV4KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBjaGFpbiA9IG1PcnBoYW5FZmZlY3RDaGFpbnMudmFsdWVBdChpbmRleCk7CisgICAgICAgIG1PcnBoYW5FZmZlY3RDaGFpbnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBjaGFpbjsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZT4mIGVmZmVjdCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCllZmZlY3QtPnNlc3Npb25JZCgpOworICAgIHNzaXplX3QgaW5kZXggPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLmluZGV4T2ZLZXkoc2Vzc2lvbik7CisgICAgQUxPR1YoInVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyBzZXNzaW9uICVkIGluZGV4ICVkIiwgc2Vzc2lvbiwgaW5kZXgpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1PcnBoYW5FZmZlY3RDaGFpbnMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChjaGFpbi0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigidXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zIHJlbW92aW5nIGVmZmVjdCBjaGFpbiBhdCBpbmRleCAlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIG1PcnBoYW5FZmZlY3RDaGFpbnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworCiBzdHJ1Y3QgRW50cnkgewogI2RlZmluZSBNQVhfTkFNRSAzMiAgICAgLy8gJVklbSVkJUglTSVTXyVkLndhdgogICAgIGNoYXIgbU5hbWVbTUFYX05BTUVdOwpAQCAtMjQ3MCw3ICsyODA3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICJ1bmFibGUgdG8gcm90YXRlIHRlZXMgaW4gJXM6ICVzXG4iLCB0ZWVQYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ1bmFibGUgdG8gcm90YXRlIHRlZXMgaW4gJXM6ICVzXG4iLCB0ZWVQYXRoLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGNoYXIgdGVlVGltZVsxNl07CkBAIC0yNDgzLDI0ICsyODIwLDI2IEBACiAgICAgICAgIC8vIGlmIDIgZHVtcHN5cyBhcmUgZG9uZSB3aXRoaW4gMSBzZWNvbmQsIGFuZCByb3RhdGlvbiBkaWRuJ3Qgd29yaywgdGhlbiBkaXNjYXJkIDJuZAogICAgICAgICBpbnQgdGVlRmQgPSBvcGVuKHRlZVBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTk9GT0xMT1csIFNfSVJVU1IgfCBTX0lXVVNSKTsKICAgICAgICAgaWYgKHRlZUZkID49IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIHVzZSBsaWJzbmRmaWxlCiAgICAgICAgICAgICBjaGFyIHdhdkhlYWRlcls0NF07CiAgICAgICAgICAgICBtZW1jcHkod2F2SGVhZGVyLAogICAgICAgICAgICAgICAgICJSSUZGXDBcMFwwXDBXQVZFZm10IFwyMFwwXDBcMFwxXDBcMlwwXDEwNFwyNTRcMFwwXDBcMFwwXDBcNFwwXDIwXDBkYXRhXDBcMFwwXDAiLAogICAgICAgICAgICAgICAgIHNpemVvZih3YXZIZWFkZXIpKTsKICAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSB0ZWVTb3VyY2UtPmZvcm1hdCgpOwogICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoY2hhbm5lbENvdW50IDw9IEZDQ18yKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KTsKICAgICAgICAgICAgIHdhdkhlYWRlclsyMl0gPSBjaGFubmVsQ291bnQ7ICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVscwogICAgICAgICAgICAgd2F2SGVhZGVyWzI0XSA9IHNhbXBsZVJhdGU7ICAgICAgICAgLy8gc2FtcGxlIHJhdGUKICAgICAgICAgICAgIHdhdkhlYWRlclsyNV0gPSBzYW1wbGVSYXRlID4+IDg7Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMzJdID0gY2hhbm5lbENvdW50ICogMjsgICAvLyBibG9jayBhbGlnbm1lbnQKKyAgICAgICAgICAgIHdhdkhlYWRlclszMl0gPSBmcmFtZVNpemU7ICAgICAgICAgIC8vIGJsb2NrIGFsaWdubWVudAorICAgICAgICAgICAgd2F2SGVhZGVyWzMzXSA9IGZyYW1lU2l6ZSA+PiA4OwogICAgICAgICAgICAgd3JpdGUodGVlRmQsIHdhdkhlYWRlciwgc2l6ZW9mKHdhdkhlYWRlcikpOwogICAgICAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKICAgICAgICAgICAgIGJvb2wgZmlyc3RSZWFkID0gdHJ1ZTsKKyNkZWZpbmUgVEVFX1NJTktfUkVBRCAxMDI0ICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyBwZXIgSS9PIG9wZXJhdGlvbgorICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKFRFRV9TSU5LX1JFQUQgKiBmcmFtZVNpemUpOwogICAgICAgICAgICAgZm9yICg7OykgewotI2RlZmluZSBURUVfU0lOS19SRUFEIDEwMjQKLSAgICAgICAgICAgICAgICBzaG9ydCBidWZmZXJbVEVFX1NJTktfUkVBRCAqIEZDQ18yXTsKICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQgPSBURUVfU0lOS19SRUFEOwogICAgICAgICAgICAgICAgIHNzaXplX3QgYWN0dWFsID0gdGVlU291cmNlLT5yZWFkKGJ1ZmZlciwgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CkBAIC0yNTEzLDIyICsyODUyLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChhY3R1YWwgPD0gKHNzaXplX3QpY291bnQpOwotICAgICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCBidWZmZXIsIGFjdHVhbCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOworICAgICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCBidWZmZXIsIGFjdHVhbCAqIGZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgdG90YWwgKz0gYWN0dWFsOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShidWZmZXIpOwogICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9IDQ0ICsgdG90YWwgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpIC0gODsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSA0NCArIHRvdGFsICogZnJhbWVTaXplIC0gODsKKyAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKICAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQwLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB0ZW1wID0gIHRvdGFsICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsKKyAgICAgICAgICAgIHRlbXAgPSAgdG90YWwgKiBmcmFtZVNpemU7CisgICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCiAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7CiAgICAgICAgICAgICBjbG9zZSh0ZWVGZCk7CiAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAidGVlIGNvcGllZCB0byAlc1xuIiwgdGVlUGF0aCk7CisgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBmZHByaW50ZihmZCwgInVuYWJsZSB0byBjcmVhdGUgdGVlICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIGNyZWF0ZSB0ZWUgJXM6ICVzXG4iLCB0ZWVQYXRoLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDUzZTIzOGUuLjEwMDMwMTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19GTElOR0VSX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GTElOR0VSX0gKIAorI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KQEAgLTQ5LDkgKzUwLDEyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSAiQXVkaW9XYXRjaGRvZy5oIgorI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTYwLDggKzY0LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBhdWRpb190cmFja19jYmxrX3Q7Ci1jbGFzcyBlZmZlY3RfcGFyYW1fY2Jsa190Oworc3RydWN0IGF1ZGlvX3RyYWNrX2NibGtfdDsKK3N0cnVjdCBlZmZlY3RfcGFyYW1fY2Jsa190OwogY2xhc3MgQXVkaW9NaXhlcjsKIGNsYXNzIEF1ZGlvQnVmZmVyOwogY2xhc3MgQXVkaW9SZXNhbXBsZXI7CkBAIC04MSw5ICs4NSw2IEBACiAKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0U3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKIAotI2RlZmluZSBNQVhfR0FJTiA0MDk2LjBmCi0jZGVmaW5lIE1BWF9HQUlOX0lOVCAweDEwMDAKLQogI2RlZmluZSBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSAogCiBjbGFzcyBBdWRpb0ZsaW5nZXIgOgpAQCAtMTAyLDI5ICsxMDMsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICB2aXJ0dWFsIHNwPElBdWRpb1JlY29yZD4gb3BlblJlY29yZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovKTsKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgbGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwpAQCAtMTU2LDE0ICsxNTgsMTMgQEAKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwogCiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpOwpAQCAtMTc0LDI4ICsxNzUsMzAgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1PdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24oc2l6ZV90ICpoYWxGcmFtZXMsIHNpemVfdCAqZHNwRnJhbWVzLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsICAgICB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3Q7CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OwogCi0gICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbik7CisgICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpOwogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqbnVtRWZmZWN0cykgY29uc3Q7CiAKQEAgLTIxMCw3ICsyMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQpOwogCkBAIC0yMjQsNiArMjI3LDMwIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKTsKIAorICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyk7CisKKyAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLyogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIC8qIExpc3QgZXhpc3RpbmcgYXVkaW8gcGF0Y2hlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpOworCisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIC8qIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uICovCisgICAgdmlydHVhbCBhdWRpb19od19zeW5jX3QgZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLApAQCAtMjM1LDggKzI2MiwxMiBAQAogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgbmV3V3JpdGVyX2woc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgdW5yZWdpc3RlcldyaXRlcihjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiYgd3JpdGVyKTsKIHByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTG9nTWVtb3J5U2l6ZSA9IDEwICogMTAyNDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb2dNZW1vcnlTaXplID0gNDAgKiAxMDI0OwogICAgIHNwPE1lbW9yeURlYWxlcj4gICAgbUxvZ01lbW9yeURlYWxlcjsgICAvLyA9PSAwIHdoZW4gTkJMb2cgaXMgZGlzYWJsZWQKKyAgICAvLyBXaGVuIGEgbG9nIHdyaXRlciBpcyB1bnJlZ2lzdGVyZWQsIGl0IGlzIGRvbmUgbGF6aWx5IHNvIHRoYXQgbWVkaWEubG9nIGNhbiBjb250aW51ZSB0byBzZWUgaXQKKyAgICAvLyBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZS4gIFRoZSBtZW1vcnkgaXMgb25seSBmcmVlZCB3aGVuIGl0IGlzIG5lZWRlZCBmb3IgYW5vdGhlciBsb2cgd3JpdGVyLgorICAgIFZlY3Rvcjwgc3A8TkJMb2c6OldyaXRlcj4gPiBtVW5yZWdpc3RlcmVkV3JpdGVyczsKKyAgICBNdXRleCAgICAgICAgICAgICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzTG9jazsKIHB1YmxpYzoKIAogICAgIGNsYXNzIFN5bmNFdmVudDsKQEAgLTI0OSw3ICsyODAsNyBAQAogICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgaW50IGxpc3RlbmVyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgIHN5bmNfZXZlbnRfY2FsbGJhY2tfdCBjYWxsQmFjaywKLSAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKKyAgICAgICAgICAgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSkKICAgICAgICAgOiBtVHlwZSh0eXBlKSwgbVRyaWdnZXJTZXNzaW9uKHRyaWdnZXJTZXNzaW9uKSwgbUxpc3RlbmVyU2Vzc2lvbihsaXN0ZW5lclNlc3Npb24pLAogICAgICAgICAgIG1DYWxsYmFjayhjYWxsQmFjayksIG1Db29raWUoY29va2llKQogICAgICAgICB7fQpAQCAtMjYyLDE0ICsyOTMsMTQgQEAKICAgICAgICAgQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVRyaWdnZXJTZXNzaW9uOyB9CiAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtTGlzdGVuZXJTZXNzaW9uOyB9Ci0gICAgICAgIHZvaWQgKmNvb2tpZSgpIGNvbnN0IHsgcmV0dXJuIG1Db29raWU7IH0KKyAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKCkgY29uc3QgeyByZXR1cm4gbUNvb2tpZTsgfQogCiAgICAgcHJpdmF0ZToKICAgICAgICAgICBjb25zdCBBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IG1UeXBlOwogICAgICAgICAgIGNvbnN0IGludCBtVHJpZ2dlclNlc3Npb247CiAgICAgICAgICAgY29uc3QgaW50IG1MaXN0ZW5lclNlc3Npb247CiAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IG1DYWxsYmFjazsKLSAgICAgICAgICB2b2lkICogY29uc3QgbUNvb2tpZTsKKyAgICAgICAgICBjb25zdCB3cDxSZWZCYXNlPiBtQ29va2llOwogICAgICAgICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAgICAgfTsKIApAQCAtMjc3LDcgKzMwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IGNhbGxCYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKTsKIAogcHJpdmF0ZToKICAgICBjbGFzcyBBdWRpb0h3RGV2aWNlOyAgICAvLyBmd2QgZGVjbGFyYXRpb24gZm9yIGZpbmRTdWl0YWJsZUh3RGV2X2wKQEAgLTMwMCw2ICszMzEsNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBwdXJnZVN0YWxlRWZmZWN0c19sKCk7CiAKKyAgICAvLyBTZXQga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMgdG8gdHJ1ZSB0byBlbmFibGUgZ3JlYXRlciB0aGFuIHN0ZXJlbyBvdXRwdXQKKyAgICAvLyBmb3IgdGhlIE1peGVyVGhyZWFkIGFuZCBkZXZpY2Ugc2luay4gIE51bWJlciBvZiBjaGFubmVscyBhbGxvd2VkIGlzCisgICAgLy8gRkNDXzIgPD0gY2hhbm5lbHMgPD0gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUy4KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBrRW5hYmxlRXh0ZW5kZWRDaGFubmVscyA9IHRydWU7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgY2hhbm5lbCBtYXNrIGlzIHBlcm1pdHRlZCBmb3IgdGhlIFBDTSBzaW5rIGluIHRoZSBNaXhlclRocmVhZAorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisgICAgICAgIHN3aXRjaCAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykpIHsKKyAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7CisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBGQ0NfMjsgLy8gc3RlcmVvIGlzIGRlZmF1bHQKKyAgICAgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA8IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgY2hhbm5lbE1hc2sgaXMgdGhlICJjYW5vbmljYWwiIG9uZSB3ZSBleHBlY3QgZm9yIHRoZSBjaGFubmVsQ291bnQuCisgICAgICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2sgPT0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQga0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uIHRvIHRydWUgdG8gdXNlIGV4dGVuZGVkIHByZWNpc2lvbiBpbiBNaXhlclRocmVhZAorICAgIHN0YXRpYyBjb25zdCBib29sIGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiA9IHRydWU7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZm9ybWF0IGlzIHBlcm1pdHRlZCBmb3IgdGhlIFBDTSBzaW5rIGluIHRoZSBNaXhlclRocmVhZAorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtU2lua0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ6CisgICAgICAgICAgICByZXR1cm4ga0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gc3RhbmRieSBkZWxheSBmb3IgTUlYRVIgYW5kIERVUExJQ0FUSU5HIHBsYXliYWNrIHRocmVhZHMgaXMgcmVhZCBmcm9tIHByb3BlcnR5CiAgICAgLy8gcm8uYXVkaW8uZmxpbmdlcl9zdGFuZGJ5dGltZV9tcyBvciBkZWZhdWx0cyB0byBrRGVmYXVsdFN0YW5kYnlUaW1lSW5Oc2VjcwogICAgIHN0YXRpYyBuc2Vjc190ICAgICAgICAgIG1TdGFuZGJ5VGltZUluTnNlY3M7CkBAIC0zOTQsNiArNDY4LDggQEAKIAogI2luY2x1ZGUgIkVmZmVjdHMuaCIKIAorI2luY2x1ZGUgIlBhdGNoUGFuZWwuaCIKKwogICAgIC8vIHNlcnZlciBzaWRlIG9mIHRoZSBjbGllbnQncyBJQXVkaW9UcmFjawogICAgIGNsYXNzIFRyYWNrSGFuZGxlIDogcHVibGljIGFuZHJvaWQ6OkJuQXVkaW9UcmFjayB7CiAgICAgcHVibGljOgpAQCAtNDI3LDcgKzUwMyw2IEBACiAgICAgcHVibGljOgogICAgICAgICBSZWNvcmRIYW5kbGUoY29uc3Qgc3A8UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4mIHJlY29yZFRyYWNrKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+UmVjb3JkSGFuZGxlKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0Q2JsaygpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwgaW50IHRyaWdnZXJTZXNzaW9uKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKQEAgLTQ0MywxNSArNTE4LDM5IEBACiAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpjaGVja1BsYXliYWNrVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKICAgICAgICAgICAgICAgTWl4ZXJUaHJlYWQgKmNoZWNrTWl4ZXJUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKmNoZWNrUmVjb3JkVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpIGNvbnN0OworICAgICAgICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IG9wZW5JbnB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IG9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICAgICAgICB2b2lkIGNsb3NlT3V0cHV0RmluaXNoKHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQpOworICAgICAgICAgICAgICB2b2lkIGNsb3NlSW5wdXRGaW5pc2goc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQpOworCiAgICAgICAgICAgICAgIC8vIG5vIHJhbmdlIGNoZWNrLCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1NdXRlX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGU7IH0KICAgICAgICAgICAgICAgLy8gbm8gcmFuZ2UgY2hlY2ssIGRvZXNuJ3QgY2hlY2sgcGVyLXRocmVhZCBzdHJlYW0gdm9sdW1lLCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgZmxvYXQgc3RyZWFtVm9sdW1lX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZTsgfQotICAgICAgICAgICAgICB2b2lkIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMik7CisgICAgICAgICAgICAgIHZvaWQgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMik7CiAKLSAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYW4gYXVkaW9faW9faGFuZGxlX3QsIHNlc3Npb24gSUQsIG9yIGVmZmVjdCBJRAorICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhbiBhdWRpb19pb19oYW5kbGVfdCwgc2Vzc2lvbiBJRCwgZWZmZWN0IElELCBvciBhdWRpb19tb2R1bGVfaGFuZGxlX3QuCisgICAgICAgICAgICAgIC8vIFRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIElEIHNwYWNlLCBidXQgdGhlIG5hbWVzcGFjZXMgYXJlIGFjdHVhbGx5IGluZGVwZW5kZW50CisgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgYXJlIHNlcGFyYXRlIEtleWVkVmVjdG9ycyBmb3IgZWFjaCBraW5kIG9mIElELgorICAgICAgICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHVpbnQzMl90LCBidXQgaXMgY2FzdCB0byBzaWduZWQgZm9yIHNvbWUgSURzLgorICAgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIEFQSSBkb2VzIG5vdCBoYW5kbGUgcm9sbG92ZXIgdG8gemVybyAoZm9yIHVuc2lnbmVkIElEcyksCisgICAgICAgICAgICAgIC8vICAgICAgIG9yIGZyb20gcG9zaXRpdmUgdG8gbmVnYXRpdmUgKGZvciBzaWduZWQgSURzKS4KKyAgICAgICAgICAgICAgLy8gICAgICAgVGh1cyBpdCBtYXkgZmFpbCBieSByZXR1cm5pbmcgYW4gSUQgb2YgdGhlIHdyb25nIHNpZ24sCisgICAgICAgICAgICAgIC8vICAgICAgIG9yIGJ5IHJldHVybmluZyBhIG5vbi11bmlxdWUgSUQuCiAgICAgICAgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwogCiAgICAgICAgICAgICAgIHN0YXR1c190IG1vdmVFZmZlY3RDaGFpbl9sKGludCBzZXNzaW9uSWQsCkBAIC00NjcsMTAgKzU2NiwyNiBAQAogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlQ2xpZW50X2wocGlkX3QgcGlkKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKTsKLQogICAgICAgICAgICAgICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUdsb2JhbEVmZmVjdEVuYWJsZWRfbCgpOwogICAgICAgICAgICAgICAgIHZvaWQgb25Ob25PZmZsb2FkYWJsZUdsb2JhbEVmZmVjdEVuYWJsZSgpOwogCisgICAgICAgICAgICAgICAgLy8gU3RvcmUgYW4gZWZmZWN0IGNoYWluIHRvIG1PcnBoYW5FZmZlY3RDaGFpbnMga2V5ZWQgdmVjdG9yLgorICAgICAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgdGhyZWFkIGV4aXRzIGFuZCBlZmZlY3RzIGFyZSBzdGlsbCBhdHRhY2hlZCB0byBpdC4KKyAgICAgICAgICAgICAgICAvLyBJZiBlZmZlY3RzIGFyZSBsYXRlciBjcmVhdGVkIG9uIHRoZSBzYW1lIHNlc3Npb24sIHRoZXkgd2lsbCByZXVzZSB0aGUgc2FtZQorICAgICAgICAgICAgICAgIC8vIGVmZmVjdCBjaGFpbiBhbmQgc2FtZSBpbnN0YW5jZXMgaW4gdGhlIGVmZmVjdCBsaWJyYXJ5LgorICAgICAgICAgICAgICAgIC8vIHJldHVybiBBTFJFQURZX0VYSVNUUyBpZiBhIGNoYWluIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBhbHJlYWR5IGV4aXN0cyBpbgorICAgICAgICAgICAgICAgIC8vIG1PcnBoYW5FZmZlY3RDaGFpbnMuIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYXMgdGhlcmUgaXMgb25seSBvbmUKKyAgICAgICAgICAgICAgICAvLyBjaGFpbiBmb3IgYSBnaXZlbiBzZXNzaW9uIGFuZCBpdCBpcyBhdHRhY2hlZCB0byBvbmx5IG9uZSB0aHJlYWQgYXQgYSB0aW1lLgorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwdXRPcnBoYW5FZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOworICAgICAgICAgICAgICAgIC8vIEdldCBhbiBlZmZlY3QgY2hhaW4gZm9yIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiBpbiBtT3JwaGFuRWZmZWN0Q2hhaW5zIGFuZCByZW1vdmUKKyAgICAgICAgICAgICAgICAvLyBpdCBpZiBmb3VuZC4gUmV0dXJucyAwIGlmIG5vdCBmb3VuZCAodGhpcyBpcyB0aGUgbW9zdCBjb21tb24gY2FzZSkuCisgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGdldE9ycGhhbkVmZmVjdENoYWluX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSBsYXN0IGVmZmVjdCBoYW5kbGUgb24gYW4gZWZmZWN0IGluc3RhbmNlIGlzIHJlbW92ZWQuIElmIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgYmVsb25ncyB0byBhbiBlZmZlY3QgY2hhaW4gaW4gbU9ycGhhbkVmZmVjdENoYWlucywgdGhlIGNoYWluIGlzIHVwZGF0ZWQKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVtb3ZlZCBmcm9tIG1PcnBoYW5FZmZlY3RDaGFpbnMgaWYgaXQgZG9lcyBub3QgY29udGFpbiBhbnkgZWZmZWN0LgorICAgICAgICAgICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlZmZlY3Qgd2FzIGZvdW5kIGluIG1PcnBoYW5FZmZlY3RDaGFpbnMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CisKICAgICBjbGFzcyBBdWRpb0h3RGV2aWNlIHsKICAgICBwdWJsaWM6CiAgICAgICAgIGVudW0gRmxhZ3MgewpAQCAtNDc4LDEwICs1OTMsMTEgQEAKICAgICAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKICAgICAgICAgfTsKIAotICAgICAgICBBdWRpb0h3RGV2aWNlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCisgICAgICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICBGbGFncyBmbGFncykKLSAgICAgICAgICAgIDogbU1vZHVsZU5hbWUoc3RyZHVwKG1vZHVsZU5hbWUpKQorICAgICAgICAgICAgOiBtSGFuZGxlKGhhbmRsZSksIG1Nb2R1bGVOYW1lKHN0cmR1cChtb2R1bGVOYW1lKSkKICAgICAgICAgICAgICwgbUh3RGV2aWNlKGh3RGV2aWNlKQogICAgICAgICAgICAgLCBtRmxhZ3MoZmxhZ3MpIHsgfQogICAgICAgICAvKnZpcnR1YWwqLyB+QXVkaW9Id0RldmljZSgpIHsgZnJlZSgodm9pZCAqKW1Nb2R1bGVOYW1lKTsgfQpAQCAtNDk0LDEyICs2MTAsMTYgQEAKICAgICAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7CiAgICAgICAgIH0KIAorICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQogICAgICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZU5hbWU7IH0KICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9CisgICAgICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uOyB9CisKICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbUhhbmRsZTsKICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IG1Nb2R1bGVOYW1lOwogICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqIGNvbnN0IG1Id0RldmljZTsKLSAgICAgICAgRmxhZ3MgbUZsYWdzOworICAgICAgICBjb25zdCBGbGFncyBtRmxhZ3M7CiAgICAgfTsKIAogICAgIC8vIEF1ZGlvU3RyZWFtT3V0IGFuZCBBdWRpb1N0cmVhbUluIGFyZSBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCkBAIC01MDksNyArNjI5LDcgQEAKICAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1PdXQgewogICAgICAgICBBdWRpb0h3RGV2aWNlKiBjb25zdCBhdWRpb0h3RGV2OwogICAgICAgICBhdWRpb19zdHJlYW1fb3V0X3QqIGNvbnN0IHN0cmVhbTsKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CisgICAgICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwogCiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90KiBod0RldigpIGNvbnN0IHsgcmV0dXJuIGF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7IH0KIApAQCAtNTM3LDcgKzY1NywxMSBAQAogICAgIH07CiAKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKLQorICAgICAgICAgICAgICAgIC8vIHByb3RlY3RzIG1DbGllbnRzIGFuZCBtTm90aWZpY2F0aW9uQ2xpZW50cy4KKyAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIGxvY2tlZCBhZnRlciBtTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaWYgYm90aCBtdXN0IGJlIGxvY2tlZAorICAgICAgICAgICAgICAgIC8vIGF2b2lkcyBhY3F1aXJpbmcgQXVkaW9GbGluZ2VyOjptTG9jayBmcm9tIGluc2lkZSB0aHJlYWQgbG9vcC4KKyAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50TG9jazsKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUNsaWVudExvY2sKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHBpZF90LCB3cDxDbGllbnQ+ID4gICAgIG1DbGllbnRzOyAgIC8vIHNlZSB+Q2xpZW50KCkKIAogICAgICAgICAgICAgICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZUxvY2s7CkBAIC01ODYsOCArNzEwLDEzIEBACiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxSZWNvcmRUaHJlYWQ+ID4gICAgbVJlY29yZFRocmVhZHM7CiAKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUNsaWVudExvY2sKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHBpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisKICAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTmV4dFVuaXF1ZUlkOyAgLy8gdXBkYXRlZCBieSBhbmRyb2lkX2F0b21pY19pbmMKKyAgICAgICAgICAgICAgICAvLyBuZXh0VW5pcXVlSWQoKSByZXR1cm5zIHVpbnQzMl90LCBidXQgdGhpcyBpcyBkZWNsYXJlZCBpbnQzMl90CisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgYXRvbWljIG9wZXJhdGlvbnMgcmVxdWlyZSBhbiBpbnQzMl90CisKICAgICAgICAgICAgICAgICBhdWRpb19tb2RlX3QgICAgICAgICAgICAgICAgICAgICAgICBtTW9kZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnROcmVjSXNPZmY7CiAKQEAgLTYwMSwxMiArNzMwLDE3IEBACiAgICAgICAgICAgICAgICAgVmVjdG9yIDwgc3A8U3luY0V2ZW50PiA+IG1QZW5kaW5nU3luY0V2ZW50czsgLy8gc3luYyBldmVudHMgYXdhaXRpbmcgZm9yIGEgc2Vzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIGNyZWF0ZWQKIAorICAgICAgICAgICAgICAgIC8vIEVmZmVjdCBjaGFpbnMgd2l0aG91dCBhIHZhbGlkIHRocmVhZAorICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fc2Vzc2lvbl90ICwgc3A8RWZmZWN0Q2hhaW4+ID4gbU9ycGhhbkVmZmVjdENoYWluczsKKwogcHJpdmF0ZToKLSAgICBzcDxDbGllbnQ+ICByZWdpc3RlclBpZF9sKHBpZF90IHBpZCk7ICAgIC8vIGFsd2F5cyByZXR1cm5zIG5vbi0wCisgICAgc3A8Q2xpZW50PiAgcmVnaXN0ZXJQaWQocGlkX3QgcGlkKTsgICAgLy8gYWx3YXlzIHJldHVybnMgbm9uLTAKIAogICAgIC8vIGZvciB1c2UgZnJvbSBkZXN0cnVjdG9yCiAgICAgc3RhdHVzX3QgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0SW50ZXJuYWxfbChzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkKTsKICAgICBzdGF0dXNfdCAgICBjbG9zZUlucHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRJbnRlcm5hbF9sKHNwPFJlY29yZFRocmVhZD4gdGhyZWFkKTsKIAogI2lmZGVmIFRFRV9TSU5LCiAgICAgLy8gYWxsIHJlY29yZCB0aHJlYWRzIHNlcmlhbGx5IHNoYXJlIGEgY29tbW9uIHRlZSBzaW5rLCB3aGljaCBpcyByZS1jcmVhdGVkIG9uIGZvcm1hdCBjaGFuZ2UKQEAgLTYzNCw3ICs3NjgsNyBAQAogICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0ID0gMHgxMDAwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKICNlbmRpZgogCiAgICAgLy8gVGhpcyBtZXRob2QgcmVhZHMgZnJvbSBhIHZhcmlhYmxlIHdpdGhvdXQgbUxvY2ssIGJ1dCB0aGUgdmFyaWFibGUgaXMgdXBkYXRlZCB1bmRlciBtTG9jay4gIFNvCkBAIC02NDcsMTAgKzc4MSwxNyBAQAogICAgIGJvb2wgICAgbUlzTG93UmFtRGV2aWNlOwogICAgIGJvb2wgICAgbUlzRGV2aWNlVHlwZUtub3duOwogICAgIG5zZWNzX3QgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWU7ICAvLyB3aGVuIGEgZ2xvYmFsIGVmZmVjdCB3YXMgbGFzdCBlbmFibGVkCisKKyAgICBzcDxQYXRjaFBhbmVsPiBtUGF0Y2hQYW5lbDsKKworICAgIHVpbnQzMl90ICAgIG1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZTsgICAvLyBzYW1wbGUgcmF0ZSBvZiB0aGUgcHJpbWFyeSBvdXRwdXQsIG9yIHplcm8gaWYgbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUhhcmR3YXJlTG9jawogfTsKIAogI3VuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICiAKK2NvbnN0IGNoYXIgKmZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAppbmRleCAwN2RjNmRkLi5mZDI4ZWExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC0zNCw2NSArMzUsMzQ1IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8Y29tbW9uX3RpbWUvbG9jYWxfY2xvY2suaD4KICNpbmNsdWRlIDxjb21tb25fdGltZS9jY19oZWxwZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgogCisjaW5jbHVkZSAiQXVkaW9NaXhlck9wcy5oIgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKIAorLy8gVGhlIEZDQ18yIG1hY3JvIHJlZmVycyB0byB0aGUgRml4ZWQgQ2hhbm5lbCBDb3VudCBvZiAyIGZvciB0aGUgbGVnYWN5IGludGVnZXIgbWl4ZXIuCisjaWZuZGVmIEZDQ18yCisjZGVmaW5lIEZDQ18yIDIKKyNlbmRpZgorCisvLyBMb29rIGZvciBNT05PX0hBQ0sgZm9yIGFueSBNb25vIGhhY2sgaW52b2x2aW5nIGxlZ2FjeSBtb25vIGNoYW5uZWwgdG8KKy8vIHN0ZXJlbyBjaGFubmVsIGNvbnZlcnNpb24uCisKKy8qIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcgd2lsbCBzaG93IGV4YWN0bHkgd2hpY2ggcHJvY2VzcyBob29rIGFuZCB0cmFjayBob29rIGlzCisgKiBiZWluZyB1c2VkLiBUaGlzIGlzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBsb2cgc3BhbSwgc28gZG9uJ3QgZW5hYmxlIHVubGVzcyB5b3UKKyAqIGFyZSB2ZXJpZnlpbmcgdGhlIGhvb2sgYmFzZWQgY29kZS4KKyAqLworLy8jZGVmaW5lIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorLy9kZWZpbmUgQUxPR1ZWIHByaW50ZiAgLy8gZm9yIHRlc3QtbWl4ZXIuY3BwCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKCh4KVswXSkpCisjZW5kaWYKKworLy8gU2V0IGtVc2VOZXdNaXhlciB0byB0cnVlIHRvIHVzZSB0aGUgbmV3IG1peGVyIGVuZ2luZS4gT3RoZXJ3aXNlIHRoZQorLy8gb3JpZ2luYWwgY29kZSB3aWxsIGJlIHVzZWQuICBUaGlzIGlzIGZhbHNlIGZvciBub3cuCitzdGF0aWMgY29uc3QgYm9vbCBrVXNlTmV3TWl4ZXIgPSBmYWxzZTsKKworLy8gU2V0IGtVc2VGbG9hdCB0byB0cnVlIHRvIGFsbG93IGZsb2F0aW5nIGlucHV0IGludG8gdGhlIG1peGVyIGVuZ2luZS4KKy8vIElmIGtVc2VOZXdNaXhlciBpcyBmYWxzZSwgdGhpcyBpcyBpZ25vcmVkIG9yIG1heSBiZSBvdmVycmlkZGVuIGludGVybmFsbHkKKy8vIGJlY2F1c2Ugb2YgZG93bm1peC91cG1peCBzdXBwb3J0Lgorc3RhdGljIGNvbnN0IGJvb2wga1VzZUZsb2F0ID0gdHJ1ZTsKKworLy8gU2V0IHRvIGRlZmF1bHQgY29weSBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgZm9yIGlucHV0IHByb2Nlc3NpbmcuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtDb3B5QnVmZmVyRnJhbWVDb3VudCA9IDI1NjsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSA6IEF1ZGlvQnVmZmVyUHJvdmlkZXIoKSwKLSAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXIoTlVMTCksIG1Eb3dubWl4SGFuZGxlKE5VTEwpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKIHsKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKworQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLAorICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBtSW5wdXRGcmFtZVNpemUoaW5wdXRGcmFtZVNpemUpLAorICAgICAgICBtT3V0cHV0RnJhbWVTaXplKG91dHB1dEZyYW1lU2l6ZSksCisgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQoYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGEoTlVMTCksCisgICAgICAgIG1Db25zdW1lZCgwKQoreworICAgIEFMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApKCV6dSwgJXp1LCAlenUpIiwgdGhpcywKKyAgICAgICAgICAgIGlucHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUsIGJ1ZmZlckZyYW1lQ291bnQpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5wdXRGcmFtZVNpemUgPCBvdXRwdXRGcmFtZVNpemUgJiYgYnVmZmVyRnJhbWVDb3VudCA9PSAwLAorICAgICAgICAgICAgIlJlcXVpcmVzIGxvY2FsIGJ1ZmZlciBpZiBpbnB1dEZyYW1lU2l6ZSglenUpIDwgb3V0cHV0RnJhbWVTaXplKCV6dSkiLAorICAgICAgICAgICAgaW5wdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lU2l6ZSk7CisgICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQpIHsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1Mb2NhbEJ1ZmZlckRhdGEsIDMyLCBtTG9jYWxCdWZmZXJGcmFtZUNvdW50ICogbU91dHB1dEZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7Cit9CisKK0F1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6fkNvcHlCdWZmZXJQcm92aWRlcigpCit7CisgICAgQUxPR1YoIn5Db3B5QnVmZmVyUHJvdmlkZXIoJXApIiwgdGhpcyk7CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICB9CisgICAgZnJlZShtTG9jYWxCdWZmZXJEYXRhKTsKK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwKKyAgICAgICAgaW50NjRfdCBwdHMpCit7CisgICAgLy9BTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKTo6Z2V0TmV4dEJ1ZmZlciglcCAoJXp1KSwgJWxsZCkiLAorICAgIC8vICAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50LCBwdHMpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIocEJ1ZmZlciwgcHRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgY29weUZyYW1lcyhwQnVmZmVyLT5yYXcsIHBCdWZmZXItPnJhdywgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBwdHMpOworICAgICAgICAvLyBBdCBvbmUgdGltZSBhbiB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIgaGFkCisgICAgICAgIC8vIHJlcyA9PSBPSyBhbmQgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDAsIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4gbm93IDcvMTgvMjAxNC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQnkgQVBJIHNwZWMsIGlmIHJlcyAhPSBPSywgdGhlbiBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMC4KKyAgICAgICAgLy8gYnV0IHRoZXJlIG1heSBiZSBpbXByb3BlciBpbXBsZW1lbnRhdGlvbnMuCisgICAgICAgIEFMT0dfQVNTRVJUKHJlcyA9PSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsgLy8gbm90IG5lZWRlZCBieSBBUEkgc3BlYywgYnV0IHRvIGJlIHNhZmUuCisgICAgICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIG1Db25zdW1lZCA9IDA7CisgICAgfQorICAgIEFMT0dfQVNTRVJUKG1Db25zdW1lZCA8IG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGNvdW50ID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQsIG1CdWZmZXIuZnJhbWVDb3VudCAtIG1Db25zdW1lZCk7CisgICAgY291bnQgPSBtaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGNvdW50OworICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCAodWludDhfdCopbUJ1ZmZlci5yYXcgKyBtQ29uc3VtZWQgKiBtSW5wdXRGcmFtZVNpemUsCisgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikKK3sKKyAgICAvL0FMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApOjpyZWxlYXNlQnVmZmVyKCVwKCV6dSkpIiwKKyAgICAvLyAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcihwQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBMT0dfQUxXQVlTX0ZBVEFMX0lGKHBCdWZmZXItPmZyYW1lQ291bnQgPT0gMCwgIkludmFsaWQgZnJhbWVjb3VudCIpOworICAgIG1Db25zdW1lZCArPSBwQnVmZmVyLT5mcmFtZUNvdW50OyAvLyBUT0RPOiB1cGRhdGUgZm9yIGVmZmljaWVuY3kgdG8gcmV1c2UgZXhpc3RpbmcgY29udGVudAorICAgIGlmIChtQ29uc3VtZWQgIT0gMCAmJiBtQ29uc3VtZWQgPj0gbUJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgQUxPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgIH0KKyAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOworICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgfQorICAgIG1Db25zdW1lZCA9IDA7Cit9CisKK0F1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBzZXNzaW9uSWQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSAgLy8gc2V0IGJ1ZmZlckZyYW1lQ291bnQgdG8gMCB0byBkbyBpbi1wbGFjZQoreworICAgIEFMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCAldSAlZCkiLAorICAgICAgICAgICAgdGhpcywgaW5wdXRDaGFubmVsTWFzaywgb3V0cHV0Q2hhbm5lbE1hc2ssIGZvcm1hdCwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCk7CisgICAgaWYgKCFzSXNNdWx0aWNoYW5uZWxDYXBhYmxlCisgICAgICAgICAgICB8fCBFZmZlY3RDcmVhdGUoJnNEd25tRnhEZXNjLnV1aWQsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVELAorICAgICAgICAgICAgICAgICAgICAmbURvd25taXhIYW5kbGUpICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yIGNyZWF0aW5nIGRvd25taXhlciBlZmZlY3QiKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICAvLyBjaGFubmVsIGlucHV0IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvdmVycmlkZGVuIHBlci10cmFjaworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGlucHV0Q2hhbm5lbE1hc2s7ICAgLy8gRklYTUU6IFNob3VsZCBiZSBiaXRzCisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IG91dHB1dENoYW5uZWxNYXNrOyAvLyBGSVhNRTogc2hvdWxkIGJlIGJpdHMKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gZm9ybWF0OworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gZm9ybWF0OworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIHByb3ZpZGVyLCBhbmQgZnJhbWUgY291bnQgd2lsbCBub3QgYmUgdXNlZCBhcyB0aGUgZG93bm1peCBlZmZlY3QKKyAgICAgLy8gcHJvY2VzcygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBkaXJlY3RseSAoc2VlIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkpCisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFIHwgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyB8CisgICAgICAgICAgICAgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcubWFzayA9IG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2s7CisKKyAgICAgaW50IGNtZFN0YXR1czsKKyAgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7CisKKyAgICAgLy8gQ29uZmlndXJlIGRvd25taXhlcgorICAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgLypjbWRDb2RlKi8sIHNpemVvZihlZmZlY3RfY29uZmlnX3QpIC8qY21kU2l6ZSovLAorICAgICAgICAgICAgICZtRG93bm1peENvbmZpZyAvKnBDbWREYXRhKi8sCisgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7CisgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIGNvbmZpZ3VyaW5nIGRvd25taXhlciIsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKKyAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgLy8gRW5hYmxlIGRvd25taXhlcgorICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9FTkFCTEUgLypjbWRDb2RlKi8sIDAgLypjbWRTaXplKi8sIE5VTEwgLypwQ21kRGF0YSovLAorICAgICAgICAgICAgICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBlbmFibGluZyBkb3dubWl4ZXIiLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7CisgICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIC8vIFNldCBkb3dubWl4IHR5cGUKKyAgICAgLy8gcGFyYW1ldGVyIHNpemUgcm91bmRlZCBmb3IgcGFkZGluZyBvbiAzMmJpdCBib3VuZGFyeQorICAgICBjb25zdCBpbnQgcHNpemVQYWRkZWQgPSAoKHNpemVvZihkb3dubWl4X3BhcmFtc190KSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKKyAgICAgY29uc3QgaW50IGRvd25taXhQYXJhbVNpemUgPQorICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwc2l6ZVBhZGRlZCArIHNpemVvZihkb3dubWl4X3R5cGVfdCk7CisgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKGRvd25taXhQYXJhbVNpemUpOworICAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoZG93bm1peF9wYXJhbXNfdCk7CisgICAgIGNvbnN0IGRvd25taXhfcGFyYW1zX3QgZG93bm1peFBhcmFtID0gRE9XTk1JWF9QQVJBTV9UWVBFOworICAgICBtZW1jcHkocGFyYW0tPmRhdGEsICZkb3dubWl4UGFyYW0sIHBhcmFtLT5wc2l6ZSk7CisgICAgIGNvbnN0IGRvd25taXhfdHlwZV90IGRvd25taXhUeXBlID0gRE9XTk1JWF9UWVBFX0ZPTEQ7CisgICAgIHBhcmFtLT52c2l6ZSA9IHNpemVvZihkb3dubWl4X3R5cGVfdCk7CisgICAgIG1lbWNweShwYXJhbS0+ZGF0YSArIHBzaXplUGFkZGVkLCAmZG93bm1peFR5cGUsIHBhcmFtLT52c2l6ZSk7CisgICAgIHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworICAgICBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9QQVJBTSAvKiBjbWRDb2RlICovLCBkb3dubWl4UGFyYW1TaXplIC8qIGNtZFNpemUgKi8sCisgICAgICAgICAgICAgcGFyYW0gLypwQ21kRGF0YSovLCAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKKyAgICAgZnJlZShwYXJhbSk7CisgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIHNldHRpbmcgZG93bm1peCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOworICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZG93bm1peCB0eXBlIHNldCB0byAlZCIsIChpbnQpIGRvd25taXhUeXBlKTsKIH0KIAogQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6On5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpCiB7Ci0gICAgQUxPR1YoIkF1ZGlvTWl4ZXIgZGVsZXRpbmcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKCVwKSIsIHRoaXMpOworICAgIEFMT0dWKCJ+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKCVwKSIsIHRoaXMpOwogICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKIH0KIAotc3RhdHVzX3QgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLAotICAgICAgICBpbnQ2NF90IHB0cykgewotICAgIC8vQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkiKTsKLSAgICBpZiAodGhpcy0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcihwQnVmZmVyLCBwdHMpOwotICAgICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ID0gcEJ1ZmZlci0+cmF3OwotICAgICAgICAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3ID0gbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdzsKLSAgICAgICAgICAgIC8vIGluLXBsYWNlIHNvIG92ZXJ3cml0ZSB0aGUgYnVmZmVyIGNvbnRlbnRzLCBoYXMgYmVlbiBzZXQgaW4gcHJlcGFyZVRyYWNrRm9yRG93bm1peCgpCi0gICAgICAgICAgICAvL21Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7Cit2b2lkIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOworICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPSBjb25zdF9jYXN0PHZvaWQgKj4oc3JjKTsKKyAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7CisgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcgPSBkc3Q7CisgICAgLy8gbWF5IGJlIGluLXBsYWNlIGlmIHNyYyA9PSBkc3QuCisgICAgc3RhdHVzX3QgcmVzID0gKCptRG93bm1peEhhbmRsZSktPnByb2Nlc3MobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAmbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLCAmbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7CisgICAgQUxPR0VfSUYocmVzICE9IE9LLCAiRG93bm1peEJ1ZmZlclByb3ZpZGVyIGVycm9yICVkIiwgcmVzKTsKK30KIAotICAgICAgICAgICAgcmVzID0gKCptRG93bm1peEhhbmRsZSktPnByb2Nlc3MobURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICZtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIsICZtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyKTsKLSAgICAgICAgICAgIC8vQUxPR1YoImdldE5leHRCdWZmZXIgaXMgZG93bm1peGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkgZXJyb3I6IE5VTEwgdHJhY2sgYnVmZmVyIHByb3ZpZGVyIik7CisvKiBjYWxsIG9uY2UgaW4gYSBwdGhyZWFkX29uY2UgaGFuZGxlci4gKi8KKy8qc3RhdGljKi8gc3RhdHVzX3QgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmluaXQoKQoreworICAgIC8vIGZpbmQgbXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGlmIHdlIGhhdmUgdG8gcGxheSBtdWx0aWNoYW5uZWwgY29udGVudAorICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgIGludCByZXQgPSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcigpIGVycm9yICVkIHF1ZXJ5aW5nIG51bWJlciBvZiBlZmZlY3RzIiwgcmV0KTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotfQorICAgIEFMT0dWKCJFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKSBudW1FZmZlY3RzPSVkIiwgbnVtRWZmZWN0cyk7CiAKLXZvaWQgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKSB7Ci0gICAgLy9BTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoKSIpOwotICAgIGlmICh0aGlzLT5tVHJhY2tCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKHBCdWZmZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcigpIGVycm9yOiBOVUxMIHRyYWNrIGJ1ZmZlciBwcm92aWRlciIpOworICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgbnVtRWZmZWN0cyA7IGkrKykgeworICAgICAgICBpZiAoRWZmZWN0UXVlcnlFZmZlY3QoaSwgJnNEd25tRnhEZXNjKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiZWZmZWN0ICVkIGlzIGNhbGxlZCAlcyIsIGksIHNEd25tRnhEZXNjLm5hbWUpOworICAgICAgICAgICAgaWYgKG1lbWNtcCgmc0R3bm1GeERlc2MudHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIGVmZmVjdCBcIiVzXCIgZnJvbSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzRHdubUZ4RGVzYy5uYW1lLCBzRHdubUZ4RGVzYy5pbXBsZW1lbnRvcik7CisgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisgICAgQUxPR1dfSUYoIXNJc011bHRpY2hhbm5lbENhcGFibGUsICJ1bmFibGUgdG8gZmluZCBkb3dubWl4IGVmZmVjdCIpOworICAgIHJldHVybiBOT19JTklUOwogfQogCisvKnN0YXRpYyovIGJvb2wgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnNJc011bHRpY2hhbm5lbENhcGFibGUgPSBmYWxzZTsKKy8qc3RhdGljKi8gZWZmZWN0X2Rlc2NyaXB0b3JfdCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6c0R3bm1GeERlc2M7CisKK0F1ZGlvTWl4ZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1TYW1wbGVTaXplKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1JbnB1dENoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSksCisgICAgICAgIG1PdXRwdXRDaGFubmVscyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spKQoreworICAgIEFMT0dWKCJSZW1peEJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICUjeCwgJSN4KSAlenUgJXp1IiwKKyAgICAgICAgICAgIHRoaXMsIGZvcm1hdCwgaW5wdXRDaGFubmVsTWFzaywgb3V0cHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICBtSW5wdXRDaGFubmVscywgbU91dHB1dENoYW5uZWxzKTsKKyAgICAvLyBUT0RPOiBjb25zaWRlciBjaGFubmVsIHJlcHJlc2VudGF0aW9uIGluIGluZGV4IGFycmF5IGZvcm11bGF0aW9uCisgICAgLy8gV2UgaWdub3JlIGNoYW5uZWwgcmVwcmVzZW50YXRpb24sIGFuZCBqdXN0IHVzZSB0aGUgYml0cy4KKyAgICBtZW1jcHlfYnlfaW5kZXhfYXJyYXlfaW5pdGlhbGl6YXRpb24obUlkeEFyeSwgQVJSQVlfU0laRShtSWR4QXJ5KSwKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhvdXRwdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoaW5wdXRDaGFubmVsTWFzaykpOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5KGRzdCwgbU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgc3JjLCBtSW5wdXRDaGFubmVscywgbUlkeEFyeSwgbVNhbXBsZVNpemUsIGZyYW1lcyk7Cit9CisKK0F1ZGlvTWl4ZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG91dHB1dEZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgY2hhbm5lbHMgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGlucHV0Rm9ybWF0KSwKKyAgICAgICAgICAgIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShvdXRwdXRGb3JtYXQpLAorICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1DaGFubmVscyhjaGFubmVscyksCisgICAgICAgIG1JbnB1dEZvcm1hdChpbnB1dEZvcm1hdCksCisgICAgICAgIG1PdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KQoreworICAgIEFMT0dWKCJSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKCVwKSglZCwgJSN4LCAlI3gpIiwgdGhpcywgY2hhbm5lbHMsIGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1PdXRwdXRGb3JtYXQsIHNyYywgbUlucHV0Rm9ybWF0LCBmcmFtZXMgKiBtQ2hhbm5lbHMpOworfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ib29sIEF1ZGlvTWl4ZXI6OmlzTXVsdGljaGFubmVsQ2FwYWJsZSA9IGZhbHNlOwotCi1lZmZlY3RfZGVzY3JpcHRvcl90IEF1ZGlvTWl4ZXI6OmR3bm1GeERlc2M7CiAKIC8vIEVuc3VyZSBtQ29uZmlndXJlZE5hbWVzIGJpdG1hc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkgb24gYWxsIGFyY2hpdGVjdHVyZXMuCiAvLyBUaGUgdmFsdWUgb2YgMSA8PCB4IGlzIHVuZGVmaW5lZCBpbiBDIHdoZW4geCA+PSAzMi4KQEAgLTEwMSwyMCArMzgyLDEyIEBACiAgICAgOiAgIG1UcmFja05hbWVzKDApLCBtQ29uZmlndXJlZE5hbWVzKChtYXhOdW1UcmFja3MgPj0gMzIgPyAwIDogMSA8PCBtYXhOdW1UcmFja3MpIC0gMSksCiAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpCiB7Ci0gICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbXVsdGktY2hhbm5lbCBiZXlvbmQgc3RlcmVvCi0gICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRSgyID09IE1BWF9OVU1fQ0hBTk5FTFMpOwotCiAgICAgQUxPR19BU1NFUlQobWF4TnVtVHJhY2tzIDw9IE1BWF9OVU1fVFJBQ0tTLCAibWF4TnVtVHJhY2tzICV1ID4gTUFYX05VTV9UUkFDS1MgJXUiLAogICAgICAgICAgICAgbWF4TnVtVHJhY2tzLCBNQVhfTlVNX1RSQUNLUyk7CiAKICAgICAvLyBBdWRpb01peGVyIGlzIG5vdCB5ZXQgY2FwYWJsZSBvZiBtb3JlIHRoYW4gMzIgYWN0aXZlIHRyYWNrIGlucHV0cwogICAgIEFMT0dfQVNTRVJUKDMyID49IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIE1BWF9OVU1fVFJBQ0tTICVkIiwgTUFYX05VTV9UUkFDS1MpOwogCi0gICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbXVsdGktY2hhbm5lbCBvdXRwdXQgYmV5b25kIHN0ZXJlbwotICAgIEFMT0dfQVNTRVJUKDIgPT0gTUFYX05VTV9DSEFOTkVMUywgImJhZCBNQVhfTlVNX0NIQU5ORUxTICVkIiwgTUFYX05VTV9DSEFOTkVMUyk7Ci0KLSAgICBMb2NhbENsb2NrIGxjOwotCiAgICAgcHRocmVhZF9vbmNlKCZzT25jZUNvbnRyb2wsICZzSW5pdFJvdXRpbmUpOwogCiAgICAgbVN0YXRlLmVuYWJsZWRUcmFja3M9IDA7CkBAIC0xMzMsMzAgKzQwNiwxMCBAQAogICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IE1BWF9OVU1fVFJBQ0tTIDsgaSsrKSB7CiAgICAgICAgIHQtPnJlc2FtcGxlciA9IE5VTEw7CiAgICAgICAgIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0Kys7CiAgICAgfQogCi0gICAgLy8gZmluZCBtdWx0aWNoYW5uZWwgZG93bm1peCBlZmZlY3QgaWYgd2UgaGF2ZSB0byBwbGF5IG11bHRpY2hhbm5lbCBjb250ZW50Ci0gICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7Ci0gICAgaW50IHJldCA9IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7Ci0gICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb01peGVyKCkgZXJyb3IgJWQgcXVlcnlpbmcgbnVtYmVyIG9mIGVmZmVjdHMiLCByZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFMT0dWKCJFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKSBudW1FZmZlY3RzPSVkIiwgbnVtRWZmZWN0cyk7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwIDsgaSA8IG51bUVmZmVjdHMgOyBpKyspIHsKLSAgICAgICAgaWYgKEVmZmVjdFF1ZXJ5RWZmZWN0KGksICZkd25tRnhEZXNjKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiZWZmZWN0ICVkIGlzIGNhbGxlZCAlcyIsIGksIGR3bm1GeERlc2MubmFtZSk7Ci0gICAgICAgICAgICBpZiAobWVtY21wKCZkd25tRnhEZXNjLnR5cGUsIEVGRkVDVF9VSUlEX0RPV05NSVgsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBlZmZlY3QgXCIlc1wiIGZyb20gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgZHdubUZ4RGVzYy5uYW1lLCBkd25tRnhEZXNjLmltcGxlbWVudG9yKTsKLSAgICAgICAgICAgICAgICBpc011bHRpY2hhbm5lbENhcGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dFX0lGKCFpc011bHRpY2hhbm5lbENhcGFibGUsICJ1bmFibGUgdG8gZmluZCBkb3dubWl4IGVmZmVjdCIpOwogfQogCiBBdWRpb01peGVyOjp+QXVkaW9NaXhlcigpCkBAIC0xNjUsNiArNDE4LDcgQEAKICAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBNQVhfTlVNX1RSQUNLUyA7IGkrKykgewogICAgICAgICBkZWxldGUgdC0+cmVzYW1wbGVyOwogICAgICAgICBkZWxldGUgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgICAgIGRlbGV0ZSB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKICAgICAgICAgdCsrOwogICAgIH0KICAgICBkZWxldGUgW10gbVN0YXRlLm91dHB1dFRlbXA7CkBAIC0xNzYsMzIgKzQzMCw1MiBAQAogICAgIG1TdGF0ZS5tTG9nID0gbG9nOwogfQogCi1pbnQgQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKQoraW50IEF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKQogeworICAgIGlmICghaXNWYWxpZFBjbVRyYWNrRm9ybWF0KGZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBpbnZhbGlkIGZvcm1hdCAoJSN4KSIsIGZvcm1hdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgdWludDMyX3QgbmFtZXMgPSAofm1UcmFja05hbWVzKSAmIG1Db25maWd1cmVkTmFtZXM7CiAgICAgaWYgKG5hbWVzICE9IDApIHsKICAgICAgICAgaW50IG4gPSBfX2J1aWx0aW5fY3R6KG5hbWVzKTsKICAgICAgICAgQUxPR1YoImFkZCB0cmFjayAoJWQpIiwgbik7Ci0gICAgICAgIG1UcmFja05hbWVzIHw9IDEgPDwgbjsKICAgICAgICAgLy8gYXNzdW1lIGRlZmF1bHQgcGFyYW1ldGVycyBmb3IgdGhlIHRyYWNrLCBleGNlcHQgd2hlcmUgbm90ZWQgYmVsb3cKICAgICAgICAgdHJhY2tfdCogdCA9ICZtU3RhdGUudHJhY2tzW25dOwogICAgICAgICB0LT5uZWVkcyA9IDA7Ci0gICAgICAgIHQtPnZvbHVtZVswXSA9IFVOSVRZX0dBSU47Ci0gICAgICAgIHQtPnZvbHVtZVsxXSA9IFVOSVRZX0dBSU47Ci0gICAgICAgIC8vIG5vIGluaXRpYWxpemF0aW9uIG5lZWRlZAotICAgICAgICAvLyB0LT5wcmV2Vm9sdW1lWzBdCi0gICAgICAgIC8vIHQtPnByZXZWb2x1bWVbMV0KKworICAgICAgICAvLyBJbnRlZ2VyIHZvbHVtZS4KKyAgICAgICAgLy8gQ3VycmVudGx5IGludGVnZXIgdm9sdW1lIGlzIGtlcHQgZm9yIHRoZSBsZWdhY3kgaW50ZWdlciBtaXhlci4KKyAgICAgICAgLy8gV2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIGxlZ2FjeSBtaXhlciBwYXRoIGlzIHJlbW92ZWQuCisgICAgICAgIHQtPnZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UOworICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVDsKKyAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UIDw8IDE2OworICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7CiAgICAgICAgIHQtPnZvbHVtZUluY1swXSA9IDA7CiAgICAgICAgIHQtPnZvbHVtZUluY1sxXSA9IDA7CiAgICAgICAgIHQtPmF1eExldmVsID0gMDsKICAgICAgICAgdC0+YXV4SW5jID0gMDsKKyAgICAgICAgdC0+cHJldkF1eExldmVsID0gMDsKKworICAgICAgICAvLyBGbG9hdGluZyBwb2ludCB2b2x1bWUuCisgICAgICAgIHQtPm1Wb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB0LT5tVm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVByZXZWb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB0LT5tUHJldlZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIHQtPm1Wb2x1bWVJbmNbMF0gPSAwLjsKKyAgICAgICAgdC0+bVZvbHVtZUluY1sxXSA9IDAuOworICAgICAgICB0LT5tQXV4TGV2ZWwgPSAwLjsKKyAgICAgICAgdC0+bUF1eEluYyA9IDAuOworICAgICAgICB0LT5tUHJldkF1eExldmVsID0gMC47CisKICAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCi0gICAgICAgIC8vIHQtPnByZXZBdXhMZXZlbAogICAgICAgICAvLyB0LT5mcmFtZUNvdW50Ci0gICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IDI7CisgICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgICAgIHQtPmVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgdC0+Zm9ybWF0ID0gMTY7Ci0gICAgICAgIHQtPmNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICBBTE9HVl9JRihhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAiTm9uLXN0ZXJlbyBjaGFubmVsIG1hc2s6ICVkXG4iLCBjaGFubmVsTWFzayk7CisgICAgICAgIHQtPmNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgICAgIHQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICAgICAgLy8gc2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgQXVkaW9CdWZmZXJQcm92aWRlciAqKSBpcyByZXF1aXJlZCBiZWZvcmUgZW5hYmxlKG5hbWUpCiAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKQEAgLTIxNSw1MiArNDg5LDExNiBAQAogICAgICAgICAvLyBzZXRQYXJhbWV0ZXIobmFtZSwgVFJBQ0ssIE1BSU5fQlVGRkVSLCBtaXhCdWZmZXIpIGlzIHJlcXVpcmVkIGJlZm9yZSBlbmFibGUobmFtZSkKICAgICAgICAgdC0+bWFpbkJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIHQtPmF1eEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHQtPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdFRyYWNrRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuXSwgbiwgY2hhbm5lbE1hc2spOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJBQ0swICsgbjsKKyAgICAgICAgdC0+bU1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHQtPm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIHQtPm1NaXhlckluRm9ybWF0ID0ga1VzZUZsb2F0ICYmIGtVc2VOZXdNaXhlcgorICAgICAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB0LT5tTWl4ZXJDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAorICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tTWl4ZXJDaGFubmVsTWFzayk7CisgICAgICAgIC8vIENoZWNrIHRoZSBkb3dubWl4aW5nIChvciB1cG1peGluZykgcmVxdWlyZW1lbnRzLgorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0VHJhY2tEb3dubWl4KHQsIG4pOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIGludmFsaWQgY2hhbm5lbE1hc2sgKCUjeCkiLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSgweCV4KSBmYWlsZWQsIGVycm9yIHByZXBhcmluZyB0cmFjayBmb3IgZG93bm1peCIsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2spOworICAgICAgICAvLyBpbml0VHJhY2tEb3dubWl4KCkgbWF5IGNoYW5nZSB0aGUgaW5wdXQgZm9ybWF0IHJlcXVpcmVtZW50LgorICAgICAgICAvLyBJZiB5b3UgZGVzaXJlIGZsb2F0aW5nIHBvaW50IGlucHV0IHRvIHRoZSBtaXhlciwgaXQgbWF5IGNoYW5nZQorICAgICAgICAvLyB0byBpbnRlZ2VyIGJlY2F1c2UgdGhlIGRvd25taXhlciByZXF1aXJlcyBpbnRlZ2VyIHRvIHByb2Nlc3MuCisgICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKKyAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodCwgbik7CisgICAgICAgIG1UcmFja05hbWVzIHw9IDEgPDwgbjsKKyAgICAgICAgcmV0dXJuIFRSQUNLMCArIG47CiAgICAgfQorICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUgb3V0IG9mIGF2YWlsYWJsZSB0cmFja3MiKTsKICAgICByZXR1cm4gLTE7CiB9CiAKIHZvaWQgQXVkaW9NaXhlcjo6aW52YWxpZGF0ZVN0YXRlKHVpbnQzMl90IG1hc2spCiB7Ci0gICAgaWYgKG1hc2spIHsKKyAgICBpZiAobWFzayAhPSAwKSB7CiAgICAgICAgIG1TdGF0ZS5uZWVkc0NoYW5nZWQgfD0gbWFzazsKICAgICAgICAgbVN0YXRlLmhvb2sgPSBwcm9jZXNzX192YWxpZGF0ZTsKICAgICB9CiAgfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjppbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTnVtLCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrKQotewotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1hc2spOwotICAgIEFMT0dfQVNTRVJUKChjaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYKSAmJiBjaGFubmVsQ291bnQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotICAgIGlmIChjaGFubmVsQ291bnQgPiBNQVhfTlVNX0NIQU5ORUxTKSB7Ci0gICAgICAgIHBUcmFjay0+Y2hhbm5lbE1hc2sgPSBtYXNrOwotICAgICAgICBwVHJhY2stPmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKLSAgICAgICAgQUxPR1YoImluaXRUcmFja0Rvd25taXgodHJhY2s9JWQsIG1hc2s9MHgleCkgY2FsbHMgcHJlcGFyZVRyYWNrRm9yRG93bm1peCgpIiwKLSAgICAgICAgICAgICAgICB0cmFja051bSwgbWFzayk7Ci0gICAgICAgIHN0YXR1cyA9IHByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja051bSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOdW0pOworLy8gQ2FsbGVkIHdoZW4gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQgZm9yIGEgdHJhY2sgbmFtZQorLy8gVE9ETzogRml4IERvd25taXhidWZmZXJwcm9maWRlciBub3QgdG8gKHBvc3NpYmx5KSBjaGFuZ2UgbWl4ZXIgaW5wdXQgZm9ybWF0LAorLy8gd2hpY2ggd2lsbCBzaW1wbGlmeSB0aGlzIGxvZ2ljLgorYm9vbCBBdWRpb01peGVyOjpzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2ssIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICB0cmFja190ICZ0cmFjayA9IG1TdGF0ZS50cmFja3NbbmFtZV07CisKKyAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSB0cmFjay5jaGFubmVsTWFzaworICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSB0cmFjay5tTWl4ZXJDaGFubmVsTWFzaykgeworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBubyBuZWVkIHRvIGNoYW5nZQogICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOworICAgIC8vIGFsd2F5cyByZWNvbXB1dGUgZm9yIGJvdGggY2hhbm5lbCBtYXNrcyBldmVuIGlmIG9ubHkgb25lIGhhcyBjaGFuZ2VkLgorICAgIGNvbnN0IHVpbnQzMl90IHRyYWNrQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHRyYWNrQ2hhbm5lbE1hc2spOworICAgIGNvbnN0IHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVyQ2hhbm5lbE1hc2spOworICAgIGNvbnN0IGJvb2wgbWl4ZXJDaGFubmVsQ291bnRDaGFuZ2VkID0gdHJhY2subU1peGVyQ2hhbm5lbENvdW50ICE9IG1peGVyQ2hhbm5lbENvdW50OworCisgICAgQUxPR19BU1NFUlQoKHRyYWNrQ2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkKKyAgICAgICAgICAgICYmIHRyYWNrQ2hhbm5lbENvdW50CisgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxDb3VudCk7CisgICAgdHJhY2suY2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrOworICAgIHRyYWNrLmNoYW5uZWxDb3VudCA9IHRyYWNrQ2hhbm5lbENvdW50OworICAgIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKKyAgICB0cmFjay5tTWl4ZXJDaGFubmVsQ291bnQgPSBtaXhlckNoYW5uZWxDb3VudDsKKworICAgIC8vIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkLCBkb2VzIHRoaXMgdHJhY2sgbmVlZCBhIGRvd25taXhlcj8KKyAgICAvLyB1cGRhdGUgdG8gdHJ5IHVzaW5nIG91ciBkZXNpcmVkIGZvcm1hdCAoaWYgd2UgYXJlbid0IGFscmVhZHkgdXNpbmcgaXQpCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcHJldk1peGVySW5Gb3JtYXQgPSB0cmFjay5tTWl4ZXJJbkZvcm1hdDsKKyAgICB0cmFjay5tTWl4ZXJJbkZvcm1hdCA9IGtVc2VGbG9hdCAmJiBrVXNlTmV3TWl4ZXIKKyAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGluaXRUcmFja0Rvd25taXgoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywKKyAgICAgICAgICAgICJpbml0VHJhY2tEb3dubWl4IGVycm9yICVkLCB0cmFjayBjaGFubmVsIG1hc2sgJSN4LCBtaXhlciBjaGFubmVsIG1hc2sgJSN4IiwKKyAgICAgICAgICAgIHN0YXR1cywgdHJhY2suY2hhbm5lbE1hc2ssIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrKTsKKworICAgIGNvbnN0IGJvb2wgbWl4ZXJJbkZvcm1hdENoYW5nZWQgPSBwcmV2TWl4ZXJJbkZvcm1hdCAhPSB0cmFjay5tTWl4ZXJJbkZvcm1hdDsKKyAgICBpZiAobWl4ZXJJbkZvcm1hdENoYW5nZWQpIHsKKyAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJnRyYWNrLCBuYW1lKTsgLy8gYmVjYXVzZSBvZiBkb3dubWl4ZXIsIHRyYWNrIGZvcm1hdCBtYXkgY2hhbmdlIQorICAgIH0KKworICAgIGlmICh0cmFjay5yZXNhbXBsZXIgJiYgKG1peGVySW5Gb3JtYXRDaGFuZ2VkIHx8IG1peGVyQ2hhbm5lbENvdW50Q2hhbmdlZCkpIHsKKyAgICAgICAgLy8gcmVzYW1wbGVyIGlucHV0IGZvcm1hdCBvciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgorICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHRyYWNrLnNhbXBsZVJhdGU7CisgICAgICAgIGRlbGV0ZSB0cmFjay5yZXNhbXBsZXI7CisgICAgICAgIHRyYWNrLnJlc2FtcGxlciA9IE5VTEw7CisgICAgICAgIHRyYWNrLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsgLy8gd2l0aG91dCByZXNhbXBsZXIsIHRyYWNrIHJhdGUgaXMgZGV2aWNlIHNhbXBsZSByYXRlLgorICAgICAgICAvLyByZWNyZWF0ZSB0aGUgcmVzYW1wbGVyIHdpdGggdXBkYXRlZCBmb3JtYXQsIGNoYW5uZWxzLCBzYXZlZCBzYW1wbGVSYXRlLgorICAgICAgICB0cmFjay5zZXRSZXNhbXBsZXIocmVzZXRUb1NhbXBsZVJhdGUgLyp0cmFja1NhbXBsZVJhdGUqLywgbVNhbXBsZVJhdGUgLypkZXZTYW1wbGVSYXRlKi8pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKSB7CitzdGF0dXNfdCBBdWRpb01peGVyOjppbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkKK3sKKyAgICAvLyBPbmx5IHJlbWl4ICh1cG1peCBvciBkb3dubWl4KSBpZiB0aGUgdHJhY2sgYW5kIG1peGVyL2RldmljZSBjaGFubmVsIG1hc2tzCisgICAgLy8gYXJlIG5vdCB0aGUgc2FtZSBhbmQgbm90IGhhbmRsZWQgaW50ZXJuYWxseSwgYXMgbW9ubyAtPiBzdGVyZW8gY3VycmVudGx5IGlzLgorICAgIGlmIChwVHJhY2stPmNoYW5uZWxNYXNrICE9IHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2sKKyAgICAgICAgICAgICYmICEocFRyYWNrLT5jaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCisgICAgICAgICAgICAgICAgICAgICYmIHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgeworICAgICAgICByZXR1cm4gcHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7CisgICAgfQorICAgIC8vIG5vIHJlbWl4IG5lY2Vzc2FyeQorICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUgX191bnVzZWQpIHsKICAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSIsIHRyYWNrTmFtZSk7CiAKICAgICBpZiAocFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CiAgICAgICAgIC8vIHRoaXMgdHJhY2sgaGFkIHByZXZpb3VzbHkgYmVlbiBjb25maWd1cmVkIHdpdGggYSBkb3dubWl4ZXIsIGRlbGV0ZSBpdAogICAgICAgICBBTE9HVigiIGRlbGV0aW5nIG9sZCBkb3dubWl4ZXIiKTsKLSAgICAgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPm1UcmFja0J1ZmZlclByb3ZpZGVyOwogICAgICAgICBkZWxldGUgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKICAgICAgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIiBub3RoaW5nIHRvIGRvLCBubyBkb3dubWl4ZXIgdG8gZGVsZXRlIik7CiAgICAgfQpAQCAtMjcyLDEwMSArNjEwLDY2IEBACiAKICAgICAvLyBkaXNjYXJkIHRoZSBwcmV2aW91cyBkb3dubWl4ZXIgaWYgdGhlcmUgd2FzIG9uZQogICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7CisgICAgaWYgKERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppc011bHRpY2hhbm5lbENhcGFibGUoKSkgeworICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciogcERicCA9IG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihwVHJhY2stPmNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgLyogVE9ETzogdXNlIHBUcmFjay0+bU1peGVySW5Gb3JtYXQsIG5vdyBvbmx5IFBDTSAxNiAqLywKKyAgICAgICAgICAgICAgICBwVHJhY2stPnNhbXBsZVJhdGUsIHBUcmFjay0+c2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOwogCi0gICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIHBEYnAgPSBuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKTsKLSAgICBpbnQzMl90IHN0YXR1czsKLQotICAgIGlmICghaXNNdWx0aWNoYW5uZWxDYXBhYmxlKSB7Ci0gICAgICAgIEFMT0dFKCJwcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSBmYWlsczogbWl4ZXIgZG9lc24ndCBzdXBwb3J0IG11bHRpY2hhbm5lbCBjb250ZW50IiwKLSAgICAgICAgICAgICAgICB0cmFja05hbWUpOwotICAgICAgICBnb3RvIG5vRG93bm1peEZvckFjdGl2ZVRyYWNrOworICAgICAgICBpZiAocERicC0+aXNWYWxpZCgpKSB7IC8vIGlmIGNvbnN0cnVjdG9yIGNvbXBsZXRlZCBwcm9wZXJseQorICAgICAgICAgICAgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBQQ00gMTYgYml0IHJlcXVpcmVkIGZvciBkb3dubWl4CisgICAgICAgICAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcERicDsKKyAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIHBEYnA7CiAgICAgfQogCi0gICAgaWYgKEVmZmVjdENyZWF0ZSgmZHdubUZ4RGVzYy51dWlkLAotICAgICAgICAgICAgcFRyYWNrLT5zZXNzaW9uSWQgLypzZXNzaW9uSWQqLywgLTIgLyppb0lkIG5vdCByZWxldmFudCBoZXJlLCB1c2luZyByYW5kb20gdmFsdWUqLywKLSAgICAgICAgICAgICZwRGJwLT5tRG93bm1peEhhbmRsZS8qcEhhbmRsZSovKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJwcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSBmYWlsczogZXJyb3IgY3JlYXRpbmcgZG93bm1peGVyIGVmZmVjdCIsIHRyYWNrTmFtZSk7Ci0gICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7Ci0gICAgfQotCi0gICAgLy8gY2hhbm5lbCBpbnB1dCBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBwZXItdHJhY2sKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IHBUcmFjay0+Y2hhbm5lbE1hc2s7Ci0gICAgcERicC0+bURvd25taXhDb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBwVHJhY2stPnNhbXBsZVJhdGU7Ci0gICAgcERicC0+bURvd25taXhDb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBUcmFjay0+c2FtcGxlUmF0ZTsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOwotICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIHByb3ZpZGVyLCBhbmQgZnJhbWUgY291bnQgd2lsbCBub3QgYmUgdXNlZCBhcyB0aGUgZG93bm1peCBlZmZlY3QKLSAgICAvLyBwcm9jZXNzKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGRpcmVjdGx5IChzZWUgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoKSkKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfAotICAgICAgICAgICAgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5tYXNrID0gcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcubWFzazsKLQotICAgIHsvLyBzY29wZSBmb3IgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCB1c2VkIGluIGdvdG8gbGFiZWwgIm5vRG93bm1peEZvckFjdGl2ZVRyYWNrIgotICAgICAgICBpbnQgY21kU3RhdHVzOwotICAgICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YoaW50KTsKLQotICAgICAgICAvLyBDb25maWd1cmUgYW5kIGVuYWJsZSBkb3dubWl4ZXIKLSAgICAgICAgc3RhdHVzID0gKCpwRGJwLT5tRG93bm1peEhhbmRsZSktPmNvbW1hbmQocERicC0+bURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHIC8qY21kQ29kZSovLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSAvKmNtZFNpemUqLywKLSAgICAgICAgICAgICAgICAmcERicC0+bURvd25taXhDb25maWcgLypwQ21kRGF0YSovLAotICAgICAgICAgICAgICAgICZyZXBseVNpemUgLypyZXBseVNpemUqLywgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0gICAgICAgIGlmICgoc3RhdHVzICE9IDApIHx8IChjbWRTdGF0dXMgIT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciAlZCB3aGlsZSBjb25maWd1cmluZyBkb3dubWl4ZXIgZm9yIHRyYWNrICVkIiwgc3RhdHVzLCB0cmFja05hbWUpOwotICAgICAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKLSAgICAgICAgfQotICAgICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgc3RhdHVzID0gKCpwRGJwLT5tRG93bm1peEhhbmRsZSktPmNvbW1hbmQocERicC0+bURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9FTkFCTEUgLypjbWRDb2RlKi8sIDAgLypjbWRTaXplKi8sIE5VTEwgLypwQ21kRGF0YSovLAotICAgICAgICAgICAgICAgICZyZXBseVNpemUgLypyZXBseVNpemUqLywgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0gICAgICAgIGlmICgoc3RhdHVzICE9IDApIHx8IChjbWRTdGF0dXMgIT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciAlZCB3aGlsZSBlbmFibGluZyBkb3dubWl4ZXIgZm9yIHRyYWNrICVkIiwgc3RhdHVzLCB0cmFja05hbWUpOwotICAgICAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBkb3dubWl4IHR5cGUKLSAgICAgICAgLy8gcGFyYW1ldGVyIHNpemUgcm91bmRlZCBmb3IgcGFkZGluZyBvbiAzMmJpdCBib3VuZGFyeQotICAgICAgICBjb25zdCBpbnQgcHNpemVQYWRkZWQgPSAoKHNpemVvZihkb3dubWl4X3BhcmFtc190KSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKLSAgICAgICAgY29uc3QgaW50IGRvd25taXhQYXJhbVNpemUgPQotICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwc2l6ZVBhZGRlZCArIHNpemVvZihkb3dubWl4X3R5cGVfdCk7Ci0gICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKGRvd25taXhQYXJhbVNpemUpOwotICAgICAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoZG93bm1peF9wYXJhbXNfdCk7Ci0gICAgICAgIGNvbnN0IGRvd25taXhfcGFyYW1zX3QgZG93bm1peFBhcmFtID0gRE9XTk1JWF9QQVJBTV9UWVBFOwotICAgICAgICBtZW1jcHkocGFyYW0tPmRhdGEsICZkb3dubWl4UGFyYW0sIHBhcmFtLT5wc2l6ZSk7Ci0gICAgICAgIGNvbnN0IGRvd25taXhfdHlwZV90IGRvd25taXhUeXBlID0gRE9XTk1JWF9UWVBFX0ZPTEQ7Ci0gICAgICAgIHBhcmFtLT52c2l6ZSA9IHNpemVvZihkb3dubWl4X3R5cGVfdCk7Ci0gICAgICAgIG1lbWNweShwYXJhbS0+ZGF0YSArIHBzaXplUGFkZGVkLCAmZG93bm1peFR5cGUsIHBhcmFtLT52c2l6ZSk7Ci0KLSAgICAgICAgc3RhdHVzID0gKCpwRGJwLT5tRG93bm1peEhhbmRsZSktPmNvbW1hbmQocERicC0+bURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0gLyogY21kQ29kZSAqLywgZG93bm1peFBhcmFtU2l6ZS8qIGNtZFNpemUgKi8sCi0gICAgICAgICAgICAgICAgcGFyYW0gLypwQ21uZERhdGEqLywgJnJlcGx5U2l6ZSAvKnJlcGx5U2l6ZSovLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKLQotICAgICAgICBmcmVlKHBhcmFtKTsKLQotICAgICAgICBpZiAoKHN0YXR1cyAhPSAwKSB8fCAoY21kU3RhdHVzICE9IDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgd2hpbGUgc2V0dGluZyBkb3dubWl4IHR5cGUgZm9yIHRyYWNrICVkIiwgc3RhdHVzLCB0cmFja05hbWUpOwotICAgICAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJkb3dubWl4IHR5cGUgc2V0IHRvICVkIGZvciB0cmFjayAlZCIsIChpbnQpIGRvd25taXhUeXBlLCB0cmFja05hbWUpOwotICAgICAgICB9Ci0gICAgfS8vIGVuZCBvZiBzY29wZSBmb3IgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCB1c2VkIGluIGdvdG8gbGFiZWwgIm5vRG93bm1peEZvckFjdGl2ZVRyYWNrIgotCi0gICAgLy8gaW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bDoKLSAgICAvLyAtIGtlZXAgdHJhY2sgb2YgdGhlIHJlYWwgYnVmZmVyIHByb3ZpZGVyIGluIGNhc2UgaXQgd2FzIHNldCBiZWZvcmUKLSAgICBwRGJwLT5tVHJhY2tCdWZmZXJQcm92aWRlciA9IHBUcmFjay0+YnVmZmVyUHJvdmlkZXI7Ci0gICAgLy8gLSB3ZSdsbCB1c2UgdGhlIGRvd25taXggZWZmZWN0IGludGVncmF0ZWQgaW5zaWRlIHRoaXMKLSAgICAvLyAgICB0cmFjaydzIGJ1ZmZlciBwcm92aWRlciwgYW5kIHdlJ2xsIHVzZSBpdCBhcyB0aGUgdHJhY2sncyBidWZmZXIgcHJvdmlkZXIKLSAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcERicDsKLSAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcERicDsKLQorICAgIC8vIEVmZmVjdCBkb3dubWl4ZXIgZG9lcyBub3QgYWNjZXB0IHRoZSBjaGFubmVsIGNvbnZlcnNpb24uICBMZXQncyB1c2Ugb3VyIHJlbWl4ZXIuCisgICAgUmVtaXhCdWZmZXJQcm92aWRlciogcFJicCA9IG5ldyBSZW1peEJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+Y2hhbm5lbE1hc2ssCisgICAgICAgICAgICBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrLCBwVHJhY2stPm1NaXhlckluRm9ybWF0LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOworICAgIC8vIFJlbWl4IGFsd2F5cyBmaW5kcyBhIGNvbnZlcnNpb24gd2hlcmVhcyBEb3dubWl4ZXIgZWZmZWN0IGFib3ZlIG1heSBmYWlsLgorICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBwUmJwOworICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCi1ub0Rvd25taXhGb3JBY3RpdmVUcmFjazoKLSAgICBkZWxldGUgcERicDsKLSAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICByZXR1cm4gTk9fSU5JVDsKK3ZvaWQgQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUgX191bnVzZWQpIHsKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCglZCkiLCB0cmFja05hbWUpOworICAgIGlmIChwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6cHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKQoreworICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCglZCkgd2l0aCBmb3JtYXQgJSN4IiwgdHJhY2tOYW1lLCBwVHJhY2stPm1Gb3JtYXQpOworICAgIC8vIGRpc2NhcmQgdGhlIHByZXZpb3VzIHJlZm9ybWF0dGVyIGlmIHRoZXJlIHdhcyBvbmUKKyAgICB1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHBUcmFjaywgdHJhY2tOYW1lKTsKKyAgICAvLyBvbmx5IGNvbmZpZ3VyZSByZWZvcm1hdHRlciBpZiBuZWVkZWQKKyAgICBpZiAocFRyYWNrLT5tRm9ybWF0ICE9IHBUcmFjay0+bU1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IG5ldyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwVHJhY2stPmNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBwVHJhY2stPm1Gb3JtYXQsIHBUcmFjay0+bU1peGVySW5Gb3JtYXQsCisgICAgICAgICAgICAgICAga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHRyYWNrX3QqIHBUcmFjaykKK3sKKyAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlcjsKKyAgICBpZiAocFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcikgeworICAgICAgICBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihwVHJhY2stPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgfQorICAgIGlmIChwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyKSB7CisgICAgICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+YnVmZmVyUHJvdmlkZXIpOworICAgICAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9NaXhlcjo6ZGVsZXRlVHJhY2tOYW1lKGludCBuYW1lKQpAQCAtMzg1LDYgKzY4OCw4IEBACiAgICAgdHJhY2sucmVzYW1wbGVyID0gTlVMTDsKICAgICAvLyBkZWxldGUgdGhlIGRvd25taXhlcgogICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSk7CisgICAgLy8gZGVsZXRlIHRoZSByZWZvcm1hdHRlcgorICAgIHVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOwogCiAgICAgbVRyYWNrTmFtZXMgJj0gfigxPDxuYW1lKTsKIH0KQEAgLTQxNSwyOSArNzIwLDkxIEBACiAgICAgfQogfQogCisvKiBTZXRzIHRoZSB2b2x1bWUgcmFtcCB2YXJpYWJsZXMgZm9yIHRoZSBBdWRpb01peGVyLgorICoKKyAqIFRoZSB2b2x1bWUgcmFtcCB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gdHJhbnNpdGlvbiBmcm9tIHRoZSBwcmV2aW91cworICogdm9sdW1lIHRvIHRoZSBzZXQgdm9sdW1lLiAgcmFtcCBjb250cm9scyB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uCisgKiBJdHMgdmFsdWUgaXMgdHlwaWNhbGx5IG9uZSBzdGF0ZSBmcmFtZWNvdW50IHBlcmlvZCwgYnV0IG1heSBhbHNvIGJlIDAsCisgKiBtZWFuaW5nICJpbW1lZGlhdGUuIgorICoKKyAqIEZJWE1FOiAxKSBWb2x1bWUgcmFtcCBpcyBlbmFibGVkIG9ubHkgaWYgdGhlcmUgaXMgYSBub256ZXJvIGludGVnZXIgaW5jcmVtZW50CisgKiBldmVuIGlmIHRoZXJlIGlzIGEgbm9uemVybyBmbG9hdGluZyBwb2ludCBpbmNyZW1lbnQgKGluIHRoYXQgY2FzZSwgdGhlIHZvbHVtZQorICogY2hhbmdlIGlzIGltbWVkaWF0ZSkuICBUaGlzIHJlc3RyaWN0aW9uIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4gdGhlIGxlZ2FjeSBtaXhlcgorICogaXMgcmVtb3ZlZCAoc2VlICMyKS4KKyAqIEZJWE1FOiAyKSBJbnRlZ2VyIHZvbHVtZSB2YXJpYWJsZXMgYXJlIHVzZWQgZm9yIExlZ2FjeSBtaXhpbmcgYW5kIHNob3VsZCBiZSByZW1vdmVkCisgKiB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQHBhcmFtIG5ld1ZvbHVtZSBzZXQgdm9sdW1lIHRhcmdldCBpbiBmbG9hdGluZyBwb2ludCBbMC4wLCAxLjBdLgorICogQHBhcmFtIHJhbXAgbnVtYmVyIG9mIGZyYW1lcyB0byBpbmNyZW1lbnQgb3Zlci4gaWYgcmFtcCBpcyAwLCB0aGUgdm9sdW1lCisgKiBzaG91bGQgYmUgc2V0IGltbWVkaWF0ZWx5LiAgQ3VycmVudGx5IHJhbXAgc2hvdWxkIG5vdCBleGNlZWQgNjU1MzUgKGZyYW1lcykuCisgKiBAcGFyYW0gcEludFNldFZvbHVtZSBwb2ludGVyIHRvIHRoZSBVNC4xMiBpbnRlZ2VyIHRhcmdldCB2b2x1bWUsIHNldCBvbiByZXR1cm4uCisgKiBAcGFyYW0gcEludFByZXZWb2x1bWUgcG9pbnRlciB0byB0aGUgVTQuMjggaW50ZWdlciBwcmV2aW91cyB2b2x1bWUsIHNldCBvbiByZXR1cm4uCisgKiBAcGFyYW0gcEludFZvbHVtZUluYyBwb2ludGVyIHRvIHRoZSBVNC4yOCBpbmNyZW1lbnQgcGVyIG91dHB1dCBhdWRpbyBmcmFtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwU2V0Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIGZsb2F0IHRhcmdldCB2b2x1bWUsIHNldCBvbiByZXR1cm4uCisgKiBAcGFyYW0gcFByZXZWb2x1bWUgcG9pbnRlciB0byB0aGUgZmxvYXQgcHJldmlvdXMgdm9sdW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBWb2x1bWVJbmMgcG9pbnRlciB0byB0aGUgZmxvYXQgaW5jcmVtZW50IHBlciBvdXRwdXQgYXVkaW8gZnJhbWUsIHNldCBvbiByZXR1cm4uCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZvbHVtZSBoYXMgY2hhbmdlZCwgZmFsc2UgaWYgdm9sdW1lIGlzIHNhbWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBzZXRWb2x1bWVSYW1wVmFyaWFibGVzKGZsb2F0IG5ld1ZvbHVtZSwgaW50MzJfdCByYW1wLAorICAgICAgICBpbnQxNl90ICpwSW50U2V0Vm9sdW1lLCBpbnQzMl90ICpwSW50UHJldlZvbHVtZSwgaW50MzJfdCAqcEludFZvbHVtZUluYywKKyAgICAgICAgZmxvYXQgKnBTZXRWb2x1bWUsIGZsb2F0ICpwUHJldlZvbHVtZSwgZmxvYXQgKnBWb2x1bWVJbmMpIHsKKyAgICBpZiAobmV3Vm9sdW1lID09ICpwU2V0Vm9sdW1lKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLyogc2V0IHRoZSBmbG9hdGluZyBwb2ludCB2b2x1bWUgdmFyaWFibGVzICovCisgICAgaWYgKHJhbXAgIT0gMCkgeworICAgICAgICAqcFZvbHVtZUluYyA9IChuZXdWb2x1bWUgLSAqcFNldFZvbHVtZSkgLyByYW1wOworICAgICAgICAqcFByZXZWb2x1bWUgPSAqcFNldFZvbHVtZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqcFZvbHVtZUluYyA9IDA7CisgICAgICAgICpwUHJldlZvbHVtZSA9IG5ld1ZvbHVtZTsKKyAgICB9CisgICAgKnBTZXRWb2x1bWUgPSBuZXdWb2x1bWU7CisKKyAgICAvKiBzZXQgdGhlIGxlZ2FjeSBpbnRlZ2VyIHZvbHVtZSB2YXJpYWJsZXMgKi8KKyAgICBpbnQzMl90IGludFZvbHVtZSA9IG5ld1ZvbHVtZSAqIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UOworICAgIGlmIChpbnRWb2x1bWUgPiBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVCkgeworICAgICAgICBpbnRWb2x1bWUgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVDsKKyAgICB9IGVsc2UgaWYgKGludFZvbHVtZSA8IDApIHsKKyAgICAgICAgQUxPR0UoIm5lZ2F0aXZlIHZvbHVtZSAlLjdnIiwgbmV3Vm9sdW1lKTsKKyAgICAgICAgaW50Vm9sdW1lID0gMDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZvciBzYWZldHkgY2hlY2suCisgICAgfQorICAgIGlmIChpbnRWb2x1bWUgPT0gKnBJbnRTZXRWb2x1bWUpIHsKKyAgICAgICAgKnBJbnRWb2x1bWVJbmMgPSAwOworICAgICAgICAvKiBUT0RPOiBpbnRlZ2VyL2Zsb2F0IHdvcmthcm91bmQ6IGlnbm9yZSBmbG9hdGluZyB2b2x1bWUgcmFtcCAqLworICAgICAgICAqcFZvbHVtZUluYyA9IDA7CisgICAgICAgICpwUHJldlZvbHVtZSA9IG5ld1ZvbHVtZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChyYW1wICE9IDApIHsKKyAgICAgICAgKnBJbnRWb2x1bWVJbmMgPSAoKGludFZvbHVtZSAtICpwSW50U2V0Vm9sdW1lKSA8PCAxNikgLyByYW1wOworICAgICAgICAqcEludFByZXZWb2x1bWUgPSAoKnBJbnRWb2x1bWVJbmMgPT0gMCA/IGludFZvbHVtZSA6ICpwSW50U2V0Vm9sdW1lKSA8PCAxNjsKKyAgICB9IGVsc2UgeworICAgICAgICAqcEludFZvbHVtZUluYyA9IDA7CisgICAgICAgICpwSW50UHJldlZvbHVtZSA9IGludFZvbHVtZSA8PCAxNjsKKyAgICB9CisgICAgKnBJbnRTZXRWb2x1bWUgPSBpbnRWb2x1bWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgQXVkaW9NaXhlcjo6c2V0UGFyYW1ldGVyKGludCBuYW1lLCBpbnQgdGFyZ2V0LCBpbnQgcGFyYW0sIHZvaWQgKnZhbHVlKQogewogICAgIG5hbWUgLT0gVFJBQ0swOwogICAgIEFMT0dfQVNTRVJUKHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MsICJiYWQgdHJhY2sgbmFtZSAlZCIsIG5hbWUpOwogICAgIHRyYWNrX3QmIHRyYWNrID0gbVN0YXRlLnRyYWNrc1tuYW1lXTsKIAotICAgIGludCB2YWx1ZUludCA9IChpbnQpdmFsdWU7Ci0gICAgaW50MzJfdCAqdmFsdWVCdWYgPSAoaW50MzJfdCAqKXZhbHVlOworICAgIGludCB2YWx1ZUludCA9IHN0YXRpY19jYXN0PGludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHZhbHVlKSk7CisgICAgaW50MzJfdCAqdmFsdWVCdWYgPSByZWludGVycHJldF9jYXN0PGludDMyX3QqPih2YWx1ZSk7CiAKICAgICBzd2l0Y2ggKHRhcmdldCkgewogCiAgICAgY2FzZSBUUkFDSzoKICAgICAgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIENIQU5ORUxfTUFTSzogewotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgdmFsdWU7Ci0gICAgICAgICAgICBpZiAodHJhY2suY2hhbm5lbE1hc2sgIT0gbWFzaykgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1hc2spOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKChjaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYKSAmJiBjaGFubmVsQ291bnQpOwotICAgICAgICAgICAgICAgIHRyYWNrLmNoYW5uZWxNYXNrID0gbWFzazsKLSAgICAgICAgICAgICAgICB0cmFjay5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIG1hc2sgaGFzIGNoYW5nZWQsIGRvZXMgdGhpcyB0cmFjayBuZWVkIGEgZG93bm1peGVyPwotICAgICAgICAgICAgICAgIGluaXRUcmFja0Rvd25taXgoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUsIG1hc2spOwotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgbWFzayk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLCB0cmFjay5tTWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX01BU0ssICV4KSIsIHRyYWNrQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKQEAgLTQ1NSwxNSArODIyLDM3IEBACiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT1JNQVQ6Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCh2YWx1ZUludCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGT1JNQVQ6IHsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90Pih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAodHJhY2subUZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksICJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHRyYWNrLm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgRk9STUFULCAlI3gpIiwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCgmdHJhY2ssIG5hbWUpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgLy8gRklYTUUgZG8gd2Ugd2FudCB0byBzdXBwb3J0IHNldHRpbmcgdGhlIGRvd25taXggdHlwZSBmcm9tIEF1ZGlvRmxpbmdlcj8KICAgICAgICAgLy8gICAgICAgICBmb3IgYSBzcGVjaWZpYyB0cmFjaz8gb3IgcGVyIG1peGVyPwogICAgICAgICAvKiBjYXNlIERPV05NSVhfVFlQRToKICAgICAgICAgICAgIGJyZWFrICAgICAgICAgICovCisgICAgICAgIGNhc2UgTUlYRVJfRk9STUFUOiB7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLm1NaXhlckZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICB0cmFjay5tTWl4ZXJGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUlYRVJfRk9STUFULCAlI3gpIiwgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTUlYRVJfQ0hBTk5FTF9NQVNLOiB7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2suY2hhbm5lbE1hc2ssIG1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUlYRVJfQ0hBTk5FTF9NQVNLLCAlI3gpIiwgbWl4ZXJDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgcGFyYW0iKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB0cmFjazogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCkBAIC00ODgsODUgKzg3Nyw3NyBAQAogICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgiYmFkIHBhcmFtIik7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgcmVzYW1wbGU6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgUkFNUF9WT0xVTUU6CiAgICAgY2FzZSBWT0xVTUU6CiAgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICAgICAgY2FzZSBWT0xVTUUwOgotICAgICAgICBjYXNlIFZPTFVNRTE6Ci0gICAgICAgICAgICBpZiAodHJhY2sudm9sdW1lW3BhcmFtLVZPTFVNRTBdICE9IHZhbHVlSW50KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihWT0xVTUUsIFZPTFVNRTAvMTogJTA0eCkiLCB2YWx1ZUludCk7Ci0gICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtwYXJhbS1WT0xVTUUwXSA9IHRyYWNrLnZvbHVtZVtwYXJhbS1WT0xVTUUwXSA8PCAxNjsKLSAgICAgICAgICAgICAgICB0cmFjay52b2x1bWVbcGFyYW0tVk9MVU1FMF0gPSB2YWx1ZUludDsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IFZPTFVNRSkgewotICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2Vm9sdW1lW3BhcmFtLVZPTFVNRTBdID0gdmFsdWVJbnQgPDwgMTY7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZUluY1twYXJhbS1WT0xVTUUwXSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkID0gKHZhbHVlSW50PDwxNikgLSB0cmFjay5wcmV2Vm9sdW1lW3BhcmFtLVZPTFVNRTBdOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZvbEluYyA9IGQgLyBpbnQzMl90KG1TdGF0ZS5mcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lSW5jW3BhcmFtLVZPTFVNRTBdID0gdm9sSW5jOwotICAgICAgICAgICAgICAgICAgICBpZiAodm9sSW5jID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbcGFyYW0tVk9MVU1FMF0gPSB2YWx1ZUludCA8PCAxNjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVWExFVkVMOgotICAgICAgICAgICAgLy9BTE9HX0FTU0VSVCgwIDw9IHZhbHVlSW50ICYmIHZhbHVlSW50IDw9IE1BWF9HQUlOX0lOVCwgImJhZCBhdXggbGV2ZWwgJWQiLCB2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAodHJhY2suYXV4TGV2ZWwgIT0gdmFsdWVJbnQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFZPTFVNRSwgQVVYTEVWRUw6ICUwNHgpIiwgdmFsdWVJbnQpOwotICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHRyYWNrLmF1eExldmVsIDw8IDE2OwotICAgICAgICAgICAgICAgIHRyYWNrLmF1eExldmVsID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBWT0xVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2sucHJldkF1eExldmVsID0gdmFsdWVJbnQgPDwgMTY7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLmF1eEluYyA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkID0gKHZhbHVlSW50PDwxNikgLSB0cmFjay5wcmV2QXV4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgdm9sSW5jID0gZCAvIGludDMyX3QobVN0YXRlLmZyYW1lQ291bnQpOwotICAgICAgICAgICAgICAgICAgICB0cmFjay5hdXhJbmMgPSB2b2xJbmM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2xJbmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sucHJldkF1eExldmVsID0gdmFsdWVJbnQgPDwgMTY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0Vm9sdW1lUmFtcFZhcmlhYmxlcygqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFJBTVBfVk9MVU1FID8gbVN0YXRlLmZyYW1lQ291bnQgOiAwLAorICAgICAgICAgICAgICAgICAgICAmdHJhY2suYXV4TGV2ZWwsICZ0cmFjay5wcmV2QXV4TGV2ZWwsICZ0cmFjay5hdXhJbmMsCisgICAgICAgICAgICAgICAgICAgICZ0cmFjay5tQXV4TGV2ZWwsICZ0cmFjay5tUHJldkF1eExldmVsLCAmdHJhY2subUF1eEluYykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKCVzLCBBVVhMRVZFTDogJTA0eCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFZPTFVNRSA/ICJWT0xVTUUiIDogIlJBTVBfVk9MVU1FIiwgdHJhY2suYXV4TGV2ZWwpOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBwYXJhbSIpOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClwYXJhbSA+PSBWT0xVTUUwICYmICh1bnNpZ25lZClwYXJhbSA8IFZPTFVNRTAgKyBNQVhfTlVNX1ZPTFVNRVMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0Vm9sdW1lUmFtcFZhcmlhYmxlcygqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1TdGF0ZS5mcmFtZUNvdW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay52b2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwgJnRyYWNrLnByZXZWb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay52b2x1bWVJbmNbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay5tVm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sICZ0cmFjay5tUHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLm1Wb2x1bWVJbmNbcGFyYW0gLSBWT0xVTUUwXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlciglcywgVk9MVU1FJWQ6ICUwNHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gVk9MVU1FID8gIlZPTFVNRSIgOiAiUkFNUF9WT0xVTUUiLCBwYXJhbSAtIFZPTFVNRTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay52b2x1bWVbcGFyYW0gLSBWT0xVTUUwXSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHZvbHVtZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0ZBVEFMKCJiYWQgdGFyZ2V0Iik7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlcjogYmFkIHRhcmdldCAlZCIsIHRhcmdldCk7CiAgICAgfQogfQogCi1ib29sIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnNldFJlc2FtcGxlcih1aW50MzJfdCB2YWx1ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSkKK2Jvb2wgQXVkaW9NaXhlcjo6dHJhY2tfdDo6c2V0UmVzYW1wbGVyKHVpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSkKIHsKLSAgICBpZiAodmFsdWUgIT0gZGV2U2FtcGxlUmF0ZSB8fCByZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSB2YWx1ZSkgewotICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IHZhbHVlOworICAgIGlmICh0cmFja1NhbXBsZVJhdGUgIT0gZGV2U2FtcGxlUmF0ZSB8fCByZXNhbXBsZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSB0cmFja1NhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSB0cmFja1NhbXBsZVJhdGU7CiAgICAgICAgICAgICBpZiAocmVzYW1wbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRpbmcgcmVzYW1wbGVyIGZyb20gdHJhY2sgJWQgSHogdG8gZGV2aWNlICVkIEh6IiwgdmFsdWUsIGRldlNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJDcmVhdGluZyByZXNhbXBsZXIgZnJvbSB0cmFjayAlZCBIeiB0byBkZXZpY2UgJWQgSHoiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tTYW1wbGVSYXRlLCBkZXZTYW1wbGVSYXRlKTsKICAgICAgICAgICAgICAgICBBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eTsKICAgICAgICAgICAgICAgICAvLyBmb3JjZSBsb3dlc3QgcXVhbGl0eSBsZXZlbCByZXNhbXBsZXIgaWYgdXNlIGNhc2UgaXNuJ3QgbXVzaWMgb3IgdmlkZW8KICAgICAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGlzIGZsYXdlZCBmb3IgZHluYW1pYyBzYW1wbGUgcmF0ZXMsIGFzIHdlIGNob29zZSB0aGUgcmVzYW1wbGVyCiAgICAgICAgICAgICAgICAgLy8gcXVhbGl0eSBsZXZlbCBiYXNlZCBvbiB0aGUgaW5pdGlhbCByYXRpbywgYnV0IHRoYXQgY291bGQgY2hhbmdlIGxhdGVyLgogICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXZlIGEgd2F5IHRvIGRpc3Rpbmd1aXNoIHRyYWNrcyB3aXRoIHN0YXRpYyByYXRpb3MgdnMuIGR5bmFtaWMgcmF0aW9zLgotICAgICAgICAgICAgICAgIGlmICghKCh2YWx1ZSA9PSA0NDEwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ4MDAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PSA0ODAwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ0MTAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWTsKKyAgICAgICAgICAgICAgICBpZiAoISgodHJhY2tTYW1wbGVSYXRlID09IDQ0MTAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDgwMDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgKHRyYWNrU2FtcGxlUmF0ZSA9PSA0ODAwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ0MTAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpERUZBVUxUX1FVQUxJVFk7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIE1PTk9fSEFDSy4gUmVzYW1wbGVyIHNlZXMgI2NoYW5uZWxzIGFmdGVyIHRoZSBkb3dubWl4ZXIKKyAgICAgICAgICAgICAgICAvLyBidXQgaWYgbm9uZSBleGlzdHMsIGl0IGlzIHRoZSBjaGFubmVsIGNvdW50ICgxIGZvciBtb25vKS4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmVzYW1wbGVyQ2hhbm5lbENvdW50ID0gZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgPyBtTWl4ZXJDaGFubmVsQ291bnQgOiBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgQUxPR1ZWKCJDcmVhdGluZyByZXNhbXBsZXI6IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3JtYXQoJSN4KSBjaGFubmVscyglZCkgZGV2U2FtcGxlUmF0ZSgldSkgcXVhbGl0eSglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwgcmVzYW1wbGVyQ2hhbm5lbENvdW50LCBkZXZTYW1wbGVSYXRlLCBxdWFsaXR5KTsKICAgICAgICAgICAgICAgICByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc2FtcGxlciBzZWVzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYWZ0ZXIgdGhlIGRvd25taXhlciwgaWYgYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMID8gTUFYX05VTV9DSEFOTkVMUyA6IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyQ2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2U2FtcGxlUmF0ZSwgcXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRMb2NhbFRpbWVGcmVxKHNMb2NhbFRpbWVGcmVxKTsKICAgICAgICAgICAgIH0KQEAgLTU3NiwyMSArOTU3LDU3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1pbmxpbmUKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6YWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCkKKy8qIENoZWNrcyB0byBzZWUgaWYgdGhlIHZvbHVtZSByYW1wIGhhcyBjb21wbGV0ZWQgYW5kIGNsZWFycyB0aGUgaW5jcmVtZW50CisgKiB2YXJpYWJsZXMgYXBwcm9wcmlhdGVseS4KKyAqCisgKiBGSVhNRTogVGhlcmUgaXMgY29kZSB0byBoYW5kbGUgaW50L2Zsb2F0IHJhbXAgdmFyaWFibGUgc3dpdGNob3ZlciBzaG91bGQgaXQgbm90CisgKiBjb21wbGV0ZSB3aXRoaW4gYSBtaXhlciBidWZmZXIgcHJvY2Vzc2luZyBjYWxsLCBidXQgaXQgaXMgcHJlZmVycmVkIHRvIGF2b2lkIHN3aXRjaG92ZXIKKyAqIGR1ZSB0byBwcmVjaXNpb24gaXNzdWVzLiAgVGhlIHN3aXRjaG92ZXIgY29kZSBpcyBpbmNsdWRlZCBmb3IgbGVnYWN5IGNvZGUgcHVycG9zZXMKKyAqIGFuZCBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBpbnRlZ2VyIHZvbHVtZSBpcyByZW1vdmVkLgorICoKKyAqIEl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGNsZWFyIG9ubHkgdGhlIHZvbHVtZUluYyBpbnRlZ2VyIHZhcmlhYmxlIGJlY2F1c2UKKyAqIGlmIG9uZSBjaGFubmVsIHJlcXVpcmVzIHJhbXBpbmcsIGFsbCBjaGFubmVscyBhcmUgcmFtcGVkLgorICoKKyAqIFRoZXJlIGlzIGEgYml0IG9mIGR1cGxpY2F0ZWQgY29kZSBoZXJlLCBidXQgaXQga2VlcHMgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqLworaW5saW5lIHZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6YWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCwgYm9vbCB1c2VGbG9hdCkKIHsKLSAgICBmb3IgKHVpbnQzMl90IGk9MCA7IGk8TUFYX05VTV9DSEFOTkVMUyA7IGkrKykgewotICAgICAgICBpZiAoKCh2b2x1bWVJbmNbaV0+MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPj0gdm9sdW1lW2ldKSkgfHwKLSAgICAgICAgICAgICgodm9sdW1lSW5jW2ldPDApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpIDw9IHZvbHVtZVtpXSkpKSB7Ci0gICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOwotICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHZvbHVtZVtpXTw8MTY7CisgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1ZPTFVNRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1Wb2x1bWVJbmNbaV0gIT0gMCAmJiBmYWJzKG1Wb2x1bWVbaV0gLSBtUHJldlZvbHVtZVtpXSkgPD0gZmFicyhtVm9sdW1lSW5jW2ldKSkgeworICAgICAgICAgICAgICAgIHZvbHVtZUluY1tpXSA9IDA7CisgICAgICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHZvbHVtZVtpXSA8PCAxNjsKKyAgICAgICAgICAgICAgICBtVm9sdW1lSW5jW2ldID0gMC47CisgICAgICAgICAgICAgICAgbVByZXZWb2x1bWVbaV0gPSBtVm9sdW1lW2ldOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJyYW1wOiAlZiAlZiAlZiIsIG1Wb2x1bWVbaV0sIG1QcmV2Vm9sdW1lW2ldLCBtVm9sdW1lSW5jW2ldKTsKKyAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdTRfMjhfZnJvbV9mbG9hdChtUHJldlZvbHVtZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTUFYX05VTV9WT0xVTUVTOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKHZvbHVtZUluY1tpXT4wKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA+PSB2b2x1bWVbaV0pKSB8fAorICAgICAgICAgICAgICAgICAgICAoKHZvbHVtZUluY1tpXTwwKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA8PSB2b2x1bWVbaV0pKSkgeworICAgICAgICAgICAgICAgIHZvbHVtZUluY1tpXSA9IDA7CisgICAgICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHZvbHVtZVtpXSA8PCAxNjsKKyAgICAgICAgICAgICAgICBtVm9sdW1lSW5jW2ldID0gMC47CisgICAgICAgICAgICAgICAgbVByZXZWb2x1bWVbaV0gPSBtVm9sdW1lW2ldOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJyYW1wOiAlZCAlZCAlZCIsIHZvbHVtZVtpXSA8PCAxNiwgcHJldlZvbHVtZVtpXSwgdm9sdW1lSW5jW2ldKTsKKyAgICAgICAgICAgICAgICBtUHJldlZvbHVtZVtpXSAgPSBmbG9hdF9mcm9tX3U0XzI4KHByZXZWb2x1bWVbaV0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIC8qIFRPRE86IGF1eCBpcyBhbHdheXMgaW50ZWdlciByZWdhcmRsZXNzIG9mIG91dHB1dCBidWZmZXIgdHlwZSAqLwogICAgIGlmIChhdXgpIHsKICAgICAgICAgaWYgKCgoYXV4SW5jPjApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPj0gYXV4TGV2ZWwpKSB8fAotICAgICAgICAgICAgKChhdXhJbmM8MCkgJiYgKCgocHJldkF1eExldmVsK2F1eEluYyk+PjE2KSA8PSBhdXhMZXZlbCkpKSB7CisgICAgICAgICAgICAgICAgKChhdXhJbmM8MCkgJiYgKCgocHJldkF1eExldmVsK2F1eEluYyk+PjE2KSA8PSBhdXhMZXZlbCkpKSB7CiAgICAgICAgICAgICBhdXhJbmMgPSAwOwotICAgICAgICAgICAgcHJldkF1eExldmVsID0gYXV4TGV2ZWw8PDE2OworICAgICAgICAgICAgcHJldkF1eExldmVsID0gYXV4TGV2ZWwgPDwgMTY7CisgICAgICAgICAgICBtQXV4SW5jID0gMC47CisgICAgICAgICAgICBtUHJldkF1eExldmVsID0gbUF1eExldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9BTE9HVigiYXV4IHJhbXA6ICVkICVkICVkIiwgYXV4TGV2ZWwgPDwgMTYsIHByZXZBdXhMZXZlbCwgYXV4SW5jKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTYwOSwyMSArMTAyNiwxNiBAQAogICAgIG5hbWUgLT0gVFJBQ0swOwogICAgIEFMT0dfQVNTRVJUKHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MsICJiYWQgdHJhY2sgbmFtZSAlZCIsIG5hbWUpOwogCi0gICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICAvLyB1cGRhdGUgcmVxdWlyZWQ/Ci0gICAgICAgIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5tVHJhY2tCdWZmZXJQcm92aWRlciAhPSBidWZmZXJQcm92aWRlcikgewotICAgICAgICAgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnNldEJ1ZmZlclByb3ZpZGVyKCVwKSBmb3IgZG93bm1peCIsIGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgICAgIC8vIHNldHRpbmcgdGhlIGJ1ZmZlciBwcm92aWRlciBmb3IgYSB0cmFjayB0aGF0IGdldHMgZG93bm1peGVkIGNvbnNpc3RzIGluOgotICAgICAgICAgICAgLy8gIDEvIHNldHRpbmcgdGhlIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgImRvd25taXggLyBidWZmZXIgcHJvdmlkZXIiIHdyYXBwZXIKLSAgICAgICAgICAgIC8vICAgICBzbyBpdCdzIHRoZSBvbmUgdGhhdCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgcHJvdmlkZXIgaXMgbmVlZGVkLAotICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5idWZmZXJQcm92aWRlciA9IG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICAvLyAgMi8gc2F2aW5nIHRoZSBidWZmZXIgcHJvdmlkZXIgZm9yIHRoZSB0cmFjayBzbyB0aGUgd3JhcHBlciBjYW4gdXNlIGl0Ci0gICAgICAgICAgICAvLyAgICAgd2hlbiBpdCBkb3dubWl4ZXMuCi0gICAgICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5tVHJhY2tCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5idWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOworICAgIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLm1JbnB1dEJ1ZmZlclByb3ZpZGVyID09IGJ1ZmZlclByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgcmVzZXQgYW55IGJ1ZmZlciBwcm92aWRlcnMgaWYgaWRlbnRpY2FsLgogICAgIH0KKyAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICB9CisKKyAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7CisgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoJm1TdGF0ZS50cmFja3NbbmFtZV0pOwogfQogCiAKQEAgLTY1Niw2ICsxMDY4LDkgQEAKIAogICAgIC8vIGNvbXB1dGUgZXZlcnl0aGluZyB3ZSBuZWVkLi4uCiAgICAgaW50IGNvdW50QWN0aXZlVHJhY2tzID0gMDsKKyAgICAvLyBUT0RPOiBmaXggYWxsMTZCaXRzU3RlcmVOb1Jlc2FtcGxlIGxvZ2ljIHRvCisgICAgLy8gZWl0aGVyIHByb3Blcmx5IGhhbmRsZSBtdXRlZCB0cmFja3MgKGl0IHNob3VsZCBpZ25vcmUgdGhlbSkKKyAgICAvLyBvciByZW1vdmUgYWx0b2dldGhlciBhcyBhbiBvYnNvbGV0ZSBvcHRpbWl6YXRpb24uCiAgICAgYm9vbCBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gdHJ1ZTsKICAgICBib29sIHJlc2FtcGxpbmcgPSBmYWxzZTsKICAgICBib29sIHZvbHVtZVJhbXAgPSBmYWxzZTsKQEAgLTY2NywzOSArMTA4Miw0NyBAQAogICAgICAgICBjb3VudEFjdGl2ZVRyYWNrcysrOwogICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgdWludDMyX3QgbiA9IDA7CisgICAgICAgIC8vIEZJWE1FIGNhbiBvdmVyZmxvdyAobWFzayBpcyBvbmx5IDMgYml0cykKICAgICAgICAgbiB8PSBORUVEU19DSEFOTkVMXzEgKyB0LmNoYW5uZWxDb3VudCAtIDE7Ci0gICAgICAgIG4gfD0gTkVFRFNfRk9STUFUXzE2OwotICAgICAgICBuIHw9IHQuZG9lc1Jlc2FtcGxlKCkgPyBORUVEU19SRVNBTVBMRV9FTkFCTEVEIDogTkVFRFNfUkVTQU1QTEVfRElTQUJMRUQ7CisgICAgICAgIGlmICh0LmRvZXNSZXNhbXBsZSgpKSB7CisgICAgICAgICAgICBuIHw9IE5FRURTX1JFU0FNUExFOworICAgICAgICB9CiAgICAgICAgIGlmICh0LmF1eExldmVsICE9IDAgJiYgdC5hdXhCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbiB8PSBORUVEU19BVVhfRU5BQkxFRDsKKyAgICAgICAgICAgIG4gfD0gTkVFRFNfQVVYOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHQudm9sdW1lSW5jWzBdfHQudm9sdW1lSW5jWzFdKSB7CiAgICAgICAgICAgICB2b2x1bWVSYW1wID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApIHsKLSAgICAgICAgICAgIG4gfD0gTkVFRFNfTVVURV9FTkFCTEVEOworICAgICAgICAgICAgbiB8PSBORUVEU19NVVRFOwogICAgICAgICB9CiAgICAgICAgIHQubmVlZHMgPSBuOwogCi0gICAgICAgIGlmICgobiAmIE5FRURTX01VVEVfX01BU0spID09IE5FRURTX01VVEVfRU5BQkxFRCkgeworICAgICAgICBpZiAobiAmIE5FRURTX01VVEUpIHsKICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19ub3A7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKG4gJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSB7CisgICAgICAgICAgICBpZiAobiAmIE5FRURTX0FVWCkgewogICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobiAmIE5FRURTX1JFU0FNUExFX19NQVNLKSA9PSBORUVEU19SRVNBTVBMRV9FTkFCTEVEKSB7CisgICAgICAgICAgICBpZiAobiAmIE5FRURTX1JFU0FNUExFKSB7CiAgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHJlc2FtcGxpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19nZW5lcmljUmVzYW1wbGU7CisgICAgICAgICAgICAgICAgdC5ob29rID0gZ2V0VHJhY2tIb29rKFRSQUNLVFlQRV9SRVNBTVBMRSwgdC5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+IE5FRURTX0NIQU5ORUxfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjayAlZCBuZWVkcyBkb3dubWl4ICsgcmVzYW1wbGUiLCBpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPT0gTkVFRFNfQ0hBTk5FTF8xKXsKLSAgICAgICAgICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfXzE2Qml0c01vbm87CisgICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IGdldFRyYWNrSG9vaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCA9PSAyIC8vIFRPRE86IE1PTk9fSEFDSy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk8gOiBUUkFDS1RZUEVfTk9SRVNBTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPj0gTkVFRFNfQ0hBTk5FTF8yKXsKLSAgICAgICAgICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfXzE2Qml0c1N0ZXJlbzsKKyAgICAgICAgICAgICAgICAgICAgdC5ob29rID0gZ2V0VHJhY2tIb29rKFRSQUNLVFlQRV9OT1JFU0FNUExFLCB0Lm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPiBORUVEU19DSEFOTkVMXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrICVkIG5lZWRzIGRvd25taXgiLCBpKTsKICAgICAgICAgICAgICAgICB9CkBAIC03MDksNyArMTEzMiw3IEBACiAKICAgICAvLyBzZWxlY3QgdGhlIHByb2Nlc3NpbmcgaG9va3MKICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX25vcDsKLSAgICBpZiAoY291bnRBY3RpdmVUcmFja3MpIHsKKyAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPiAwKSB7CiAgICAgICAgIGlmIChyZXNhbXBsaW5nKSB7CiAgICAgICAgICAgICBpZiAoIXN0YXRlLT5vdXRwdXRUZW1wKSB7CiAgICAgICAgICAgICAgICAgc3RhdGUtPm91dHB1dFRlbXAgPSBuZXcgaW50MzJfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOwpAQCAtNzMwLDcgKzExNTMsMTcgQEAKICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZzsKICAgICAgICAgICAgIGlmIChhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlICYmICF2b2x1bWVSYW1wKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooc3RhdGUtPmVuYWJsZWRUcmFja3MpOworICAgICAgICAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0Lm5lZWRzICYgTkVFRFNfTVVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrIHByZXZlbnRzIGEgbXV0ZWQgdHJhY2sgZnJvbSBhY3F1aXJpbmcgYSBwcm9jZXNzIGhvb2suCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkYW5nZXJvdXMgaWYgdGhlIHRyYWNrIGlzIE1PTk8gYXMgdGhhdCByZXF1aXJlcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGhhbmRsaW5nIGR1ZSB0byBpbXBsaWNpdCBjaGFubmVsIGR1cGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcmVvIG9yIE11bHRpY2hhbm5lbCBzaG91bGQgYWN0dWFsbHkgYmUgZmluZSBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBnZXRQcm9jZXNzSG9vayhQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50LCB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTc0NSwxNiArMTE3OCwxNSBAQAogCiAgICAgLy8gTm93IHRoYXQgdGhlIHZvbHVtZSByYW1wIGhhcyBiZWVuIGRvbmUsIHNldCBvcHRpbWFsIHN0YXRlIGFuZAogICAgIC8vIHRyYWNrIGhvb2tzIGZvciBzdWJzZXF1ZW50IG1peGVyIHByb2Nlc3MKLSAgICBpZiAoY291bnRBY3RpdmVUcmFja3MpIHsKKyAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPiAwKSB7CiAgICAgICAgIGJvb2wgYWxsTXV0ZWQgPSB0cnVlOwogICAgICAgICB1aW50MzJfdCBlbiA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwogICAgICAgICB3aGlsZSAoZW4pIHsKICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKICAgICAgICAgICAgIGVuICY9IH4oMTw8aSk7CiAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgICAgIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdC5uZWVkcyB8PSBORUVEU19NVVRFX0VOQUJMRUQ7CisgICAgICAgICAgICBpZiAoIXQuZG9lc1Jlc2FtcGxlKCkgJiYgdC52b2x1bWVSTCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdC5uZWVkcyB8PSBORUVEU19NVVRFOwogICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19ub3A7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGFsbE11dGVkID0gZmFsc2U7CkBAIC03NjQsNyArMTE5NiwxMSBAQAogICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19ub3A7CiAgICAgICAgIH0gZWxzZSBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSkgewogICAgICAgICAgICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID09IDEpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHN0YXRlLT5lbmFibGVkVHJhY2tzKTsKKyAgICAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICAvLyBNdXRlZCBzaW5nbGUgdHJhY2tzIGhhbmRsZWQgYnkgYWxsTXV0ZWQgYWJvdmUuCisgICAgICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBnZXRQcm9jZXNzSG9vayhQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCwgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNzc0LDE1ICsxMjEwLDE1IEBACiB2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19nZW5lcmljUmVzYW1wbGUodHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KQogeworICAgIEFMT0dWVigidHJhY2tfX2dlbmVyaWNSZXNhbXBsZVxuIik7CiAgICAgdC0+cmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHQtPnNhbXBsZVJhdGUpOwogCiAgICAgLy8gcmFtcCBnYWluIC0gcmVzYW1wbGUgdG8gdGVtcCBidWZmZXIgYW5kIHNjYWxlL21peCBpbiAybmQgc3RlcAogICAgIGlmIChhdXggIT0gTlVMTCkgewogICAgICAgICAvLyBhbHdheXMgcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHdoZW4gc2VuZGluZyB0byBhdXhpbGlhcnkgYnVmZmVyIHRvIGJlIGFibGUKICAgICAgICAgLy8gdG8gYXBwbHkgc2VuZCBsZXZlbCBhZnRlciByZXNhbXBsaW5nCi0gICAgICAgIC8vIFRPRE86IG1vZGlmeSBlYWNoIHJlc2FtcGxlciB0byBzdXBwb3J0IGF1eCBjaGFubmVsPwotICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOLCBVTklUWV9HQUlOKTsKLSAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiBNQVhfTlVNX0NIQU5ORUxTICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CiAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdfHQtPmF1eEluYykpIHsKICAgICAgICAgICAgIHZvbHVtZVJhbXBTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOwpAQCAtNzkxLDcgKzEyMjcsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV0pKSB7Ci0gICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOLCBVTklUWV9HQUlOKTsKKyAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOwogICAgICAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiBNQVhfTlVNX0NIQU5ORUxTICogc2l6ZW9mKGludDMyX3QpKTsKICAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUodGVtcCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOwogICAgICAgICAgICAgdm9sdW1lUmFtcFN0ZXJlbyh0LCBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CkBAIC03OTksMTQgKzEyMzUsMTQgQEAKIAogICAgICAgICAvLyBjb25zdGFudCBnYWluCiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUodC0+dm9sdW1lWzBdLCB0LT52b2x1bWVbMV0pOworICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUodC0+bVZvbHVtZVswXSwgdC0+bVZvbHVtZVsxXSk7CiAgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKG91dCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19ub3AodHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjp0cmFja19fbm9wKHRyYWNrX3QqIHQgX191bnVzZWQsIGludDMyX3QqIG91dCBfX3VudXNlZCwKKyAgICAgICAgc2l6ZV90IG91dEZyYW1lQ291bnQgX191bnVzZWQsIGludDMyX3QqIHRlbXAgX191bnVzZWQsIGludDMyX3QqIGF1eCBfX3VudXNlZCkKIHsKIH0KIApAQCAtODgyLDkgKzEzMTgsMTAgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4KQogeworICAgIEFMT0dWVigidHJhY2tfXzE2Qml0c1N0ZXJlb1xuIik7CiAgICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQxNl90ICo+KHQtPmluKTsKIAogICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKQEAgLTk3Myw5ICsxNDEwLDEwIEBACiAgICAgdC0+aW4gPSBpbjsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzTW9ubyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGludDMyX3QqIHRlbXAgX191bnVzZWQsIGludDMyX3QqIGF1eCkKIHsKKyAgICBBTE9HVlYoInRyYWNrX18xNkJpdHNNb25vXG4iKTsKICAgICBjb25zdCBpbnQxNl90ICppbiA9IHN0YXRpY19jYXN0PGludDE2X3QgY29uc3QgKj4odC0+aW4pOwogCiAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewpAQCAtMTA2Myw4ICsxNTAxLDggQEAKIC8vIG5vLW9wIGNhc2UKIHZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9wKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cykKIHsKKyAgICBBTE9HVlYoInByb2Nlc3NfX25vcFxuIik7CiAgICAgdWludDMyX3QgZTAgPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKLSAgICBzaXplX3QgYnVmU2l6ZSA9IHN0YXRlLT5mcmFtZUNvdW50ICogc2l6ZW9mKGludDE2X3QpICogTUFYX05VTV9DSEFOTkVMUzsKICAgICB3aGlsZSAoZTApIHsKICAgICAgICAgLy8gcHJvY2VzcyBieSBncm91cCBvZiB0cmFja3Mgd2l0aCBzYW1lIG91dHB1dCBidWZmZXIgdG8KICAgICAgICAgLy8gYXZvaWQgbXVsdGlwbGUgbWVtc2V0KCkgb24gc2FtZSBidWZmZXIKQEAgLTEwODMsNyArMTUyMSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlMCAmPSB+KGUxKTsKIAotICAgICAgICAgICAgbWVtc2V0KHQxLm1haW5CdWZmZXIsIDAsIGJ1ZlNpemUpOworICAgICAgICAgICAgbWVtc2V0KHQxLm1haW5CdWZmZXIsIDAsIHN0YXRlLT5mcmFtZUNvdW50ICogdDEubU1peGVyQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0MS5tTWl4ZXJGb3JtYXQpKTsKICAgICAgICAgfQogCiAgICAgICAgIHdoaWxlIChlMSkgewpAQCAtMTEwOSw2ICsxNTQ4LDcgQEAKIC8vIGdlbmVyaWMgY29kZSB3aXRob3V0IHJlc2FtcGxpbmcKIHZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpCiB7CisgICAgQUxPR1ZWKCJwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nXG4iKTsKICAgICBpbnQzMl90IG91dFRlbXBbQkxPQ0tTSVpFICogTUFYX05VTV9DSEFOTkVMU10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKIAogICAgIC8vIGFjcXVpcmUgZWFjaCB0cmFjaydzIGJ1ZmZlcgpAQCAtMTE1Myw3ICsxNTkzLDcgQEAKICAgICAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gQkxPQ0tTSVpFOwogICAgICAgICAgICAgICAgIGludDMyX3QgKmF1eCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKCh0Lm5lZWRzICYgTkVFRFNfQVVYX19NQVNLKSA9PSBORUVEU19BVVhfRU5BQkxFRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC5uZWVkcyAmIE5FRURTX0FVWCkpIHsKICAgICAgICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXIgKyBudW1GcmFtZXM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKQEAgLTExNjUsOSArMTYwNSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5GcmFtZXMgPSAodC5mcmFtZUNvdW50ID4gb3V0RnJhbWVzKT9vdXRGcmFtZXM6dC5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5GcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCArIChCTE9DS1NJWkUtb3V0RnJhbWVzKSpNQVhfTlVNX0NIQU5ORUxTLCBpbkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnJlc2FtcGxlVGVtcCwgYXV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluRnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgKEJMT0NLU0laRSAtIG91dEZyYW1lcykgKiB0Lm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgLT0gaW5GcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgLT0gaW5GcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CkBAIC0xMTkxLDggKzE2MzEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKG91dCwgb3V0VGVtcCwgQkxPQ0tTSVpFKTsKLSAgICAgICAgICAgIG91dCArPSBCTE9DS1NJWkU7CisKKyAgICAgICAgICAgIGNvbnZlcnRNaXhlckZvcm1hdChvdXQsIHQxLm1NaXhlckZvcm1hdCwgb3V0VGVtcCwgdDEubU1peGVySW5Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIEJMT0NLU0laRSAqIHQxLm1NaXhlckNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAvLyBUT0RPOiBmaXggdWdseSBjYXN0aW5nIGR1ZSB0byBjaG9pY2Ugb2Ygb3V0IHBvaW50ZXIgdHlwZQorICAgICAgICAgICAgb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oKHVpbnQ4X3QqKW91dAorICAgICAgICAgICAgICAgICAgICArIEJMT0NLU0laRSAqIHQxLm1NaXhlckNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQxLm1NaXhlckZvcm1hdCkpOwogICAgICAgICAgICAgbnVtRnJhbWVzICs9IEJMT0NLU0laRTsKICAgICAgICAgfSB3aGlsZSAobnVtRnJhbWVzIDwgc3RhdGUtPmZyYW1lQ291bnQpOwogICAgIH0KQEAgLTEyMTEsMTAgKzE2NTYsOSBAQAogLy8gZ2VuZXJpYyBjb2RlIHdpdGggcmVzYW1wbGluZwogdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpCiB7CisgICAgQUxPR1ZWKCJwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZ1xuIik7CiAgICAgLy8gdGhpcyBjb25zdCBqdXN0IG1lYW5zIHRoYXQgbG9jYWwgdmFyaWFibGUgb3V0VGVtcCBkb2Vzbid0IGNoYW5nZQogICAgIGludDMyX3QqIGNvbnN0IG91dFRlbXAgPSBzdGF0ZS0+b3V0cHV0VGVtcDsKLSAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihpbnQzMl90KSAqIE1BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudDsKLQogICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKIAogICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CkBAIC0xMjM1LDIwICsxNjc5LDIwIEBACiAgICAgICAgIH0KICAgICAgICAgZTAgJj0gfihlMSk7CiAgICAgICAgIGludDMyX3QgKm91dCA9IHQxLm1haW5CdWZmZXI7Ci0gICAgICAgIG1lbXNldChvdXRUZW1wLCAwLCBzaXplKTsKKyAgICAgICAgbWVtc2V0KG91dFRlbXAsIDAsIHNpemVvZigqb3V0VGVtcCkgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQgKiBzdGF0ZS0+ZnJhbWVDb3VudCk7CiAgICAgICAgIHdoaWxlIChlMSkgewogICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTEpOwogICAgICAgICAgICAgZTEgJj0gfigxPDxpKTsKICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwogICAgICAgICAgICAgaW50MzJfdCAqYXV4ID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgodC5uZWVkcyAmIE5FRURTX0FVWF9fTUFTSykgPT0gTkVFRFNfQVVYX0VOQUJMRUQpKSB7CisgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC5uZWVkcyAmIE5FRURTX0FVWCkpIHsKICAgICAgICAgICAgICAgICBhdXggPSB0LmF1eEJ1ZmZlcjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGxpdHRsZSBnb29meSwgb24gdGhlIHJlc2FtcGxpbmcgY2FzZSB3ZSBkb24ndAogICAgICAgICAgICAgLy8gYWNxdWlyZS9yZWxlYXNlIHRoZSBidWZmZXJzIGJlY2F1c2UgaXQncyBkb25lIGJ5CiAgICAgICAgICAgICAvLyB0aGUgcmVzYW1wbGVyLgotICAgICAgICAgICAgaWYgKCh0Lm5lZWRzICYgTkVFRFNfUkVTQU1QTEVfX01BU0spID09IE5FRURTX1JFU0FNUExFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIGlmICh0Lm5lZWRzICYgTkVFRFNfUkVTQU1QTEUpIHsKICAgICAgICAgICAgICAgICB0LnJlc2FtcGxlci0+c2V0UFRTKHB0cyk7CiAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wLCBudW1GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTI2NywxNCArMTcxMSwxNSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXggKz0gb3V0RnJhbWVzOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCArIG91dEZyYW1lcypNQVhfTlVNX0NIQU5ORUxTLCB0LmJ1ZmZlci5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAgKyBvdXRGcmFtZXMgKiB0Lm1NaXhlckNoYW5uZWxDb3VudCwgdC5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwogICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgKz0gdC5idWZmZXIuZnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIG51bUZyYW1lcyk7CisgICAgICAgIGNvbnZlcnRNaXhlckZvcm1hdChvdXQsIHQxLm1NaXhlckZvcm1hdCwKKyAgICAgICAgICAgICAgICBvdXRUZW1wLCB0MS5tTWl4ZXJJbkZvcm1hdCwgbnVtRnJhbWVzICogdDEubU1peGVyQ2hhbm5lbENvdW50KTsKICAgICB9CiB9CiAKQEAgLTEyODIsNiArMTcyNyw3IEBACiB2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cykKIHsKKyAgICBBTE9HVlYoInByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nXG4iKTsKICAgICAvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIHN0YXRlLT5lbmFibGVkVHJhY2tzIGhhcyBleGFjdGx5CiAgICAgLy8gb25lIGJpdCBzZXQuICBUaGUgYXNzZXJ0cyBiZWxvdyB3b3VsZCB2ZXJpZnkgdGhpcywgYnV0IGFyZSBjb21tZW50ZWQgb3V0CiAgICAgLy8gc2luY2UgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kIGlzIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlLgpAQCAtMTI5Myw2ICsxNzM5LDcgQEAKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC5idWZmZXIpOwogCiAgICAgaW50MzJfdCogb3V0ID0gdC5tYWluQnVmZmVyOworICAgIGZsb2F0ICpmb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KG91dCk7CiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwogCiAgICAgY29uc3QgaW50MTZfdCB2bCA9IHQudm9sdW1lWzBdOwpAQCAtMTMwNiwxNTAgKzE3NTMsNjggQEAKIAogICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCiAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgotICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKHVuc2lnbmVkIGxvbmcpaW4gJiAzKSkgewotICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgbnVtRnJhbWVzKk1BWF9OVU1fQ0hBTk5FTFMqc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIEFMT0dFX0lGKCgodW5zaWduZWQgbG9uZylpbiAmIDMpLCAicHJvY2VzcyBzdGVyZW8gdHJhY2s6IGlucHV0IGJ1ZmZlciBhbGlnbm1lbnQgcGI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyICVwIHRyYWNrICVkLCBjaGFubmVscyAlZCwgbmVlZHMgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgIGluLCBpLCB0LmNoYW5uZWxDb3VudCwgdC5uZWVkcyk7CisgICAgICAgIGlmIChpbiA9PSBOVUxMIHx8ICgoKHVpbnRwdHJfdClpbikgJiAzKSkgeworICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgbnVtRnJhbWVzCisgICAgICAgICAgICAgICAgICAgICogdC5tTWl4ZXJDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQubU1peGVyRm9ybWF0KSk7CisgICAgICAgICAgICBBTE9HRV9JRigoKCh1aW50cHRyX3QpaW4pICYgMyksCisgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZzogbWlzYWxpZ25lZCBidWZmZXIiCisgICAgICAgICAgICAgICAgICAgICIgJXAgdHJhY2sgJWQsIGNoYW5uZWxzICVkLCBuZWVkcyAlMDh4LCB2b2x1bWUgJTA4eCB2ZmwgJWYgdmZyICVmIiwKKyAgICAgICAgICAgICAgICAgICAgaW4sIGksIHQuY2hhbm5lbENvdW50LCB0Lm5lZWRzLCB2cmwsIHQubVZvbHVtZVswXSwgdC5tVm9sdW1lWzFdKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gYi5mcmFtZUNvdW50OwogCi0gICAgICAgIGlmIChDQ19VTkxJS0VMWSh1aW50MzJfdCh2bCkgPiBVTklUWV9HQUlOIHx8IHVpbnQzMl90KHZyKSA+IFVOSVRZX0dBSU4pKSB7Ci0gICAgICAgICAgICAvLyB2b2x1bWUgaXMgYm9vc3RlZCwgc28gd2UgbWlnaHQgbmVlZCB0byBjbGFtcCBldmVuIHRob3VnaAotICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyBvbmx5IG9uZSB0cmFjay4KKyAgICAgICAgc3dpdGNoICh0Lm1NaXhlckZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CiAgICAgICAgICAgICAgICAgaW4gKz0gMjsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKLSAgICAgICAgICAgICAgICAvLyBjbGFtcGluZy4uLgotICAgICAgICAgICAgICAgIGwgPSBjbGFtcDE2KGwpOwotICAgICAgICAgICAgICAgIHIgPSBjbGFtcDE2KHIpOwotICAgICAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCk7CisgICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCk7CisgICAgICAgICAgICAgICAgKmZvdXQrKyA9IGZsb2F0X2Zyb21fcTRfMjcobCk7CisgICAgICAgICAgICAgICAgKmZvdXQrKyA9IGZsb2F0X2Zyb21fcTRfMjcocik7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogSW4gY2FzZSBvZiBsYXRlciBpbnQxNl90IHNpbmsgb3V0cHV0LAorICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gYW5kIGNsYW1waW5nIGlzIGRvbmUgYnkgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KCkuCiAgICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7Ci0gICAgICAgICAgICAgICAgaW4gKz0gMjsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKLSAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOwotICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QodmwpID4gVU5JVFlfR0FJTl9JTlQgfHwgdWludDMyX3QodnIpID4gVU5JVFlfR0FJTl9JTlQpKSB7CisgICAgICAgICAgICAgICAgLy8gdm9sdW1lIGlzIGJvb3N0ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gY2xhbXAgZXZlbiB0aG91Z2gKKyAgICAgICAgICAgICAgICAvLyB3ZSBwcm9jZXNzIG9ubHkgb25lIHRyYWNrLgorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CisgICAgICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KKyAgICAgICAgICAgICAgICAgICAgbCA9IGNsYW1wMTYobCk7CisgICAgICAgICAgICAgICAgICAgIHIgPSBjbGFtcDE2KHIpOworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyIGZvcm1hdDogJWQiLCB0Lm1NaXhlckZvcm1hdCk7CiAgICAgICAgIH0KICAgICAgICAgbnVtRnJhbWVzIC09IGIuZnJhbWVDb3VudDsKICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYik7CiAgICAgfQogfQogCi0jaWYgMAotLy8gMiB0cmFja3MgaXMgYWxzbyBhIGNvbW1vbiBjYXNlCi0vLyBORVZFUiB1c2VkIGluIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgcHJvY2Vzc19fdmFsaWRhdGUoKQotLy8gb25seSB1c2UgaWYgdGhlIDIgdHJhY2tzIGhhdmUgdGhlIHNhbWUgb3V0cHV0IGJ1ZmZlcgotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19Ud29UcmFja3MxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cykKLXsKLSAgICBpbnQgaTsKLSAgICB1aW50MzJfdCBlbiA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwotCi0gICAgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7Ci0gICAgY29uc3QgdHJhY2tfdCYgdDAgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYjAodDAuYnVmZmVyKTsKLQotICAgIGVuICY9IH4oMTw8aSk7Ci0gICAgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7Ci0gICAgY29uc3QgdHJhY2tfdCYgdDEgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYjEodDEuYnVmZmVyKTsKLQotICAgIGNvbnN0IGludDE2X3QgKmluMDsKLSAgICBjb25zdCBpbnQxNl90IHZsMCA9IHQwLnZvbHVtZVswXTsKLSAgICBjb25zdCBpbnQxNl90IHZyMCA9IHQwLnZvbHVtZVsxXTsKLSAgICBzaXplX3QgZnJhbWVDb3VudDAgPSAwOwotCi0gICAgY29uc3QgaW50MTZfdCAqaW4xOwotICAgIGNvbnN0IGludDE2X3QgdmwxID0gdDEudm9sdW1lWzBdOwotICAgIGNvbnN0IGludDE2X3QgdnIxID0gdDEudm9sdW1lWzFdOwotICAgIHNpemVfdCBmcmFtZUNvdW50MSA9IDA7Ci0KLSAgICAvL0ZJWE1FOiBvbmx5IHdvcmtzIGlmIHR3byB0cmFja3MgdXNlIHNhbWUgYnVmZmVyCi0gICAgaW50MzJfdCogb3V0ID0gdDAubWFpbkJ1ZmZlcjsKLSAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7Ci0gICAgY29uc3QgaW50MTZfdCAqYnVmZiA9IE5VTEw7Ci0KLQotICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLQotICAgICAgICBpZiAoZnJhbWVDb3VudDAgPT0gMCkgewotICAgICAgICAgICAgYjAuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKLSAgICAgICAgICAgIGludDY0X3Qgb3V0cHV0UFRTID0gY2FsY3VsYXRlT3V0cHV0UFRTKHQwLCBwdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgLSB0MC5tYWluQnVmZmVyKTsKLSAgICAgICAgICAgIHQwLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiMCwgb3V0cHV0UFRTKTsKLSAgICAgICAgICAgIGlmIChiMC5pMTYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChidWZmID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZiA9IG5ldyBpbnQxNl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluMCA9IGJ1ZmY7Ci0gICAgICAgICAgICAgICAgYjAuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW4wID0gYjAuaTE2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWVDb3VudDAgPSBiMC5mcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFtZUNvdW50MSA9PSAwKSB7Ci0gICAgICAgICAgICBiMS5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOwotICAgICAgICAgICAgaW50NjRfdCBvdXRwdXRQVFMgPSBjYWxjdWxhdGVPdXRwdXRQVFModDEsIHB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCAtIHQwLm1haW5CdWZmZXIpOwotICAgICAgICAgICAgdDEuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmIxLCBvdXRwdXRQVFMpOwotICAgICAgICAgICAgaWYgKGIxLmkxNiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBidWZmID0gbmV3IGludDE2X3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW4xID0gYnVmZjsKLSAgICAgICAgICAgICAgICBiMS5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbjEgPSBiMS5pMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtZUNvdW50MSA9IGIxLmZyYW1lQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gZnJhbWVDb3VudDAgPCBmcmFtZUNvdW50MT9mcmFtZUNvdW50MDpmcmFtZUNvdW50MTsKLQotICAgICAgICBudW1GcmFtZXMgLT0gb3V0RnJhbWVzOwotICAgICAgICBmcmFtZUNvdW50MCAtPSBvdXRGcmFtZXM7Ci0gICAgICAgIGZyYW1lQ291bnQxIC09IG91dEZyYW1lczsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpbnQzMl90IGwwID0gKmluMCsrOwotICAgICAgICAgICAgaW50MzJfdCByMCA9ICppbjArKzsKLSAgICAgICAgICAgIGwwID0gbXVsKGwwLCB2bDApOwotICAgICAgICAgICAgcjAgPSBtdWwocjAsIHZyMCk7Ci0gICAgICAgICAgICBpbnQzMl90IGwgPSAqaW4xKys7Ci0gICAgICAgICAgICBpbnQzMl90IHIgPSAqaW4xKys7Ci0gICAgICAgICAgICBsID0gbXVsQWRkKGwsIHZsMSwgbDApID4+IDEyOwotICAgICAgICAgICAgciA9IG11bEFkZChyLCB2cjEsIHIwKSA+PiAxMjsKLSAgICAgICAgICAgIC8vIGNsYW1waW5nLi4uCi0gICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKLSAgICAgICAgICAgIHIgPSBjbGFtcDE2KHIpOwotICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKLSAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOwotCi0gICAgICAgIGlmIChmcmFtZUNvdW50MCA9PSAwKSB7Ci0gICAgICAgICAgICB0MC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYjApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFtZUNvdW50MSA9PSAwKSB7Ci0gICAgICAgICAgICB0MS5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYjEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVsZXRlIFtdIGJ1ZmY7Ci19Ci0jZW5kaWYKLQogaW50NjRfdCBBdWRpb01peGVyOjpjYWxjdWxhdGVPdXRwdXRQVFMoY29uc3QgdHJhY2tfdCYgdCwgaW50NjRfdCBiYXNlUFRTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dEZyYW1lSW5kZXgpCiB7Ci0gICAgaWYgKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTID09IGJhc2VQVFMpCisgICAgaWYgKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTID09IGJhc2VQVFMpIHsKICAgICAgICAgcmV0dXJuIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTOworICAgIH0KIAogICAgIHJldHVybiBiYXNlUFRTICsgKChvdXRwdXRGcmFtZUluZGV4ICogc0xvY2FsVGltZUZyZXEpIC8gdC5zYW1wbGVSYXRlKTsKIH0KQEAgLTE0NjAsNyArMTgyNSw0MTQgQEAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb01peGVyOjpzSW5pdFJvdXRpbmUoKQogewogICAgIExvY2FsQ2xvY2sgbGM7Ci0gICAgc0xvY2FsVGltZUZyZXEgPSBsYy5nZXRMb2NhbEZyZXEoKTsKKyAgICBzTG9jYWxUaW1lRnJlcSA9IGxjLmdldExvY2FsRnJlcSgpOyAvLyBmb3IgdGhlIHJlc2FtcGxlcgorCisgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmluaXQoKTsgLy8gZm9yIHRoZSBkb3dubWl4ZXIKK30KKworLyogVE9ETzogY29uc2lkZXIgd2hldGhlciB0aGlzIGxldmVsIG9mIG9wdGltaXphdGlvbiBpcyBuZWNlc3NhcnkuCisgKiBQZXJoYXBzIGp1c3Qgc3RpY2sgd2l0aCBhIHNpbmdsZSBmb3IgbG9vcC4KKyAqLworCisvLyBOZWVkcyB0byBkZXJpdmUgYSBjb21waWxlIHRpbWUgY29uc3RhbnQgKGNvbnN0ZXhwcikuICBDb3VsZCBiZSB0YXJnZXRlZCB0byBnbworLy8gdG8gYSBNT05PVk9MIG1peHR5cGUgYmFzZWQgb24gTUFYX05VTV9WT0xVTUVTLCBidXQgdGhhdCdzIGFuIHVubmVjZXNzYXJ5IGNvbXBsaWNhdGlvbi4KKyNkZWZpbmUgTUlYVFlQRV9NT05PVk9MKG1peHR5cGUpIChtaXh0eXBlID09IE1JWFRZUEVfTVVMVEkgPyBNSVhUWVBFX01VTFRJX01PTk9WT0wgOiBcCisgICAgICAgIG1peHR5cGUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWSA/IE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTCA6IG1peHR5cGUpCisKKy8qIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwKKyAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEEsIHR5cGVuYW1lIFRBVj4KK3N0YXRpYyB2b2lkIHZvbHVtZVJhbXBNdWx0aSh1aW50MzJfdCBjaGFubmVscywgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGNvbnN0IFRJKiBpbiwgVEEqIGF1eCwgVFYgKnZvbCwgY29uc3QgVFYgKnZvbGluYywgVEFWICp2b2xhLCBUQVYgdm9sYWluYykKK3sKKyAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7CisgICAgY2FzZSAxOgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRSwgMT4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEUsIDI+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDM+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgND4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA1PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDY+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNz4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA4PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwKKyAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEEsIHR5cGVuYW1lIFRBVj4KK3N0YXRpYyB2b2lkIHZvbHVtZU11bHRpKHVpbnQzMl90IGNoYW5uZWxzLCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBjb25zdCBUViAqdm9sLCBUQVYgdm9sYSkKK3sKKyAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7CisgICAgY2FzZSAxOgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFLCAxPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRSwgMj4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgMz4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgND4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNT4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNj4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNz4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgOD4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAqIFVTRUZMT0FUVk9MIChzZXQgdG8gdHJ1ZSBpZiBmbG9hdCB2b2x1bWUgaXMgdXNlZCkKKyAqIEFESlVTVFZPTCAgIChzZXQgdG8gdHJ1ZSBpZiB2b2x1bWUgcmFtcCBwYXJhbWV0ZXJzIG5lZWRzIGFkanVzdG1lbnQgYWZ0ZXJ3YXJkcykKKyAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgYm9vbCBVU0VGTE9BVFZPTCwgYm9vbCBBREpVU1RWT0wsCisgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KK3ZvaWQgQXVkaW9NaXhlcjo6dm9sdW1lTWl4KFRPICpvdXQsIHNpemVfdCBvdXRGcmFtZXMsCisgICAgICAgIGNvbnN0IFRJICppbiwgVEEgKmF1eCwgYm9vbCByYW1wLCBBdWRpb01peGVyOjp0cmFja190ICp0KQoreworICAgIGlmIChVU0VGTE9BVFZPTCkgeworICAgICAgICBpZiAocmFtcCkgeworICAgICAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIHQtPm1QcmV2Vm9sdW1lLCB0LT5tVm9sdW1lSW5jLCAmdC0+cHJldkF1eExldmVsLCB0LT5hdXhJbmMpOworICAgICAgICAgICAgaWYgKEFESlVTVFZPTCkgeworICAgICAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgdC0+bVZvbHVtZSwgdC0+YXV4TGV2ZWwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJhbXApIHsKKyAgICAgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lLCB0LT52b2x1bWVJbmMsICZ0LT5wcmV2QXV4TGV2ZWwsIHQtPmF1eEluYyk7CisgICAgICAgICAgICBpZiAoQURKVVNUVk9MKSB7CisgICAgICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICB0LT52b2x1bWUsIHQtPmF1eExldmVsKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogVGhpcyBwcm9jZXNzIGhvb2sgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBzaW5nbGUgdHJhY2sgd2l0aG91dAorICogYXV4IGJ1ZmZlciwgdm9sdW1lIHJhbXAsIG9yIHJlc2FtcGxpbmcuCisgKiBUT0RPOiBVcGRhdGUgdGhlIGhvb2sgc2VsZWN0aW9uOiB0aGlzIGNhbiBwcm9wZXJseSBoYW5kbGUgYXV4IGFuZCByYW1wLgorICoKKyAqIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2soc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKQoreworICAgIEFMT0dWVigicHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2tcbiIpOworICAgIC8vIENMWiBpcyBmYXN0ZXIgdGhhbiBDVFogb24gQVJNLCB0aG91Z2ggcmVhbGx5IG5vdCBzdXJlIGlmIHRydWUgYWZ0ZXIgMzEgLSBjbHouCisgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooc3RhdGUtPmVuYWJsZWRUcmFja3MpOworICAgIEFMT0dfQVNTRVJUKCgxIDw8IGkpID09IHN0YXRlLT5lbmFibGVkVHJhY2tzLCAibW9yZSB0aGFuIDEgdHJhY2sgZW5hYmxlZCIpOworICAgIHRyYWNrX3QgKnQgPSAmc3RhdGUtPnRyYWNrc1tpXTsKKyAgICBjb25zdCB1aW50MzJfdCBjaGFubmVscyA9IHQtPm1NaXhlckNoYW5uZWxDb3VudDsKKyAgICBUTyogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxUTyo+KHQtPm1haW5CdWZmZXIpOworICAgIFRBKiBhdXggPSByZWludGVycHJldF9jYXN0PFRBKj4odC0+YXV4QnVmZmVyKTsKKyAgICBjb25zdCBib29sIHJhbXAgPSB0LT5uZWVkc1JhbXAoKTsKKworICAgIGZvciAoc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OyBudW1GcmFtZXM7ICkgeworICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC0+YnVmZmVyKTsKKyAgICAgICAgLy8gZ2V0IGlucHV0IGJ1ZmZlcgorICAgICAgICBiLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CisgICAgICAgIGNvbnN0IGludDY0X3Qgb3V0cHV0UFRTID0gY2FsY3VsYXRlT3V0cHV0UFRTKCp0LCBwdHMsIHN0YXRlLT5mcmFtZUNvdW50IC0gbnVtRnJhbWVzKTsKKyAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmIsIG91dHB1dFBUUyk7CisgICAgICAgIGNvbnN0IFRJICppbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8VEkqPihiLnJhdyk7CisKKyAgICAgICAgLy8gaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZworICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KKyAgICAgICAgaWYgKGluID09IE5VTEwgfHwgKCgodWludHB0cl90KWluKSAmIDMpKSB7CisgICAgICAgICAgICBtZW1zZXQob3V0LCAwLCBudW1GcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgKiBjaGFubmVscyAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC0+bU1peGVyRm9ybWF0KSk7CisgICAgICAgICAgICBBTE9HRV9JRigoKCh1aW50cHRyX3QpaW4pICYgMyksICJwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazogYnVzIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgICJidWZmZXIgJXAgdHJhY2sgJXAsIGNoYW5uZWxzICVkLCBuZWVkcyAlI3giLAorICAgICAgICAgICAgICAgICAgICBpbiwgdCwgdC0+Y2hhbm5lbENvdW50LCB0LT5uZWVkcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzaXplX3Qgb3V0RnJhbWVzID0gYi5mcmFtZUNvdW50OworICAgICAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSwgZmFsc2U+ICgKKyAgICAgICAgICAgICAgICBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwgcmFtcCwgdCk7CisKKyAgICAgICAgb3V0ICs9IG91dEZyYW1lcyAqIGNoYW5uZWxzOworICAgICAgICBpZiAoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGF1eCArPSBjaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBudW1GcmFtZXMgLT0gYi5mcmFtZUNvdW50OworCisgICAgICAgIC8vIHJlbGVhc2UgYnVmZmVyCisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKKyAgICB9CisgICAgaWYgKHJhbXApIHsKKyAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSk7CisgICAgfQorfQorCisvKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIGRvIHJlc2FtcGxpbmcgdGhlbiBtaXhpbmcsCisgKiBwdWxsaW5nIGZyb20gdGhlIHRyYWNrJ3MgdXBzdHJlYW0gQXVkaW9CdWZmZXJQcm92aWRlci4KKyAqCisgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19SZXNhbXBsZSh0cmFja190KiB0LCBUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgVE8qIHRlbXAsIFRBKiBhdXgpCit7CisgICAgQUxPR1ZWKCJ0cmFja19fUmVzYW1wbGVcbiIpOworICAgIHQtPnJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSh0LT5zYW1wbGVSYXRlKTsKKyAgICBjb25zdCBib29sIHJhbXAgPSB0LT5uZWVkc1JhbXAoKTsKKyAgICBpZiAocmFtcCB8fCBhdXggIT0gTlVMTCkgeworICAgICAgICAvLyBpZiByYW1wOiAgICAgICAgcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHRvIHRlbXAgYnVmZmVyIGFuZCBzY2FsZS9taXggaW4gMm5kIHN0ZXAuCisgICAgICAgIC8vIGlmIGF1eCAhPSBOVUxMOiByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gdG8gdGVtcCBidWZmZXIgdGhlbiBhcHBseSBzZW5kIGxldmVsLgorCisgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOworICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCAqIHNpemVvZihUTykpOworICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90Kil0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CisKKyAgICAgICAgdm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUsIHRydWU+KAorICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4LCByYW1wLCB0KTsKKworICAgIH0gZWxzZSB7IC8vIGNvbnN0YW50IHZvbHVtZSBnYWluCisgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPm1Wb2x1bWVbMF0sIHQtPm1Wb2x1bWVbMV0pOworICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90KilvdXQsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgdHJhY2sgaG9vayBpcyBjYWxsZWQgdG8gbWl4IGEgdHJhY2ssIHdoZW4gbm8gcmVzYW1wbGluZyBpcyByZXF1aXJlZC4KKyAqIFRoZSBpbnB1dCBidWZmZXIgc2hvdWxkIGJlIHByZXNlbnQgaW4gdC0+aW4uCisgKgorICogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgordm9pZCBBdWRpb01peGVyOjp0cmFja19fTm9SZXNhbXBsZSh0cmFja190KiB0LCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpCit7CisgICAgQUxPR1ZWKCJ0cmFja19fTm9SZXNhbXBsZVxuIik7CisgICAgY29uc3QgVEkgKmluID0gc3RhdGljX2Nhc3Q8Y29uc3QgVEkgKj4odC0+aW4pOworCisgICAgdm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUsIHRydWU+KAorICAgICAgICAgICAgb3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB0LT5uZWVkc1JhbXAoKSwgdCk7CisKKyAgICAvLyBNSVhUWVBFX01PTk9FWFBBTkQgcmVhZHMgYSBzaW5nbGUgaW5wdXQgY2hhbm5lbCBhbmQgZXhwYW5kcyB0byBOQ0hBTiBvdXRwdXQgY2hhbm5lbHMuCisgICAgLy8gTUlYVFlQRV9NVUxUSSByZWFkcyBOQ0hBTiBpbnB1dCBjaGFubmVscyBhbmQgcGxhY2VzIHRvIE5DSEFOIG91dHB1dCBjaGFubmVscy4KKyAgICBpbiArPSAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpID8gZnJhbWVDb3VudCA6IGZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQ7CisgICAgdC0+aW4gPSBpbjsKK30KKworLyogVGhlIE1peGVyIGVuZ2luZSBnZW5lcmF0ZXMgZWl0aGVyIGludDMyX3QgKFE0XzI3KSBvciBmbG9hdCBkYXRhLgorICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgZW5naW5lIGJ1ZmZlcnMKKyAqIHRvIHRoZSBkZXNpcmVkIG1peGVyIG91dHB1dCBmb3JtYXQsIGVpdGhlciBpbnQxNl90IChRLjE1KSBvciBmbG9hdC4KKyAqLwordm9pZCBBdWRpb01peGVyOjpjb252ZXJ0TWl4ZXJGb3JtYXQodm9pZCAqb3V0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCwKKyAgICAgICAgdm9pZCAqaW4sIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIHNpemVfdCBzYW1wbGVDb3VudCkKK3sKKyAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbWVtY3B5KG91dCwgaW4sIHNhbXBsZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7IC8vIE1FTUNQWS4gVE9ETyBvcHRpbWl6ZSBvdXQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KChpbnQxNl90KilvdXQsIChmbG9hdCopaW4sIHNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3E0XzI3KChmbG9hdCopb3V0LCAoaW50MzJfdCopaW4sIHNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgLy8gdHdvIGludDE2X3QgYXJlIHByb2R1Y2VkIHBlciBpdGVyYXRpb24KKyAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90KilvdXQsIChpbnQzMl90Kilpbiwgc2FtcGxlQ291bnQgPj4gMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFJldHVybnMgdGhlIHByb3BlciB0cmFjayBob29rIHRvIHVzZSBmb3IgbWl4aW5nIHRoZSB0cmFjayBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICovCitBdWRpb01peGVyOjpob29rX3QgQXVkaW9NaXhlcjo6Z2V0VHJhY2tIb29rKGludCB0cmFja1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQgX191bnVzZWQpCit7CisgICAgaWYgKCFrVXNlTmV3TWl4ZXIgJiYgY2hhbm5lbENvdW50ID09IEZDQ18yICYmIG1peGVySW5Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9QOgorICAgICAgICAgICAgcmV0dXJuIHRyYWNrX19ub3A7CisgICAgICAgIGNhc2UgVFJBQ0tUWVBFX1JFU0FNUExFOgorICAgICAgICAgICAgcmV0dXJuIHRyYWNrX19nZW5lcmljUmVzYW1wbGU7CisgICAgICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05POgorICAgICAgICAgICAgcmV0dXJuIHRyYWNrX18xNkJpdHNNb25vOworICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFOgorICAgICAgICAgICAgcmV0dXJuIHRyYWNrX18xNkJpdHNTdGVyZW87CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgdHJhY2tUeXBlOiAlZCIsIHRyYWNrVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNoYW5uZWxDb3VudCA+IE1BWF9OVU1fQ0hBTk5FTFMpOworICAgIHN3aXRjaCAodHJhY2tUeXBlKSB7CisgICAgY2FzZSBUUkFDS1RZUEVfTk9QOgorICAgICAgICByZXR1cm4gdHJhY2tfX25vcDsKKyAgICBjYXNlIFRSQUNLVFlQRV9SRVNBTVBMRToKKyAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fUmVzYW1wbGU8TUlYVFlQRV9NVUxUSSwgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIGludDMyX3QgLypUQSovPjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KVwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX1Jlc2FtcGxlPE1JWFRZUEVfTVVMVEksIGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk86CisgICAgICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NT05PRVhQQU5ELCBmbG9hdCwgZmxvYXQsIGludDMyX3Q+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19Ob1Jlc2FtcGxlPE1JWFRZUEVfTU9OT0VYUEFORCwgaW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFOgorICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19Ob1Jlc2FtcGxlPE1JWFRZUEVfTVVMVEksIGZsb2F0LCBmbG9hdCwgaW50MzJfdD47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NVUxUSSwgaW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgdHJhY2tUeXBlOiAlZCIsIHRyYWNrVHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJucyB0aGUgcHJvcGVyIHByb2Nlc3MgaG9vayBmb3IgbWl4aW5nIHRyYWNrcy4gQ3VycmVudGx5IHdvcmtzIG9ubHkgZm9yCisgKiBQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssIGEgbWl4IGludm9sdmluZyBvbmUgdHJhY2ssIG5vIHJlc2FtcGxpbmcuCisgKgorICogVE9ETzogRHVlIHRvIHRoZSBzcGVjaWFsIG1peGluZyBjb25zaWRlcmF0aW9ucyBvZiBkdXBsaWNhdGluZyB0bworICogYSBzdGVyZW8gb3V0cHV0IHRyYWNrLCB0aGUgaW5wdXQgdHJhY2sgY2Fubm90IGJlIE1PTk8uICBUaGlzIHNob3VsZCBiZQorICogcHJldmVudGVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK0F1ZGlvTWl4ZXI6OnByb2Nlc3NfaG9va190IEF1ZGlvTWl4ZXI6OmdldFByb2Nlc3NIb29rKGludCBwcm9jZXNzVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCkKK3sKKyAgICBpZiAocHJvY2Vzc1R5cGUgIT0gUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLKSB7IC8vIE9ubHkgTk9SRVNBTVBMRU9ORVRSQUNLCisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBwcm9jZXNzVHlwZTogJWQiLCBwcm9jZXNzVHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIWtVc2VOZXdNaXhlciAmJiBjaGFubmVsQ291bnQgPT0gRkNDXzIgJiYgbWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc7CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUyk7CisgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgaW50MzJfdCAvKlRBKi8+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrPE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCisgICAgICAgICAgICAgICAgICAgIGludDE2X3QsIGZsb2F0LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQsIGludDE2X3QsIGludDMyX3Q+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrPE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCisgICAgICAgICAgICAgICAgICAgIGludDE2X3QsIGludDE2X3QsIGludDMyX3Q+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKaW5kZXggNDNhZWI4Ni4uM2I5NzJiYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCkBAIC0yNiwxMCArMjYsMTMgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKIAotI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2Rvd25taXguaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgogCisvLyBGSVhNRSBUaGlzIGlzIGFjdHVhbGx5IHVuaXR5IGdhaW4sIHdoaWNoIG1pZ2h0IG5vdCBiZSBtYXggaW4gZnV0dXJlLCBleHByZXNzZWQgaW4gVS4xMgorI2RlZmluZSBNQVhfR0FJTl9JTlQgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00OCwxNCArNTEsMTQgQEAKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9UUkFDS1MgPSAzMjsKICAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgdGhlIG1peGVyCiAKLSAgICAvLyBUaGlzIG1peGVyIGhhcyBhIGhhcmQtY29kZWQgdXBwZXIgbGltaXQgb2YgMiBjaGFubmVscyBmb3Igb3V0cHV0LgotICAgIC8vIFRoZXJlIGlzIHN1cHBvcnQgZm9yID4gMiBjaGFubmVsIHRyYWNrcyBkb3duLW1peGVkIHRvIDIgY2hhbm5lbCBvdXRwdXQgdmlhIGEgZG93bi1taXggZWZmZWN0LgotICAgIC8vIEFkZGluZyBzdXBwb3J0IGZvciA+IDIgY2hhbm5lbCBvdXRwdXQgd291bGQgcmVxdWlyZSBtb3JlIHRoYW4gc2ltcGx5IGNoYW5naW5nIHRoaXMgdmFsdWUuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fQ0hBTk5FTFMgPSAyOworICAgIC8vIFRoaXMgbWl4ZXIgaGFzIGEgaGFyZC1jb2RlZCB1cHBlciBsaW1pdCBvZiA4IGNoYW5uZWxzIGZvciBvdXRwdXQuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fQ0hBTk5FTFMgPSA4OworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX1ZPTFVNRVMgPSAyOyAvLyBzdGVyZW8gdm9sdW1lIG9ubHkKICAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgZm9yIHRoZSBjb250ZW50Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCA9IDg7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCA9IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOwogCi0gICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IFVOSVRZX0dBSU4gPSAweDEwMDA7CisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IFVOSVRZX0dBSU5fSU5UID0gMHgxMDAwOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCAgICBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKIAogICAgIGVudW0geyAvLyBuYW1lcwogCkBAIC03Nyw2ICs4MCw4IEBACiAgICAgICAgIE1BSU5fQlVGRkVSICAgICA9IDB4NDAwMiwKICAgICAgICAgQVVYX0JVRkZFUiAgICAgID0gMHg0MDAzLAogICAgICAgICBET1dOTUlYX1RZUEUgICAgPSAwWDQwMDQsCisgICAgICAgIE1JWEVSX0ZPUk1BVCAgICA9IDB4NDAwNSwgLy8gQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQorICAgICAgICBNSVhFUl9DSEFOTkVMX01BU0sgPSAweDQwMDYsIC8vIENoYW5uZWwgbWFzayBmb3IgbWl4ZXIgb3V0cHV0CiAgICAgICAgIC8vIGZvciB0YXJnZXQgUkVTQU1QTEUKICAgICAgICAgU0FNUExFX1JBVEUgICAgID0gMHg0MTAwLCAvLyBDb25maWd1cmUgc2FtcGxlIHJhdGUgY29udmVyc2lvbiBvbiB0aGlzIHRyYWNrIG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgdGhlIG5ldyBzYW1wbGUgcmF0ZSBpbiBIei4KQEAgLTkwLDYgKzk1LDcgQEAKICAgICAgICAgUkVNT1ZFICAgICAgICAgID0gMHg0MTAyLCAvLyBSZW1vdmUgdGhlIHNhbXBsZSByYXRlIGNvbnZlcnRlciBvbiB0aGlzIHRyYWNrIG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyYWNrIGlzIHJlc3RvcmVkIHRvIHRoZSBtaXggc2FtcGxlIHJhdGUuCiAgICAgICAgIC8vIGZvciB0YXJnZXQgUkFNUF9WT0xVTUUgYW5kIFZPTFVNRSAoOCBjaGFubmVscyBtYXgpCisgICAgICAgIC8vIEZJWE1FIHVzZSBmbG9hdCBmb3IgdGhlc2UgMyB0byBpbXByb3ZlIHRoZSBkeW5hbWljIHJhbmdlCiAgICAgICAgIFZPTFVNRTAgICAgICAgICA9IDB4NDIwMCwKICAgICAgICAgVk9MVU1FMSAgICAgICAgID0gMHg0MjAxLAogICAgICAgICBBVVhMRVZFTCAgICAgICAgPSAweDQyMTAsCkBAIC05OSw3ICsxMDUsMTAgQEAKICAgICAvLyBGb3IgYWxsIEFQSXMgd2l0aCAibmFtZSI6IFRSQUNLMCA8PSBuYW1lIDwgVFJBQ0swICsgTUFYX05VTV9UUkFDS1MKIAogICAgIC8vIEFsbG9jYXRlIGEgdHJhY2sgbmFtZS4gIFJldHVybnMgbmV3IHRyYWNrIG5hbWUgaWYgc3VjY2Vzc2Z1bCwgLTEgb24gZmFpbHVyZS4KLSAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWUoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpOworICAgIC8vIFRoZSBmYWlsdXJlIGNvdWxkIGJlIGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBjaGFubmVsTWFzayBvciBmb3JtYXQsIG9yIHRoYXQKKyAgICAvLyB0aGUgdHJhY2sgY2FwYWNpdHkgb2YgdGhlIG1peGVyIGlzIGV4Y2VlZGVkLgorICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKTsKIAogICAgIC8vIEZyZWUgYW4gYWxsb2NhdGVkIHRyYWNrIGJ5IG5hbWUKICAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWUoaW50IG5hbWUpOwpAQCAtMTE3LDM1ICsxMjYsMzQgQEAKIAogICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoaW50IG5hbWUpIGNvbnN0OwogCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRQY21UcmFja0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCB8fAorICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQgfHwKKyAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQgfHwKKyAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICB9CisKIHByaXZhdGU6CiAKICAgICBlbnVtIHsKKyAgICAgICAgLy8gRklYTUUgdGhpcyByZXByZXNlbnRhdGlvbiBwZXJtaXRzIHVwIHRvIDggY2hhbm5lbHMKICAgICAgICAgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSyAgID0gMHgwMDAwMDAwNywKLSAgICAgICAgTkVFRFNfRk9STUFUX19NQVNLICAgICAgICAgID0gMHgwMDAwMDBGMCwKLSAgICAgICAgTkVFRFNfTVVURV9fTUFTSyAgICAgICAgICAgID0gMHgwMDAwMDEwMCwKLSAgICAgICAgTkVFRFNfUkVTQU1QTEVfX01BU0sgICAgICAgID0gMHgwMDAwMTAwMCwKLSAgICAgICAgTkVFRFNfQVVYX19NQVNLICAgICAgICAgICAgID0gMHgwMDAxMDAwMCwKICAgICB9OwogCiAgICAgZW51bSB7Ci0gICAgICAgIE5FRURTX0NIQU5ORUxfMSAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgIE5FRURTX0NIQU5ORUxfMiAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgICAgICAgIE5FRURTX0NIQU5ORUxfMSAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsICAgLy8gbW9ubworICAgICAgICBORUVEU19DSEFOTkVMXzIgICAgICAgICAgICAgPSAweDAwMDAwMDAxLCAgIC8vIHN0ZXJlbwogCi0gICAgICAgIE5FRURTX0ZPUk1BVF8xNiAgICAgICAgICAgICA9IDB4MDAwMDAwMTAsCisgICAgICAgIC8vIHNhbXBsZSBmb3JtYXQgaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBhbmQgaXMgYXNzdW1lZCB0byBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAogCi0gICAgICAgIE5FRURTX01VVEVfRElTQUJMRUQgICAgICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgIE5FRURTX01VVEVfRU5BQkxFRCAgICAgICAgICA9IDB4MDAwMDAxMDAsCi0KLSAgICAgICAgTkVFRFNfUkVTQU1QTEVfRElTQUJMRUQgICAgID0gMHgwMDAwMDAwMCwKLSAgICAgICAgTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCAgICAgID0gMHgwMDAwMTAwMCwKLQotICAgICAgICBORUVEU19BVVhfRElTQUJMRUQgICAgID0gMHgwMDAwMDAwMCwKLSAgICAgICAgTkVFRFNfQVVYX0VOQUJMRUQgICAgICA9IDB4MDAwMTAwMDAsCisgICAgICAgIE5FRURTX01VVEUgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxMDAsCisgICAgICAgIE5FRURTX1JFU0FNUExFICAgICAgICAgICAgICA9IDB4MDAwMDEwMDAsCisgICAgICAgIE5FRURTX0FVWCAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTAwMDAsCiAgICAgfTsKIAogICAgIHN0cnVjdCBzdGF0ZV90OwogICAgIHN0cnVjdCB0cmFja190OwotICAgIGNsYXNzIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOworICAgIGNsYXNzIENvcHlCdWZmZXJQcm92aWRlcjsKIAogICAgIHR5cGVkZWYgdm9pZCAoKmhvb2tfdCkodHJhY2tfdCogdCwgaW50MzJfdCogb3V0cHV0LCBzaXplX3QgbnVtT3V0RnJhbWVzLCBpbnQzMl90KiB0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKQEAgLTE1NCwxNiArMTYyLDE3IEBACiAgICAgc3RydWN0IHRyYWNrX3QgewogICAgICAgICB1aW50MzJfdCAgICBuZWVkczsKIAorICAgICAgICAvLyBUT0RPOiBFdmVudHVhbGx5IHJlbW92ZSBsZWdhY3kgaW50ZWdlciB2b2x1bWUgc2V0dGluZ3MKICAgICAgICAgdW5pb24gewotICAgICAgICBpbnQxNl90ICAgICB2b2x1bWVbTUFYX05VTV9DSEFOTkVMU107IC8vIFswXTMuMTIgZml4ZWQgcG9pbnQKKyAgICAgICAgaW50MTZfdCAgICAgdm9sdW1lW01BWF9OVU1fVk9MVU1FU107IC8vIFU0LjEyIGZpeGVkIHBvaW50ICh0b3AgYml0IHNob3VsZCBiZSB6ZXJvKQogICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVSTDsKICAgICAgICAgfTsKIAotICAgICAgICBpbnQzMl90ICAgICBwcmV2Vm9sdW1lW01BWF9OVU1fQ0hBTk5FTFNdOworICAgICAgICBpbnQzMl90ICAgICBwcmV2Vm9sdW1lW01BWF9OVU1fVk9MVU1FU107CiAKICAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQogCi0gICAgICAgIGludDMyX3QgICAgIHZvbHVtZUluY1tNQVhfTlVNX0NIQU5ORUxTXTsKKyAgICAgICAgaW50MzJfdCAgICAgdm9sdW1lSW5jW01BWF9OVU1fVk9MVU1FU107CiAgICAgICAgIGludDMyX3QgICAgIGF1eEluYzsKICAgICAgICAgaW50MzJfdCAgICAgcHJldkF1eExldmVsOwogCkBAIC0xNzMsNyArMTgyLDcgQEAKICAgICAgICAgdWludDE2X3QgICAgZnJhbWVDb3VudDsKIAogICAgICAgICB1aW50OF90ICAgICBjaGFubmVsQ291bnQ7ICAgLy8gMSBvciAyLCByZWR1bmRhbnQgd2l0aCAobmVlZHMgJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKQotICAgICAgICB1aW50OF90ICAgICBmb3JtYXQ7ICAgICAgICAgLy8gYWx3YXlzIDE2CisgICAgICAgIHVpbnQ4X3QgICAgIHVudXNlZF9wYWRkaW5nOyAvLyBmb3JtZXJseSBmb3JtYXQsIHdhcyBhbHdheXMgMTYKICAgICAgICAgdWludDE2X3QgICAgZW5hYmxlZDsgICAgICAgIC8vIGFjdHVhbGx5IGJvb2wKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CiAKQEAgLTE5Niw0OCArMjA1LDE1OSBAQAogICAgICAgICBpbnQzMl90KiAgICAgICAgICAgYXV4QnVmZmVyOwogCiAgICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKLQotICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciogZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7IC8vIDQgYnl0ZXMKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKiAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOyAvLyBwcm92aWRlciB3cmFwcGVyIGZvciByZWZvcm1hdHRpbmcuCisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlciogICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsgLy8gd3JhcHBlciBmb3IgY2hhbm5lbCBjb252ZXJzaW9uLgogCiAgICAgICAgIGludDMyX3QgICAgIHNlc3Npb25JZDsKIAotICAgICAgICBpbnQzMl90ICAgICBwYWRkaW5nWzJdOworICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckZvcm1hdDsgICAgIC8vIG91dHB1dCBtaXggZm9ybWF0OiBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7ICAgICAgICAgIC8vIGlucHV0IHRyYWNrIGZvcm1hdAorICAgICAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJJbkZvcm1hdDsgICAvLyBtaXggaW50ZXJuYWwgZm9ybWF0IEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaCB0cmFjayBtdXN0IGJlIGNvbnZlcnRlZCB0byB0aGlzIGZvcm1hdC4KKworICAgICAgICBmbG9hdCAgICAgICAgICBtVm9sdW1lW01BWF9OVU1fVk9MVU1FU107ICAgICAvLyBmbG9hdGluZyBwb2ludCBzZXQgdm9sdW1lCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1QcmV2Vm9sdW1lW01BWF9OVU1fVk9MVU1FU107IC8vIGZsb2F0aW5nIHBvaW50IHByZXZpb3VzIHZvbHVtZQorICAgICAgICBmbG9hdCAgICAgICAgICBtVm9sdW1lSW5jW01BWF9OVU1fVk9MVU1FU107ICAvLyBmbG9hdGluZyBwb2ludCB2b2x1bWUgaW5jcmVtZW50CisKKyAgICAgICAgZmxvYXQgICAgICAgICAgbUF1eExldmVsOyAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHNldCBhdXggbGV2ZWwKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVByZXZBdXhMZXZlbDsgICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHByZXYgYXV4IGxldmVsCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1BdXhJbmM7ICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBhdXggaW5jcmVtZW50CiAKICAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtTWl4ZXJDaGFubmVsTWFzazsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbENvdW50OwogCi0gICAgICAgIGJvb2wgICAgICAgIHNldFJlc2FtcGxlcih1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKTsKKyAgICAgICAgYm9vbCAgICAgICAgbmVlZHNSYW1wKCkgeyByZXR1cm4gKHZvbHVtZUluY1swXSB8IHZvbHVtZUluY1sxXSB8IGF1eEluYykgIT0gMDsgfQorICAgICAgICBib29sICAgICAgICBzZXRSZXNhbXBsZXIodWludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKTsKICAgICAgICAgYm9vbCAgICAgICAgZG9lc1Jlc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gcmVzYW1wbGVyICE9IE5VTEw7IH0KICAgICAgICAgdm9pZCAgICAgICAgcmVzZXRSZXNhbXBsZXIoKSB7IGlmIChyZXNhbXBsZXIgIT0gTlVMTCkgcmVzYW1wbGVyLT5yZXNldCgpOyB9Ci0gICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgpOworICAgICAgICB2b2lkICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4LCBib29sIHVzZUZsb2F0ID0gZmFsc2UpOwogICAgICAgICBzaXplX3QgICAgICBnZXRVbnJlbGVhc2VkRnJhbWVzKCkgY29uc3QgeyByZXR1cm4gcmVzYW1wbGVyICE9IE5VTEwgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcygpIDogMDsgfTsKICAgICB9OwogCisgICAgdHlwZWRlZiB2b2lkICgqcHJvY2Vzc19ob29rX3QpKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cyk7CisKICAgICAvLyBwYWQgdG8gMzItYnl0ZXMgdG8gZmlsbCBjYWNoZSBsaW5lCiAgICAgc3RydWN0IHN0YXRlX3QgewogICAgICAgICB1aW50MzJfdCAgICAgICAgZW5hYmxlZFRyYWNrczsKICAgICAgICAgdWludDMyX3QgICAgICAgIG5lZWRzQ2hhbmdlZDsKICAgICAgICAgc2l6ZV90ICAgICAgICAgIGZyYW1lQ291bnQ7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICAoKmhvb2spKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cyk7ICAgLy8gb25lIG9mIHByb2Nlc3NfXyosIG5ldmVyIE5VTEwKKyAgICAgICAgcHJvY2Vzc19ob29rX3QgIGhvb2s7ICAgLy8gb25lIG9mIHByb2Nlc3NfXyosIG5ldmVyIE5VTEwKICAgICAgICAgaW50MzJfdCAgICAgICAgICpvdXRwdXRUZW1wOwogICAgICAgICBpbnQzMl90ICAgICAgICAgKnJlc2FtcGxlVGVtcDsKICAgICAgICAgTkJMb2c6OldyaXRlciogIG1Mb2c7CiAgICAgICAgIGludDMyX3QgICAgICAgICByZXNlcnZlZFsxXTsKICAgICAgICAgLy8gRklYTUUgYWxsb2NhdGUgZHluYW1pY2FsbHkgdG8gc2F2ZSBzb21lIG1lbW9yeSB3aGVuIG1heE51bVRyYWNrcyA8IE1BWF9OVU1fVFJBQ0tTCi0gICAgICAgIHRyYWNrX3QgICAgICAgICB0cmFja3NbTUFYX05VTV9UUkFDS1NdOyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworICAgICAgICB0cmFja190ICAgICAgICAgdHJhY2tzW01BWF9OVU1fVFJBQ0tTXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwogICAgIH07CiAKLSAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIHRoYXQgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIGJ5IGEgY2FsbCB0byBhIGRvd25taXggZWZmZWN0Ci0gICAgY2xhc3MgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7CisgICAgLy8gQmFzZSBBdWRpb0J1ZmZlclByb3ZpZGVyIGNsYXNzIHVzZWQgZm9yIERvd25NaXhlckJ1ZmZlclByb3ZpZGVyLCBSZW1peEJ1ZmZlclByb3ZpZGVyLAorICAgIC8vIGFuZCBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLgorICAgIC8vIEl0IGhhbmRsZXMgYSBwcml2YXRlIGJ1ZmZlciBmb3IgdXNlIGluIGNvbnZlcnRpbmcgZm9ybWF0IG9yIGNoYW5uZWwgbWFza3MgZnJvbSB0aGUKKyAgICAvLyBpbnB1dCBkYXRhIHRvIGEgZm9ybSBhY2NlcHRhYmxlIGJ5IHRoZSBtaXhlci4KKyAgICAvLyBUT0RPOiBNYWtlIGEgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgd2hlbiBpbnRlZ2VycyBhcmUgZW50aXJlbHkgcmVtb3ZlZCBmcm9tIHRoZQorICAgIC8vIHByb2Nlc3NpbmcgcGlwZWxpbmUuCisgICAgY2xhc3MgQ29weUJ1ZmZlclByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgewogICAgIHB1YmxpYzoKKyAgICAgICAgLy8gVXNlIGEgcHJpdmF0ZSBidWZmZXIgb2YgYnVmZmVyRnJhbWVDb3VudCBmcmFtZXMgKGVhY2ggZnJhbWUgaXMgb3V0cHV0RnJhbWVTaXplIGJ5dGVzKS4KKyAgICAgICAgLy8gSWYgYnVmZmVyRnJhbWVDb3VudCBpcyAwLCBubyBwcml2YXRlIGJ1ZmZlciBpcyBjcmVhdGVkIGFuZCBpbi1wbGFjZSBtb2RpZmljYXRpb24gb2YKKyAgICAgICAgLy8gdGhlIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlcidzIGJ1ZmZlcnMgaXMgcGVyZm9ybWVkIGJ5IGNvcHlGcmFtZXMoKS4KKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHZpcnR1YWwgfkNvcHlCdWZmZXJQcm92aWRlcigpOworCisgICAgICAgIC8vIE92ZXJyaWRlcyBBdWRpb0J1ZmZlclByb3ZpZGVyIG1ldGhvZHMKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKLSAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKTsKLSAgICAgICAgdmlydHVhbCB+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKTsKIAorICAgICAgICAvLyBPdGhlciBwdWJsaWMgbWV0aG9kcworCisgICAgICAgIC8vIGNhbGwgdGhpcyB0byByZWxlYXNlIHRoZSBidWZmZXIgdG8gdGhlIHVwc3RyZWFtIHByb3ZpZGVyLgorICAgICAgICAvLyB0cmVhdCBpdCBhcyBhbiBhdWRpbyBkaXNjb250aW51aXR5IGZvciBmdXR1cmUgc2FtcGxlcy4KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuICBJdCBjb252ZXJ0cworICAgICAgICAvLyAjZnJhbWVzIGluIHRoZSAqc3JjIHBvaW50ZXIgdG8gdGhlICpkc3QgcG9pbnRlci4gIEl0IGlzIHB1YmxpYyBiZWNhdXNlCisgICAgICAgIC8vIHNvbWUgcHJvdmlkZXJzIHdpbGwgYWxsb3cgdGhpcyB0byB3b3JrIG9uIGFyYml0cmFyeSBidWZmZXJzIG91dHNpZGUKKyAgICAgICAgLy8gb2YgdGhlIGludGVybmFsIGJ1ZmZlcnMuCisgICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSA9IDA7CisKKyAgICAgICAgLy8gc2V0IHRoZSB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIuIENvbnNpZGVyIGNhbGxpbmcgInJlc2V0IiBiZWZvcmUgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSB7CisgICAgICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlciA9IHA7CisgICAgICAgIH0KKworICAgIHByb3RlY3RlZDoKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbVRyYWNrQnVmZmVyUHJvdmlkZXI7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbnB1dEZyYW1lU2l6ZTsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dHB1dEZyYW1lU2l6ZTsKKyAgICBwcml2YXRlOgorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgbUJ1ZmZlcjsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudDsKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgbUxvY2FsQnVmZmVyRGF0YTsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnN1bWVkOworICAgIH07CisKKyAgICAvLyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdG8gcHJvdmlkZQorICAgIC8vIHBvc2l0aW9uIGRlcGVuZGVudCBkb3dubWl4aW5nIGJ5IGFuIEF1ZGlvIEVmZmVjdC4KKyAgICBjbGFzcyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3Qgc2Vzc2lvbklkLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHZpcnR1YWwgfkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKyAgICAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbURvd25taXhIYW5kbGUgIT0gTlVMTDsgfQorCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0KCk7CisgICAgICAgIHN0YXRpYyBib29sIGlzTXVsdGljaGFubmVsQ2FwYWJsZSgpIHsgcmV0dXJuIHNJc011bHRpY2hhbm5lbENhcGFibGU7IH0KKworICAgIHByb3RlY3RlZDoKICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAgIG1Eb3dubWl4SGFuZGxlOwogICAgICAgICBlZmZlY3RfY29uZmlnX3QgICAgbURvd25taXhDb25maWc7CisKKyAgICAgICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBkb3dubWl4ZXIgdXNlZCBieSB0aGUgbWl4ZXIKKyAgICAgICAgc3RhdGljIGVmZmVjdF9kZXNjcmlwdG9yX3Qgc0R3bm1GeERlc2M7CisgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIGEgZG93bm1peCBlZmZlY3QgaGFzIGJlZW4gZm91bmQgYW5kIGlzIHVzYWJsZSBieSB0aGlzIG1peGVyCisgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgICAgIHNJc011bHRpY2hhbm5lbENhcGFibGU7CisgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgd2UgYWxsb3cgZWZmZWN0cyBvdXRzaWRlIG9mIHRoZSBmcmFtZXdvcms/CisgICAgICAgIC8vIFdlIG5lZWQgdG8gaGVyZS4gQSBzcGVjaWFsIGlvSWQgdGhhdCBtdXN0IGJlIDw9IC0yIHNvIGl0IGRvZXMgbm90IG1hcCB0byBhIHNlc3Npb24uCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFNFU1NJT05fSURfSU5WQUxJRF9BTkRfSUdOT1JFRCA9IC0yOworICAgIH07CisKKyAgICAvLyBSZW1peEJ1ZmZlclByb3ZpZGVyIHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciB0byBwZXJmb3JtIGFuCisgICAgLy8gdXBtaXggb3IgZG93bm1peCB0byB0aGUgcHJvcGVyIGNoYW5uZWwgY291bnQgYW5kIG1hc2suCisgICAgY2xhc3MgUmVtaXhCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVtaXhCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1TYW1wbGVTaXplOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5wdXRDaGFubmVsczsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dHB1dENoYW5uZWxzOworICAgICAgICBpbnQ4X3QgICAgICAgICAgICAgICBtSWR4QXJ5W3NpemVvZih1aW50MzJfdCkqOF07IC8vIDMyIGJpdHMgPT4gY2hhbm5lbCBpbmRpY2VzCisgICAgfTsKKworICAgIC8vIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIHRvIGNvbnZlcnQgdGhlIGlucHV0IGRhdGEKKyAgICAvLyB0byBhbiBhY2NlcHRhYmxlIG1peGVyIGlucHV0IGZvcm1hdCB0eXBlLgorICAgIGNsYXNzIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVscywKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCwgYXVkaW9fZm9ybWF0X3Qgb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBjb25zdCBpbnQzMl90ICAgICAgICBtQ2hhbm5lbHM7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1JbnB1dEZvcm1hdDsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbU91dHB1dEZvcm1hdDsKICAgICB9OwogCiAgICAgLy8gYml0bWFzayBvZiBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMsIHdoZXJlIGJpdCAwIGNvcnJlc3BvbmRzIHRvIFRSQUNLMCBldGMuCkBAIC0yNTUsMTggKzM3NSwyMCBAQAogcHJpdmF0ZToKICAgICBzdGF0ZV90ICAgICAgICAgbVN0YXRlIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAKLSAgICAvLyBlZmZlY3QgZGVzY3JpcHRvciBmb3IgdGhlIGRvd25taXhlciB1c2VkIGJ5IHRoZSBtaXhlcgotICAgIHN0YXRpYyBlZmZlY3RfZGVzY3JpcHRvcl90IGR3bm1GeERlc2M7Ci0gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgYSBkb3dubWl4IGVmZmVjdCBoYXMgYmVlbiBmb3VuZCBhbmQgaXMgdXNhYmxlIGJ5IHRoaXMgbWl4ZXIKLSAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICBpc011bHRpY2hhbm5lbENhcGFibGU7Ci0KICAgICAvLyBDYWxsIGFmdGVyIGNoYW5naW5nIGVpdGhlciB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgYSB0cmFjaywgb3IgcGFyYW1ldGVycyBvZiBhbiBlbmFibGVkIHRyYWNrLgogICAgIC8vIE9LIHRvIGNhbGwgbW9yZSBvZnRlbiB0aGFuIHRoYXQsIGJ1dCB1bm5lY2Vzc2FyeS4KICAgICB2b2lkIGludmFsaWRhdGVTdGF0ZSh1aW50MzJfdCBtYXNrKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTnVtLCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrKTsKKyAgICBib29sIHNldENoYW5uZWxNYXNrcyhpbnQgbmFtZSwKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2ssIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2spOworCisgICAgLy8gVE9ETzogcmVtb3ZlIHVudXNlZCB0cmFja05hbWUvdHJhY2tOdW0gZnJvbSBmdW5jdGlvbnMgYmVsb3cuCisgICAgc3RhdGljIHN0YXR1c190IGluaXRUcmFja0Rvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgcHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSk7CiAgICAgc3RhdGljIHZvaWQgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSk7CisgICAgc3RhdGljIHN0YXR1c190IHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTnVtKTsKKyAgICBzdGF0aWMgdm9pZCB1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSk7CisgICAgc3RhdGljIHZvaWQgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnModHJhY2tfdCogcFRyYWNrKTsKIAogICAgIHN0YXRpYyB2b2lkIHRyYWNrX19nZW5lcmljUmVzYW1wbGUodHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLAogICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKQEAgLTI4NiwxMCArNDA4LDYgQEAKICAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpOwogICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKTsKLSNpZiAwCi0gICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fVHdvVHJhY2tzMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyk7Ci0jZW5kaWYKIAogICAgIHN0YXRpYyBpbnQ2NF90IGNhbGN1bGF0ZU91dHB1dFBUUyhjb25zdCB0cmFja190JiB0LCBpbnQ2NF90IGJhc2VQVFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRGcmFtZUluZGV4KTsKQEAgLTI5Nyw2ICs0MTUsNTMgQEAKICAgICBzdGF0aWMgdWludDY0X3QgICAgICAgICBzTG9jYWxUaW1lRnJlcTsKICAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgICBzT25jZUNvbnRyb2w7CiAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgc0luaXRSb3V0aW5lKCk7CisKKyAgICAvKiBtdWx0aS1mb3JtYXQgdm9sdW1lIG1peGluZyBmdW5jdGlvbiAoY2FsbHMgdGVtcGxhdGUgZnVuY3Rpb25zCisgICAgICogaW4gQXVkaW9NaXhlck9wcy5oKS4gIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogICBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgICAgICogICBVU0VGTE9BVFZPTCAoc2V0IHRvIHRydWUgaWYgZmxvYXQgdm9sdW1lIGlzIHVzZWQpCisgICAgICogICBBREpVU1RWT0wgICAoc2V0IHRvIHRydWUgaWYgdm9sdW1lIHJhbXAgcGFyYW1ldGVycyBuZWVkcyBhZGp1c3RtZW50IGFmdGVyd2FyZHMpCisgICAgICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgICAgICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICAgICAqICAgVEE6IGludDMyX3QgKFE0LjI3KQorICAgICAqLworICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgYm9vbCBVU0VGTE9BVFZPTCwgYm9vbCBBREpVU1RWT0wsCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgc3RhdGljIHZvaWQgdm9sdW1lTWl4KFRPICpvdXQsIHNpemVfdCBvdXRGcmFtZXMsCisgICAgICAgICAgICBjb25zdCBUSSAqaW4sIFRBICphdXgsIGJvb2wgcmFtcCwgQXVkaW9NaXhlcjo6dHJhY2tfdCAqdCk7CisKKyAgICAvLyBtdWx0aS1mb3JtYXQgcHJvY2VzcyBob29rcworICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjayhzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpOworCisgICAgLy8gbXVsdGktZm9ybWF0IHRyYWNrIGhvb2tzCisgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgIHN0YXRpYyB2b2lkIHRyYWNrX19SZXNhbXBsZSh0cmFja190KiB0LCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KTsKKyAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgc3RhdGljIHZvaWQgdHJhY2tfX05vUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCk7CisKKyAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TWl4ZXJGb3JtYXQodm9pZCAqb3V0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCwKKyAgICAgICAgICAgIHZvaWQgKmluLCBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBzaXplX3Qgc2FtcGxlQ291bnQpOworCisgICAgLy8gaG9vayB0eXBlcworICAgIGVudW0geworICAgICAgICBQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssCisgICAgfTsKKyAgICBlbnVtIHsKKyAgICAgICAgVFJBQ0tUWVBFX05PUCwKKyAgICAgICAgVFJBQ0tUWVBFX1JFU0FNUExFLAorICAgICAgICBUUkFDS1RZUEVfTk9SRVNBTVBMRSwKKyAgICAgICAgVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05PLAorICAgIH07CisKKyAgICAvLyBmdW5jdGlvbnMgZm9yIGRldGVybWluaW5nIHRoZSBwcm9wZXIgcHJvY2VzcyBhbmQgdHJhY2sgaG9va3MuCisgICAgc3RhdGljIHByb2Nlc3NfaG9va190IGdldFByb2Nlc3NIb29rKGludCBwcm9jZXNzVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpOworICAgIHN0YXRpYyBob29rX3QgZ2V0VHJhY2tIb29rKGludCB0cmFja1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Mzc2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX01JWEVSX09QU19ICisjZGVmaW5lIEFORFJPSURfQVVESU9fTUlYRVJfT1BTX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBCZWhhdmlvciBvZiBpc19zYW1lPD46OnZhbHVlIGlzIHRydWUgaWYgdGhlIHR5cGVzIGFyZSBpZGVudGljYWwsCisgKiBmYWxzZSBvdGhlcndpc2UuIElkZW50aWNhbCB0byB0aGUgU1RMIHN0ZDo6aXNfc2FtZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBpc19zYW1lCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfc2FtZTxULCBUPiAgLy8gcGFydGlhbCBzcGVjaWFsaXphdGlvbgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKKworLyogTWl4TXVsIGlzIGEgbXVsdGlwbGljYXRpb24gb3BlcmF0b3IgdG8gc2NhbGUgYW4gYXVkaW8gaW5wdXQgc2lnbmFsCisgKiBieSBhIHZvbHVtZSBnYWluLCB3aXRoIHRoZSBmb3JtdWxhOgorICoKKyAqIE8odXRwdXQpID0gSShucHV0KSAqIFYob2x1bWUpCisgKgorICogVGhlIG91dHB1dCwgaW5wdXQsIGFuZCB2b2x1bWUgbWF5IGhhdmUgZGlmZmVyZW50IHR5cGVzLgorICogVGhlcmUgYXJlIDI3IHZhcmlhbnRzLCBvZiB3aGljaCAxNCBhcmUgYWN0dWFsbHkgZGVmaW5lZCBpbiBhbgorICogZXhwbGljaXRseSB0ZW1wbGF0ZWQgY2xhc3MuCisgKgorICogVGhlIGZvbGxvd2luZyB0eXBlIHZhcmlhYmxlcyBhbmQgdGhlIHVuZGVybHlpbmcgbWVhbmluZzoKKyAqCisgKiBPdXRwdXQgdHlwZSAgICAgICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEuMTUpIG9yIGZsb2F0IFstMSwxXQorICogSW5wdXQgc2lnbmFsIHR5cGUgVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRLjE1KSBvciBmbG9hdCBbLTEsMV0KKyAqIFZvbHVtZSB0eXBlICAgICAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0IFstMSwxXQorICoKKyAqIEZvciBoaWdoIHByZWNpc2lvbiBhdWRpbywgb25seSB0aGUgPFRPLCBUSSwgVFY+ID0gPGZsb2F0LCBmbG9hdCwgZmxvYXQ+CisgKiBuZWVkcyB0byBiZSBhY2NlbGVyYXRlZC4gVGhpcyBpcyBwZXJoYXBzIHRoZSBlYXNpZXN0IGZvcm0gdG8gZG8gcXVpY2tseSBhcyB3ZWxsLgorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWPgoraW5saW5lIFRPIE1peE11bChUSSB2YWx1ZSwgVFYgdm9sdW1lKSB7CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShmYWxzZSk7CisgICAgLy8gc2hvdWxkIG5vdCBiZSBoZXJlIDotKS4KKyAgICAvLyBUbyBhdm9pZCBtaXN0YWtlcywgdGhpcyB0ZW1wbGF0ZSBpcyBhbHdheXMgc3BlY2lhbGl6ZWQuCisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGludDE2X3Q+KGludDE2X3QgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGludDE2X3Q+KGludDMyX3QgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuICh2YWx1ZSA+PiAxMikgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD4oaW50MTZfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gdmFsdWUgKiAodm9sdW1lID4+IDE2KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQzMl90LCBpbnQzMl90PihpbnQzMl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHJldHVybiAodmFsdWUgPj4gMTIpICogKHZvbHVtZSA+PiAxNik7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBmbG9hdCwgaW50MTZfdD4oZmxvYXQgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDEyKTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiBub3JtOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgZmxvYXQsIGludDMyX3Q+KGZsb2F0IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMSA8PCAyOCk7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogbm9ybTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBmbG9hdCwgaW50MTZfdD4oZmxvYXQgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChNaXhNdWw8ZmxvYXQsIGZsb2F0LCBpbnQxNl90Pih2YWx1ZSwgdm9sdW1lKSk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgZmxvYXQsIGludDMyX3Q+KGZsb2F0IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2X2Zyb21fZmxvYXQoTWl4TXVsPGZsb2F0LCBmbG9hdCwgaW50MzJfdD4odmFsdWUsIHZvbHVtZSkpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgaW50MTZfdCwgaW50MTZfdD4oaW50MTZfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgKDE1ICsgMTIpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSAqIHN0YXRpY19jYXN0PGZsb2F0Pih2b2x1bWUpICogbm9ybTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGludDE2X3QsIGludDMyX3Q+KGludDE2X3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxVUxMIDw8ICgxNSArIDI4KSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkgKiBzdGF0aWNfY2FzdDxmbG9hdD4odm9sdW1lKSAqIG5vcm07Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgaW50MTZfdCwgaW50MTZfdD4oaW50MTZfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNihNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgaW50MTZfdD4odmFsdWUsIHZvbHVtZSkgPj4gMTIpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDMyX3QsIGludDE2X3Q+KGludDMyX3QgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTYoTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGludDE2X3Q+KHZhbHVlLCB2b2x1bWUpID4+IDEyKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PihpbnQxNl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2KE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90Pih2YWx1ZSwgdm9sdW1lKSA+PiAxMik7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgaW50MzJfdCwgaW50MzJfdD4oaW50MzJfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNihNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgaW50MzJfdD4odmFsdWUsIHZvbHVtZSkgPj4gMTIpOworfQorCisvKiBSZXF1aXJlZCBmb3IgZmxvYXRpbmcgcG9pbnQgdm9sdW1lLiAgU29tZSBhcmUgbmVlZGVkIGZvciBjb21waWxhdGlvbiBidXQKKyAqIGFyZSBub3QgbmVlZGVkIGluIGV4ZWN1dGlvbiBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgZmluYWwgYnVpbGQgYnkKKyAqIGFuIG9wdGltaXppbmcgY29tcGlsZXIuCisgKi8KK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBmbG9hdCwgZmxvYXQ+KGZsb2F0IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBpbnQxNl90LCBmbG9hdD4oaW50MTZfdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGZsb2F0X2Zyb21fcV8xNSA9IDEuIC8gKDEgPDwgMTUpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIGZsb2F0X2Zyb21fcV8xNTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQzMl90LCBmbG9hdD4oaW50MzJfdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGZsb2F0PiBSdW50aW1lIFNob3VsZCBub3QgYmUgaGVyZSIpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBmbG9hdD4oaW50MTZfdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGZsb2F0PiBSdW50aW1lIFNob3VsZCBub3QgYmUgaGVyZSIpOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB1NF8xMl9mcm9tX2Zsb2F0ID0gKDEgPDwgMTIpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIHU0XzEyX2Zyb21fZmxvYXQ7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgaW50MTZfdCwgZmxvYXQ+KGludDE2X3QgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIExPR19BTFdBWVNfRkFUQUwoIk1peE11bDxpbnQxNl90LCBpbnQxNl90LCBmbG9hdD4gUnVudGltZSBTaG91bGQgbm90IGJlIGhlcmUiKTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgZmxvYXQsIGZsb2F0PihmbG9hdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHFfMTVfZnJvbV9mbG9hdCA9ICgxIDw8IDE1KTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiBxXzE1X2Zyb21fZmxvYXQ7Cit9CisKKy8qCisgKiBNaXhBY2N1bSBpcyB1c2VkIHRvIGFkZCBpbnRvIGFuIGFjY3VtdWxhdG9yIHJlZ2lzdGVyIG9mIGEgcG9zc2libHkgZGlmZmVyZW50CisgKiB0eXBlLiBUaGUgVE8gYW5kIFRJIHR5cGVzIGFyZSB0aGUgc2FtZSBhcyBNaXhNdWwuCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUST4KK2lubGluZSB2b2lkIE1peEFjY3VtKFRPICphdXhhY2N1bSwgVEkgdmFsdWUpIHsKKyAgICBpZiAoIWlzX3NhbWU8VE8sIFRJPjo6dmFsdWUpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiTWl4QWNjdW0gdHlwZSBub3QgcHJvcGVybHkgc3BlY2lhbGl6ZWQ6ICV6dSAlenVcbiIsCisgICAgICAgICAgICAgICAgc2l6ZW9mKFRPKSwgc2l6ZW9mKFRJKSk7CisgICAgfQorICAgICphdXhhY2N1bSArPSB2YWx1ZTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgTWl4QWNjdW08ZmxvYXQsIGludDE2X3Q+KGZsb2F0ICphdXhhY2N1bSwgaW50MTZfdCB2YWx1ZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMSA8PCAxNSk7CisgICAgKmF1eGFjY3VtICs9IG5vcm0gKiB2YWx1ZTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgTWl4QWNjdW08ZmxvYXQsIGludDMyX3Q+KGZsb2F0ICphdXhhY2N1bSwgaW50MzJfdCB2YWx1ZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMSA8PCAyNyk7CisgICAgKmF1eGFjY3VtICs9IG5vcm0gKiB2YWx1ZTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgTWl4QWNjdW08aW50MzJfdCwgaW50MTZfdD4oaW50MzJfdCAqYXV4YWNjdW0sIGludDE2X3QgdmFsdWUpIHsKKyAgICAqYXV4YWNjdW0gKz0gdmFsdWUgPDwgMTI7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIE1peEFjY3VtPGludDMyX3QsIGZsb2F0PihpbnQzMl90ICphdXhhY2N1bSwgZmxvYXQgdmFsdWUpIHsKKyAgICAqYXV4YWNjdW0gKz0gY2xhbXBxNF8yN19mcm9tX2Zsb2F0KHZhbHVlKTsKK30KKworLyogTWl4TXVsQXV4IGlzIGp1c3QgbGlrZSBNaXhNdWwgZXhjZXB0IGl0IGNvbWJpbmVzIHdpdGgKKyAqIGFuIGFjY3VtdWxhdG9yIG9wZXJhdGlvbiBNaXhBY2N1bS4KKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEE+CitpbmxpbmUgVE8gTWl4TXVsQXV4KFRJIHZhbHVlLCBUViB2b2x1bWUsIFRBICphdXhhY2N1bSkgeworICAgIE1peEFjY3VtPFRBLCBUST4oYXV4YWNjdW0sIHZhbHVlKTsKKyAgICByZXR1cm4gTWl4TXVsPFRPLCBUSSwgVFY+KHZhbHVlLCB2b2x1bWUpOworfQorCisvKiBNSVhUWVBFIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0aGUgc2FtcGxlcyBpbiB0aGUgaW5wdXQgZnJhbWUKKyAqIGFyZSBtaXhlZCB3aXRoIHZvbHVtZSBnYWluIGludG8gdGhlIG91dHB1dCBmcmFtZS4KKyAqIFNlZSB0aGUgdm9sdW1lUmFtcE11bHRpIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLgorICovCitlbnVtIHsKKyAgICBNSVhUWVBFX01VTFRJLAorICAgIE1JWFRZUEVfTU9OT0VYUEFORCwKKyAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAorICAgIE1JWFRZUEVfTVVMVElfTU9OT1ZPTCwKKyAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0wsCit9OworCisvKgorICogVGhlIHZvbHVtZVJhbXBNdWx0aSBhbmQgdm9sdW1lUmFtcCBmdW5jdGlvbnMgdGFrZSBhIE1JWFRZUEUKKyAqIHdoaWNoIGluZGljYXRlcyB0aGUgcGVyLWZyYW1lIG1peGluZyBhbmQgYWNjdW11bGF0aW9uIHN0cmF0ZWd5LgorICoKKyAqIE1JWFRZUEVfTVVMVEk6CisgKiAgIE5DSEFOIHJlcHJlc2VudHMgbnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbHMuCisgKiAgIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqICAgVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqICAgVFY6IGludDMyX3QgKFU0LjI4KSBvciBpbnQxNl90IChVNC4xMikgb3IgZmxvYXQKKyAqICAgdm9sOiByZXByZXNlbnRzIGEgdm9sdW1lIGFycmF5LgorICoKKyAqICAgVGhpcyBhY2N1bXVsYXRlcyBpbnRvIHRoZSBvdXQgcG9pbnRlci4KKyAqCisgKiBNSVhUWVBFX01PTk9FWFBBTkQ6CisgKiAgIFNpbmdsZSBpbnB1dCBjaGFubmVsLiBOQ0hBTiByZXByZXNlbnRzIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuCisgKiAgIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqICAgVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqICAgVFY6IGludDMyX3QgKFU0LjI4KSBvciBpbnQxNl90IChVNC4xMikgb3IgZmxvYXQKKyAqICAgSW5wdXQgY2hhbm5lbCBjb3VudCBpcyAxLgorICogICB2b2w6IHJlcHJlc2VudHMgdm9sdW1lIGFycmF5LgorICoKKyAqICAgVGhpcyBhY2N1bXVsYXRlcyBpbnRvIHRoZSBvdXQgcG9pbnRlci4KKyAqCisgKiBNSVhUWVBFX01VTFRJX1NBVkVPTkxZOgorICogICBOQ0hBTiByZXByZXNlbnRzIG51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWxzLgorICogICBUTzogaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQKKyAqICAgVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqICAgVFY6IGludDMyX3QgKFU0LjI4KSBvciBpbnQxNl90IChVNC4xMikgb3IgZmxvYXQKKyAqICAgdm9sOiByZXByZXNlbnRzIGEgdm9sdW1lIGFycmF5LgorICoKKyAqICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSBkb2VzIG5vdCBhY2N1bXVsYXRlIGludG8gdGhlIG91dCBwb2ludGVyLgorICoKKyAqIE1JWFRZUEVfTVVMVElfTU9OT1ZPTDoKKyAqICAgU2FtZSBhcyBNSVhUWVBFX01VTFRJLCBidXQgdXNlcyBvbmx5IHZvbHVtZVswXS4KKyAqCisgKiBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0w6CisgKiAgIFNhbWUgYXMgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgYnV0IHVzZXMgb25seSB2b2x1bWVbMF0uCisgKgorICovCisKK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgaW50IE5DSEFOLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWPgoraW5saW5lIHZvaWQgdm9sdW1lUmFtcE11bHRpKFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIFRWICp2b2wsIGNvbnN0IFRWICp2b2xpbmMsIFRBViAqdm9sYSwgVEFWIHZvbGFpbmMpCit7CisjaWZkZWYgQUxPR1ZWCisgICAgQUxPR1ZWKCJ2b2x1bWVSYW1wTXVsdGksIE1JWFRZUEU6JWRcbiIsIE1JWFRZUEUpOworI2VuZGlmCisgICAgaWYgKGF1eCAhPSBOVUxMKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIFRBIGF1eGFjY3VtID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoTUlYVFlQRSkgeworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NT05PRVhQQU5EOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4sIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sWzBdLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2b2xbMF0gKz0gdm9saW5jWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFswXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBtaXh0eXBlICVkIiwgTUlYVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXhhY2N1bSAvPSBOQ0hBTjsKKyAgICAgICAgICAgICphdXgrKyArPSBNaXhNdWw8VEEsIFRBLCBUQVY+KGF1eGFjY3VtLCAqdm9sYSk7CisgICAgICAgICAgICB2b2xhWzBdICs9IHZvbGFpbmM7CisgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3dpdGNoIChNSVhUWVBFKSB7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVEk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01PTk9FWFBBTkQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluLCB2b2xbaV0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2b2xbMF0gKz0gdm9saW5jWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIG1peHR5cGUgJWQiLCBNSVhUWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgaW50IE5DSEFOLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWPgoraW5saW5lIHZvaWQgdm9sdW1lTXVsdGkoVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGNvbnN0IFRJKiBpbiwgVEEqIGF1eCwgY29uc3QgVFYgKnZvbCwgVEFWIHZvbGEpCit7CisjaWZkZWYgQUxPR1ZWCisgICAgQUxPR1ZWKCJ2b2x1bWVNdWx0aSBNSVhUWVBFOiVkXG4iLCBNSVhUWVBFKTsKKyNlbmRpZgorICAgIGlmIChhdXggIT0gTlVMTCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBUQSBhdXhhY2N1bSA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKE1JWFRZUEUpIHsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTU9OT0VYUEFORDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFswXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sWzBdLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBtaXh0eXBlICVkIiwgTUlYVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXhhY2N1bSAvPSBOQ0hBTjsKKyAgICAgICAgICAgICphdXgrKyArPSBNaXhNdWw8VEEsIFRBLCBUQVY+KGF1eGFjY3VtLCB2b2xhKTsKKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBzd2l0Y2ggKE1JWFRZUEUpIHsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTU9OT0VYUEFORDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4sIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBtaXh0eXBlICVkIiwgTUlYVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgfQorfQorCit9OworCisjZW5kaWYgLyogQU5EUk9JRF9BVURJT19NSVhFUl9PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0NTJjOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lTZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgotI3VuZGVmIF9fU1RSSUNUX0FOU0lfXwotI2RlZmluZSBfX1NURElOVF9MSU1JVFMKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOwotc3RhdGljIGNvbnN0IGNoYXIga0NtZERlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCB0aHJlYWQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7Ci0KLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7Ci0KLXN0YXRpYyBjb25zdCBuc2Vjc190IGtBdWRpb0NvbW1hbmRUaW1lb3V0ID0gMzAwMDAwMDAwMExMOyAvLyAzIHNlY29uZHMKLQotbmFtZXNwYWNlIHsKLSAgICBleHRlcm4gc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBhcHNfb3BzOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5U2VydmljZSgpCi0gICAgOiBCbkF1ZGlvUG9saWN5U2VydmljZSgpICwgbXBBdWRpb1BvbGljeURldihOVUxMKSAsIG1wQXVkaW9Qb2xpY3koTlVMTCkKLXsKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGU7Ci0gICAgaW50IGZvcmNlZF92YWw7Ci0gICAgaW50IHJjOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIC8vIHN0YXJ0IHRvbmUgcGxheWJhY2sgdGhyZWFkCi0gICAgbVRvbmVQbGF5YmFja1RocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtVG9uZSIpLCB0aGlzKTsKLSAgICAvLyBzdGFydCBhdWRpbyBjb21tYW5kcyB0aHJlYWQKLSAgICBtQXVkaW9Db21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1BdWRpbyIpLCB0aGlzKTsKLSAgICAvLyBzdGFydCBvdXRwdXQgYWN0aXZpdHkgY29tbWFuZCB0aHJlYWQKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtT3V0cHV0IiksIHRoaXMpOwotICAgIC8qIGluc3RhbnRpYXRlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciAqLwotICAgIHJjID0gaHdfZ2V0X21vZHVsZShBVURJT19QT0xJQ1lfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKTsKLSAgICBpZiAocmMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHJjID0gYXVkaW9fcG9saWN5X2Rldl9vcGVuKG1vZHVsZSwgJm1wQXVkaW9Qb2xpY3lEZXYpOwotICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3Qgb3BlbiBhdWRpbyBwb2xpY3kgZGV2aWNlICglcykiLCBzdHJlcnJvcigtcmMpKTsKLSAgICBpZiAocmMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHJjID0gbXBBdWRpb1BvbGljeURldi0+Y3JlYXRlX2F1ZGlvX3BvbGljeShtcEF1ZGlvUG9saWN5RGV2LCAmYXBzX29wcywgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1wQXVkaW9Qb2xpY3kpOwotICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3QgY3JlYXRlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgaWYgKHJjKQotICAgICAgICByZXR1cm47Ci0KLSAgICByYyA9IG1wQXVkaW9Qb2xpY3ktPmluaXRfY2hlY2sobXBBdWRpb1BvbGljeSk7Ci0gICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBpbml0X2NoZWNrIHRoZSBhdWRpbyBwb2xpY3kgKCVzKSIsIHN0cmVycm9yKC1yYykpOwotICAgIGlmIChyYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQUxPR0koIkxvYWRlZCBhdWRpbyBwb2xpY3kgZnJvbSAlcyAoJXMpIiwgbW9kdWxlLT5uYW1lLCBtb2R1bGUtPmlkKTsKLQotICAgIC8vIGxvYWQgYXVkaW8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwotICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBsb2FkUHJlUHJvY2Vzc29yQ29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOwotICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgIGxvYWRQcmVQcm9jZXNzb3JDb25maWcoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOwotICAgIH0KLX0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjp+QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKLXsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5leGl0KCk7Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC5jbGVhcigpOwotICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmV4aXQoKTsKLSAgICBtQXVkaW9Db21tYW5kVGhyZWFkLmNsZWFyKCk7Ci0KLQotICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJlIHByb2Nlc3NpbmcgcmVzb3VyY2VzCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRlbGV0ZSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgfQotICAgIG1JbnB1dFNvdXJjZXMuY2xlYXIoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPm1FZmZlY3RzLmNsZWFyKCk7Ci0gICAgICAgIGRlbGV0ZSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgfQotICAgIG1JbnB1dHMuY2xlYXIoKTsKLQotICAgIGlmIChtcEF1ZGlvUG9saWN5ICE9IE5VTEwgJiYgbXBBdWRpb1BvbGljeURldiAhPSBOVUxMKQotICAgICAgICBtcEF1ZGlvUG9saWN5RGV2LT5kZXN0cm95X2F1ZGlvX3BvbGljeShtcEF1ZGlvUG9saWN5RGV2LCBtcEF1ZGlvUG9saWN5KTsKLSAgICBpZiAobXBBdWRpb1BvbGljeURldiAhPSBOVUxMKQotICAgICAgICBhdWRpb19wb2xpY3lfZGV2X2Nsb3NlKG1wQXVkaW9Qb2xpY3lEZXYpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFICYmCi0gICAgICAgICAgICBzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyk7Ci19Ci0KLWF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9kZXZpY2VfY29ubmVjdGlvbl9zdGF0ZShtcEF1ZGlvUG9saWN5LCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmICh1aW50MzJfdChzdGF0ZSkgPj0gQVVESU9fTU9ERV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIik7Ci0KLSAgICAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBtb3JlIGFwcHJvcHJpYXRlIHRvIGRvIGl0IGluIHBsYXRmb3JtIHNwZWNpZmljIHBvbGljeSBtYW5hZ2VyCi0gICAgQXVkaW9TeXN0ZW06OnNldE1vZGUoc3RhdGUpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5zZXRfcGhvbmVfc3RhdGUobXBBdWRpb1BvbGljeSwgc3RhdGUpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+c2V0X2ZvcmNlX3VzZShtcEF1ZGlvUG9saWN5LCB1c2FnZSwgY29uZmlnKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7Ci0gICAgfQotICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2ZvcmNlX3VzZShtcEF1ZGlvUG9saWN5LCB1c2FnZSk7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKLXsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKLXsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKLXsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkiKTsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkiKTsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQob3V0cHV0KTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2Vfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCk7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAotICAgIGlmIChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQotICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gbXBBdWRpb1BvbGljeS0+Z2V0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9faW5fYWNvdXN0aWNzX3QpIDApOwotCi0gICAgaWYgKGlucHV0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLSAgICAvLyBjcmVhdGUgYXVkaW8gcHJlIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIGlucHV0IHNvdXJjZQotICAgIGF1ZGlvX3NvdXJjZV90IGFsaWFzU291cmNlID0gKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gOiBpbnB1dFNvdXJjZTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2VzLmluZGV4T2ZLZXkoYWxpYXNTb3VyY2UpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLSAgICBzc2l6ZV90IGlkeCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgSW5wdXREZXNjICppbnB1dERlc2M7Ci0gICAgaWYgKGlkeCA8IDApIHsKLSAgICAgICAgaW5wdXREZXNjID0gbmV3IElucHV0RGVzYyhhdWRpb1Nlc3Npb24pOwotICAgICAgICBtSW5wdXRzLmFkZChpbnB1dCwgaW5wdXREZXNjKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaWR4KTsKLSAgICB9Ci0KLSAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0cyA9IG1JbnB1dFNvdXJjZXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBlZmZlY3RzW2ldOwotICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIC0xLCAwLCAwLCBhdWRpb1Nlc3Npb24sIGlucHV0KTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgRnggJXMgb24gaW5wdXQgJWQiLCBlZmZlY3QtPm1OYW1lLCBpbnB1dCk7Ci0gICAgICAgICAgICAvLyBmeCBnb2VzIG91dCBvZiBzY29wZSBhbmQgc3Ryb25nIHJlZiBvbiBBdWRpb0VmZmVjdCBpcyByZWxlYXNlZAotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBlZmZlY3QtPm1QYXJhbXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGZ4LT5zZXRQYXJhbWV0ZXIoZWZmZWN0LT5tUGFyYW1zW2pdKTsKLSAgICAgICAgfQotICAgICAgICBpbnB1dERlc2MtPm1FZmZlY3RzLmFkZChmeCk7Ci0gICAgfQotICAgIHNldFByZVByb2Nlc3NvckVuYWJsZWQoaW5wdXREZXNjLCB0cnVlKTsKLSAgICByZXR1cm4gaW5wdXQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0YXJ0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBJbnB1dERlc2MgKmlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgc2V0UHJlUHJvY2Vzc29yRW5hYmxlZChpbnB1dERlc2MsIGZhbHNlKTsKLSAgICBkZWxldGUgaW5wdXREZXNjOwotICAgIG1JbnB1dHMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5pbml0X3N0cmVhbV92b2x1bWUobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZSkgewotICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZShtcEF1ZGlvUG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4KTsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJhdGVneV9mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Ci19Ci0KLS8vYXVkaW8gcG9saWN5OiB1c2UgYXVkaW9fZGV2aWNlX3QgYXBwcm9wcmlhdGVseQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpMDsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkwOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2RldmljZXNfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXRfZm9yX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBkZXNjKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnJlZ2lzdGVyX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+dW5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgaWQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9lZmZlY3RfZW5hYmxlZChtcEF1ZGlvUG9saWN5LCBpZCwgZW5hYmxlZCk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zdHJlYW1fYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5QYXN0TXMpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZV9yZW1vdGVseShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmlzX3NvdXJjZV9hY3RpdmUgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3NvdXJjZV9hY3RpdmUobXBBdWRpb1BvbGljeSwgc291cmNlKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQotewotCi0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICAqY291bnQgPSAwOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLQotICAgIHNpemVfdCBpbmRleDsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBpZiAobUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bVNlc3Npb25JZCA9PSBhdWRpb1Nlc3Npb24pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpbmRleCA9PSBtSW5wdXRzLnNpemUoKSkgewotICAgICAgICAqY291bnQgPSAwOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+IGVmZmVjdHMgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3RzW2ldLT5kZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmIChpIDwgKmNvdW50KSB7Ci0gICAgICAgICAgICBkZXNjcmlwdG9yc1tpXSA9IGRlc2M7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVmZmVjdHMuc2l6ZSgpID4gKmNvdW50KSB7Ci0gICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKLSAgICB9Ci0gICAgKmNvdW50ID0gZWZmZWN0cy5zaXplKCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewotICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIGNhbGxpbmcgcGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7Ci19Ci0KLXN0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQotewotICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2tlZDsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wSW50ZXJuYWxzKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBvbGljeU1hbmFnZXIgSW50ZXJmYWNlOiAlcFxuIiwgbXBBdWRpb1BvbGljeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNvbW1hbmQgVGhyZWFkOiAlcFxuIiwgbUF1ZGlvQ29tbWFuZFRocmVhZC5nZXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRvbmVzIFRocmVhZDogJXBcbiIsIG1Ub25lUGxheWJhY2tUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKLSAgICAgICAgZHVtcFBlcm1pc3Npb25EZW5pYWwoZmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7Ci0gICAgICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHJlc3VsdChrRGVhZGxvY2tlZFN0cmluZyk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGR1bXBJbnRlcm5hbHMoZmQpOwotICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtcEF1ZGlvUG9saWN5KSB7Ci0gICAgICAgICAgICBtcEF1ZGlvUG9saWN5LT5kdW1wKG1wQXVkaW9Qb2xpY3ksIGZkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBlcm1pc3Npb24gRGVuaWFsOiAiCi0gICAgICAgICAgICAiY2FuJ3QgZHVtcCBBdWRpb1BvbGljeVNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFByZVByb2Nlc3NvckVuYWJsZWQoY29uc3QgSW5wdXREZXNjICppbnB1dERlc2MsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBjb25zdCBWZWN0b3I8c3A8QXVkaW9FZmZlY3Q+ID4gJmZ4VmVjdG9yID0gaW5wdXREZXNjLT5tRWZmZWN0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZ4VmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGZ4VmVjdG9yLml0ZW1BdChpKS0+c2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdCgKLSAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gQm5BdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQotCi1BdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSkKLSAgICA6IFRocmVhZChmYWxzZSksIG1OYW1lKG5hbWUpLCBtU2VydmljZShzZXJ2aWNlKQotewotICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Ci19Ci0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6On5BdWRpb0NvbW1hbmRUaHJlYWQoKQotewotICAgIGlmICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKLSAgICB9Ci0gICAgbUF1ZGlvQ29tbWFuZHMuY2xlYXIoKTsKLSAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBydW4obU5hbWUuc3RyaW5nKCksIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICBuc2Vjc190IHdhaXRUaW1lID0gSU5UNjRfTUFYOwotCi0gICAgbUxvY2subG9jaygpOwotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKLSAgICB7Ci0gICAgICAgIHdoaWxlICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBuc2Vjc190IGN1clRpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogZXhlY3V0ZSB0aGVtIGZyb20gaW5kZXggMCBhbmQgdXAKLSAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgPD0gY3VyVGltZSkgewotICAgICAgICAgICAgICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG1BdWRpb0NvbW1hbmRzWzBdOwotICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KDApOwotICAgICAgICAgICAgICAgIG1MYXN0Q29tbWFuZCA9ICpjb21tYW5kOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgVG9uZURhdGEgKmRhdGEgPSAoVG9uZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0YXJ0IHRvbmUgJWQgb24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVHlwZSwgZGF0YS0+bVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IG5ldyBUb25lR2VuZXJhdG9yKGRhdGEtPm1TdHJlYW0sIDEuMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RhcnRUb25lKGRhdGEtPm1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIHRvbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1wVG9uZUdlbmVyYXRvciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0b3BUb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YSA9IChWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSAlZiwgb3V0cHV0ICVkIiwgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVZvbHVtZSwgZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWUoZGF0YS0+bVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXRSZWxhdGl2ZShtTG9jaywga0F1ZGlvQ29tbWFuZFRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXRSZWxhdGl2ZShtTG9jaywga0F1ZGlvQ29tbWFuZFRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRWb2ljZVZvbHVtZShkYXRhLT5tVm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXRSZWxhdGl2ZShtTG9jaywga0F1ZGlvQ29tbWFuZFRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX09VVFBVVDogewotICAgICAgICAgICAgICAgICAgICBTdG9wT3V0cHV0RGF0YSAqZGF0YSA9IChTdG9wT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSAoUmVsZWFzZU91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbGV0ZSBjb21tYW5kOwotICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gSU5UNjRfTUFYOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3YWl0VGltZSA9IG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSAtIGN1clRpbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jawotICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGdvaW5nIHRvIHNsZWVwIik7Ci0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgd2FpdFRpbWUpOwotICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgd2FraW5nIHVwIik7Ci0gICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Db21tYW5kVGhyZWFkICVwIER1bXBcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7Ci0gICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgU3RyaW5nOCByZXN1bHQyKGtDbWREZWFkbG9ja2VkU3RyaW5nKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdDIuc3RyaW5nKCksIHJlc3VsdDIuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIENvbW1hbmRzOlxuIik7Ci0gICAgcmVzdWx0ID0gU3RyaW5nOChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgIENvbW1hbmQgVGltZSAgICAgICAgV2FpdCBwUGFyYW1cbiIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUF1ZGlvQ29tbWFuZHNbaV0tPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCIgIExhc3QgQ29tbWFuZFxuIik7Ci0gICAgbUxhc3RDb21tYW5kLmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVEFSVF9UT05FOwotICAgIFRvbmVEYXRhICpkYXRhID0gbmV3IFRvbmVEYXRhKCk7Ci0gICAgZGF0YS0+bVR5cGUgPSB0eXBlOwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gKHZvaWQgKilkYXRhOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdGFydCB0eXBlICVkLCBzdHJlYW0gJWQiLCB0eXBlLCBzdHJlYW0pOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wVG9uZUNvbW1hbmQoKQotewotICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfVE9ORTsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSBOVUxMOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdG9wIik7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfVk9MVU1FOwotICAgIFZvbHVtZURhdGEgKmRhdGEgPSBuZXcgVm9sdW1lRGF0YSgpOwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgZGF0YS0+bVZvbHVtZSA9IHZvbHVtZTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCB2b2x1bWUgJWYsIG91dHB1dCAlZCIsCi0gICAgICAgICAgICBzdHJlYW0sIHZvbHVtZSwgb3V0cHV0KTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQud2FpdChtTG9jayk7Ci0gICAgICAgIHN0YXR1cyA9ICBjb21tYW5kLT5tU3RhdHVzOwotICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfUEFSQU1FVEVSUzsKLSAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IG5ldyBQYXJhbWV0ZXJzRGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IGlvSGFuZGxlOwotICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzID0gU3RyaW5nOChrZXlWYWx1ZVBhaXJzKTsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQsIGRlbGF5TXMpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBhcmFtZXRlciBzdHJpbmcgJXMsIGlvICVkICxkZWxheSAlZCIsCi0gICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLCBpb0hhbmRsZSwgZGVsYXlNcyk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwotICAgICAgICBzdGF0dXMgPSAgY29tbWFuZC0+bVN0YXR1czsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLQotICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9WT0lDRV9WT0xVTUU7Ci0gICAgVm9pY2VWb2x1bWVEYXRhICpkYXRhID0gbmV3IFZvaWNlVm9sdW1lRGF0YSgpOwotICAgIGRhdGEtPm1Wb2x1bWUgPSB2b2x1bWU7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwgdm9sdW1lKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQud2FpdChtTG9jayk7Ci0gICAgICAgIHN0YXR1cyA9ICBjb21tYW5kLT5tU3RhdHVzOwotICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKLXsKLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX09VVFBVVDsKLSAgICBTdG9wT3V0cHV0RGF0YSAqZGF0YSA9IG5ldyBTdG9wT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSAodm9pZCAqKWRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX09VVFBVVDsKLSAgICBSZWxlYXNlT3V0cHV0RGF0YSAqZGF0YSA9IG5ldyBSZWxlYXNlT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSAodm9pZCAqKWRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci19Ci0KLS8vIGluc2VydENvbW1hbmRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6aW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMpCi17Ci0gICAgc3NpemVfdCBpOyAgLy8gbm90IHNpemVfdCBiZWNhdXNlIGkgd2lsbCBjb3VudCBkb3duIHRvIC0xCi0gICAgVmVjdG9yIDxBdWRpb0NvbW1hbmQgKj4gcmVtb3ZlZENvbW1hbmRzOwotICAgIGNvbW1hbmQtPm1UaW1lID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKGRlbGF5TXMpOwotCi0gICAgLy8gYWNxdWlyZSB3YWtlIGxvY2sgdG8gbWFrZSBzdXJlIGRlbGF5ZWQgY29tbWFuZHMgYXJlIHByb2Nlc3NlZAotICAgIGlmIChtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIG1OYW1lLnN0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBzYW1lIHBlbmRpbmcgY29tbWFuZHMgd2l0aCBsYXRlciB0aW1lIHN0YW1wcyBhbmQgZWxpbWluYXRlIHRoZW0KLSAgICBmb3IgKGkgPSBtQXVkaW9Db21tYW5kcy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgQXVkaW9Db21tYW5kICpjb21tYW5kMiA9IG1BdWRpb0NvbW1hbmRzW2ldOwotICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogbm8gbmVlZCB0byBzY2FuIHRoZSByZXN0IG9mIG1BdWRpb0NvbW1hbmRzCi0gICAgICAgIGlmIChjb21tYW5kMi0+bVRpbWUgPD0gY29tbWFuZC0+bVRpbWUpIGJyZWFrOwotICAgICAgICBpZiAoY29tbWFuZDItPm1Db21tYW5kICE9IGNvbW1hbmQtPm1Db21tYW5kKSBjb250aW51ZTsKLQotICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7Ci0gICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKLSAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEyID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZDItPm1QYXJhbTsKLSAgICAgICAgICAgIGlmIChkYXRhLT5tSU8gIT0gZGF0YTItPm1JTykgYnJlYWs7Ci0gICAgICAgICAgICBBTE9HVigiQ29tcGFyaW5nIHBhcmFtZXRlciBjb21tYW5kICVzIHRvIG5ldyBjb21tYW5kICVzIiwKLSAgICAgICAgICAgICAgICAgICAgZGF0YTItPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtMiA9IEF1ZGlvUGFyYW1ldGVyKGRhdGEyLT5tS2V5VmFsdWVQYWlycyk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhcmFtLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBrZXk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTsKLSAgICAgICAgICAgICAgICBwYXJhbS5nZXRBdChqLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBhcmFtMi5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGtleTI7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUyOwotICAgICAgICAgICAgICAgICAgICBwYXJhbTIuZ2V0QXQoaywga2V5MiwgdmFsdWUyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleTIgPT0ga2V5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIucmVtb3ZlKGtleTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgcGFyYW1ldGVyICVzIiwga2V5Mi5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIGFsbCBrZXlzIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQsIHJlbW92ZSB0aGUgY29tbWFuZC4KLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXBkYXRlIHRoZSBrZXkgdmFsdWUgcGFpcnMKLSAgICAgICAgICAgIGlmIChwYXJhbTIuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YTItPm1LZXlWYWx1ZVBhaXJzID0gcGFyYW0yLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb21tYW5kLT5tVGltZSA9IGNvbW1hbmQyLT5tVGltZTsKLSAgICAgICAgICAgIC8vIGZvcmNlIGRlbGF5TXMgdG8gbm9uIDAgc28gdGhhdCBjb2RlIGJlbG93IGRvZXMgbm90IHJlcXVlc3QgdG8gd2FpdCBmb3IKLSAgICAgICAgICAgIC8vIGNvbW1hbmQgc3RhdHVzIGFzIHRoZSBjb21tYW5kIGlzIG5vdyBkZWxheWVkCi0gICAgICAgICAgICBkZWxheU1zID0gMTsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKLSAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEyID0gKFZvbHVtZURhdGEgKiljb21tYW5kMi0+bVBhcmFtOwotICAgICAgICAgICAgaWYgKGRhdGEtPm1JTyAhPSBkYXRhMi0+bUlPKSBicmVhazsKLSAgICAgICAgICAgIGlmIChkYXRhLT5tU3RyZWFtICE9IGRhdGEyLT5tU3RyZWFtKSBicmVhazsKLSAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0IHZvbHVtZSBjb21tYW5kIG9uIG91dHB1dCAlZCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtKTsKLSAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOwotICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7Ci0gICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCi0gICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAotICAgICAgICAgICAgZGVsYXlNcyA9IDE7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBUlRfVE9ORToKLSAgICAgICAgY2FzZSBTVE9QX1RPTkU6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHJlbW92ZSBmaWx0ZXJlZCBjb21tYW5kcwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVtb3ZlZENvbW1hbmRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgIC8vIHJlbW92ZWQgY29tbWFuZHMgYWx3YXlzIGhhdmUgdGltZSBzdGFtcHMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgY29tbWFuZAotICAgICAgICBmb3IgKHNpemVfdCBrID0gaSArIDE7IGsgPCBtQXVkaW9Db21tYW5kcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzW2tdID09IHJlbW92ZWRDb21tYW5kc1tqXSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzdXBwcmVzc2luZyBjb21tYW5kOiAlZCIsIG1BdWRpb0NvbW1hbmRzW2tdLT5tQ29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZHMucmVtb3ZlQXQoayk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmVtb3ZlZENvbW1hbmRzLmNsZWFyKCk7Ci0KLSAgICAvLyB3YWl0IGZvciBzdGF0dXMgb25seSBpZiBkZWxheSBpcyAwCi0gICAgaWYgKGRlbGF5TXMgPT0gMCkgewotICAgICAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBpbnNlcnQgY29tbWFuZCBhdCB0aGUgcmlnaHQgcGxhY2UgYWNjb3JkaW5nIHRvIGl0cyB0aW1lIHN0YW1wCi0gICAgQUxPR1YoImluc2VydGluZyBjb21tYW5kOiAlZCBhdCBpbmRleCAlZCwgbnVtIGNvbW1hbmRzICVkIiwKLSAgICAgICAgICAgIGNvbW1hbmQtPm1Db21tYW5kLCAoaW50KWkrMSwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpKTsKLSAgICBtQXVkaW9Db21tYW5kcy5pbnNlcnRBdChjb21tYW5kLCBpICsgMSk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmV4aXQoKQotewotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQ6OmV4aXQiKTsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgJTAyZCAgICAgICUwNmQuJTAzZCAgJTAxdSAgICAlcFxuIiwKLSAgICAgICAgICAgIG1Db21tYW5kLAotICAgICAgICAgICAgKGludCluczJzKG1UaW1lKSwKLSAgICAgICAgICAgIChpbnQpbnMybXMobVRpbWUpJTEwMDAsCi0gICAgICAgICAgICBtV2FpdFN0YXR1cywKLSAgICAgICAgICAgIG1QYXJhbSk7Ci19Ci0KLS8qKioqKioqIGhlbHBlcnMgZm9yIHRoZSBzZXJ2aWNlX29wcyBjYWxsYmFja3MgZGVmaW5lZCBiZWxvdyAqKioqKioqKiovCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKLXsKLSAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5wYXJhbWV0ZXJzQ29tbWFuZChpb0hhbmRsZSwga2V5VmFsdWVQYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLX0KLQotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCi17Ci0gICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9sdW1lQ29tbWFuZChzdHJlYW0sIHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgZGVsYXlNcyk7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgaWYgKHRvbmUgIT0gQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04pCi0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOwotICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpCi0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAotICAgICAgICAgICAgdG9uZSk7Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjpUT05FX1NVUF9DQUxMX1dBSVRJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BUb25lKCkKLXsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdG9wVG9uZUNvbW1hbmQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKLXsKLSAgICByZXR1cm4gKGludCltQXVkaW9Db21tYW5kVGhyZWFkLT52b2ljZVZvbHVtZUNvbW1hbmQodm9sdW1lLCBkZWxheU1zKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJtcEF1ZGlvUG9saWN5ID09IE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtcEF1ZGlvUG9saWN5LT5pc19vZmZsb2FkX3N1cHBvcnRlZCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJIQUwgZG9lcyBub3QgaW1wbGVtZW50IGlzX29mZmxvYWRfc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfb2ZmbG9hZF9zdXBwb3J0ZWQobXBBdWRpb1BvbGljeSwgJmluZm8pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBdWRpbyBwcmUtcHJvY2Vzc2luZyBjb25maWd1cmF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qc3RhdGljKi8gY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUG9saWN5U2VydmljZTo6a0lucHV0U291cmNlTmFtZXNbQVVESU9fU09VUkNFX0NOVCAtMV0gPSB7Ci0gICAgTUlDX1NSQ19UQUcsCi0gICAgVk9JQ0VfVUxfU1JDX1RBRywKLSAgICBWT0lDRV9ETF9TUkNfVEFHLAotICAgIFZPSUNFX0NBTExfU1JDX1RBRywKLSAgICBDQU1DT1JERVJfU1JDX1RBRywKLSAgICBWT0lDRV9SRUNfU1JDX1RBRywKLSAgICBWT0lDRV9DT01NX1NSQ19UQUcKLX07Ci0KLS8vIHJldHVybnMgdGhlIGF1ZGlvX3NvdXJjZV90IGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgc291cmNlIG5hbWUgb3IKLS8vIEFVRElPX1NPVVJDRV9DTlQgaXMgbm8gbWF0Y2ggZm91bmQKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvUG9saWN5U2VydmljZTo6aW5wdXRTb3VyY2VOYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gQVVESU9fU09VUkNFX01JQzsgaSA8IEFVRElPX1NPVVJDRV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKG5hbWUsIGtJbnB1dFNvdXJjZU5hbWVzW2kgLSBBVURJT19TT1VSQ0VfTUlDXSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoImlucHV0U291cmNlTmFtZVRvRW51bSBmb3VuZCBzb3VyY2UgJXMgJWQiLCBuYW1lLCBpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoYXVkaW9fc291cmNlX3QpaTsKLX0KLQotc2l6ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z3Jvd1BhcmFtU2l6ZShjaGFyICpwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKQotewotICAgIC8vICpjdXJTaXplIGlzIGF0IGxlYXN0IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludCkKLSAgICBzaXplX3QgcG9zID0gKCgqY3VyU2l6ZSAtIDEgKSAvIHNpemUgKyAxKSAqIHNpemU7Ci0KLSAgICBpZiAocG9zICsgc2l6ZSA+ICp0b3RTaXplKSB7Ci0gICAgICAgIHdoaWxlIChwb3MgKyBzaXplID4gKnRvdFNpemUpIHsKLSAgICAgICAgICAgICp0b3RTaXplICs9ICgoKnRvdFNpemUgKyA3KSAvIDgpICogNDsKLSAgICAgICAgfQotICAgICAgICBwYXJhbSA9IChjaGFyICopcmVhbGxvYyhwYXJhbSwgKnRvdFNpemUpOwotICAgIH0KLSAgICAqY3VyU2l6ZSA9IHBvcyArIHNpemU7Ci0gICAgcmV0dXJuIHBvczsKLX0KLQotc2l6ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6cmVhZFBhcmFtVmFsdWUoY25vZGUgKm5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSkKLXsKLSAgICBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBTSE9SVF9UQUcsIHNpemVvZihTSE9SVF9UQUcpICsgMSkgPT0gMCkgewotICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKHNob3J0KSwgY3VyU2l6ZSwgdG90U2l6ZSk7Ci0gICAgICAgICooc2hvcnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSAoc2hvcnQpYXRvaShub2RlLT52YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgc2hvcnQgJWQiLCAqKHNob3J0ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKLSAgICAgICAgcmV0dXJuIHNpemVvZihzaG9ydCk7Ci0gICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIElOVF9UQUcsIHNpemVvZihJTlRfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihpbnQpLCBjdXJTaXplLCB0b3RTaXplKTsKLSAgICAgICAgKihpbnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSBhdG9pKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBpbnQgJWQiLCAqKGludCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7Ci0gICAgICAgIHJldHVybiBzaXplb2YoaW50KTsKLSAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgRkxPQVRfVEFHLCBzaXplb2YoRkxPQVRfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihmbG9hdCksIGN1clNpemUsIHRvdFNpemUpOwotICAgICAgICAqKGZsb2F0ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gKGZsb2F0KWF0b2Yobm9kZS0+dmFsdWUpOwotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGZsb2F0ICVmIiwqKGZsb2F0ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKLSAgICAgICAgcmV0dXJuIHNpemVvZihmbG9hdCk7Ci0gICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIEJPT0xfVEFHLCBzaXplb2YoQk9PTF9UQUcpICsgMSkgPT0gMCkgewotICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGJvb2wpLCBjdXJTaXplLCB0b3RTaXplKTsKLSAgICAgICAgaWYgKHN0cm5jbXAobm9kZS0+dmFsdWUsICJmYWxzZSIsIHN0cmxlbigiZmFsc2UiKSArIDEpID09IDApIHsKLSAgICAgICAgICAgICooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKihib29sICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGJvb2wgJXMiLCooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICByZXR1cm4gc2l6ZW9mKGJvb2wpOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBTVFJJTkdfVEFHLCBzaXplb2YoU1RSSU5HX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBsZW4gPSBzdHJubGVuKG5vZGUtPnZhbHVlLCBFRkZFQ1RfU1RSSU5HX0xFTl9NQVgpOwotICAgICAgICBpZiAoKmN1clNpemUgKyBsZW4gKyAxID4gKnRvdFNpemUpIHsKLSAgICAgICAgICAgICp0b3RTaXplID0gKmN1clNpemUgKyBsZW4gKyAxOwotICAgICAgICAgICAgcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MocGFyYW0sICp0b3RTaXplKTsKLSAgICAgICAgfQotICAgICAgICBzdHJuY3B5KHBhcmFtICsgKmN1clNpemUsIG5vZGUtPnZhbHVlLCBsZW4pOwotICAgICAgICAqY3VyU2l6ZSArPSBsZW47Ci0gICAgICAgIHBhcmFtWypjdXJTaXplXSA9ICdcMCc7Ci0gICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgc3RyaW5nICVzIiwgcGFyYW0gKyAqY3VyU2l6ZSAtIGxlbik7Ci0gICAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICAgIEFMT0dXKCJyZWFkUGFyYW1WYWx1ZSgpIHVua25vd24gcGFyYW0gdHlwZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgIHJldHVybiAwOwotfQotCi1lZmZlY3RfcGFyYW1fdCAqQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkRWZmZWN0UGFyYW1ldGVyKGNub2RlICpyb290KQotewotICAgIGNub2RlICpwYXJhbTsKLSAgICBjbm9kZSAqdmFsdWU7Ci0gICAgc2l6ZV90IGN1clNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpOwotICAgIHNpemVfdCB0b3RTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIDIgKiBzaXplb2YoaW50KTsKLSAgICBlZmZlY3RfcGFyYW1fdCAqZnhfcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKiltYWxsb2ModG90U2l6ZSk7Ci0KLSAgICBwYXJhbSA9IGNvbmZpZ19maW5kKHJvb3QsIFBBUkFNX1RBRyk7Ci0gICAgdmFsdWUgPSBjb25maWdfZmluZChyb290LCBWQUxVRV9UQUcpOwotICAgIGlmIChwYXJhbSA9PSBOVUxMICYmIHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgLy8gdHJ5IHRvIHBhcnNlIHNpbXBsZSBwYXJhbWV0ZXIgZm9ybSB7aW50IGludH0KLSAgICAgICAgcGFyYW0gPSByb290LT5maXJzdF9jaGlsZDsKLSAgICAgICAgaWYgKHBhcmFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHRoYXQgYSBwYWlyIG9mIHJhbmRvbSBzdHJpbmdzIGlzIHJlYWQgYXMgMCAwCi0gICAgICAgICAgICBpbnQgKnB0ciA9IChpbnQgKilmeF9wYXJhbS0+ZGF0YTsKLSAgICAgICAgICAgIGludCAqcHRyMiA9IChpbnQgKikoKGNoYXIgKilwYXJhbSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpOwotICAgICAgICAgICAgQUxPR1coImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSBwdHIgJXAgcHRyMiAlcCIsIHB0ciwgcHRyMik7Ci0gICAgICAgICAgICAqcHRyKysgPSBhdG9pKHBhcmFtLT5uYW1lKTsKLSAgICAgICAgICAgICpwdHIgPSBhdG9pKHBhcmFtLT52YWx1ZSk7Ci0gICAgICAgICAgICBmeF9wYXJhbS0+cHNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgICAgIGZ4X3BhcmFtLT52c2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICAgICAgcmV0dXJuIGZ4X3BhcmFtOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwYXJhbSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtZXRlciBkZXNjcmlwdGlvbiAlcyIsIHJvb3QtPm5hbWUpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGZ4X3BhcmFtLT5wc2l6ZSA9IDA7Ci0gICAgcGFyYW0gPSBwYXJhbS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKHBhcmFtKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcmVhZGluZyBwYXJhbSBvZiB0eXBlICVzIiwgcGFyYW0tPm5hbWUpOwotICAgICAgICBzaXplX3Qgc2l6ZSA9IHJlYWRQYXJhbVZhbHVlKHBhcmFtLCAoY2hhciAqKWZ4X3BhcmFtLCAmY3VyU2l6ZSwgJnRvdFNpemUpOwotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIGZ4X3BhcmFtLT5wc2l6ZSArPSBzaXplOwotICAgICAgICBwYXJhbSA9IHBhcmFtLT5uZXh0OwotICAgIH0KLQotICAgIC8vIGFsaWduIHN0YXJ0IG9mIHZhbHVlIGZpZWxkIG9uIDMyIGJpdCBib3VuZGFyeQotICAgIGN1clNpemUgPSAoKGN1clNpemUgLSAxICkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7Ci0KLSAgICBmeF9wYXJhbS0+dnNpemUgPSAwOwotICAgIHZhbHVlID0gdmFsdWUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlICh2YWx1ZSkgewotICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcigpIHJlYWRpbmcgdmFsdWUgb2YgdHlwZSAlcyIsIHZhbHVlLT5uYW1lKTsKLSAgICAgICAgc2l6ZV90IHNpemUgPSByZWFkUGFyYW1WYWx1ZSh2YWx1ZSwgKGNoYXIgKilmeF9wYXJhbSwgJmN1clNpemUsICZ0b3RTaXplKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBmeF9wYXJhbS0+dnNpemUgKz0gc2l6ZTsKLSAgICAgICAgdmFsdWUgPSB2YWx1ZS0+bmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZnhfcGFyYW07Ci0KLWVycm9yOgotICAgIGRlbGV0ZSBmeF9wYXJhbTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRFZmZlY3RQYXJhbWV0ZXJzKGNub2RlICpyb290LCBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+JiBwYXJhbXMpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcnMoKSBsb2FkaW5nIHBhcmFtICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIGVmZmVjdF9wYXJhbV90ICpwYXJhbSA9IGxvYWRFZmZlY3RQYXJhbWV0ZXIobm9kZSk7Ci0gICAgICAgIGlmIChwYXJhbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtcy5hZGQocGFyYW0pOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLUF1ZGlvUG9saWN5U2VydmljZTo6SW5wdXRTb3VyY2VEZXNjICpBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRJbnB1dFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNub2RlICpyb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZElucHV0U291cmNlKCkgZW1wdHkgZWxlbWVudCAlcyIsIHJvb3QtPm5hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgSW5wdXRTb3VyY2VEZXNjICpzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2VEZXNjKCk7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgc2l6ZV90IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc3RybmNtcChlZmZlY3RzW2ldLT5tTmFtZSwgbm9kZS0+bmFtZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZSgpIGZvdW5kIGVmZmVjdCAlcyBpbiBsaXN0Iiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gZWZmZWN0cy5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5wdXRTb3VyY2UoKSBlZmZlY3QgJXMgbm90IGluIGxpc3QiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoKmVmZmVjdHNbaV0pOyAgIC8vIGRlZXAgY29weQotICAgICAgICBsb2FkRWZmZWN0UGFyYW1ldGVycyhub2RlLCBlZmZlY3QtPm1QYXJhbXMpOwotICAgICAgICBBTE9HVigibG9hZElucHV0U291cmNlKCkgYWRkaW5nIGVmZmVjdCAlcyB1dWlkICUwOHgiLCBlZmZlY3QtPm1OYW1lLCBlZmZlY3QtPm1VdWlkLnRpbWVMb3cpOwotICAgICAgICBzb3VyY2UtPm1FZmZlY3RzLmFkZChlZmZlY3QpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKHNvdXJjZS0+bUVmZmVjdHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgQUxPR1coImxvYWRJbnB1dFNvdXJjZSgpIG5vIHZhbGlkIGVmZmVjdHMgZm91bmQgaW4gc291cmNlICVzIiwgcm9vdC0+bmFtZSk7Ci0gICAgICAgIGRlbGV0ZSBzb3VyY2U7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gc291cmNlOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRJbnB1dFNvdXJjZXMoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFBSRVBST0NFU1NJTkdfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gaW5wdXRTb3VyY2VOYW1lVG9FbnVtKG5vZGUtPm5hbWUpOwotICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9DTlQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJsb2FkSW5wdXRTb3VyY2VzKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZXMoKSBsb2FkaW5nIGlucHV0IHNvdXJjZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBJbnB1dFNvdXJjZURlc2MgKmRlc2MgPSBsb2FkSW5wdXRTb3VyY2Uobm9kZSwgZWZmZWN0cyk7Ci0gICAgICAgIGlmIChkZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbUlucHV0U291cmNlcy5hZGQoc291cmNlLCBkZXNjKTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpFZmZlY3REZXNjICpBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGlmIChBdWRpb0VmZmVjdDo6c3RyaW5nVG9HdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IEVmZmVjdERlc2Mocm9vdC0+bmFtZSwgdXVpZCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RzKCkgbG9hZGluZyBlZmZlY3QgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbG9hZEVmZmVjdChub2RlKTsKLSAgICAgICAgaWYgKGVmZmVjdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVmZmVjdHMuYWRkKGVmZmVjdCk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bG9hZFByZVByb2Nlc3NvckNvbmZpZyhjb25zdCBjaGFyICpwYXRoKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0czsKLSAgICBsb2FkRWZmZWN0cyhyb290LCBlZmZlY3RzKTsKLSAgICBsb2FkSW5wdXRTb3VyY2VzKHJvb3QsIGVmZmVjdHMpOwotCi0gICAgLy8gZGVsZXRlIGVmZmVjdHMgdG8gZml4IG1lbW9yeSBsZWFrLgotICAgIC8vIGFzIGVmZmVjdHMgaXMgbG9jYWwgdmFyIGFuZCB2YWxncmluZCB3b3VsZCB0cmVhdCB0aGlzIGFzIG1lbW9yeSBsZWFrCi0gICAgLy8gYW5kIGFsdGhvdWdoIGl0IG9ubHkgZGlkIGluIG1lZGlhc2VydmVyIGluaXQsIGJ1dCBmcmVlIGl0IGluIGNhc2UgbWVkaWFzZXJ2ZXIgcmVib290Ci0gICAgc2l6ZV90IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBlZmZlY3RzW2ldOwotICAgIH0KLQotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyogaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZSB0byB0aGUgcG9saWN5IG1hbmFnZXIgKi8KLWV4dGVybiAiQyIgewotCi0KLXN0YXRpYyBhdWRpb19tb2R1bGVfaGFuZGxlX3QgYXBzX2xvYWRfaHdfbW9kdWxlKHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5sb2FkSHdNb2R1bGUobmFtZSk7Ci19Ci0KLS8vIGRlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUoKQotc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dCh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+b3Blbk91dHB1dCgoYXVkaW9fbW9kdWxlX2hhbmRsZV90KTAsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsIGZsYWdzKTsKLX0KLQotc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBhZi0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQxLCBvdXRwdXQyKTsKLX0KLQotc3RhdGljIGludCBhcHNfY2xvc2Vfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKQotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3N1c3BlbmRfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPnN1c3BlbmRPdXRwdXQob3V0cHV0KTsKLX0KLQotc3RhdGljIGludCBhcHNfcmVzdG9yZV9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOwotfQotCi0vLyBkZXByZWNhdGVkOiByZXBsYWNlZCBieSBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUoKSwgYW5kIGFjb3VzdGljcyBwYXJhbWV0ZXIgaXMgaWdub3JlZAotc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0KHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+b3BlbklucHV0KChhdWRpb19tb2R1bGVfaGFuZGxlX3QpMCwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzayk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrKTsKLX0KLQotc3RhdGljIGludCBhcHNfY2xvc2VfaW5wdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5jbG9zZUlucHV0KGlucHV0KTsKLX0KLQotc3RhdGljIGludCBhcHNfc2V0X3N0cmVhbV9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+c2V0U3RyZWFtT3V0cHV0KHN0cmVhbSwgb3V0cHV0KTsKLX0KLQotc3RhdGljIGludCBhcHNfbW92ZV9lZmZlY3RzKHZvaWQgKnNlcnZpY2UsIGludCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3Rfb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbiwgc3JjX291dHB1dCwgZHN0X291dHB1dCk7Ci19Ci0KLXN0YXRpYyBjaGFyICogYXBzX2dldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzKQotewotICAgIFN0cmluZzggcmVzdWx0ID0gQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBTdHJpbmc4KGtleXMpKTsKLSAgICByZXR1cm4gc3RyZHVwKHJlc3VsdC5zdHJpbmcoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwc19zZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmt2X3BhaXJzLCBpbnQgZGVsYXlfbXMpCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIGt2X3BhaXJzLCBkZWxheV9tcyk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zKTsKLX0KLQotc3RhdGljIGludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKQotewotICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7Ci0KLSAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOwotfQotCi1zdGF0aWMgaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQotewotICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7Ci0KLSAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKLX0KLQotfTsgLy8gZXh0ZXJuICJDIgotCi1uYW1lc3BhY2UgewotICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wcyA9IHsKLSAgICAgICAgb3Blbl9vdXRwdXQgICAgICAgICAgIDogYXBzX29wZW5fb3V0cHV0LAotICAgICAgICBvcGVuX2R1cGxpY2F0ZV9vdXRwdXQgOiBhcHNfb3Blbl9kdXBfb3V0cHV0LAotICAgICAgICBjbG9zZV9vdXRwdXQgICAgICAgICAgOiBhcHNfY2xvc2Vfb3V0cHV0LAotICAgICAgICBzdXNwZW5kX291dHB1dCAgICAgICAgOiBhcHNfc3VzcGVuZF9vdXRwdXQsCi0gICAgICAgIHJlc3RvcmVfb3V0cHV0ICAgICAgICA6IGFwc19yZXN0b3JlX291dHB1dCwKLSAgICAgICAgb3Blbl9pbnB1dCAgICAgICAgICAgIDogYXBzX29wZW5faW5wdXQsCi0gICAgICAgIGNsb3NlX2lucHV0ICAgICAgICAgICA6IGFwc19jbG9zZV9pbnB1dCwKLSAgICAgICAgc2V0X3N0cmVhbV92b2x1bWUgICAgIDogYXBzX3NldF9zdHJlYW1fdm9sdW1lLAotICAgICAgICBzZXRfc3RyZWFtX291dHB1dCAgICAgOiBhcHNfc2V0X3N0cmVhbV9vdXRwdXQsCi0gICAgICAgIHNldF9wYXJhbWV0ZXJzICAgICAgICA6IGFwc19zZXRfcGFyYW1ldGVycywKLSAgICAgICAgZ2V0X3BhcmFtZXRlcnMgICAgICAgIDogYXBzX2dldF9wYXJhbWV0ZXJzLAotICAgICAgICBzdGFydF90b25lICAgICAgICAgICAgOiBhcHNfc3RhcnRfdG9uZSwKLSAgICAgICAgc3RvcF90b25lICAgICAgICAgICAgIDogYXBzX3N0b3BfdG9uZSwKLSAgICAgICAgc2V0X3ZvaWNlX3ZvbHVtZSAgICAgIDogYXBzX3NldF92b2ljZV92b2x1bWUsCi0gICAgICAgIG1vdmVfZWZmZWN0cyAgICAgICAgICA6IGFwc19tb3ZlX2VmZmVjdHMsCi0gICAgICAgIGxvYWRfaHdfbW9kdWxlICAgICAgICA6IGFwc19sb2FkX2h3X21vZHVsZSwKLSAgICAgICAgb3Blbl9vdXRwdXRfb25fbW9kdWxlIDogYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSwKLSAgICAgICAgb3Blbl9pbnB1dF9vbl9tb2R1bGUgIDogYXBzX29wZW5faW5wdXRfb25fbW9kdWxlLAotICAgIH07Ci19OyAvLyBuYW1lc3BhY2UgPHVubmFtZWQ+Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMDUzYTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAotCi0jaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6Ci0gICAgcHVibGljIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPiwKLSAgICBwdWJsaWMgQm5BdWRpb1BvbGljeVNlcnZpY2UsCi0vLyAgICBwdWJsaWMgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UsCi0gICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci17Ci0gICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPjsKLQotcHVibGljOgotICAgIC8vIGZvciBCaW5kZXJTZXJ2aWNlCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNlcnZpY2VOYW1lKCkgQU5EUk9JRF9BUEkgeyByZXR1cm4gIm1lZGlhLmF1ZGlvX3BvbGljeSI7IH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgLy8KLSAgICAvLyBCbkF1ZGlvUG9saWN5U2VydmljZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQotICAgIC8vCi0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7Ci0gICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7Ci0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotCi0gICAgLy8KLSAgICAvLyBIZWxwZXJzIGZvciB0aGUgc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdAotICAgIC8vIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgcG9saWN5IHNlcnZpY2UuCi0gICAgLy8KLSAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmY29uZmlnKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwotICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLQotcHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSgpIEFORFJPSURfQVBJOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvUG9saWN5U2VydmljZSgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBkdW1wSW50ZXJuYWxzKGludCBmZCk7Ci0KLSAgICAvLyBUaHJlYWQgdXNlZCBmb3IgdG9uZSBwbGF5YmFjayBhbmQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgotICAgIC8vIEZvciB0b25lIHBsYXliYWNrLCB1c2luZyBhIHNlcGFyYXRlIHRocmVhZCBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBtTG9jayBiZWNhdXNlCi0gICAgLy8gc3RhcnRUb25lKCkgYW5kIHN0b3BUb25lKCkgYXJlIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG1Mb2NrIGxvY2tlZCBhbmQgcmVxdWVzdGluZyBhIHRvbmUgc3RhcnQKLSAgICAvLyBvciBzdG9wIHdpbGwgY2F1c2UgY2FsbHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFuZCBhbiBhdHRlbXB0IHRvIGxvY2sgbUxvY2suCi0gICAgLy8gRm9yIGF1ZGlvIGNvbmZpZyBjb21tYW5kcywgaXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYXVkaW8gZmxpbmdlciByZXF1aXJlcyB0aGF0IHRoZSBjYWxsaW5nCi0gICAgLy8gcHJvY2VzcyAodXNlcikgaGFzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGF1ZGlvIHNldHRpbmdzLgotICAgIGNsYXNzIEF1ZGlvQ29tbWFuZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmQ7Ci0gICAgcHVibGljOgotCi0gICAgICAgIC8vIGNvbW1hbmRzIGZvciB0b25lIEF1ZGlvQ29tbWFuZAotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIFNUQVJUX1RPTkUsCi0gICAgICAgICAgICBTVE9QX1RPTkUsCi0gICAgICAgICAgICBTRVRfVk9MVU1FLAotICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICBTRVRfVk9JQ0VfVk9MVU1FLAotICAgICAgICAgICAgU1RPUF9PVVRQVVQsCi0gICAgICAgICAgICBSRUxFQVNFX09VVFBVVAotICAgICAgICB9OwotCi0gICAgICAgIEF1ZGlvQ29tbWFuZFRocmVhZCAoU3RyaW5nOCBuYW1lLCBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKTsKLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Db21tYW5kVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7Ci0gICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKLQotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wVG9uZUNvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIHJlcXVlc3RlZCB0b25lIHBsYXliYWNrIGV2ZW50Ci0gICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZCB7Ci0KLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgQXVkaW9Db21tYW5kKCkKLSAgICAgICAgICAgIDogbUNvbW1hbmQoLTEpIHt9Ci0KLSAgICAgICAgICAgIHZvaWQgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKLQotICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNUQVJUX1RPTkUsIFNUT1BfVE9ORSAuLi4KLSAgICAgICAgICAgIG5zZWNzX3QgbVRpbWU7ICAvLyB0aW1lIHN0YW1wCi0gICAgICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgotICAgICAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgLy8gY29tbWFuZCBzdGF0dXMKLSAgICAgICAgICAgIGJvb2wgbVdhaXRTdGF0dXM7IC8vIHRydWUgaWYgY2FsbGVyIGlzIHdhaXRpbmcgZm9yIHN0YXR1cwotICAgICAgICAgICAgdm9pZCAqbVBhcmFtOyAgICAgLy8gY29tbWFuZCBwYXJhbWV0ZXIgKFRvbmVEYXRhLCBWb2x1bWVEYXRhLCBQYXJhbWV0ZXJzRGF0YSkKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBUb25lRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSBtVHlwZTsgLy8gdG9uZSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07ICAgIC8vIHN0cmVhbSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgVm9sdW1lRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKLSAgICAgICAgICAgIGZsb2F0IG1Wb2x1bWU7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgUGFyYW1ldGVyc0RhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBTdHJpbmc4IG1LZXlWYWx1ZVBhaXJzOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFZvaWNlVm9sdW1lRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGZsb2F0IG1Wb2x1bWU7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgU3RvcE91dHB1dERhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBpbnQgbVNlc3Npb247Ci0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgUmVsZWFzZU91dHB1dERhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgIH07Ci0KLSAgICAgICAgTXV0ZXggICBtTG9jazsKLSAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOwotICAgICAgICBWZWN0b3IgPEF1ZGlvQ29tbWFuZCAqPiBtQXVkaW9Db21tYW5kczsgLy8gbGlzdCBvZiBwZW5kaW5nIGNvbW1hbmRzCi0gICAgICAgIFRvbmVHZW5lcmF0b3IgKm1wVG9uZUdlbmVyYXRvcjsgICAgIC8vIHRoZSB0b25lIGdlbmVyYXRvcgotICAgICAgICBBdWRpb0NvbW1hbmQgbUxhc3RDb21tYW5kOyAgICAgICAgICAvLyBsYXN0IHByb2Nlc3NlZCBjb21tYW5kICh1c2VkIGJ5IGR1bXApCi0gICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCi0gICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7Ci0gICAgfTsKLQotICAgIGNsYXNzIEVmZmVjdERlc2MgewotICAgIHB1YmxpYzoKLSAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAobmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCkgeyB9Ci0gICAgICAgIEVmZmVjdERlc2MoY29uc3QgRWZmZWN0RGVzYyYgb3JpZykgOgotICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG9yaWcubU5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWVwIGNvcHkgbVBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgb3JpZy5tUGFyYW1zLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpvcmlnUGFyYW0gPSBvcmlnLm1QYXJhbXNba107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBzaXplIGFuZCB2c2l6ZSBhcmUgcm91bmRlZCB1cCB0byBhbiBpbnQgYm91bmRhcnkgZm9yIGFsbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9yaWdTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JpZ1BhcmFtLT5wc2l6ZSArIDMpICYgfjMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcmlnUGFyYW0tPnZzaXplICsgMykgJiB+Myk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpkdXBQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBtYWxsb2Mob3JpZ1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHVwUGFyYW0sIG9yaWdQYXJhbSwgb3JpZ1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIHBhcmFtIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGFsc28gZG9uZSBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZXMgb2YgNCBieXRlcyBvcmlnaW5hbGx5LiBJbiB0aGVvcnkgd2Ugc2hvdWxkIG1lbWNweSBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcGFyYW0gc2l6ZSwgdGhhdCBpcyB3aXRob3V0IHJvdW5kaW5nIHZzaXplLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLmFkZChkdXBQYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAvKnZpcnR1YWwqLyB+RWZmZWN0RGVzYygpIHsKLSAgICAgICAgICAgIGZyZWUobU5hbWUpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtUGFyYW1zLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtUGFyYW1zW2tdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGFyICptTmFtZTsKLSAgICAgICAgZWZmZWN0X3V1aWRfdCBtVXVpZDsKLSAgICAgICAgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiBtUGFyYW1zOwotICAgIH07Ci0KLSAgICBjbGFzcyBJbnB1dFNvdXJjZURlc2MgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW5wdXRTb3VyY2VEZXNjKCkge30KLSAgICAgICAgLyp2aXJ0dWFsKi8gfklucHV0U291cmNlRGVzYygpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUVmZmVjdHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgbUVmZmVjdHNbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IG1FZmZlY3RzOwotICAgIH07Ci0KLQotICAgIGNsYXNzIElucHV0RGVzYyB7Ci0gICAgcHVibGljOgotICAgICAgICBJbnB1dERlc2MoaW50IHNlc3Npb24pIDogbVNlc3Npb25JZChzZXNzaW9uKSB7fQotICAgICAgICAvKnZpcnR1YWwqLyB+SW5wdXREZXNjKCkge30KLSAgICAgICAgY29uc3QgaW50IG1TZXNzaW9uSWQ7Ci0gICAgICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID5tRWZmZWN0czsKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrSW5wdXRTb3VyY2VOYW1lc1tBVURJT19TT1VSQ0VfQ05UIC0xXTsKLQotICAgIHZvaWQgc2V0UHJlUHJvY2Vzc29yRW5hYmxlZChjb25zdCBJbnB1dERlc2MgKmlucHV0RGVzYywgYm9vbCBlbmFibGVkKTsKLSAgICBzdGF0dXNfdCBsb2FkUHJlUHJvY2Vzc29yQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOwotICAgIHN0YXR1c190IGxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOwotICAgIEVmZmVjdERlc2MgKmxvYWRFZmZlY3QoY25vZGUgKnJvb3QpOwotICAgIHN0YXR1c190IGxvYWRJbnB1dFNvdXJjZXMoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2VOYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIElucHV0U291cmNlRGVzYyAqbG9hZElucHV0U291cmNlKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOwotICAgIHZvaWQgbG9hZEVmZmVjdFBhcmFtZXRlcnMoY25vZGUgKnJvb3QsIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4mIHBhcmFtcyk7Ci0gICAgZWZmZWN0X3BhcmFtX3QgKmxvYWRFZmZlY3RQYXJhbWV0ZXIoY25vZGUgKnJvb3QpOwotICAgIHNpemVfdCByZWFkUGFyYW1WYWx1ZShjbm9kZSAqbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKLSAgICBzaXplX3QgZ3Jvd1BhcmFtU2l6ZShjaGFyICpwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKLQotICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgotICAgIHN0YXR1c190IGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCk7Ci0KLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7ICAgIC8vIHByZXZlbnRzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIEF1ZGlvUG9saWN5IG1hbmFnZXIgZnVuY3Rpb25zIGNoYW5naW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgIG9yIHJvdXRpbmcKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAotICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKLSAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwotICAgIEtleWVkVmVjdG9yPCBhdWRpb19zb3VyY2VfdCwgSW5wdXRTb3VyY2VEZXNjKiA+IG1JbnB1dFNvdXJjZXM7Ci0gICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBJbnB1dERlc2MqID4gbUlucHV0czsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAppbmRleCAyYzNjNzE5Li4xZjdhNjEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKQEAgLTIyLDkgKzIyLDExIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJTaW5jLmgiCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJDdWJpYy5oIgorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRHluLmgiCiAKICNpZmRlZiBfX2FybV9fCiAjaW5jbHVkZSA8bWFjaGluZS9jcHUtZmVhdHVyZXMuaD4KQEAgLTM5LDggKzQxLDggQEAKIAogY2xhc3MgQXVkaW9SZXNhbXBsZXJPcmRlcjEgOiBwdWJsaWMgQXVkaW9SZXNhbXBsZXIgewogcHVibGljOgotICAgIEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpIDoKLSAgICAgICAgQXVkaW9SZXNhbXBsZXIoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBMT1dfUVVBTElUWSksIG1YMEwoMCksIG1YMFIoMCkgeworICAgIEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBMT1dfUVVBTElUWSksIG1YMEwoMCksIG1YMFIoMCkgewogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKQEAgLTc3LDYgKzc5LDkgQEAKICAgICBpbnQgbVgwUjsKIH07CiAKKy8qc3RhdGljKi8KK2NvbnN0IGRvdWJsZSBBdWRpb1Jlc2FtcGxlcjo6a1BoYXNlTXVsdGlwbGllciA9IDFMIDw8IEF1ZGlvUmVzYW1wbGVyOjprTnVtUGhhc2VCaXRzOworCiBib29sIEF1ZGlvUmVzYW1wbGVyOjpxdWFsaXR5SXNTdXBwb3J0ZWQoc3JjX3F1YWxpdHkgcXVhbGl0eSkKIHsKICAgICBzd2l0Y2ggKHF1YWxpdHkpIHsKQEAgLTg1LDYgKzkwLDkgQEAKICAgICBjYXNlIE1FRF9RVUFMSVRZOgogICAgIGNhc2UgSElHSF9RVUFMSVRZOgogICAgIGNhc2UgVkVSWV9ISUdIX1FVQUxJVFk6CisgICAgY2FzZSBEWU5fTE9XX1FVQUxJVFk6CisgICAgY2FzZSBEWU5fTUVEX1FVQUxJVFk6CisgICAgY2FzZSBEWU5fSElHSF9RVUFMSVRZOgogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDUsNyArMTEzLDcgQEAKICAgICAgICAgaWYgKCplbmRwdHIgPT0gJ1wwJykgewogICAgICAgICAgICAgZGVmYXVsdFF1YWxpdHkgPSAoc3JjX3F1YWxpdHkpIGw7CiAgICAgICAgICAgICBBTE9HRCgiZm9yY2luZyBBdWRpb1Jlc2FtcGxlciBxdWFsaXR5IHRvICVkIiwgZGVmYXVsdFF1YWxpdHkpOwotICAgICAgICAgICAgaWYgKGRlZmF1bHRRdWFsaXR5IDwgREVGQVVMVF9RVUFMSVRZIHx8IGRlZmF1bHRRdWFsaXR5ID4gVkVSWV9ISUdIX1FVQUxJVFkpIHsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0UXVhbGl0eSA8IERFRkFVTFRfUVVBTElUWSB8fCBkZWZhdWx0UXVhbGl0eSA+IERZTl9ISUdIX1FVQUxJVFkpIHsKICAgICAgICAgICAgICAgICBkZWZhdWx0UXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTI1LDYgKzEzMywxMiBAQAogICAgICAgICByZXR1cm4gMjA7CiAgICAgY2FzZSBWRVJZX0hJR0hfUVVBTElUWToKICAgICAgICAgcmV0dXJuIDM0OworICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgICAgICByZXR1cm4gNDsKKyAgICBjYXNlIERZTl9NRURfUVVBTElUWToKKyAgICAgICAgcmV0dXJuIDY7CisgICAgY2FzZSBEWU5fSElHSF9RVUFMSVRZOgorICAgICAgICByZXR1cm4gMTI7CiAgICAgfQogfQogCkBAIC0xMzIsNyArMTQ2LDcgQEAKIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogc3RhdGljIHVpbnQzMl90IGN1cnJlbnRNSHogPSAwOwogCi1BdWRpb1Jlc2FtcGxlciogQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwKK0F1ZGlvUmVzYW1wbGVyKiBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGluQ2hhbm5lbENvdW50LAogICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpIHsKIAogICAgIGJvb2wgYXRGaW5hbFF1YWxpdHk7CkBAIC0xNDgsNiArMTYyLDE2IEBACiAgICAgICAgIGF0RmluYWxRdWFsaXR5ID0gdHJ1ZTsKICAgICB9CiAKKyAgICAvKiBpZiB0aGUgY2FsbGVyIHJlcXVlc3RzIERFRkFVTFRfUVVBTElUWSBhbmQgYWYucmVzYW1wbGVyLnByb3BlcnR5CisgICAgICogaGFzIG5vdCBiZWVuIHNldCwgdGhlIHRhcmdldCByZXNhbXBsZXIgcXVhbGl0eSBpcyBzZXQgdG8gRFlOX01FRF9RVUFMSVRZLAorICAgICAqIGFuZCBhbGxvd2VkIHRvICJ0aHJvdHRsZSIgZG93biB0byBEWU5fTE9XX1FVQUxJVFkgaWYgbmVjZXNzYXJ5CisgICAgICogZHVlIHRvIGVzdGltYXRlZCBDUFUgbG9hZCBvZiBoYXZpbmcgdG9vIG1hbnkgYWN0aXZlIHJlc2FtcGxlcnMKKyAgICAgKiAodGhlIGNvZGUgYmVsb3cgdGhlIGlmKS4KKyAgICAgKi8KKyAgICBpZiAocXVhbGl0eSA9PSBERUZBVUxUX1FVQUxJVFkpIHsKKyAgICAgICAgcXVhbGl0eSA9IERZTl9NRURfUVVBTElUWTsKKyAgICB9CisKICAgICAvLyBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBDUFUgbG9hZCB0aHJvdHRsaW5nIGRvZXNuJ3QgYWNjb3VudCBmb3Igd2hldGhlciByZXNhbXBsZXIgaXMgYWN0aXZlCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICAgZm9yICg7OykgewpAQCAtMTYyLDcgKzE4Niw2IEBACiAgICAgICAgIC8vIG5vdCBlbm91Z2ggQ1BVIGF2YWlsYWJsZSBmb3IgcHJvcG9zZWQgcXVhbGl0eSBsZXZlbCwgc28gdHJ5IG5leHQgbG93ZXN0IGxldmVsCiAgICAgICAgIHN3aXRjaCAocXVhbGl0eSkgewogICAgICAgICBkZWZhdWx0OgotICAgICAgICBjYXNlIERFRkFVTFRfUVVBTElUWToKICAgICAgICAgY2FzZSBMT1dfUVVBTElUWToKICAgICAgICAgICAgIGF0RmluYWxRdWFsaXR5ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc1LDYgKzE5OCwxNSBAQAogICAgICAgICBjYXNlIFZFUllfSElHSF9RVUFMSVRZOgogICAgICAgICAgICAgcXVhbGl0eSA9IEhJR0hfUVVBTElUWTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERZTl9MT1dfUVVBTElUWToKKyAgICAgICAgICAgIGF0RmluYWxRdWFsaXR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERZTl9NRURfUVVBTElUWToKKyAgICAgICAgICAgIHF1YWxpdHkgPSBEWU5fTE9XX1FVQUxJVFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEWU5fSElHSF9RVUFMSVRZOgorICAgICAgICAgICAgcXVhbGl0eSA9IERZTl9NRURfUVVBTElUWTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CkBAIC0xODMsMjIgKzIxNSw0MyBAQAogCiAgICAgc3dpdGNoIChxdWFsaXR5KSB7CiAgICAgZGVmYXVsdDoKLSAgICBjYXNlIERFRkFVTFRfUVVBTElUWToKICAgICBjYXNlIExPV19RVUFMSVRZOgogICAgICAgICBBTE9HVigiQ3JlYXRlIGxpbmVhciBSZXNhbXBsZXIiKTsKLSAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNRURfUVVBTElUWToKICAgICAgICAgQUxPR1YoIkNyZWF0ZSBjdWJpYyBSZXNhbXBsZXIiKTsKLSAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyQ3ViaWMoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJDdWJpYyhpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSElHSF9RVUFMSVRZOgogICAgICAgICBBTE9HVigiQ3JlYXRlIEhJR0hfUVVBTElUWSBzaW5jIFJlc2FtcGxlciIpOwotICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJTaW5jKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVkVSWV9ISUdIX1FVQUxJVFk6CiAgICAgICAgIEFMT0dWKCJDcmVhdGUgVkVSWV9ISUdIX1FVQUxJVFkgc2luYyBSZXNhbXBsZXIgPSAlZCIsIHF1YWxpdHkpOwotICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJTaW5jKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKKyAgICAgICAgQUxPR1YoIkNyZWF0ZSBkeW5hbWljIFJlc2FtcGxlciA9ICVkIiwgcXVhbGl0eSk7CisgICAgICAgIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyRHluPGZsb2F0LCBmbG9hdCwgZmxvYXQ+KGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgICAgIGlmIChxdWFsaXR5ID09IERZTl9ISUdIX1FVQUxJVFkpIHsKKyAgICAgICAgICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJEeW48aW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD4oaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyRHluPGludDE2X3QsIGludDE2X3QsIGludDMyX3Q+KGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0yMDcsMjYgKzI2MCwyNiBAQAogICAgIHJldHVybiByZXNhbXBsZXI7CiB9CiAKLUF1ZGlvUmVzYW1wbGVyOjpBdWRpb1Jlc2FtcGxlcihpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwKK0F1ZGlvUmVzYW1wbGVyOjpBdWRpb1Jlc2FtcGxlcihpbnQgaW5DaGFubmVsQ291bnQsCiAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSkgOgotICAgIG1CaXREZXB0aChiaXREZXB0aCksIG1DaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQpLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1JblNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1JbnB1dEluZGV4KDApLAotICAgICAgICAgICAgbVBoYXNlRnJhY3Rpb24oMCksIG1Mb2NhbFRpbWVGcmVxKDApLAotICAgICAgICAgICAgbVBUUyhBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyksIG1RdWFsaXR5KHF1YWxpdHkpIHsKLSAgICAvLyBzYW5pdHkgY2hlY2sgb24gZm9ybWF0Ci0gICAgaWYgKChiaXREZXB0aCAhPSAxNikgfHwoaW5DaGFubmVsQ291bnQgPCAxKSB8fCAoaW5DaGFubmVsQ291bnQgPiAyKSkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCwgJWQgYml0cywgJWQgY2hhbm5lbHMiLCBiaXREZXB0aCwKLSAgICAgICAgICAgICAgICBpbkNoYW5uZWxDb3VudCk7Ci0gICAgICAgIC8vIEFMT0dfQVNTRVJUKDApOworICAgICAgICBtQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1JblNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1JbnB1dEluZGV4KDApLAorICAgICAgICBtUGhhc2VGcmFjdGlvbigwKSwgbUxvY2FsVGltZUZyZXEoMCksCisgICAgICAgIG1QVFMoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpLCBtUXVhbGl0eShxdWFsaXR5KSB7CisKKyAgICBjb25zdCBpbnQgbWF4Q2hhbm5lbHMgPSBxdWFsaXR5IDwgRFlOX0xPV19RVUFMSVRZID8gMiA6IDg7CisgICAgaWYgKGluQ2hhbm5lbENvdW50IDwgMQorICAgICAgICAgICAgfHwgaW5DaGFubmVsQ291bnQgPiBtYXhDaGFubmVscykgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbnN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0ICVkIHF1YWxpdHkgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgIHF1YWxpdHksIGluQ2hhbm5lbENvdW50KTsKICAgICB9CiAgICAgaWYgKHNhbXBsZVJhdGUgPD0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJWQgSHoiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJWQgSHoiLCBzYW1wbGVSYXRlKTsKICAgICB9CiAKICAgICAvLyBpbml0aWFsaXplIGNvbW1vbiBtZW1iZXJzCiAgICAgbVZvbHVtZVswXSA9IG1Wb2x1bWVbMV0gPSAwOwogICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0KIH0KIAogQXVkaW9SZXNhbXBsZXI6On5BdWRpb1Jlc2FtcGxlcigpIHsKQEAgLTI0NiwxMCArMjk5LDEyIEBACiAgICAgbVBoYXNlSW5jcmVtZW50ID0gKHVpbnQzMl90KSgoa1BoYXNlTXVsdGlwbGllciAqIGluU2FtcGxlUmF0ZSkgLyBtU2FtcGxlUmF0ZSk7CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXI6OnNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpIHsKK3ZvaWQgQXVkaW9SZXNhbXBsZXI6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewogICAgIC8vIFRPRE86IEltcGxlbWVudCBhbnRpLXppcHBlciBmaWx0ZXIKLSAgICBtVm9sdW1lWzBdID0gbGVmdDsKLSAgICBtVm9sdW1lWzFdID0gcmlnaHQ7CisgICAgLy8gY29udmVydCB0byBVNC4xMiBmb3IgaW50ZXJuYWwgaW50ZWdlciB1c2UgKHJvdW5kIGRvd24pCisgICAgLy8gaW50ZWdlciB2b2x1bWUgdmFsdWVzIGFyZSBjbGFtcGVkIHRvIDAgdG8gVU5JVFlfR0FJTi4KKyAgICBtVm9sdW1lWzBdID0gdTRfMTJfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKGxlZnQpKTsKKyAgICBtVm9sdW1lWzFdID0gdTRfMTJfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKHJpZ2h0KSk7CiB9CiAKIHZvaWQgQXVkaW9SZXNhbXBsZXI6OnNldExvY2FsVGltZUZyZXEodWludDY0X3QgZnJlcSkgewpAQCAtMzA1LDcgKzM2MCw3IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgLy8gQUxPR0UoInN0YXJ0aW5nIHJlc2FtcGxlICVkIGZyYW1lcywgaW5wdXRJbmRleD0lZCwgcGhhc2VGcmFjdGlvbj0lZCwgcGhhc2VJbmNyZW1lbnQ9JWQiLAogICAgIC8vICAgICAgb3V0RnJhbWVDb3VudCwgaW5wdXRJbmRleCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwpAQCAtMzM5LDggKzM5NCw5IEBACiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdmwgKiBJbnRlcnAobVgwTCwgaW5bMF0sIHBoYXNlRnJhY3Rpb24pOwogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZyICogSW50ZXJwKG1YMFIsIGluWzFdLCBwaGFzZUZyYWN0aW9uKTsKICAgICAgICAgICAgIEFkdmFuY2UoJmlucHV0SW5kZXgsICZwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gb3V0cHV0U2FtcGxlQ291bnQpCisgICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gb3V0cHV0U2FtcGxlQ291bnQpIHsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIHByb2Nlc3MgaW5wdXQgc2FtcGxlcwpAQCAtNDAyLDcgKzQ1OCw3IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgLy8gQUxPR0UoInN0YXJ0aW5nIHJlc2FtcGxlICVkIGZyYW1lcywgaW5wdXRJbmRleD0lZCwgcGhhc2VGcmFjdGlvbj0lZCwgcGhhc2VJbmNyZW1lbnQ9JWQiLAogICAgIC8vICAgICAgb3V0RnJhbWVDb3VudCwgaW5wdXRJbmRleCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwpAQCAtNDM0LDggKzQ5MCw5IEBACiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdmwgKiBzYW1wbGU7CiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdnIgKiBzYW1wbGU7CiAgICAgICAgICAgICBBZHZhbmNlKCZpbnB1dEluZGV4LCAmcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwotICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09IG91dHB1dFNhbXBsZUNvdW50KQorICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09IG91dHB1dFNhbXBsZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBwcm9jZXNzIGlucHV0IHNhbXBsZXMKQEAgLTUxNCw2ICs1NzEsMTYgQEAKICAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAogICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KQogeworICAgICh2b2lkKW1heE91dFB0OyAvLyByZW1vdmUgdW51c2VkIHBhcmFtZXRlciB3YXJuaW5ncworICAgICh2b2lkKW1heEluSWR4OworICAgICh2b2lkKW91dHB1dEluZGV4OworICAgICh2b2lkKW91dDsKKyAgICAodm9pZClpbnB1dEluZGV4OworICAgICh2b2lkKXZsOworICAgICh2b2lkKXZyOworICAgICh2b2lkKXBoYXNlRnJhY3Rpb247CisgICAgKHZvaWQpcGhhc2VJbmNyZW1lbnQ7CisgICAgKHZvaWQpaW47CiAjZGVmaW5lIE1PX1BBUkFNNSAgICIzNiIgICAgICAgIC8vIG9mZnNldCBvZiBwYXJhbWV0ZXIgNSAob3V0cHV0SW5kZXgpCiAKICAgICBhc20oCkBAIC01MjYsNyArNTkzLDcgQEAKICAgICAgICAgIiAgIGxkciByOCwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDRdXG4iICAgICAvLyBvdXQKICAgICAgICAgIiAgIGxkciByMCwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDBdXG4iICAgICAvLyAmb3V0cHV0SW5kZXgKICAgICAgICAgIiAgIGxkciByMCwgW3IwXVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXRJbmRleAotICAgICAgICAiICAgYWRkIHI4LCByMCwgYXNsICMyXG4iICAgICAgICAgICAgICAgICAgIC8vIGN1ck91dAorICAgICAgICAiICAgYWRkIHI4LCByOCwgcjAsIGFzbCAjMlxuIiAgICAgICAgICAgICAgIC8vIGN1ck91dAogICAgICAgICAiICAgbGRyIHI5LCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMjRdXG4iICAgIC8vIHBoYXNlSW5jcmVtZW50CiAgICAgICAgICIgICBsZHIgcjEwLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMTJdXG4iICAgLy8gdmwKICAgICAgICAgIiAgIGxkciByMTEsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAxNl1cbiIgICAvLyB2cgpAQCAtNjI1LDYgKzY5MiwxNiBAQAogICAgICAgICAgICAgc2l6ZV90ICZvdXRwdXRJbmRleCwgaW50MzJfdCogb3V0LCBzaXplX3QgJmlucHV0SW5kZXgsIGludDMyX3QgdmwsIGludDMyX3QgdnIsCiAgICAgICAgICAgICB1aW50MzJfdCAmcGhhc2VGcmFjdGlvbiwgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQpCiB7CisgICAgKHZvaWQpbWF4T3V0UHQ7IC8vIHJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmdzCisgICAgKHZvaWQpbWF4SW5JZHg7CisgICAgKHZvaWQpb3V0cHV0SW5kZXg7CisgICAgKHZvaWQpb3V0OworICAgICh2b2lkKWlucHV0SW5kZXg7CisgICAgKHZvaWQpdmw7CisgICAgKHZvaWQpdnI7CisgICAgKHZvaWQpcGhhc2VGcmFjdGlvbjsKKyAgICAodm9pZClwaGFzZUluY3JlbWVudDsKKyAgICAodm9pZClpbjsKICNkZWZpbmUgU1RfUEFSQU01ICAgICI0MCIgICAgIC8vIG9mZnNldCBvZiBwYXJhbWV0ZXIgNSAob3V0cHV0SW5kZXgpCiAgICAgYXNtKAogICAgICAgICAic3RtZmQgIHNwISwge3I0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIGxyfVxuIgpAQCAtNjM2LDcgKzcxMyw3IEBACiAgICAgICAgICIgICBsZHIgcjgsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyA0XVxuIiAgICAgLy8gb3V0CiAgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAwXVxuIiAgICAgLy8gJm91dHB1dEluZGV4CiAgICAgICAgICIgICBsZHIgcjAsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0SW5kZXgKLSAgICAgICAgIiAgIGFkZCByOCwgcjAsIGFzbCAjMlxuIiAgICAgICAgICAgICAgICAgICAvLyBjdXJPdXQKKyAgICAgICAgIiAgIGFkZCByOCwgcjgsIHIwLCBhc2wgIzJcbiIgICAgICAgICAgICAgICAvLyBjdXJPdXQKICAgICAgICAgIiAgIGxkciByOSwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDI0XVxuIiAgICAvLyBwaGFzZUluY3JlbWVudAogICAgICAgICAiICAgbGRyIHIxMCwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDEyXVxuIiAgIC8vIHZsCiAgICAgICAgICIgICBsZHIgcjExLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMTZdXG4iICAgLy8gdnIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKaW5kZXggMzNlNjRjZS4uY2RjNmQ5MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDEsMTYgKzQyLDIxIEBACiAgICAgICAgIE1FRF9RVUFMSVRZPTIsCiAgICAgICAgIEhJR0hfUVVBTElUWT0zLAogICAgICAgICBWRVJZX0hJR0hfUVVBTElUWT00LAorICAgICAgICBEWU5fTE9XX1FVQUxJVFk9NSwKKyAgICAgICAgRFlOX01FRF9RVUFMSVRZPTYsCisgICAgICAgIERZTl9ISUdIX1FVQUxJVFk9NywKICAgICB9OwogCi0gICAgc3RhdGljIEF1ZGlvUmVzYW1wbGVyKiBjcmVhdGUoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IFVOSVRZX0dBSU5fRkxPQVQgPSAxLjBmOworCisgICAgc3RhdGljIEF1ZGlvUmVzYW1wbGVyKiBjcmVhdGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgaW5DaGFubmVsQ291bnQsCiAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHk9REVGQVVMVF9RVUFMSVRZKTsKIAogICAgIHZpcnR1YWwgfkF1ZGlvUmVzYW1wbGVyKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgaW5pdCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U2FtcGxlUmF0ZShpbnQzMl90IGluU2FtcGxlUmF0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRMb2NhbFRpbWVGcmVxKHVpbnQ2NF90IGZyZXEpOwogCiAgICAgLy8gc2V0IHRoZSBQVFMgb2YgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBieSB0aGUgcmVzYW1wbGVyCkBAIC02MCw3ICs2Niw3IEBACiAgICAgLy8gQSBtb25vIHByb3ZpZGVyIGRlbGl2ZXJzIGEgc2VxdWVuY2Ugb2Ygc2FtcGxlcy4KICAgICAvLyBBIHN0ZXJlbyBwcm92aWRlciBkZWxpdmVycyBhIHNlcXVlbmNlIG9mIGludGVybGVhdmVkIHBhaXJzIG9mIHNhbXBsZXMuCiAgICAgLy8gTXVsdGktY2hhbm5lbCBwcm92aWRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgLy8gSW4gZWl0aGVyIGNhc2UsICdvdXQnIGhvbGRzIGludGVybGVhdmVkIHBhaXJzIG9mIGZpeGVkLXBvaW50IHNpZ25lZCBRMTkuMTIuCisgICAgLy8gSW4gZWl0aGVyIGNhc2UsICdvdXQnIGhvbGRzIGludGVybGVhdmVkIHBhaXJzIG9mIGZpeGVkLXBvaW50IFE0LjI3LgogICAgIC8vIFRoYXQgaXMsIGZvciBhIG1vbm8gcHJvdmlkZXIsIHRoZXJlIGlzIGFuIGltcGxpY2l0IHVwLWNoYW5uZWxpbmcuCiAgICAgLy8gU2luY2UgdGhpcyBtZXRob2QgYWNjdW11bGF0ZXMsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsZWFyaW5nICdvdXQnIGluaXRpYWxseS4KICAgICAvLyBGSVhNRSBhc3N1bWVzIHByb3ZpZGVyIGlzIGFsd2F5cyBzdWNjZXNzZnVsOyBpdCBzaG91bGQgcmV0dXJuIHRoZSBhY3R1YWwgZnJhbWUgY291bnQuCkBAIC04MSw5ICs4Nyw5IEBACiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtQaGFzZU1hc2sgPSAoMUxVPDxrTnVtUGhhc2VCaXRzKS0xOwogCiAgICAgLy8gbXVsdGlwbGllciB0byBjYWxjdWxhdGUgZml4ZWQgcG9pbnQgcGhhc2UgaW5jcmVtZW50Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrUGhhc2VNdWx0aXBsaWVyID0gMUwgPDwga051bVBoYXNlQml0czsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtQaGFzZU11bHRpcGxpZXI7CiAKLSAgICBBdWRpb1Jlc2FtcGxlcihpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KTsKKyAgICBBdWRpb1Jlc2FtcGxlcihpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSk7CiAKICAgICAvLyBwcmV2ZW50IGNvcHlpbmcKICAgICBBdWRpb1Jlc2FtcGxlcihjb25zdCBBdWRpb1Jlc2FtcGxlciYpOwpAQCAtOTEsNyArOTcsNiBAQAogCiAgICAgaW50NjRfdCBjYWxjdWxhdGVPdXRwdXRQVFMoaW50IG91dHB1dEZyYW1lSW5kZXgpOwogCi0gICAgY29uc3QgaW50MzJfdCBtQml0RGVwdGg7CiAgICAgY29uc3QgaW50MzJfdCBtQ2hhbm5lbENvdW50OwogICAgIGNvbnN0IGludDMyX3QgbVNhbXBsZVJhdGU7CiAgICAgaW50MzJfdCBtSW5TYW1wbGVSYXRlOwpAQCAtMTA3LDYgKzExMiw0NyBAQAogICAgIHVpbnQ2NF90IG1Mb2NhbFRpbWVGcmVxOwogICAgIGludDY0X3QgbVBUUzsKIAorICAgIC8vIHJldHVybnMgdGhlIGluRnJhbWVDb3VudCByZXF1aXJlZCB0byBnZW5lcmF0ZSBvdXRGcmFtZUNvdW50IGZyYW1lcy4KKyAgICAvLworICAgIC8vIFBsYWNlZCBoZXJlIHRvIGJlIGEgY29uc2lzdGVudCBmb3IgYWxsIHJlc2FtcGxlcnMuCisgICAgLy8KKyAgICAvLyBSaWdodCBub3csIHdlIHVzZSB0aGUgdXBwZXIgYm91bmQgd2l0aG91dCByZWdhcmRzIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQorICAgIC8vIGlucHV0IGJ1ZmZlciB1c2luZyBpbnRlZ2VyIGFyaXRobWV0aWMsIGFzIGZvbGxvd3M6CisgICAgLy8KKyAgICAvLyAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG91dEZyYW1lQ291bnQpKm1JblNhbXBsZVJhdGUgKyAobVNhbXBsZVJhdGUgLSAxKSkvbVNhbXBsZVJhdGU7CisgICAgLy8KKyAgICAvLyBUaGUgZG91YmxlIHByZWNpc2lvbiBlcXVpdmFsZW50IChmbG9hdCBtYXkgbm90IGJlIHByZWNpc2UgZW5vdWdoKToKKyAgICAvLyBjZWlsKHN0YXRpY19jYXN0PGRvdWJsZT4ob3V0RnJhbWVDb3VudCkgKiBtSW5TYW1wbGVSYXRlIC8gbVNhbXBsZVJhdGUpOworICAgIC8vCisgICAgLy8gdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUgbVBoYXNlSW5jcmVtZW50IGlzIHJvdW5kZWQgZG93biBmcm9tCisgICAgLy8gI3BoYXNlcyAqIG1JblNhbXBsZVJhdGUvbVNhbXBsZVJhdGUgYW5kIHRoZSBmYWN0IHRoYXQgU3VtKEZsb29yKHgpKSA8PSBGbG9vcihTdW0oeCkpLgorICAgIC8vIGh0dHA6Ly93d3cucHJvb2Z3aWtpLm9yZy93aWtpL1N1bV9vZl9GbG9vcnNfTm90X0dyZWF0ZXJfVGhhbl9GbG9vcl9vZl9TdW1zCisgICAgLy8KKyAgICAvLyAoc28gbG9uZyBhcyBkb3VibGUgcHJlY2lzaW9uIGlzIGNvbXB1dGVkIGFjY3VyYXRlbHkgZW5vdWdoIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAvLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIEZsb29yKHgpIHZhbHVlIGluIGludDMyX3QgYXJpdGhtZXRpYzsgdGh1cyB0aGlzCisgICAgLy8gd2lsbCBub3QgbmVjZXNzYXJpbHkgaG9sZCBmb3IgZmxvYXRzKS4KKyAgICAvLworICAgIC8vIFRPRE86CisgICAgLy8gR3JlYXRlciBhY2N1cmFjeSBhbmQgYSB0aWdodCBib3VuZCBpcyBvYnRhaW5lZCBieToKKyAgICAvLyAxKSBzdWJ0cmFjdCBhbmQgYWRqdXN0IGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQXVkaW9CdWZmZXJQcm92aWRlciBidWZmZXIuCisgICAgLy8gMikgdXNpbmcgdGhlIGV4YWN0IGludGVnZXIgZm9ybXVsYSB3aGVyZSAoaWdub3JpbmcgNjRiIGNhc3RpbmcpCisgICAgLy8gIGluRnJhbWVDb3VudCA9IChtUGhhc2VJbmNyZW1lbnQgKiAob3V0RnJhbWVDb3VudCAtIDEpICsgbVBoYXNlRnJhY3Rpb24pIC8gcGhhc2VXcmFwTGltaXQ7CisgICAgLy8gIHBoYXNlV3JhcExpbWl0IGlzIHRoZSB3cmFwYXJvdW5kICgxIDw8IGtOdW1QaGFzZUJpdHMpLCBpZiBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisgICAgLy8KKyAgICBpbmxpbmUgc2l6ZV90IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKHNpemVfdCBvdXRGcmFtZUNvdW50KSB7CisgICAgICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG91dEZyYW1lQ291bnQpKm1JblNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICArIChtU2FtcGxlUmF0ZSAtIDEpKS9tU2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgZmxvYXQgY2xhbXBGbG9hdFZvbChmbG9hdCB2b2x1bWUpIHsKKyAgICAgICAgaWYgKHZvbHVtZSA+IFVOSVRZX0dBSU5fRkxPQVQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB9IGVsc2UgaWYgKHZvbHVtZSA+PSAwLikgeworICAgICAgICAgICAgcmV0dXJuIHZvbHVtZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMC47ICAvLyBOYU4gb3IgbmVnYXRpdmUgdm9sdW1lIG1hcHMgdG8gMC4KKyAgICB9CisKIHByaXZhdGU6CiAgICAgY29uc3Qgc3JjX3F1YWxpdHkgbVF1YWxpdHk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcAppbmRleCAxOGU1OWU5Li44ZjE0ZmY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCkBAIC02MCwxNCArNjAsMTUgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQob3V0RnJhbWVDb3VudCk7CiAKICAgICAvLyBmZXRjaCBmaXJzdCBidWZmZXIKICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgbVBUUyk7Ci0gICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQorICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZG4iLCBtQnVmZmVyLnJhdywgbUJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICB9CiAgICAgaW50MTZfdCAqaW4gPSBtQnVmZmVyLmkxNjsKQEAgLTk3LDggKzk4LDkgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlT3V0cHV0UFRTKG91dHB1dEluZGV4IC8gMikpOwotICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2F2ZV9zdGF0ZTsgIC8vIHVnbHksIGJ1dCBlZmZpY2llbnQKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW4gPSBtQnVmZmVyLmkxNjsKICAgICAgICAgICAgICAgICAvLyBBTE9HVygiTmV3IGJ1ZmZlcjogb2Zmc2V0PSVwLCBmcmFtZXM9JWQiLCBtQnVmZmVyLnJhdywgbUJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgICAgIH0KQEAgLTEyNiwxNCArMTI4LDE1IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgLy8gZmV0Y2ggZmlyc3QgYnVmZmVyCiAgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIG1QVFMpOwotICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKKyAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICAvLyBBTE9HVygiTmV3IGJ1ZmZlcjogb2Zmc2V0PSVwLCBmcmFtZXM9JWQiLCBtQnVmZmVyLnJhdywgbUJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICB9CiAgICAgaW50MTZfdCAqaW4gPSBtQnVmZmVyLmkxNjsKQEAgLTE2Myw4ICsxNjYsOSBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVPdXRwdXRQVFMob3V0cHV0SW5kZXggLyAyKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBzYXZlX3N0YXRlOyAgLy8gdWdseSwgYnV0IGVmZmljaWVudAorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBBTE9HVygiTmV3IGJ1ZmZlcjogb2Zmc2V0PSVwLCBmcmFtZXM9JWRuIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgaW4gPSBtQnVmZmVyLmkxNjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oCmluZGV4IDIwM2I5MzMuLmIzMTVkYTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaApAQCAtMjgsOCArMjgsOCBAQAogCiBjbGFzcyBBdWRpb1Jlc2FtcGxlckN1YmljIDogcHVibGljIEF1ZGlvUmVzYW1wbGVyIHsKIHB1YmxpYzoKLSAgICBBdWRpb1Jlc2FtcGxlckN1YmljKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpIDoKLSAgICAgICAgQXVkaW9SZXNhbXBsZXIoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBNRURfUVVBTElUWSkgeworICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMoaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpIDoKKyAgICAgICAgQXVkaW9SZXNhbXBsZXIoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIE1FRF9RVUFMSVRZKSB7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlYjIwMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTAsMCArMSw2MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUmVzYW1wbGVyRHluIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJGaXJPcHMuaCIgLy8gVVNFX05FT04gYW5kIFVTRV9JTkxJTkVfQVNTRU1CTFkgZGVmaW5lZCBoZXJlCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgiCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzTmVvbi5oIgorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRmlyR2VuLmgiIC8vIHJlcXVpcmVzIG1hdGguaAorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRHluLmgiCisKKy8vI2RlZmluZSBERUJVR19SRVNBTVBMRVIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorICogSW5CdWZmZXIgaXMgYSB0eXBlIGFnbm9zdGljIGlucHV0IGJ1ZmZlci4KKyAqCisgKiBMYXlvdXQgb2YgdGhlIHN0YXRlIGJ1ZmZlciBmb3IgaGFsZk51bUNvZWZzPTguCisgKgorICogW3JycnJycnBwcHBwcHBwbm5ubm5ubm5ycnJycnJycnJycnJycnJycnJyLi4uLiBycnJycnJyXQorICogIFMgICAgICAgICAgICBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSCisgKgorICogUyA9IG1TdGF0ZQorICogSSA9IG1JbXB1bHNlCisgKiBSID0gbVJpbmdGdWxsCisgKiBwID0gcGFzdCBzYW1wbGVzLCBjb252b2x1dGVkIHdpdGggdGhlIChwKW9zaXRpdmUgc2lkZSBvZiBzaW5jKCkKKyAqIG4gPSBmdXR1cmUgc2FtcGxlcywgY29udm9sdXRlZCB3aXRoIHRoZSAobillZ2F0aXZlIHNpZGUgb2Ygc2luYygpCisgKiByID0gZXh0cmEgc3BhY2UgZm9yIGltcGxlbWVudGluZyB0aGUgcmluZyBidWZmZXIKKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjpJbkJ1ZmZlcigpCisgICAgOiBtU3RhdGUoTlVMTCksIG1JbXB1bHNlKE5VTEwpLCBtUmluZ0Z1bGwoTlVMTCksIG1TdGF0ZUNvdW50KDApCit7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6On5JbkJ1ZmZlcigpCit7CisgICAgaW5pdCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OmluaXQoKQoreworICAgIGZyZWUobVN0YXRlKTsKKyAgICBtU3RhdGUgPSBOVUxMOworICAgIG1JbXB1bHNlID0gTlVMTDsKKyAgICBtUmluZ0Z1bGwgPSBOVUxMOworICAgIG1TdGF0ZUNvdW50ID0gMDsKK30KKworLy8gcmVzaXplcyB0aGUgc3RhdGUgYnVmZmVyIHRvIGFjY29tbW9kYXRlIHRoZSBhcHByb3ByaWF0ZSBmaWx0ZXIgbGVuZ3RoCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OnJlc2l6ZShpbnQgQ0hBTk5FTFMsIGludCBoYWxmTnVtQ29lZnMpCit7CisgICAgLy8gY2FsY3VsYXRlIGRlc2lyZWQgc3RhdGUgc2l6ZQorICAgIHNpemVfdCBzdGF0ZUNvdW50ID0gaGFsZk51bUNvZWZzICogQ0hBTk5FTFMgKiAyICoga1N0YXRlU2l6ZU11bHRpcGxlT2ZGaWx0ZXJMZW5ndGg7CisKKyAgICAvLyBjaGVjayBpZiBidWZmZXIgbmVlZHMgcmVzaXppbmcKKyAgICBpZiAobVN0YXRlCisgICAgICAgICAgICAmJiBzdGF0ZUNvdW50ID09IG1TdGF0ZUNvdW50CisgICAgICAgICAgICAmJiBtUmluZ0Z1bGwtbVN0YXRlID09IChzc2l6ZV90KSAobVN0YXRlQ291bnQtaGFsZk51bUNvZWZzKkNIQU5ORUxTKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY3JlYXRlIG5ldyBidWZmZXIKKyAgICBUSSogc3RhdGUgPSBOVUxMOworICAgICh2b2lkKXBvc2l4X21lbWFsaWduKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmc3RhdGUpLCAzMiwgc3RhdGVDb3VudCpzaXplb2YoKnN0YXRlKSk7CisgICAgbWVtc2V0KHN0YXRlLCAwLCBzdGF0ZUNvdW50KnNpemVvZigqc3RhdGUpKTsKKworICAgIC8vIGF0dGVtcHQgdG8gcHJlc2VydmUgc3RhdGUKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIFRJKiBzcmNMbyA9IG1JbXB1bHNlIC0gaGFsZk51bUNvZWZzKkNIQU5ORUxTOworICAgICAgICBUSSogc3JjSGkgPSBtSW1wdWxzZSArIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKKyAgICAgICAgVEkqIGRzdCA9IHN0YXRlOworCisgICAgICAgIGlmIChzcmNMbyA8IG1TdGF0ZSkgeworICAgICAgICAgICAgZHN0ICs9IG1TdGF0ZS1zcmNMbzsKKyAgICAgICAgICAgIHNyY0xvID0gbVN0YXRlOworICAgICAgICB9CisgICAgICAgIGlmIChzcmNIaSA+IG1TdGF0ZSArIG1TdGF0ZUNvdW50KSB7CisgICAgICAgICAgICBzcmNIaSA9IG1TdGF0ZSArIG1TdGF0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIG1lbWNweShkc3QsIHNyY0xvLCAoc3JjSGkgLSBzcmNMbykgKiBzaXplb2YoKnNyY0xvKSk7CisgICAgICAgIGZyZWUobVN0YXRlKTsKKyAgICB9CisKKyAgICAvLyBzZXQgY2xhc3MgbWVtYmVyIHZhcnMKKyAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICBtU3RhdGVDb3VudCA9IHN0YXRlQ291bnQ7CisgICAgbUltcHVsc2UgPSBzdGF0ZSArIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsgLy8gYWN0dWFsbHkgb25lIHNhbXBsZSBncmVhdGVyIHRoYW4gbmVlZGVkCisgICAgbVJpbmdGdWxsID0gc3RhdGUgKyBtU3RhdGVDb3VudCAtIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKK30KKworLy8gY29weSBpbiB0aGUgaW5wdXQgZGF0YSBpbnRvIHRoZSBoZWFkIChpbXB1bHNlK2hhbGZOdW1Db2Vmcykgb2YgdGhlIGJ1ZmZlci4KK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpJbkJ1ZmZlcjo6cmVhZEFnYWluKFRJKiYgaW1wdWxzZSwgY29uc3QgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluLCBjb25zdCBzaXplX3QgaW5wdXRJbmRleCkKK3sKKyAgICBUSSogaGVhZCA9IGltcHVsc2UgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxDSEFOTkVMUyA7IGkrKykgeworICAgICAgICBoZWFkW2ldID0gaW5baW5wdXRJbmRleCpDSEFOTkVMUyArIGldOworICAgIH0KK30KKworLy8gYWR2YW5jZSB0aGUgaW1wdWxzZSBwb2ludGVyLCBhbmQgbG9hZCBpbiBkYXRhIGludG8gdGhlIGhlYWQgKGltcHVsc2UraGFsZk51bUNvZWZzKQordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3RlbXBsYXRlPGludCBDSEFOTkVMUz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjpyZWFkQWR2YW5jZShUSSomIGltcHVsc2UsIGNvbnN0IGludCBoYWxmTnVtQ29lZnMsCisgICAgICAgIGNvbnN0IFRJKiBjb25zdCBpbiwgY29uc3Qgc2l6ZV90IGlucHV0SW5kZXgpCit7CisgICAgaW1wdWxzZSArPSBDSEFOTkVMUzsKKworICAgIGlmIChDQ19VTkxJS0VMWShpbXB1bHNlID49IG1SaW5nRnVsbCkpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHNoaWZ0RG93biA9IG1SaW5nRnVsbCAtIG1TdGF0ZSAtIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKKyAgICAgICAgbWVtY3B5KG1TdGF0ZSwgbVN0YXRlK3NoaWZ0RG93biwgaGFsZk51bUNvZWZzKkNIQU5ORUxTKjIqc2l6ZW9mKFRJKSk7CisgICAgICAgIGltcHVsc2UgLT0gc2hpZnREb3duOworICAgIH0KKyAgICByZWFkQWdhaW48Q0hBTk5FTFM+KGltcHVsc2UsIGhhbGZOdW1Db2VmcywgaW4sIGlucHV0SW5kZXgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6Q29uc3RhbnRzOjpzZXQoCisgICAgICAgIGludCBMLCBpbnQgaGFsZk51bUNvZWZzLCBpbnQgaW5TYW1wbGVSYXRlLCBpbnQgb3V0U2FtcGxlUmF0ZSkKK3sKKyAgICBpbnQgYml0cyA9IDA7CisgICAgaW50IGxzY2FsZSA9IGluU2FtcGxlUmF0ZS9vdXRTYW1wbGVSYXRlIDwgMiA/IEwgLSAxIDoKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KEwpKmluU2FtcGxlUmF0ZS9vdXRTYW1wbGVSYXRlKTsKKyAgICBmb3IgKGludCBpPWxzY2FsZTsgaTsgKytiaXRzLCBpPj49MSkKKyAgICAgICAgOworICAgIG1MID0gTDsKKyAgICBtU2hpZnQgPSBrTnVtUGhhc2VCaXRzIC0gYml0czsKKyAgICBtSGFsZk51bUNvZWZzID0gaGFsZk51bUNvZWZzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkF1ZGlvUmVzYW1wbGVyRHluKAorICAgICAgICBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSkKKyAgICA6IEF1ZGlvUmVzYW1wbGVyKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBxdWFsaXR5KSwKKyAgICAgIG1SZXNhbXBsZUZ1bmMoMCksIG1GaWx0ZXJTYW1wbGVSYXRlKDApLCBtRmlsdGVyUXVhbGl0eShERUZBVUxUX1FVQUxJVFkpLAorICAgIG1Db2VmQnVmZmVyKE5VTEwpCit7CisgICAgbVZvbHVtZVNpbWRbMF0gPSBtVm9sdW1lU2ltZFsxXSA9IDA7CisgICAgLy8gVGhlIEF1ZGlvUmVzYW1wbGVyIGJhc2UgY2xhc3MgYXNzdW1lcyB3ZSBhcmUgYWx3YXlzIHJlYWR5IGZvciAxOjEgcmVzYW1wbGluZy4KKyAgICAvLyBXZSByZXNldCBtSW5TYW1wbGVSYXRlIHRvIDAsIHNvIHNldFNhbXBsZVJhdGUoKSB3aWxsIGNhbGN1bGF0ZSBmaWx0ZXJzIGZvcgorICAgIC8vIHNldFNhbXBsZVJhdGUoKSBmb3IgMToxLiAoTWF5IGJlIHJlbW92ZWQgaWYgcHJlY2FsY3VsYXRlZCBmaWx0ZXJzIGFyZSB1c2VkLikKKyAgICBtSW5TYW1wbGVSYXRlID0gMDsKKyAgICBtQ29uc3RhbnRzLnNldCgxMjgsIDgsIG1TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7IC8vIFRPRE86IHNldCBiZXR0ZXIKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK0F1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+Ojp+QXVkaW9SZXNhbXBsZXJEeW4oKQoreworICAgIGZyZWUobUNvZWZCdWZmZXIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6aW5pdCgpCit7CisgICAgbUZpbHRlclNhbXBsZVJhdGUgPSAwOyAvLyBhbHdheXMgdHJpZ2dlciBuZXcgZmlsdGVyIGdlbmVyYXRpb24KKyAgICBtSW5CdWZmZXIuaW5pdCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KQoreworICAgIEF1ZGlvUmVzYW1wbGVyOjpzZXRWb2x1bWUobGVmdCwgcmlnaHQpOworICAgIGlmIChpc19zYW1lPFRPLCBmbG9hdD46OnZhbHVlIHx8IGlzX3NhbWU8VE8sIGRvdWJsZT46OnZhbHVlKSB7CisgICAgICAgIG1Wb2x1bWVTaW1kWzBdID0gc3RhdGljX2Nhc3Q8VE8+KGxlZnQpOworICAgICAgICBtVm9sdW1lU2ltZFsxXSA9IHN0YXRpY19jYXN0PFRPPihyaWdodCk7CisgICAgfSBlbHNlIHsgIC8vIGludGVnZXIgcmVxdWlyZXMgc2NhbGluZyB0byBVNF8yOCAocm91bmRpbmcgZG93bikKKyAgICAgICAgLy8gaW50ZWdlciB2b2x1bWVzIGFyZSBjbGFtcGVkIHRvIDAgdG8gVU5JVFlfR0FJTiBzbyB0aGVyZQorICAgICAgICAvLyBhcmUgbm8gaXNzdWVzIHdpdGggc2lnbmVkIG92ZXJmbG93LgorICAgICAgICBtVm9sdW1lU2ltZFswXSA9IHU0XzI4X2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChsZWZ0KSk7CisgICAgICAgIG1Wb2x1bWVTaW1kWzFdID0gdTRfMjhfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKHJpZ2h0KSk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIG1heChUIGEsIFQgYikge3JldHVybiBhID4gYiA/IGEgOiBiO30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBhYnNkaWZmKFQgYSwgVCBiKSB7cmV0dXJuIGEgPiBiID8gYSAtIGIgOiBiIC0gYTt9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpjcmVhdGVLYWlzZXJGaXIoQ29uc3RhbnRzICZjLAorICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbiwgaW50IGluU2FtcGxlUmF0ZSwgaW50IG91dFNhbXBsZVJhdGUsIGRvdWJsZSB0YndDaGVhdCkKK3sKKyAgICBUQyogYnVmID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGF0dGVuID0gMC45OTk4OyAgIC8vIHRvIGF2b2lkIHJpcHBsZSBvdmVyZmxvdworICAgIGRvdWJsZSBmY3I7CisgICAgZG91YmxlIHRidyA9IGZpckthaXNlclRidyhjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4pOworCisgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24ocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZidWYpLCAzMiwgKGMubUwrMSkqYy5tSGFsZk51bUNvZWZzKnNpemVvZihUQykpOworICAgIGlmIChpblNhbXBsZVJhdGUgPCBvdXRTYW1wbGVSYXRlKSB7IC8vIHVwc2FtcGxlCisgICAgICAgIGZjciA9IG1heCgwLjUqdGJ3Q2hlYXQgLSB0YncvMiwgdGJ3LzIpOworICAgIH0gZWxzZSB7IC8vIGRvd25zYW1wbGUKKyAgICAgICAgZmNyID0gbWF4KDAuNSp0YndDaGVhdCpvdXRTYW1wbGVSYXRlL2luU2FtcGxlUmF0ZSAtIHRidy8yLCB0YncvMik7CisgICAgfQorICAgIC8vIGNyZWF0ZSBhbmQgc2V0IGZpbHRlcgorICAgIGZpckthaXNlckdlbihidWYsIGMubUwsIGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbiwgZmNyLCBhdHRlbik7CisgICAgYy5tRmlyQ29lZnMgPSBidWY7CisgICAgaWYgKG1Db2VmQnVmZmVyKSB7CisgICAgICAgIGZyZWUobUNvZWZCdWZmZXIpOworICAgIH0KKyAgICBtQ29lZkJ1ZmZlciA9IGJ1ZjsKKyNpZmRlZiBERUJVR19SRVNBTVBMRVIKKyAgICAvLyBwcmludCBiYXNpYyBmaWx0ZXIgc3RhdHMKKyAgICBwcmludGYoIkw6JWQgIGhuYzolZCAgc3RvcEJhbmRBdHRlbjolbGYgIGZjcjolbGYgIGF0dGVuOiVsZiAgdGJ3OiVsZlxuIiwKKyAgICAgICAgICAgIGMubUwsIGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbiwgZmNyLCBhdHRlbiwgdGJ3KTsKKyAgICAvLyB0ZXN0IHRoZSBmaWx0ZXIgYW5kIHJlcG9ydCByZXN1bHRzCisgICAgZG91YmxlIGZwID0gKGZjciAtIHRidy8yKS9jLm1MOworICAgIGRvdWJsZSBmcyA9IChmY3IgKyB0YncvMikvYy5tTDsKKyAgICBkb3VibGUgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZTsKKyAgICBkb3VibGUgc3RvcE1heCwgc3RvcFJpcHBsZTsKKyAgICB0ZXN0RmlyKGJ1ZiwgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBmcCwgZnMsIC8qcGFzc1N0ZXBzKi8gMTAwMCwgLypzdG9wU3RlcHMqLyAxMDAwMDAsCisgICAgICAgICAgICBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlLCBzdG9wTWF4LCBzdG9wUmlwcGxlKTsKKyAgICBwcmludGYoInBhc3NiYW5kKCVsZiwgJWxmKTogJS44bGYgJS44bGYgJS44bGZcbiIsIDAuLCBmcCwgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSk7CisgICAgcHJpbnRmKCJzdG9wYmFuZCglbGYsICVsZik6ICUuOGxmICUuM2xmXG4iLCBmcywgMC41LCBzdG9wTWF4LCBzdG9wUmlwcGxlKTsKKyNlbmRpZgorfQorCisvLyByZWN1cnNpdmUgZ2NkLiBVc2luZyBvYmpkdW1wLCBpdCBhcHBlYXJzIHRoZSB0YWlsIHJlY3Vyc2lvbiBpcyBjb252ZXJ0ZWQgdG8gYSB3aGlsZSBsb29wLgorc3RhdGljIGludCBnY2QoaW50IG4sIGludCBtKQoreworICAgIGlmIChtID09IDApIHsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorICAgIHJldHVybiBnY2QobSwgbiAlIG0pOworfQorCitzdGF0aWMgYm9vbCBpc0Nsb3NlKGludDMyX3QgbmV3U2FtcGxlUmF0ZSwgaW50MzJfdCBwcmV2U2FtcGxlUmF0ZSwKKyAgICAgICAgaW50MzJfdCBmaWx0ZXJTYW1wbGVSYXRlLCBpbnQzMl90IG91dFNhbXBsZVJhdGUpCit7CisKKyAgICAvLyBkaWZmZXJlbnQgdXBzYW1wbGluZyByYXRpb3MgZG8gbm90IG5lZWQgYSBmaWx0ZXIgY2hhbmdlLgorICAgIGlmIChmaWx0ZXJTYW1wbGVSYXRlICE9IDAKKyAgICAgICAgICAgICYmIGZpbHRlclNhbXBsZVJhdGUgPCBvdXRTYW1wbGVSYXRlCisgICAgICAgICAgICAmJiBuZXdTYW1wbGVSYXRlIDwgb3V0U2FtcGxlUmF0ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBjaGVjayBkZXNpZ24gY3JpdGVyaWEgYWdhaW4gaWYgZG93bnNhbXBsaW5nIGlzIGRldGVjdGVkLgorICAgIGludCBwZGlmZiA9IGFic2RpZmYobmV3U2FtcGxlUmF0ZSwgcHJldlNhbXBsZVJhdGUpOworICAgIGludCBhZGlmZiA9IGFic2RpZmYobmV3U2FtcGxlUmF0ZSwgZmlsdGVyU2FtcGxlUmF0ZSk7CisKKyAgICAvLyBhbGxvdyB1cCB0byA2JSByZWxhdGl2ZSBjaGFuZ2UgaW5jcmVtZW50cy4KKyAgICAvLyBhbGxvdyB1cCB0byAxMiUgYWJzb2x1dGUgY2hhbmdlIGluY3JlbWVudHMgKGZyb20gZmlsdGVyIGRlc2lnbikKKyAgICByZXR1cm4gcGRpZmYgPCBwcmV2U2FtcGxlUmF0ZT4+NCAmJiBhZGlmZiA8IGZpbHRlclNhbXBsZVJhdGU+PjM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpzZXRTYW1wbGVSYXRlKGludDMyX3QgaW5TYW1wbGVSYXRlKQoreworICAgIGlmIChtSW5TYW1wbGVSYXRlID09IGluU2FtcGxlUmF0ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3Qgb2xkU2FtcGxlUmF0ZSA9IG1JblNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBvbGRIYWxmTnVtQ29lZnMgPSBtQ29uc3RhbnRzLm1IYWxmTnVtQ29lZnM7CisgICAgdWludDMyX3Qgb2xkUGhhc2VXcmFwTGltaXQgPSBtQ29uc3RhbnRzLm1MIDw8IG1Db25zdGFudHMubVNoaWZ0OworICAgIGJvb2wgdXNlUzMyID0gZmFsc2U7CisKKyAgICBtSW5TYW1wbGVSYXRlID0gaW5TYW1wbGVSYXRlOworCisgICAgLy8gVE9ETzogQWRkIHByZWNhbGN1bGF0ZWQgRXF1aXJpcHBsZSBmaWx0ZXJzCisKKyAgICBpZiAobUZpbHRlclF1YWxpdHkgIT0gZ2V0UXVhbGl0eSgpIHx8CisgICAgICAgICAgICAhaXNDbG9zZShpblNhbXBsZVJhdGUsIG9sZFNhbXBsZVJhdGUsIG1GaWx0ZXJTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgbUZpbHRlclNhbXBsZVJhdGUgPSBpblNhbXBsZVJhdGU7CisgICAgICAgIG1GaWx0ZXJRdWFsaXR5ID0gZ2V0UXVhbGl0eSgpOworCisgICAgICAgIC8vIEJlZ2luIEthaXNlciBGaWx0ZXIgY29tcHV0YXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHF1YW50aXphdGlvbiBmbG9vciBmb3IgUzE2IGlzIGFib3V0IDk2ZGIgLSAxMCpsb2dfMTAoI2xlbmd0aCkgKyAzZEIuCisgICAgICAgIC8vIEtlZXAgdGhlIHN0b3AgYmFuZCBhdHRlbnVhdGlvbiBubyBncmVhdGVyIHRoYW4gODQtODVkQiBmb3IgMzIgbGVuZ3RoIFMxNiBmaWx0ZXJzCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvciBzMzIgd2Uga2VlcCB0aGUgc3RvcCBiYW5kIGF0dGVudWF0aW9uIGF0IHRoZSBzYW1lIGFzIDE2YiByZXNvbHV0aW9uLCBhYm91dAorICAgICAgICAvLyA5Ni05OGRCCisgICAgICAgIC8vCisKKyAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW47CisgICAgICAgIGRvdWJsZSB0YndDaGVhdCA9IDEuOyAvLyBob3cgbXVjaCB3ZSAiY2hlYXQiIGludG8gYWxpYXNpbmcKKyAgICAgICAgaW50IGhhbGZMZW5ndGg7CisgICAgICAgIGlmIChtRmlsdGVyUXVhbGl0eSA9PSBEWU5fSElHSF9RVUFMSVRZKSB7CisgICAgICAgICAgICAvLyAzMmIgY29lZmZpY2llbnRzLCA2NCBsZW5ndGgKKyAgICAgICAgICAgIHVzZVMzMiA9IHRydWU7CisgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gOTguOworICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gNDg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gNDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtRmlsdGVyUXVhbGl0eSA9PSBEWU5fTE9XX1FVQUxJVFkpIHsKKyAgICAgICAgICAgIC8vIDE2YiBjb2VmZmljaWVudHMsIDE2LTMyIGxlbmd0aAorICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7CisgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODAuOworICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wNTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBEWU5fTUVEX1FVQUxJVFkKKyAgICAgICAgICAgIC8vIDE2YiBjb2VmZmljaWVudHMsIDMyLTY0IGxlbmd0aAorICAgICAgICAgICAgLy8gbm90ZTogPiA2NCBsZW5ndGggZmlsdGVycyB3aXRoIDE2YiBjb2VmcyBjYW4gaGF2ZSBxdWFudGl6YXRpb24gbm9pc2UgcHJvYmxlbXMKKyAgICAgICAgICAgIHVzZVMzMiA9IGZhbHNlOworICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDg0LjsKKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDI0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwb2x5cGhhc2VzIGluIHRoZSBmaWx0ZXJiYW5rLgorICAgICAgICAvLyBmb3IgMTZiLCBpdCBpcyBkZXNpcmFibGUgdG8gaGF2ZSAyXigxNi8yKSA9IDI1NiBwaGFzZXMuCisgICAgICAgIC8vIGh0dHBzOi8vY2NybWEuc3RhbmZvcmQuZWR1L35qb3MvcmVzYW1wbGUvUmVsYXRpb25fSW50ZXJwb2xhdGlvbl9FcnJvcl9RdWFudGl6YXRpb24uaHRtbAorICAgICAgICAvLworICAgICAgICAvLyBXZSBhcmUgYSBiaXQgbW9yZSBsYXggb24gdGhpcy4KKworICAgICAgICBpbnQgcGhhc2VzID0gbVNhbXBsZVJhdGUgLyBnY2QobVNhbXBsZVJhdGUsIGluU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgLy8gVE9ETzogT25jZSBkeW5hbWljIHNhbXBsZSByYXRlIGNoYW5nZSBpcyBhbiBvcHRpb24sIHRoZSBjb2RlIGJlbG93CisgICAgICAgIC8vIHNob3VsZCBiZSBtb2RpZmllZCB0byBleGVjdXRlIG9ubHkgd2hlbiBkeW5hbWljIHNhbXBsZSByYXRlIGNoYW5nZSBpcyBlbmFibGVkLgorICAgICAgICAvLworICAgICAgICAvLyBhcyBhYm92ZSwgI3BoYXNlcyBsZXNzIHRoYW4gNjMgaXMgdG9vIGZldyBwaGFzZXMgZm9yIGFjY3VyYXRlIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgICAgICAvLyB3ZSBpbmNyZWFzZSB0aGUgcGhhc2VzIHRvIGNvbXBlbnNhdGUsIGJ1dCBtb3JlIHBoYXNlcyBtZWFucyBtb3JlIG1lbW9yeSBwZXIKKyAgICAgICAgLy8gZmlsdGVyIGFuZCBtb3JlIHRpbWUgdG8gY29tcHV0ZSB0aGUgZmlsdGVyLgorICAgICAgICAvLworICAgICAgICAvLyBpZiB3ZSBrbm93IHRoYXQgdGhlIGZpbHRlciB3aWxsIGJlIHVzZWQgZm9yIGR5bmFtaWMgc2FtcGxlIHJhdGUgY2hhbmdlcywKKyAgICAgICAgLy8gdGhhdCB3b3VsZCBhbGxvdyB1cyBza2lwIHRoaXMgcGFydCBmb3IgZml4ZWQgc2FtcGxlIHJhdGUgcmVzYW1wbGVycy4KKyAgICAgICAgLy8KKyAgICAgICAgd2hpbGUgKHBoYXNlczw2MykgeworICAgICAgICAgICAgcGhhc2VzICo9IDI7IC8vIHRoaXMgY29kZSBvbmx5IG5lZWRlZCB0byBzdXBwb3J0IGR5bmFtaWMgcmF0ZSBjaGFuZ2VzCisgICAgICAgIH0KKworICAgICAgICBpZiAocGhhc2VzPj0yNTYpIHsgIC8vIHRvbyBtYW55IHBoYXNlcywgYWx3YXlzIGludGVycG9sYXRlCisgICAgICAgICAgICBwaGFzZXMgPSAxMjc7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgdGhlIGZpbHRlcgorICAgICAgICBtQ29uc3RhbnRzLnNldChwaGFzZXMsIGhhbGZMZW5ndGgsIGluU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOworICAgICAgICBjcmVhdGVLYWlzZXJGaXIobUNvbnN0YW50cywgc3RvcEJhbmRBdHRlbiwKKyAgICAgICAgICAgICAgICBpblNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCB0YndDaGVhdCk7CisgICAgfSAvLyBFbmQgS2Fpc2VyIGZpbHRlcgorCisgICAgLy8gdXBkYXRlIHBoYXNlIGFuZCBzdGF0ZSBiYXNlZCBvbiB0aGUgbmV3IGZpbHRlci4KKyAgICBjb25zdCBDb25zdGFudHMmIGMobUNvbnN0YW50cyk7CisgICAgbUluQnVmZmVyLnJlc2l6ZShtQ2hhbm5lbENvdW50LCBjLm1IYWxmTnVtQ29lZnMpOworICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0ID0gYy5tTCA8PCBjLm1TaGlmdDsKKyAgICAvLyB0cnkgdG8gcHJlc2VydmUgYXMgbXVjaCBvZiB0aGUgcGhhc2UgZnJhY3Rpb24gYXMgcG9zc2libGUgZm9yIG9uLXRoZS1mbHkgY2hhbmdlcworICAgIG1QaGFzZUZyYWN0aW9uID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihtUGhhc2VGcmFjdGlvbikKKyAgICAgICAgICAgICogcGhhc2VXcmFwTGltaXQgLyBvbGRQaGFzZVdyYXBMaW1pdDsKKyAgICBtUGhhc2VGcmFjdGlvbiAlPSBwaGFzZVdyYXBMaW1pdDsgLy8gc2hvdWxkIG5vdCBkbyBhbnl0aGluZywgYnV0IGp1c3QgaW4gY2FzZS4KKyAgICBtUGhhc2VJbmNyZW1lbnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHBoYXNlV3JhcExpbWl0KQorICAgICAgICAgICAgKiBpblNhbXBsZVJhdGUgLyBtU2FtcGxlUmF0ZSk7CisKKyAgICAvLyBkZXRlcm1pbmUgd2hpY2ggcmVzYW1wbGVyIHRvIHVzZQorICAgIC8vIGNoZWNrIGlmIGxvY2tlZCBwaGFzZSAod29ya3Mgb25seSBpZiBtUGhhc2VJbmNyZW1lbnQgaGFzIG5vICJmcmFjdGlvbmFsIHBoYXNlIGJpdHMiKQorICAgIGludCBsb2NrZWQgPSAobVBoYXNlSW5jcmVtZW50IDw8IChzaXplb2YobVBoYXNlSW5jcmVtZW50KSo4IC0gYy5tU2hpZnQpKSA9PSAwOworICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgbVBoYXNlRnJhY3Rpb24gPSBtUGhhc2VGcmFjdGlvbiA+PiBjLm1TaGlmdCA8PCBjLm1TaGlmdDsgLy8gcmVtb3ZlIGZyYWN0aW9uYWwgcGhhc2UKKyAgICB9CisKKyAgICAvLyBzdHJpZGUgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZpbHRlciBjb2VmZmljaWVudHMgcHJvY2Vzc2VkIHBlciBsb29wIGl0ZXJhdGlvbi4KKyAgICAvLyBXZSBjdXJyZW50bHkgb25seSBhbGxvdyBhIHN0cmlkZSBvZiAxNiB0byBtYXRjaCB3aXRoIFNJTUQgcHJvY2Vzc2luZy4KKyAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpbHRlciBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LAorICAgIC8vIG9yIGhhbGYgdGhlIGZpbHRlciBsZW5ndGggKG1IYWxmTnVtQ29lZnMpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LgorICAgIC8vCisgICAgLy8gTm90ZTogQSBzdHJpZGUgb2YgMiBpcyBhY2hpZXZlZCB3aXRoIG5vbi1TSU1EIHByb2Nlc3NpbmcuCisgICAgaW50IHN0cmlkZSA9ICgoYy5tSGFsZk51bUNvZWZzICYgNykgPT0gMCkgPyAxNiA6IDI7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJpZGUgPCAxNiwgIlJlc2FtcGxlciBzdHJpZGUgbXVzdCBiZSAxNiBvciBtb3JlIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50IDwgMSB8fCBtQ2hhbm5lbENvdW50ID4gOCwKKyAgICAgICAgICAgICJSZXNhbXBsZXIgY2hhbm5lbHMoJWQpIG11c3QgYmUgYmV0d2VlbiAxIHRvIDgiLCBtQ2hhbm5lbENvdW50KTsKKyAgICAvLyBzdHJpZGUgMTYgKGZhbGxzIGJhY2sgdG8gc3RyaWRlIDIgZm9yIG1hY2hpbmVzIHRoYXQgZG8gbm90IHN1cHBvcnQgTkVPTikKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIHN3aXRjaCAobUNoYW5uZWxDb3VudCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwxLCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MiwgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDMsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw0LCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NSwgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDYsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw3LCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8OCwgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKG1DaGFubmVsQ291bnQpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MSwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwyLCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDMsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NCwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw1LCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDYsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NywgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw4LCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgREVCVUdfUkVTQU1QTEVSCisgICAgcHJpbnRmKCJjaGFubmVsczolZCAgJXMgIHN0cmlkZTolZCAgJXMgIGNvZWY6JWQgIHNoaWZ0OiVkXG4iLAorICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgbG9ja2VkID8gImxvY2tlZCIgOiAiaW50ZXJwb2xhdGVkIiwKKyAgICAgICAgICAgIHN0cmlkZSwgdXNlUzMyID8gIlMzMiIgOiAiUzE2IiwgMipjLm1IYWxmTnVtQ29lZnMsIGMubVNoaWZ0KTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQoreworICAgICh0aGlzLT4qbVJlc2FtcGxlRnVuYykocmVpbnRlcnByZXRfY2FzdDxUTyo+KG91dCksIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3RlbXBsYXRlPGludCBDSEFOTkVMUywgYm9vbCBMT0NLRUQsIGludCBTVFJJREU+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZShUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpCit7CisgICAgLy8gVE9ETyBNb25vIC0+IE1vbm8gaXMgbm90IHN1cHBvcnRlZC4gT1VUUFVUX0NIQU5ORUxTIHJlZmxlY3RzIG1pbmltdW0gb2Ygc3RlcmVvIG91dC4KKyAgICBjb25zdCBpbnQgT1VUUFVUX0NIQU5ORUxTID0gKENIQU5ORUxTIDwgMikgPyAyIDogQ0hBTk5FTFM7CisgICAgY29uc3QgQ29uc3RhbnRzJiBjKG1Db25zdGFudHMpOworICAgIGNvbnN0IFRDKiBjb25zdCBjb2VmcyA9IG1Db25zdGFudHMubUZpckNvZWZzOworICAgIFRJKiBpbXB1bHNlID0gbUluQnVmZmVyLmdldEltcHVsc2UoKTsKKyAgICBzaXplX3QgaW5wdXRJbmRleCA9IDA7CisgICAgdWludDMyX3QgcGhhc2VGcmFjdGlvbiA9IG1QaGFzZUZyYWN0aW9uOworICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OworICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CisgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIE9VVFBVVF9DSEFOTkVMUzsKKyAgICBjb25zdCB1aW50MzJfdCBwaGFzZVdyYXBMaW1pdCA9IGMubUwgPDwgYy5tU2hpZnQ7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChwaGFzZUluY3JlbWVudCAqICh1aW50NjRfdClvdXRGcmFtZUNvdW50ICsgcGhhc2VGcmFjdGlvbikKKyAgICAgICAgICAgIC8gcGhhc2VXcmFwTGltaXQ7CisgICAgLy8gc2FuaXR5IGNoZWNrIHRoYXQgaW5GcmFtZUNvdW50IGlzIGluIHNpZ25lZCAzMiBiaXQgaW50ZWdlciByYW5nZS4KKyAgICBBTE9HX0FTU0VSVCgwIDw9IGluRnJhbWVDb3VudCAmJiBpbkZyYW1lQ291bnQgPCAoMVUgPDwgMzEpKTsKKworICAgIC8vQUxPR1YoImluRnJhbWVDb3VudDolZCAgb3V0RnJhbWVDb3VudDolZCIKKyAgICAvLyAgICAgICAgIiAgcGhhc2VJbmNyZW1lbnQ6JXUgIHBoYXNlRnJhY3Rpb246JXUgIHBoYXNlV3JhcExpbWl0OiV1IiwKKyAgICAvLyAgICAgICAgaW5GcmFtZUNvdW50LCBvdXRGcmFtZUNvdW50LCBwaGFzZUluY3JlbWVudCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VXcmFwTGltaXQpOworCisgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCisgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKKyAgICAvLyB0byBnZW5lcmF0ZSBmYXIgbGVzcyBlZmZpY2llbnQgY29kZS4KKyAgICAvLyBBbHdheXMgc2FuaXR5IGNoZWNrIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCisKKyAgICAvLyB0aGUgZm9sbG93aW5nIGxvZ2ljIGlzIGEgYml0IGNvbnZvbHV0ZWQgdG8ga2VlcCB0aGUgbWFpbiBwcm9jZXNzaW5nIGxvb3AKKyAgICAvLyBhcyB0aWdodCBhcyBwb3NzaWJsZSB3aXRoIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpIHsKKyAgICAgICAgLy9BTE9HVigiTE9PUDogaW5GcmFtZUNvdW50OiVkICBvdXRwdXRJbmRleDolZCAgb3V0RnJhbWVDb3VudDolZCIKKyAgICAgICAgLy8gICAgICAgICIgIHBoYXNlRnJhY3Rpb246JXUgIHBoYXNlV3JhcExpbWl0OiV1IiwKKyAgICAgICAgLy8gICAgICAgIGluRnJhbWVDb3VudCwgb3V0cHV0SW5kZXgsIG91dEZyYW1lQ291bnQsIHBoYXNlRnJhY3Rpb24sIHBoYXNlV3JhcExpbWl0KTsKKworICAgICAgICAvLyBjaGVjayBpbnB1dEluZGV4IG92ZXJmbG93CisgICAgICAgIEFMT0dfQVNTRVJUKGlucHV0SW5kZXggPD0gbUJ1ZmZlci5mcmFtZUNvdW50LCAiaW5wdXRJbmRleCVkID4gZnJhbWVDb3VudCVkIiwKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAvLyBCdWZmZXIgaXMgZW1wdHksIGZldGNoIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkgKGluRnJhbWVDb3VudCA+IDApLgorICAgICAgICAvLyBXZSBtYXkgbm90IGZldGNoIGEgbmV3IGJ1ZmZlciBpZiB0aGUgZXhpc3RpbmcgZGF0YSBpcyBzdWZmaWNpZW50LgorICAgICAgICB3aGlsZSAobUJ1ZmZlci5mcmFtZUNvdW50ID09IDAgJiYgaW5GcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OworICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU91dHB1dFBUUyhvdXRwdXRJbmRleCAvIE9VVFBVVF9DSEFOTkVMUykpOworICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJlc2FtcGxlX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbkZyYW1lQ291bnQgLT0gbUJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgaWYgKHBoYXNlRnJhY3Rpb24gPj0gcGhhc2VXcmFwTGltaXQpIHsgLy8gcmVhZCBpbiBkYXRhCisgICAgICAgICAgICAgICAgbUluQnVmZmVyLnRlbXBsYXRlIHJlYWRBZHZhbmNlPENIQU5ORUxTPigKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcHVsc2UsIGMubUhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VEkqPihtQnVmZmVyLnJhdyksIGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBwaGFzZUZyYWN0aW9uIC09IHBoYXNlV3JhcExpbWl0OworICAgICAgICAgICAgICAgIHdoaWxlIChwaGFzZUZyYWN0aW9uID49IHBoYXNlV3JhcExpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID49IG1CdWZmZXIuZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSW5CdWZmZXIudGVtcGxhdGUgcmVhZEFkdmFuY2U8Q0hBTk5FTFM+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHVsc2UsIGMubUhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFRJKj4obUJ1ZmZlci5yYXcpLCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICBwaGFzZUZyYWN0aW9uIC09IHBoYXNlV3JhcExpbWl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBUSSogY29uc3QgaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IFRJKj4obUJ1ZmZlci5yYXcpOworICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IG1CdWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgY29uc3QgaW50IGNvZWZTaGlmdCA9IGMubVNoaWZ0OworICAgICAgICBjb25zdCBpbnQgaGFsZk51bUNvZWZzID0gYy5tSGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUTyogY29uc3Qgdm9sdW1lU2ltZCA9IG1Wb2x1bWVTaW1kOworCisgICAgICAgIC8vIG1haW4gcHJvY2Vzc2luZyBsb29wCisgICAgICAgIHdoaWxlIChDQ19MSUtFTFkob3V0cHV0SW5kZXggPCBvdXRwdXRTYW1wbGVDb3VudCkpIHsKKyAgICAgICAgICAgIC8vIGNhdXRpb246IGZpcigpIGlzIGlubGluZWQgYW5kIG1heSBiZSBsYXJnZS4KKyAgICAgICAgICAgIC8vIG91dHB1dCB3aWxsIGJlIGxvYWRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBpbnB1dCBzYW1wbGVzIGluIGltcHVsc2VbLWhhbGZOdW1Db2VmcysxXS4uLiBpbXB1bHNlW2hhbGZOdW1Db2Vmc10KKyAgICAgICAgICAgIC8vIGZyb20gdGhlIHBvbHlwaGFzZSBmaWx0ZXIgb2YgKHBoYXNlRnJhY3Rpb24gLyBwaGFzZVdyYXBMaW1pdCkgaW4gY29lZnMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy9BTE9HVigiTE9PUDI6IGluRnJhbWVDb3VudDolZCAgb3V0cHV0SW5kZXg6JWQgIG91dEZyYW1lQ291bnQ6JWQiCisgICAgICAgICAgICAvLyAgICAgICAgIiAgcGhhc2VGcmFjdGlvbjoldSAgcGhhc2VXcmFwTGltaXQ6JXUiLAorICAgICAgICAgICAgLy8gICAgICAgIGluRnJhbWVDb3VudCwgb3V0cHV0SW5kZXgsIG91dEZyYW1lQ291bnQsIHBoYXNlRnJhY3Rpb24sIHBoYXNlV3JhcExpbWl0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHBoYXNlRnJhY3Rpb24gPCBwaGFzZVdyYXBMaW1pdCk7CisgICAgICAgICAgICBmaXI8Q0hBTk5FTFMsIExPQ0tFRCwgU1RSSURFPigKKyAgICAgICAgICAgICAgICAgICAgJm91dFtvdXRwdXRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24sIHBoYXNlV3JhcExpbWl0LAorICAgICAgICAgICAgICAgICAgICBjb2VmU2hpZnQsIGhhbGZOdW1Db2VmcywgY29lZnMsCisgICAgICAgICAgICAgICAgICAgIGltcHVsc2UsIHZvbHVtZVNpbWQpOworCisgICAgICAgICAgICBvdXRwdXRJbmRleCArPSBPVVRQVVRfQ0hBTk5FTFM7CisKKyAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gKz0gcGhhc2VJbmNyZW1lbnQ7CisgICAgICAgICAgICB3aGlsZSAocGhhc2VGcmFjdGlvbiA+PSBwaGFzZVdyYXBMaW1pdCkgeworICAgICAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID49IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOyAgLy8gbmVlZCBhIG5ldyBidWZmZXIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUluQnVmZmVyLnRlbXBsYXRlIHJlYWRBZHZhbmNlPENIQU5ORUxTPihpbXB1bHNlLCBoYWxmTnVtQ29lZnMsIGluLCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4Kys7CisgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiAtPSBwaGFzZVdyYXBMaW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorZG9uZToKKyAgICAgICAgLy8gV2UgYXJyaXZlIGhlcmUgd2hlbiB3ZSdyZSBmaW5pc2hlZCBvciB3aGVuIHRoZSBpbnB1dCBidWZmZXIgcnVucyBvdXQuCisgICAgICAgIC8vIFJlZ2FyZGxlc3Mgd2UgbmVlZCB0byByZWxlYXNlIHRoZSBpbnB1dCBidWZmZXIgaWYgd2UndmUgYWNxdWlyZWQgaXQuCisgICAgICAgIGlmIChpbnB1dEluZGV4ID4gMCkgeyAgLy8gd2UndmUgYWNxdWlyZWQgYSBidWZmZXIgKGFsdGVybmF0aXZlbHkgY291bGQgY2hlY2sgZnJhbWVDb3VudCkKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGlucHV0SW5kZXggPT0gZnJhbWVDb3VudCwgImlucHV0SW5kZXgoJWQpICE9IGZyYW1lQ291bnQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwgZnJhbWVDb3VudCk7ICAvLyBtdXN0IGhhdmUgYmVlbiBmdWxseSByZWFkLgorICAgICAgICAgICAgaW5wdXRJbmRleCA9IDA7CisgICAgICAgICAgICBwcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CisgICAgICAgIH0KKyAgICB9CisKK3Jlc2FtcGxlX2V4aXQ6CisgICAgLy8gaW5wdXRJbmRleCBtdXN0IGJlIHplcm8gaW4gYWxsIHRocmVlIGNhc2VzOgorICAgIC8vICgxKSB0aGUgYnVmZmVyIG5ldmVyIHdhcyBiZWVuIGFjcXVpcmVkOyAoMikgdGhlIGJ1ZmZlciB3YXMKKyAgICAvLyByZWxlYXNlZCBhdCAiZG9uZToiOyBvciAoMykgZ2V0TmV4dEJ1ZmZlcigpIGZhaWxlZC4KKyAgICBBTE9HX0FTU0VSVChpbnB1dEluZGV4ID09IDAsICJSZWxlYXNpbmc6IGlucHV0aW5kZXg6JWQgZnJhbWVDb3VudDolZCAgcGhhc2VGcmFjdGlvbjoldSIsCisgICAgICAgICAgICBpbnB1dEluZGV4LCBtQnVmZmVyLmZyYW1lQ291bnQsIHBoYXNlRnJhY3Rpb24pOworICAgIEFMT0dfQVNTRVJUKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsgLy8gdGhlcmUgbXVzdCBiZSBubyBmcmFtZXMgaW4gdGhlIGJ1ZmZlcgorICAgIG1JbkJ1ZmZlci5zZXRJbXB1bHNlKGltcHVsc2UpOworICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKK30KKworLyogaW5zdGFudGlhdGUgdGVtcGxhdGVzIHVzZWQgYnkgQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSAqLwordGVtcGxhdGUgY2xhc3MgQXVkaW9SZXNhbXBsZXJEeW48ZmxvYXQsIGZsb2F0LCBmbG9hdD47Cit0ZW1wbGF0ZSBjbGFzcyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEF1ZGlvUmVzYW1wbGVyRHluPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg2YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0RZTl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0RZTl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIEF1ZGlvUmVzYW1wbGVyRHluCisgKgorICogVGhpcyBjbGFzcyB0ZW1wbGF0ZSBpcyB1c2VkIGZvciBmbG9hdGluZyBwb2ludCBhbmQgaW50ZWdlciByZXNhbXBsZXJzLgorICoKKyAqIFR5cGUgdmFyaWFibGVzOgorICogVEMgPSBmaWx0ZXIgY29lZmZpY2llbnQgdHlwZSAob25lIG9mIGludDE2X3QsIGludDMyX3QsIG9yIGZsb2F0KQorICogVEkgPSBpbnB1dCBkYXRhIHR5cGUgKG9uZSBvZiBpbnQxNl90IG9yIGZsb2F0KQorICogVE8gPSBvdXRwdXQgZGF0YSB0eXBlIChvbmUgb2YgaW50MzJfdCBvciBmbG9hdCkKKyAqCisgKiBGb3IgaW50ZWdlciBpbnB1dCBkYXRhIHR5cGVzIFRJLCB0aGUgY29lZmZpY2llbnQgdHlwZSBUQyBpcyBlaXRoZXIgaW50MTZfdCBvciBpbnQzMl90LgorICogRm9yIGZsb2F0IGlucHV0IGRhdGEgdHlwZXMgVEksIHRoZSBjb2VmZmljaWVudCB0eXBlIFRDIGlzIGZsb2F0LgorICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitjbGFzcyBBdWRpb1Jlc2FtcGxlckR5bjogcHVibGljIEF1ZGlvUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBBdWRpb1Jlc2FtcGxlckR5bihpbnQgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpOworCisgICAgdmlydHVhbCB+QXVkaW9SZXNhbXBsZXJEeW4oKTsKKworICAgIHZpcnR1YWwgdm9pZCBpbml0KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2FtcGxlUmF0ZShpbnQzMl90IGluU2FtcGxlUmF0ZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOworCitwcml2YXRlOgorCisgICAgY2xhc3MgQ29uc3RhbnRzIHsgLy8gc3RvcmVzIHRoZSBmaWx0ZXIgY29uc3RhbnRzLgorICAgIHB1YmxpYzoKKyAgICAgICAgQ29uc3RhbnRzKCkgOgorICAgICAgICAgICAgbUwoMCksIG1TaGlmdCgwKSwgbUhhbGZOdW1Db2VmcygwKSwgbUZpckNvZWZzKE5VTEwpCisgICAgICAgIHt9CisgICAgICAgIHZvaWQgc2V0KGludCBMLCBpbnQgaGFsZk51bUNvZWZzLAorICAgICAgICAgICAgICAgIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgICBpbnQgbUw7ICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGlvbiBwaGFzZXMgaW4gdGhlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgaW50IG1TaGlmdDsgICAgICAgIC8vIHJpZ2h0IHNoaWZ0IHRvIGdldCBwb2x5cGhhc2UgaW5kZXgKKyAgICAgICAgdW5zaWduZWQgaW50IG1IYWxmTnVtQ29lZnM7IC8vIGZpbHRlciBoYWxmICNjb2VmcworICAgICAgICAgICBjb25zdCBUQyogbUZpckNvZWZzOyAgICAgLy8gcG9seXBoYXNlIGZpbHRlciBiYW5rCisgICAgfTsKKworICAgIGNsYXNzIEluQnVmZmVyIHsgLy8gYnVmZmVyIG1hbmFnZW1lbnQgZm9yIGlucHV0IHR5cGUgVEkKKyAgICBwdWJsaWM6CisgICAgICAgIEluQnVmZmVyKCk7CisgICAgICAgIH5JbkJ1ZmZlcigpOworICAgICAgICB2b2lkIGluaXQoKTsKKworICAgICAgICB2b2lkIHJlc2l6ZShpbnQgQ0hBTk5FTFMsIGludCBoYWxmTnVtQ29lZnMpOworCisgICAgICAgIC8vIHVzZWQgZm9yIGRpcmVjdCBtYW5hZ2VtZW50IG9mIHRoZSBtSW1wdWxzZSBwb2ludGVyCisgICAgICAgIGlubGluZSBUSSogZ2V0SW1wdWxzZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW1wdWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldEltcHVsc2UoVEkgKmltcHVsc2UpIHsKKyAgICAgICAgICAgIG1JbXB1bHNlID0gaW1wdWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KKyAgICAgICAgaW5saW5lIHZvaWQgcmVhZEFnYWluKFRJKiYgaW1wdWxzZSwgY29uc3QgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICBjb25zdCBUSSogY29uc3QgaW4sIGNvbnN0IHNpemVfdCBpbnB1dEluZGV4KTsKKworICAgICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CisgICAgICAgIGlubGluZSB2b2lkIHJlYWRBZHZhbmNlKFRJKiYgaW1wdWxzZSwgY29uc3QgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICBjb25zdCBUSSogY29uc3QgaW4sIGNvbnN0IHNpemVfdCBpbnB1dEluZGV4KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIHR1bmluZyBwYXJhbWV0ZXIgZ3VpZGVsaW5lczogMiA8PSBtdWx0aXBsZSA8PSA4CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga1N0YXRlU2l6ZU11bHRpcGxlT2ZGaWx0ZXJMZW5ndGggPSA0OworCisgICAgICAgIC8vIGluIGdlbmVyYWwsIG1SaW5nRnVsbCA9IG1TdGF0ZSArIG1TdGF0ZVNpemUgLSBoYWxmTnVtQ29lZnMqQ0hBTk5FTFMuCisgICAgICAgICAgIFRJKiBtU3RhdGU7ICAgICAgLy8gYmFzZSBwb2ludGVyIGZvciB0aGUgaW5wdXQgYnVmZmVyIHN0b3JhZ2UKKyAgICAgICAgICAgVEkqIG1JbXB1bHNlOyAgICAvLyBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlIChjZW50ZXJlZCkKKyAgICAgICAgICAgVEkqIG1SaW5nRnVsbDsgICAvLyBtU3RhdGUgPD0gbUltcHVsc2UgPCBtUmluZ0Z1bGwKKyAgICAgICAgc2l6ZV90IG1TdGF0ZUNvdW50OyAvLyBzaXplIG9mIHN0YXRlIGluIHVuaXRzIG9mIFRJLgorICAgIH07CisKKyAgICB2b2lkIGNyZWF0ZUthaXNlckZpcihDb25zdGFudHMgJmMsIGRvdWJsZSBzdG9wQmFuZEF0dGVuLAorICAgICAgICAgICAgaW50IGluU2FtcGxlUmF0ZSwgaW50IG91dFNhbXBsZVJhdGUsIGRvdWJsZSB0YndDaGVhdCk7CisKKyAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFPgorICAgIHZvaWQgcmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKKworICAgIC8vIGRlZmluZSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgZm9yIHJlc2FtcGxlCisgICAgdHlwZWRlZiB2b2lkIChBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6KnJlc2FtcGxlX0FCUF90KShUTyogb3V0LAorICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lQ291bnQsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKKworICAgIC8vIGRhdGEgLSB0aGUgY29udGlndW91cyBzdG9yYWdlIGFuZCBsYXlvdXQgb2YgdGhlc2UgaXMgaW1wb3J0YW50LgorICAgICAgICAgICBJbkJ1ZmZlciBtSW5CdWZmZXI7CisgICAgICAgICAgQ29uc3RhbnRzIG1Db25zdGFudHM7ICAgICAgICAvLyBjdXJyZW50IHNldCBvZiBjb2VmZmljaWVudCBwYXJhbWV0ZXJzCisgICAgVE8gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSkgbVZvbHVtZVNpbWRbMl07IC8vIG11c3QgYmUgYWxpZ25lZCBvciBORU9OIG1heSBjcmFzaAorICAgICByZXNhbXBsZV9BQlBfdCBtUmVzYW1wbGVGdW5jOyAgICAgLy8gY2FsbGVkIGZ1bmN0aW9uIGZvciByZXNhbXBsaW5nCisgICAgICAgICAgICBpbnQzMl90IG1GaWx0ZXJTYW1wbGVSYXRlOyAvLyBkZXNpZ25lZCBmaWx0ZXIgc2FtcGxlIHJhdGUuCisgICAgICAgIHNyY19xdWFsaXR5IG1GaWx0ZXJRdWFsaXR5OyAgICAvLyBkZXNpZ25lZCBmaWx0ZXIgcXVhbGl0eS4KKyAgICAgICAgICAgICAgdm9pZCogbUNvZWZCdWZmZXI7ICAgICAgIC8vIGlmIGEgZmlsdGVyIGlzIGNyZWF0ZWQsIHRoaXMgaXMgbm90IG51bGwKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0RZTl9IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyNGIyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCkBAIC0wLDAgKzEsNzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfR0VOX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX0dFTl9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqIGdlbmVyYXRlcyBhIHNpbmUgd2F2ZSBhdCBlcXVhbCBzdGVwcy4KKyAqCisgKiBBcyBtb3N0IG9mIG91ciBmdW5jdGlvbnMgdXNlIHNpbmUgb3IgY29zaW5lIGF0IGVxdWFsIHN0ZXBzLAorICogaXQgaXMgdmVyeSBlZmZpY2llbnQgdG8gY29tcHV0ZSB0aGVtIHRoYXQgd2F5IChzaW5nbGUgbXVsdGlwbHkgYW5kIHN1YnRyYWN0KSwKKyAqIHJhdGhlciB0aGFuIGludm9raW5nIHRoZSBtYXRoIGxpYnJhcnkgc2luKCkgb3IgY29zKCkgZWFjaCB0aW1lLgorICoKKyAqIFNpbmVHZW4gdXNlcyBHb2VydHplbCdzIEFsZ29yaXRobSAoYXMgYSBnZW5lcmF0b3Igbm90IGEgZmlsdGVyKQorICogdG8gY2FsY3VsYXRlIHNpbmUod3N0YXJ0ICsgbiAqIHdzdGVwKSBvciBjb3NpbmUod3N0YXJ0ICsgbiAqIHdzdGVwKQorICogYnkgc3RlcHBpbmcgdGhyb3VnaCAwLCAxLCAuLi4gbi4KKyAqCisgKiBlXmkod3N0YXJ0K3dzdGVwKSA9IDJjb3Mod3N0ZXApICogZV5pKHdzdGFydCkgLSBlXmkod3N0YXJ0LXdzdGVwKQorICoKKyAqIG9yIGxvb2tpbmcgYXQganVzdCB0aGUgaW1hZ2luYXJ5IHNpbmUgdGVybSwgYXMgdGhlIGNvc2luZSBmb2xsb3dzIGlkZW50aWNhbGx5OgorICoKKyAqIHNpbih3c3RhcnQrd3N0ZXApID0gMmNvcyh3c3RlcCkgKiBzaW4od3N0YXJ0KSAtIHNpbih3c3RhcnQtd3N0ZXApCisgKgorICogR29lcnR6ZWwncyBhbGdvcml0aG0gaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgYW5nbGUgYWRkaXRpb24gZm9ybXVsYSwKKyAqIGVeaSh3c3RhcnQrd3N0ZXApID0gZV5pKHdzdGFydCkgKiBlXmkod3N0ZXApLCB3aGljaCB0YWtlcyB1cCB0bworICogNCBtdWx0aXBsaWVzIGFuZCAyIGFkZHMgKG9yIDMqIGFuZCAzKykgYW5kIHJlcXVpcmVzIGJvdGggc2luZSBhbmQKKyAqIGNvc2luZSBnZW5lcmF0aW9uIGR1ZSB0byB0aGUgY29tcGxleCAqIGNvbXBsZXggbXVsdGlwbHkgKGZ1bGwgcm90YXRpb24pLgorICoKKyAqIFNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Hb2VydHplbF9hbGdvcml0aG0KKyAqCisgKi8KKworY2xhc3MgU2luZUdlbiB7CitwdWJsaWM6CisgICAgU2luZUdlbihkb3VibGUgd3N0YXJ0LCBkb3VibGUgd3N0ZXAsIGJvb2wgY29zaW5lID0gZmFsc2UpIHsKKyAgICAgICAgaWYgKGNvc2luZSkgeworICAgICAgICAgICAgbUN1cnJlbnQgPSBjb3Mod3N0YXJ0KTsKKyAgICAgICAgICAgIG1QcmV2aW91cyA9IGNvcyh3c3RhcnQgLSB3c3RlcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudCA9IHNpbih3c3RhcnQpOworICAgICAgICAgICAgbVByZXZpb3VzID0gc2luKHdzdGFydCAtIHdzdGVwKTsKKyAgICAgICAgfQorICAgICAgICBtVHdvQ29zID0gMi4qY29zKHdzdGVwKTsKKyAgICB9CisgICAgU2luZUdlbihkb3VibGUgZXhwTm93LCBkb3VibGUgZXhwUHJldiwgZG91YmxlIHR3b0Nvc1N0ZXApIHsKKyAgICAgICAgbUN1cnJlbnQgPSBleHBOb3c7CisgICAgICAgIG1QcmV2aW91cyA9IGV4cFByZXY7CisgICAgICAgIG1Ud29Db3MgPSB0d29Db3NTdGVwOworICAgIH0KKyAgICBpbmxpbmUgZG91YmxlIHZhbHVlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUN1cnJlbnQ7CisgICAgfQorICAgIGlubGluZSB2b2lkIGFkdmFuY2UoKSB7CisgICAgICAgIGRvdWJsZSB0bXAgPSBtQ3VycmVudDsKKyAgICAgICAgbUN1cnJlbnQgPSBtQ3VycmVudCptVHdvQ29zIC0gbVByZXZpb3VzOworICAgICAgICBtUHJldmlvdXMgPSB0bXA7CisgICAgfQorICAgIGlubGluZSBkb3VibGUgdmFsdWVBZHZhbmNlKCkgeworICAgICAgICBkb3VibGUgdG1wID0gbUN1cnJlbnQ7CisgICAgICAgIG1DdXJyZW50ID0gbUN1cnJlbnQqbVR3b0NvcyAtIG1QcmV2aW91czsKKyAgICAgICAgbVByZXZpb3VzID0gdG1wOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKworcHJpdmF0ZToKKyAgICBkb3VibGUgbUN1cnJlbnQ7IC8vIGN1cnJlbnQgdmFsdWUgb2Ygc2luZS9jb3NpbmUKKyAgICBkb3VibGUgbVByZXZpb3VzOyAvLyBwcmV2aW91cyB2YWx1ZSBvZiBzaW5lL2Nvc2luZQorICAgIGRvdWJsZSBtVHdvQ29zOyAvLyBzdGVwcGluZyBmYWN0b3IKK307CisKKy8qCisgKiBnZW5lcmF0ZXMgYSBzZXJpZXMgb2Ygc2luZSBnZW5lcmF0b3JzLCBwaGFzZSBvZmZzZXQgYnkgZml4ZWQgc3RlcHMuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGdlbmVyYXRlIHBvbHlwaGFzZSBzaW5lIGdlbmVyYXRvcnMsIG9uZSBwZXIgcG9seXBoYXNlCisgKiBpbiB0aGUgZmlsdGVyIGNvZGUgYmVsb3cuCisgKgorICogVGhlIFNpbmVHZW4gcmV0dXJuZWQgYnkgdmFsdWUoKSBzdGFydHMgYXQgaW5uZXJTdGFydCA9IG91dGVyU3RhcnQgKyBuKm91dGVyU3RlcDsKKyAqIGluY3JlbWVudHMgYnkgaW5uZXJTdGVwLgorICoKKyAqLworCitjbGFzcyBTaW5lR2VuR2VuIHsKK3B1YmxpYzoKKyAgICBTaW5lR2VuR2VuKGRvdWJsZSBvdXRlclN0YXJ0LCBkb3VibGUgb3V0ZXJTdGVwLCBkb3VibGUgaW5uZXJTdGVwLCBib29sIGNvc2luZSA9IGZhbHNlKQorICAgICAgICAgICAgOiBtU2luZUlubmVyQ3VyKG91dGVyU3RhcnQsIG91dGVyU3RlcCwgY29zaW5lKSwKKyAgICAgICAgICAgICAgbVNpbmVJbm5lclByZXYob3V0ZXJTdGFydC1pbm5lclN0ZXAsIG91dGVyU3RlcCwgY29zaW5lKQorICAgIHsKKyAgICAgICAgbVR3b0NvcyA9IDIuKmNvcyhpbm5lclN0ZXApOworICAgIH0KKyAgICBpbmxpbmUgU2luZUdlbiB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIFNpbmVHZW4obVNpbmVJbm5lckN1ci52YWx1ZSgpLCBtU2luZUlubmVyUHJldi52YWx1ZSgpLCBtVHdvQ29zKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgYWR2YW5jZSgpIHsKKyAgICAgICAgbVNpbmVJbm5lckN1ci5hZHZhbmNlKCk7CisgICAgICAgIG1TaW5lSW5uZXJQcmV2LmFkdmFuY2UoKTsKKyAgICB9CisgICAgaW5saW5lIFNpbmVHZW4gdmFsdWVBZHZhbmNlKCkgeworICAgICAgICByZXR1cm4gU2luZUdlbihtU2luZUlubmVyQ3VyLnZhbHVlQWR2YW5jZSgpLCBtU2luZUlubmVyUHJldi52YWx1ZUFkdmFuY2UoKSwgbVR3b0Nvcyk7CisgICAgfQorCitwcml2YXRlOgorICAgIFNpbmVHZW4gbVNpbmVJbm5lckN1cjsgLy8gZ2VuZXJhdGUgdGhlIGlubmVyIHNpbmUgdmFsdWVzIChzdGVwcGVkIGJ5IG91dGVyU3RlcCkuCisgICAgU2luZUdlbiBtU2luZUlubmVyUHJldjsgLy8gZ2VuZXJhdGUgdGhlIGlubmVyIHNpbmUgcHJldmlvdXMgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGJlaGluZCBieSBpbm5lclN0ZXAsIHN0ZXBwZWQgYnkgb3V0ZXJTdGVwKS4KKyAgICBkb3VibGUgbVR3b0NvczsgLy8gdGhlIGlubmVyIHN0ZXBwaW5nIGZhY3RvciBmb3IgdGhlIHJldHVybmVkIFNpbmVHZW4uCit9OworCitzdGF0aWMgaW5saW5lIGRvdWJsZSBzcXIoZG91YmxlIHgpIHsKKyAgICByZXR1cm4geCAqIHg7Cit9CisKKy8qCisgKiByb3VuZHMgYSBkb3VibGUgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBmb3IgRklSIGNvZWZmaWNpZW50cy4KKyAqCisgKiBPbmUgdmFyaWFudCB1c2VzIG5vaXNlIHNoYXBpbmcsIHdoaWNoIG11c3Qga2VlcCBlcnJvciBoaXN0b3J5CisgKiB0byB3b3JrICh0aGUgZXJyIHBhcmFtZXRlciwgaW5pdGlhbGl6ZWQgdG8gMCkuCisgKiBUaGUgb3RoZXIgdmFyaWFudCBpcyBhIG5vbi1ub2lzZSBzaGFwZWQgdmVyc2lvbiBmb3IKKyAqIFMzMiBjb2VmZmljaWVudHMgKG5vaXNlIHNoYXBpbmcgZG9lc24ndCBnYWluIG11Y2gpLgorICoKKyAqIENhdXRpb246IE5vIGJvdW5kcyBzYXR1cmF0aW9uIGlzIGFwcGxpZWQsIGJ1dCBpc24ndCBuZWVkZWQgaW4gdGhpcyBjYXNlLgorICoKKyAqIEBwYXJhbSB4IGlzIHRoZSB2YWx1ZSB0byByb3VuZC4KKyAqCisgKiBAcGFyYW0gbWF4dmFsIGlzIHRoZSBtYXhpbXVtIGludGVnZXIgc2NhbGUgZmFjdG9yIGV4cHJlc3NlZCBhcyBhbiBpbnQ2NCAoZm9yIGhlYWRyb29tKS4KKyAqIFR5cGljYWxseSB0aGlzIG1heSBiZSB0aGUgbWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyKzEgKHVzaW5nIHRoZSBmYWN0IHRoYXQgZG91YmxlIHByZWNpc2lvbgorICogRklSIGNvZWZmaWNpZW50cyBnZW5lcmF0ZWQgaGVyZSBhcmUgbmV2ZXIgdGhhdCBjbG9zZSB0byAxLjAgdG8gcG9zZSBhbiBvdmVyZmxvdyBjb25kaXRpb24pLgorICoKKyAqIEBwYXJhbSBlcnIgaXMgdGhlIHByZXZpb3VzIGVycm9yIChhY3R1YWwgLSByb3VuZGVkKSBmb3IgdGhlIHByZXZpb3VzIHJvdW5kaW5nIG9wLgorICogRm9yIDE2YiBjb2VmZmljaWVudHMgdGhpcyBjYW4gaW1wcm92ZSBzdG9wYmFuZCBkQiBwZXJmb3JtYW5jZSBieSB1cCB0byAyZEIuCisgKgorICogTWFueSB2YXJpYW50cyBleGlzdCBmb3IgdGhlIG5vaXNlIHNoYXBpbmc6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTm9pc2Vfc2hhcGluZworICoKKyAqLworCitzdGF0aWMgaW5saW5lIGludDY0X3QgdG9pbnQoZG91YmxlIHgsIGludDY0X3QgbWF4dmFsLCBkb3VibGUmIGVycikgeworICAgIGRvdWJsZSB2YWwgPSB4ICogbWF4dmFsOworICAgIGRvdWJsZSBpdmFsID0gZmxvb3IodmFsICsgMC41ICsgZXJyKjAuMik7CisgICAgZXJyID0gdmFsIC0gaXZhbDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaXZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCB0b2ludChkb3VibGUgeCwgaW50NjRfdCBtYXh2YWwpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZmxvb3IoeCAqIG1heHZhbCArIDAuNSkpOworfQorCisvKgorICogTW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jlc3NlbF9mdW5jdGlvbgorICoKKyAqIFRoZSBmb3JtdWxhcyBhcmUgdGFrZW4gZnJvbSBBYnJhbW93aXR6IGFuZCBTdGVndW4sCisgKiBfSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9uc18gKGxpbmtzIGJlbG93KToKKyAqCisgKiBodHRwOi8vcGVvcGxlLm1hdGguc2Z1LmNhL35jYm0vYWFuZHMvcGFnZV8zNzUuaHRtCisgKiBodHRwOi8vcGVvcGxlLm1hdGguc2Z1LmNhL35jYm0vYWFuZHMvcGFnZV8zNzguaHRtCisgKgorICogaHR0cDovL2RsbWYubmlzdC5nb3YvMTAuMjUKKyAqIGh0dHA6Ly9kbG1mLm5pc3QuZ292LzEwLjQwCisgKgorICogTm90ZSB3ZSBhc3N1bWUgeCBpcyBub25uZWdhdGl2ZSAodGhlIGZ1bmN0aW9uIGlzIHN5bW1ldHJpYywKKyAqIHBhc3MgaW4gdGhlIGFic29sdXRlIHZhbHVlIGFzIG5lZWRlZCkuCisgKgorICogQ29uc3RhbnRzIGFyZSBjb21waWxlIHRpbWUgZGVyaXZlZCB3aXRoIHRlbXBsYXRlcyBJMFRlcm08PiBhbmQKKyAqIEkwQVRlcm08PiB0byB0aGUgcHJlY2lzaW9uIG9mIHRoZSBjb21waWxlci4gIFRoZSBzZXJpZXMgY2FuIGJlIGV4cGFuZGVkCisgKiB0byBhbnkgcHJlY2lzaW9uIG5lZWRlZCwgYnV0IGN1cnJlbnRseSBzZXQgYXJvdW5kIDI0YiBwcmVjaXNpb24uCisgKgorICogV2UgdXNlIGEgYml0IG9mIHRlbXBsYXRlIG1hdGggaGVyZSwgY29uc3RleHByIHdvdWxkIHByb2JhYmx5IGJlCisgKiBtb3JlIGFwcHJvcHJpYXRlIGZvciBhIEMrKzExIGNvbXBpbGVyLgorICoKKyAqIEZvciB0aGUgaW50ZXJtZWRpYXRlIHJhbmdlIDMuNzUgPCB4IDwgMTUsIHdlIHVzZSBtaW5pbWF4IHBvbHlub21pYWwgZml0LgorICoKKyAqLworCit0ZW1wbGF0ZSA8aW50IE4+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+IDE2KTsKKyNlbmRpZgorfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfT1BTX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYzgwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGRlcGVuZHMgb24gQXVkaW9SZXNhbXBsZXJGaXJPcHMuaAorCisvKiB2YXJpYW50IGZvciBpbnB1dCB0eXBlIFRJID0gaW50MTZfdCBpbnB1dCBzYW1wbGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbWFjKGludDMyX3QmIGwsIGludDMyX3QmIHIsIFRDIGNvZWYsIGNvbnN0IGludDE2X3QqIHNhbXBsZXMpCit7CisgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KHNhbXBsZXMpOworICAgIGwgPSBtdWxBZGRSTCgxLCBybCwgY29lZiwgbCk7CisgICAgciA9IG11bEFkZFJMKDAsIHJsLCBjb2VmLCByKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEM+CitzdGF0aWMgaW5saW5lCit2b2lkIG1hYyhpbnQzMl90JiBsLCBUQyBjb2VmLCBjb25zdCBpbnQxNl90KiBzYW1wbGVzKQoreworICAgIGwgPSBtdWxBZGQoc2FtcGxlc1swXSwgY29lZiwgbCk7Cit9CisKKy8qIHZhcmlhbnQgZm9yIGlucHV0IHR5cGUgVEkgPSBmbG9hdCBpbnB1dCBzYW1wbGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbWFjKGZsb2F0JiBsLCBmbG9hdCYgciwgVEMgY29lZiwgIGNvbnN0IGZsb2F0KiBzYW1wbGVzKQoreworICAgIGwgKz0gKnNhbXBsZXMrKyAqIGNvZWY7CisgICAgciArPSAqc2FtcGxlcyAqIGNvZWY7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDPgorc3RhdGljIGlubGluZQordm9pZCBtYWMoZmxvYXQmIGwsIFRDIGNvZWYsICBjb25zdCBmbG9hdCogc2FtcGxlcykKK3sKKyAgICBsICs9ICpzYW1wbGVzICogY29lZjsKK30KKworLyogdmFyaWFudCBmb3Igb3V0cHV0IHR5cGUgVE8gPSBpbnQzMl90IG91dHB1dCBzYW1wbGVzICovCitzdGF0aWMgaW5saW5lCitpbnQzMl90IHZvbHVtZUFkanVzdChpbnQzMl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkKK3sKKyAgICByZXR1cm4gMiAqIG11bFJMKDAsIHZhbHVlLCB2b2x1bWUpOyAgLy8gTm90ZTogb25seSB1c2UgdG9wIDE2YgorfQorCisvKiB2YXJpYW50IGZvciBvdXRwdXQgdHlwZSBUTyA9IGZsb2F0IG91dHB1dCBzYW1wbGVzICovCitzdGF0aWMgaW5saW5lCitmbG9hdCB2b2x1bWVBZGp1c3QoZmxvYXQgdmFsdWUsIGZsb2F0IHZvbHVtZSkKK3sKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKKy8qCisgKiBIZWxwZXIgdGVtcGxhdGUgZnVuY3Rpb25zIGZvciBsb29wIHVucm9sbGluZyBhY2N1bXVsYXRvciBvcGVyYXRpb25zLgorICoKKyAqIFVucm9sbGluZyB0aGUgbG9vcHMgYWNoaWV2ZXMgYWJvdXQgMnggZ2Fpbi4KKyAqIFVzaW5nIGEgcmVjdXJzaXZlIHRlbXBsYXRlIHJhdGhlciB0aGFuIGFuIGFycmF5IG9mIFRPW10gZm9yIHRoZSBhY2N1bXVsYXRvcgorICogdmFsdWVzIGlzIGFuIGFkZGl0aW9uYWwgMTAtMjAlIGdhaW4uCisgKi8KKwordGVtcGxhdGU8aW50IENIQU5ORUxTLCB0eXBlbmFtZSBUTz4KK2NsYXNzIEFjY3VtdWxhdG9yIDogcHVibGljIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPiAvLyByZWN1cnNpdmUKK3sKK3B1YmxpYzoKKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgdmFsdWUgPSAwOworICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OmNsZWFyKCk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUST4KKyAgICBpbmxpbmUgdm9pZCBhY2MoVEMgY29lZiwgY29uc3QgVEkqJiBkYXRhKSB7CisgICAgICAgIG1hYyh2YWx1ZSwgY29lZiwgZGF0YSsrKTsKKyAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+OjphY2MoY29lZiwgZGF0YSk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHZvbHVtZShUTyomIG91dCwgVE8gZ2FpbikgeworICAgICAgICAqb3V0KysgPSB2b2x1bWVBZGp1c3QodmFsdWUsIGdhaW4pOworICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OnZvbHVtZShvdXQsIGdhaW4pOworICAgIH0KKworICAgIFRPIHZhbHVlOyAvLyBvbmUgcGVyIHJlY3Vyc2l2ZSBpbmhlcml0ZWQgYmFzZSBjbGFzcworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVE8+CitjbGFzcyBBY2N1bXVsYXRvcjwwLCBUTz4geworcHVibGljOgorICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEk+CisgICAgaW5saW5lIHZvaWQgYWNjKFRDIGNvZWYgX191bnVzZWQsIGNvbnN0IFRJKiYgZGF0YSBfX3VudXNlZCkgeworICAgIH0KKyAgICBpbmxpbmUgdm9pZCB2b2x1bWUoVE8qJiBvdXQgX191bnVzZWQsIFRPIGdhaW4gX191bnVzZWQpIHsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVElOVEVSUD4KK2lubGluZQorVEMgaW50ZXJwb2xhdGUoVEMgY29lZl8wLCBUQyBjb2VmXzEsIFRJTlRFUlAgbGVycCkKK3sKKyAgICByZXR1cm4gbGVycCAqIChjb2VmXzEgLSBjb2VmXzApICsgY29lZl8wOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUKK2ludDE2X3QgaW50ZXJwb2xhdGU8aW50MTZfdCwgdWludDMyX3Q+KGludDE2X3QgY29lZl8wLCBpbnQxNl90IGNvZWZfMSwgdWludDMyX3QgbGVycCkKK3sgICAvLyBpbiBzb21lIENQVSBhcmNoaXRlY3R1cmVzIDE2YiB4IDE2YiBtdWx0aXBsaWVzIGFyZSBmYXN0ZXIuCisgICAgcmV0dXJuIChzdGF0aWNfY2FzdDxpbnQxNl90PihsZXJwKSAqIHN0YXRpY19jYXN0PGludDE2X3Q+KGNvZWZfMSAtIGNvZWZfMCkgPj4gMTUpICsgY29lZl8wOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUKK2ludDMyX3QgaW50ZXJwb2xhdGU8aW50MzJfdCwgdWludDMyX3Q+KGludDMyX3QgY29lZl8wLCBpbnQzMl90IGNvZWZfMSwgdWludDMyX3QgbGVycCkKK3sKKyAgICByZXR1cm4gKGxlcnAgKiBzdGF0aWNfY2FzdDxpbnQ2NF90Pihjb2VmXzEgLSBjb2VmXzApID4+IDMxKSArIGNvZWZfMDsKK30KKworLyogY2xhc3Mgc2NvcGUgZm9yIHBhc3NpbmcgaW4gZnVuY3Rpb25zIGludG8gdGVtcGxhdGVzICovCitzdHJ1Y3QgSW50ZXJwQ29tcHV0ZSB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJTlRFUlA+CisgICAgc3RhdGljIGlubGluZQorICAgIFRDIGludGVycG9sYXRlcChUQyBjb2VmXzAsIFRDIGNvZWZfMSwgVElOVEVSUCBsZXJwKSB7CisgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShjb2VmXzAsIGNvZWZfMSwgbGVycCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJTlRFUlA+CisgICAgc3RhdGljIGlubGluZQorICAgIFRDIGludGVycG9sYXRlbihUQyBjb2VmXzAsIFRDIGNvZWZfMSwgVElOVEVSUCBsZXJwKSB7CisgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShjb2VmXzAsIGNvZWZfMSwgbGVycCk7CisgICAgfQorfTsKKworc3RydWN0IEludGVycE51bGwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSU5URVJQPgorICAgIHN0YXRpYyBpbmxpbmUKKyAgICBUQyBpbnRlcnBvbGF0ZXAoVEMgY29lZl8wLCBUQyBjb2VmXzEgX191bnVzZWQsIFRJTlRFUlAgbGVycCBfX3VudXNlZCkgeworICAgICAgICByZXR1cm4gY29lZl8wOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSU5URVJQPgorICAgIHN0YXRpYyBpbmxpbmUKKyAgICBUQyBpbnRlcnBvbGF0ZW4oVEMgY29lZl8wIF9fdW51c2VkLCBUQyBjb2VmXzEsIFRJTlRFUlAgbGVycCBfX3VudXNlZCkgeworICAgICAgICByZXR1cm4gY29lZl8xOworICAgIH0KK307CisKKy8qCisgKiBDYWxjdWxhdGVzIGEgc2luZ2xlIG91dHB1dCBmcmFtZSAodHdvIHNhbXBsZXMpLgorICoKKyAqIFRoZSBQcm9jZXNzKigpIGZ1bmN0aW9ucyBjb21wdXRlIGJvdGggdGhlIHBvc2l0aXZlIGhhbGYgRklSIGRvdCBwcm9kdWN0IGFuZAorICogdGhlIG5lZ2F0aXZlIGhhbGYgRklSIGRvdCBwcm9kdWN0LCBhY2N1bXVsYXRlcywgYW5kIHRoZW4gYXBwbGllcyB0aGUgdm9sdW1lLgorICoKKyAqIFVzZSBmaXIoKSB0byBjb21wdXRlIHRoZSBwcm9wZXIgY29lZmZpY2llbnQgcG9pbnRlcnMgZm9yIGEgcG9seXBoYXNlCisgKiBmaWx0ZXIgYmFuay4KKyAqCisgKiBQcm9jZXNzQmFzZSgpIGlzIHRoZSBmdW5kYW1lbnRhbCBwcm9jZXNzaW5nIHRlbXBsYXRlIGZ1bmN0aW9uLgorICoKKyAqIFByb2Nlc3NMKCkgY2FsbHMgUHJvY2Vzc0Jhc2UoKSB3aXRoIFRGVU5DID0gSW50ZXJwTnVsbCwgZm9yIGZpeGVkL2xvY2tlZCBwaGFzZS4KKyAqIFByb2Nlc3MoKSBjYWxscyBQcm9jZXNzQmFzZSgpIHdpdGggVEZVTkMgPSBJbnRlcnBDb21wdXRlLCBmb3IgaW50ZXJwb2xhdGVkIHBoYXNlLgorICovCisKK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRGVU5DLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSU5URVJQPgorc3RhdGljIGlubGluZQordm9pZCBQcm9jZXNzQmFzZShUTyogY29uc3Qgb3V0LAorICAgICAgICBzaXplX3QgY291bnQsCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04sCisgICAgICAgIGNvbnN0IFRJKiBzUCwKKyAgICAgICAgY29uc3QgVEkqIHNOLAorICAgICAgICBUSU5URVJQIGxlcnBQLAorICAgICAgICBjb25zdCBUTyogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShDSEFOTkVMUyA+IDApCisKKyAgICBpZiAoQ0hBTk5FTFMgPiAyKSB7CisgICAgICAgIC8vIFRPIGFjY3VtW0NIQU5ORUxTXTsKKyAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMsIFRPPiBhY2N1bTsKKworICAgICAgICAvLyBmb3IgKGludCBqID0gMDsgaiA8IENIQU5ORUxTOyArK2opIGFjY3VtW2pdID0gMDsKKyAgICAgICAgYWNjdW0uY2xlYXIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBUQyBjID0gVEZVTkM6OmludGVycG9sYXRlcChjb2Vmc1BbMF0sIGNvZWZzUFtjb3VudF0sIGxlcnBQKTsKKworICAgICAgICAgICAgLy8gZm9yIChpbnQgaiA9IDA7IGogPCBDSEFOTkVMUzsgKytqKSBtYWMoYWNjdW1bal0sIGMsIHNQICsgaik7CisgICAgICAgICAgICBjb25zdCBUSSAqdG1wX2RhdGEgPSBzUDsgLy8gdG1wX3B0ciBzZWVtcyB0byB3b3JrIGJldHRlcgorICAgICAgICAgICAgYWNjdW0uYWNjKGMsIHRtcF9kYXRhKTsKKworICAgICAgICAgICAgY29lZnNQKys7CisgICAgICAgICAgICBzUCAtPSBDSEFOTkVMUzsKKyAgICAgICAgICAgIGMgPSBURlVOQzo6aW50ZXJwb2xhdGVuKGNvZWZzTltjb3VudF0sIGNvZWZzTlswXSwgbGVycFApOworCisgICAgICAgICAgICAvLyBmb3IgKGludCBqID0gMDsgaiA8IENIQU5ORUxTOyArK2opIG1hYyhhY2N1bVtqXSwgYywgc04gKyBqKTsKKyAgICAgICAgICAgIHRtcF9kYXRhID0gc047IC8vIHRtcF9wdHIgc2VlbXMgZmFzdGVyIHRoYW4gZGlyZWN0bHkgdXNpbmcgc04KKyAgICAgICAgICAgIGFjY3VtLmFjYyhjLCB0bXBfZGF0YSk7CisKKyAgICAgICAgICAgIGNvZWZzTisrOworICAgICAgICAgICAgc04gKz0gQ0hBTk5FTFM7CisgICAgICAgIH0KKyAgICAgICAgLy8gZm9yIChpbnQgaiA9IDA7IGogPCBDSEFOTkVMUzsgKytqKSBvdXRbal0gKz0gdm9sdW1lQWRqdXN0KGFjY3VtW2pdLCB2b2x1bWVMUlswXSk7CisgICAgICAgIFRPICp0bXBfb3V0ID0gb3V0OyAvLyBtYXkgcmVtb3ZlIGlmIGNvbnN0IG91dCBkZWZpbml0aW9uIGNoYW5nZXMuCisgICAgICAgIGFjY3VtLnZvbHVtZSh0bXBfb3V0LCB2b2x1bWVMUlswXSk7CisgICAgfSBlbHNlIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIFRPIGwgPSAwOworICAgICAgICBUTyByID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBtYWMobCwgciwgVEZVTkM6OmludGVycG9sYXRlcChjb2Vmc1BbMF0sIGNvZWZzUFtjb3VudF0sIGxlcnBQKSwgc1ApOworICAgICAgICAgICAgY29lZnNQKys7CisgICAgICAgICAgICBzUCAtPSBDSEFOTkVMUzsKKyAgICAgICAgICAgIG1hYyhsLCByLCBURlVOQzo6aW50ZXJwb2xhdGVuKGNvZWZzTltjb3VudF0sIGNvZWZzTlswXSwgbGVycFApLCBzTik7CisgICAgICAgICAgICBjb2Vmc04rKzsKKyAgICAgICAgICAgIHNOICs9IENIQU5ORUxTOworICAgICAgICB9CisgICAgICAgIG91dFswXSArPSB2b2x1bWVBZGp1c3QobCwgdm9sdW1lTFJbMF0pOworICAgICAgICBvdXRbMV0gKz0gdm9sdW1lQWRqdXN0KHIsIHZvbHVtZUxSWzFdKTsKKyAgICB9IGVsc2UgeyAvKiBDSEFOTkVMUyA9PSAxICovCisgICAgICAgIFRPIGwgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIG1hYyhsLCBURlVOQzo6aW50ZXJwb2xhdGVwKGNvZWZzUFswXSwgY29lZnNQW2NvdW50XSwgbGVycFApLCBzUCk7CisgICAgICAgICAgICBjb2Vmc1ArKzsKKyAgICAgICAgICAgIHNQIC09IENIQU5ORUxTOworICAgICAgICAgICAgbWFjKGwsIFRGVU5DOjppbnRlcnBvbGF0ZW4oY29lZnNOW2NvdW50XSwgY29lZnNOWzBdLCBsZXJwUCksIHNOKTsKKyAgICAgICAgICAgIGNvZWZzTisrOworICAgICAgICAgICAgc04gKz0gQ0hBTk5FTFM7CisgICAgICAgIH0KKyAgICAgICAgb3V0WzBdICs9IHZvbHVtZUFkanVzdChsLCB2b2x1bWVMUlswXSk7CisgICAgICAgIG91dFsxXSArPSB2b2x1bWVBZGp1c3QobCwgdm9sdW1lTFJbMV0pOworICAgIH0KK30KKwordGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgUHJvY2Vzc0woVE8qIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBUQyogY29lZnNQLAorICAgICAgICBjb25zdCBUQyogY29lZnNOLAorICAgICAgICBjb25zdCBUSSogc1AsCisgICAgICAgIGNvbnN0IFRJKiBzTiwKKyAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZUxSKQoreworICAgIFByb2Nlc3NCYXNlPENIQU5ORUxTLCBTVFJJREUsIEludGVycE51bGw+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIDAsIHZvbHVtZUxSKTsKK30KKwordGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVElOVEVSUD4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgUHJvY2VzcyhUTyogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04sCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc1AxIF9fdW51c2VkLAorICAgICAgICBjb25zdCBUQyogY29lZnNOMSBfX3VudXNlZCwKKyAgICAgICAgY29uc3QgVEkqIHNQLAorICAgICAgICBjb25zdCBUSSogc04sCisgICAgICAgIFRJTlRFUlAgbGVycFAsCisgICAgICAgIGNvbnN0IFRPKiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBQcm9jZXNzQmFzZTxDSEFOTkVMUywgU1RSSURFLCBJbnRlcnBDb21wdXRlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCBsZXJwUCwgdm9sdW1lTFIpOworfQorCisvKgorICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgKHR3byBzYW1wbGVzKSBmcm9tIGlucHV0IHNhbXBsZSBwb2ludGVyLgorICoKKyAqIFRoaXMgc2V0cyB1cCB0aGUgcGFyYW1zIGZvciB0aGUgYWNjZWxlcmF0ZWQgUHJvY2VzcygpIGFuZCBQcm9jZXNzTCgpCisgKiBmdW5jdGlvbnMgdG8gZG8gdGhlIGFwcHJvcHJpYXRlIGRvdCBwcm9kdWN0cy4KKyAqCisgKiBAcGFyYW0gb3V0IHNob3VsZCBwb2ludCB0byB0aGUgb3V0cHV0IGJ1ZmZlciB3aXRoIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgb3V0cHV0IGZyYW1lLgorICoKKyAqIEBwYXJhbSBwaGFzZSBpcyB0aGUgZnJhY3Rpb25hbCBkaXN0YW5jZSBiZXR3ZWVuIGlucHV0IGZyYW1lcyBmb3IgaW50ZXJwb2xhdGlvbjoKKyAqIHBoYXNlID49IDAgICYmIHBoYXNlIDwgcGhhc2VXcmFwTGltaXQuICBJdCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHJhdGlvbmFsIGZyYWN0aW9uCisgKiBvZiBwaGFzZS9waGFzZVdyYXBMaW1pdC4KKyAqCisgKiBAcGFyYW0gcGhhc2VXcmFwTGltaXQgaXMgI3BvbHlwaGFzZXM8PGNvZWZTaGlmdCwgd2hlcmUgI3BvbHlwaGFzZXMgaXMgdGhlIG51bWJlciBvZiBwb2x5cGhhc2VzCisgKiBpbiB0aGUgcG9seXBoYXNlIGZpbHRlci4gTGlrZXdpc2UsICNwb2x5cGhhc2VzIGNhbiBiZSBvYnRhaW5lZCBhcyAocGhhc2VXcmFwTGltaXQ+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+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vIChyZXZlcnNlZCkgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnN1Yi5zMzIgICAgICAgcTksIHE5LCBxOCAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnN1Yi5zMzIgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgZDUsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlsxXSAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXA0KSAybmQgc2V0CisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKworI2VuZGlmIC8vVVNFX05FT04KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfTkVPTl9IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKaW5kZXggMjA3ZjI2Yi4uZDAzZTU3OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9SZXNhbXBsZXJTaW5jIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTI2LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJTaW5jLmgiCiAKQEAgLTM3LDEyICszOSwxNCBAQAogI2RlZmluZSBVU0VfSU5MSU5FX0FTU0VNQkxZIChmYWxzZSkKICNlbmRpZgogCi0jaWYgVVNFX0lOTElORV9BU1NFTUJMWSAmJiBkZWZpbmVkKF9fQVJNX05FT05fXykKLSNkZWZpbmUgVVNFX05FT04gKHRydWUpCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykgfHwgZGVmaW5lZChfX0FSTV9ORU9OX18pCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKyNkZWZpbmUgVVNFX05FT04KICNlbHNlCi0jZGVmaW5lIFVTRV9ORU9OIChmYWxzZSkKKyN1bmRlZiBVU0VfTkVPTgogI2VuZGlmCiAKKyNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ0OSw5ICs0NTMsOSBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUF1ZGlvUmVzYW1wbGVyU2luYzo6QXVkaW9SZXNhbXBsZXJTaW5jKGludCBiaXREZXB0aCwKK0F1ZGlvUmVzYW1wbGVyU2luYzo6QXVkaW9SZXNhbXBsZXJTaW5jKAogICAgICAgICBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSkKLSAgICA6IEF1ZGlvUmVzYW1wbGVyKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSksCisgICAgOiBBdWRpb1Jlc2FtcGxlcihpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSksCiAgICAgbVN0YXRlKDApLCBtSW1wdWxzZSgwKSwgbVJpbmdGdWxsKDApLCBtRmlyQ29lZnMoMCkKIHsKICAgICAvKgpAQCAtNDk3LDEwICs1MDEsMTIgQEAKICAgICBtUmluZ0Z1bGwgPSBtSW1wdWxzZSArIChudW1Db2VmcysxKSptQ2hhbm5lbENvdW50OwogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6c2V0Vm9sdW1lKGludDE2X3QgbGVmdCwgaW50MTZfdCByaWdodCkgewordm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewogICAgIEF1ZGlvUmVzYW1wbGVyOjpzZXRWb2x1bWUobGVmdCwgcmlnaHQpOwotICAgIG1Wb2x1bWVTSU1EWzBdID0gaW50MzJfdChsZWZ0KTw8MTY7Ci0gICAgbVZvbHVtZVNJTURbMV0gPSBpbnQzMl90KHJpZ2h0KTw8MTY7CisgICAgLy8gY29udmVydCB0byBVNF8yOCAocm91bmRpbmcgZG93bikuCisgICAgLy8gaW50ZWdlciB2b2x1bWUgdmFsdWVzIGFyZSBjbGFtcGVkIHRvIDAgdG8gVU5JVFlfR0FJTi4KKyAgICBtVm9sdW1lU0lNRFswXSA9IHU0XzI4X2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChsZWZ0KSk7CisgICAgbVZvbHVtZVNJTURbMV0gPSB1NF8yOF9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wocmlnaHQpKTsKIH0KIAogdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCkBAIC01NDAsNyArNTQ2LDcgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQob3V0RnJhbWVDb3VudCk7CiAKICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBvdXRwdXRTYW1wbGVDb3VudCkgewogICAgICAgICAvLyBidWZmZXIgaXMgZW1wdHksIGZldGNoIGEgbmV3IG9uZQpAQCAtNjM0LDggKzY0MCw4IEBACiB9CiAKIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KLXZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpmaWx0ZXJDb2VmZmljaWVudCgKLSAgICAgICAgaW50MzJfdCogb3V0LCB1aW50MzJfdCBwaGFzZSwgY29uc3QgaW50MTZfdCAqc2FtcGxlcywgdWludDMyX3QgdlJMKQordm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OmZpbHRlckNvZWZmaWNpZW50KGludDMyX3QqIG91dCwgdWludDMyX3QgcGhhc2UsCisgICAgICAgICBjb25zdCBpbnQxNl90ICpzYW1wbGVzLCB1aW50MzJfdCB2UkwpCiB7CiAgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCiAgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKQEAgLTY2MiwxNjAgKzY2OCwxNzEgQEAKIAogICAgIHNpemVfdCBjb3VudCA9IG9mZnNldDsKIAotICAgIGlmICghVVNFX05FT04pIHsKLSAgICAgICAgaW50MzJfdCBsID0gMDsKLSAgICAgICAgaW50MzJfdCByID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzUCsrLCBvZmZzZXQsIGxlcnBQLCBzUCk7Ci0gICAgICAgICAgICBzUCAtPSBDSEFOTkVMUzsKLSAgICAgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2Vmc04rKywgb2Zmc2V0LCBsZXJwTiwgc04pOwotICAgICAgICAgICAgc04gKz0gQ0hBTk5FTFM7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0WzBdICs9IDIgKiBtdWxSTCgxLCBsLCB2UkwpOwotICAgICAgICBvdXRbMV0gKz0gMiAqIG11bFJMKDAsIHIsIHZSTCk7Ci0gICAgfSBlbHNlIGlmIChDSEFOTkVMUyA9PSAxKSB7CisjaWZuZGVmIFVTRV9ORU9OCisgICAgaW50MzJfdCBsID0gMDsKKyAgICBpbnQzMl90IHIgPSAwOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzUCsrLCBvZmZzZXQsIGxlcnBQLCBzUCk7CisgICAgICAgIHNQIC09IENIQU5ORUxTOworICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnNOKyssIG9mZnNldCwgbGVycE4sIHNOKTsKKyAgICAgICAgc04gKz0gQ0hBTk5FTFM7CisgICAgfQorICAgIG91dFswXSArPSAyICogbXVsUkwoMSwgbCwgdlJMKTsKKyAgICBvdXRbMV0gKz0gMiAqIG11bFJMKDAsIHIsIHZSTCk7CisjZWxzZQorICAgIFVOVVNFRCh2UkwpOworICAgIGlmIChDSEFOTkVMUyA9PSAxKSB7CiAgICAgICAgIGludDMyX3QgY29uc3QqIGNvZWZzUDEgPSBjb2Vmc1AgKyBvZmZzZXQ7CiAgICAgICAgIGludDMyX3QgY29uc3QqIGNvZWZzTjEgPSBjb2Vmc04gKyBvZmZzZXQ7CiAgICAgICAgIHNQIC09IENIQU5ORUxTKjM7Ci0gICAgICAgIGFzbSAoCi0gICAgICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQotICAgICAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzFdLCAlW2xlcnBOXSAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgbmVnYXRpdmUgcGhhc2UKLSAgICAgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iICAgIC8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0gICAgICAgICAgICAidnNobC5zMzIgICAgICAgZDIsIGQyLCAjMTYgICAgICAgICAgICAgIFxuIiAgICAvLyBjb252ZXJ0IHRvIDMyIGJpdHMKIAotICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7IGQ0fSwgWyVbc1BdXSAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAgeyBxOH0sIFslW2NvZWZzUDBdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHsgcTl9LCBbJVtjb2Vmc1AxXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7IGQ2fSwgWyVbc05dXSEgICAgICAgICAgXG4iICAgIC8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgaW50MzJ4NF90IHN1bTsKKyAgICAgICAgaW50MzJ4Ml90IGxlcnBQTjsKKyAgICAgICAgbGVycFBOID0gdmR1cF9uX3MzMigwKTsKKyAgICAgICAgbGVycFBOID0gdmxkMV9sYW5lX3MzMigoaW50MzJfdCAqKSZsZXJwUCwgbGVycFBOLCAwKTsKKyAgICAgICAgbGVycFBOID0gdmxkMV9sYW5lX3MzMigoaW50MzJfdCAqKSZsZXJwTiwgbGVycFBOLCAxKTsKKyAgICAgICAgbGVycFBOID0gdnNobF9uX3MzMihsZXJwUE4sIDE2KTsKKyAgICAgICAgc3VtID0gdmR1cHFfbl9zMzIoMCk7CiAKLSAgICAgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgaW50MTZ4NF90IHNhbXBsZVAsIHNhbXBsZU47CisgICAgICAgIGludDMyeDRfdCBzYW1wbGVQRXh0LCBzYW1wbGVORXh0OworICAgICAgICBpbnQzMng0X3QgY29lZnNQVjAsIGNvZWZzUFYxLCBjb2Vmc05WMCwgY29lZnNOVjE7CiAKLSAgICAgICAgICAgICJ2c3ViLnMzMiAgICAgICAgcTksICBxOSwgIHE4ICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgIGNvZWZzUCA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQLCAxNik7CisgICAgICAgIGNvZWZzTiA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOLCAxNik7CisgICAgICAgIGNvZWZzUDEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUDEsIDE2KTsKKyAgICAgICAgY29lZnNOMSA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOMSwgMTYpOworICAgICAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudCAtPSA0KSB7CisgICAgICAgICAgICBzYW1wbGVQID0gdmxkMV9zMTYoc1ApOworICAgICAgICAgICAgc2FtcGxlTiA9IHZsZDFfczE2KHNOKTsKKyAgICAgICAgICAgIGNvZWZzUFYwID0gdmxkMXFfczMyKGNvZWZzUCk7CisgICAgICAgICAgICBjb2Vmc05WMCA9IHZsZDFxX3MzMihjb2Vmc04pOworICAgICAgICAgICAgY29lZnNQVjEgPSB2bGQxcV9zMzIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZsZDFxX3MzMihjb2Vmc04xKTsKKyAgICAgICAgICAgIHNQIC09IDQ7CisgICAgICAgICAgICBzTiArPSA0OworICAgICAgICAgICAgY29lZnNQICs9IDQ7CisgICAgICAgICAgICBjb2Vmc04gKz0gNDsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gNDsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gNDsKIAotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgICBxOSwgIHE5LCBkMlswXSAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTExLCBxMTEsIGQyWzFdICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkNiwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgICAgIHNhbXBsZVAgPSB2cmV2NjRfczE2KHNhbXBsZVApOwogCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgIHE4LCAgcTgsICBxOSAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAotICAgICAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIgICAgLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAgICAgY29lZnNQVjEgPSB2c3VicV9zMzIoY29lZnNQVjEsIGNvZWZzUFYwKTsKKyAgICAgICAgICAgIGNvZWZzTlYxID0gdnN1YnFfczMyKGNvZWZzTlYxLCBjb2Vmc05WMCk7CisgICAgICAgICAgICBzYW1wbGVQRXh0ID0gdnNobGxfbl9zMTYoc2FtcGxlUCwgMTUpOworICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAgICAgY29lZnNQVjEgPSB2cXJkbXVsaHFfbGFuZV9zMzIoY29lZnNQVjEsIGxlcnBQTiwgMCk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZxcmRtdWxocV9sYW5lX3MzMihjb2Vmc05WMSwgbGVycFBOLCAxKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQgPSB2c2hsbF9uX3MxNihzYW1wbGVOLCAxNSk7CisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICAgICBjb2Vmc1BWMCA9IHZhZGRxX3MzMihjb2Vmc1BWMCwgY29lZnNQVjEpOworICAgICAgICAgICAgY29lZnNOVjAgPSB2YWRkcV9zMzIoY29lZnNOVjAsIGNvZWZzTlYxKTsKIAotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgICBcbiIgICAgLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKyAgICAgICAgICAgIHNhbXBsZVBFeHQgPSB2cXJkbXVsaHFfczMyKHNhbXBsZVBFeHQsIGNvZWZzUFYwKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQgPSB2cXJkbXVsaHFfczMyKHNhbXBsZU5FeHQsIGNvZWZzTlYwKTsKKyAgICAgICAgICAgIHN1bSA9IHZhZGRxX3MzMihzdW0sIHNhbXBsZVBFeHQpOworICAgICAgICAgICAgc3VtID0gdmFkZHFfczMyKHN1bSwgc2FtcGxlTkV4dCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJ4Ml90IHZvbHVtZXNWLCBvdXRWOworICAgICAgICB2b2x1bWVzViA9IHZsZDFfczMyKG1Wb2x1bWVTSU1EKTsKKyAgICAgICAgb3V0ViA9IHZsZDFfczMyKG91dCk7CiAKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAvL2FkZCBhbGwgNCBwYXJ0aWFsIHN1bXMKKyAgICAgICAgaW50MzJ4Ml90IHN1bUxvdywgc3VtSGlnaDsKKyAgICAgICAgc3VtTG93ID0gdmdldF9sb3dfczMyKHN1bSk7CisgICAgICAgIHN1bUhpZ2ggPSB2Z2V0X2hpZ2hfczMyKHN1bSk7CisgICAgICAgIHN1bUxvdyA9IHZwYWRkX3MzMihzdW1Mb3csIHN1bUhpZ2gpOworICAgICAgICBzdW1Mb3cgPSB2cGFkZF9zMzIoc3VtTG93LCBzdW1Mb3cpOwogCi0gICAgICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyBsb29wCi0KLSAgICAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDJ9LCBbJVt2TFJdXSAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgdm9sdW1lcwotICAgICAgICAgICAgInZsZDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMSAgICAgICAgICAgICAgIFxuIiAgICAvLyBhZGQgYWxsIDQgcGFydGlhbCBzdW1zCi0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMCAgICAgICAgICAgICAgIFxuIiAgICAvLyB0b2dldGhlcgotICAgICAgICAgICAgInZkdXAuaTMyICAgICAgIGQwLCBkMFswXSAgICAgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJsZWF2ZSBMLFIgY2hhbm5lbHMKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBkMCwgZDAsIGQyICAgICAgICAgICAgICAgXG4iICAgIC8vIGFwcGx5IHZvbHVtZQotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIGQzLCBkMywgZDAgICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2c3QxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iICAgIC8vIHN0b3JlIHJlc3VsdAotCi0gICAgICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKLSAgICAgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKLSAgICAgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCi0gICAgICAgICAgICAgIFtsZXJwTl0gICAiciIgKGxlcnBOKSwKLSAgICAgICAgICAgICAgW3ZMUl0gICAgICJyIiAobVZvbHVtZVNJTUQpCi0gICAgICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAotICAgICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCi0gICAgICAgICAgICAgICJxMTIiLCAicTE0IgotICAgICAgICApOworICAgICAgICBzdW1Mb3cgPSB2cXJkbXVsaF9zMzIoc3VtTG93LCB2b2x1bWVzVik7CisgICAgICAgIG91dFYgPSB2YWRkX3MzMihvdXRWLCBzdW1Mb3cpOworICAgICAgICB2c3QxX3MzMihvdXQsIG91dFYpOwogICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMikgewogICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2Vmc1AxID0gY29lZnNQICsgb2Zmc2V0OwogICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2Vmc04xID0gY29lZnNOICsgb2Zmc2V0OwogICAgICAgICBzUCAtPSBDSEFOTkVMUyozOwotICAgICAgICBhc20gKAotICAgICAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKLSAgICAgICAgICAgICJ2bW92LjMyICAgICAgICBkMlsxXSwgJVtsZXJwTl0gICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIG5lZ2F0aXZlIHBoYXNlCi0gICAgICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotICAgICAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIgICAgLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLSAgICAgICAgICAgICJ2c2hsLnMzMiAgICAgICBkMiwgZDIsICMxNiAgICAgICAgICAgICAgXG4iICAgIC8vIGNvbnZlcnQgdG8gMzIgYml0cwogCi0gICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCxkNX0sIFslW3NQXV0gICAgICAgICBcbiIgICAgLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7IHE4fSwgWyVbY29lZnNQMF06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAgeyBxOX0sIFslW2NvZWZzUDFdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNixkN30sIFslW3NOXV0hICAgICAgICBcbiIgICAgLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICBpbnQzMng0X3Qgc3VtMCwgc3VtMTsKKyAgICAgICAgaW50MzJ4Ml90IGxlcnBQTjsKIAotICAgICAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQotICAgICAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ1LCBkNSAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICBsZXJwUE4gPSB2ZHVwX25fczMyKDApOworICAgICAgICBsZXJwUE4gPSB2bGQxX2xhbmVfczMyKChpbnQzMl90ICopJmxlcnBQLCBsZXJwUE4sIDApOworICAgICAgICBsZXJwUE4gPSB2bGQxX2xhbmVfczMyKChpbnQzMl90ICopJmxlcnBOLCBsZXJwUE4sIDEpOworICAgICAgICBsZXJwUE4gPSB2c2hsX25fczMyKGxlcnBQTiwgMTYpOworICAgICAgICBzdW0wID0gdmR1cHFfbl9zMzIoMCk7CisgICAgICAgIHN1bTEgPSB2ZHVwcV9uX3MzMigwKTsKIAotICAgICAgICAgICAgInZzdWIuczMyICAgICAgICBxOSwgIHE5LCAgcTggICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnN1Yi5zMzIgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNSwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgaW50MTZ4NHgyX3Qgc2FtcGxlUCwgc2FtcGxlTjsKKyAgICAgICAgaW50MzJ4NHgyX3Qgc2FtcGxlUEV4dCwgc2FtcGxlTkV4dDsKKyAgICAgICAgaW50MzJ4NF90IGNvZWZzUFYwLCBjb2Vmc1BWMSwgY29lZnNOVjAsIGNvZWZzTlYxOwogCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgIHE5LCAgcTksIGQyWzBdICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMV0gICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQ2LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQ3LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICBjb2Vmc1AgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUCwgMTYpOworICAgICAgICBjb2Vmc04gPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTiwgMTYpOworICAgICAgICBjb2Vmc1AxID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AxLCAxNik7CisgICAgICAgIGNvZWZzTjEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTjEsIDE2KTsKKyAgICAgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQgLT0gNCkgeworICAgICAgICAgICAgc2FtcGxlUCA9IHZsZDJfczE2KHNQKTsKKyAgICAgICAgICAgIHNhbXBsZU4gPSB2bGQyX3MxNihzTik7CisgICAgICAgICAgICBjb2Vmc1BWMCA9IHZsZDFxX3MzMihjb2Vmc1ApOworICAgICAgICAgICAgY29lZnNOVjAgPSB2bGQxcV9zMzIoY29lZnNOKTsKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdmxkMXFfczMyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNOVjEgPSB2bGQxcV9zMzIoY29lZnNOMSk7CisgICAgICAgICAgICBzUCAtPSA4OworICAgICAgICAgICAgc04gKz0gODsKKyAgICAgICAgICAgIGNvZWZzUCArPSA0OworICAgICAgICAgICAgY29lZnNOICs9IDQ7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDQ7CisgICAgICAgICAgICBjb2Vmc04xICs9IDQ7CiAKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICAgcTgsICBxOCwgIHE5ICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXA0KSAybmQgc2V0Ci0gICAgICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIiAgICAvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICAgICBzYW1wbGVQLnZhbFswXSA9IHZyZXY2NF9zMTYoc2FtcGxlUC52YWxbMF0pOworICAgICAgICAgICAgc2FtcGxlUC52YWxbMV0gPSB2cmV2NjRfczE2KHNhbXBsZVAudmFsWzFdKTsKIAotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIgICAgLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdnN1YnFfczMyKGNvZWZzUFYxLCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZzdWJxX3MzMihjb2Vmc05WMSwgY29lZnNOVjApOworICAgICAgICAgICAgc2FtcGxlUEV4dC52YWxbMF0gPSB2c2hsbF9uX3MxNihzYW1wbGVQLnZhbFswXSwgMTUpOworICAgICAgICAgICAgc2FtcGxlUEV4dC52YWxbMV0gPSB2c2hsbF9uX3MxNihzYW1wbGVQLnZhbFsxXSwgMTUpOworICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAgICAgY29lZnNQVjEgPSB2cXJkbXVsaHFfbGFuZV9zMzIoY29lZnNQVjEsIGxlcnBQTiwgMCk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZxcmRtdWxocV9sYW5lX3MzMihjb2Vmc05WMSwgbGVycFBOLCAxKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQudmFsWzBdID0gdnNobGxfbl9zMTYoc2FtcGxlTi52YWxbMF0sIDE1KTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQudmFsWzFdID0gdnNobGxfbl9zMTYoc2FtcGxlTi52YWxbMV0sIDE1KTsKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgICAgIGNvZWZzUFYwID0gdmFkZHFfczMyKGNvZWZzUFYwLCBjb2Vmc1BWMSk7CisgICAgICAgICAgICBjb2Vmc05WMCA9IHZhZGRxX3MzMihjb2Vmc05WMCwgY29lZnNOVjEpOwogCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAgICAgc2FtcGxlUEV4dC52YWxbMF0gPSB2cXJkbXVsaHFfczMyKHNhbXBsZVBFeHQudmFsWzBdLCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBzYW1wbGVQRXh0LnZhbFsxXSA9IHZxcmRtdWxocV9zMzIoc2FtcGxlUEV4dC52YWxbMV0sIGNvZWZzUFYwKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQudmFsWzBdID0gdnFyZG11bGhxX3MzMihzYW1wbGVORXh0LnZhbFswXSwgY29lZnNOVjApOworICAgICAgICAgICAgc2FtcGxlTkV4dC52YWxbMV0gPSB2cXJkbXVsaHFfczMyKHNhbXBsZU5FeHQudmFsWzFdLCBjb2Vmc05WMCk7CisgICAgICAgICAgICBzdW0wID0gdmFkZHFfczMyKHN1bTAsIHNhbXBsZVBFeHQudmFsWzBdKTsKKyAgICAgICAgICAgIHN1bTEgPSB2YWRkcV9zMzIoc3VtMSwgc2FtcGxlUEV4dC52YWxbMV0pOworICAgICAgICAgICAgc3VtMCA9IHZhZGRxX3MzMihzdW0wLCBzYW1wbGVORXh0LnZhbFswXSk7CisgICAgICAgICAgICBzdW0xID0gdmFkZHFfczMyKHN1bTEsIHNhbXBsZU5FeHQudmFsWzFdKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMngyX3Qgdm9sdW1lc1YsIG91dFY7CisgICAgICAgIHZvbHVtZXNWID0gdmxkMV9zMzIobVZvbHVtZVNJTUQpOworICAgICAgICBvdXRWID0gdmxkMV9zMzIob3V0KTsKIAotICAgICAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gbG9vcAorICAgICAgICAvL2FkZCBhbGwgNCBwYXJ0aWFsIHN1bXMKKyAgICAgICAgaW50MzJ4Ml90IHN1bUxvdzAsIHN1bUhpZ2gwLCBzdW1Mb3cxLCBzdW1IaWdoMTsKKyAgICAgICAgc3VtTG93MCA9IHZnZXRfbG93X3MzMihzdW0wKTsKKyAgICAgICAgc3VtSGlnaDAgPSB2Z2V0X2hpZ2hfczMyKHN1bTApOworICAgICAgICBzdW1Mb3cxID0gdmdldF9sb3dfczMyKHN1bTEpOworICAgICAgICBzdW1IaWdoMSA9IHZnZXRfaGlnaF9zMzIoc3VtMSk7CisgICAgICAgIHN1bUxvdzAgPSB2cGFkZF9zMzIoc3VtTG93MCwgc3VtSGlnaDApOworICAgICAgICBzdW1Mb3cwID0gdnBhZGRfczMyKHN1bUxvdzAsIHN1bUxvdzApOworICAgICAgICBzdW1Mb3cxID0gdnBhZGRfczMyKHN1bUxvdzEsIHN1bUhpZ2gxKTsKKyAgICAgICAgc3VtTG93MSA9IHZwYWRkX3MzMihzdW1Mb3cxLCBzdW1Mb3cxKTsKIAotICAgICAgICAgICAgInZsZDEuczMyICAgICAgIHtkMn0sIFslW3ZMUl1dICAgICAgICAgICBcbiIgICAgLy8gbG9hZCB2b2x1bWVzCi0gICAgICAgICAgICAidmxkMS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQxICAgICAgICAgICAgICAgXG4iICAgIC8vIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMgZnJvbSBxMAotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQ4LCBkOCwgZDkgICAgICAgICAgICAgICBcbiIgICAgLy8gYWRkIGFsbCA0IHBhcnRpYWwgc3VtcyBmcm9tIHE0Ci0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMCAgICAgICAgICAgICAgIFxuIiAgICAvLyB0b2dldGhlcgotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQ4LCBkOCwgZDggICAgICAgICAgICAgICBcbiIgICAgLy8gdG9nZXRoZXIKLSAgICAgICAgICAgICJ2dHJuLnMzMiAgICAgICBkMCwgZDggICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIGludGVybGFjZSBMLFIgY2hhbm5lbHMKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBkMCwgZDAsIGQyICAgICAgICAgICAgICAgXG4iICAgIC8vIGFwcGx5IHZvbHVtZQotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIGQzLCBkMywgZDAgICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2c3QxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iICAgIC8vIHN0b3JlIHJlc3VsdAotCi0gICAgICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKLSAgICAgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKLSAgICAgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCi0gICAgICAgICAgICAgIFtsZXJwTl0gICAiciIgKGxlcnBOKSwKLSAgICAgICAgICAgICAgW3ZMUl0gICAgICJyIiAobVZvbHVtZVNJTUQpCi0gICAgICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLAotICAgICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCi0gICAgICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCi0gICAgICAgICk7CisgICAgICAgIHN1bUxvdzAgPSB2dHJuX3MzMihzdW1Mb3cwLCBzdW1Mb3cxKS52YWxbMF07CisgICAgICAgIHN1bUxvdzAgPSB2cXJkbXVsaF9zMzIoc3VtTG93MCwgdm9sdW1lc1YpOworICAgICAgICBvdXRWID0gdmFkZF9zMzIob3V0Viwgc3VtTG93MCk7CisgICAgICAgIHZzdDFfczMyKG91dCwgb3V0Vik7CiAgICAgfQorI2VuZGlmCiB9CiAKIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaAppbmRleCAxZWE0NDc0Li40NjkxZDBhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCkBAIC0zNCw3ICszNCw3IEBACiAKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyU2luYyA6IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CiBwdWJsaWM6Ci0gICAgQXVkaW9SZXNhbXBsZXJTaW5jKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgQXVkaW9SZXNhbXBsZXJTaW5jKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgc3JjX3F1YWxpdHkgcXVhbGl0eSA9IEhJR0hfUVVBTElUWSk7CiAKICAgICB2aXJ0dWFsIH5BdWRpb1Jlc2FtcGxlclNpbmMoKTsKQEAgLTQ0LDcgKzQ0LDcgQEAKIHByaXZhdGU6CiAgICAgdm9pZCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGludDE2X3QgbGVmdCwgaW50MTZfdCByaWdodCk7CisgICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAKICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CiAgICAgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvV2F0Y2hkb2cuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvV2F0Y2hkb2cuY3BwCmluZGV4IDkzZDE4NWUuLjg3N2U3NzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1dhdGNoZG9nLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9XYXRjaGRvZy5jcHAKQEAgLTM0LDcgKzM0LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBzdHJjcHkoYnVmLCAiTi9BXG4iKTsKICAgICB9Ci0gICAgZmRwcmludGYoZmQsICJXYXRjaGRvZzogdW5kZXJydW5zPSV1LCBsb2dzPSV1LCBtb3N0IHJlY2VudCB1bmRlcnJ1biBsb2cgYXQgJXMiLAorICAgIGRwcmludGYoZmQsICJXYXRjaGRvZzogdW5kZXJydW5zPSV1LCBsb2dzPSV1LCBtb3N0IHJlY2VudCB1bmRlcnJ1biBsb2cgYXQgJXMiLAogICAgICAgICAgICAgbVVuZGVycnVucywgbUxvZ3MsIGJ1Zik7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCmluZGV4IGJjMjAzOGEuLjZhOGFlYjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaApAQCAtMzEsOSArMzEsNyBAQAogCiAvLyB1bmNvbW1lbnQgdG8gZW5hYmxlIGZhc3QgbWl4ZXIgdG8gdGFrZSBwZXJmb3JtYW5jZSBzYW1wbGVzIGZvciBsYXRlciBzdGF0aXN0aWNhbCBhbmFseXNpcwogI2RlZmluZSBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLQotLy8gdW5jb21tZW50IHRvIGFsbG93IGZhc3QgdHJhY2tzIGF0IG5vbi1uYXRpdmUgc2FtcGxlIHJhdGUKLS8vI2RlZmluZSBGQVNUX1RSQUNLU19BVF9OT05fTkFUSVZFX1NBTVBMRV9SQVRFCisvLyBGSVhNRSByZW5hbWUgdG8gRkFTVF9USFJFQURfU1RBVElTVElDUwogCiAvLyB1bmNvbW1lbnQgZm9yIGRlYnVnZ2luZyB0aW1pbmcgcHJvYmxlbXMgcmVsYXRlZCB0byBTdGF0ZVF1ZXVlOjpwdXNoKCkKIC8vI2RlZmluZSBTVEFURV9RVUVVRV9EVU1QCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggYThhNTE2OS4uYmNhZjhhZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtNDQsNiArNDQsOCBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAorI2RlZmluZSBtaW4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02Niw3ICs2OCw4IEBACiAgICAgICBtU3RhdHVzKE5PX0lOSVQpLCBtU3RhdGUoSURMRSksCiAgICAgICAvLyBtTWF4RGlzYWJsZVdhaXRDbnQgaXMgc2V0IGJ5IGNvbmZpZ3VyZSgpIGFuZCBub3QgdXNlZCBiZWZvcmUgdGhlbgogICAgICAgLy8gbURpc2FibGVXYWl0Q250IGlzIHNldCBieSBwcm9jZXNzKCkgYW5kIHVwZGF0ZVN0YXRlKCkgYW5kIG5vdCB1c2VkIGJlZm9yZSB0aGVuCi0gICAgICBtU3VzcGVuZGVkKGZhbHNlKQorICAgICAgbVN1c3BlbmRlZChmYWxzZSksCisgICAgICBtQXVkaW9GbGluZ2VyKHRocmVhZC0+bUF1ZGlvRmxpbmdlcikKIHsKICAgICBBTE9HVigiQ29uc3RydWN0b3IgJXAiLCB0aGlzKTsKICAgICBpbnQgbFN0YXR1czsKQEAgLTExNiw4ICsxMTksOSBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgLy8gZmlyc3Qgbm9uIGRlc3Ryb3llZCBoYW5kbGUgaXMgY29uc2lkZXJlZCBpbiBjb250cm9sCi0gICAgICAgIGlmIChjb250cm9sSGFuZGxlID09IE5VTEwpCisgICAgICAgIGlmIChjb250cm9sSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgICAgIGNvbnRyb2xIYW5kbGUgPSBoOworICAgICAgICB9CiAgICAgICAgIGlmIChoLT5wcmlvcml0eSgpIDw9IHByaW9yaXR5KSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTk0LDkgKzE5OCwxOSBAQAogICAgIC8vIGRlc3RydWN0b3IgYmVmb3JlIHdlIGV4aXQKICAgICBzcDxFZmZlY3RNb2R1bGU+IGtlZXAodGhpcyk7CiAgICAgewotICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICB0aHJlYWQtPmRpc2Nvbm5lY3RFZmZlY3Qoa2VlcCwgaGFuZGxlLCB1bnBpbklmTGFzdCk7CisgICAgICAgIGlmIChyZW1vdmVIYW5kbGUoaGFuZGxlKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIWlzUGlubmVkKCkgfHwgdW5waW5JZkxhc3QpIHsKKyAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPnJlbW92ZUVmZmVjdF9sKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGFmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWYtPnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QobUlkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gbUhhbmRsZXMuc2l6ZSgpOwpAQCAtNDI2LDYgKzQ0MCwyMCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmFkZEVmZmVjdFRvSGFsX2woKQoreworICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfHwKKyAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0MpIHsKKyAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSA9IHRocmVhZC0+c3RyZWFtKCk7CisgICAgICAgICAgICBpZiAoc3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmFkZF9hdWRpb19lZmZlY3Qoc3RyZWFtLCBtRWZmZWN0SW50ZXJmYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnN0YXJ0KCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNDUxLDE1ICs0NzksMTEgQEAKICAgICBpZiAoc3RhdHVzID09IDApIHsKICAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOwogICAgIH0KLSAgICBpZiAoc3RhdHVzID09IDAgJiYKLSAgICAgICAgICAgICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfHwKLSAgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSkgewotICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdCAqc3RyZWFtID0gdGhyZWFkLT5zdHJlYW0oKTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHN0cmVhbS0+YWRkX2F1ZGlvX2VmZmVjdChzdHJlYW0sIG1FZmZlY3RJbnRlcmZhY2UpOwotICAgICAgICAgICAgfQorICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBhZGRFZmZlY3RUb0hhbF9sKCk7CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICBjaGFpbi0+Zm9yY2VWb2x1bWUoKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtODA0LDcgKzgyOCwxMTIgQEAKICAgICByZXR1cm4gbU9mZmxvYWRlZDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCitTdHJpbmc4IGVmZmVjdEZsYWdzVG9TdHJpbmcodWludDMyX3QgZmxhZ3MpIHsKKyAgICBTdHJpbmc4IHM7CisKKyAgICBzLmFwcGVuZCgiY29ubi4gbW9kZTogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQ6IHMuYXBwZW5kKCJpbnNlcnQiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWTogcy5hcHBlbmQoImF1eGlsaWFyeSIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfUkVQTEFDRTogcy5hcHBlbmQoInJlcGxhY2UiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DOiBzLmFwcGVuZCgicHJlcHJvYyIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DOiBzLmFwcGVuZCgicG9zdHByb2MiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgfQorICAgIHMuYXBwZW5kKCIsICIpOworCisgICAgcy5hcHBlbmQoImluc2VydCBwcmVmOiAiKTsKKyAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfSU5TRVJUX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOU0VSVF9BTlk6IHMuYXBwZW5kKCJhbnkiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1Q6IHMuYXBwZW5kKCJmaXJzdCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUOiBzLmFwcGVuZCgibGFzdCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkU6IHMuYXBwZW5kKCJleGNsdXNpdmUiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgfQorICAgIHMuYXBwZW5kKCIsICIpOworCisgICAgcy5hcHBlbmQoInZvbHVtZSBtZ210OiAiKTsKKyAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9OT05FOiBzLmFwcGVuZCgibm9uZSIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMOiBzLmFwcGVuZCgiaW1wbGVtZW50cyBjb250cm9sIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORDogcy5hcHBlbmQoInJlcXVpcmVzIGluZGljYXRpb24iKTsgYnJlYWs7CisgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgfQorICAgIHMuYXBwZW5kKCIsICIpOworCisgICAgdWludDMyX3QgZGV2aW5kID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19ERVZJQ0VfTUFTSzsKKyAgICBpZiAoZGV2aW5kKSB7CisgICAgICAgIHMuYXBwZW5kKCJkZXZpY2UgaW5kaWNhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoZGV2aW5kKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfREVWSUNFX0lORDogcy5hcHBlbmQoInJlcXVpcmVzIHVwZGF0ZXMiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIHMuYXBwZW5kKCJpbnB1dCBtb2RlOiAiKTsKKyAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfSU5QVVRfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5QVVRfRElSRUNUOiBzLmFwcGVuZCgiZGlyZWN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5QVVRfUFJPVklERVI6IHMuYXBwZW5kKCJwcm92aWRlciIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOUFVUX0JPVEg6IHMuYXBwZW5kKCJkaXJlY3QrcHJvdmlkZXIiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogcy5hcHBlbmQoIm5vdCBzZXQiKTsgYnJlYWs7CisgICAgfQorICAgIHMuYXBwZW5kKCIsICIpOworCisgICAgcy5hcHBlbmQoIm91dHB1dCBtb2RlOiAiKTsKKyAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfT1VUUFVUX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX09VVFBVVF9ESVJFQ1Q6IHMuYXBwZW5kKCJkaXJlY3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19PVVRQVVRfUFJPVklERVI6IHMuYXBwZW5kKCJwcm92aWRlciIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX09VVFBVVF9CT1RIOiBzLmFwcGVuZCgiZGlyZWN0K3Byb3ZpZGVyIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJub3Qgc2V0Iik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHVpbnQzMl90IGFjY2VsID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSzsKKyAgICBpZiAoYWNjZWwpIHsKKyAgICAgICAgcy5hcHBlbmQoImhhcmR3YXJlIGFjY2VsZXJhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoYWNjZWwpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19IV19BQ0NfU0lNUExFOiBzLmFwcGVuZCgibm9uLXR1bm5lbGVkIik7IGJyZWFrOworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUw6IHMuYXBwZW5kKCJ0dW5uZWxlZCIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgdWludDMyX3QgbW9kZWluZCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9NQVNLOworICAgIGlmIChtb2RlaW5kKSB7CisgICAgICAgIHMuYXBwZW5kKCJtb2RlIGluZGljYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKG1vZGVpbmQpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORDogcy5hcHBlbmQoInJlcXVpcmVkIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzcmNpbmQgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9NQVNLOworICAgIGlmIChzcmNpbmQpIHsKKyAgICAgICAgcy5hcHBlbmQoInNvdXJjZSBpbmRpY2F0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChzcmNpbmQpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfSU5EOiBzLmFwcGVuZCgicmVxdWlyZWQiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIGlmIChmbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfTUFTSykgeworICAgICAgICBzLmFwcGVuZCgib2ZmbG9hZGFibGUsICIpOworICAgIH0KKworICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgIGlmIChzLmxlbmd0aCgpID4gMikgeworICAgICAgICBjaGFyICpzdHIgPSBzLmxvY2tCdWZmZXIobGVuKTsKKyAgICAgICAgcy51bmxvY2tCdWZmZXIobGVuIC0gMik7CisgICAgfQorICAgIHJldHVybiBzOworfQorCisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtODIwLDggKzk0OSw4IEBACiAgICAgfQogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFNlc3Npb24gU3RhdHVzIFN0YXRlIEVuZ2luZTpcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlMDVkICAgJTAzZCAgICAlMDNkICAgMHglMDh4XG4iLAotICAgICAgICAgICAgbVNlc3Npb25JZCwgbVN0YXR1cywgbVN0YXRlLCAodWludDMyX3QpbUVmZmVjdEludGVyZmFjZSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCUwNWQgICAlMDNkICAgICUwM2QgICAlcFxuIiwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsIG1TdGF0dXMsIG1TdGF0ZSwgbUVmZmVjdEludGVyZmFjZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdERlc2NyaXB0b3I6XG4iKTsKQEAgLTgzOCw5ICs5NjcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5ub2RlWzJdLAogICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVszXSxtRGVzY3JpcHRvci50eXBlLm5vZGVbNF0sbURlc2NyaXB0b3IudHlwZS5ub2RlWzVdKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA4WFxuXHRcdC0gZmxhZ3M6ICUwOFhcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA4WFxuXHRcdC0gZmxhZ3M6ICUwOFggKCVzKVxuIiwKICAgICAgICAgICAgIG1EZXNjcmlwdG9yLmFwaVZlcnNpb24sCi0gICAgICAgICAgICBtRGVzY3JpcHRvci5mbGFncyk7CisgICAgICAgICAgICBtRGVzY3JpcHRvci5mbGFncywKKyAgICAgICAgICAgIGVmZmVjdEZsYWdzVG9TdHJpbmcobURlc2NyaXB0b3IuZmxhZ3MpLnN0cmluZygpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gbmFtZTogJXNcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5uYW1lKTsKQEAgLTg1MCwzOCArOTgwLDM4IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gSW5wdXQgY29uZmlndXJhdGlvbjpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEJ1ZmZlciAgICAgRnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXRcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdDB4JTA4eCAlMDVkICAgJTA1ZCAgICAlMDh4ICVkXG4iLAotICAgICAgICAgICAgKHVpbnQzMl90KW1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywKKyAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRGcmFtZXMgIFNtcCByYXRlIENoYW5uZWxzIEZvcm1hdCBCdWZmZXJcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCUwNXp1ICAgJTA1ZCAgICAlMDh4ICU2ZCAoJXMpICVwXG4iLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscywKLSAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0KTsKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0LAorICAgICAgICAgICAgZm9ybWF0VG9TdHJpbmcoKGF1ZGlvX2Zvcm1hdF90KW1Db25maWcuaW5wdXRDZmcuZm9ybWF0KSwKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gT3V0cHV0IGNvbmZpZ3VyYXRpb246XG4iKTsKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRCdWZmZXIgICAgIEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQweCUwOHggJTA1ZCAgICUwNWQgICAgJTA4eCAlZFxuIiwKLSAgICAgICAgICAgICh1aW50MzJfdCltQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCVwICUwNXp1ICAgJTA1ZCAgICAlMDh4ICVkICglcylcbiIsCisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscywKLSAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCk7CisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQsCisgICAgICAgICAgICBmb3JtYXRUb1N0cmluZygoYXVkaW9fZm9ybWF0X3QpbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0KSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCVkIENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlenUgQ2xpZW50czpcbiIsIG1IYW5kbGVzLnNpemUoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdFBpZCAgIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdCAgUGlkIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgRWZmZWN0SGFuZGxlICpoYW5kbGUgPSBtSGFuZGxlc1tpXTsKICAgICAgICAgaWYgKGhhbmRsZSAhPSBOVUxMICYmICFoYW5kbGUtPmRlc3Ryb3llZF9sKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICAgICAgaGFuZGxlLT5kdW1wVG9CdWZmZXIoYnVmZmVyLCBTSVpFKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogCiAgICAgaWYgKGxvY2tlZCkgewpAQCAtOTExLDE4ICsxMDQxLDE1IEBACiAgICAgfQogICAgIGludCBidWZPZmZzZXQgPSAoKHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwogICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSArIGJ1Zk9mZnNldCk7Ci0gICAgaWYgKG1DYmxrTWVtb3J5ICE9IDApIHsKLSAgICAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxlZmZlY3RfcGFyYW1fY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpOwotCi0gICAgICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuZXcobUNibGspIGVmZmVjdF9wYXJhbV9jYmxrX3QoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAobUNibGtNZW1vcnkgPT0gMCB8fAorICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X3BhcmFtX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKSkgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEVmZmVjdCBzaXplPSV1IiwgRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFICsKICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX2NibGtfdCkpOworICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIG5ldyhtQ2JsaykgZWZmZWN0X3BhcmFtX2NibGtfdCgpOworICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwogfQogCiBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6fkVmZmVjdEhhbmRsZSgpCkBAIC05MzksNiArMTA2NiwxMSBAQAogICAgIGRpc2Nvbm5lY3QoZmFsc2UpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gbUNsaWVudCA9PSAwIHx8IG1DYmxrTWVtb3J5ICE9IDAgPyBPSyA6IE5PX01FTU9SWTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmVuYWJsZSgpCiB7CiAgICAgQUxPR1YoImVuYWJsZSAlcCIsIHRoaXMpOwpAQCAtMTA1Myw4ICsxMTg1LDggQEAKICAgICAgICAgICAgIG1DYmxrLT5+ZWZmZWN0X3BhcmFtX2NibGtfdCgpOyAgIC8vIGRlc3Ryb3kgb3VyIHNoYXJlZC1zdHJ1Y3R1cmUuCiAgICAgICAgIH0KICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsgICAgLy8gZnJlZSB0aGUgc2hhcmVkIG1lbW9yeSBiZWZvcmUgcmVsZWFzaW5nIHRoZSBoZWFwIGl0IGJlbG9uZ3MgdG8KLSAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBydW4gd2l0aCBBdWRpb0ZsaW5nZXIgbXV0ZXggbG9ja2VkCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50LT5hdWRpb0ZsaW5nZXIoKS0+bUxvY2spOworICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBjbGllbnQgbXV0ZXggbG9ja2VkCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50LT5hdWRpb0ZsaW5nZXIoKS0+bUNsaWVudExvY2spOwogICAgICAgICBtQ2xpZW50LmNsZWFyKCk7CiAgICAgfQogfQpAQCAtMTE3OSwxNSArMTMxMSwxNSBAQAogfQogCiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmR1bXBUb0J1ZmZlcihjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQogewogICAgIGJvb2wgbG9ja2VkID0gbUNibGsgIT0gTlVMTCAmJiBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1DYmxrLT5sb2NrKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCUwNWQgJTA1ZCAgICAlMDF1ICAgICUwMXUgICAgICAlMDV1ICAlMDV1XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCU1ZCAgICAlNWQgICUzcyAgICAlM3MgICU1dSAgJTV1XG4iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtUHJpb3JpdHksCi0gICAgICAgICAgICBtSGFzQ29udHJvbCwKLSAgICAgICAgICAgICFsb2NrZWQsCisgICAgICAgICAgICBtSGFzQ29udHJvbCA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgICAgIGxvY2tlZCA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIG1DYmxrID8gbUNibGstPmNsaWVudEluZGV4IDogMCwKICAgICAgICAgICAgIG1DYmxrID8gbUNibGstPnNlcnZlckluZGV4IDogMAogICAgICAgICAgICAgKTsKQEAgLTEyMDQsNyArMTMzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6IG1UaHJlYWQodGhyZWFkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQWN0aXZlVHJhY2tDbnQoMCksIG1UcmFja0NudCgwKSwgbVRhaWxCdWZmZXJDb3VudCgwKSwKICAgICAgIG1Pd25JbkJ1ZmZlcihmYWxzZSksIG1Wb2x1bWVDdHJsSWR4KC0xKSwgbUxlZnRWb2x1bWUoVUlOVF9NQVgpLCBtUmlnaHRWb2x1bWUoVUlOVF9NQVgpLAotICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpCisgICAgICBtTmV3TGVmdFZvbHVtZShVSU5UX01BWCksIG1OZXdSaWdodFZvbHVtZShVSU5UX01BWCksIG1Gb3JjZVZvbHVtZShmYWxzZSkKIHsKICAgICBtU3RyYXRlZ3kgPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKQEAgLTEyNzgsNyArMTQxMCwxMyBAQAogLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCBFZmZlY3RDaGFpbjo6bUxvY2sgbG9ja2VkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmNsZWFySW5wdXRCdWZmZXJfbChzcDxUaHJlYWRCYXNlPiB0aHJlYWQpCiB7Ci0gICAgbWVtc2V0KG1JbkJ1ZmZlciwgMCwgdGhyZWFkLT5mcmFtZUNvdW50KCkgKiB0aHJlYWQtPmZyYW1lU2l6ZSgpKTsKKyAgICAvLyBUT0RPOiBUaGlzIHdpbGwgY2hhbmdlIGluIHRoZSBmdXR1cmUsIGRlcGVuZGluZyBvbiBtdWx0aWNoYW5uZWwKKyAgICAvLyBhbmQgc2FtcGxlIGZvcm1hdCBjaGFuZ2VzIGZvciBlZmZlY3RzLgorICAgIC8vIEN1cnJlbnRseSBlZmZlY3RzIHByb2Nlc3NpbmcgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0ZXJlbywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAvLyAoNCBieXRlcyBmcmFtZSBzaXplKQorICAgIGNvbnN0IHNpemVfdCBmcmFtZVNpemUgPQorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgKiBtaW4oRkNDXzIsIHRocmVhZC0+Y2hhbm5lbENvdW50KCkpOworICAgIG1lbXNldChtSW5CdWZmZXIsIDAsIHRocmVhZC0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKTsKIH0KIAogLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCBFZmZlY3RDaGFpbjo6bUxvY2sgbG9ja2VkCkBAIC0xNTIxLDcgKzE2NTksOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGN0cmxJZHggPT0gbVZvbHVtZUN0cmxJZHggJiYgKmxlZnQgPT0gbUxlZnRWb2x1bWUgJiYgKnJpZ2h0ID09IG1SaWdodFZvbHVtZSkgeworICAgIGlmICghaXNWb2x1bWVGb3JjZWQoKSAmJiBjdHJsSWR4ID09IG1Wb2x1bWVDdHJsSWR4ICYmCisgICAgICAgICAgICAqbGVmdCA9PSBtTGVmdFZvbHVtZSAmJiAqcmlnaHQgPT0gbVJpZ2h0Vm9sdW1lKSB7CiAgICAgICAgIGlmIChoYXNDb250cm9sKSB7CiAgICAgICAgICAgICAqbGVmdCA9IG1OZXdMZWZ0Vm9sdW1lOwogICAgICAgICAgICAgKnJpZ2h0ID0gbU5ld1JpZ2h0Vm9sdW1lOwpAQCAtMTU2MiwzOSArMTcwMSw1MiBAQAogICAgIHJldHVybiBoYXNDb250cm9sOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnN5bmNIYWxFZmZlY3RzU3RhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUVmZmVjdHNbaV0tPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpBQ1RJVkUgfHwKKyAgICAgICAgICAgICAgICBtRWZmZWN0c1tpXS0+c3RhdGUoKSA9PSBFZmZlY3RNb2R1bGU6OlNUT1BQSU5HKSB7CisgICAgICAgICAgICBtRWZmZWN0c1tpXS0+YWRkRWZmZWN0VG9IYWxfbCgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRWZmZWN0cyBmb3Igc2Vzc2lvbiAlZDpcbiIsIG1TZXNzaW9uSWQpOworICAgIHNpemVfdCBudW1FZmZlY3RzID0gbUVmZmVjdHMuc2l6ZSgpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAlZCBlZmZlY3RzIGZvciBzZXNzaW9uICVkXG4iLCBudW1FZmZlY3RzLCBtU2Vzc2lvbklkKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKLSAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOwotICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKLSAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJcdENvdWxkIG5vdCBsb2NrIG11dGV4OlxuIik7Ci0gICAgfQotCi0gICAgcmVzdWx0LmFwcGVuZCgiXHROdW0gZnggSW4gYnVmZmVyICAgT3V0IGJ1ZmZlciAgIEFjdGl2ZSB0cmFja3M6XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCUwMmQgICAgIDB4JTA4eCAgMHglMDh4ICAgJWRcbiIsCi0gICAgICAgICAgICBtRWZmZWN0cy5zaXplKCksCi0gICAgICAgICAgICAodWludDMyX3QpbUluQnVmZmVyLAotICAgICAgICAgICAgKHVpbnQzMl90KW1PdXRCdWZmZXIsCi0gICAgICAgICAgICBtQWN0aXZlVHJhY2tDbnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0c1tpXTsKLSAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICBlZmZlY3QtPmR1bXAoZmQsIGFyZ3MpOworICAgIGlmIChudW1FZmZlY3RzKSB7CisgICAgICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7CisgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKKyAgICAgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0Q291bGQgbm90IGxvY2sgbXV0ZXg6XG4iKTsKICAgICAgICAgfQotICAgIH0KIAotICAgIGlmIChsb2NrZWQpIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0SW4gYnVmZmVyICAgT3V0IGJ1ZmZlciAgIEFjdGl2ZSB0cmFja3M6XG4iKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHQlcCAgJXAgICAlZFxuIiwKKyAgICAgICAgICAgICAgICBtSW5CdWZmZXIsCisgICAgICAgICAgICAgICAgbU91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tDbnQpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgKytpKSB7CisgICAgICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3RzW2ldOworICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xNzkyLDQgKzE5NDQsMTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZEJhc2U+JiB0aHJlYWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVGhyZWFkID0gdGhyZWFkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHNbaV0tPnNldFRocmVhZCh0aHJlYWQpOworICAgIH0KK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCmluZGV4IGI3MTc4NTcuLjZmOTNmODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaApAQCAtMTE5LDYgKzExOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCkgIT0gMDsgfQogICAgIHN0YXR1c190ICAgICAgICAgc2V0T2ZmbG9hZGVkKGJvb2wgb2ZmbG9hZGVkLCBhdWRpb19pb19oYW5kbGVfdCBpbyk7CiAgICAgYm9vbCAgICAgICAgICAgICBpc09mZmxvYWRlZCgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgYWRkRWZmZWN0VG9IYWxfbCgpOwogCiAgICAgdm9pZCAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTE1Myw2ICsxNTQsNyBAQAogICAgIHVpbnQzMl90IG1EaXNhYmxlV2FpdENudDsgICAgICAgLy8gY3VycmVudCBwcm9jZXNzKCkgY2FsbHMgY291bnQgZHVyaW5nIGRpc2FibGUgcGVyaW9kLgogICAgIGJvb2wgICAgIG1TdXNwZW5kZWQ7ICAgICAgICAgICAgLy8gZWZmZWN0IGlzIHN1c3BlbmRlZDogdGVtcG9yYXJpbHkgZGlzYWJsZWQgYnkgZnJhbWV3b3JrCiAgICAgYm9vbCAgICAgbU9mZmxvYWRlZDsgICAgICAgICAgICAvLyBlZmZlY3QgaXMgY3VycmVudGx5IG9mZmxvYWRlZCB0byB0aGUgYXVkaW8gRFNQCisgICAgd3A8QXVkaW9GbGluZ2VyPiAgICBtQXVkaW9GbGluZ2VyOwogfTsKIAogLy8gVGhlIEVmZmVjdEhhbmRsZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBJRWZmZWN0IGludGVyZmFjZS4gSXQgcHJvdmlkZXMgcmVzb3VyY2VzCkBAIC0xNjksNiArMTcxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCiAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KTsKICAgICB2aXJ0dWFsIH5FZmZlY3RIYW5kbGUoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogCiAgICAgLy8gSUVmZmVjdAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlKCk7CkBAIC0yMDgsNyArMjExLDcgQEAKICAgICAvLyBkZXN0cm95ZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGFzc29jaWF0ZWQgRWZmZWN0TW9kdWxlIG1Mb2NrIGhlbGQKICAgICBib29sIGRlc3Ryb3llZF9sKCkgY29uc3QgeyByZXR1cm4gbURlc3Ryb3llZDsgfQogCi0gICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZHVtcFRvQnVmZmVyKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAgICAgLy8gZm9yIG1FZmZlY3QsIG1IYXNDb250cm9sLCBtRW5hYmxlZApAQCAtMjY5LDYgKzI3Miw3IEBACiAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tRGVzY19sKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOwogICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbUlkX2woaW50IGlkKTsKICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21UeXBlX2woY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSk7CisgICAgLy8gRklYTUUgdXNlIGZsb2F0IHRvIGltcHJvdmUgdGhlIGR5bmFtaWMgcmFuZ2UKICAgICBib29sIHNldFZvbHVtZV9sKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQpOwogICAgIHZvaWQgc2V0RGV2aWNlX2woYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAgICAgdm9pZCBzZXRNb2RlX2woYXVkaW9fbW9kZV90IG1vZGUpOwpAQCAtMzE1LDYgKzMxOSwxNCBAQAogICAgIC8vIEF0IGxlYXN0IG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGluIHRoZSBjaGFpbiBpcyBlbmFibGVkCiAgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRW5hYmxlZCgpOwogCisgICAgLy8gdXNlIHJlbGVhc2VfY2FzIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgb2JzZXJ2ZWQgdmFsdWUsIGp1c3Qgd2FudCB0byBtYWtlIHN1cmUgdGhlCisgICAgLy8gbmV3IHZhbHVlIGlzIG9ic2VydmFibGUuCisgICAgdm9pZCBmb3JjZVZvbHVtZSgpIHsgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9jYXMoZmFsc2UsIHRydWUsICZtRm9yY2VWb2x1bWUpOyB9CisgICAgLy8gdXNlIGFjcXVpcmVfY2FzIGJlY2F1c2Ugd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIG9ic2VydmVkIHZhbHVlIGFuZAorICAgIC8vIHdlIGFyZSB0aGUgb25seSBvYnNlcnZlcnMuCisgICAgYm9vbCBpc1ZvbHVtZUZvcmNlZCgpIHsgcmV0dXJuIChhbmRyb2lkX2F0b21pY19hY3F1aXJlX2Nhcyh0cnVlLCBmYWxzZSwgJm1Gb3JjZVZvbHVtZSkgPT0gMCk7IH0KKworICAgIHZvaWQgc3luY0hhbEVmZmVjdHNTdGF0ZSgpOwogCiAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTM0NSw2ICszNTcsOCBAQAogCiAgICAgdm9pZCBjbGVhcklucHV0QnVmZmVyX2woc3A8VGhyZWFkQmFzZT4gdGhyZWFkKTsKIAorICAgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZEJhc2U+JiB0aHJlYWQpOworCiAgICAgd3A8VGhyZWFkQmFzZT4gbVRocmVhZDsgICAgIC8vIHBhcmVudCBtaXhlciB0aHJlYWQKICAgICBNdXRleCBtTG9jazsgICAgICAgICAgICAgICAgLy8gbXV0ZXggcHJvdGVjdGluZyBlZmZlY3QgbGlzdAogICAgIFZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IG1FZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdCBtb2R1bGVzCkBAIC0zNzAsNCArMzg0LDUgQEAKICAgICAvLyB0aW1lTG93IGZpZWxkcyBhbW9uZyBlZmZlY3QgdHlwZSBVVUlEcy4KICAgICAvLyBVcGRhdGVkIGJ5IHVwZGF0ZVN1c3BlbmRlZFNlc3Npb25zX2woKSBvbmx5LgogICAgIEtleWVkVmVjdG9yPCBpbnQsIHNwPFN1c3BlbmRlZEVmZmVjdERlc2M+ID4gbVN1c3BlbmRlZEVmZmVjdHM7CisgICAgdm9sYXRpbGUgaW50MzJfdCBtRm9yY2VWb2x1bWU7IC8vIGZvcmNlIG5leHQgdm9sdW1lIGNvbW1hbmQgYmVjYXVzZSBhIG5ldyBlZmZlY3Qgd2FzIGVuYWJsZWQKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzliOTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRmFzdENhcHR1cmUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLypzdGF0aWMqLyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIEZhc3RDYXB0dXJlOjppbml0aWFsOworCitGYXN0Q2FwdHVyZTo6RmFzdENhcHR1cmUoKSA6IEZhc3RUaHJlYWQoKSwKKyAgICBpbnB1dFNvdXJjZShOVUxMKSwgaW5wdXRTb3VyY2VHZW4oMCksIHBpcGVTaW5rKE5VTEwpLCBwaXBlU2lua0dlbigwKSwKKyAgICByZWFkQnVmZmVyKE5VTEwpLCByZWFkQnVmZmVyU3RhdGUoLTEpLCBmb3JtYXQoRm9ybWF0X0ludmFsaWQpLCBzYW1wbGVSYXRlKDApLAorICAgIC8vIGR1bW15RHVtcFN0YXRlCisgICAgdG90YWxOYXRpdmVGcmFtZXNSZWFkKDApCit7CisgICAgcHJldmlvdXMgPSAmaW5pdGlhbDsKKyAgICBjdXJyZW50ID0gJmluaXRpYWw7CisKKyAgICBtRHVtbXlEdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7Cit9CisKK0Zhc3RDYXB0dXJlOjp+RmFzdENhcHR1cmUoKQoreworfQorCitGYXN0Q2FwdHVyZVN0YXRlUXVldWUqIEZhc3RDYXB0dXJlOjpzcSgpCit7CisgICAgcmV0dXJuICZtU1E7Cit9CisKK2NvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqRmFzdENhcHR1cmU6OnBvbGwoKQoreworICAgIHJldHVybiBtU1EucG9sbCgpOworfQorCit2b2lkIEZhc3RDYXB0dXJlOjpzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyIF9fdW51c2VkKQoreworfQorCit2b2lkIEZhc3RDYXB0dXJlOjpvbklkbGUoKQoreworICAgIHByZUlkbGUgPSAqKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiljdXJyZW50OworICAgIGN1cnJlbnQgPSAmcHJlSWRsZTsKK30KKwordm9pZCBGYXN0Q2FwdHVyZTo6b25FeGl0KCkKK3sKKyAgICBkZWxldGVbXSByZWFkQnVmZmVyOworfQorCitib29sIEZhc3RDYXB0dXJlOjppc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkKK3sKKyAgICBzd2l0Y2ggKChGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kKSBjb21tYW5kKSB7CisgICAgY2FzZSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEOgorICAgIGNhc2UgRmFzdENhcHR1cmVTdGF0ZTo6V1JJVEU6CisgICAgY2FzZSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEX1dSSVRFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZhc3RDYXB0dXJlOjpvblN0YXRlQ2hhbmdlKCkKK3sKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIHRoaXMtPmN1cnJlbnQ7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgdGhpcy0+cHJldmlvdXM7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisKKyAgICBib29sIGVpdGhlckNoYW5nZWQgPSBmYWxzZTsKKworICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gaW5wdXQgSEFMIGNvbmZpZ3VyYXRpb24KKyAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBmb3JtYXQ7CisgICAgaWYgKGN1cnJlbnQtPm1JbnB1dFNvdXJjZUdlbiAhPSBpbnB1dFNvdXJjZUdlbikgeworICAgICAgICBpbnB1dFNvdXJjZSA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZTsKKyAgICAgICAgaW5wdXRTb3VyY2VHZW4gPSBjdXJyZW50LT5tSW5wdXRTb3VyY2VHZW47CisgICAgICAgIGlmIChpbnB1dFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9ybWF0ID0gaW5wdXRTb3VyY2UtPmZvcm1hdCgpOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjaGFubmVsQ291bnQgPT0gMSB8fCBjaGFubmVsQ291bnQgPT0gMik7CisgICAgICAgIH0KKyAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIGVpdGhlckNoYW5nZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gcGlwZQorICAgIGlmIChjdXJyZW50LT5tUGlwZVNpbmtHZW4gIT0gcGlwZVNpbmtHZW4pIHsKKyAgICAgICAgcGlwZVNpbmsgPSBjdXJyZW50LT5tUGlwZVNpbms7CisgICAgICAgIHBpcGVTaW5rR2VuID0gY3VycmVudC0+bVBpcGVTaW5rR2VuOworICAgICAgICBlaXRoZXJDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBpbnB1dCBzb3VyY2UgYW5kIHBpcGUgc2luayBtdXN0IGJlIGNvbXBhdGlibGUKKyAgICBpZiAoZWl0aGVyQ2hhbmdlZCAmJiBpbnB1dFNvdXJjZSAhPSBOVUxMICYmIHBpcGVTaW5rICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR19BU1NFUlQoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwaXBlU2luay0+Zm9ybWF0KCkpKTsKKyAgICB9CisKKyAgICBpZiAoKCFGb3JtYXRfaXNFcXVhbChmb3JtYXQsIHByZXZpb3VzRm9ybWF0KSkgfHwgKGZyYW1lQ291bnQgIT0gcHJldmlvdXMtPm1GcmFtZUNvdW50KSkgeworICAgICAgICAvLyBGSVhNRSB0byBhdm9pZCBwcmlvcml0eSBpbnZlcnNpb24sIGRvbid0IGRlbGV0ZSBoZXJlCisgICAgICAgIGRlbGV0ZVtdIHJlYWRCdWZmZXI7CisgICAgICAgIHJlYWRCdWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCisgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIGNhcHR1cmUgdGhyZWFkIGFsbG9jYXRlIGZvcgorICAgICAgICAgICAgLy8gICAgICAgdXMgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lU2l6ZQorICAgICAgICAgICAgcmVhZEJ1ZmZlciA9IG5ldyBzaG9ydFtmcmFtZUNvdW50ICogY2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAorICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1CisgICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKKyAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQorICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJpb2ROcyA9IDA7CisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7CisgICAgICAgICAgICBmb3JjZU5zID0gMDsKKyAgICAgICAgICAgIHdhcm11cE5zID0gMDsKKyAgICAgICAgfQorICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSAtMTsKKyAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfQorCit9CisKK3ZvaWQgRmFzdENhcHR1cmU6Om9uV29yaygpCit7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSB0aGlzLT5jb21tYW5kOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisKKyAgICBpZiAoKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEKSAvKiYmIGlzV2FybSovKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGlucHV0U291cmNlICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChyZWFkQnVmZmVyICE9IE5VTEwpOworICAgICAgICBkdW1wU3RhdGUtPm1SZWFkU2VxdWVuY2UrKzsKKyAgICAgICAgQVRSQUNFX0JFR0lOKCJyZWFkIik7CisgICAgICAgIHNzaXplX3QgZnJhbWVzUmVhZCA9IGlucHV0U291cmNlLT5yZWFkKHJlYWRCdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOworICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRTZXF1ZW5jZSsrOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA+PSAwKSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpIGZyYW1lc1JlYWQgPiBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOworICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IHRvdGFsTmF0aXZlRnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lc1JlYWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1SZWFkRXJyb3JzKys7CisgICAgICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSAwOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIHJlbmFtZSB0byBhdHRlbXB0ZWRJTworICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpXUklURSkgeworICAgICAgICBBTE9HX0FTU0VSVChwaXBlU2luayAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQocmVhZEJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgaWYgKHJlYWRCdWZmZXJTdGF0ZSA8IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lU2l6ZQorICAgICAgICAgICAgbWVtc2V0KHJlYWRCdWZmZXIsIDAsIGZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKKyAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IHBpcGVTaW5rLT53cml0ZShyZWFkQnVmZmVyLCByZWFkQnVmZmVyU3RhdGUpOworICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgorICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCisgICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCisgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBjdXJyZW50LT5tQ2JsazsKKyAgICAgICAgICAgIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXIgPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShmcmFtZXNXcml0dGVuICsgcmVhciwgJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CisgICAgICAgICAgICAgICAgY2Jsay0+bVNlcnZlciArPSBmcmFtZXNXcml0dGVuOworICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBpcyBuZXZlciBpbiBzZXJ2ZXIgcHJvY2Vzcywgc28gZG9uJ3QgdXNlIEZVVEVYX1dBS0VfUFJJVkFURQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBGVVRFWF9XQUtFLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0Zhc3RDYXB0dXJlRHVtcFN0YXRlOjpGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAorICAgIG1SZWFkU2VxdWVuY2UoMCksIG1GcmFtZXNSZWFkKDApLCBtUmVhZEVycm9ycygwKSwgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApCit7Cit9CisKK0Zhc3RDYXB0dXJlRHVtcFN0YXRlOjp+RmFzdENhcHR1cmVEdW1wU3RhdGUoKQoreworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzNWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfSAorCisjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgorI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZVN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordHlwZWRlZiBTdGF0ZVF1ZXVlPEZhc3RDYXB0dXJlU3RhdGU+IEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTsKKworc3RydWN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlIDogRmFzdFRocmVhZER1bXBTdGF0ZSB7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdENhcHR1cmVEdW1wU3RhdGUoKTsKKworICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIG1hbnkgb2YgdGhlc2UgdG8gRmFzdFRocmVhZER1bXBTdGF0ZQorICAgIHVpbnQzMl90IG1SZWFkU2VxdWVuY2U7ICAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggcmVhZCgpCisgICAgdWludDMyX3QgbUZyYW1lc1JlYWQ7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVhZCBzdWNjZXNzZnVsbHkKKyAgICB1aW50MzJfdCBtUmVhZEVycm9yczsgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHJlYWQoKSBlcnJvcnMKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKK307CisKK2NsYXNzIEZhc3RDYXB0dXJlIDogcHVibGljIEZhc3RUaHJlYWQgeworCitwdWJsaWM6CisgICAgICAgICAgICBGYXN0Q2FwdHVyZSgpOworICAgIHZpcnR1YWwgfkZhc3RDYXB0dXJlKCk7CisKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSogIHNxKCk7CisKK3ByaXZhdGU6CisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgICBtU1E7CisKKyAgICAvLyBjYWxsb3V0cworICAgIHZpcnR1YWwgY29uc3QgRmFzdFRocmVhZFN0YXRlICpwb2xsKCk7CisgICAgdmlydHVhbCB2b2lkIHNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIpOworICAgIHZpcnR1YWwgdm9pZCBvbklkbGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25FeGl0KCk7CisgICAgdmlydHVhbCBib29sIGlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpOworICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKTsKKworICAgIHN0YXRpYyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIGluaXRpYWw7CisgICAgRmFzdENhcHR1cmVTdGF0ZSBwcmVJZGxlOyAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQorICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIG1hbnkgb2YgdGhlc2UgdG8gRmFzdFRocmVhZAorICAgIE5CQUlPX1NvdXJjZSAqaW5wdXRTb3VyY2U7CisgICAgaW50IGlucHV0U291cmNlR2VuOworICAgIE5CQUlPX1NpbmsgKnBpcGVTaW5rOworICAgIGludCBwaXBlU2lua0dlbjsKKyAgICBzaG9ydCAqcmVhZEJ1ZmZlcjsKKyAgICBzc2l6ZV90IHJlYWRCdWZmZXJTdGF0ZTsgICAgLy8gbnVtYmVyIG9mIGluaXRpYWxpemVkIGZyYW1lcyBpbiByZWFkQnVmZmVyLCBvciAtMSB0byBjbGVhcgorICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQ7CisgICAgdW5zaWduZWQgc2FtcGxlUmF0ZTsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSBkdW1teUR1bXBTdGF0ZTsKKyAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1JlYWQ7IC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkCisKK307ICAvLyBjbGFzcyBGYXN0Q2FwdHVyZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwCmluZGV4IDEzY2FjNmQuLjFkMDI5YjcKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSAiRmFzdENhcHR1cmVTdGF0ZS5oIgogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCitGYXN0Q2FwdHVyZVN0YXRlOjpGYXN0Q2FwdHVyZVN0YXRlKCkgOiBGYXN0VGhyZWFkU3RhdGUoKSwKKyAgICBtSW5wdXRTb3VyY2UoTlVMTCksIG1JbnB1dFNvdXJjZUdlbigwKSwgbVBpcGVTaW5rKE5VTEwpLCBtUGlwZVNpbmtHZW4oMCksIG1GcmFtZUNvdW50KDApCit7Cit9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK0Zhc3RDYXB0dXJlU3RhdGU6On5GYXN0Q2FwdHVyZVN0YXRlKCkKK3sKK30KIAorfSAgIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Yzg2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX1NUQVRFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAorCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKKyNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBSZXByZXNlbnQgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIGZhc3QgY2FwdHVyZQorc3RydWN0IEZhc3RDYXB0dXJlU3RhdGUgOiBGYXN0VGhyZWFkU3RhdGUgeworICAgICAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdENhcHR1cmVTdGF0ZSgpOworCisgICAgLy8gYWxsIHBvaW50ZXIgZmllbGRzIHVzZSByYXcgcG9pbnRlcnM7IG9iamVjdHMgYXJlIG93bmVkIGFuZCByZWYtY291bnRlZCBieSBSZWNvcmRUaHJlYWQKKyAgICBOQkFJT19Tb3VyY2UgICAgKm1JbnB1dFNvdXJjZTsgICAgICAvLyBIQUwgaW5wdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAorICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIHRoZXNlIGZpZWxkcyB0byBGYXN0VGhyZWFkU3RhdGUKKyAgICBpbnQgICAgICAgICAgICAgbUlucHV0U291cmNlR2VuOyAgICAvLyBpbmNyZW1lbnQgd2hlbiBtSW5wdXRTb3VyY2UgaXMgYXNzaWduZWQKKyAgICBOQkFJT19TaW5rICAgICAgKm1QaXBlU2luazsgICAgICAgICAvLyBhZnRlciByZWFkaW5nIGZyb20gaW5wdXQgc291cmNlLCB3cml0ZSB0byB0aGlzIHBpcGUgc2luaworICAgIGludCAgICAgICAgICAgICBtUGlwZVNpbmtHZW47ICAgICAgIC8vIGluY3JlbWVudCB3aGVuIG1QaXBlU2luayBpcyBhc3NpZ25lZAorICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgY2FwdHVyZSBidWZmZXIKKyAgICBhdWRpb190cmFja19jYmxrX3QgICptQ2JsazsgICAgICAgICAvLyBjb250cm9sIGJsb2NrIGZvciB0aGUgc2luZ2xlIGZhc3QgY2xpZW50LCBvciBOVUxMCisKKyAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAorICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CisgICAgICAgIFJFQUQgPSAweDgsICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UKKyAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gcGlwZSBzaW5rCisgICAgICAgIFJFQURfV1JJVEUgPSAweDE4OyAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UgYW5kIHdyaXRlIHRvIHBpcGUgc2luaworCit9OyAgLy8gc3RydWN0IEZhc3RDYXB0dXJlU3RhdGUKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCBmMjdlYTE3Li4yNjc4Y2JmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMjYsNyArMjYsNiBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlIDxzeXMvYXRvbWljcy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgpAQCAtMzcsNjM5ICszNiw0MzYgQEAKICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAjZW5kaWYKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAKLSNkZWZpbmUgRkFTVF9IT1RfSURMRV9OUyAgICAgMTAwMDAwMEwgICAvLyAxIG1zOiB0aW1lIHRvIHNsZWVwIHdoaWxlIGhvdCBpZGxpbmcKLSNkZWZpbmUgRkFTVF9ERUZBVUxUX05TICAgIDk5OTk5OTk5OUwgICAvLyB+MSBzZWM6IGRlZmF1bHQgdGltZSB0byBzbGVlcAotI2RlZmluZSBNSU5fV0FSTVVQX0NZQ0xFUyAgICAgICAgICAyICAgIC8vIG1pbmltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAotI2RlZmluZSBNQVhfV0FSTVVQX0NZQ0xFUyAgICAgICAgIDEwICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAotCiAjZGVmaW5lIEZDQ18yICAgICAgICAgICAgICAgICAgICAgICAyICAgLy8gZml4ZWQgY2hhbm5lbCBjb3VudCBhc3N1bXB0aW9uCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gRmFzdCBtaXhlciB0aHJlYWQKLWJvb2wgRmFzdE1peGVyOjp0aHJlYWRMb29wKCkKKy8qc3RhdGljKi8gY29uc3QgRmFzdE1peGVyU3RhdGUgRmFzdE1peGVyOjppbml0aWFsOworCitGYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgpLAorICAgIHNsb3BOcygwKSwKKyAgICAvLyBmYXN0VHJhY2tOYW1lcworICAgIC8vIGdlbmVyYXRpb25zCisgICAgb3V0cHV0U2luayhOVUxMKSwKKyAgICBvdXRwdXRTaW5rR2VuKDApLAorICAgIG1peGVyKE5VTEwpLAorICAgIG1TaW5rQnVmZmVyKE5VTEwpLAorICAgIG1TaW5rQnVmZmVyU2l6ZSgwKSwKKyAgICBtU2lua0NoYW5uZWxDb3VudChGQ0NfMiksCisgICAgbU1peGVyQnVmZmVyKE5VTEwpLAorICAgIG1NaXhlckJ1ZmZlclNpemUoMCksCisgICAgbU1peGVyQnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKKyAgICBtTWl4ZXJCdWZmZXJTdGF0ZShVTkRFRklORUQpLAorICAgIGZvcm1hdChGb3JtYXRfSW52YWxpZCksCisgICAgc2FtcGxlUmF0ZSgwKSwKKyAgICBmYXN0VHJhY2tzR2VuKDApLAorICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKKyAgICAvLyB0aW1lc3RhbXAKKyAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgogewotICAgIHN0YXRpYyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBpbml0aWFsOwotICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICpwcmV2aW91cyA9ICZpbml0aWFsLCAqY3VycmVudCA9ICZpbml0aWFsOwotICAgIEZhc3RNaXhlclN0YXRlIHByZUlkbGU7IC8vIGNvcHkgb2Ygc3RhdGUgYmVmb3JlIHdlIHdlbnQgaW50byBpZGxlCi0gICAgc3RydWN0IHRpbWVzcGVjIG9sZFRzID0gezAsIDB9OwotICAgIGJvb2wgb2xkVHNWYWxpZCA9IGZhbHNlOwotICAgIGxvbmcgc2xvcE5zID0gMDsgICAgLy8gYWNjdW11bGF0ZWQgdGltZSB3ZSd2ZSB3b2tlbiB1cCB0b28gZWFybHkgKD4gMCkgb3IgdG9vIGxhdGUgKDwgMCkKLSAgICBsb25nIHNsZWVwTnMgPSAtMTsgIC8vIC0xOiBidXN5IHdhaXQsIDA6IHNjaGVkX3lpZWxkLCA+IDA6IG5hbm9zbGVlcAotICAgIGludCBmYXN0VHJhY2tOYW1lc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAvLyBoYW5kbGVzIHVzZWQgYnkgbWl4ZXIgdG8gaWRlbnRpZnkgdHJhY2tzCi0gICAgaW50IGdlbmVyYXRpb25zW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107ICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUZhc3RUcmFja3NbaV0ubUdlbmVyYXRpb24KKyAgICAvLyBGSVhNRSBwYXNzIGluaXRpYWwgYXMgcGFyYW1ldGVyIHRvIGJhc2UgY2xhc3MgY29uc3RydWN0b3IsIGFuZCBtYWtlIGl0IHN0YXRpYyBsb2NhbAorICAgIHByZXZpb3VzID0gJmluaXRpYWw7CisgICAgY3VycmVudCA9ICZpbml0aWFsOworCisgICAgbUR1bW15RHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOworICAgIC8vIFRPRE86IEFkZCBjaGFubmVsIG1hc2sgdG8gTkJBSU9fRm9ybWF0LgorICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgorICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobVNpbmtDaGFubmVsQ291bnQpOworCiAgICAgdW5zaWduZWQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSAwOwogICAgIH0KLSAgICBOQkFJT19TaW5rICpvdXRwdXRTaW5rID0gTlVMTDsKLSAgICBpbnQgb3V0cHV0U2lua0dlbiA9IDA7Ci0gICAgQXVkaW9NaXhlciogbWl4ZXIgPSBOVUxMOwotICAgIHNob3J0ICptaXhCdWZmZXIgPSBOVUxMOwotICAgIGVudW0ge1VOREVGSU5FRCwgTUlYRUQsIFpFUk9FRH0gbWl4QnVmZmVyU3RhdGUgPSBVTkRFRklORUQ7Ci0gICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwotICAgIHVuc2lnbmVkIHNhbXBsZVJhdGUgPSAwOwotICAgIGludCBmYXN0VHJhY2tzR2VuID0gMDsKLSAgICBsb25nIHBlcmlvZE5zID0gMDsgICAgICAvLyBleHBlY3RlZCBwZXJpb2Q7IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlbmRlciBvbmUgbWl4IGJ1ZmZlcgotICAgIGxvbmcgdW5kZXJydW5OcyA9IDA7ICAgIC8vIHVuZGVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlCi0gICAgbG9uZyBvdmVycnVuTnMgPSAwOyAgICAgLy8gb3ZlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZQotICAgIGxvbmcgZm9yY2VOcyA9IDA7ICAgICAgIC8vIGlmIG92ZXJydW4gZGV0ZWN0ZWQsIGZvcmNlIHRoZSB3cml0ZSBjeWNsZSB0byB0YWtlIHRoaXMgbXVjaCB0aW1lCi0gICAgbG9uZyB3YXJtdXBOcyA9IDA7ICAgICAgLy8gd2FybXVwIGNvbXBsZXRlIHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRvIHRoaXMgdmFsdWUKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGUsICpkdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7Ci0gICAgYm9vbCBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7ICAvLyB1c2VkIHRvIGlnbm9yZSBpbml0aWFsIG92ZXJydW4gYW5kIGZpcnN0IGFmdGVyIGFuIHVuZGVycnVuCiAjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgc3RydWN0IHRpbWVzcGVjIG9sZExvYWQgPSB7MCwgMH07ICAgIC8vIHByZXZpb3VzIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCi0gICAgYm9vbCBvbGRMb2FkVmFsaWQgPSBmYWxzZTsgIC8vIHdoZXRoZXIgb2xkTG9hZCBpcyB2YWxpZAotICAgIHVpbnQzMl90IGJvdW5kcyA9IDA7Ci0gICAgYm9vbCBmdWxsID0gZmFsc2U7ICAgICAgLy8gd2hldGhlciB3ZSBoYXZlIGNvbGxlY3RlZCBhdCBsZWFzdCBtU2FtcGxpbmdOIHNhbXBsZXMKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBUaHJlYWRDcHVVc2FnZSB0Y3U7ICAgICAvLyBmb3IgcmVhZGluZyB0aGUgY3VycmVudCBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegorICAgIG9sZExvYWQudHZfc2VjID0gMDsKKyAgICBvbGRMb2FkLnR2X25zZWMgPSAwOwogI2VuZGlmCi0jZW5kaWYKLSAgICB1bnNpZ25lZCBjb2xkR2VuID0gMDsgICAvLyBsYXN0IG9ic2VydmVkIG1Db2xkR2VuCi0gICAgYm9vbCBpc1dhcm0gPSBmYWxzZTsgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCi0gICAgc3RydWN0IHRpbWVzcGVjIG1lYXN1cmVkV2FybXVwVHMgPSB7MCwgMH07ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCi0gICAgdWludDMyX3Qgd2FybXVwQ3ljbGVzID0gMDsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAotICAgIE5CQUlPX1NpbmsqIHRlZVNpbmsgPSBOVUxMOyAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKSB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCi0gICAgTkJMb2c6OldyaXRlciBkdW1teUxvZ1dyaXRlciwgKmxvZ1dyaXRlciA9ICZkdW1teUxvZ1dyaXRlcjsKLSAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gPSAwOyAgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4KK30KIAotICAgIC8vIG5leHQgMiBmaWVsZHMgYXJlIHZhbGlkIG9ubHkgd2hlbiB0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IKLSAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0gICAgdWludDMyX3QgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9IDA7ICAgIC8vIHRoZSA9IDAgaXMgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKLSAgICBzdGF0dXNfdCB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKK0Zhc3RNaXhlcjo6fkZhc3RNaXhlcigpCit7Cit9CiAKLSAgICBmb3IgKDs7KSB7CitGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBGYXN0TWl4ZXI6OnNxKCkKK3sKKyAgICByZXR1cm4gJm1TUTsKK30KIAotICAgICAgICAvLyBlaXRoZXIgbmFub3NsZWVwLCBzY2hlZF95aWVsZCwgb3IgYnVzeSB3YWl0Ci0gICAgICAgIGlmIChzbGVlcE5zID49IDApIHsKLSAgICAgICAgICAgIGlmIChzbGVlcE5zID4gMCkgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKHNsZWVwTnMgPCAxMDAwMDAwMDAwKTsKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgcmVxID0gezAsIHNsZWVwTnN9OwotICAgICAgICAgICAgICAgIG5hbm9zbGVlcCgmcmVxLCBOVUxMKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NoZWRfeWllbGQoKTsKK2NvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqRmFzdE1peGVyOjpwb2xsKCkKK3sKKyAgICByZXR1cm4gbVNRLnBvbGwoKTsKK30KKwordm9pZCBGYXN0TWl4ZXI6OnNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIpCit7CisgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKKyAgICAgICAgbWl4ZXItPnNldExvZyhsb2dXcml0ZXIpOworICAgIH0KK30KKwordm9pZCBGYXN0TWl4ZXI6Om9uSWRsZSgpCit7CisgICAgcHJlSWRsZSA9ICooY29uc3QgRmFzdE1peGVyU3RhdGUgKiljdXJyZW50OworICAgIGN1cnJlbnQgPSAmcHJlSWRsZTsKK30KKwordm9pZCBGYXN0TWl4ZXI6Om9uRXhpdCgpCit7CisgICAgZGVsZXRlIG1peGVyOworICAgIGZyZWUobU1peGVyQnVmZmVyKTsKKyAgICBmcmVlKG1TaW5rQnVmZmVyKTsKK30KKworYm9vbCBGYXN0TWl4ZXI6OmlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKQoreworICAgIHN3aXRjaCAoKEZhc3RNaXhlclN0YXRlOjpDb21tYW5kKSBjb21tYW5kKSB7CisgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYOgorICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OldSSVRFOgorICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWF9XUklURToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UoKQoreworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgcHJldmlvdXMgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+cHJldmlvdXM7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSB0aGlzLT5kdW1wU3RhdGU7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKworICAgIC8vIGhhbmRsZSBzdGF0ZSBjaGFuZ2UgaGVyZSwgYnV0IHNpbmNlIHdlIHdhbnQgdG8gZGlmZiB0aGUgc3RhdGUsCisgICAgLy8gd2UncmUgcHJlcGFyZWQgZm9yIHByZXZpb3VzID09ICZpbml0aWFsIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKKyAgICB1bnNpZ25lZCBwcmV2aW91c1RyYWNrTWFzazsKKworICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gb3V0cHV0IEhBTCBjb25maWd1cmF0aW9uCisgICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gZm9ybWF0OworICAgIGlmIChjdXJyZW50LT5tT3V0cHV0U2lua0dlbiAhPSBvdXRwdXRTaW5rR2VuKSB7CisgICAgICAgIG91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKKyAgICAgICAgb3V0cHV0U2lua0dlbiA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuOworICAgICAgICBpZiAob3V0cHV0U2luayA9PSBOVUxMKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSAwOworICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSAwOworICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IG91dHB1dFNpbmstPmZvcm1hdCgpOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7CisgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNpbmtDaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKTsKKworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQKKyAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgorICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgfQorCisgICAgaWYgKCghRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwcmV2aW91c0Zvcm1hdCkpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKKyAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBkZWxldGUgaGVyZQorICAgICAgICBkZWxldGUgbWl4ZXI7CisgICAgICAgIG1peGVyID0gTlVMTDsKKyAgICAgICAgZnJlZShtTWl4ZXJCdWZmZXIpOworICAgICAgICBtTWl4ZXJCdWZmZXIgPSBOVUxMOworICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKKyAgICAgICAgbVNpbmtCdWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCisgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIG1peGVyIGFsbG9jYXRlIGZvciB1cworICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KKyAgICAgICAgICAgIG1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgc2FtcGxlUmF0ZSwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtaXhlckZyYW1lU2l6ZSA9IG1TaW5rQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSA9IG1peGVyRnJhbWVTaXplICogZnJhbWVDb3VudDsKKyAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTWl4ZXJCdWZmZXIsIDMyLCBtTWl4ZXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdC5tRm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChzaW5rRnJhbWVTaXplID4gbWl4ZXJGcmFtZVNpemUpIHsgLy8gbmVlZCBhIHNpbmsgYnVmZmVyCisgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXJTaXplID0gc2lua0ZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgbVNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAorICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1CisgICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKKyAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQorICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJpb2ROcyA9IDA7CisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7CisgICAgICAgICAgICBmb3JjZU5zID0gMDsKKyAgICAgICAgICAgIHdhcm11cE5zID0gMDsKICAgICAgICAgfQotICAgICAgICAvLyBkZWZhdWx0IHRvIGxvbmcgc2xlZXAgZm9yIG5leHQgY3ljbGUKLSAgICAgICAgc2xlZXBOcyA9IEZBU1RfREVGQVVMVF9OUzsKLQotICAgICAgICAvLyBwb2xsIGZvciBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKm5leHQgPSBtU1EucG9sbCgpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBjb250aW51ZSB0byB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbCBzdGF0ZSB1bnRpbCBhIHJlYWwgc3RhdGUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBBTE9HX0FTU0VSVChjdXJyZW50ID09ICZpbml0aWFsICYmIHByZXZpb3VzID09ICZpbml0aWFsKTsKLSAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OworICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKKyNpZiAhTE9HX05ERUJVRworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CiAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlY29uZmlndXJlIGFsbCBhY3RpdmUgdHJhY2tzCisgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKKyAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuIC0gMTsKKyAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSBwcmV2aW91cy0+bVRyYWNrTWFzazsKKyAgICB9CiAKLSAgICAgICAgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IG5leHQtPm1Db21tYW5kOwotICAgICAgICBpZiAobmV4dCAhPSBjdXJyZW50KSB7CisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBhY3RpdmUgdHJhY2sgc2V0CisgICAgY29uc3QgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CisgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKKyAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gZmFzdFRyYWNrc0dlbikgeworICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGludCBuYW1lOwogCi0gICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKLSAgICAgICAgICAgIGR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiAmZHVtbXlEdW1wU3RhdGU7Ci0gICAgICAgICAgICB0ZWVTaW5rID0gbmV4dC0+bVRlZVNpbms7Ci0gICAgICAgICAgICBsb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZkdW1teUxvZ1dyaXRlcjsKKyAgICAgICAgLy8gcHJvY2VzcyByZW1vdmVkIHRyYWNrcyBmaXJzdCB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB0cmFjayBuYW1lcworICAgICAgICB1bnNpZ25lZCByZW1vdmVkVHJhY2tzID0gcHJldmlvdXNUcmFja01hc2sgJiB+Y3VycmVudFRyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKHJlbW92ZWRUcmFja3MgIT0gMCkgeworICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHJlbW92ZWRUcmFja3MpOworICAgICAgICAgICAgcmVtb3ZlZFRyYWNrcyAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwogICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0TG9nKGxvZ1dyaXRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYWx3YXlzIGhhdmUgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIChub24taWRsZSkgc3RhdGUuCi0gICAgICAgICAgICAvLyBIb3dldmVyLCB0aGUgc3RhdGUgcXVldWUgb25seSBndWFyYW50ZWVzIGFjY2VzcyB0byBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGF0ZXMuCi0gICAgICAgICAgICAvLyBTbyB3aGVuIHRoZXJlIGlzIGEgdHJhbnNpdGlvbiBmcm9tIGEgbm9uLWlkbGUgc3RhdGUgaW50byBhbiBpZGxlIHN0YXRlLCB3ZSBtYWtlIGEKLSAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGxhc3Qga25vd24gbm9uLWlkbGUgc3RhdGUgc28gaXQgaXMgc3RpbGwgYXZhaWxhYmxlIG9uIHJldHVybiBmcm9tIGlkbGUuCi0gICAgICAgICAgICAvLyBUaGUgcG9zc2libGUgdHJhbnNpdGlvbnMgYXJlOgotICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IG5vbi1pZGxlICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGN1cnJlbnQgaW4tcGxhY2UKLSAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBpZGxlICAgICAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjb3B5IG9mIGN1cnJlbnQKLSAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBpZGxlICAgICAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKLSAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBub24taWRsZSAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKLSAgICAgICAgICAgIGlmICghKGN1cnJlbnQtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkgewotICAgICAgICAgICAgICAgICAgICBwcmVJZGxlID0gKmN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAmcHJlSWRsZTsKLSAgICAgICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IGZhbHNlOwotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgICAgICAgICBvbGRMb2FkVmFsaWQgPSBmYWxzZTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgICAgICB9Ci0jaWYgIUxPR19OREVCVUcKLSAgICAgICAgbmV4dCA9IE5VTEw7ICAgIC8vIG5vdCByZWZlcmVuY2VkIGFnYWluCi0jZW5kaWYKLQotICAgICAgICBkdW1wU3RhdGUtPm1Db21tYW5kID0gY29tbWFuZDsKLQotICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTDoKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU6Ci0gICAgICAgICAgICBzbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEU6Ci0gICAgICAgICAgICAvLyBvbmx5IHBlcmZvcm0gYSBjb2xkIGlkbGUgY29tbWFuZCBvbmNlCi0gICAgICAgICAgICAvLyBGSVhNRSBjb25zaWRlciBjaGVja2luZyBwcmV2aW91cyBzdGF0ZSBhbmQgb25seSBwZXJmb3JtIGlmIHByZXZpb3VzICE9IENPTERfSURMRQotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1Db2xkR2VuICE9IGNvbGRHZW4pIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90ICpjb2xkRnV0ZXhBZGRyID0gY3VycmVudC0+bUNvbGRGdXRleEFkZHI7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoY29sZEZ1dGV4QWRkciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2RlYyhjb2xkRnV0ZXhBZGRyKTsKLSAgICAgICAgICAgICAgICBpZiAob2xkIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgX19mdXRleF9zeXNjYWxsNChjb2xkRnV0ZXhBZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIG9sZCAtIDEsIE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcG9saWN5ID0gc2NoZWRfZ2V0c2NoZWR1bGVyKDApOwotICAgICAgICAgICAgICAgIGlmICghKHBvbGljeSA9PSBTQ0hFRF9GSUZPIHx8IHBvbGljeSA9PSBTQ0hFRF9SUikpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBvdmVybHkgY29uc2VydmF0aXZlOyB0aGVyZSBjb3VsZCBiZSB0aW1lcyB0aGF0IHRoZSBub3JtYWwgbWl4ZXIKLSAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cyBzdWNoIGEgYnJpZWYgY29sZCBpZGxlIHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIHJlc2V0dGluZyB0aGlzIGZsYWcuCi0gICAgICAgICAgICAgICAgaXNXYXJtID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOwotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7Ci0gICAgICAgICAgICAgICAgd2FybXVwQ3ljbGVzID0gMDsKLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7Ci0gICAgICAgICAgICAgICAgY29sZEdlbiA9IGN1cnJlbnQtPm1Db2xkR2VuOwotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgICAgIGJvdW5kcyA9IDA7Ci0gICAgICAgICAgICAgICAgZnVsbCA9IGZhbHNlOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9ICFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm9sZFRzKTsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6RVhJVDoKLSAgICAgICAgICAgIGRlbGV0ZSBtaXhlcjsKLSAgICAgICAgICAgIGRlbGV0ZVtdIG1peEJ1ZmZlcjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYOgotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpXUklURToKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBjb21tYW5kICVkIiwgY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGVyZSBpcyBhIG5vbi1pZGxlIHN0YXRlIGF2YWlsYWJsZSB0byB1czsgZGlkIHRoZSBzdGF0ZSBjaGFuZ2U/Ci0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7Ci0gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSB7Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSBzdGF0ZSBjaGFuZ2UgaGVyZSwgYnV0IHNpbmNlIHdlIHdhbnQgdG8gZGlmZiB0aGUgc3RhdGUsCi0gICAgICAgICAgICAvLyB3ZSdyZSBwcmVwYXJlZCBmb3IgcHJldmlvdXMgPT0gJmluaXRpYWwgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaAotICAgICAgICAgICAgdW5zaWduZWQgcHJldmlvdXNUcmFja01hc2s7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gb3V0cHV0IEhBTCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gb3V0cHV0U2lua0dlbikgewotICAgICAgICAgICAgICAgIG91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKLSAgICAgICAgICAgICAgICBvdXRwdXRTaW5rR2VuID0gY3VycmVudC0+bU91dHB1dFNpbmtHZW47Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gb3V0cHV0U2luay0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkgPT0gRkNDXzIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChmb3JtYXQgIT0gcHJldmlvdXNGb3JtYXQpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRSB0byBhdm9pZCBwcmlvcml0eSBpbnZlcnNpb24sIGRvbid0IGRlbGV0ZSBoZXJlCi0gICAgICAgICAgICAgICAgZGVsZXRlIG1peGVyOwotICAgICAgICAgICAgICAgIG1peGVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBtaXhCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbWl4QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG5vcm1hbCBtaXhlciBhbGxvY2F0ZSBmb3IgdXMKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBzYW1wbGVSYXRlLCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwotICAgICAgICAgICAgICAgICAgICBtaXhCdWZmZXIgPSBuZXcgc2hvcnRbZnJhbWVDb3VudCAqIEZDQ18yXTsKLSAgICAgICAgICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCi0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDE3NTAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgLy8gMS43NQotICAgICAgICAgICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKLSAgICAgICAgICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1Ci0gICAgICAgICAgICAgICAgICAgIHdhcm11cE5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAgLy8gMC41MAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmNlTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICB3YXJtdXBOcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZWNvbmZpZ3VyZSBhbGwgYWN0aXZlIHRyYWNrcwotICAgICAgICAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOwotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IHByZXZpb3VzLT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGFjdGl2ZSB0cmFjayBzZXQKLSAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBmYXN0VHJhY2tzR2VuKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobWl4QnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIGludCBuYW1lOwotCi0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyByZW1vdmVkIHRyYWNrcyBmaXJzdCB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB0cmFjayBuYW1lcwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlbW92ZWRUcmFja3MgPSBwcmV2aW91c1RyYWNrTWFzayAmIH5jdXJyZW50VHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVkVHJhY2tzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9fYnVpbHRpbl9jdHoocmVtb3ZlZFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm93IHByb2Nlc3MgYWRkZWQgdHJhY2tzCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgYWRkZWRUcmFja3MgPSBjdXJyZW50VHJhY2tNYXNrICYgfnByZXZpb3VzVHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChhZGRlZFRyYWNrcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KGFkZGVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCAmJiBmYXN0VHJhY2tOYW1lc1tpXSA9PSAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIGdldFRyYWNrTmFtZSB3aXRoIGRlZmF1bHQgY2hhbm5lbCBtYXNrIGFuZCBhIHJhbmRvbSBpbnZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHNlc3Npb25JZCAobm8gZWZmZWN0cyBoZXJlKQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCAtNTU1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIG1peEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVNhbXBsZVJhdGUgIT0gMCAmJiBmYXN0VHJhY2stPm1TYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsICh2b2lkKikgZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGZpbmFsbHkgcHJvY2VzcyAocG90ZW50aWFsbHkpIG1vZGlmaWVkIHRyYWNrczsgdGhlc2UgdXNlIHRoZSBzYW1lIHNsb3QKLSAgICAgICAgICAgICAgICAvLyBidXQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgYnVmZmVyIHByb3ZpZGVyIG9yIHZvbHVtZSBwcm92aWRlcgotICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1vZGlmaWVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIHByZXZpb3VzVHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChtb2RpZmllZFRyYWNrcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KG1vZGlmaWVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbnNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgd2FzIGFjdHVhbGx5IG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikweDEwMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTB4MTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1TYW1wbGVSYXRlICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLCAodm9pZCopIGZhc3RUcmFjay0+bVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVNT1ZFLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuOwotCi0gICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7Ci0gICAgICAgICAgICB9Ci0KLSNpZiAxICAgLy8gRklYTUUgc2hvdWxkbid0IG5lZWQgdGhpcwotICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHN0YXRlIGNoYW5nZSBvbmNlCi0gICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvIHdvcmsgdXNpbmcgY3VycmVudCBzdGF0ZSBoZXJlCi0gICAgICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpNSVgpICYmIChtaXhlciAhPSBOVUxMKSAmJiBpc1dhcm0pIHsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKG1peEJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KLSAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRUcmFja01hc2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KGN1cnJlbnRUcmFja01hc2spOwotICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFja01hc2sgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotCi0gICAgICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgcGVyLXRyYWNrIHRpbWVzdGFtcAotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUgPSBmYXN0VHJhY2stPm1TYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBjdXJyZW50bHkgbm8gc2FtcGxlIHJhdGUgY29udmVyc2lvbiBmb3IgZmFzdCB0cmFja3MgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFja1NhbXBsZVJhdGUgIT0gMCAmJiB0cmFja1NhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KSBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkICogdHJhY2tTYW1wbGVSYXRlKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBDYW4ndCBwcm92aWRlIGFuIEF1ZGlvVGltZXN0YW1wIGJlZm9yZSBmaXJzdCBmcmFtZSBwcmVzZW50ZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIGR1cmluZyB0aGUgYnJpZWYgMzItYml0IHdyYXBhcm91bmQgd2luZG93Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFja0ZyYW1lc1dyaXR0ZW4gPj0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCBwZXJUcmFja1RpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbiAtIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1UaW1lID0gdGltZXN0YW1wLm1UaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPm9uVGltZXN0YW1wKHBlclRyYWNrVGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CisgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOwogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHZsciAmIDB4RkZGRikpOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh2bHIgPj4gMTYpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKLSAgICAgICAgICAgICAgICAvLyB0YWtlcyBhIHRyeUxvY2ssIHdoaWNoIGNhbiBibG9jawotICAgICAgICAgICAgICAgIC8vIHVwIHRvIDEgbXMuICBJZiBlbm91Z2ggYWN0aXZlIHRyYWNrcyBhbGwgYmxvY2tlZCBpbiBzZXF1ZW5jZSwgdGhpcyB3b3VsZCByZXN1bHQKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3ZlcmFsbCBmYXN0IG1peCBjeWNsZSBiZWluZyBkZWxheWVkLiAgU2hvdWxkIHVzZSBhIG5vbi1ibG9ja2luZyBGSUZPLgotICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWFkeSgpOwotICAgICAgICAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhY2VOYW1lWzE2XTsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRyYWNlTmFtZSwgImZSZHkiKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzRdID0gaSArIChpIDwgMTAgPyAnMCcgOiAnQScgLSAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLCBmcmFtZXNSZWFkeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZkdW1wU3RhdGUtPm1UcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgRmFzdFRyYWNrVW5kZXJydW5zIHVuZGVycnVucyA9IGZ0RHVtcC0+bVVuZGVycnVuczsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBmcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRU1QVFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGlzYWJsZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IG1peGluZyBwYXJ0aWFsIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fUEFSVElBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgbWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyNpZiAhTE9HX05ERUJVRworICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAorICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IHByb2Nlc3MgYWRkZWQgdHJhY2tzCisgICAgICAgIHVuc2lnbmVkIGFkZGVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIH5wcmV2aW91c1RyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKGFkZGVkVHJhY2tzICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihhZGRlZFRyYWNrcyk7CisgICAgICAgICAgICBhZGRlZFRyYWNrcyAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMICYmIGZhc3RUcmFja05hbWVzW2ldID09IC0xKTsKKyAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1peGVyQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQorICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpGT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluYWxseSBwcm9jZXNzIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgdHJhY2tzOyB0aGVzZSB1c2UgdGhlIHNhbWUgc2xvdAorICAgICAgICAvLyBidXQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgYnVmZmVyIHByb3ZpZGVyIG9yIHZvbHVtZSBwcm92aWRlcgorICAgICAgICB1bnNpZ25lZCBtb2RpZmllZFRyYWNrcyA9IGN1cnJlbnRUcmFja01hc2sgJiBwcmV2aW91c1RyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKG1vZGlmaWVkVHJhY2tzICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihtb2RpZmllZFRyYWNrcyk7CisgICAgICAgICAgICBtb2RpZmllZFRyYWNrcyAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1HZW5lcmF0aW9uICE9IGdlbmVyYXRpb25zW2ldKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyB0cmFjayB3YXMgYWN0dWFsbHkgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRU1PVkUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW47CisKKyAgICAgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlcjo6b25Xb3JrKCkKK3sKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gdGhpcy0+Y29tbWFuZDsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworCisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1peGVyICE9IE5VTEwpICYmIGlzV2FybSkgeworICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KKyAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CisgICAgICAgIHdoaWxlIChjdXJyZW50VHJhY2tNYXNrICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihjdXJyZW50VHJhY2tNYXNrKTsKKyAgICAgICAgICAgIGN1cnJlbnRUcmFja01hc2sgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisKKyAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIHBlci10cmFjayB0aW1lc3RhbXAKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgICAgIC8vIENhbid0IHByb3ZpZGUgYW4gQXVkaW9UaW1lc3RhbXAgYmVmb3JlIGZpcnN0IGZyYW1lIHByZXNlbnRlZCwKKyAgICAgICAgICAgICAgICAvLyBvciBkdXJpbmcgdGhlIGJyaWVmIDMyLWJpdCB3cmFwYXJvdW5kIHdpbmRvdworICAgICAgICAgICAgICAgIGlmICh0cmFja0ZyYW1lc1dyaXR0ZW4gPj0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKSB7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHBlclRyYWNrVGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tUG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbiAtIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVRpbWUgPSB0aW1lc3RhbXAubVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5vblRpbWVzdGFtcChwZXJUcmFja1RpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICAgICAgICAgIGZsb2F0IHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CisKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKKyAgICAgICAgICAgIC8vIHRha2VzIGEgdHJ5TG9jaywgd2hpY2ggY2FuIGJsb2NrCisgICAgICAgICAgICAvLyB1cCB0byAxIG1zLiAgSWYgZW5vdWdoIGFjdGl2ZSB0cmFja3MgYWxsIGJsb2NrZWQgaW4gc2VxdWVuY2UsIHRoaXMgd291bGQgcmVzdWx0CisgICAgICAgICAgICAvLyBpbiB0aGUgb3ZlcmFsbCBmYXN0IG1peCBjeWNsZSBiZWluZyBkZWxheWVkLiAgU2hvdWxkIHVzZSBhIG5vbi1ibG9ja2luZyBGSUZPLgorICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWR5ID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPmZyYW1lc1JlYWR5KCk7CisgICAgICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgeworICAgICAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCisgICAgICAgICAgICAgICAgY2hhciB0cmFjZU5hbWVbMTZdOworICAgICAgICAgICAgICAgIHN0cmNweSh0cmFjZU5hbWUsICJmUmR5Iik7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzRdID0gaSArIChpIDwgMTAgPyAnMCcgOiAnQScgLSAxMCk7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzVdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZSwgZnJhbWVzUmVhZHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmFzdFRyYWNrRHVtcCAqZnREdW1wID0gJmR1bXBTdGF0ZS0+bVRyYWNrc1tpXTsKKyAgICAgICAgICAgIEZhc3RUcmFja1VuZGVycnVucyB1bmRlcnJ1bnMgPSBmdER1bXAtPm1VbmRlcnJ1bnM7CisgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5Kys7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRU1QVFk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5kaXNhYmxlKG5hbWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKys7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgbWl4aW5nIHBhcnRpYWwgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKys7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fUEFSVElBTDsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnREdW1wLT5tVW5kZXJydW5zID0gdW5kZXJydW5zOwotICAgICAgICAgICAgICAgIGZ0RHVtcC0+bUZyYW1lc1JlYWR5ID0gZnJhbWVzUmVhZHk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgcHRzOwotICAgICAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCB8fCAoT0sgIT0gb3V0cHV0U2luay0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKCZwdHMpKSkKLSAgICAgICAgICAgICAgICBwdHMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcygpIGlzIENQVS1ib3VuZAotICAgICAgICAgICAgbWl4ZXItPnByb2Nlc3MocHRzKTsKLSAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gTUlYRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobWl4QnVmZmVyU3RhdGUgPT0gTUlYRUQpIHsKLSAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgYXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKLSAgICAgICAgLy9ib29sIGRpZEZ1bGxXcml0ZSA9IGZhbHNlOyAgICAvLyBkdW1wc3lzIGNvdWxkIGRpc3BsYXkgYSBjb3VudCBvZiBwYXJ0aWFsIHdyaXRlcwotICAgICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEUpICYmIChvdXRwdXRTaW5rICE9IE5VTEwpICYmIChtaXhCdWZmZXIgIT0gTlVMTCkpIHsKLSAgICAgICAgICAgIGlmIChtaXhCdWZmZXJTdGF0ZSA9PSBVTkRFRklORUQpIHsKLSAgICAgICAgICAgICAgICBtZW1zZXQobWl4QnVmZmVyLCAwLCBmcmFtZUNvdW50ICogRkNDXzIgKiBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFpFUk9FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0ZWVTaW5rICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAodm9pZCkgdGVlU2luay0+d3JpdGUobWl4QnVmZmVyLCBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKLSAgICAgICAgICAgIC8vICAgICAgIGJ1dCB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGhhbmRsZSBib3RoIG5vbi1ibG9ja2luZyBhbmQgYmxvY2tpbmcgc2lua3MKLSAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKLSAgICAgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKLSAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG91dHB1dFNpbmstPndyaXRlKG1peEJ1ZmZlciwgZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICBBVFJBQ0VfRU5EKCk7Ci0gICAgICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7Ci0gICAgICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKHNpemVfdCkgZnJhbWVzV3JpdHRlbiA8PSBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuID0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgICAgIC8vaWYgKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPT0gZnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CisgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUZ1bGwrKzsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0ZVTEw7CisgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAotCi0gICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBvdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9IHRpbWVzdGFtcC5tUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgewotICAgICAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ0RHVtcC0+bVVuZGVycnVucyA9IHVuZGVycnVuczsKKyAgICAgICAgICAgIGZ0RHVtcC0+bUZyYW1lc1JlYWR5ID0gZnJhbWVzUmVhZHk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUbyBiZSBleGFjdGx5IHBlcmlvZGljLCBjb21wdXRlIHRoZSBuZXh0IHNsZWVwIHRpbWUgYmFzZWQgb24gY3VycmVudCB0aW1lLgotICAgICAgICAvLyBUaGlzIGNvZGUgZG9lc24ndCBoYXZlIGxvbmctdGVybSBzdGFiaWxpdHkgd2hlbiB0aGUgc2luayBpcyBub24tYmxvY2tpbmcuCi0gICAgICAgIC8vIEZJWE1FIFRvIGF2b2lkIGRyaWZ0LCB1c2UgdGhlIGxvY2FsIGF1ZGlvIGNsb2NrIG9yIHdhdGNoIHRoZSBzaW5rJ3MgZmlsbCBzdGF0dXMuCi0gICAgICAgIHN0cnVjdCB0aW1lc3BlYyBuZXdUczsKLSAgICAgICAgaW50IHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZuZXdUcyk7Ci0gICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAvL2xvZ1dyaXRlci0+bG9nVGltZXN0YW1wKG5ld1RzKTsKLSAgICAgICAgICAgIGlmIChvbGRUc1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgdGltZV90IHNlYyA9IG5ld1RzLnR2X3NlYyAtIG9sZFRzLnR2X3NlYzsKLSAgICAgICAgICAgICAgICBsb25nIG5zZWMgPSBuZXdUcy50dl9uc2VjIC0gb2xkVHMudHZfbnNlYzsKLSAgICAgICAgICAgICAgICBBTE9HRV9JRihzZWMgPCAwIHx8IChzZWMgPT0gMCAmJiBuc2VjIDwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIGZhaWxlZDogd2FzICVsZC4lMDlsZCBidXQgbm93ICVsZC4lMDlsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbGRUcy50dl9zZWMsIG9sZFRzLnR2X25zZWMsIG5ld1RzLnR2X3NlYywgbmV3VHMudHZfbnNlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC0tc2VjOwotICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGFuIGluaXRpYWwgdW5kZXJydW4gb24gZmFzdCB0cmFja3MgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LAotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzdGFydCBwdWxsaW5nIGRhdGEgZnJvbSB0cmFja3MgYW5kIG1peGluZyB1bnRpbCB3YXJtdXAgaXMgY29tcGxldGUuCi0gICAgICAgICAgICAgICAgLy8gV2FybXVwIGlzIGNvbnNpZGVyZWQgY29tcGxldGUgYWZ0ZXIgdGhlIGVhcmxpZXIgb2Y6Ci0gICAgICAgICAgICAgICAgLy8gICAgICBNSU5fV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzIGFuZCBsYXN0IG9uZSBibG9ja3MgZm9yIGF0IGxlYXN0IHdhcm11cE5zCi0gICAgICAgICAgICAgICAgLy8gICAgICBNQVhfV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZSwgYnV0IHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kgcmVxdWlyZXMgYSBuZXcgSEFMIEFQSS4KLSAgICAgICAgICAgICAgICBpZiAoIWlzV2FybSAmJiBhdHRlbXB0ZWRXcml0ZSkgewotICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyArPSBzZWM7Ci0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyArPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID49IDEwMDAwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK3dhcm11cEN5Y2xlczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChuc2VjID4gd2FybXVwTnMgJiYgd2FybXVwQ3ljbGVzID49IE1JTl9XQVJNVVBfQ1lDTEVTKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXJtdXBDeWNsZXMgPj0gTUFYX1dBUk1VUF9DWUNMRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTWVhc3VyZWRXYXJtdXBUcyA9IG1lYXN1cmVkV2FybXVwVHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1XYXJtdXBDeWNsZXMgPSB3YXJtdXBDeWNsZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IC0xOwotICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgfHwgbnNlYyA+IHVuZGVycnVuTnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5kZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgb3ZlcnJ1bk5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWdub3JlTmV4dE92ZXJydW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IGxvZyBvY2Nhc2lvbmFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3ZlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgbWluaW11bSBjeWNsZSB0aW1lLiBJdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIGNvbXBlbnNhdGVzIGZvciBhbiBhdWRpbyBIQUwgd2l0aCBqaXR0ZXIgZHVlIHRvIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHdvcmtzIHdpdGggYSB2YXJpYWJsZSBidWZmZXIgZGVwdGggYXVkaW8gSEFMIHRoYXQgbmV2ZXIgcHVsbHMgYXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmF0ZSA8IHRoYW4gb3ZlcnJ1bk5zIHBlciBidWZmZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSByZWNvdmVycyBmcm9tIG92ZXJydW4gaW1tZWRpYXRlbHkgYWZ0ZXIgdW5kZXJydW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGEgbm9uLWJsb2NraW5nIGF1ZGlvIEhBTC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBmb3JjZU5zIC0gbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgaWYgKGlzV2FybSkgewotICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRoZSBGSUZPIHF1ZXVlIGJvdW5kcwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgaSA9IGJvdW5kcyAmIChkdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzID0gKGJvdW5kcyAmIDB4RkZGRjAwMDApIHwgKChib3VuZHMgKyAxKSAmIDB4RkZGRik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMgKz0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGJvdW5kcyAmIChkdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGRlbHRhIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb25vdG9uaWNOcyA9IG5zZWM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwICYmIHNlYyA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbm90b25pY05zICs9IHNlYyAqIDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSByYXcgQ1BVIGxvYWQgPSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsb2FkTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3TG9hZDsKLSAgICAgICAgICAgICAgICAgICAgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELCAmbmV3TG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkTG9hZFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0gbmV3TG9hZC50dl9zZWMgLSBvbGRMb2FkLnR2X3NlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjID0gbmV3TG9hZC50dl9uc2VjIC0gb2xkTG9hZC50dl9uc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkTnMgPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwICYmIHNlYyA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zICs9IHNlYyAqIDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCB0aW1lIHRocm91Z2ggdGhlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2FkVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZCA9IG5ld0xvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegotICAgICAgICAgICAgICAgICAgICBpbnQgY3B1TnVtID0gc2NoZWRfZ2V0Y3B1KCk7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtIeiA9IHRjdS5nZXRDcHVrSHooY3B1TnVtKTsKLSAgICAgICAgICAgICAgICAgICAga0h6ID0gKGtIeiA8PCA0KSB8IChjcHVOdW0gJiAweEYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdmFsdWVzIGluIEZJRk8gcXVldWVzIGZvciBkdW1wc3lzCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0b3JlcyAjMSwgIzIsICMzIGFyZSBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLAotICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIHJlc3BlY3QgdG8gc3RvcmUgIzQgYmVsb3cKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTG9hZE5zW2ldID0gbG9hZE5zOwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzdG9yZSAjNCBpcyBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBzdG9yZXMgIzEsICMyLCAjMyBhYm92ZSwgYnV0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXdlc3Qgb3BlbiAmIG9sZGVzdCBjbG9zZWQgaGFsdmVzIGFyZSBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQm91bmRzID0gYm91bmRzOwotICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJjeWNsZV9tcyIsIG1vbm90b25pY05zIC8gMTAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImxvYWRfdXMiLCBsb2FkTnMgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOwotICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZFRzID0gbmV3VHM7CisgICAgICAgIGludDY0X3QgcHRzOworICAgICAgICBpZiAob3V0cHV0U2luayA9PSBOVUxMIHx8IChPSyAhPSBvdXRwdXRTaW5rLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoJnB0cykpKSB7CisgICAgICAgICAgICBwdHMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MoKSBpcyBDUFUtYm91bmQKKyAgICAgICAgbWl4ZXItPnByb2Nlc3MocHRzKTsKKyAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBNSVhFRDsKKyAgICB9IGVsc2UgaWYgKG1NaXhlckJ1ZmZlclN0YXRlID09IE1JWEVEKSB7CisgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOworICAgIH0KKyAgICAvL2Jvb2wgZGlkRnVsbFdyaXRlID0gZmFsc2U7ICAgIC8vIGR1bXBzeXMgY291bGQgZGlzcGxheSBhIGNvdW50IG9mIHBhcnRpYWwgd3JpdGVzCisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OldSSVRFKSAmJiAob3V0cHV0U2luayAhPSBOVUxMKSAmJiAobU1peGVyQnVmZmVyICE9IE5VTEwpKSB7CisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJTdGF0ZSA9PSBVTkRFRklORUQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBaRVJPRUQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCAqYnVmZmVyID0gbVNpbmtCdWZmZXIgIT0gTlVMTCA/IG1TaW5rQnVmZmVyIDogbU1peGVyQnVmZmVyOworICAgICAgICBpZiAoZm9ybWF0Lm1Gb3JtYXQgIT0gbU1peGVyQnVmZmVyRm9ybWF0KSB7IC8vIHNpbmsgZm9ybWF0IG5vdCB0aGUgc2FtZSBhcyBtaXhlciBmb3JtYXQKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQubUZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkpOworICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKyAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKKyAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKKyAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKKyAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcworICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CisgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gb3V0cHV0U2luay0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CisgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID49IDApIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPD0gZnJhbWVDb3VudCk7CisgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4gPSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAvL2lmICgoc2l6ZV90KSBmcmFtZXNXcml0dGVuID09IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7CisgICAgICAgICAgICAvL30KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1vbm90b25pYyBjbG9jayBpcyBicm9rZW4KLSAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CiAgICAgICAgIH0KKyAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSB0cnVlOworICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKIAotCi0gICAgfSAgIC8vIGZvciAoOzspCi0KLSAgICAvLyBuZXZlciByZXR1cm4gJ3RydWUnOyBUaHJlYWQ6Ol90aHJlYWRMb29wKCkgbG9ja3MgbXV0ZXggd2hpY2ggY2FuIHJlc3VsdCBpbiBwcmlvcml0eSBpbnZlcnNpb24KKyAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gb3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0gdGltZXN0YW1wLm1Qb3NpdGlvbjsKKyAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCisgICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIEZhc3RNaXhlckR1bXBTdGF0ZTo6RmFzdE1peGVyRHVtcFN0YXRlKAogI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04KICNlbmRpZgotICAgICAgICApIDoKLSAgICBtQ29tbWFuZChGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTCksIG1Xcml0ZVNlcXVlbmNlKDApLCBtRnJhbWVzV3JpdHRlbigwKSwKLSAgICBtTnVtVHJhY2tzKDApLCBtV3JpdGVFcnJvcnMoMCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKLSAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovIG1XYXJtdXBDeWNsZXMoMCksCisgICAgICAgICkgOiBGYXN0VGhyZWFkRHVtcFN0YXRlKCksCisgICAgbVdyaXRlU2VxdWVuY2UoMCksIG1GcmFtZXNXcml0dGVuKDApLAorICAgIG1OdW1UcmFja3MoMCksIG1Xcml0ZUVycm9ycygwKSwKKyAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksCiAgICAgbVRyYWNrTWFzaygwKQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICwgbVNhbXBsaW5nTigwKSwgbUJvdW5kcygwKQotI2VuZGlmCiB7Ci0gICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKLSAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKICNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKICAgICBpbmNyZWFzZVNhbXBsaW5nTihzYW1wbGluZ04pOwogI2VuZGlmCkBAIC03MTQsNyArNTEwLDcgQEAKIHZvaWQgRmFzdE1peGVyRHVtcFN0YXRlOjpkdW1wKGludCBmZCkgY29uc3QKIHsKICAgICBpZiAobUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OklOSVRJQUwpIHsKLSAgICAgICAgZmRwcmludGYoZmQsICJGYXN0TWl4ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIG5vdCBpbml0aWFsaXplZFxuIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAjZGVmaW5lIENPTU1BTkRfTUFYIDMyCkBAIC03NDgsMTAgKzU0NCwxMCBAQAogICAgIGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDEwMDAuMCkgKwogICAgICAgICAgICAgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLyAxMDAwMDAwLjApOwogICAgIGRvdWJsZSBtaXhQZXJpb2RTZWMgPSAoZG91YmxlKSBtRnJhbWVDb3VudCAvIChkb3VibGUpIG1TYW1wbGVSYXRlOwotICAgIGZkcHJpbnRmKGZkLCAiRmFzdE1peGVyIGNvbW1hbmQ9JXMgd3JpdGVTZXF1ZW5jZT0ldSBmcmFtZXNXcml0dGVuPSV1XG4iCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgbnVtVHJhY2tzPSV1IHdyaXRlRXJyb3JzPSV1IHVuZGVycnVucz0ldSBvdmVycnVucz0ldVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0ldSBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXVcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgY29tbWFuZD0lcyB3cml0ZVNlcXVlbmNlPSV1IGZyYW1lc1dyaXR0ZW49JXVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbnVtVHJhY2tzPSV1IHdyaXRlRXJyb3JzPSV1IHVuZGVycnVucz0ldSBvdmVycnVucz0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXp1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKICAgICAgICAgICAgICAgICAgc3RyaW5nLCBtV3JpdGVTZXF1ZW5jZSwgbUZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgIG1OdW1UcmFja3MsIG1Xcml0ZUVycm9ycywgbVVuZGVycnVucywgbU92ZXJydW5zLAogICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCkBAIC04MDIsMjEgKzU5OCwyNyBAQAogICAgICAgICBwcmV2aW91c0NwdWtIeiA9IHNhbXBsZUNwdWtIejsKICNlbmRpZgogICAgIH0KLSAgICBmZHByaW50ZihmZCwgIlNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOwotICAgIGZkcHJpbnRmKGZkLCAiICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsIHdhbGwuc3RkZGV2KCkqMWUtNik7Ci0gICAgZmRwcmludGYoZmQsICIgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgotICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgIGlmIChuKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOworICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAorICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAorICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAorICAgICAgICAgICAgICAgICAgICBsb2FkTnMubWVhbigpKjFlLTMsIGxvYWROcy5taW5pbXVtKCkqMWUtMywgbG9hZE5zLm1heGltdW0oKSoxZS0zLAorICAgICAgICAgICAgICAgICAgICBsb2FkTnMuc3RkZGV2KCkqMWUtMyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGN1cnJlbnRseVxuIik7CisgICAgfQogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIGZkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKLSAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCi0gICAgICAgICAgICAgICAgIGtIei5tZWFuKCkqMWUtMywga0h6Lm1pbmltdW0oKSoxZS0zLCBrSHoubWF4aW11bSgpKjFlLTMsIGtIei5zdGRkZXYoKSoxZS0zKTsKLSAgICBmZHByaW50ZihmZCwgIiAgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IChpLmUuIG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kpOlxuIgotICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4xZiBtaW49JS4xZiBtYXg9JS4xZiBzdGRkZXY9JS4xZlxuIiwKLSAgICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7CisgICAgZHByaW50ZihmZCwgIiAgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBNSHo6XG4iCisgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCisgICAgICAgICAgICAgICAga0h6Lm1lYW4oKSoxZS0zLCBrSHoubWluaW11bSgpKjFlLTMsIGtIei5tYXhpbXVtKCkqMWUtMywga0h6LnN0ZGRldigpKjFlLTMpOworICAgIGRwcmludGYoZmQsICIgIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiAoaS5lLiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5KTpcbiIKKyAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4xZiBtaW49JS4xZiBtYXg9JS4xZiBzdGRkZXY9JS4xZlxuIiwKKyAgICAgICAgICAgICAgICBsb2FkTUh6Lm1lYW4oKSwgbG9hZE1Iei5taW5pbXVtKCksIGxvYWRNSHoubWF4aW11bSgpLCBsb2FkTUh6LnN0ZGRldigpKTsKICNlbmRpZgogICAgIGlmICh0YWlsICE9IE5VTEwpIHsKICAgICAgICAgcXNvcnQodGFpbCwgbiwgc2l6ZW9mKHVpbnQzMl90KSwgY29tcGFyZV91aW50MzJfdCk7CkBAIC04MjcsMTIgKzYyOSwxMiBAQAogICAgICAgICAgICAgbGVmdC5zYW1wbGUodGFpbFtpXSk7CiAgICAgICAgICAgICByaWdodC5zYW1wbGUodGFpbFtuIC0gKGkgKyAxKV0pOwogICAgICAgICB9Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICg+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCi0gICAgICAgICAgICAgICAgICAgICAiICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgcmlnaHQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICAgbGVmdC5tZWFuKCkqMWUtNiwgbGVmdC5taW5pbXVtKCkqMWUtNiwgbGVmdC5tYXhpbXVtKCkqMWUtNiwgbGVmdC5zdGRkZXYoKSoxZS02LAotICAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LnN0ZGRldigpKjFlLTYpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBEaXN0cmlidXRpb24gb2YgbWl4IGN5Y2xlIHRpbWVzIGluIG1zIGZvciB0aGUgdGFpbHMgKD4gfjMgc3RkZGV2IG91dGxpZXJzKTpcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgIHJpZ2h0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbGVmdC5tZWFuKCkqMWUtNiwgbGVmdC5taW5pbXVtKCkqMWUtNiwgbGVmdC5tYXhpbXVtKCkqMWUtNiwgbGVmdC5zdGRkZXYoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5tZWFuKCkqMWUtNiwgcmlnaHQubWluaW11bSgpKjFlLTYsIHJpZ2h0Lm1heGltdW0oKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5zdGRkZXYoKSoxZS02KTsKICAgICAgICAgZGVsZXRlW10gdGFpbDsKICAgICB9CiAjZW5kaWYKQEAgLTg0Miw5ICs2NDQsOSBAQAogICAgIC8vIEluc3RlYWQgd2UgYWx3YXlzIGRpc3BsYXkgYWxsIHRyYWNrcywgd2l0aCBhbiBpbmRpY2F0aW9uCiAgICAgLy8gb2Ygd2hldGhlciB3ZSB0aGluayB0aGUgdHJhY2sgaXMgYWN0aXZlLgogICAgIHVpbnQzMl90IHRyYWNrTWFzayA9IG1UcmFja01hc2s7Ci0gICAgZmRwcmludGYoZmQsICJGYXN0IHRyYWNrczoga01heEZhc3RUcmFja3M9JXUgYWN0aXZlTWFzaz0lI3hcbiIsCisgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFja3M6IGtNYXhGYXN0VHJhY2tzPSV1IGFjdGl2ZU1hc2s9JSN4XG4iLAogICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzLCB0cmFja01hc2spOwotICAgIGZkcHJpbnRmKGZkLCAiSW5kZXggQWN0aXZlIEZ1bGwgUGFydGlhbCBFbXB0eSAgUmVjZW50IFJlYWR5XG4iKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJbmRleCBBY3RpdmUgRnVsbCBQYXJ0aWFsIEVtcHR5ICBSZWNlbnQgUmVhZHlcbiIpOwogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSwgdHJhY2tNYXNrID4+PSAxKSB7CiAgICAgICAgIGJvb2wgaXNBY3RpdmUgPSB0cmFja01hc2sgJiAxOwogICAgICAgICBjb25zdCBGYXN0VHJhY2tEdW1wICpmdER1bXAgPSAmbVRyYWNrc1tpXTsKQEAgLTg2NCw3ICs2NjYsNyBAQAogICAgICAgICAgICAgbW9zdFJlY2VudCA9ICI/IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiJTV1ICU2cyAlNHUgJTd1ICU1dSAlN3MgJTV1XG4iLCBpLCBpc0FjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgZHByaW50ZihmZCwgIiAgJTV1ICU2cyAlNHUgJTd1ICU1dSAlN3MgJTV6dVxuIiwgaSwgaXNBY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKSAmIFVOREVSUlVOX01BU0ssCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKSAmIFVOREVSUlVOX01BU0ssCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSkgJiBVTkRFUlJVTl9NQVNLLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCmluZGV4IDYxNTg5MjUuLmZkZThjMmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKQEAgLTE3LDEyNCArMTcsNzQgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKIAorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgorI2luY2x1ZGUgIkZhc3RUaHJlYWQuaCIKICNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIi4uL3ByaXZhdGUvYmlvbmljX2Z1dGV4LmgiCi19CiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgQXVkaW9NaXhlcjsKKwogdHlwZWRlZiBTdGF0ZVF1ZXVlPEZhc3RNaXhlclN0YXRlPiBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOwogCi1jbGFzcyBGYXN0TWl4ZXIgOiBwdWJsaWMgVGhyZWFkIHsKK2NsYXNzIEZhc3RNaXhlciA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKIAogcHVibGljOgotICAgICAgICAgICAgRmFzdE1peGVyKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSB7IH0KLSAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKSB7IH0KKyAgICAgICAgICAgIEZhc3RNaXhlcigpOworICAgIHZpcnR1YWwgfkZhc3RNaXhlcigpOwogCi0gICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBzcSgpIHsgcmV0dXJuICZtU1E7IH0KKyAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUqIHNxKCk7CiAKIHByaXZhdGU6Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgIHRocmVhZExvb3AoKTsKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgbVNROwogCisgICAgLy8gY2FsbG91dHMKKyAgICB2aXJ0dWFsIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcG9sbCgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25JZGxlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpOworICAgIHZpcnR1YWwgYm9vbCBpc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCk7CisgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CisKKyAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMgYW5kIHRvIGJlIHJlbmFtZWQgdG8gaGF2ZSAibSIgcHJlZml4CisgICAgc3RhdGljIGNvbnN0IEZhc3RNaXhlclN0YXRlIGluaXRpYWw7CisgICAgRmFzdE1peGVyU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICBsb25nIHNsb3BOczsgICAgICAgIC8vIGFjY3VtdWxhdGVkIHRpbWUgd2UndmUgd29rZW4gdXAgdG9vIGVhcmx5ICg+IDApIG9yIHRvbyBsYXRlICg8IDApCisgICAgaW50IGZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107IC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKKyAgICBpbnQgZ2VuZXJhdGlvbnNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgICAgLy8gbGFzdCBvYnNlcnZlZCBtRmFzdFRyYWNrc1tpXS5tR2VuZXJhdGlvbgorICAgIE5CQUlPX1NpbmsgKm91dHB1dFNpbms7CisgICAgaW50IG91dHB1dFNpbmtHZW47CisgICAgQXVkaW9NaXhlciogbWl4ZXI7CisKKyAgICAvLyBtU2lua0J1ZmZlciBhdWRpbyBmb3JtYXQgaXMgc3RvcmVkIGluIGZvcm1hdC5tRm9ybWF0LgorICAgIHZvaWQqIG1TaW5rQnVmZmVyOyAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1peGVyIG91dHB1dCBmb3JtYXQgdHJhbnNsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzaW5rIGZvcm1hdCBpcyBkaWZmZXJlbnQgdGhhbiBtaXhlciBvdXRwdXQuCisgICAgc2l6ZV90IG1TaW5rQnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtU2lua0NoYW5uZWxDb3VudDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOworICAgIHZvaWQqIG1NaXhlckJ1ZmZlcjsgICAgICAgICAgICAgICAgIC8vIG1peGVyIG91dHB1dCBidWZmZXIuCisgICAgc2l6ZV90IG1NaXhlckJ1ZmZlclNpemU7CisgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVyQnVmZmVyRm9ybWF0OyAgLy8gbWl4ZXIgb3V0cHV0IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oMTZfQklUfEZMT0FUKS4KKworICAgIGVudW0ge1VOREVGSU5FRCwgTUlYRUQsIFpFUk9FRH0gbU1peGVyQnVmZmVyU3RhdGU7CisgICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlOworICAgIGludCBmYXN0VHJhY2tzR2VuOworICAgIEZhc3RNaXhlckR1bXBTdGF0ZSBkdW1teUR1bXBTdGF0ZTsKKyAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47ICAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbgorCisgICAgLy8gbmV4dCAyIGZpZWxkcyBhcmUgdmFsaWQgb25seSB3aGVuIHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUgorICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKKyAgICB1aW50MzJfdCBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworCiB9OyAgLy8gY2xhc3MgRmFzdE1peGVyCiAKLS8vIERlc2NyaWJlcyB0aGUgdW5kZXJydW4gc3RhdHVzIGZvciBhIHNpbmdsZSAicHVsbCIgYXR0ZW1wdAotZW51bSBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyB7Ci0gICAgVU5ERVJSVU5fRlVMTCwgICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQsIG5vIHVuZGVycnVuCi0gICAgVU5ERVJSVU5fUEFSVElBTCwgICAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQsIHBhcnRpYWwgdW5kZXJydW4KLSAgICBVTkRFUlJVTl9FTVBUWSwgICAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybywgdG90YWwgdW5kZXJydW4KLX07Ci0KLS8vIFVuZGVycnVuIGNvdW50ZXJzIGFyZSBub3QgcmVzZXQgdG8gemVybyBmb3IgbmV3IHRyYWNrcyBvciBpZiB0cmFjayBnZW5lcmF0aW9uIGNoYW5nZXMuCi0vLyBUaGlzIHBhY2tlZCByZXByZXNlbnRhdGlvbiBpcyB1c2VkIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGF0b21pYy4KLXVuaW9uIEZhc3RUcmFja1VuZGVycnVucyB7Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zKCkgeyBtQXRvbWljID0gMDsKLSAgICAgICAgICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoc2l6ZW9mKEZhc3RUcmFja1VuZGVycnVucykgPT0gc2l6ZW9mKHVpbnQzMl90KSk7IH0KLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMoY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiBjb3B5RnJvbSkgOiBtQXRvbWljKGNvcHlGcm9tLm1BdG9taWMpIHsgfQotICAgIEZhc3RUcmFja1VuZGVycnVucyYgb3BlcmF0b3I9KGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgcmhzKQotICAgICAgICAgICAgeyBpZiAodGhpcyAhPSAmcmhzKSBtQXRvbWljID0gcmhzLm1BdG9taWM7IHJldHVybiAqdGhpczsgfQotICAgIHN0cnVjdCB7Ci0jZGVmaW5lIFVOREVSUlVOX0JJVFMgMTAKLSNkZWZpbmUgVU5ERVJSVU5fTUFTSyAoKDEgPDwgVU5ERVJSVU5fQklUUykgLSAxKQotICAgICAgICB1aW50MzJfdCBtRnVsbCAgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgZnVsbCBmcmFtZSBjb3VudAotICAgICAgICB1aW50MzJfdCBtUGFydGlhbCA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgbm9uLXplcm8gYnV0IDwgZnVsbCBmcmFtZSBjb3VudAotICAgICAgICB1aW50MzJfdCBtRW1wdHkgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybwotICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyBtTW9zdFJlY2VudCA6IDI7ICAgIC8vIHN0YXR1cyBvZiBtb3N0IHJlY2VudCBmcmFtZXNSZWFkeSgpCi0gICAgfSAgICAgICAgbUJpdEZpZWxkczsKLXByaXZhdGU6Ci0gICAgdWludDMyX3QgbUF0b21pYzsKLX07Ci0KLS8vIFJlcHJlc2VudHMgdGhlIGR1bXAgc3RhdGUgb2YgYSBmYXN0IHRyYWNrCi1zdHJ1Y3QgRmFzdFRyYWNrRHVtcCB7Ci0gICAgRmFzdFRyYWNrRHVtcCgpIDogbUZyYW1lc1JlYWR5KDApIHsgfQotICAgIC8qdmlydHVhbCovIH5GYXN0VHJhY2tEdW1wKCkgeyB9Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zIG1VbmRlcnJ1bnM7Ci0gICAgc2l6ZV90IG1GcmFtZXNSZWFkeTsgICAgICAgIC8vIG1vc3QgcmVjZW50IHZhbHVlIG9ubHk7IG5vIGxvbmctdGVybSBzdGF0aXN0aWNzIGtlcHQKLX07Ci0KLS8vIFRoZSBGYXN0TWl4ZXJEdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0TWl4ZXIgc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBsb2dnZWQgYnkgZHVtcHN5cy4KLS8vIEVhY2ggaW5kaXZpZHVhbCBuYXRpdmUgd29yZC1zaXplZCBmaWVsZCBpcyBhY2Nlc3NlZCBhdG9taWNhbGx5LiAgQnV0IHRoZQotLy8gb3ZlcmFsbCBzdHJ1Y3R1cmUgaXMgbm9uLWF0b21pYywgdGhhdCBpcyB0aGVyZSBtYXkgYmUgYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGZpZWxkcy4KLS8vIE5vIGJhcnJpZXJzIG9yIGxvY2tzIGFyZSB1c2VkIGZvciBlaXRoZXIgd3JpdGluZyBvciByZWFkaW5nLgotLy8gT25seSBQT0QgdHlwZXMgYXJlIHBlcm1pdHRlZCwgYW5kIHRoZSBjb250ZW50cyBzaG91bGRuJ3QgYmUgdHJ1c3RlZCAoaS5lLiBkbyByYW5nZSBjaGVja3MpLgotLy8gSXQgaGFzIGEgZGlmZmVyZW50IGxpZmV0aW1lIHRoYW4gdGhlIEZhc3RNaXhlciwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RNaXhlci4KLXN0cnVjdCBGYXN0TWl4ZXJEdW1wU3RhdGUgewotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSgKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nTiA9IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UKLSNlbmRpZgotICAgICAgICAgICAgKTsKLSAgICAvKnZpcnR1YWwqLyB+RmFzdE1peGVyRHVtcFN0YXRlKCk7Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc3RhYmxlIGNvcHksIG5vdCB0aGUgb3JpZ2luYWwKLQotICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIG1Db21tYW5kOyAgIC8vIGN1cnJlbnQgY29tbWFuZAotICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQotICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5Ci0gICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKLSAgICB1aW50MzJfdCBtV3JpdGVFcnJvcnM7ICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHdyaXRlKCkgZXJyb3JzCi0gICAgdWludDMyX3QgbVVuZGVycnVuczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmRlcnJ1bnMKLSAgICB1aW50MzJfdCBtT3ZlcnJ1bnM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIG92ZXJydW5zCi0gICAgdWludDMyX3QgbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7Ci0gICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gbWVhc3VyZWQgd2FybXVwIHRpbWUKLSAgICB1aW50MzJfdCBtV2FybXVwQ3ljbGVzOyAgICAgLy8gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAotICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKLSAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOwotCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gUmVjZW50bHkgY29sbGVjdGVkIHNhbXBsZXMgb2YgcGVyLWN5Y2xlIG1vbm90b25pYyB0aW1lLCB0aHJlYWQgQ1BVIHRpbWUsIGFuZCBDUFUgZnJlcXVlbmN5LgotICAgIC8vIGtTYW1wbGluZ04gaXMgbWF4IHNpemUgb2Ygc2FtcGxpbmcgZnJhbWUgKHN0YXRpc3RpY3MpLCBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0gMHg4MDAwLgotICAgIC8vIFRoZSBzYW1wbGUgYXJyYXlzIGFyZSB2aXJ0dWFsbHkgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgY29tcGlsZS10aW1lIGNvbnN0YW50LAotICAgIC8vIGJ1dCBhcmUgb25seSBpbml0aWFsaXplZCBhbmQgdXNlZCBiYXNlZCBvbiB0aGUgcnVudGltZSBwYXJhbWV0ZXIgbVNhbXBsaW5nTi4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTiA9IDB4ODAwMDsKLSAgICAvLyBDb21waWxlLXRpbWUgY29uc3RhbnQgZm9yIGEgImxvdyBSQU0gZGV2aWNlIiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KLSAgICAvLyBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gc3VjaCB0aGF0IGVhY2ggYXJyYXkgdXNlcyAxIHNtYWxsIHBhZ2UgKDQgS2J5dGVzKS4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA9IDB4NDAwOwotICAgIC8vIENvcnJlc3BvbmRpbmcgcnVudGltZSBtYXhpbXVtIHNpemUgb2Ygc2FtcGxlIGFycmF5cywgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KLSAgICB1aW50MzJfdCBtU2FtcGxpbmdOOwotICAgIC8vIFRoZSBib3VuZHMgZGVmaW5lIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzLCBhbmQgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6Ci0gICAgLy8gICAgICBuZXdlc3Qgb3BlbiAoZXhjbHVkZWQpIGVuZHBvaW50ICAgPSBsb3dlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KLSAgICAvLyAgICAgIG9sZGVzdCBjbG9zZWQgKGluY2x1ZGVkKSBlbmRwb2ludCA9IHVwcGVyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgotICAgIC8vIE51bWJlciBvZiB2YWxpZCBzYW1wbGVzIGlzIG5ld2VzdCAtIG9sZGVzdC4KLSAgICB1aW50MzJfdCBtQm91bmRzOyAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgZm9yIG1Nb25vdG9uaWNOcywgbVRocmVhZENwdU5zLCBhbmQgbUNwdWtIegotICAgIC8vIFRoZSBlbGVtZW50cyBpbiB0aGUgKk5zIGFycmF5cyBhcmUgaW4gdW5pdHMgb2YgbmFub3NlY29uZHMgPD0gMzk5OTk5OTk5OS4KLSAgICB1aW50MzJfdCBtTW9ub3RvbmljTnNba1NhbXBsaW5nTl07ICAvLyBkZWx0YSBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUKLSAgICB1aW50MzJfdCBtTG9hZE5zW2tTYW1wbGluZ05dOyAgICAgICAvLyBkZWx0YSBDUFUgbG9hZCBpbiB0aW1lCi0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgdWludDMyX3QgbUNwdWtIeltrU2FtcGxpbmdOXTsgICAgICAgLy8gYWJzb2x1dGUgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHosIGJpdHMgMC0zIGFyZSBDUFUjCi0jZW5kaWYKLSAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCi0gICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOwotI2VuZGlmCi19OwotCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMWU0NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0RVTVBfU1RBVEVfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIERlc2NyaWJlcyB0aGUgdW5kZXJydW4gc3RhdHVzIGZvciBhIHNpbmdsZSAicHVsbCIgYXR0ZW1wdAorZW51bSBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyB7CisgICAgVU5ERVJSVU5fRlVMTCwgICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQsIG5vIHVuZGVycnVuCisgICAgVU5ERVJSVU5fUEFSVElBTCwgICAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQsIHBhcnRpYWwgdW5kZXJydW4KKyAgICBVTkRFUlJVTl9FTVBUWSwgICAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybywgdG90YWwgdW5kZXJydW4KK307CisKKy8vIFVuZGVycnVuIGNvdW50ZXJzIGFyZSBub3QgcmVzZXQgdG8gemVybyBmb3IgbmV3IHRyYWNrcyBvciBpZiB0cmFjayBnZW5lcmF0aW9uIGNoYW5nZXMuCisvLyBUaGlzIHBhY2tlZCByZXByZXNlbnRhdGlvbiBpcyB1c2VkIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGF0b21pYy4KK3VuaW9uIEZhc3RUcmFja1VuZGVycnVucyB7CisgICAgRmFzdFRyYWNrVW5kZXJydW5zKCkgeyBtQXRvbWljID0gMDsKKyAgICAgICAgICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoc2l6ZW9mKEZhc3RUcmFja1VuZGVycnVucykgPT0gc2l6ZW9mKHVpbnQzMl90KSk7IH0KKyAgICBGYXN0VHJhY2tVbmRlcnJ1bnMoY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiBjb3B5RnJvbSkgOiBtQXRvbWljKGNvcHlGcm9tLm1BdG9taWMpIHsgfQorICAgIEZhc3RUcmFja1VuZGVycnVucyYgb3BlcmF0b3I9KGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgcmhzKQorICAgICAgICAgICAgeyBpZiAodGhpcyAhPSAmcmhzKSBtQXRvbWljID0gcmhzLm1BdG9taWM7IHJldHVybiAqdGhpczsgfQorICAgIHN0cnVjdCB7CisjZGVmaW5lIFVOREVSUlVOX0JJVFMgMTAKKyNkZWZpbmUgVU5ERVJSVU5fTUFTSyAoKDEgPDwgVU5ERVJSVU5fQklUUykgLSAxKQorICAgICAgICB1aW50MzJfdCBtRnVsbCAgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgZnVsbCBmcmFtZSBjb3VudAorICAgICAgICB1aW50MzJfdCBtUGFydGlhbCA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgbm9uLXplcm8gYnV0IDwgZnVsbCBmcmFtZSBjb3VudAorICAgICAgICB1aW50MzJfdCBtRW1wdHkgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybworICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyBtTW9zdFJlY2VudCA6IDI7ICAgIC8vIHN0YXR1cyBvZiBtb3N0IHJlY2VudCBmcmFtZXNSZWFkeSgpCisgICAgfSAgICAgICAgbUJpdEZpZWxkczsKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUF0b21pYzsKK307CisKKy8vIFJlcHJlc2VudHMgdGhlIGR1bXAgc3RhdGUgb2YgYSBmYXN0IHRyYWNrCitzdHJ1Y3QgRmFzdFRyYWNrRHVtcCB7CisgICAgRmFzdFRyYWNrRHVtcCgpIDogbUZyYW1lc1JlYWR5KDApIHsgfQorICAgIC8qdmlydHVhbCovIH5GYXN0VHJhY2tEdW1wKCkgeyB9CisgICAgRmFzdFRyYWNrVW5kZXJydW5zIG1VbmRlcnJ1bnM7CisgICAgc2l6ZV90IG1GcmFtZXNSZWFkeTsgICAgICAgIC8vIG1vc3QgcmVjZW50IHZhbHVlIG9ubHk7IG5vIGxvbmctdGVybSBzdGF0aXN0aWNzIGtlcHQKK307CisKKy8vIFRoZSBGYXN0TWl4ZXJEdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0TWl4ZXIgc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBsb2dnZWQgYnkgZHVtcHN5cy4KKy8vIEVhY2ggaW5kaXZpZHVhbCBuYXRpdmUgd29yZC1zaXplZCBmaWVsZCBpcyBhY2Nlc3NlZCBhdG9taWNhbGx5LiAgQnV0IHRoZQorLy8gb3ZlcmFsbCBzdHJ1Y3R1cmUgaXMgbm9uLWF0b21pYywgdGhhdCBpcyB0aGVyZSBtYXkgYmUgYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGZpZWxkcy4KKy8vIE5vIGJhcnJpZXJzIG9yIGxvY2tzIGFyZSB1c2VkIGZvciBlaXRoZXIgd3JpdGluZyBvciByZWFkaW5nLgorLy8gT25seSBQT0QgdHlwZXMgYXJlIHBlcm1pdHRlZCwgYW5kIHRoZSBjb250ZW50cyBzaG91bGRuJ3QgYmUgdHJ1c3RlZCAoaS5lLiBkbyByYW5nZSBjaGVja3MpLgorLy8gSXQgaGFzIGEgZGlmZmVyZW50IGxpZmV0aW1lIHRoYW4gdGhlIEZhc3RNaXhlciwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RNaXhlci4KK3N0cnVjdCBGYXN0TWl4ZXJEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUoCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04gPSBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlCisjZW5kaWYKKyAgICAgICAgICAgICk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlckR1bXBTdGF0ZSgpOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCisKKyAgICB1aW50MzJfdCBtV3JpdGVTZXF1ZW5jZTsgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHdyaXRlKCkKKyAgICB1aW50MzJfdCBtRnJhbWVzV3JpdHRlbjsgICAgLy8gdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB3cml0dGVuIHN1Y2Nlc3NmdWxseQorICAgIHVpbnQzMl90IG1OdW1UcmFja3M7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIGZhc3QgdHJhY2tzCisgICAgdWludDMyX3QgbVdyaXRlRXJyb3JzOyAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB3cml0ZSgpIGVycm9ycworICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OworICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKKyAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOworCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCisgICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKKyAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCisgICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOworI2VuZGlmCit9OworCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCmluZGV4IDczN2RlOTcuLjNhYThkYWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcApAQCAtMTQsMTQgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRmFzdFRyYWNrOjpGYXN0VHJhY2soKSA6Ci0gICAgbUJ1ZmZlclByb3ZpZGVyKE5VTEwpLCBtVm9sdW1lUHJvdmlkZXIoTlVMTCksIG1TYW1wbGVSYXRlKDApLAotICAgIG1DaGFubmVsTWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLCBtR2VuZXJhdGlvbigwKQorICAgIG1CdWZmZXJQcm92aWRlcihOVUxMKSwgbVZvbHVtZVByb3ZpZGVyKE5VTEwpLAorICAgIG1DaGFubmVsTWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLCBtRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwgbUdlbmVyYXRpb24oMCkKIHsKIH0KIApAQCAtMjksMTAgKzI4LDEwIEBACiB7CiB9CiAKLUZhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDoKK0Zhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCisgICAgLy8gbUZhc3RUcmFja3MKICAgICBtRmFzdFRyYWNrc0dlbigwKSwgbVRyYWNrTWFzaygwKSwgbU91dHB1dFNpbmsoTlVMTCksIG1PdXRwdXRTaW5rR2VuKDApLAotICAgIG1GcmFtZUNvdW50KDApLCBtQ29tbWFuZChJTklUSUFMKSwgbUNvbGRGdXRleEFkZHIoTlVMTCksIG1Db2xkR2VuKDApLAotICAgIG1EdW1wU3RhdGUoTlVMTCksIG1UZWVTaW5rKE5VTEwpLCBtTkJMb2dXcml0ZXIoTlVMTCkKKyAgICBtRnJhbWVDb3VudCgwKSwgbVRlZVNpbmsoTlVMTCkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAppbmRleCBmNmU3OTAzLi42NjFjOWNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaApAQCAtMTcsMTAgKzE3LDEyIEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9TVEFURV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9TVEFURV9ICiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjgsOSArMzAsOCBAQAogCiBjbGFzcyBWb2x1bWVQcm92aWRlciB7CiBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSB0cmFjayB2b2x1bWUgaW4gVTRfMTIgZm9ybWF0OiBsZWZ0IGluIGxvd2VyIGhhbGYsIHJpZ2h0IGluIHVwcGVyIGhhbGYuIFRoZQotICAgIC8vIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW5nIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBpbiByYW5nZS4KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFZvbHVtZUxSKCkgPSAwOworICAgIC8vIFRoZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdmFsaWRhdGluZyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gcmFuZ2UuCisgICAgdmlydHVhbCBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCBnZXRWb2x1bWVMUigpID0gMDsKIHByb3RlY3RlZDoKICAgICBWb2x1bWVQcm92aWRlcigpIHsgfQogICAgIHZpcnR1YWwgflZvbHVtZVByb3ZpZGVyKCkgeyB9CkBAIC00MywxMyArNDQsMTMgQEAKIAogICAgIEV4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlciogbUJ1ZmZlclByb3ZpZGVyOyAvLyBtdXN0IGJlIE5VTEwgaWYgaW5hY3RpdmUsIG9yIG5vbi1OVUxMIGlmIGFjdGl2ZQogICAgIFZvbHVtZVByb3ZpZGVyKiAgICAgICAgIG1Wb2x1bWVQcm92aWRlcjsgLy8gb3B0aW9uYWw7IGlmIE5VTEwgdGhlbiBmdWxsLXNjYWxlCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7ICAgICAvLyBvcHRpb25hbDsgaWYgemVybyB0aGVuIHVzZSBtaXhlciBzYW1wbGUgcmF0ZQogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBvciBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OyAgICAgICAgIC8vIHRyYWNrIGZvcm1hdAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uOyAgICAgLy8gaW5jcmVtZW50IHdoZW4gYW55IGZpZWxkIGlzIGFzc2lnbmVkCiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCi1zdHJ1Y3QgRmFzdE1peGVyU3RhdGUgeworc3RydWN0IEZhc3RNaXhlclN0YXRlIDogRmFzdFRocmVhZFN0YXRlIHsKICAgICAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZSgpOwogICAgIC8qdmlydHVhbCovIH5GYXN0TWl4ZXJTdGF0ZSgpOwogCkBAIC02MiwyMyArNjMsMTYgQEAKICAgICBOQkFJT19TaW5rKiBtT3V0cHV0U2luazsgICAgLy8gSEFMIG91dHB1dCBkZXZpY2UsIG11c3QgYWxyZWFkeSBiZSBuZWdvdGlhdGVkCiAgICAgaW50ICAgICAgICAgbU91dHB1dFNpbmtHZW47IC8vIGluY3JlbWVudCB3aGVuIG1PdXRwdXRTaW5rIGlzIGFzc2lnbmVkCiAgICAgc2l6ZV90ICAgICAgbUZyYW1lQ291bnQ7ICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgbWl4IGJ1ZmZlcgotICAgIGVudW0gQ29tbWFuZCB7Ci0gICAgICAgIElOSVRJQUwgPSAwLCAgICAgICAgICAgIC8vIHVzZWQgb25seSBmb3IgdGhlIGluaXRpYWwgc3RhdGUKLSAgICAgICAgSE9UX0lETEUgPSAxLCAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICBDT0xEX0lETEUgPSAyLCAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgZnV0ZXgKLSAgICAgICAgSURMRSA9IDMsICAgICAgICAgICAgICAgLy8gZWl0aGVyIEhPVF9JRExFIG9yIENPTERfSURMRQotICAgICAgICBFWElUID0gNCwgICAgICAgICAgICAgICAvLyBleGl0IGZyb20gdGhyZWFkCisKKyAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAorICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CiAgICAgICAgIE1JWCA9IDB4OCwgICAgICAgICAgICAgIC8vIG1peCB0cmFja3MKICAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gb3V0cHV0IHNpbmsKLSAgICAgICAgTUlYX1dSSVRFID0gMHgxOCwgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKLSAgICB9IG1Db21tYW5kOwotICAgIGludDMyX3QqICAgIG1Db2xkRnV0ZXhBZGRyOyAvLyBmb3IgQ09MRF9JRExFIG9ubHksIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgZnV0ZXgKLSAgICB1bnNpZ25lZCAgICBtQ29sZEdlbjsgICAgICAgLy8gaW5jcmVtZW50IHdoZW4gQ09MRF9JRExFIGlzIHJlcXVlc3RlZCBzbyBpdCdzIG9ubHkgcGVyZm9ybWVkIG9uY2UKKyAgICAgICAgTUlYX1dSSVRFID0gMHgxODsgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKKwogICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBvbmUtdGltZSBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHBlci1zdGF0ZQotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSogbUR1bXBTdGF0ZTsgLy8gaWYgbm9uLU5VTEwsIHRoZW4gdXBkYXRlIGR1bXAgc3RhdGUgcGVyaW9kaWNhbGx5CiAgICAgTkJBSU9fU2luayogbVRlZVNpbms7ICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpcyB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCi0gICAgTkJMb2c6OldyaXRlciogbU5CTG9nV3JpdGVyOyAvLyBub24tYmxvY2tpbmcgbG9nZ2VyCiB9OyAgLy8gc3RydWN0IEZhc3RNaXhlclN0YXRlCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNmRhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkZhc3RUaHJlYWQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgorCisjZGVmaW5lIEZBU1RfREVGQVVMVF9OUyAgICA5OTk5OTk5OTlMICAgLy8gfjEgc2VjOiBkZWZhdWx0IHRpbWUgdG8gc2xlZXAKKyNkZWZpbmUgRkFTVF9IT1RfSURMRV9OUyAgICAgMTAwMDAwMEwgICAvLyAxIG1zOiB0aW1lIHRvIHNsZWVwIHdoaWxlIGhvdCBpZGxpbmcKKyNkZWZpbmUgTUlOX1dBUk1VUF9DWUNMRVMgICAgICAgICAgMiAgICAvLyBtaW5pbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKKyNkZWZpbmUgTUFYX1dBUk1VUF9DWUNMRVMgICAgICAgICAxMCAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitGYXN0VGhyZWFkOjpGYXN0VGhyZWFkKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKKyAgICAvLyByZS1pbml0aWFsaXplZCB0byAmaW5pdGlhbCBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcgorICAgICBwcmV2aW91cyhOVUxMKSwgY3VycmVudChOVUxMKSwKKyAgICAvKiBvbGRUcyh7MCwgMH0pLCAqLworICAgIG9sZFRzVmFsaWQoZmFsc2UpLAorICAgIHNsZWVwTnMoLTEpLAorICAgIHBlcmlvZE5zKDApLAorICAgIHVuZGVycnVuTnMoMCksCisgICAgb3ZlcnJ1bk5zKDApLAorICAgIGZvcmNlTnMoMCksCisgICAgd2FybXVwTnMoMCksCisgICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJmR1bW15RHVtcFN0YXRlIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgICAgbUR1bW15RHVtcFN0YXRlKE5VTEwpLAorICAgIGR1bXBTdGF0ZShOVUxMKSwKKyAgICBpZ25vcmVOZXh0T3ZlcnJ1bih0cnVlKSwKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAvLyBvbGRMb2FkCisgICAgb2xkTG9hZFZhbGlkKGZhbHNlKSwKKyAgICBib3VuZHMoMCksCisgICAgZnVsbChmYWxzZSksCisgICAgLy8gdGN1CisjZW5kaWYKKyAgICBjb2xkR2VuKDApLAorICAgIGlzV2FybShmYWxzZSksCisgICAgLyogbWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLworICAgIHdhcm11cEN5Y2xlcygwKSwKKyAgICAvLyBkdW1teUxvZ1dyaXRlcgorICAgIGxvZ1dyaXRlcigmZHVtbXlMb2dXcml0ZXIpLAorICAgIHRpbWVzdGFtcFN0YXR1cyhJTlZBTElEX09QRVJBVElPTiksCisKKyAgICBjb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCisjaWYgMAorICAgIGZyYW1lQ291bnQoMCksCisjZW5kaWYKKyAgICBhdHRlbXB0ZWRXcml0ZShmYWxzZSkKK3sKKyAgICBvbGRUcy50dl9zZWMgPSAwOworICAgIG9sZFRzLnR2X25zZWMgPSAwOworICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKKyAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworfQorCitGYXN0VGhyZWFkOjp+RmFzdFRocmVhZCgpCit7Cit9CisKK2Jvb2wgRmFzdFRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgZm9yICg7OykgeworCisgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKKyAgICAgICAgaWYgKHNsZWVwTnMgPj0gMCkgeworICAgICAgICAgICAgaWYgKHNsZWVwTnMgPiAwKSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoc2xlZXBOcyA8IDEwMDAwMDAwMDApOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgc2xlZXBOc307CisgICAgICAgICAgICAgICAgbmFub3NsZWVwKCZyZXEsIE5VTEwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY2hlZF95aWVsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRlZmF1bHQgdG8gbG9uZyBzbGVlcCBmb3IgbmV4dCBjeWNsZQorICAgICAgICBzbGVlcE5zID0gRkFTVF9ERUZBVUxUX05TOworCisgICAgICAgIC8vIHBvbGwgZm9yIHN0YXRlIGNoYW5nZQorICAgICAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKm5leHQgPSBwb2xsKCk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIHVudGlsIGEgcmVhbCBzdGF0ZSBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIC8vIEZJWE1FICZpbml0aWFsIG5vdCBhdmFpbGFibGUsIHNob3VsZCBzYXZlIGFkZHJlc3MgZWFybGllcgorICAgICAgICAgICAgLy9BTE9HX0FTU0VSVChjdXJyZW50ID09ICZpbml0aWFsICYmIHByZXZpb3VzID09ICZpbml0aWFsKTsKKyAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OworICAgICAgICB9CisKKyAgICAgICAgY29tbWFuZCA9IG5leHQtPm1Db21tYW5kOworICAgICAgICBpZiAobmV4dCAhPSBjdXJyZW50KSB7CisKKyAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAorICAgICAgICAgICAgZHVtcFN0YXRlID0gbmV4dC0+bUR1bXBTdGF0ZSAhPSBOVUxMID8gbmV4dC0+bUR1bXBTdGF0ZSA6IG1EdW1teUR1bXBTdGF0ZTsKKyAgICAgICAgICAgIGxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8gbmV4dC0+bU5CTG9nV3JpdGVyIDogJmR1bW15TG9nV3JpdGVyOworICAgICAgICAgICAgc2V0TG9nKGxvZ1dyaXRlcik7CisKKyAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYWx3YXlzIGhhdmUgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIChub24taWRsZSkgc3RhdGUuCisgICAgICAgICAgICAvLyBIb3dldmVyLCB0aGUgc3RhdGUgcXVldWUgb25seSBndWFyYW50ZWVzIGFjY2VzcyB0byBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGF0ZXMuCisgICAgICAgICAgICAvLyBTbyB3aGVuIHRoZXJlIGlzIGEgdHJhbnNpdGlvbiBmcm9tIGEgbm9uLWlkbGUgc3RhdGUgaW50byBhbiBpZGxlIHN0YXRlLCB3ZSBtYWtlIGEKKyAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGxhc3Qga25vd24gbm9uLWlkbGUgc3RhdGUgc28gaXQgaXMgc3RpbGwgYXZhaWxhYmxlIG9uIHJldHVybiBmcm9tIGlkbGUuCisgICAgICAgICAgICAvLyBUaGUgcG9zc2libGUgdHJhbnNpdGlvbnMgYXJlOgorICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IG5vbi1pZGxlICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGN1cnJlbnQgaW4tcGxhY2UKKyAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBpZGxlICAgICAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjb3B5IG9mIGN1cnJlbnQKKyAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBpZGxlICAgICAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBub24taWRsZSAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKKyAgICAgICAgICAgIGlmICghKGN1cnJlbnQtPm1Db21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSB7CisgICAgICAgICAgICAgICAgICAgIG9uSWRsZSgpOworICAgICAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7CisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IGZhbHNlOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgICAgIH0KKyNpZiAhTE9HX05ERUJVRworICAgICAgICBuZXh0ID0gTlVMTDsgICAgLy8gbm90IHJlZmVyZW5jZWQgYWdhaW4KKyNlbmRpZgorCisgICAgICAgIGR1bXBTdGF0ZS0+bUNvbW1hbmQgPSBjb21tYW5kOworCisgICAgICAgIC8vIDw8IGN1cnJlbnQsIHByZXZpb3VzLCBjb21tYW5kLCBkdW1wU3RhdGUgPj4KKworICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUw6CisgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpIT1RfSURMRToKKyAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpDT0xEX0lETEU6CisgICAgICAgICAgICAvLyBvbmx5IHBlcmZvcm0gYSBjb2xkIGlkbGUgY29tbWFuZCBvbmNlCisgICAgICAgICAgICAvLyBGSVhNRSBjb25zaWRlciBjaGVja2luZyBwcmV2aW91cyBzdGF0ZSBhbmQgb25seSBwZXJmb3JtIGlmIHByZXZpb3VzICE9IENPTERfSURMRQorICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1Db2xkR2VuICE9IGNvbGRHZW4pIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90ICpjb2xkRnV0ZXhBZGRyID0gY3VycmVudC0+bUNvbGRGdXRleEFkZHI7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoY29sZEZ1dGV4QWRkciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2RlYyhjb2xkRnV0ZXhBZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3lzY2FsbChfX05SX2Z1dGV4LCBjb2xkRnV0ZXhBZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIG9sZCAtIDEsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgcG9saWN5ID0gc2NoZWRfZ2V0c2NoZWR1bGVyKDApOworICAgICAgICAgICAgICAgIGlmICghKHBvbGljeSA9PSBTQ0hFRF9GSUZPIHx8IHBvbGljeSA9PSBTQ0hFRF9SUikpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBvdmVybHkgY29uc2VydmF0aXZlOyB0aGVyZSBjb3VsZCBiZSB0aW1lcyB0aGF0IHRoZSBub3JtYWwgbWl4ZXIKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cyBzdWNoIGEgYnJpZWYgY29sZCBpZGxlIHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIHJlc2V0dGluZyB0aGlzIGZsYWcuCisgICAgICAgICAgICAgICAgaXNXYXJtID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7CisgICAgICAgICAgICAgICAgd2FybXVwQ3ljbGVzID0gMDsKKyAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7CisgICAgICAgICAgICAgICAgY29sZEdlbiA9IGN1cnJlbnQtPm1Db2xkR2VuOworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgICAgIGJvdW5kcyA9IDA7CisgICAgICAgICAgICAgICAgZnVsbCA9IGZhbHNlOworI2VuZGlmCisgICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9ICFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm9sZFRzKTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OkVYSVQ6CisgICAgICAgICAgICBvbkV4aXQoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWlzU3ViQ2xhc3NDb21tYW5kKGNvbW1hbmQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlcmUgaXMgYSBub24taWRsZSBzdGF0ZSBhdmFpbGFibGUgdG8gdXM7IGRpZCB0aGUgc3RhdGUgY2hhbmdlPworICAgICAgICBpZiAoY3VycmVudCAhPSBwcmV2aW91cykgeworICAgICAgICAgICAgb25TdGF0ZUNoYW5nZSgpOworI2lmIDEgICAvLyBGSVhNRSBzaG91bGRuJ3QgbmVlZCB0aGlzCisgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3Mgc3RhdGUgY2hhbmdlIG9uY2UKKyAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLy8gZG8gd29yayB1c2luZyBjdXJyZW50IHN0YXRlIGhlcmUKKyAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKKyAgICAgICAgb25Xb3JrKCk7CisKKyAgICAgICAgLy8gVG8gYmUgZXhhY3RseSBwZXJpb2RpYywgY29tcHV0ZSB0aGUgbmV4dCBzbGVlcCB0aW1lIGJhc2VkIG9uIGN1cnJlbnQgdGltZS4KKyAgICAgICAgLy8gVGhpcyBjb2RlIGRvZXNuJ3QgaGF2ZSBsb25nLXRlcm0gc3RhYmlsaXR5IHdoZW4gdGhlIHNpbmsgaXMgbm9uLWJsb2NraW5nLgorICAgICAgICAvLyBGSVhNRSBUbyBhdm9pZCBkcmlmdCwgdXNlIHRoZSBsb2NhbCBhdWRpbyBjbG9jayBvciB3YXRjaCB0aGUgc2luaydzIGZpbGwgc3RhdHVzLgorICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3VHM7CisgICAgICAgIGludCByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbmV3VHMpOworICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgLy9sb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7CisgICAgICAgICAgICBpZiAob2xkVHNWYWxpZCkgeworICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBuZXdUcy50dl9zZWMgLSBvbGRUcy50dl9zZWM7CisgICAgICAgICAgICAgICAgbG9uZyBuc2VjID0gbmV3VHMudHZfbnNlYyAtIG9sZFRzLnR2X25zZWM7CisgICAgICAgICAgICAgICAgQUxPR0VfSUYoc2VjIDwgMCB8fCAoc2VjID09IDAgJiYgbnNlYyA8IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgImNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBmYWlsZWQ6IHdhcyAlbGQuJTA5bGQgYnV0IG5vdyAlbGQuJTA5bGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb2xkVHMudHZfc2VjLCBvbGRUcy50dl9uc2VjLCBuZXdUcy50dl9zZWMsIG5ld1RzLnR2X25zZWMpOworICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAtLXNlYzsKKyAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBhbiBpbml0aWFsIHVuZGVycnVuIG9uIGZhc3QgdHJhY2tzIGFmdGVyIGV4aXRpbmcgc3RhbmRieSwKKyAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc3RhcnQgcHVsbGluZyBkYXRhIGZyb20gdHJhY2tzIGFuZCBtaXhpbmcgdW50aWwgd2FybXVwIGlzIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgIC8vIFdhcm11cCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlIGFmdGVyIHRoZSBlYXJsaWVyIG9mOgorICAgICAgICAgICAgICAgIC8vICAgICAgTUlOX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cyBhbmQgbGFzdCBvbmUgYmxvY2tzIGZvciBhdCBsZWFzdCB3YXJtdXBOcworICAgICAgICAgICAgICAgIC8vICAgICAgTUFYX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cy4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUsIGJ1dCB0byBnZXQgYmV0dGVyIGFjY3VyYWN5IHJlcXVpcmVzIGEgbmV3IEhBTCBBUEkuCisgICAgICAgICAgICAgICAgaWYgKCFpc1dhcm0gJiYgYXR0ZW1wdGVkV3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKz0gc2VjOworICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKz0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYysrOworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC09IDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKyt3YXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgIGlmICgobnNlYyA+IHdhcm11cE5zICYmIHdhcm11cEN5Y2xlcyA+PSBNSU5fV0FSTVVQX0NZQ0xFUykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FybXVwQ3ljbGVzID49IE1BWF9XQVJNVVBfQ1lDTEVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtZWFzdXJlZFdhcm11cFRzOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gd2FybXVwQ3ljbGVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwIHx8IG5zZWMgPiB1bmRlcnJ1bk5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuZGVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVW5kZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG92ZXJydW5OcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU5leHRPdmVycnVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU92ZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSB3b3JrcyB3aXRoIGEgdmFyaWFibGUgYnVmZmVyIGRlcHRoIGF1ZGlvIEhBTCB0aGF0IG5ldmVyIHB1bGxzIGF0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJhdGUgPCB0aGFuIG92ZXJydW5OcyBwZXIgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gcmVjb3ZlcnMgZnJvbSBvdmVycnVuIGltbWVkaWF0ZWx5IGFmdGVyIHVuZGVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IHdvcmsgd2l0aCBhIG5vbi1ibG9ja2luZyBhdWRpbyBIQUwuCisgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcE5zID0gZm9yY2VOcyAtIG5zZWM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0aGUgRklGTyBxdWV1ZSBib3VuZHMKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IChib3VuZHMgJiAweEZGRkYwMDAwKSB8ICgoYm91bmRzICsgMSkgJiAweEZGRkYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzICs9IDB4MTAwMDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9ub3RvbmljTnMgPSBuc2VjOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb25vdG9uaWNOcyArPSBzZWMgKiAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgcmF3IENQVSBsb2FkID0gZGVsdGEgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbG9hZE5zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld0xvYWQ7CisgICAgICAgICAgICAgICAgICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJm5ld0xvYWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZExvYWRWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYyA9IG5ld0xvYWQudHZfc2VjIC0gb2xkTG9hZC50dl9zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG9sZExvYWQudHZfbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zID0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWROcyArPSBzZWMgKiAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWQgPSBuZXdMb2FkOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKKyAgICAgICAgICAgICAgICAgICAgaW50IGNwdU51bSA9IHNjaGVkX2dldGNwdSgpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrSHogPSB0Y3UuZ2V0Q3B1a0h6KGNwdU51bSk7CisgICAgICAgICAgICAgICAgICAgIGtIeiA9IChrSHogPDwgNCkgfCAoY3B1TnVtICYgMHhGKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHZhbHVlcyBpbiBGSUZPIHF1ZXVlcyBmb3IgZHVtcHN5cworICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzdG9yZXMgIzEsICMyLCAjMyBhcmUgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2l0aCByZXNwZWN0IHRvIHN0b3JlICM0IGJlbG93CisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7CisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RvcmUgIzQgaXMgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gc3RvcmVzICMxLCAjMiwgIzMgYWJvdmUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3ZXN0IG9wZW4gJiBvbGRlc3QgY2xvc2VkIGhhbHZlcyBhcmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyCisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUJvdW5kcyA9IGJvdW5kczsKKyAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCgiY3ljbGVfbXMiLCBtb25vdG9uaWNOcyAvIDEwMDAwMDApOworICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJsb2FkX3VzIiwgbG9hZE5zIC8gMTAwMCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcAorICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRUcyA9IG5ld1RzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbW9ub3RvbmljIGNsb2NrIGlzIGJyb2tlbgorICAgICAgICAgICAgb2xkVHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOworICAgICAgICB9CisKKyAgICB9ICAgLy8gZm9yICg7OykKKworICAgIC8vIG5ldmVyIHJldHVybiAndHJ1ZSc7IFRocmVhZDo6X3RocmVhZExvb3AoKSBsb2NrcyBtdXRleCB3aGljaCBjYW4gcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgorfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0gKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRmFzdFRocmVhZCBpcyB0aGUgY29tbW9uIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgRmFzdE1peGVyIGFuZCBGYXN0Q2FwdHVyZQorY2xhc3MgRmFzdFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworCitwdWJsaWM6CisgICAgICAgICAgICBGYXN0VGhyZWFkKCk7CisgICAgdmlydHVhbCB+RmFzdFRocmVhZCgpOworCitwcml2YXRlOgorICAgIC8vIGltcGxlbWVudCBUaHJlYWQ6OnRocmVhZExvb3AoKQorICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjYWxsb3V0cyB0byBzdWJjbGFzcyBpbiBzYW1lIGxleGljYWwgb3JkZXIgYXMgdGhleSB3ZXJlIGluIG9yaWdpbmFsIEZhc3RNaXhlci5jcHAKKyAgICAvLyBGSVhNRSBuZWVkIGNvbW1lbnRzCisgICAgdmlydHVhbCBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKnBvbGwoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIgX191bnVzZWQpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBvbklkbGUoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCkgPSAwOworCisgICAgLy8gRklYTUUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBuZWVkIGNvbW1lbnRzIGFuZCB0byBiZSByZW5hbWVkIHRvIGhhdmUgYW4gIm0iIHByZWZpeAorICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcHJldmlvdXM7CisgICAgY29uc3QgRmFzdFRocmVhZFN0YXRlICpjdXJyZW50OworICAgIHN0cnVjdCB0aW1lc3BlYyBvbGRUczsKKyAgICBib29sIG9sZFRzVmFsaWQ7CisgICAgbG9uZyBzbGVlcE5zOyAgIC8vIC0xOiBidXN5IHdhaXQsIDA6IHNjaGVkX3lpZWxkLCA+IDA6IG5hbm9zbGVlcAorICAgIGxvbmcgcGVyaW9kTnM7ICAgICAgLy8gZXhwZWN0ZWQgcGVyaW9kOyB0aGUgdGltZSByZXF1aXJlZCB0byByZW5kZXIgb25lIG1peCBidWZmZXIKKyAgICBsb25nIHVuZGVycnVuTnM7ICAgIC8vIHVuZGVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlCisgICAgbG9uZyBvdmVycnVuTnM7ICAgICAvLyBvdmVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGxlc3MgdGhhbiB0aGlzIHZhbHVlCisgICAgbG9uZyBmb3JjZU5zOyAgICAgICAvLyBpZiBvdmVycnVuIGRldGVjdGVkLCBmb3JjZSB0aGUgd3JpdGUgY3ljbGUgdG8gdGFrZSB0aGlzIG11Y2ggdGltZQorICAgIGxvbmcgd2FybXVwTnM7ICAgICAgLy8gd2FybXVwIGNvbXBsZXRlIHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRvIHRoaXMgdmFsdWUKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlICptRHVtbXlEdW1wU3RhdGU7CisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSAqZHVtcFN0YXRlOworICAgIGJvb2wgaWdub3JlTmV4dE92ZXJydW47ICAvLyB1c2VkIHRvIGlnbm9yZSBpbml0aWFsIG92ZXJydW4gYW5kIGZpcnN0IGFmdGVyIGFuIHVuZGVycnVuCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgc3RydWN0IHRpbWVzcGVjIG9sZExvYWQ7ICAgIC8vIHByZXZpb3VzIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCisgICAgYm9vbCBvbGRMb2FkVmFsaWQ7ICAvLyB3aGV0aGVyIG9sZExvYWQgaXMgdmFsaWQKKyAgICB1aW50MzJfdCBib3VuZHM7CisgICAgYm9vbCBmdWxsOyAgICAgICAgICAvLyB3aGV0aGVyIHdlIGhhdmUgY29sbGVjdGVkIGF0IGxlYXN0IG1TYW1wbGluZ04gc2FtcGxlcworI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgIFRocmVhZENwdVVzYWdlIHRjdTsgICAgIC8vIGZvciByZWFkaW5nIHRoZSBjdXJyZW50IENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CisjZW5kaWYKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNvbGRHZW47ICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgorICAgIGJvb2wgaXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCisgICAgc3RydWN0IHRpbWVzcGVjIG1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCisgICAgdWludDMyX3Qgd2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCisgICAgTkJMb2c6OldyaXRlciBkdW1teUxvZ1dyaXRlcjsKKyAgICBOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXI7CisgICAgc3RhdHVzX3QgdGltZXN0YW1wU3RhdHVzOworCisgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQ7CisjaWYgMAorICAgIHNpemVfdCBmcmFtZUNvdW50OworI2VuZGlmCisgICAgYm9vbCBhdHRlbXB0ZWRXcml0ZTsKKworfTsgIC8vIGNsYXNzIEZhc3RUaHJlYWQKKworfSAgIC8vIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5NDg3MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Zhc3RUaHJlYWRTdGF0ZTo6RmFzdFRocmVhZFN0YXRlKCkgOgorICAgIG1Db21tYW5kKElOSVRJQUwpLCBtQ29sZEZ1dGV4QWRkcihOVUxMKSwgbUNvbGRHZW4oMCksIG1EdW1wU3RhdGUoTlVMTCksIG1OQkxvZ1dyaXRlcihOVUxMKQorCit7Cit9CisKK0Zhc3RUaHJlYWRTdGF0ZTo6fkZhc3RUaHJlYWRTdGF0ZSgpCit7Cit9CisKKworRmFzdFRocmVhZER1bXBTdGF0ZTo6RmFzdFRocmVhZER1bXBTdGF0ZSgpIDoKKyAgICBtQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLCBtVW5kZXJydW5zKDApLCBtT3ZlcnJ1bnMoMCksCisgICAgLyogbU1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8KKyAgICBtV2FybXVwQ3ljbGVzKDApCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgLCBtU2FtcGxpbmdOKDEpLCBtQm91bmRzKDApCisjZW5kaWYKK3sKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworfQorCitGYXN0VGhyZWFkRHVtcFN0YXRlOjp+RmFzdFRocmVhZER1bXBTdGF0ZSgpCit7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjhhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfU1RBVEVfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEZhc3RUaHJlYWREdW1wU3RhdGU7CisKKy8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgYSBGYXN0VGhyZWFkCitzdHJ1Y3QgRmFzdFRocmVhZFN0YXRlIHsKKyAgICAgICAgICAgICAgICBGYXN0VGhyZWFkU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdFRocmVhZFN0YXRlKCk7CisKKyAgICB0eXBlZGVmIHVpbnQzMl90IENvbW1hbmQ7CisgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKKyAgICAgICAgSU5JVElBTCA9IDAsICAgICAgICAgICAgLy8gdXNlZCBvbmx5IGZvciB0aGUgaW5pdGlhbCBzdGF0ZQorICAgICAgICBIT1RfSURMRSA9IDEsICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIENPTERfSURMRSA9IDIsICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBmdXRleAorICAgICAgICBJRExFID0gMywgICAgICAgICAgICAgICAvLyBlaXRoZXIgSE9UX0lETEUgb3IgQ09MRF9JRExFCisgICAgICAgIEVYSVQgPSA0OyAgICAgICAgICAgICAgIC8vIGV4aXQgZnJvbSB0aHJlYWQKKyAgICAgICAgLy8gYWRkaXRpb25hbCB2YWx1ZXMgZGVmaW5lZCBwZXIgc3ViY2xhc3MKKyAgICBDb21tYW5kICAgICBtQ29tbWFuZDsgICAgICAgLy8gY3VycmVudCBjb21tYW5kCisgICAgaW50MzJfdCogICAgbUNvbGRGdXRleEFkZHI7IC8vIGZvciBDT0xEX0lETEUgb25seSwgcG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBmdXRleAorICAgIHVuc2lnbmVkICAgIG1Db2xkR2VuOyAgICAgICAvLyBpbmNyZW1lbnQgd2hlbiBDT0xEX0lETEUgaXMgcmVxdWVzdGVkIHNvIGl0J3Mgb25seSBwZXJmb3JtZWQgb25jZQorCisgICAgLy8gVGhpcyBtaWdodCBiZSBhIG9uZS10aW1lIGNvbmZpZ3VyYXRpb24gcmF0aGVyIHRoYW4gcGVyLXN0YXRlCisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSogbUR1bXBTdGF0ZTsgLy8gaWYgbm9uLU5VTEwsIHRoZW4gdXBkYXRlIGR1bXAgc3RhdGUgcGVyaW9kaWNhbGx5CisgICAgTkJMb2c6OldyaXRlciogbU5CTG9nV3JpdGVyOyAvLyBub24tYmxvY2tpbmcgbG9nZ2VyCisKK307ICAvLyBzdHJ1Y3QgRmFzdFRocmVhZFN0YXRlCisKKworLy8gRklYTUUgZXh0cmFjdCBjb21tb24gcGFydCBvZiBjb21tZW50IGF0IEZhc3RNaXhlckR1bXBTdGF0ZQorc3RydWN0IEZhc3RUaHJlYWREdW1wU3RhdGUgeworICAgIEZhc3RUaHJlYWREdW1wU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdFRocmVhZER1bXBTdGF0ZSgpOworCisgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOyAgIC8vIGN1cnJlbnQgY29tbWFuZAorICAgIHVpbnQzMl90IG1VbmRlcnJ1bnM7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgdW5kZXJydW5zCisgICAgdWludDMyX3QgbU92ZXJydW5zOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBvdmVycnVucworICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIG1lYXN1cmVkIHdhcm11cCB0aW1lCisgICAgdWludDMyX3QgbVdhcm11cEN5Y2xlczsgICAgIC8vIG51bWJlciBvZiBsb29wIGN5Y2xlcyByZXF1aXJlZCB0byB3YXJtdXAKKworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgIC8vIFJlY2VudGx5IGNvbGxlY3RlZCBzYW1wbGVzIG9mIHBlci1jeWNsZSBtb25vdG9uaWMgdGltZSwgdGhyZWFkIENQVSB0aW1lLCBhbmQgQ1BVIGZyZXF1ZW5jeS4KKyAgICAvLyBrU2FtcGxpbmdOIGlzIG1heCBzaXplIG9mIHNhbXBsaW5nIGZyYW1lIChzdGF0aXN0aWNzKSwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IDB4ODAwMC4KKyAgICAvLyBUaGUgc2FtcGxlIGFycmF5cyBhcmUgdmlydHVhbGx5IGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIGNvbXBpbGUtdGltZSBjb25zdGFudCwKKyAgICAvLyBidXQgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYmFzZWQgb24gdGhlIHJ1bnRpbWUgcGFyYW1ldGVyIG1TYW1wbGluZ04uCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ04gPSAweDgwMDA7CisgICAgLy8gQ29ycmVzcG9uZGluZyBydW50aW1lIG1heGltdW0gc2l6ZSBvZiBzYW1wbGUgYXJyYXlzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOLgorICAgIHVpbnQzMl90IG1TYW1wbGluZ047CisgICAgLy8gVGhlIGJvdW5kcyBkZWZpbmUgdGhlIGludGVydmFsIG9mIHZhbGlkIHNhbXBsZXMsIGFuZCBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czoKKyAgICAvLyAgICAgIG5ld2VzdCBvcGVuIChleGNsdWRlZCkgZW5kcG9pbnQgICA9IGxvd2VyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgorICAgIC8vICAgICAgb2xkZXN0IGNsb3NlZCAoaW5jbHVkZWQpIGVuZHBvaW50ID0gdXBwZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCisgICAgLy8gTnVtYmVyIG9mIHZhbGlkIHNhbXBsZXMgaXMgbmV3ZXN0IC0gb2xkZXN0LgorICAgIHVpbnQzMl90IG1Cb3VuZHM7ICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kcyBmb3IgbU1vbm90b25pY05zLCBtVGhyZWFkQ3B1TnMsIGFuZCBtQ3B1a0h6CisgICAgLy8gVGhlIGVsZW1lbnRzIGluIHRoZSAqTnMgYXJyYXlzIGFyZSBpbiB1bml0cyBvZiBuYW5vc2Vjb25kcyA8PSAzOTk5OTk5OTk5LgorICAgIHVpbnQzMl90IG1Nb25vdG9uaWNOc1trU2FtcGxpbmdOXTsgIC8vIGRlbHRhIG1vbm90b25pYyAod2FsbCBjbG9jaykgdGltZQorICAgIHVpbnQzMl90IG1Mb2FkTnNba1NhbXBsaW5nTl07ICAgICAgIC8vIGRlbHRhIENQVSBsb2FkIGluIHRpbWUKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICB1aW50MzJfdCBtQ3B1a0h6W2tTYW1wbGluZ05dOyAgICAgICAvLyBhYnNvbHV0ZSBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIeiwgYml0cyAwLTMgYXJlIENQVSMKKyNlbmRpZgorI2VuZGlmCisKK307ICAvLyBzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZQorCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfU1RBVEVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDQwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTAsMCArMSw2OTUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTm90ZTogdGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIGZvciBleHRyZW1lbHkgdmVyYm9zZSBsb2dnaW5nIG1lc3NhZ2UuICBJbgorLy8gb3JkZXIgdG8gcnVuIHdpdGggQUxPR19BU1NFUlQgdHVybmVkIG9uLCB3ZSBuZWVkIHRvIGhhdmUgTE9HX05ERUJVRyBzZXQgdG8KKy8vIDA7IGJ1dCBvbmUgc2lkZSBlZmZlY3Qgb2YgdGhpcyBpcyB0byB0dXJuIGFsbCBMT0dWJ3MgYXMgd2VsbC4gIFNvbWUgbWVzc2FnZXMKKy8vIGFyZSBzbyB2ZXJib3NlIHRoYXQgd2Ugd2FudCB0byBzdXBwcmVzcyB0aGVtIGV2ZW4gd2hlbiB3ZSBoYXZlIEFMT0dfQVNTRVJUCisvLyB0dXJuZWQgb24uICBEbyBub3QgdW5jb21tZW50IHRoZSAjZGVmIGJlbG93IHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UKKy8vIGFyZSBkb2luZyBhbmQgd2FudCB0byBzZWUgYWxsIG9mIHRoZSBleHRyZW1lbHkgdmVyYm9zZSBtZXNzYWdlcy4KKy8vI2RlZmluZSBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Omxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BvcnRzKG51bV9wb3J0cywgcG9ydHMpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5nZXRBdWRpb1BvcnQocG9ydCk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisKKy8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKKy8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisKKy8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisKK0F1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpCit7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6flBhdGNoUGFuZWwoKQoreworfQorCisvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzIF9fdW51c2VkKQoreworICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cyIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQoreworICAgIEFMT0dWKCJnZXRBdWRpb1BvcnQiKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIGhhbmRsZSAlZCIsCisgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzLCAqaGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8CisgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBsaW1pdCBudW1iZXIgb2Ygc291cmNlcyB0byAxIGZvciBub3cgb3IgMiBzb3VyY2VzIGZvciBzcGVjaWFsIGNyb3NzIGh3IG1vZHVsZSBjYXNlLgorICAgIC8vIG9ubHkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiByZXF1ZXN0IGEgcGF0Y2ggY3JlYXRpb24gd2l0aCAyIHNvdXJjZXMuCisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA+IDIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmICgqaGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgKmhhbmRsZSAhPSAwICYmIGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoKmhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHJlbW92aW5nIHBhdGNoIGhhbmRsZSAlZCIsICpoYW5kbGUpOworICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IG1QYXRjaGVzW2luZGV4XS0+bUhhbEhhbmRsZTsKKyAgICAgICAgICAgICAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQYXRjaCAqbmV3UGF0Y2ggPSBuZXcgUGF0Y2gocGF0Y2gpOworCisgICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogeworICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgaWYgY29ubmVjdGlvbiB0byBhIG1peCBvciBhY3Jvc3MgSFcgbW9kdWxlcworICAgICAgICAgICAgICAgIGlmICgocGF0Y2gtPnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5taXguaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlamVjdCBjb25uZWN0aW9uIHRvIGRpZmZlcmVudCBzaW5rIHR5cGVzCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IHBhdGNoLT5zaW5rc1swXS50eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgZGlmZmVyZW50IHNpbmsgdHlwZXMgaW4gc2FtZSBwYXRjaCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBsaW1pdCB0byBjb25uZWN0aW9ucyBiZXR3ZWVuIGRldmljZXMgYW5kIGlucHV0IHN0cmVhbXMgZm9yIEhBTCBiZWZvcmUgMy4wCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS5leHQubWl4Lmh3X21vZHVsZSA9PSBzcmNNb2R1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIGRldmljZSBzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAvLyBsaW1pdCB0byBkZXZpY2UgdG8gZGV2aWNlIGNvbm5lY3Rpb24gaWYgbm90IG9uIHNhbWUgaHcgbW9kdWxlCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSBmb3IgY3Jvc3MgaHcgbW9kdWxlIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBudW0gc291cmNlcyA9PSAyIC09PiByZXVzZSBhbiBleGl0aW5nIG91dHB1dCBtaXggdG8gY29ubmVjdCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBzaW5rCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1sxXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaHdfbW9kdWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID0gKE1peGVyVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5PdXRwdXRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGluQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKHNyY01vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLCBpbkNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhuZXdQYXRjaCwgcGF0Y2gpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYWxIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2hhciAqYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSAoY2hhciAqKWNhbGxvYygxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICAgICAgICAgICAgICBmcmVlKGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX0lOUFVUX1NPVVJDRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0Ugc2V0UGFyYW1ldGVycyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogeworICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbm5lY3Rpb25zIGJldHdlZW4gZGV2aWNlcyBhbmQgb3V0cHV0IHN0cmVhbXMKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbm5lY3Rpb25zIGJldHdlZW4gc2lua3MgYW5kIHNvdXJjZXMgb24gc2FtZSBIVyBtb2R1bGUKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFyICphZGRyZXNzOworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy9GSVhNRTogd2Ugb25seSBzdXBwb3J0IGFkZHJlc3Mgb24gZmlyc3Qgc2luayB3aXRoIEhBTCB2ZXJzaW9uIDwgMy4wCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgZnJlZShhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAoaW50KXR5cGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBleGl0OworICAgIH0KK2V4aXQ6CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKmhhbmRsZSA9IGF1ZGlvZmxpbmdlci0+bmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIG5ld1BhdGNoLT5tSGFuZGxlID0gKmhhbmRsZTsKKyAgICAgICAgbmV3UGF0Y2gtPm1IYWxIYW5kbGUgPSBoYWxIYW5kbGU7CisgICAgICAgIG1QYXRjaGVzLmFkZChuZXdQYXRjaCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgYWRkZWQgbmV3IHBhdGNoIGhhbmRsZSAlZCBoYWxIYW5kbGUgJWQiLCAqaGFuZGxlLCBoYWxIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhuZXdQYXRjaCk7CisgICAgICAgIGRlbGV0ZSBuZXdQYXRjaDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpCit7CisgICAgLy8gY3JlYXRlIHBhdGNoIGZyb20gc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHN1YlBhdGNoOworICAgIHN1YlBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBzdWJQYXRjaC5zb3VyY2VzWzBdID0gYXVkaW9QYXRjaC0+c291cmNlc1swXTsKKyAgICBzdWJQYXRjaC5udW1fc2lua3MgPSAxOworCisgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc2lua3NbMF0pOworICAgIHN1YlBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCisgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Z2V0QXVkaW9Qb3J0Q29uZmlnKCZzdWJQYXRjaC5zb3VyY2VzWzBdKTsKKyAgICBzdWJQYXRjaC5zaW5rc1swXSA9IGF1ZGlvUGF0Y2gtPnNpbmtzWzBdOworICAgIHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIHVzZSBhIHBzZXVkbyBMQ00gYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lY291bnQKKyAgICBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpOworICAgIGludCBwbGF5YmFja1NoaWZ0ID0gX19idWlsdGluX2N0eihwbGF5YmFja0ZyYW1lQ291bnQpOworICAgIHNpemVfdCByZWNvcmRGcmFtZWNvdW50ID0gcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKTsKKyAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lY291bnQpOworICAgIGlmIChwbGF5YmFja1NoaWZ0IDwgc2hpZnQpIHsKKyAgICAgICAgc2hpZnQgPSBwbGF5YmFja1NoaWZ0OworICAgIH0KKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZWNvdW50KSA+PiBzaGlmdDsKKyAgICBBTE9HVigiY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIHBsYXlmcmFtZUNvdW50ICVkIHJlY29yZEZyYW1lY291bnQgJWQgZnJhbWVDb3VudCAlZCAiLAorICAgICAgICAgIHBsYXliYWNrRnJhbWVDb3VudCwgcmVjb3JkRnJhbWVjb3VudCwgZnJhbWVDb3VudCk7CisKKyAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHJlY29yZCB0cmFjayB0byBjYXB0dXJlIGZyb20gcmVjb3JkIHRocmVhZAorICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbE1hc2soKTsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworCisgICAgcGF0Y2gtPm1QYXRjaFJlY29yZCA9IG5ldyBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVCk7CisgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBzdGF0dXMgPSBwYXRjaC0+bVBhdGNoUmVjb3JkLT5pbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5hZGRQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKworICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcGxheWJhY2sgdHJhY2sgdG8gcmVuZGVyIHRvIHBsYXliYWNrIHRocmVhZC4KKyAgICAvLyB0aGlzIHRyYWNrIGlzIGdpdmVuIHRoZSBzYW1lIGJ1ZmZlciBhcyB0aGUgUGF0Y2hSZWNvcmQgYnVmZmVyCisgICAgcGF0Y2gtPm1QYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxUKTsKKyAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmFkZFBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKKworICAgIC8vIHRpZSBwbGF5YmFjayBhbmQgcmVjb3JkIHRyYWNrcyB0b2dldGhlcgorICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnNldFBlZXJQcm94eShwYXRjaC0+bVBhdGNoVHJhY2suZ2V0KCkpOworICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hSZWNvcmQuZ2V0KCkpOworCisgICAgLy8gc3RhcnQgY2FwdHVyZSBhbmQgcGxheWJhY2sKKyAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCAwKTsKKyAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0YXJ0KCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCkKK3sKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImNsZWFyUGF0Y2hDb25uZWN0aW9ucygpIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgJWQgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlLCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworCisgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgeworICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdG9wKCk7CisgICAgfQorICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgeworICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7CisgICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUmVjb3JkVGhyZWFkICE9IDApIHsKKyAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgeworICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmRlbGV0ZVBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOworICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VJbnB1dEludGVybmFsX2wocGF0Y2gtPm1SZWNvcmRUaHJlYWQpOworICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5jbGVhcigpOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7CisgICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZGVsZXRlUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOworICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgbnVtIHNvdXJjZXMgPT0gMiB3ZSBhcmUgcmV1c2luZyBhbiBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgc28gd2UgZG8gbm90IGNsb3NlIGl0CisgICAgICAgIGlmIChwYXRjaC0+bUF1ZGlvUGF0Y2gubnVtX3NvdXJjZXMgIT0gMikgeworICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZU91dHB1dEludGVybmFsX2wocGF0Y2gtPm1QbGF5YmFja1RocmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5jbGVhcigpOworICAgIH0KK30KKworLyogRGlzY29ubmVjdCBhIHBhdGNoICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2ggaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBzaXplX3QgaW5kZXg7CisKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbmRleCA9PSBtUGF0Y2hlcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgUGF0Y2ggKnJlbW92ZWRQYXRjaCA9IG1QYXRjaGVzW2luZGV4XTsKKyAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2g7CisKKyAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHsKKyAgICAgICAgICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMocmVtb3ZlZFBhdGNoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgcmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHNldFBhcmFtZXRlcnMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaHdfbW9kdWxlOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlbGV0ZSByZW1vdmVkUGF0Y2g7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgX191bnVzZWQpCit7CisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMiKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWciKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInNldEF1ZGlvUG9ydENvbmZpZygpIGJhZCBodyBtb2R1bGUgJWQiLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKKyAgICAgICAgcmV0dXJuIGh3RGV2aWNlLT5zZXRfYXVkaW9fcG9ydF9jb25maWcoaHdEZXZpY2UsIGNvbmZpZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMTE3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKKyAgICAjZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBmcm9tIEF1ZGlvRmxpbmdlci5oCisjZW5kaWYKKworY2xhc3MgUGF0Y2hQYW5lbCA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKworICAgIGNsYXNzIFBhdGNoOworCisgICAgUGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpOworICAgIHZpcnR1YWwgflBhdGNoUGFuZWwoKTsKKworICAgIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpOworCisgICAgLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgLyogUmVsZWFzZSBhIHBhdGNoICovCisgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIGRldmljZXMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLworICAgIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKTsKKworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgc3RhdHVzX3QgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpOworICAgIHZvaWQgY2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCk7CisKKyAgICBjbGFzcyBQYXRjaCB7CisgICAgcHVibGljOgorICAgICAgICBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKSA6CisgICAgICAgICAgICBtQXVkaW9QYXRjaCgqcGF0Y2gpLCBtSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKKyAgICAgICAgICAgIG1IYWxIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtUmVjb3JkUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAorICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHt9CisgICAgICAgIH5QYXRjaCgpIHt9CisKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICAgICAgICAgICAgICBtQXVkaW9QYXRjaDsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFuZGxlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGU7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiAgICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkOworICAgICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gIG1QYXRjaFRyYWNrOworICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+ICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWQ7CisgICAgICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+ICAgbVBhdGNoUmVjb3JkOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1SZWNvcmRQYXRjaEhhbmRsZTsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZTsKKworICAgIH07CisKK3ByaXZhdGU6CisgICAgY29uc3Qgd3A8QXVkaW9GbGluZ2VyPiAgICAgIG1BdWRpb0ZsaW5nZXI7CisgICAgU29ydGVkVmVjdG9yIDxQYXRjaCAqPiAgICAgIG1QYXRjaGVzOworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggNDNiNzdmMy4uZWU0ODI3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTI5LDE0ICsyOSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFjaygpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uID0gMCk7CkBAIC01Myw2ICs1Niw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW1UeXBlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPZmZsb2FkZWQoKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfT0ZGTE9BRCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRElSRUNUKSAhPSAwOyB9CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgYXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRBdXhCdWZmZXIoaW50IEVmZmVjdElkLCBpbnQzMl90ICpidWZmZXIpOwpAQCAtNjQsNyArNjgsNyBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgc2lnbmFsKCk7CiAKIC8vIGltcGxlbWVudCBGYXN0TWl4ZXJTdGF0ZTo6Vm9sdW1lUHJvdmlkZXIgaW50ZXJmYWNlCi0gICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRWb2x1bWVMUigpOworICAgIHZpcnR1YWwgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgZ2V0Vm9sdW1lTFIoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKIApAQCAtOTMsMTAgKzk3LDEwIEBACiAgICAgYm9vbCBpc1JlYWR5KCkgY29uc3Q7CiAgICAgdm9pZCBzZXRQYXVzZWQoKSB7IG1TdGF0ZSA9IFBBVVNFRDsgfQogICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIGJvb2wgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fQ05UKTsKLSAgICB9CisgICAgYm9vbCBpc0ZsdXNoUGVuZGluZygpIGNvbnN0IHsgcmV0dXJuIG1GbHVzaEh3UGVuZGluZzsgfQorICAgIHZvaWQgZmx1c2hBY2soKTsKKyAgICBib29sIGlzUmVzdW1lUGVuZGluZygpOworICAgIHZvaWQgcmVzdW1lQWNrKCk7CiAKICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKQEAgLTEwOSw4ICsxMTMsNiBAQAogICAgIHZvaWQgdHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUpOwogICAgIHZvaWQgaW52YWxpZGF0ZSgpOwogICAgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gbUlzSW52YWxpZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1RpbWVkVHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIGJvb2wgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgIT0gMDsgfQogICAgIGludCBmYXN0SW5kZXgoKSBjb25zdCB7IHJldHVybiBtRmFzdEluZGV4OyB9CiAKIHByb3RlY3RlZDoKQEAgLTEzNyw4ICsxMzksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSEFMIHdoZW4gdGhpcyB0cmFjayB3aWxsIGJlIGZ1bGx5IHJlbmRlcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIG1lYW5zIG5vdCBtb25pdG9yaW5nCiBwcml2YXRlOgotICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgbUZsYWdzOwotCiAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgZm9yIGZhc3QgdHJhY2tzLCBhbmQgc2hvdWxkIGJlIGluIGEgc3ViY2xhc3MKICAgICBpbnQgICAgICAgICAgICAgICAgIG1GYXN0SW5kZXg7IC8vIGluZGV4IHdpdGhpbiBGYXN0TWl4ZXJTdGF0ZTo6bUZhc3RUcmFja3NbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVpdGhlciBtRmFzdEluZGV4ID09IC0xIGlmIG5vdCBpc0Zhc3RUcmFjaygpCkBAIC0xNTQsNiArMTU0LDEyIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNJbnZhbGlkOyAvLyBub24tcmVzZXR0YWJsZSBsYXRjaCwgc2V0IGJ5IGludmFsaWRhdGUoKQogICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSogIG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzdW1lVG9TdG9wcGluZzsgLy8gdHJhY2sgd2FzIHBhdXNlZCBpbiBzdG9wcGluZyBzdGF0ZS4KKyAgICBib29sICAgICAgICAgICAgICAgIG1GbHVzaEh3UGVuZGluZzsgLy8gdHJhY2sgcmVxdWVzdHMgZm9yIHRocmVhZCBmbHVzaAorCisgICAgLy8gZm9yIGxhc3QgY2FsbCB0byBnZXRUaW1lc3RhbXAKKyAgICBib29sICAgICAgICAgICAgICAgIG1QcmV2aW91c1ZhbGlkOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbjsKKyAgICBBdWRpb1RpbWVzdGFtcCAgICAgIG1QcmV2aW91c1RpbWVzdGFtcDsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogY2xhc3MgVGltZWRUcmFjayA6IHB1YmxpYyBUcmFjayB7CkBAIC0xODUsNyArMTkxLDYgQEAKICAgICB9OwogCiAgICAgLy8gTWl4ZXIgZmFjaW5nIG1ldGhvZHMuCi0gICAgdmlydHVhbCBib29sIGlzVGltZWRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZXNSZWFkeSgpIGNvbnN0OwogCiAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKQEAgLTI4NiwzICsyOTEsMzQgQEAKICAgICBEdXBsaWNhdGluZ1RocmVhZCogY29uc3QgbVNvdXJjZVRocmVhZDsgLy8gZm9yIHdhaXRUaW1lTXMoKSBpbiB3cml0ZSgpCiAgICAgQXVkaW9UcmFja0NsaWVudFByb3h5KiAgICAgIG1DbGllbnRQcm94eTsKIH07ICAvLyBlbmQgb2YgT3V0cHV0VHJhY2sKKworLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbAorY2xhc3MgUGF0Y2hUcmFjayA6IHB1YmxpYyBUcmFjaywgcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFRyYWNrKCk7CisKKyAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKKworICAgIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcik7CisKKyAgICAgICAgICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9CisKK3ByaXZhdGU6CisgICAgc3A8Q2xpZW50UHJveHk+ICAgICAgICAgICAgIG1Qcm94eTsKKyAgICBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIqICAgbVBlZXJQcm94eTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0OworfTsgIC8vIGVuZCBvZiBQYXRjaFRyYWNrCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKaW5kZXggNTdkZTU2OC4uMjA0YTlkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaApAQCAtMjgsOCArMjgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UmVjb3JkVHJhY2soKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwgaW50IHRyaWdnZXJTZXNzaW9uKTsKQEAgLTQ1LDcgKzQ4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAvLyBmb3IgbVN0YXRlCkBAIC01OSw1ICs2NSw2NCBAQAogICAgIC8vIHJlbGVhc2VCdWZmZXIoKSBub3Qgb3ZlcnJpZGRlbgogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtT3ZlcmZsb3c7ICAvLyBvdmVyZmxvdyBvbiBtb3N0IHJlY2VudCBhdHRlbXB0IHRvIGZpbGwgY2xpZW50IGJ1ZmZlcgotICAgIEF1ZGlvUmVjb3JkU2VydmVyUHJveHkqIG1BdWRpb1JlY29yZFNlcnZlclByb3h5OworCisgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQorICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgKm1SZXNhbXBsZXI7CisKKyAgICAgICAgICAgIC8vIGludGVybGVhdmVkIHN0ZXJlbyBwYWlycyBvZiBmaXhlZC1wb2ludCBRNC4yNworICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wT3V0QnVmZmVyOworICAgICAgICAgICAgLy8gY3VycmVudCBhbGxvY2F0ZWQgZnJhbWUgY291bnQgZm9yIHRoZSBhYm92ZSwgd2hpY2ggbWF5IGJlIGxhcmdlciB0aGFuIG5lZWRlZAorICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBPdXRGcmFtZUNvdW50OworCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluVW5yZWw7ICAgLy8gdW5yZWxlYXNlZCBmcmFtZXMgcmVtYWluaW5nIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudCBnZXROZXh0QnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRlYnVnIG9ubHkKKworICAgICAgICAgICAgLy8gcm9sbGluZyBjb3VudGVyIHRoYXQgaXMgbmV2ZXIgY2xlYXJlZAorICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyb250OyAgIC8vIG5leHQgYXZhaWxhYmxlIGZyYW1lCisKKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBtU2luazsgIC8vIHJlZmVyZW5jZXMgY2xpZW50J3MgYnVmZmVyIHNpbmsgaW4gc2hhcmVkIG1lbW9yeQorCisgICAgICAgICAgICAvLyBzeW5jIGV2ZW50IHRyaWdnZXJpbmcgYWN0dWFsIGF1ZGlvIGNhcHR1cmUuIEZyYW1lcyByZWFkIGJlZm9yZSB0aGlzIGV2ZW50IHdpbGwKKyAgICAgICAgICAgIC8vIGJlIGRyb3BwZWQgYW5kIHRoZXJlZm9yZSBub3QgcmVhZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgICBzcDxTeW5jRXZlbnQ+ICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0YXJ0RXZlbnQ7CisKKyAgICAgICAgICAgIC8vIG51bWJlciBvZiBjYXB0dXJlZCBmcmFtZXMgdG8gZHJvcCBhZnRlciB0aGUgc3RhcnQgc3luYyBldmVudCBoYXMgYmVlbiByZWNlaXZlZC4KKyAgICAgICAgICAgIC8vIHdoZW4gPCAwLCBtYXhpbXVtIGZyYW1lcyB0byBkcm9wIGJlZm9yZSBzdGFydGluZyBjYXB0dXJlIGV2ZW4gaWYgc3luYyBldmVudCBpcworICAgICAgICAgICAgLy8gbm90IHJlY2VpdmVkCisgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzVG9Ecm9wOworCisgICAgICAgICAgICAvLyB1c2VkIGJ5IHJlc2FtcGxlciB0byBmaW5kIHNvdXJjZSBmcmFtZXMKKyAgICAgICAgICAgIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyICptUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI7CiB9OworCisvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCitjbGFzcyBQYXRjaFJlY29yZCA6IHZpcnR1YWwgcHVibGljIFJlY29yZFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKworICAgIFBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOworCisgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CisKKyAgICAvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCA9IE5VTEwpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIpOworCisgICAgdm9pZCBzZXRQZWVyUHJveHkoUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwcm94eSkgeyBtUGVlclByb3h5ID0gcHJveHk7IH0KKworcHJpdmF0ZToKKyAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OworICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OworICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7Cit9OyAgLy8gZW5kIG9mIFBhdGNoUmVjb3JkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggMTUyNDU1ZC4uODI0NmZlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtNTksNiArNTksMTMgQEAKICAgICByZXR1cm4gb2s7CiB9CiAKK2Jvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOworICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgcmV0dXJuIG9rOworfQorCiBib29sIGR1bXBBbGxvd2VkKCkgewogICAgIC8vIGRvbid0IG9wdGltaXplIGZvciBzYW1lIHBpZCwgc2luY2UgbWVkaWFzZXJ2ZXIgbmV2ZXIgZHVtcHMgaXRzZWxmCiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggNTMxYmM1Ni4uZGY2ZjZmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCkBAIC0yNCw2ICsyNCw3IEBACiBib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoKTsKIGJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCk7CiBib29sIHNldHRpbmdzQWxsb3dlZCgpOworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7CiBib29sIGR1bXBBbGxvd2VkKCk7CiAKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcAppbmRleCBjMmQzYmJkLi40MGQ3YmNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwCkBAIC0yOCwxMiArMjgsMTIgQEAKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiB2b2lkIFN0YXRlUXVldWVPYnNlcnZlckR1bXA6OmR1bXAoaW50IGZkKQogewotICAgIGZkcHJpbnRmKGZkLCAiU3RhdGUgcXVldWUgb2JzZXJ2ZXI6IHN0YXRlQ2hhbmdlcz0ldVxuIiwgbVN0YXRlQ2hhbmdlcyk7CisgICAgZHByaW50ZihmZCwgIlN0YXRlIHF1ZXVlIG9ic2VydmVyOiBzdGF0ZUNoYW5nZXM9JXVcbiIsIG1TdGF0ZUNoYW5nZXMpOwogfQogCiB2b2lkIFN0YXRlUXVldWVNdXRhdG9yRHVtcDo6ZHVtcChpbnQgZmQpCiB7Ci0gICAgZmRwcmludGYoZmQsICJTdGF0ZSBxdWV1ZSBtdXRhdG9yOiBwdXNoRGlydHk9JXUgcHVzaEFjaz0ldSBibG9ja2VkU2VxdWVuY2U9JXVcbiIsCisgICAgZHByaW50ZihmZCwgIlN0YXRlIHF1ZXVlIG11dGF0b3I6IHB1c2hEaXJ0eT0ldSBwdXNoQWNrPSV1IGJsb2NrZWRTZXF1ZW5jZT0ldVxuIiwKICAgICAgICAgICAgIG1QdXNoRGlydHksIG1QdXNoQWNrLCBtQmxvY2tlZFNlcXVlbmNlKTsKIH0KICNlbmRpZgpAQCAtNDEsMTMgKzQxLDE0IEBACiAvLyBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTdGF0ZVF1ZXVlPFQ+OjpTdGF0ZVF1ZXVlKCkgOgotICAgIG1OZXh0KE5VTEwpLCBtQWNrKE5VTEwpLCBtQ3VycmVudChOVUxMKSwKKyAgICBtQWNrKE5VTEwpLCBtQ3VycmVudChOVUxMKSwKICAgICBtTXV0YXRpbmcoJm1TdGF0ZXNbMF0pLCBtRXhwZWN0aW5nKE5VTEwpLAogICAgIG1Jbk11dGF0aW9uKGZhbHNlKSwgbUlzRGlydHkoZmFsc2UpLCBtSXNJbml0aWFsaXplZChmYWxzZSkKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiAgICAgLCBtT2JzZXJ2ZXJEdW1wKCZtT2JzZXJ2ZXJEdW1teUR1bXApLCBtTXV0YXRvckR1bXAoJm1NdXRhdG9yRHVtbXlEdW1wKQogI2VuZGlmCiB7CisgICAgYXRvbWljX2luaXQoJm1OZXh0LCAwKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gU3RhdGVRdWV1ZTxUPjo6flN0YXRlUXVldWUoKQpAQCAtNTgsNyArNTksOCBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBUKiBTdGF0ZVF1ZXVlPFQ+Ojpwb2xsKCkKIHsKLSAgICBjb25zdCBUICpuZXh0ID0gKGNvbnN0IFQgKikgYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCh2b2xhdGlsZSBpbnQzMl90ICopICZtTmV4dCk7CisgICAgY29uc3QgVCAqbmV4dCA9IChjb25zdCBUICopIGF0b21pY19sb2FkX2V4cGxpY2l0KCZtTmV4dCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworCiAgICAgaWYgKG5leHQgIT0gbUN1cnJlbnQpIHsKICAgICAgICAgbUFjayA9IG5leHQ7ICAgIC8vIG5vIGFkZGl0aW9uYWwgYmFycmllciBuZWVkZWQKICAgICAgICAgbUN1cnJlbnQgPSBuZXh0OwpAQCAtMTQwLDcgKzE0Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBwdWJsaXNoCi0gICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoKGludDMyX3QpIG1NdXRhdGluZywgKHZvbGF0aWxlIGludDMyX3QgKikgJm1OZXh0KTsKKyAgICAgICAgYXRvbWljX3N0b3JlX2V4cGxpY2l0KCZtTmV4dCwgKHVpbnRwdHJfdCltTXV0YXRpbmcsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKICAgICAgICAgbUV4cGVjdGluZyA9IG1NdXRhdGluZzsKIAogICAgICAgICAvLyBjb3B5IHdpdGggY2lyY3VsYXIgd3JhcGFyb3VuZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmgKaW5kZXggOWNkZTY0Mi4uMjdmNmEyOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fU1RBVEVfUVVFVUVfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX1NUQVRFX1FVRVVFX0gKIAorI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgorCiAvLyBUaGUgc3RhdGUgcXVldWUgdGVtcGxhdGUgY2xhc3Mgd2FzIG9yaWdpbmFsbHkgZHJpdmVuIGJ5IHRoaXMgdXNlIGNhc2UgLyByZXF1aXJlbWVudHM6CiAvLyAgVGhlcmUgYXJlIHR3byB0aHJlYWRzOiBhIGZhc3QgbWl4ZXIsIGFuZCBhIG5vcm1hbCBtaXhlciwgYW5kIHRoZXkgc2hhcmUgc3RhdGUuCiAvLyAgVGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIHNoYXJlZCBzdGF0ZSBpcyBhIHNldCBvZiBhY3RpdmUgZmFzdCB0cmFja3MsCkBAIC04OSw2ICs5MSw4IEBACiAvLyAgYXJpdGhtZXRpYyBvbiB0aGUgc3RhdGUgcG9pbnRlcnMuICBIb3dldmVyIHRvIHRoZSBtdXRhdG9yLCB0aGUgc3RhdGUgcG9pbnRlcnMKIC8vICBhcmUgaW4gYSBkZWZpbml0ZSBjaXJjdWxhciBvcmRlci4KIAorI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUApAQCAtMTg0LDcgKzE4OCw3IEBACiAgICAgVCAgICAgICAgICAgICAgICAgbVN0YXRlc1trTl07ICAgICAgLy8gd3JpdHRlbiBieSBtdXRhdG9yLCByZWFkIGJ5IG9ic2VydmVyCiAKICAgICAvLyAidm9sYXRpbGUiIGlzIG1lYW5pbmdsZXNzIHdpdGggU01QLCBidXQgaGVyZSBpdCBpbmRpY2F0ZXMgdGhhdCB3ZSdyZSB1c2luZyBhdG9taWMgb3BzCi0gICAgdm9sYXRpbGUgY29uc3QgVCogbU5leHQ7IC8vIHdyaXR0ZW4gYnkgbXV0YXRvciB0byBhZHZhbmNlIG5leHQsIHJlYWQgYnkgb2JzZXJ2ZXIKKyAgICBhdG9taWNfdWludHB0cl90ICBtTmV4dDsgLy8gd3JpdHRlbiBieSBtdXRhdG9yIHRvIGFkdmFuY2UgbmV4dCwgcmVhZCBieSBvYnNlcnZlcgogICAgIHZvbGF0aWxlIGNvbnN0IFQqIG1BY2s7ICAvLyB3cml0dGVuIGJ5IG9ic2VydmVyIHRvIGFja25vd2xlZGdlIGFkdmFuY2Ugb2YgbmV4dCwgcmVhZCBieSBtdXRhdG9yCiAKICAgICAvLyBvbmx5IHVzZWQgYnkgb2JzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAKaW5kZXggMGQ1Y2QwYy4uNmY0NTA1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAKQEAgLTE2LDEyICsxNiwxNCBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdENhcHR1cmVTdGF0ZS5oIgogI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKIAogLy8gRklYTUUgaGFjayBmb3IgZ2NjCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdGVtcGxhdGUgY2xhc3MgU3RhdGVRdWV1ZTxGYXN0TWl4ZXJTdGF0ZT47ICAvLyB0eXBlZGVmIEZhc3RNaXhlclN0YXRlUXVldWUKK3RlbXBsYXRlIGNsYXNzIFN0YXRlUXVldWU8RmFzdE1peGVyU3RhdGU+OyAgICAgIC8vIHR5cGVkZWYgRmFzdE1peGVyU3RhdGVRdWV1ZQordGVtcGxhdGUgY2xhc3MgU3RhdGVRdWV1ZTxGYXN0Q2FwdHVyZVN0YXRlPjsgICAgLy8gdHlwZWRlZiBGYXN0Q2FwdHVyZVN0YXRlUXVldWUKIAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IGE5ZWFhOGEuLmI0MjljYzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTM0LDggKzM1LDExIEBACiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAKIC8vIE5CQUlPIGltcGxlbWVudGF0aW9ucworI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9Nb25vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmg+CkBAIC01MSw2ICs1NSw3IEBACiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCiAKQEAgLTc5LDYgKzg0LDggQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKyNkZWZpbmUgbWF4KGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gcmV0cnkgY291bnRzIGZvciBidWZmZXIgZmlsbCB0aW1lb3V0CkBAIC05NiwxOCArMTAzLDE4IEBACiAvLyBSZWNvcmRUaHJlYWQgbG9vcCBzbGVlcCB0aW1lIHVwb24gYXBwbGljYXRpb24gb3ZlcnJ1biBvciBhdWRpbyBIQUwgcmVhZCBlcnJvcgogc3RhdGljIGNvbnN0IGludCBrUmVjb3JkVGhyZWFkU2xlZXBVcyA9IDUwMDA7CiAKLS8vIG1heGltdW0gdGltZSB0byB3YWl0IGZvciBzZXRQYXJhbWV0ZXJzIHRvIGNvbXBsZXRlCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyA9IHNlY29uZHMoMik7CisvLyBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBzZW5kQ29uZmlnRXZlbnRfbCgpIGZvciBhIHN0YXR1cyB0byBiZSByZWNlaXZlZAorc3RhdGljIGNvbnN0IG5zZWNzX3Qga0NvbmZpZ0V2ZW50VGltZW91dE5zID0gc2Vjb25kcygyKTsKIAogLy8gbWluaW11bSBzbGVlcCB0aW1lIGZvciB0aGUgbWl4ZXIgdGhyZWFkIGxvb3Agd2hlbiB0cmFja3MgYXJlIGFjdGl2ZSBidXQgaW4gdW5kZXJydW4KIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluVGhyZWFkU2xlZXBUaW1lVXMgPSA1MDAwOwogLy8gbWF4aW11bSBkaXZpZGVyIGFwcGxpZWQgdG8gdGhlIGFjdGl2ZSBzbGVlcCB0aW1lIGluIHRoZSBtaXhlciB0aHJlYWQgbG9vcAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhUaHJlYWRTbGVlcFRpbWVTaGlmdCA9IDI7CiAKLS8vIG1pbmltdW0gbm9ybWFsIG1peCBidWZmZXIgc2l6ZSwgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcyByYXRoZXIgdGhhbiBmcmFtZXMKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluTm9ybWFsTWl4QnVmZmVyU2l6ZU1zID0gMjA7Ci0vLyBtYXhpbXVtIG5vcm1hbCBtaXggYnVmZmVyIHNpemUKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4Tm9ybWFsTWl4QnVmZmVyU2l6ZU1zID0gMjQ7CisvLyBtaW5pbXVtIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplLCBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzIHJhdGhlciB0aGFuIGZyYW1lcworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5Ob3JtYWxTaW5rQnVmZmVyU2l6ZU1zID0gMjA7CisvLyBtYXhpbXVtIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplCitzdGF0aWMgY29uc3QgdWludDMyX3Qga01heE5vcm1hbFNpbmtCdWZmZXJTaXplTXMgPSAyNDsKIAogLy8gT2ZmbG9hZGVkIG91dHB1dCB0aHJlYWQgc3RhbmRieSBkZWxheTogYWxsb3dzIHRyYWNrIHRyYW5zaXRpb24gd2l0aG91dCBnb2luZyB0byBzdGFuZGJ5CiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrT2ZmbG9hZFN0YW5kYnlEZWxheU5zID0gc2Vjb25kcygxKTsKQEAgLTEyOSw5ICsxMzYsMTcgQEAKICAgICAvLyAgdXAgbGFyZ2Ugd3JpdGVzIGludG8gc21hbGxlciBvbmVzLCBhbmQgdGhlIHdyYXBwZXIgd291bGQgbmVlZCB0byBkZWFsIHdpdGggc2NoZWR1bGVyLgogfSBrVXNlRmFzdE1peGVyID0gRmFzdE1peGVyX1N0YXRpYzsKIAorLy8gV2hldGhlciB0byB1c2UgZmFzdCBjYXB0dXJlCitzdGF0aWMgY29uc3QgZW51bSB7CisgICAgRmFzdENhcHR1cmVfTmV2ZXIsICAvLyBuZXZlciBpbml0aWFsaXplIG9yIHVzZTogZm9yIGRlYnVnZ2luZyBvbmx5CisgICAgRmFzdENhcHR1cmVfQWx3YXlzLCAvLyBhbHdheXMgaW5pdGlhbGl6ZSBhbmQgdXNlLCBldmVuIGlmIG5vdCBuZWVkZWQ6IGZvciBkZWJ1Z2dpbmcgb25seQorICAgIEZhc3RDYXB0dXJlX1N0YXRpYywgLy8gaW5pdGlhbGl6ZSBpZiBuZWVkZWQsIHRoZW4gdXNlIGFsbCB0aGUgdGltZSBpZiBpbml0aWFsaXplZAorfSBrVXNlRmFzdENhcHR1cmUgPSBGYXN0Q2FwdHVyZV9TdGF0aWM7CisKIC8vIFByaW9yaXRpZXMgZm9yIHJlcXVlc3RQcmlvcml0eQogc3RhdGljIGNvbnN0IGludCBrUHJpb3JpdHlBdWRpb0FwcCA9IDI7CiBzdGF0aWMgY29uc3QgaW50IGtQcmlvcml0eUZhc3RNaXhlciA9IDM7CitzdGF0aWMgY29uc3QgaW50IGtQcmlvcml0eUZhc3RDYXB0dXJlID0gMzsKIAogLy8gSUF1ZGlvRmxpbmdlcjo6Y3JlYXRlVHJhY2soKSByZXBvcnRzIGJhY2sgdG8gY2xpZW50IHRoZSB0b3RhbCBzaXplIG9mIHNoYXJlZCBtZW1vcnkgYXJlYQogLy8gZm9yIHRoZSB0cmFjay4gIFRoZSBjbGllbnQgdGhlbiBzdWItZGl2aWRlcyB0aGlzIGludG8gc21hbGxlciBidWZmZXJzIGZvciBpdHMgdXNlLgpAQCAtMTQwLDggKzE1NSwzOSBAQAogLy8gRklYTUUgSXQgd291bGQgYmUgYmV0dGVyIGZvciBjbGllbnQgdG8gdGVsbCBBdWRpb0ZsaW5nZXIgdGhlIHZhbHVlIG9mIE4sCiAvLyBzbyBBdWRpb0ZsaW5nZXIgY291bGQgYWxsb2NhdGUgdGhlIHJpZ2h0IGFtb3VudCBvZiBtZW1vcnkuCiAvLyBTZWUgdGhlIGNsaWVudCdzIG1pbkJ1ZkNvdW50IGFuZCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0IGNhbGN1bGF0aW9ucyBmb3IgZGV0YWlscy4KKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgbm90IHNwZWNpZmllZCBieSBwcm9wZXJ0eS4KIHN0YXRpYyBjb25zdCBpbnQga0Zhc3RUcmFja011bHRpcGxpZXIgPSAyOwogCisvLyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBhbGxvd2VkIHZhbHVlcworc3RhdGljIGNvbnN0IGludCBrRmFzdFRyYWNrTXVsdGlwbGllck1pbiA9IDE7CitzdGF0aWMgY29uc3QgaW50IGtGYXN0VHJhY2tNdWx0aXBsaWVyTWF4ID0gMjsKKworLy8gVGhlIGFjdHVhbCB2YWx1ZSB0byB1c2UsIHdoaWNoIGNhbiBiZSBzcGVjaWZpZWQgcGVyLWRldmljZSB2aWEgcHJvcGVydHkgYWYuZmFzdF90cmFja19tdWx0aXBsaWVyLgorc3RhdGljIGludCBzRmFzdFRyYWNrTXVsdGlwbGllciA9IGtGYXN0VHJhY2tNdWx0aXBsaWVyOworCisvLyBTZWUgVGhyZWFkOjpyZWFkT25seUhlYXAoKS4KKy8vIEluaXRpYWxseSB0aGlzIGhlYXAgaXMgdXNlZCB0byBhbGxvY2F0ZSBjbGllbnQgYnVmZmVycyBmb3IgImZhc3QiIEF1ZGlvUmVjb3JkLgorLy8gRXZlbnR1YWxseSBpdCB3aWxsIGJlIHRoZSBzaW5nbGUgYnVmZmVyIHRoYXQgRmFzdENhcHR1cmUgd3JpdGVzIGludG8gdmlhIEhBTCByZWFkKCksCisvLyBhbmQgdGhhdCBhbGwgImZhc3QiIEF1ZGlvUmVjb3JkIGNsaWVudHMgcmVhZCBmcm9tLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBzaXplIGNhbiBiZSBzbWFsbC4KK3N0YXRpYyBjb25zdCBzaXplX3Qga1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUgPSAweDIwMDA7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHB0aHJlYWRfb25jZV90IHNGYXN0VHJhY2tNdWx0aXBsaWVyT25jZSA9IFBUSFJFQURfT05DRV9JTklUOworCitzdGF0aWMgdm9pZCBzRmFzdFRyYWNrTXVsdGlwbGllckluaXQoKQoreworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJhZi5mYXN0X3RyYWNrX211bHRpcGxpZXIiLCB2YWx1ZSwgTlVMTCkgPiAwKSB7CisgICAgICAgIGNoYXIgKmVuZHB0cjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB1bCA9IHN0cnRvdWwodmFsdWUsICZlbmRwdHIsIDApOworICAgICAgICBpZiAoKmVuZHB0ciA9PSAnXDAnICYmIGtGYXN0VHJhY2tNdWx0aXBsaWVyTWluIDw9IHVsICYmIHVsIDw9IGtGYXN0VHJhY2tNdWx0aXBsaWVyTWF4KSB7CisgICAgICAgICAgICBzRmFzdFRyYWNrTXVsdGlwbGllciA9IChpbnQpIHVsOworICAgICAgICB9CisgICAgfQorfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCkBAIC0xODUsNyArMjMxLDExIEBACiB7CiB9CiAKLXZvaWQgQ3B1U3RhdHM6OnNhbXBsZShjb25zdCBTdHJpbmc4ICZ0aXRsZSkgewordm9pZCBDcHVTdGF0czo6c2FtcGxlKGNvbnN0IFN0cmluZzggJnRpdGxlCisjaWZuZGVmIERFQlVHX0NQVV9VU0FHRQorICAgICAgICAgICAgICAgIF9fdW51c2VkCisjZW5kaWYKKyAgICAgICAgKSB7CiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiAgICAgLy8gZ2V0IGN1cnJlbnQgdGhyZWFkJ3MgZGVsdGEgQ1BVIHRpbWUgaW4gd2FsbCBjbG9jayBucwogICAgIGRvdWJsZSB3Y05zOwpAQCAtMjY5LDkgKzMxOSw5IEBACiAgICAgOiAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLAogICAgICAgICBtVHlwZSh0eXBlKSwKICAgICAgICAgbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpLAotICAgICAgICAvLyBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbUZyYW1lU2l6ZSwgYW5kIG1Gb3JtYXQgYXJlCi0gICAgICAgIC8vIHNldCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnMoKSBvciBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQotICAgICAgICBtUGFyYW1TdGF0dXMoTk9fRVJST1IpLAorICAgICAgICAvLyBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbUZyYW1lU2l6ZSwgbUZvcm1hdCwgbUJ1ZmZlclNpemUKKyAgICAgICAgLy8gYXJlIHNldCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIG9yCisgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHRydWUgaGVyZS4gSXMgdGhpcyBzb21lIGtpbmQgb2YgaGFjaz8KICAgICAgICAgbVN0YW5kYnkoZmFsc2UpLCBtT3V0RGV2aWNlKG91dERldmljZSksIG1JbkRldmljZShpbkRldmljZSksCiAgICAgICAgIG1BdWRpb1NvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1JZChpZCksCkBAIC0yODMsMTIgKzMzMyw4IEBACiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6On5UaHJlYWRCYXNlKCkKIHsKICAgICAvLyBtQ29uZmlnRXZlbnRzIHNob3VsZCBiZSBlbXB0eSwgYnV0IGp1c3QgaW4gY2FzZSBpdCBpc24ndCwgZnJlZSB0aGUgbWVtb3J5IGl0IG93bnMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db25maWdFdmVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZGVsZXRlIG1Db25maWdFdmVudHNbaV07Ci0gICAgfQogICAgIG1Db25maWdFdmVudHMuY2xlYXIoKTsKIAotICAgIG1QYXJhbUNvbmQuYnJvYWRjYXN0KCk7CiAgICAgLy8gZG8gbm90IGxvY2sgdGhlIG11dGV4IGluIGRlc3RydWN0b3IKICAgICByZWxlYXNlV2FrZUxvY2tfbCgpOwogICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKQEAgLTI5Nyw2ICszNDMsMTcgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cmVhZHlUb1J1bigpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdENoZWNrKCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBBTE9HSSgiQXVkaW9GbGluZ2VyJ3MgdGhyZWFkICVwIHJlYWR5IHRvIHJ1biIsIHRoaXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJObyB3b3JraW5nIGF1ZGlvIGRyaXZlciBmb3VuZC4iKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmV4aXQoKQogewogICAgIEFMT0dWKCJUaHJlYWRCYXNlOjpleGl0Iik7CkBAIC0zMjgsMTYgKzM4NSwzMCBAQAogICAgIEFMT0dWKCJUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkgJXMiLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgbU5ld1BhcmFtZXRlcnMuYWRkKGtleVZhbHVlUGFpcnMpOworICAgIHJldHVybiBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChrZXlWYWx1ZVBhaXJzKTsKK30KKworLy8gc2VuZENvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKKy8vIENhbiB0ZW1wb3JhcmlseSByZWxlYXNlIHRoZSBsb2NrIGlmIHdhaXRpbmcgZm9yIGEgcmVwbHkgZnJvbSBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKS4KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIG1Db25maWdFdmVudHMuYWRkKGV2ZW50KTsKKyAgICBBTE9HVigic2VuZENvbmZpZ0V2ZW50X2woKSBudW0gZXZlbnRzICVkIGV2ZW50ICVkIiwgbUNvbmZpZ0V2ZW50cy5zaXplKCksIGV2ZW50LT5tVHlwZSk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgLy8gd2FpdCBjb25kaXRpb24gd2l0aCB0aW1lb3V0IGluIGNhc2UgdGhlIHRocmVhZCBsb29wIGhhcyBleGl0ZWQKLSAgICAvLyBiZWZvcmUgdGhlIHJlcXVlc3QgY291bGQgYmUgcHJvY2Vzc2VkCi0gICAgaWYgKG1QYXJhbUNvbmQud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcykgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RhdHVzID0gbVBhcmFtU3RhdHVzOwotICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBUSU1FRF9PVVQ7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZXZlbnQtPm1Mb2NrKTsKKyAgICAgICAgd2hpbGUgKGV2ZW50LT5tV2FpdFN0YXR1cykgeworICAgICAgICAgICAgaWYgKGV2ZW50LT5tQ29uZC53YWl0UmVsYXRpdmUoZXZlbnQtPm1Mb2NrLCBrQ29uZmlnRXZlbnRUaW1lb3V0TnMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgZXZlbnQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gZXZlbnQtPm1TdGF0dXM7CiAgICAgfQorICAgIG1Mb2NrLmxvY2soKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTAsNjIgKzQyMSwxNTUgQEAKIC8vIHNlbmRJb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGludCBldmVudCwgaW50IHBhcmFtKQogewotICAgIElvQ29uZmlnRXZlbnQgKmlvRXZlbnQgPSBuZXcgSW9Db25maWdFdmVudChldmVudCwgcGFyYW0pOwotICAgIG1Db25maWdFdmVudHMuYWRkKHN0YXRpY19jYXN0PENvbmZpZ0V2ZW50ICo+KGlvRXZlbnQpKTsKLSAgICBBTE9HVigic2VuZElvQ29uZmlnRXZlbnQoKSBudW0gZXZlbnRzICVkIGV2ZW50ICVkLCBwYXJhbSAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpLCBldmVudCwKLSAgICAgICAgICAgIHBhcmFtKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGFyYW0pOworICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KIAogLy8gc2VuZFByaW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pCiB7Ci0gICAgUHJpb0NvbmZpZ0V2ZW50ICpwcmlvRXZlbnQgPSBuZXcgUHJpb0NvbmZpZ0V2ZW50KHBpZCwgdGlkLCBwcmlvKTsKLSAgICBtQ29uZmlnRXZlbnRzLmFkZChzdGF0aWNfY2FzdDxDb25maWdFdmVudCAqPihwcmlvRXZlbnQpKTsKLSAgICBBTE9HVigic2VuZFByaW9Db25maWdFdmVudF9sKCkgbnVtIGV2ZW50cyAlZCBwaWQgJWQsIHRpZCAlZCBwcmlvICVkIiwKLSAgICAgICAgICBtQ29uZmlnRXZlbnRzLnNpemUoKSwgcGlkLCB0aWQsIHByaW8pOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBQcmlvQ29uZmlnRXZlbnQocGlkLCB0aWQsIHByaW8pOworICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnByb2Nlc3NDb25maWdFdmVudHMoKQorLy8gc2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyKQogewotICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAoIW1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dWKCJwcm9jZXNzQ29uZmlnRXZlbnRzKCkgcmVtYWluaW5nIGV2ZW50cyAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpKTsKLSAgICAgICAgQ29uZmlnRXZlbnQgKmV2ZW50ID0gbUNvbmZpZ0V2ZW50c1swXTsKLSAgICAgICAgbUNvbmZpZ0V2ZW50cy5yZW1vdmVBdCgwKTsKLSAgICAgICAgLy8gcmVsZWFzZSBtTG9jayBiZWZvcmUgbG9ja2luZyBBdWRpb0ZsaW5nZXIgbUxvY2s6IGxvY2sgb3JkZXIgaXMgYWx3YXlzCi0gICAgICAgIC8vIEF1ZGlvRmxpbmdlciB0aGVuIFRocmVhZEJhc2UgdG8gYXZvaWQgY3Jvc3MgZGVhZGxvY2sKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHN3aXRjaChldmVudC0+dHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIENGR19FVkVOVF9QUklPOiB7Ci0gICAgICAgICAgICAgICAgUHJpb0NvbmZpZ0V2ZW50ICpwcmlvRXZlbnQgPSBzdGF0aWNfY2FzdDxQcmlvQ29uZmlnRXZlbnQgKj4oZXZlbnQpOwotICAgICAgICAgICAgICAgIC8vIEZJWE1FIE5lZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhpcyBoYXMgYmUgZG9uZSBhc3luY2hyb25vdXNseQotICAgICAgICAgICAgICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkocHJpb0V2ZW50LT5waWQoKSwgcHJpb0V2ZW50LT50aWQoKSwgcHJpb0V2ZW50LT5wcmlvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiUG9saWN5IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgaXMgdW5hdmFpbGFibGUgZm9yIHBpZCAlZCB0aWQgJWQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb0V2ZW50LT5wcmlvKCksIHByaW9FdmVudC0+cGlkKCksIHByaW9FdmVudC0+dGlkKCksIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX0lPOiB7Ci0gICAgICAgICAgICAgICAgSW9Db25maWdFdmVudCAqaW9FdmVudCA9IHN0YXRpY19jYXN0PElvQ29uZmlnRXZlbnQgKj4oZXZlbnQpOwotICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpb0V2ZW50LT5ldmVudCgpLCBpb0V2ZW50LT5wYXJhbSgpKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCJwcm9jZXNzQ29uZmlnRXZlbnRzKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIGV2ZW50OwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgfQotICAgIG1Mb2NrLnVubG9jaygpOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudChrZXlWYWx1ZVBhaXIpOworICAgIHJldHVybiBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KCpwYXRjaCwgKmhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgKiljb25maWdFdmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICpoYW5kbGUgPSBkYXRhLT5tSGFuZGxlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGhhbmRsZSk7CisgICAgcmV0dXJuIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKK30KKworCisvLyBwb3N0IGNvbmRpdGlvbjogbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpwcm9jZXNzQ29uZmlnRXZlbnRzX2woKQoreworICAgIGJvb2wgY29uZmlnQ2hhbmdlZCA9IGZhbHNlOworCisgICAgd2hpbGUgKCFtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HVigicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgcmVtYWluaW5nIGV2ZW50cyAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpKTsKKyAgICAgICAgc3A8Q29uZmlnRXZlbnQ+IGV2ZW50ID0gbUNvbmZpZ0V2ZW50c1swXTsKKyAgICAgICAgbUNvbmZpZ0V2ZW50cy5yZW1vdmVBdCgwKTsKKyAgICAgICAgc3dpdGNoIChldmVudC0+bVR5cGUpIHsKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfUFJJTzogeworICAgICAgICAgICAgUHJpb0NvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChQcmlvQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOworICAgICAgICAgICAgLy8gRklYTUUgTmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIGhhcyB0byBiZSBkb25lIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KGRhdGEtPm1QaWQsIGRhdGEtPm1UaWQsIGRhdGEtPm1QcmlvLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVByaW8sIGRhdGEtPm1QaWQsIGRhdGEtPm1UaWQsIGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX0lPOiB7CisgICAgICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChJb0NvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChkYXRhLT5tRXZlbnQsIGRhdGEtPm1QYXJhbSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1NFVF9QQVJBTUVURVI6IHsKKyAgICAgICAgICAgIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChkYXRhLT5tS2V5VmFsdWVQYWlycywgZXZlbnQtPm1TdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOworICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoX2woJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2hfbChkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChldmVudC0+bUxvY2spOworICAgICAgICAgICAgaWYgKGV2ZW50LT5tV2FpdFN0YXR1cykgeworICAgICAgICAgICAgICAgIGV2ZW50LT5tV2FpdFN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGV2ZW50LT5tQ29uZC5zaWduYWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVl9JRihtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSwgInByb2Nlc3NDb25maWdFdmVudHNfbCgpIERPTkUgdGhyZWFkICVwIiwgdGhpcyk7CisgICAgfQorCisgICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHsKKyAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKTsKKyAgICB9Cit9CisKK1N0cmluZzggY2hhbm5lbE1hc2tUb1N0cmluZyhhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrLCBib29sIG91dHB1dCkgeworICAgIFN0cmluZzggczsKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCkgcy5hcHBlbmQoImZyb250LWxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUKSBzLmFwcGVuZCgiZnJvbnQtcmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgcy5hcHBlbmQoImxvdyBmcmVxLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJiYWNrLWxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJiYWNrLXJpZ2h0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWxlZnQtb2YtY2VudGVyLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIpIHMuYXBwZW5kKCJmcm9udC1yaWdodC1vZi1jZW50ZXIsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgiYmFjay1jZW50ZXIsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCkgcy5hcHBlbmQoInNpZGUtbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVCkgcy5hcHBlbmQoInNpZGUtcmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtY2VudGVyICwiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCkgcy5hcHBlbmQoInRvcC1mcm9udC1sZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWZyb250LWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUKSBzLmFwcGVuZCgidG9wLWZyb250LXJpZ2h0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUKSBzLmFwcGVuZCgidG9wLWJhY2stbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWJhY2stY2VudGVyLCAiICk7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOworICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX09VVF9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlQpIHMuYXBwZW5kKCJsZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1JJR0hUKSBzLmFwcGVuZCgicmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fRlJPTlQpIHMuYXBwZW5kKCJmcm9udCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLKSBzLmFwcGVuZCgiYmFjaywgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUX1BST0NFU1NFRCkgcy5hcHBlbmQoImxlZnQtcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1JJR0hUX1BST0NFU1NFRCkgcy5hcHBlbmQoInJpZ2h0LXByb2Nlc3NlZCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJmcm9udC1wcm9jZXNzZWQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19QUk9DRVNTRUQpIHMuYXBwZW5kKCJiYWNrLXByb2Nlc3NlZCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9QUkVTU1VSRSkgcy5hcHBlbmQoInByZXNzdXJlLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1hfQVhJUykgcy5hcHBlbmQoIlgsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWV9BWElTKSBzLmFwcGVuZCgiWSwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9aX0FYSVMpIHMuYXBwZW5kKCJaLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSykgcy5hcHBlbmQoInZvaWNlLXVwbGluaywgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspIHMuYXBwZW5kKCJ2b2ljZS1kbmxpbmssICIpOworICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX0lOX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKKyAgICB9CisgICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7CisgICAgaWYgKHMubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgIGNoYXIgKnN0ciA9IHMubG9ja0J1ZmZlcihsZW4pOworICAgICAgICBzLnVubG9ja0J1ZmZlcihsZW4gLSAyKTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC00MTMsNDggKzU3NywzMiBAQAogCiAgICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJ0aHJlYWQgJXAgbWF5YmUgZGVhZCBsb2NrZWRcbiIsIHRoaXMpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIGRwcmludGYoZmQsICJ0aHJlYWQgJXAgbWF5YmUgZGVhZCBsb2NrZWRcbiIsIHRoaXMpOwogICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImlvIGhhbmRsZTogJWRcbiIsIG1JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRJRDogJWRcbiIsIGdldFRpZCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAic3RhbmRieTogJWRcbiIsIG1TdGFuZGJ5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU2FtcGxlIHJhdGU6ICV1XG4iLCBtU2FtcGxlUmF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkhBTCBmcmFtZSBjb3VudDogJWRcbiIsIG1GcmFtZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBDb3VudDogJXVcbiIsIG1DaGFubmVsQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDaGFubmVsIE1hc2s6IDB4JTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZyYW1lIHNpemU6ICV1XG4iLCBtRnJhbWVTaXplKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblBlbmRpbmcgc2V0UGFyYW1ldGVycyBjb21tYW5kczogXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIEluZGV4IENvbW1hbmQiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OZXdQYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuICUwMmQgICAgIiwgaSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChtTmV3UGFyYW1ldGVyc1tpXSk7CisgICAgZHByaW50ZihmZCwgIiAgSS9PIGhhbmRsZTogJWRcbiIsIG1JZCk7CisgICAgZHByaW50ZihmZCwgIiAgVElEOiAlZFxuIiwgZ2V0VGlkKCkpOworICAgIGRwcmludGYoZmQsICIgIFN0YW5kYnk6ICVzXG4iLCBtU3RhbmRieSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZHByaW50ZihmZCwgIiAgU2FtcGxlIHJhdGU6ICV1XG4iLCBtU2FtcGxlUmF0ZSk7CisgICAgZHByaW50ZihmZCwgIiAgSEFMIGZyYW1lIGNvdW50OiAlenVcbiIsIG1GcmFtZUNvdW50KTsKKyAgICBkcHJpbnRmKGZkLCAiICBIQUwgYnVmZmVyIHNpemU6ICV1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7CisgICAgZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBDb3VudDogJXVcbiIsIG1DaGFubmVsQ291bnQpOworICAgIGRwcmludGYoZmQsICIgIENoYW5uZWwgTWFzazogMHglMDh4ICglcylcbiIsIG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrVG9TdHJpbmcobUNoYW5uZWxNYXNrLCBtVHlwZSAhPSBSRUNPUkQpLnN0cmluZygpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGb3JtYXQ6IDB4JXggKCVzKVxuIiwgbUhBTEZvcm1hdCwgZm9ybWF0VG9TdHJpbmcobUhBTEZvcm1hdCkpOworICAgIGRwcmludGYoZmQsICIgIEZyYW1lIHNpemU6ICV6dVxuIiwgbUZyYW1lU2l6ZSk7CisgICAgZHByaW50ZihmZCwgIiAgUGVuZGluZyBjb25maWcgZXZlbnRzOiIpOworICAgIHNpemVfdCBudW1Db25maWcgPSBtQ29uZmlnRXZlbnRzLnNpemUoKTsKKyAgICBpZiAobnVtQ29uZmlnKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29uZmlnOyBpKyspIHsKKyAgICAgICAgICAgIG1Db25maWdFdmVudHNbaV0tPmR1bXAoYnVmZmVyLCBTSVpFKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiAgICAlcyIsIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgZHByaW50ZihmZCwgIlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiBub25lXG4iKTsKICAgICB9CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblxuUGVuZGluZyBjb25maWcgZXZlbnRzOiBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db25maWdFdmVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUNvbmZpZ0V2ZW50c1tpXS0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQogICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtNDY2LDEwICs2MTQsMTEgQEAKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuLSAlZCBFZmZlY3QgQ2hhaW5zOlxuIiwgbUVmZmVjdENoYWlucy5zaXplKCkpOworICAgIHNpemVfdCBudW1FZmZlY3RDaGFpbnMgPSBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICV6dSBFZmZlY3QgQ2hhaW5zXG4iLCBudW1FZmZlY3RDaGFpbnMpOwogICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRWZmZWN0Q2hhaW5zOyArK2kpIHsKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUVmZmVjdENoYWluc1tpXTsKICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgICAgIGNoYWluLT5kdW1wKGZkLCBhcmdzKTsKQEAgLTUxMywxMiArNjYyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGJpbmRlciwKICAgICAgICAgICAgICAgICAgICAgZ2V0V2FrZUxvY2tUYWcoKSwKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhIiksCi0gICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICAgICAgYmluZGVyLAogICAgICAgICAgICAgICAgICAgICBnZXRXYWtlTG9ja1RhZygpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYSIpLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CkBAIC01MzgsNyArNjg5LDggQEAKICAgICBpZiAobVdha2VMb2NrVG9rZW4gIT0gMCkgewogICAgICAgICBBTE9HVigicmVsZWFzZVdha2VMb2NrX2woKSAlcyIsIG1OYW1lKTsKICAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwKTsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICB9CiAgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CiAgICAgfQpAQCAtNTc0LDcgKzcyNiw4IEBACiAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPnVwZGF0ZVdha2VMb2NrVWlkcyhtV2FrZUxvY2tUb2tlbiwgdWlkcy5zaXplKCksIHVpZHMuYXJyYXkoKSk7CisgICAgICAgIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPnVwZGF0ZVdha2VMb2NrVWlkcyhtV2FrZUxvY2tUb2tlbiwgdWlkcy5zaXplKCksIHVpZHMuYXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICBBTE9HVigiYWNxdWlyZVdha2VMb2NrX2woKSAlcyBzdGF0dXMgJWQiLCBtTmFtZSwgc3RhdHVzKTsKICAgICB9CiB9CkBAIC01ODYsNyArNzM5LDcgQEAKICAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewpAQCAtNzM5LDggKzg5Miw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgIGludCAqZW5hYmxlZCwKLSAgICAgICAgc3RhdHVzX3QgKnN0YXR1cwotICAgICAgICApCisgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CiAgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7CkBAIC03NTYsNiArOTA4LDI0IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBEaXJlY3Qgb3V0cHV0IHRocmVhZHMgZm9yIG5vdywgc2luY2UgdGhlIGZvcm1hdCBvZgorICAgIC8vIG1TaW5rQnVmZmVyIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBlZmZlY3QgcHJvY2Vzc2luZyAoUENNIDE2IHN0ZXJlbykuCisgICAgaWYgKG1UeXBlID09IERJUkVDVCkgeworICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGVmZmVjdCAlcyBvbiBEaXJlY3Qgb3V0cHV0IHR5cGUgdGhyZWFkICVzIiwKKyAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBtTmFtZSk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBtaXhlciBvciBkdXBsaWNhdGluZyBtdWx0aWNoYW5uZWwgc2lua3MuCisgICAgLy8gVE9ETzogZml4IGJvdGggZm9ybWF0IGFuZCBtdWx0aWNoYW5uZWwgaXNzdWVzIHdpdGggZWZmZWN0cy4KKyAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSAmJiBtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7CisgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgZWZmZWN0ICVzIGZvciBtdWx0aWNoYW5uZWwoJWQpICVzIHRocmVhZHMiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1DaGFubmVsQ291bnQsIG1UeXBlID09IE1JWEVSID8gIk1JWEVSIiA6ICJEVVBMSUNBVElORyIpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCiAgICAgLy8gQWxsb3cgZ2xvYmFsIGVmZmVjdHMgb25seSBvbiBvZmZsb2FkZWQgYW5kIG1peGVyIHRocmVhZHMKICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICBzd2l0Y2ggKG1UeXBlKSB7CkBAIC04MjksNyArOTk5LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIGVmZmVjdCBoYW5kbGUgYW5kIGNvbm5lY3QgaXQgdG8gZWZmZWN0IG1vZHVsZQogICAgICAgICBoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKGVmZmVjdCwgY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5KTsKLSAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgIGxTdGF0dXMgPSBoYW5kbGUtPmluaXRDaGVjaygpOworICAgICAgICBpZiAobFN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGVuYWJsZWQgIT0gTlVMTCkgewogICAgICAgICAgICAgKmVuYWJsZWQgPSAoaW50KWVmZmVjdC0+aXNFbmFibGVkKCk7CiAgICAgICAgIH0KQEAgLTg1MCw5ICsxMDIzLDcgQEAKICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgfQogCi0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCkBAIC05NzYsMjEgKzExNDcsMTggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkaXNjb25uZWN0RWZmZWN0KGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVucGluSWZMYXN0KSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJkaXNjb25uZWN0RWZmZWN0KCkgJXAgZWZmZWN0ICVwIiwgdGhpcywgZWZmZWN0LmdldCgpKTsKLSAgICAvLyBkZWxldGUgdGhlIGVmZmVjdCBtb2R1bGUgaWYgcmVtb3ZpbmcgbGFzdCBoYW5kbGUgb24gaXQKLSAgICBpZiAoZWZmZWN0LT5yZW1vdmVIYW5kbGUoaGFuZGxlKSA9PSAwKSB7Ci0gICAgICAgIGlmICghZWZmZWN0LT5pc1Bpbm5lZCgpIHx8IHVucGluSWZMYXN0KSB7Ci0gICAgICAgICAgICByZW1vdmVFZmZlY3RfbChlZmZlY3QpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0LT5pZCgpKTsKLSAgICAgICAgfQotICAgIH0KK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgY29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBjb25maWctPmV4dC5taXguaGFuZGxlID0gbUlkOworICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICBjb25maWctPmZvcm1hdCA9IG1Gb3JtYXQ7CisgICAgY29uZmlnLT5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7CisgICAgY29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ7CiB9CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBQbGF5YmFjawogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTAwMSw4ICsxMTY5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUpCiAgICAgOiAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgZGV2aWNlLCBBVURJT19ERVZJQ0VfTk9ORSwgdHlwZSksCi0gICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KDApLCBtTWl4QnVmZmVyKE5VTEwpLAotICAgICAgICBtQWxsb2NNaXhCdWZmZXIoTlVMTCksIG1TdXNwZW5kZWQoMCksIG1CeXRlc1dyaXR0ZW4oMCksCisgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KDApLCBtU2lua0J1ZmZlcihOVUxMKSwKKyAgICAgICAgbU1peGVyQnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCisgICAgICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKKyAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQoZmFsc2UpLAorICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCisgICAgICAgIG1FZmZlY3RCdWZmZXIoTlVMTCksCisgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplKDApLAorICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkKGZhbHNlKSwKKyAgICAgICAgbVN1c3BlbmRlZCgwKSwgbUJ5dGVzV3JpdHRlbigwKSwKICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCksCiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJvZHkKICAgICAgICAgbU91dHB1dChvdXRwdXQpLApAQCAtMTA0NCwxMSArMTIyMiwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKKyAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKICAgICAvLyBtU3RyZWFtVHlwZXNbQVVESU9fU1RSRUFNX0NOVF0gaXMgaW5pdGlhbGl6ZWQgYnkgc3RyZWFtX3R5cGVfdCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgLy8gVGhlcmUgaXMgbm8gQVVESU9fU1RSRUFNX01JTiwgYW5kICsrIG9wZXJhdG9yIGRvZXMgbm90IGNvbXBpbGUKLSAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7CiAgICAgICAgICAgICBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKHN0cmVhbSArIDEpKSB7CiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbVZvbHVtZV9sKHN0cmVhbSk7CiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1NdXRlX2woc3RyZWFtKTsKQEAgLTEwNjAsNyArMTIzOCw5IEBACiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp+UGxheWJhY2tUaHJlYWQoKQogewogICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobU5CTG9nV3JpdGVyKTsKLSAgICBkZWxldGUgW10gbUFsbG9jTWl4QnVmZmVyOworICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgIGZyZWUobU1peGVyQnVmZmVyKTsKKyAgICBmcmVlKG1FZmZlY3RCdWZmZXIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtMTA3MCwxMyArMTI1MCwxMyBAQAogICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIk91dHB1dCB0aHJlYWQgJXAgc3RyZWFtIHZvbHVtZXMgaW4gZEI6XG4gICAgIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBTdHJlYW0gdm9sdW1lcyBpbiBkQjogIik7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyArK2kpIHsKICAgICAgICAgY29uc3Qgc3RyZWFtX3R5cGVfdCAqc3QgPSAmbVN0cmVhbVR5cGVzW2ldOwogICAgICAgICBpZiAoaSA+IDApIHsKQEAgLTEwOTEsNzUgKzEyNzEsNjggQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogICAgIHJlc3VsdC5jbGVhcigpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0cHV0IHRocmVhZCAlcCB0cmFja3NcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICBpZiAodHJhY2sgIT0gMCkgewotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgYWN0aXZlIHRyYWNrc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQWN0aXZlVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOwotICAgICAgICBpZiAodHJhY2sgIT0gMCkgewotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQogICAgIC8vIFRoZXNlIHZhbHVlcyBhcmUgInJhdyI7IHRoZXkgd2lsbCB3cmFwIGFyb3VuZC4gIFNlZSBwcmVwYXJlVHJhY2tzX2woKSBmb3IgYSBiZXR0ZXIgd2F5LgogICAgIEZhc3RUcmFja1VuZGVycnVucyB1bmRlcnJ1bnMgPSBnZXRGYXN0VHJhY2tVbmRlcnJ1bnMoMCk7Ci0gICAgZmRwcmludGYoZmQsICJOb3JtYWwgbWl4ZXIgcmF3IHVuZGVycnVuIGNvdW50ZXJzOiBwYXJ0aWFsPSV1IGVtcHR5PSV1XG4iLAorICAgIGRwcmludGYoZmQsICIgIE5vcm1hbCBtaXhlciByYXcgdW5kZXJydW4gY291bnRlcnM6IHBhcnRpYWw9JXUgZW1wdHk9JXVcbiIsCiAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCwgdW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5KTsKKworICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgZHByaW50ZihmZCwgIiAgJWQgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CisgICAgaWYgKG51bXRyYWNrcykgeworICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICVkIGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA+PSAwOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtYWN0aXZlc2VlbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7CisgICAgICAgIC8vIHNvbWUgdHJhY2tzIGluIHRoZSBhY3RpdmUgbGlzdCB3ZXJlIG5vdCBpbiB0aGUgdHJhY2tzIGxpc3QKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgeworICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCAmJiBtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dCB0aHJlYWQgJXAgaW50ZXJuYWxzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiTm9ybWFsIGZyYW1lIGNvdW50OiAlZFxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJsYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsCi0gICAgICAgICAgICBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJ0b3RhbCB3cml0ZXM6ICVkXG4iLCBtTnVtV3JpdGVzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiZGVsYXllZCB3cml0ZXM6ICVkXG4iLCBtTnVtRGVsYXllZFdyaXRlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImJsb2NrZWQgaW4gd3JpdGU6ICVkXG4iLCBtSW5Xcml0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInN1c3BlbmQgY291bnQ6ICVkXG4iLCBtU3VzcGVuZGVkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibWl4IGJ1ZmZlciA6ICVwXG4iLCBtTWl4QnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgZmRwcmludGYoZmQsICJGYXN0IHRyYWNrIGF2YWlsTWFzaz0lI3hcbiIsIG1GYXN0VHJhY2tBdmFpbE1hc2spOworICAgIGRwcmludGYoZmQsICJcbk91dHB1dCB0aHJlYWQgJXA6XG4iLCB0aGlzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOworICAgIGRwcmludGYoZmQsICIgIExhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwgbnMybXMoc3lzdGVtVGltZSgpIC0gbUxhc3RXcml0ZVRpbWUpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBUb3RhbCB3cml0ZXM6ICVkXG4iLCBtTnVtV3JpdGVzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBEZWxheWVkIHdyaXRlczogJWRcbiIsIG1OdW1EZWxheWVkV3JpdGVzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBCbG9ja2VkIGluIHdyaXRlOiAlc1xuIiwgbUluV3JpdGUgPyAieWVzIiA6ICJubyIpOworICAgIGRwcmludGYoZmQsICIgIFN1c3BlbmQgY291bnQ6ICVkXG4iLCBtU3VzcGVuZGVkKTsKKyAgICBkcHJpbnRmKGZkLCAiICBTaW5rIGJ1ZmZlciA6ICVwXG4iLCBtU2lua0J1ZmZlcik7CisgICAgZHByaW50ZihmZCwgIiAgTWl4ZXIgYnVmZmVyOiAlcFxuIiwgbU1peGVyQnVmZmVyKTsKKyAgICBkcHJpbnRmKGZkLCAiICBFZmZlY3QgYnVmZmVyOiAlcFxuIiwgbUVmZmVjdEJ1ZmZlcik7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbE1hc2s9JSN4XG4iLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKIAogICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKIH0KIAogLy8gVGhyZWFkIHZpcnR1YWxzCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkeVRvUnVuKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dJKCJBdWRpb0ZsaW5nZXIncyB0aHJlYWQgJXAgcmVhZHkgdG8gcnVuIiwgdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIk5vIHdvcmtpbmcgYXVkaW8gZHJpdmVyIGZvdW5kLiIpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQogewpAQCAtMTE4Miw3ICsxMzU1LDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLApAQCAtMTE5MCw2ICsxMzYzLDcgQEAKICAgICAgICAgaW50IHVpZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9ICpwRnJhbWVDb3VudDsKICAgICBzcDxUcmFjaz4gdHJhY2s7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIApAQCAtMTIxNSwxMyArMTM4OSwxMiBAQAogICAgICAgICAgICAgKSAmJgogICAgICAgICAgICAgLy8gUENNIGRhdGEKICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJgotICAgICAgICAgICAgLy8gbW9ubyBvciBzdGVyZW8KLSAgICAgICAgICAgICggKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8Ci0gICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pICkgJiYKLSNpZm5kZWYgRkFTVF9UUkFDS1NfQVRfTk9OX05BVElWRV9TQU1QTEVfUkFURQorICAgICAgICAgICAgLy8gaWRlbnRpY2FsIGNoYW5uZWwgbWFzayB0byBzaW5rLCBvciBtb25vIGluIGFuZCBzdGVyZW8gc2luaworICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG1DaGFubmVsTWFzayB8fAorICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSAmJgogICAgICAgICAgICAgLy8gaGFyZHdhcmUgc2FtcGxlIHJhdGUKICAgICAgICAgICAgIChzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlKSAmJgotI2VuZGlmCiAgICAgICAgICAgICAvLyBub3JtYWwgbWl4ZXIgaGFzIGFuIGFzc29jaWF0ZWQgZmFzdCBtaXhlcgogICAgICAgICAgICAgaGFzRmFzdE1peGVyKCkgJiYKICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBzdWZmaWNpZW50IGZhc3QgdHJhY2sgc2xvdHMgYXZhaWxhYmxlCkBAIC0xMjMxLDE1ICsxNDA0LDIxIEBACiAgICAgICAgICkgewogICAgICAgICAvLyBpZiBmcmFtZUNvdW50IG5vdCBzcGVjaWZpZWQsIHRoZW4gaXQgZGVmYXVsdHMgdG8gZmFzdCBtaXhlciAoSEFMKSBmcmFtZSBjb3VudAogICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbUZyYW1lQ291bnQgKiBrRmFzdFRyYWNrTXVsdGlwbGllcjsKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIGZhc3QgdHJhY2sgbXVsdGlwbGllciBwcm9wZXJ0eSB0aGUgZmlyc3QgdGltZSBpdCBpcyBuZWVkZWQKKyAgICAgICAgICAgIGludCBvayA9IHB0aHJlYWRfb25jZSgmc0Zhc3RUcmFja011bHRpcGxpZXJPbmNlLCBzRmFzdFRyYWNrTXVsdGlwbGllckluaXQpOworICAgICAgICAgICAgaWYgKG9rICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgcHRocmVhZF9vbmNlIGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgb2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50ICogc0Zhc3RUcmFja011bHRpcGxpZXI7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgYWNjZXB0ZWQ6IGZyYW1lQ291bnQ9JWQgbUZyYW1lQ291bnQ9JWQiLAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZDogaXNUaW1lZD0lZCBzaGFyZWRCdWZmZXI9JXAgZnJhbWVDb3VudD0lZCAiCi0gICAgICAgICAgICAgICAgIm1GcmFtZUNvdW50PSVkIGZvcm1hdD0lZCBpc0xpbmVhcj0lZCBjaGFubmVsTWFzaz0lI3ggc2FtcGxlUmF0ZT0ldSBtU2FtcGxlUmF0ZT0ldSAiCisgICAgICAgICAgICAgICAgIm1GcmFtZUNvdW50PSVkIGZvcm1hdD0lI3ggbUZvcm1hdD0lI3ggaXNMaW5lYXI9JWQgY2hhbm5lbE1hc2s9JSN4ICIKKyAgICAgICAgICAgICAgICAic2FtcGxlUmF0ZT0ldSBtU2FtcGxlUmF0ZT0ldSAiCiAgICAgICAgICAgICAgICAgImhhc0Zhc3RNaXhlcj0lZCB0aWQ9JWQgZmFzdFRyYWNrQXZhaWxNYXNrPSUjeCIsCi0gICAgICAgICAgICAgICAgaXNUaW1lZCwgc2hhcmVkQnVmZmVyLmdldCgpLCBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgZm9ybWF0LAorICAgICAgICAgICAgICAgIGlzVGltZWQsIHNoYXJlZEJ1ZmZlci5nZXQoKSwgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIGZvcm1hdCwgbUZvcm1hdCwKICAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksCiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYXNGYXN0TWl4ZXIoKSwgdGlkLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKICAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwpAQCAtMTI1OCw0NCArMTQzNyw1MiBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQorICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAKLSAgICBpZiAobVR5cGUgPT0gRElSRUNUKSB7Ci0gICAgICAgIGlmICgoZm9ybWF0ICYgQVVESU9fRk9STUFUX01BSU5fTUFTSykgPT0gQVVESU9fRk9STUFUX1BDTSkgeworICAgIHN3aXRjaCAobVR5cGUpIHsKKworICAgIGNhc2UgRElSRUNUOgorICAgICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CiAgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSB8fCBmb3JtYXQgIT0gbUZvcm1hdCB8fCBjaGFubmVsTWFzayAhPSBtQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJXUgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAweCUwOHggIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAldSBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCUwOHggIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJSN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIG1PdXRwdXQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtVHlwZSA9PSBPRkZMT0FEKSB7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPRkZMT0FEOgogICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSB8fCBmb3JtYXQgIT0gbUZvcm1hdCB8fCBjaGFubmVsTWFzayAhPSBtQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrIDB4JTA4eCBcIiIKLSAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICVkIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrIDB4JTA4eCBcIiIKKyAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJSN4IiwKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbU91dHB1dCwgbUZvcm1hdCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKChmb3JtYXQgJiBBVURJT19GT1JNQVRfTUFJTl9NQVNLKSAhPSBBVURJT19GT1JNQVRfUENNKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBmb3JtYXQgJWQgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlZCIsCisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IGZvcm1hdCAlI3ggXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlI3giLAogICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBtT3V0cHV0LCBtRm9ybWF0KTsKICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotICAgICAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgotICAgICAgICBpZiAoc2FtcGxlUmF0ZSA+IG1TYW1wbGVSYXRlKjIpIHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiBtU2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgewogICAgICAgICAgICAgQUxPR0UoIlNhbXBsZSByYXRlIG91dCBvZiByYW5nZTogJXUgbVNhbXBsZVJhdGUgJXUiLCBzYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CisgICAgICAgIGJyZWFrOworCiAgICAgfQogCiAgICAgbFN0YXR1cyA9IGluaXRDaGVjaygpOwogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIGF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIApAQCAtMTMwOCw3ICsxNDk1LDcgQEAKICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3kgPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtVHlwZSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHQgPSBtVHJhY2tzW2ldOwotICAgICAgICAgICAgaWYgKHQgIT0gMCAmJiAhdC0+aXNPdXRwdXRUcmFjaygpKSB7CisgICAgICAgICAgICBpZiAodCAhPSAwICYmIHQtPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0dWFsID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHQtPnN0cmVhbVR5cGUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0LT5zZXNzaW9uSWQoKSAmJiBzdHJhdGVneSAhPSBhY3R1YWwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBtaXNtYXRjaGVkIHN0cmF0ZWd5OyBleHBlY3RlZCAldSBidXQgZm91bmQgJXUiLApAQCAtMTMyMSwxOCArMTUwOCwyMSBAQAogCiAgICAgICAgIGlmICghaXNUaW1lZCkgewogICAgICAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxUKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyYWNrID0gVGltZWRUcmFjazo6Y3JlYXRlKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsIHVpZCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodHJhY2sgPT0gMCB8fCB0cmFjay0+Z2V0Q2JsaygpID09IE5VTEwgfHwgdHJhY2stPm5hbWUoKSA8IDApIHsKLSAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgIC8vIG5ldyBUcmFjayBhbHdheXMgcmV0dXJucyBub24tTlVMTCwKKyAgICAgICAgLy8gYnV0IFRpbWVkVHJhY2s6OmNyZWF0ZSgpIGlzIGEgZmFjdG9yeSB0aGF0IGNvdWxkIGZhaWwgYnkgcmV0dXJuaW5nIE5VTEwKKyAgICAgICAgbFN0YXR1cyA9IHRyYWNrICE9IDAgPyB0cmFjay0+aW5pdENoZWNrKCkgOiAoc3RhdHVzX3QpIE5PX01FTU9SWTsKKyAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgaW5pdENoZWNrIGZhaWxlZCAlZDsgbm8gY29udHJvbCBibG9jaz8iLCBsU3RhdHVzKTsKICAgICAgICAgICAgIC8vIHRyYWNrIG11c3QgYmUgY2xlYXJlZCBmcm9tIHRoZSBjYWxsZXIgYXMgdGhlIGNhbGxlciBoYXMgdGhlIEFGIGxvY2sKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotCiAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKIAogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CkBAIC0xMzU0LDkgKzE1NDQsNyBAQAogICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gdHJhY2s7CiB9CiAKQEAgLTE0MzQsNyArMTYyMiw3IEBACiAgICAgICAgIC8vIHRoZSB0cmFjayBpcyBuZXdseSBhZGRlZCwgbWFrZSBzdXJlIGl0IGZpbGxzIHVwIGFsbCBpdHMKICAgICAgICAgLy8gYnVmZmVycyBiZWZvcmUgcGxheWluZy4gVGhpcyBpcyB0byBlbnN1cmUgdGhlIGNsaWVudCB3aWxsCiAgICAgICAgIC8vIGVmZmVjdGl2ZWx5IGdldCB0aGUgbGF0ZW5jeSBpdCByZXF1ZXN0ZWQuCi0gICAgICAgIGlmICghdHJhY2stPmlzT3V0cHV0VHJhY2soKSkgeworICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBUcmFja0Jhc2U6OnRyYWNrX3N0YXRlIHN0YXRlID0gdHJhY2stPm1TdGF0ZTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKQEAgLTE0NzUsOSArMTY2Myw3IEBACiAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIH0KIAotICAgIEFMT0dWKCJzaWduYWwgcGxheWJhY2sgdGhyZWFkIik7Ci0gICAgYnJvYWRjYXN0X2woKTsKLQorICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE0ODksNyArMTY3NSw3IEBACiAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKICAgICBpZiAoIXRyYWNrQWN0aXZlKSB7CiAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOwotICAgIH0gZWxzZSBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkgfHwgdHJhY2stPmlzT2ZmbG9hZGVkKCkpIHsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpIHx8IHRyYWNrLT5pc09mZmxvYWRlZCgpIHx8IHRyYWNrLT5pc0RpcmVjdCgpKSB7CiAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzE7CiAgICAgfQogCkBAIC0xNTQwLDEyICsxNzI2LDExIEBACiAgICAgcmV0dXJuIG91dF9zODsKIH0KIAotLy8gYXVkaW9Db25maWdDaGFuZ2VkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkgewordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwogICAgIHZvaWQgKnBhcmFtMiA9IE5VTEw7CiAKLSAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sLCB0aHJlYWQgJXAsIGV2ZW50ICVkLCBwYXJhbSAlZCIsIHRoaXMsIGV2ZW50LAorICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkLCBwYXJhbSAlZCIsIHRoaXMsIGV2ZW50LAogICAgICAgICAgICAgcGFyYW0pOwogCiAgICAgc3dpdGNoIChldmVudCkgewpAQCAtMTU1Niw3ICsxNzQxLDcgQEAKICAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtTm9ybWFsRnJhbWVDb3VudDsgLy8gRklYTUUgc2VlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXI6OmZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3QpCi0gICAgICAgIGRlc2MubGF0ZW5jeSA9IGxhdGVuY3koKTsKKyAgICAgICAgZGVzYy5sYXRlbmN5ID0gbGF0ZW5jeV9sKCk7CiAgICAgICAgIHBhcmFtMiA9ICZkZXNjOwogICAgICAgICBicmVhazsKIApAQCAtMTU2Niw3ICsxNzUxLDcgQEAKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkX2woZXZlbnQsIG1JZCwgcGFyYW0yKTsKKyAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIG1JZCwgcGFyYW0yKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp3cml0ZUNhbGxiYWNrKCkKQEAgLTE2MDMsNyArMTc4OCw3IEBACiAKIC8vIHN0YXRpYwogaW50IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmFtIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQogewogICAgIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKm1lID0gKEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKiljb29raWU7CkBAIC0xNjIyLDI5ICsxODA3LDMzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnMoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKIHsKLSAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY292ZXJpbmcgZnJvbSBlcnJvcnMgaGVyZSwgaGVuY2UgdGhlIExPR19GQVRBTAorICAgIC8vIHVuZm9ydHVuYXRlbHkgd2UgaGF2ZSBubyB3YXkgb2YgcmVjb3ZlcmluZyBmcm9tIGVycm9ycyBoZXJlLCBoZW5jZSB0aGUgTE9HX0FMV0FZU19GQVRBTAogICAgIG1TYW1wbGVSYXRlID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUNoYW5uZWxNYXNrID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChtQ2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIExPR19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtQ2hhbm5lbE1hc2spOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1DaGFubmVsTWFzayk7CiAgICAgfQotICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpICYmIG1DaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQ7ICIKLSAgICAgICAgICAgICAgICAibXVzdCBiZSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLCBtQ2hhbm5lbE1hc2spOworICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpCisgICAgICAgICAgICAmJiAhaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2spKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dCIsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrKTsKICAgICB9Ci0gICAgbUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1DaGFubmVsTWFzayk7Ci0gICAgbUZvcm1hdCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgbUhBTEZvcm1hdCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChtRm9ybWF0KSkgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJWQgbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKICAgICB9Ci0gICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykgJiYgbUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJWQgbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0OyBtdXN0IGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIiwKKyAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKQorICAgICAgICAgICAgJiYgIWlzVmFsaWRQY21TaW5rRm9ybWF0KG1Gb3JtYXQpKSB7CisgICAgICAgIExPR19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0IiwKICAgICAgICAgICAgICAgICBtRm9ybWF0KTsKICAgICB9Ci0gICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUZyYW1lQ291bnQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKSAvIG1GcmFtZVNpemU7CisgICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtT3V0cHV0LT5zdHJlYW0pOworICAgIG1CdWZmZXJTaXplID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZyYW1lQ291bnQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7CiAgICAgaWYgKG1GcmFtZUNvdW50ICYgMTUpIHsKICAgICAgICAgQUxPR1coIkhBTCBvdXRwdXQgYnVmZmVyIHNpemUgaXMgJXUgZnJhbWVzIGJ1dCBBdWRpb01peGVyIHJlcXVpcmVzIG11bHRpcGxlcyBvZiAxNiBmcmFtZXMiLAogICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKQEAgLTE2NTksMTIgKzE4NDgsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIENhbGN1bGF0ZSBzaXplIG9mIG5vcm1hbCBtaXggYnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBIQUwgb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgLy8gQ2FsY3VsYXRlIHNpemUgb2Ygbm9ybWFsIHNpbmsgYnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBIQUwgb3V0cHV0IGJ1ZmZlciBzaXplCiAgICAgZG91YmxlIG11bHRpcGxpZXIgPSAxLjA7CiAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmIChrVXNlRmFzdE1peGVyID09IEZhc3RNaXhlcl9TdGF0aWMgfHwKICAgICAgICAgICAgIGtVc2VGYXN0TWl4ZXIgPT0gRmFzdE1peGVyX0R5bmFtaWMpKSB7Ci0gICAgICAgIHNpemVfdCBtaW5Ob3JtYWxGcmFtZUNvdW50ID0gKGtNaW5Ob3JtYWxNaXhCdWZmZXJTaXplTXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOwotICAgICAgICBzaXplX3QgbWF4Tm9ybWFsRnJhbWVDb3VudCA9IChrTWF4Tm9ybWFsTWl4QnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKKyAgICAgICAgc2l6ZV90IG1pbk5vcm1hbEZyYW1lQ291bnQgPSAoa01pbk5vcm1hbFNpbmtCdWZmZXJTaXplTXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOworICAgICAgICBzaXplX3QgbWF4Tm9ybWFsRnJhbWVDb3VudCA9IChrTWF4Tm9ybWFsU2lua0J1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CiAgICAgICAgIC8vIHJvdW5kIHVwIG1pbmltdW0gYW5kIHJvdW5kIGRvd24gbWF4aW11bSB0byBuZWFyZXN0IDE2IGZyYW1lcyB0byBzYXRpc2Z5IEF1ZGlvTWl4ZXIKICAgICAgICAgbWluTm9ybWFsRnJhbWVDb3VudCA9IChtaW5Ob3JtYWxGcmFtZUNvdW50ICsgMTUpICYgfjE1OwogICAgICAgICBtYXhOb3JtYWxGcmFtZUNvdW50ID0gbWF4Tm9ybWFsRnJhbWVDb3VudCAmIH4xNTsKQEAgLTE2ODIsNyArMTg3MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBwcmVmZXIgYW4gZXZlbiBtdWx0aXBsaWVyLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGRvdWJsaW5nIG9mIGZhc3QgdHJhY2tzIGR1ZSB0byBIQUwKLSAgICAgICAgICAgIC8vIFNSQyAoaXQgd291bGQgYmUgdW51c3VhbCBmb3IgdGhlIG5vcm1hbCBtaXggYnVmZmVyIHNpemUgdG8gbm90IGJlIGEgbXVsdGlwbGUgb2YgZmFzdAorICAgICAgICAgICAgLy8gU1JDIChpdCB3b3VsZCBiZSB1bnVzdWFsIGZvciB0aGUgbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUgdG8gbm90IGJlIGEgbXVsdGlwbGUgb2YgZmFzdAogICAgICAgICAgICAgLy8gdHJhY2ssIGJ1dCB3ZSBzb21ldGltZXMgaGF2ZSB0byBkbyB0aGlzIHRvIHNhdGlzZnkgdGhlIG1heGltdW0gZnJhbWUgY291bnQKICAgICAgICAgICAgIC8vIGNvbnN0cmFpbnQpCiAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIHJvdW5kaW5nIHVwIHNob3VsZCBub3QgYmUgZG9uZSBpZiBubyBIQUwgU1JDCkBAIC0xNjk3LDE5ICsxODg2LDQzIEBACiAgICAgfQogICAgIG1Ob3JtYWxGcmFtZUNvdW50ID0gbXVsdGlwbGllciAqIG1GcmFtZUNvdW50OwogICAgIC8vIHJvdW5kIHVwIHRvIG5lYXJlc3QgMTYgZnJhbWVzIHRvIHNhdGlzZnkgQXVkaW9NaXhlcgotICAgIG1Ob3JtYWxGcmFtZUNvdW50ID0gKG1Ob3JtYWxGcmFtZUNvdW50ICsgMTUpICYgfjE1OwotICAgIEFMT0dJKCJIQUwgb3V0cHV0IGJ1ZmZlciBzaXplICV1IGZyYW1lcywgbm9ybWFsIG1peCBidWZmZXIgc2l6ZSAldSBmcmFtZXMiLCBtRnJhbWVDb3VudCwKKyAgICBpZiAobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpIHsKKyAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgPSAobU5vcm1hbEZyYW1lQ291bnQgKyAxNSkgJiB+MTU7CisgICAgfQorICAgIEFMT0dJKCJIQUwgb3V0cHV0IGJ1ZmZlciBzaXplICV1IGZyYW1lcywgbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUgJXUgZnJhbWVzIiwgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCk7CiAKLSAgICBkZWxldGVbXSBtQWxsb2NNaXhCdWZmZXI7Ci0gICAgc2l6ZV90IGFsaWduID0gKG1GcmFtZVNpemUgPCBzaXplb2YoaW50MTZfdCkpID8gc2l6ZW9mKGludDE2X3QpIDogbUZyYW1lU2l6ZTsKLSAgICBtQWxsb2NNaXhCdWZmZXIgPSBuZXcgaW50OF90W21Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZSArIGFsaWduIC0gMV07Ci0gICAgbU1peEJ1ZmZlciA9IChpbnQxNl90ICopICgoKChzaXplX3QpbUFsbG9jTWl4QnVmZmVyICsgYWxpZ24gLSAxKSAvIGFsaWduKSAqIGFsaWduKTsKLSAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAvLyBtU2lua0J1ZmZlciBpcyB0aGUgc2luayBidWZmZXIuICBTaXplIGlzIGFsd2F5cyBtdWx0aXBsZS1vZi0xNiBmcmFtZXMuCisgICAgLy8gT3JpZ2luYWxseSB0aGlzIHdhcyBpbnQxNl90W10gYXJyYXksIG5lZWQgdG8gcmVtb3ZlIGxlZ2FjeSBpbXBsaWNhdGlvbnMuCisgICAgZnJlZShtU2lua0J1ZmZlcik7CisgICAgbVNpbmtCdWZmZXIgPSBOVUxMOworICAgIC8vIEZvciBzaW5rIGJ1ZmZlciBzaXplLCB3ZSB1c2UgdGhlIGZyYW1lIHNpemUgZnJvbSB0aGUgZG93bnN0cmVhbSBzaW5rIHRvIGF2b2lkIHByb2JsZW1zCisgICAgLy8gd2l0aCBub24gUENNIGZvcm1hdHMgZm9yIGNvbXByZXNzZWQgbXVzaWMsIGUuZy4gQUFDLCBhbmQgT2ZmbG9hZCB0aHJlYWRzLgorICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKKyAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVNpbmtCdWZmZXIsIDMyLCBzaW5rQnVmZmVyU2l6ZSk7CisKKyAgICAvLyBXZSByZXNpemUgdGhlIG1NaXhlckJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgc2luayBidWZmZXIgd2hpY2gKKyAgICAvLyBkcml2ZXMgdGhlIG91dHB1dC4KKyAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CisgICAgbU1peGVyQnVmZmVyID0gTlVMTDsKKyAgICBpZiAobU1peGVyQnVmZmVyRW5hYmxlZCkgeworICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOyAvLyBhbHNvIHZhbGlkOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbU1peGVyQnVmZmVyLCAzMiwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgfQorICAgIGZyZWUobUVmZmVjdEJ1ZmZlcik7CisgICAgbUVmZmVjdEJ1ZmZlciA9IE5VTEw7CisgICAgaWYgKG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CisgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gTm90ZTogRWZmZWN0cyBzdXBwb3J0IDE2YiBvbmx5CisgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1FZmZlY3RCdWZmZXJGb3JtYXQpOworICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUVmZmVjdEJ1ZmZlciwgMzIsIG1FZmZlY3RCdWZmZXJTaXplKTsKKyAgICB9CiAKICAgICAvLyBmb3JjZSByZWNvbmZpZ3VyYXRpb24gb2YgZWZmZWN0IGNoYWlucyBhbmQgZW5naW5lcyB0byB0YWtlIG5ldyBidWZmZXIgc2l6ZSBhbmQgYXVkaW8KICAgICAvLyBwYXJhbWV0ZXJzIGludG8gYWNjb3VudAotICAgIC8vIE5vdGUgdGhhdCBtTG9jayBpcyBub3QgaGVsZCB3aGVuIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCisgICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgogICAgIC8vIGJ1dCBpbiB0aGlzIGNhc2Ugbm90aGluZyBpcyBkb25lIGJlbG93IGFzIG5vIGF1ZGlvIHNlc3Npb25zIGhhdmUgZWZmZWN0IHlldCBzbyBpdCBkb2Vzbid0CiAgICAgLy8gbWF0dGVyLgogICAgIC8vIGNyZWF0ZSBhIGNvcHkgb2YgbUVmZmVjdENoYWlucyBhcyBjYWxsaW5nIG1vdmVFZmZlY3RDaGFpbl9sKCkgY2FuIHJlb3JkZXIgc29tZSBlZmZlY3QgY2hhaW5zCkBAIC0xNzIwLDcgKzE5MzMsNyBAQAogfQogCiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpCiB7CiAgICAgaWYgKGhhbEZyYW1lcyA9PSBOVUxMIHx8IGRzcEZyYW1lcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0xNzM4LDcgKzE5NTEsMTEgQEAKICAgICAgICAgKmRzcEZyYW1lcyA9IGZyYW1lc1dyaXR0ZW4gPj0gbGF0ZW5jeUZyYW1lcyA/IGZyYW1lc1dyaXR0ZW4gLSBsYXRlbmN5RnJhbWVzIDogMDsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtT3V0cHV0LT5zdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obU91dHB1dC0+c3RyZWFtLCBkc3BGcmFtZXMpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHVpbnQzMl90IGZyYW1lczsKKyAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1PdXRwdXQtPnN0cmVhbSwgJmZyYW1lcyk7CisgICAgICAgICpkc3BGcmFtZXMgPSAoc2l6ZV90KWZyYW1lczsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiB9CiAKQEAgLTE4MzksMTAgKzIwNTYsMTAgQEAKICAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7CiAgICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCkgeworICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIXRyYWNrLT5pc091dHB1dFRyYWNrKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogICAgICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCkBAIC0xODgwLDEyICsyMDk3LDEzIEBACiAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgbUluV3JpdGUgPSB0cnVlOwogICAgIHNzaXplX3QgYnl0ZXNXcml0dGVuOworICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBtQ3VycmVudFdyaXRlTGVuZ3RoIC0gbUJ5dGVzUmVtYWluaW5nOwogCiAgICAgLy8gSWYgYW4gTkJBSU8gc2luayBpcyBwcmVzZW50LCB1c2UgaXQgdG8gd3JpdGUgdGhlIG5vcm1hbCBtaXhlcidzIHN1Ym1peAogICAgIGlmIChtTm9ybWFsU2luayAhPSAwKSB7Ci0jZGVmaW5lIG1CaXRTaGlmdCAyIC8vIEZJWE1FCi0gICAgICAgIHNpemVfdCBjb3VudCA9IG1CeXRlc1JlbWFpbmluZyA+PiBtQml0U2hpZnQ7Ci0gICAgICAgIHNpemVfdCBvZmZzZXQgPSAobUN1cnJlbnRXcml0ZUxlbmd0aCAtIG1CeXRlc1JlbWFpbmluZykgPj4gMTsKKworICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBtQnl0ZXNSZW1haW5pbmcgLyBtRnJhbWVTaXplOworCiAgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKICAgICAgICAgLy8gdXBkYXRlIHRoZSBzZXRwb2ludCB3aGVuIEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlIGNoYW5nZXMKICAgICAgICAgdWludDMyX3Qgc2NyZWVuU3RhdGUgPSBBdWRpb0ZsaW5nZXI6Om1TY3JlZW5TdGF0ZTsKQEAgLTE4OTcsMTAgKzIxMTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChwaXBlLT5tYXhGcmFtZXMoKSAqIDcpIC8gOCA6IG1Ob3JtYWxGcmFtZUNvdW50ICogMik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbU5vcm1hbFNpbmstPndyaXRlKG1NaXhCdWZmZXIgKyBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbU5vcm1hbFNpbmstPndyaXRlKChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+IDApIHsKLSAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW4gPDwgbUJpdFNoaWZ0OworICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiAqIG1GcmFtZVNpemU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuOwogICAgICAgICB9CkBAIC0xOTA5LDEzICsyMTI3LDE0IEBACiAgICAgICAgICAgICBzaXplX3QgdG90YWxGcmFtZXNXcml0dGVuID0gbU5vcm1hbFNpbmstPmZyYW1lc1dyaXR0ZW4oKTsKICAgICAgICAgICAgIGlmICh0b3RhbEZyYW1lc1dyaXR0ZW4gPj0gbUxhdGNoRC5tVGltZXN0YW1wLm1Qb3NpdGlvbikgewogICAgICAgICAgICAgICAgIG1MYXRjaEQubVVucHJlc2VudGVkRnJhbWVzID0gdG90YWxGcmFtZXNXcml0dGVuIC0gbUxhdGNoRC5tVGltZXN0YW1wLm1Qb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAvLyBtTGF0Y2hELm1GcmFtZXNSZWxlYXNlZCBpcyBzZXQgaW1tZWRpYXRlbHkgYmVmb3JlIEQgaXMgY2xvY2tlZCBpbnRvIFEKICAgICAgICAgICAgICAgICBtTGF0Y2hEVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgSEFMIC8gQXVkaW9TdHJlYW1PdXQgZGlyZWN0bHkKICAgICB9IGVsc2UgewogICAgICAgICAvLyBEaXJlY3Qgb3V0cHV0IGFuZCBvZmZsb2FkIHRocmVhZHMKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IChtQ3VycmVudFdyaXRlTGVuZ3RoIC0gbUJ5dGVzUmVtYWluaW5nKTsKKwogICAgICAgICBpZiAobVVzZUFzeW5jV3JpdGUpIHsKICAgICAgICAgICAgIEFMT0dXX0lGKG1Xcml0ZUFja1NlcXVlbmNlICYgMSwgInRocmVhZExvb3Bfd3JpdGUoKTogb3V0IG9mIHNlcXVlbmNlIHdyaXRlIHJlcXVlc3QiKTsKICAgICAgICAgICAgIG1Xcml0ZUFja1NlcXVlbmNlICs9IDI7CkBAIC0xOTI2LDcgKzIxNDUsNyBAQAogICAgICAgICAvLyBGSVhNRSBXZSBzaG91bGQgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aW1lc3RhbXBzIGZvciBkaXJlY3Qgb3V0cHV0IHRocmVhZHMuCiAgICAgICAgIC8vIFRoZXkgYXJlIHVzZWQgZS5nIGZvciBtdWx0aWNoYW5uZWwgUENNIHBsYXliYWNrIG92ZXIgSERNSS4KICAgICAgICAgYnl0ZXNXcml0dGVuID0gbU91dHB1dC0+c3RyZWFtLT53cml0ZShtT3V0cHV0LT5zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1NaXhCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1TaW5rQnVmZmVyICsgb2Zmc2V0LCBtQnl0ZXNSZW1haW5pbmcpOwogICAgICAgICBpZiAobVVzZUFzeW5jV3JpdGUgJiYKICAgICAgICAgICAgICAgICAoKGJ5dGVzV3JpdHRlbiA8IDApIHx8IChieXRlc1dyaXR0ZW4gPT0gKHNzaXplX3QpbUJ5dGVzUmVtYWluaW5nKSkpIHsKICAgICAgICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciBhc3luYyBjYWxsYmFjayBpbiBjYXNlIG9mIGVycm9yIG9mIGZ1bGwgd3JpdGUKQEAgLTE5NjUsNyArMjE4NCw3IEBACiAKIC8qCiBUaGUgZGVyaXZlZCB2YWx1ZXMgdGhhdCBhcmUgY2FjaGVkOgotIC0gbWl4QnVmZmVyU2l6ZSBmcm9tIGZyYW1lIGNvdW50ICogZnJhbWUgc2l6ZQorIC0gbVNpbmtCdWZmZXJTaXplIGZyb20gZnJhbWUgY291bnQgKiBmcmFtZSBzaXplCiAgLSBhY3RpdmVTbGVlcFRpbWUgZnJvbSBhY3RpdmVTbGVlcFRpbWVVcygpCiAgLSBpZGxlU2xlZXBUaW1lIGZyb20gaWRsZVNsZWVwVGltZVVzKCkKICAtIHN0YW5kYnlEZWxheSBmcm9tIG1BY3RpdmVTbGVlcFRpbWVVcyAoRElSRUNUIG9ubHkpCkBAIC0xOTg0LDcgKzIyMDMsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNhY2hlUGFyYW1ldGVyc19sKCkKIHsKLSAgICBtaXhCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgIG1TaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICBhY3RpdmVTbGVlcFRpbWUgPSBhY3RpdmVTbGVlcFRpbWVVcygpOwogICAgIGlkbGVTbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lVXMoKTsKIH0KQEAgLTIwMDcsMTMgKzIyMjYsMTQgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKICAgICBpbnQgc2Vzc2lvbiA9IGNoYWluLT5zZXNzaW9uSWQoKTsKLSAgICBpbnQxNl90ICpidWZmZXIgPSBtTWl4QnVmZmVyOworICAgIGludDE2X3QqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1FZmZlY3RCdWZmZXJFbmFibGVkCisgICAgICAgICAgICA/IG1FZmZlY3RCdWZmZXIgOiBtU2lua0J1ZmZlcik7CiAgICAgYm9vbCBvd25zQnVmZmVyID0gZmFsc2U7CiAKICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpICVwIG9uIHRocmVhZCAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLCB0aGlzLCBzZXNzaW9uKTsKICAgICBpZiAoc2Vzc2lvbiA+IDApIHsKICAgICAgICAgLy8gT25seSBvbmUgZWZmZWN0IGNoYWluIGNhbiBiZSBwcmVzZW50IGluIGRpcmVjdCBvdXRwdXQgdGhyZWFkIGFuZCBpdCB1c2VzCi0gICAgICAgIC8vIHRoZSBtaXggYnVmZmVyIGFzIGlucHV0CisgICAgICAgIC8vIHRoZSBzaW5rIGJ1ZmZlciBhcyBpbnB1dAogICAgICAgICBpZiAobVR5cGUgIT0gRElSRUNUKSB7CiAgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBpbnQxNl90W251bVNhbXBsZXNdOwpAQCAtMjA0NSw5ICsyMjY1LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBjaGFpbi0+c2V0VGhyZWFkKHRoaXMpOwogICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihidWZmZXIsIG93bnNCdWZmZXIpOwotICAgIGNoYWluLT5zZXRPdXRCdWZmZXIobU1peEJ1ZmZlcik7CisgICAgY2hhaW4tPnNldE91dEJ1ZmZlcihyZWludGVycHJldF9jYXN0PGludDE2X3QqPihtRWZmZWN0QnVmZmVyRW5hYmxlZAorICAgICAgICAgICAgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXIpKTsKICAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgaW5zZXJ0ZWQgYXQgZW5kIG9mIGVmZmVjdAogICAgIC8vIGNoYWlucyBsaXN0IGluIG9yZGVyIHRvIGJlIHByb2Nlc3NlZCBsYXN0IGFzIGl0IGNvbnRhaW5zIG91dHB1dCBzdGFnZSBlZmZlY3RzCiAgICAgLy8gRWZmZWN0IGNoYWluIGZvciBzZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCBpcyBpbnNlcnRlZCBiZWZvcmUKQEAgLTIwOTcsNyArMjMxOCw3IEBACiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihtTWl4QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obVNpbmtCdWZmZXIpKTsKICAgICAgICAgICAgICAgICAgICAgY2hhaW4tPmRlY1RyYWNrQ250KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjE4NywyOCArMjQwOCwzNiBAQAogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCi0gICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKLQogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCisgICAgICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKKwogICAgICAgICAgICAgaWYgKGxvZ1N0cmluZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbU5CTG9nV3JpdGVyLT5sb2dUaW1lc3RhbXAoKTsKICAgICAgICAgICAgICAgICBtTkJMb2dXcml0ZXItPmxvZyhsb2dTdHJpbmcpOwogICAgICAgICAgICAgICAgIGxvZ1N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIEdhdGhlciB0aGUgZnJhbWVzUmVsZWFzZWQgY291bnRlcnMgZm9yIGFsbCBhY3RpdmUgdHJhY2tzLAorICAgICAgICAgICAgLy8gYW5kIGxhdGNoIHRoZW0gYXRvbWljYWxseSB3aXRoIHRoZSB0aW1lc3RhbXAuCisgICAgICAgICAgICAvLyBGSVhNRSBXZSdyZSB1c2luZyByYXcgcG9pbnRlcnMgYXMgaW5kaWNlcy4gQSB1bmlxdWUgdHJhY2sgSUQgd291bGQgYmUgYSBiZXR0ZXIgaW5kZXguCisgICAgICAgICAgICBtTGF0Y2hELm1GcmFtZXNSZWxlYXNlZC5jbGVhcigpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHQgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXRjaEQubUZyYW1lc1JlbGVhc2VkLmFkZCh0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtTGF0Y2hEVmFsaWQpIHsKICAgICAgICAgICAgICAgICBtTGF0Y2hRID0gbUxhdGNoRDsKICAgICAgICAgICAgICAgICBtTGF0Y2hEVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtTGF0Y2hRVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSkgewotICAgICAgICAgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHNhdmVPdXRwdXRUcmFja3MoKTsKICAgICAgICAgICAgIGlmIChtU2lnbmFsUGVuZGluZykgewogICAgICAgICAgICAgICAgIC8vIEEgc2lnbmFsIHdhcyByYWlzZWQgd2hpbGUgd2Ugd2VyZSB1bmxvY2tlZApAQCAtMjMwMCwxNCArMjUyOSwzMiBAQAogICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgd3JpdHRlbiB0byBIQUwKICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwogICAgICAgICAgICAgICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbWl4QnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFaXRoZXIgdGhyZWFkTG9vcF9taXgoKSBvciB0aHJlYWRMb29wX3NsZWVwVGltZSgpIHNob3VsZCBoYXZlIHNldAorICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyIHdpdGggZGF0YSBpZiBtTWl4ZXJCdWZmZXJWYWxpZCBpcyB0cnVlIGFuZCBzbGVlcFRpbWUgPT0gMC4KKyAgICAgICAgICAgIC8vIE1lcmdlIG1NaXhlckJ1ZmZlciBkYXRhIGludG8gbUVmZmVjdEJ1ZmZlciAoaWYgYW55IGVmZmVjdHMgYXJlIHZhbGlkKQorICAgICAgICAgICAgLy8gb3IgbVNpbmtCdWZmZXIgKGlmIHRoZXJlIGFyZSBubyBlZmZlY3RzKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgcHJlLWVmZmVjdHMgY29tcHV0YXRpb247IGlmIGVmZmVjdHMgY2hhbmdlIHRvCisgICAgICAgICAgICAvLyBzdXBwb3J0IGhpZ2hlciBwcmVjaXNpb24sIHRoaXMgbmVlZHMgdG8gbW92ZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXJWYWxpZCBpcyBvbmx5IHNldCB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKS4KKyAgICAgICAgICAgIC8vIFRPRE8gdXNlIHNsZWVwVGltZSA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgorICAgICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyOworICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1FZmZlY3RCdWZmZXJWYWxpZCA/IG1FZmZlY3RCdWZmZXJGb3JtYXQgOiBtRm9ybWF0OworCisgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChidWZmZXIsIGZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtQ3VycmVudFdyaXRlTGVuZ3RoOwogICAgICAgICAgICAgaWYgKGlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKICAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZSB3cml0ZSB0byBIQUwgd2hlbiBzdXNwZW5kZWQKLSAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1peEJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSBtU2lua0J1ZmZlclNpemU7CiAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKICAgICAgICAgICAgIH0KIApAQCAtMjMyOCw2ICsyNTc1LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBPbmx5IGlmIHRoZSBFZmZlY3RzIGJ1ZmZlciBpcyBlbmFibGVkIGFuZCB0aGVyZSBpcyBkYXRhIGluIHRoZQorICAgICAgICAvLyBFZmZlY3RzIGJ1ZmZlciAoYnVmZmVyIHZhbGlkKSwgd2UgbmVlZCB0bworICAgICAgICAvLyBjb3B5IGludG8gdGhlIHNpbmsgYnVmZmVyLgorICAgICAgICAvLyBUT0RPIHVzZSBzbGVlcFRpbWUgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KKyAgICAgICAgaWYgKG1FZmZlY3RCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgLy9BTE9HVigid3JpdGluZyBlZmZlY3QgYnVmZmVyIHRvIHNpbmsgYnVmZmVyIGZvcm1hdCAlI3giLCBtRm9ybWF0KTsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAKQEAgLTIzNDYsMjAgKzI2MDMsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fQUxMKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgICAgICAgICAgICAgfQotaWYgKG1UeXBlID09IE1JWEVSKSB7Ci0gICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KLSAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gbm93IC0gbUxhc3RXcml0ZVRpbWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBkZWx0YSA+IG1heFBlcmlvZCkgewotICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwotICAgICAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygid3JpdGUgYmxvY2tlZCBmb3IgJWxsdSBtc2VjcywgJWQgZGVsYXllZCB3cml0ZXMsIHRocmVhZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CisgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJsb2NrZWQgZGV0ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gbm93IC0gbUxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgZGVsdGEgPiBtYXhQZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbm93OworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotfQogCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVzbGVlcChzbGVlcFRpbWUpOwpAQCAtMjM4NywxMiArMjY0NCw5IEBACiAKICAgICB0aHJlYWRMb29wX2V4aXQoKTsKIAotICAgIC8vIGZvciBEdXBsaWNhdGluZ1RocmVhZCwgc3RhbmRieSBtb2RlIGlzIGhhbmRsZWQgYnkgdGhlIG91dHB1dFRyYWNrcywgb3RoZXJ3aXNlIC4uLgotICAgIGlmIChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBESVJFQ1QgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgewotICAgICAgICAvLyBwdXQgb3V0cHV0IHN0cmVhbSBpbnRvIHN0YW5kYnkgbW9kZQotICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgIH0KKyAgICBpZiAoIW1TdGFuZGJ5KSB7CisgICAgICAgIHRocmVhZExvb3Bfc3RhbmRieSgpOworICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgfQogCiAgICAgcmVsZWFzZVdha2VMb2NrKCk7CkBAIC0yNDA3LDcgKzI2NjEsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKICAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50KSB7CisgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwogICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwpAQCAtMjQzMyw3ICsyNjg3LDcgQEAKICAgICBpZiAobU5vcm1hbFNpbmsgIT0gMCkgewogICAgICAgICByZXR1cm4gbU5vcm1hbFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogICAgIH0KLSAgICBpZiAobVR5cGUgPT0gT0ZGTE9BRCAmJiBtT3V0cHV0LT5zdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24pIHsKKyAgICBpZiAoKG1UeXBlID09IE9GRkxPQUQgfHwgbVR5cGUgPT0gRElSRUNUKSAmJiBtT3V0cHV0LT5zdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24pIHsKICAgICAgICAgdWludDY0X3QgcG9zaXRpb242NDsKICAgICAgICAgaW50IHJldCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbSwgJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpOwpAQCAtMjQ0NCw2ICsyNjk4LDY3IEBACiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICB0eXBlIHw9IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgIH0KKyAgICAgICAgbU91dERldmljZSA9IHR5cGU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKKyAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VfYXVkaW9fcGF0Y2goaHdEZXZpY2UsIGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJyZWxlYXNlQXVkaW9QYXRjaF9sKCkgY2FsbGVkIG9uIGEgcHJlIDMuMCBIQUwiKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGRlc3Ryb3lUcmFja19sKHRyYWNrKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aGFuZGxlKCk7CisgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6TWl4ZXJUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LApAQCAtMjQ2MywxNSArMjc3OCwxMCBAQAogICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQpOwogICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKIAotICAgIC8vIEZJWE1FIC0gQ3VycmVudCBtaXhlciBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHN0ZXJlbyBvdXRwdXQKLSAgICBpZiAobUNoYW5uZWxDb3VudCAhPSBGQ0NfMikgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBhdWRpbyBoYXJkd2FyZSBjaGFubmVsIGNvdW50ICVkIiwgbUNoYW5uZWxDb3VudCk7Ci0gICAgfQotCiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNpbmsgZm9yIHRoZSBIQUwgb3V0cHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1PdXRwdXRTaW5rID0gbmV3IEF1ZGlvU3RyZWFtT3V0U2luayhvdXRwdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCl9OworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCl9OwogICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0U2luay0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CiAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CiAKQEAgLTI0OTAsOSArMjgwMCwyOCBAQAogICAgICAgICBicmVhazsKICAgICB9CiAgICAgaWYgKGluaXRGYXN0TWl4ZXIpIHsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZmFzdE1peGVyRm9ybWF0OworICAgICAgICBpZiAobU1peGVyQnVmZmVyRW5hYmxlZCAmJiBtRWZmZWN0QnVmZmVyRW5hYmxlZCkgeworICAgICAgICAgICAgZmFzdE1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhc3RNaXhlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB9CisgICAgICAgIGlmIChtRm9ybWF0ICE9IGZhc3RNaXhlckZvcm1hdCkgeworICAgICAgICAgICAgLy8gY2hhbmdlIG91ciBTaW5rIGZvcm1hdCB0byBhY2NlcHQgb3VyIGludGVybWVkaWF0ZSBwcmVjaXNpb24KKyAgICAgICAgICAgIG1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CisgICAgICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIGNyZWF0ZSBhIE1vbm9QaXBlIHRvIGNvbm5lY3Qgb3VyIHN1Ym1peCB0byBGYXN0TWl4ZXIKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKKyAgICAgICAgTkJBSU9fRm9ybWF0IG9yaWdmb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgorICAgICAgICBmb3JtYXQubUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKKyAgICAgICAgZm9ybWF0Lm1GcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdC5tRm9ybWF0KSAqIGZvcm1hdC5tQ2hhbm5lbENvdW50OworCiAgICAgICAgIC8vIFRoaXMgcGlwZSBkZXB0aCBjb21wZW5zYXRlcyBmb3Igc2NoZWR1bGluZyBsYXRlbmN5IG9mIHRoZSBub3JtYWwgbWl4ZXIgdGhyZWFkLgogICAgICAgICAvLyBXaGVuIGl0IHdha2VzIHVwIGFmdGVyIGEgbWF4aW11bSBsYXRlbmN5LCBpdCBydW5zIGEgZmV3IGN5Y2xlcyBxdWlja2x5IGJlZm9yZQogICAgICAgICAvLyBmaW5hbGx5IGJsb2NraW5nLiAgTm90ZSB0aGUgcGlwZSBpbXBsZW1lbnRhdGlvbiByb3VuZHMgdXAgdGhlIHJlcXVlc3QgdG8gYSBwb3dlciBvZiAyLgpAQCAtMjUwOCwxNCArMjgzNywxNSBAQAogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgIGlmIChtVGVlU2lua091dHB1dEVuYWJsZWQpIHsKICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgRmFzdE1peGVyJ3Mgb3V0cHV0IGZvciBkdW1wc3lzCi0gICAgICAgICAgICBQaXBlICp0ZWVTaW5rID0gbmV3IFBpcGUobVRlZVNpbmtPdXRwdXRGcmFtZXMsIGZvcm1hdCk7CisgICAgICAgICAgICBQaXBlICp0ZWVTaW5rID0gbmV3IFBpcGUobVRlZVNpbmtPdXRwdXRGcmFtZXMsIG9yaWdmb3JtYXQpOworICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyczJbMV0gPSB7b3JpZ2Zvcm1hdH07CiAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgIGluZGV4ID0gdGVlU2luay0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgICAgICBpbmRleCA9IHRlZVNpbmstPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwogICAgICAgICAgICAgbVRlZVNpbmsgPSB0ZWVTaW5rOwogICAgICAgICAgICAgUGlwZVJlYWRlciAqdGVlU291cmNlID0gbmV3IFBpcGVSZWFkZXIoKnRlZVNpbmspOwogICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNvdXJjZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgICAgICBpbmRleCA9IHRlZVNvdXJjZS0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwogICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CiAgICAgICAgICAgICBtVGVlU291cmNlID0gdGVlU291cmNlOwogICAgICAgICB9CkBAIC0yNTMzLDYgKzI4NjMsOCBAQAogICAgICAgICAvLyB3cmFwIHRoZSBzb3VyY2Ugc2lkZSBvZiB0aGUgTW9ub1BpcGUgdG8gbWFrZSBpdCBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gbmV3IFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIobmV3IE1vbm9QaXBlUmVhZGVyKG1vbm9QaXBlKSk7CiAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICBzdGF0ZS0+bUZhc3RUcmFja3NHZW4rKzsKICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgPSAxOwpAQCAtMjU3Niw4ICsyOTA4LDYgQEAKICAgICAgICAgfQogI2VuZGlmCiAKLSAgICB9IGVsc2UgewotICAgICAgICBtRmFzdE1peGVyID0gTlVMTDsKICAgICB9CiAKICAgICBzd2l0Y2ggKGtVc2VGYXN0TWl4ZXIpIHsKQEAgLTI1OTYsMTMgKzI5MjYsMTMgQEAKIAogQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6fk1peGVyVGhyZWFkKCkKIHsKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEUpIHsKICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtRmFzdE1peGVyRnV0ZXgpOwogICAgICAgICAgICAgaWYgKG9sZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIF9fZnV0ZXhfc3lzY2FsbDMoJm1GYXN0TWl4ZXJGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUZhc3RNaXhlckZ1dGV4LCBGVVRFWF9XQUtFX1BSSVZBVEUsIDEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpFWElUOwpAQCAtMjYxOCw3ICsyOTQ4LDcgQEAKICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7CiAgICAgICAgIGRlbGV0ZSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKLSAgICAgICAgZGVsZXRlIG1GYXN0TWl4ZXI7CisgICAgICAgIG1GYXN0TWl4ZXIuY2xlYXIoKTsKICNpZmRlZiBBVURJT19XQVRDSERPRwogICAgICAgICBpZiAobUF1ZGlvV2F0Y2hkb2cgIT0gMCkgewogICAgICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnJlcXVlc3RFeGl0KCk7CkBAIC0yNjM0LDcgKzI5NjQsNyBAQAogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0CiB7Ci0gICAgaWYgKG1GYXN0TWl4ZXIgIT0gTlVMTCkgeworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKICAgICAgICAgTW9ub1BpcGUgKnBpcGUgPSAoTW9ub1BpcGUgKiltUGlwZVNpbmsuZ2V0KCk7CiAgICAgICAgIGxhdGVuY3kgKz0gKHBpcGUtPmdldEF2Z0ZyYW1lcygpICogMTAwMCkgLyBtU2FtcGxlUmF0ZTsKICAgICB9CkBAIC0yNjUxLDcgKzI5ODEsNyBAQAogewogICAgIC8vIEZJWE1FIHdlIHNob3VsZCBvbmx5IGRvIG9uZSBwdXNoIHBlciBjeWNsZTsgY29uZmlybSB0aGlzIGlzIHRydWUKICAgICAvLyBTdGFydCB0aGUgZmFzdCBtaXhlciBpZiBpdCdzIG5vdCBhbHJlYWR5IHJ1bm5pbmcKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kICE9IEZhc3RNaXhlclN0YXRlOjpNSVhfV1JJVEUgJiYKQEAgLTI2NTksNyArMjk4OSw3IEBACiAgICAgICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEUpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbUZhc3RNaXhlckZ1dGV4KTsKICAgICAgICAgICAgICAgICBpZiAob2xkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9fZnV0ZXhfc3lzY2FsbDMoJm1GYXN0TWl4ZXJGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJm1GYXN0TWl4ZXJGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKICAgICAgICAgICAgICAgICB9CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvV2F0Y2hkb2cgIT0gMCkgewpAQCAtMjY4NSw3ICszMDE1LDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCkKIHsKICAgICAvLyBJZGxlIHRoZSBmYXN0IG1peGVyIGlmIGl0J3MgY3VycmVudGx5IHJ1bm5pbmcKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgICAgICBpZiAoIShzdGF0ZS0+bUNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKQEAgLTI3MTEsMTIgKzMwNDEsNiBAQAogICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKTsKIH0KIAotLy8gRW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIHN0YW5kYXJkIG1peGVyCi0vLyBPdmVycmlkZGVuIGZvciBvZmZsb2FkZWQgcGxheWJhY2sKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Zmx1c2hPdXRwdXRfbCgpCi17Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6d2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpCiB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjc0OCw2ICszMDcyLDEyIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpCit7CisgICAgQUxPR1YoInNpZ25hbCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICBicm9hZGNhc3RfbCgpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3BfbWl4KCkKIHsKICAgICAvLyBvYnRhaW4gdGhlIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIG5leHQgb3V0cHV0IGJ1ZmZlcgpAQCAtMjc2Niw3ICszMDk2LDcgQEAKIAogICAgIC8vIG1peCBidWZmZXJzLi4uCiAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MocHRzKTsKLSAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbWl4QnVmZmVyU2l6ZTsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgIC8vIGluY3JlYXNlIHNsZWVwIHRpbWUgcHJvZ3Jlc3NpdmVseSB3aGVuIGFwcGxpY2F0aW9uIHVuZGVycnVuIGNvbmRpdGlvbiBjbGVhcnMuCiAgICAgLy8gT25seSBpbmNyZWFzZSBzbGVlcCB0aW1lIGlmIHRoZSBtaXhlciBpcyByZWFkeSBmb3IgdHdvIGNvbnNlY3V0aXZlIHRpbWVzIHRvIGF2b2lkCiAgICAgLy8gdGhhdCBhIHN0ZWFkeSBzdGF0ZSBvZiBhbHRlcm5hdGluZyByZWFkeS9ub3QgcmVhZHkgY29uZGl0aW9ucyBrZWVwcyB0aGUgc2xlZXAgdGltZQpAQCAtMjc3Nyw2ICszMTA3LDcgQEAKICAgICBzbGVlcFRpbWUgPSAwOwogICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OwogICAgIC8vVE9ETzogZGVsYXkgc3RhbmRieSB3aGVuIGVmZmVjdHMgaGF2ZSBhIHRhaWwKKwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3Bfc2xlZXBUaW1lKCkKQEAgLTI4MDAsNyArMzEzMSwxMyBAQAogICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwIHx8IChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpKSB7Ci0gICAgICAgIG1lbXNldCAobU1peEJ1ZmZlciwgMCwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgIC8vIGNsZWFyIG91dCBtTWl4ZXJCdWZmZXIgb3IgbVNpbmtCdWZmZXIsIHRvIGVuc3VyZSBidWZmZXJzIGFyZSBjbGVhcmVkCisgICAgICAgIC8vIGJlZm9yZSBlZmZlY3RzIHByb2Nlc3Npbmcgb3Igb3V0cHV0LgorICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOworICAgICAgICB9CiAgICAgICAgIHNsZWVwVGltZSA9IDA7CiAgICAgICAgIEFMT0dWX0lGKG1CeXRlc1dyaXR0ZW4gPT0gMCAmJiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSwKICAgICAgICAgICAgICAgICAiYW50aWNpcGF0ZWQgc3RhcnQiKTsKQEAgLTI4NDIsMTEgKzMxNzksMTQgQEAKICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBOVUxMOwogICAgIGJvb2wgZGlkTW9kaWZ5ID0gZmFsc2U7CiAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZTo6YmxvY2tfdCBibG9jayA9IEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRDsKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIHN0YXRlID0gc3EtPmJlZ2luKCk7CiAgICAgfQogCisgICAgbU1peGVyQnVmZmVyVmFsaWQgPSBmYWxzZTsgIC8vIG1NaXhlckJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCBhcHByb3ByaWF0ZSB0cmFja3MgZm91bmQuCisgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gZmFsc2U7IC8vIG1FZmZlY3RCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgdHJhY2tzIGZvdW5kLgorCiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOwogICAgICAgICBpZiAodCA9PSAwKSB7CkBAIC0yOTY1LDcgKzMzMDUsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExPR19GQVRBTCgidW5leHBlY3RlZCB0cmFjayBzdGF0ZSAlZCIsIHRyYWNrLT5tU3RhdGUpOworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInVuZXhwZWN0ZWQgdHJhY2sgc3RhdGUgJWQiLCB0cmFjay0+bVN0YXRlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CkBAIC0yOTc1LDggKzMzMTUsOCBAQAogICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlciAqdnAgPSB0cmFjazsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPSBlYWJwOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9IHZwOwotICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1TYW1wbGVSYXRlID0gdHJhY2stPm1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IHRyYWNrLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IHRyYWNrLT5tRm9ybWF0OwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrIHw9IDEgPDwgajsKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKQEAgLTI5OTcsNyArMzMzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gZGVjcmVtZW50IHRoZSBsYXN0IHNwPD4gb24gdGhvc2UgdHJhY2tzLgogICAgICAgICAgICAgICAgICAgICBibG9jayA9IEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR19GQVRBTCgiZmFzdCB0cmFjayAlZCBzaG91bGQgaGF2ZSBiZWVuIGFjdGl2ZSIsIGopOworICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJmYXN0IHRyYWNrICVkIHNob3VsZCBoYXZlIGJlZW4gYWN0aXZlIiwgaik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCkBAIC0zMDI2LDEyICszMzY2LDE0IEBACiAgICAgICAgICAgICAvLyArMSBmb3Igcm91bmRpbmcgYW5kICsxIGZvciBhZGRpdGlvbmFsIHNhbXBsZSBuZWVkZWQgZm9yIGludGVycG9sYXRpb24KICAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgPSAobU5vcm1hbEZyYW1lQ291bnQgKiBzcikgLyBtU2FtcGxlUmF0ZSArIDEgKyAxOwogICAgICAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgY2Jsay0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCisgICAgICAgICAgICAvLyBiZWNhdXNlIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5KCkgd2lsbCBpbmNsdWRlIHRoZXNlIGZyYW1lcwogICAgICAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFjay0+bmFtZSgpKTsKKyNpZiAwCiAgICAgICAgICAgICAvLyB0aGUgbWluaW11bSB0cmFjayBidWZmZXIgc2l6ZSBpcyBub3JtYWxseSB0d2ljZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBuZWNlc3NhcnkKICAgICAgICAgICAgIC8vIHRvIGZpbGwgb25lIGJ1ZmZlciBhbmQgdGhlIHJlc2FtcGxlciBzaG91bGQgbm90IGxlYXZlIG1vcmUgdGhhbiBvbmUgYnVmZmVyIHdvcnRoCiAgICAgICAgICAgICAvLyBvZiB1bnJlbGVhc2VkIGZyYW1lcyBhZnRlciBlYWNoIHBhc3MsIGJ1dCBqdXN0IGluIGNhc2UuLi4KICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGRlc2lyZWRGcmFtZXMgPD0gY2Jsay0+ZnJhbWVDb3VudF8pOworI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC0zMDQ3LDEwICszMzg5LDE0IEBACiAKICAgICAgICAgICAgIG1peGVkVHJhY2tzKys7CiAKLSAgICAgICAgICAgIC8vIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peEJ1ZmZlciBtZWFucyB0aGVyZSBpcyBhbiBlZmZlY3QgY2hhaW4KLSAgICAgICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgdHJhY2sKKyAgICAgICAgICAgIC8vIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbVNpbmtCdWZmZXIgb3IgbU1peGVyQnVmZmVyIG1lYW5zCisgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbiBlZmZlY3QgY2hhaW4gY29ubmVjdGVkIHRvIHRoZSB0cmFjawogICAgICAgICAgICAgY2hhaW4uY2xlYXIoKTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1NaXhCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1TaW5rQnVmZmVyICYmCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peGVyQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJWYWxpZCA9IHRydWU7IC8vIExhdGVyIGNhbiBzZXQgZGlyZWN0bHkuCisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTMwODAsOSArMzQyNiwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjb21wdXRlIHZvbHVtZSBmb3IgdGhpcyB0cmFjawotICAgICAgICAgICAgdWludDMyX3QgdmwsIHZyLCB2YTsKKyAgICAgICAgICAgIHVpbnQzMl90IHZsLCB2cjsgICAgICAgLy8gaW4gVTguMjQgaW50ZWdlciBmb3JtYXQKKyAgICAgICAgICAgIGZsb2F0IHZsZiwgdnJmLCB2YWY7ICAgLy8gaW4gWzAuMCwgMS4wXSBmbG9hdCBmb3JtYXQKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkgfHwgbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUpIHsKLSAgICAgICAgICAgICAgICB2bCA9IHZyID0gdmEgPSAwOworICAgICAgICAgICAgICAgIHZsID0gdnIgPSAwOworICAgICAgICAgICAgICAgIHZsZiA9IHZyZiA9IHZhZiA9IDAuOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTMwOTIsMzcgKzM0NDAsNDQgQEAKICAgICAgICAgICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKICAgICAgICAgICAgICAgICBmbG9hdCB2ID0gbWFzdGVyVm9sdW1lICogdHlwZVZvbHVtZTsKICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrU2VydmVyUHJveHkgKnByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7Ci0gICAgICAgICAgICAgICAgdmwgPSB2bHIgJiAweEZGRkY7Ci0gICAgICAgICAgICAgICAgdnIgPSB2bHIgPj4gMTY7CisgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgICAgICAgICAgICAgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICAgICAgICAgIHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CiAgICAgICAgICAgICAgICAgLy8gdHJhY2sgdm9sdW1lcyBjb21lIGZyb20gc2hhcmVkIG1lbW9yeSwgc28gY2FuJ3QgYmUgdHJ1c3RlZCBhbmQgbXVzdCBiZSBjbGFtcGVkCi0gICAgICAgICAgICAgICAgaWYgKHZsID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayBsZWZ0IHZvbHVtZSBvdXQgb2YgcmFuZ2U6ICUwNFgiLCB2bCk7Ci0gICAgICAgICAgICAgICAgICAgIHZsID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgIGlmICh2bGYgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayBsZWZ0IHZvbHVtZSBvdXQgb2YgcmFuZ2U6ICUuM2ciLCB2bGYpOworICAgICAgICAgICAgICAgICAgICB2bGYgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodnIgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRyYWNrIHJpZ2h0IHZvbHVtZSBvdXQgb2YgcmFuZ2U6ICUwNFgiLCB2cik7Ci0gICAgICAgICAgICAgICAgICAgIHZyID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgIGlmICh2cmYgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayByaWdodCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlLjNnIiwgdnJmKTsKKyAgICAgICAgICAgICAgICAgICAgdnJmID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gbm93IGFwcGx5IHRoZSBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWUKLSAgICAgICAgICAgICAgICB2bCA9ICh1aW50MzJfdCkodiAqIHZsKSA8PCAxMjsKLSAgICAgICAgICAgICAgICB2ciA9ICh1aW50MzJfdCkodiAqIHZyKSA8PCAxMjsKKyAgICAgICAgICAgICAgICB2bGYgKj0gdjsKKyAgICAgICAgICAgICAgICB2cmYgKj0gdjsKICAgICAgICAgICAgICAgICAvLyBhc3N1bWluZyBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWUgZWFjaCBnbyB1cCB0byAxLjAsCi0gICAgICAgICAgICAgICAgLy8gdmwgYW5kIHZyIGFyZSBub3cgaW4gOC4yNCBmb3JtYXQKLQorICAgICAgICAgICAgICAgIC8vIHRoZW4gZGVyaXZlIHZsIGFuZCB2ciBhcyBVOC4yNCB2ZXJzaW9ucyBmb3IgdGhlIGVmZmVjdCBjaGFpbgorICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNjYWxldG84XzI0ID0gTUFYX0dBSU5fSU5UICogTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgIHZsID0gKHVpbnQzMl90KSAoc2NhbGV0bzhfMjQgKiB2bGYpOworICAgICAgICAgICAgICAgIHZyID0gKHVpbnQzMl90KSAoc2NhbGV0bzhfMjQgKiB2cmYpOworICAgICAgICAgICAgICAgIC8vIHZsIGFuZCB2ciBhcmUgbm93IGluIFU4LjI0IGZvcm1hdAogICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlbmRMZXZlbCA9IHByb3h5LT5nZXRTZW5kTGV2ZWxfVTRfMTIoKTsKICAgICAgICAgICAgICAgICAvLyBzZW5kIGxldmVsIGNvbWVzIGZyb20gc2hhcmVkIG1lbW9yeSBhbmQgc28gbWF5IGJlIGNvcnJ1cHQKICAgICAgICAgICAgICAgICBpZiAoc2VuZExldmVsID4gTUFYX0dBSU5fSU5UKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayBzZW5kIGxldmVsIG91dCBvZiByYW5nZTogJTA0WCIsIHNlbmRMZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRMZXZlbCA9IE1BWF9HQUlOX0lOVDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmEgPSAodWludDMyX3QpKHYgKiBzZW5kTGV2ZWwpOworICAgICAgICAgICAgICAgIC8vIHZhZiBpcyByZXByZXNlbnRlZCBhcyBbMC4wLCAxLjBdIGZsb2F0IGJ5IHJlc2NhbGluZyBzZW5kTGV2ZWwKKyAgICAgICAgICAgICAgICB2YWYgPSB2ICogc2VuZExldmVsICogKDEuIC8gTUFYX0dBSU5fSU5UKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5zZXRWb2x1bWVfbCgmdmwsICZ2cikpIHsKICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmFtcCB2b2x1bWUgaWYgdm9sdW1lIGlzIGNvbnRyb2xsZWQgYnkgZWZmZWN0CiAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpWT0xVTUU7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHJlbWFpbmluZyBmbG9hdGluZyBwb2ludCB2b2x1bWUgbGV2ZWxzCisgICAgICAgICAgICAgICAgdmxmID0gKGZsb2F0KXZsIC8gKDEgPDwgMjQpOworICAgICAgICAgICAgICAgIHZyZiA9IChmbG9hdCl2ciAvICgxIDw8IDI0KTsKICAgICAgICAgICAgICAgICB0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBmb3JjZSBubyB2b2x1bWUgcmFtcCB3aGVuIHZvbHVtZSBjb250cm9sbGVyIHdhcyBqdXN0IGRpc2FibGVkIG9yIHJlbW92ZWQKQEAgLTMxMzMsMjggKzM0ODgsMTMgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gQ29udmVydCB2b2x1bWVzIGZyb20gOC4yNCB0byA0LjEyIGZvcm1hdAotICAgICAgICAgICAgLy8gVGhpcyBhZGRpdGlvbmFsIGNsYW1waW5nIGlzIG5lZWRlZCBpbiBjYXNlIGNoYWluLT5zZXRWb2x1bWVfbCgpIG92ZXJzaG90Ci0gICAgICAgICAgICB2bCA9ICh2bCArICgxIDw8IDExKSkgPj4gMTI7Ci0gICAgICAgICAgICBpZiAodmwgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICB2bCA9IE1BWF9HQUlOX0lOVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZyID0gKHZyICsgKDEgPDwgMTEpKSA+PiAxMjsKLSAgICAgICAgICAgIGlmICh2ciA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICAgICAgICAgIHZyID0gTUFYX0dBSU5fSU5UOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmEgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICB2YSA9IE1BWF9HQUlOX0lOVDsgICAvLyB2YSBpcyB1aW50MzJfdCwgc28gbm8gbmVlZCB0byBjaGVjayBmb3IgLQotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgdHJhY2spOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShuYW1lKTsKIAotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgKHZvaWQgKil2bCk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAodm9pZCAqKXZyKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAodm9pZCAqKXZhKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJnZhZik7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCkBAIC0zMTYyLDkgKzM1MDIsMTMgQEAKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopdHJhY2stPmNoYW5uZWxNYXNrKCkpOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5jaGFubmVsTWFzaygpKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCltQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgLy8gbGltaXQgdHJhY2sgc2FtcGxlIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGUgcmF0ZSwgd2hpY2ggY2hhbmdlcyBhdCByZS1jb25maWd1cmF0aW9uCi0gICAgICAgICAgICB1aW50MzJfdCBtYXhTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGUgKiAyOworICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYOwogICAgICAgICAgICAgdWludDMyX3QgcmVxU2FtcGxlUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgICAgICAgICBpZiAocmVxU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmVxU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwpAQCAtMzE3NSwxMSArMzUxOSw0MiBAQAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilyZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+bWFpbkJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpcmVxU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgdHJhY2suCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVHJhY2tzIHdpdGggZWZmZWN0cyBnbyBpbnRvIHRoZWlyIG93biBlZmZlY3RzIGNoYWluIGJ1ZmZlcgorICAgICAgICAgICAgICogYW5kIGZyb20gdGhlcmUgaW50byBlaXRoZXIgbUVmZmVjdEJ1ZmZlciBvciBtU2lua0J1ZmZlci4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBPdGhlciB0cmFja3MgY2FuIHVzZSBtTWl4ZXJCdWZmZXIgZm9yIGhpZ2hlciBwcmVjaXNpb24KKyAgICAgICAgICAgICAqIGNoYW5uZWwgYWNjdW11bGF0aW9uLiAgSWYgdGhpcyBidWZmZXIgaXMgZW5hYmxlZAorICAgICAgICAgICAgICogKG1NaXhlckJ1ZmZlckVuYWJsZWQgdHJ1ZSksIHRoZW4gc2VsZWN0ZWQgdHJhY2tzIHdpbGwgYWNjdW11bGF0ZQorICAgICAgICAgICAgICogaW50byBpdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkCisgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IG92ZXJyaWRlIHRyYWNrLT5tYWluQnVmZmVyKCk/CisgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCkBAIC0zMjkzLDEzICszNjY4LDM1IEBACiAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgdHJhY2tzIHRoYXQgbmVlZCB0byBiZS4uLgogICAgIHJlbW92ZVRyYWNrc19sKCp0cmFja3NUb1JlbW92ZSk7CiAKLSAgICAvLyBtaXggYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBpZiBhbGwgdHJhY2tzIGFyZSBjb25uZWN0ZWQgdG8gYW4KLSAgICAvLyBlZmZlY3QgY2hhaW4gYXMgaW4gdGhpcyBjYXNlIHRoZSBtaXhlciB3aWxsIG5vdCB3cml0ZSB0bwotICAgIC8vIG1peCBidWZmZXIgYW5kIHRyYWNrIGVmZmVjdHMgd2lsbCBhY2N1bXVsYXRlIGludG8gaXQKKyAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpICE9IDApIHsKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobUVmZmVjdEJ1ZmZlclZhbGlkKSB7CisgICAgICAgIC8vIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGVmZmVjdHMgd2Ugc2hvdWxkIGNsZWFyIHRoZSBlZmZlY3RzIGJ1ZmZlciwgdG8gYXZvaWQKKyAgICAgICAgLy8gcGFzc2luZyBhIG5vbi1jbGVhbiBidWZmZXIgdG8gdGhlIGVmZmVjdCBjaGFpbgorICAgICAgICBtZW1zZXQobUVmZmVjdEJ1ZmZlciwgMCwgbUVmZmVjdEJ1ZmZlclNpemUpOworICAgIH0KKyAgICAvLyBzaW5rIG9yIG1peCBidWZmZXIgbXVzdCBiZSBjbGVhcmVkIGlmIGFsbCB0cmFja3MgYXJlIGNvbm5lY3RlZCB0byBhbgorICAgIC8vIGVmZmVjdCBjaGFpbiBhcyBpbiB0aGlzIGNhc2UgdGhlIG1peGVyIHdpbGwgbm90IHdyaXRlIHRvIHRoZSBzaW5rIG9yIG1peCBidWZmZXIKKyAgICAvLyBhbmQgdHJhY2sgZWZmZWN0cyB3aWxsIGFjY3VtdWxhdGUgaW50byBpdAogICAgIGlmICgobUJ5dGVzUmVtYWluaW5nID09IDApICYmICgobWl4ZWRUcmFja3MgIT0gMCAmJiBtaXhlZFRyYWNrcyA9PSB0cmFja3NXaXRoRWZmZWN0KSB8fAogICAgICAgICAgICAgKG1peGVkVHJhY2tzID09IDAgJiYgZmFzdFRyYWNrcyA+IDApKSkgewogICAgICAgICAvLyBGSVhNRSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgc2hvdWxkIHJlbWVtYmVyIHByZXZpb3VzIHplcm8gc3RhdHVzCi0gICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgLy8gVE9ETzogSW4gdGVzdGluZywgbVNpbmtCdWZmZXIgYmVsb3cgbmVlZCBub3QgYmUgY2xlYXJlZCBiZWNhdXNlCisgICAgICAgICAgICAvLyB0aGUgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSBjb3BpZXMgbU1peGVyQnVmZmVyIGludG8gbVNpbmtCdWZmZXIKKyAgICAgICAgICAgIC8vIGFmdGVyIG1peGluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUbyBlbmZvcmNlIHRoaXMgZ3VhcmFudGVlOgorICAgICAgICAgICAgLy8gKChtaXhlZFRyYWNrcyAhPSAwICYmIG1peGVkVHJhY2tzID09IHRyYWNrc1dpdGhFZmZlY3QpIHx8CisgICAgICAgICAgICAvLyAobWl4ZWRUcmFja3MgPT0gMCAmJiBmYXN0VHJhY2tzID4gMCkpCisgICAgICAgICAgICAvLyBtdXN0IGltcGx5IE1JWEVSX1RSQUNLU19SRUFEWS4KKyAgICAgICAgICAgIC8vIExhdGVyLCB3ZSBtYXkgY2xlYXIgYnVmZmVycyByZWdhcmRsZXNzLCBhbmQgc2tpcCBtdWNoIG9mIHRoaXMgbG9naWMuCisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHNob3VsZCByZW1lbWJlciBwcmV2aW91cyB6ZXJvIHN0YXR1cworICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgfQogCiAgICAgLy8gaWYgYW55IGZhc3QgdHJhY2tzLCB0aGVuIHN0YXR1cyBpcyByZWFkeQpAQCAtMzMxMSw5ICszNzA4LDEwIEBACiB9CiAKIC8vIGdldFRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi1pbnQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpCitpbnQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkKIHsKLSAgICByZXR1cm4gbUF1ZGlvTWl4ZXItPmdldFRyYWNrTmFtZShjaGFubmVsTWFzaywgc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gbUF1ZGlvTWl4ZXItPmdldFRyYWNrTmFtZShjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQpOwogfQogCiAvLyBkZWxldGVUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZApAQCAtMzMyMywxMzAgKzM3MjEsMTIyIEBACiAgICAgbUF1ZGlvTWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKIH0KIAotLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWJvb2wgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKQogewotICAgIC8vIGlmICEmSURMRSwgaG9sZHMgdGhlIEZhc3RNaXhlciBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIG5ldyBwYXJhbWV0ZXJzIHByb2Nlc3NlZAotICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIHByZXZpb3VzQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKICAgICBib29sIHJlY29uZmlnID0gZmFsc2U7CiAKLSAgICB3aGlsZSAoIW1OZXdQYXJhbWV0ZXJzLmlzRW1wdHkoKSkgeworICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKLSAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwotICAgICAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNDb21tYW5kID0gc3RhdGUtPm1Db21tYW5kOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKLSAgICAgICAgICAgICAgICBzcS0+ZW5kKCk7Ci0gICAgICAgICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOwotICAgICAgICAgICAgfQorICAgIC8vIGlmICEmSURMRSwgaG9sZHMgdGhlIEZhc3RNaXhlciBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIG5ldyBwYXJhbWV0ZXJzIHByb2Nlc3NlZAorICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIHByZXZpb3VzQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CisgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgcHJldmlvdXNDb21tYW5kID0gc3RhdGUtPm1Db21tYW5kOworICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgICAgICAgICAgc3EtPmVuZCgpOworICAgICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXIgPSBtTmV3UGFyYW1ldGVyc1swXTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOwotICAgICAgICBpbnQgdmFsdWU7Ci0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTYW1wbGluZ1JhdGUpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7CisgICAgaW50IHZhbHVlOworICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkUGNtU2lua0Zvcm1hdCgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlKSkgeworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzYXZlIHZhbHVlLCBzaW5jZSBpdCdzIGNvbnN0YW50CiAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmICgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKChhdWRpb19jaGFubmVsX21hc2tfdCkgdmFsdWUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNhdmUgdmFsdWUsIHNpbmNlIGl0J3MgY29uc3RhbnQKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKKyAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgorICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgotICAgICAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBndWFyYW50ZWVkCi0gICAgICAgICAgICAvLyBpZiBmcmFtZSBjb3VudCBpcyBjaGFuZ2VkIGFmdGVyIHRyYWNrIGNyZWF0aW9uCi0gICAgICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQotICAgICAgICAgICAgLy8gd2hlbiBjaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGRldmljZSwgY2FsbCBhZGRCYXR0ZXJ5RGF0YSB0byBub3RpZnkKLSAgICAgICAgICAgIC8vIHRoZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmIChtT3V0RGV2aWNlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gMDsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHNwZWFrZXIgaXMgb24KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVNwZWFrZXJPbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlV2l0aG91dFNwZWFrZXIKLSAgICAgICAgICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IG90aGVyIGRldmljZSAoZXhjZXB0IHNwZWFrZXIpIGlzIG9uCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFPdGhlckF1ZGlvRGV2aWNlT247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQorICAgICAgICAvLyB0aGUgY2hhbmdlCisgICAgICAgIGlmIChtT3V0RGV2aWNlICE9IHZhbHVlKSB7CisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSAwOworICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBzcGVha2VyIGlzIG9uCisgICAgICAgICAgICBpZiAodmFsdWUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhU3BlYWtlck9uOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlV2l0aG91dFNwZWFrZXIKKyAgICAgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9PVVRfQUxMICYgfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBkZXZpY2UgKGV4Y2VwdCBzcGVha2VyKSBpcyBvbgorICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIgKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YU90aGVyQXVkaW9EZXZpY2VPbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAKLSAgICAgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKLSAgICAgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBtT3V0RGV2aWNlID0gdmFsdWU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOworICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKLSAgICAgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKSA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgbmFtZSA9IGdldFRyYWNrTmFtZV9sKG1UcmFja3NbaV0tPm1DaGFubmVsTWFzaywgbVRyYWNrc1tpXS0+bVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVRyYWNrc1tpXS0+bU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgfQotCi0gICAgICAgIG1OZXdQYXJhbWV0ZXJzLnJlbW92ZUF0KDApOwotCi0gICAgICAgIG1QYXJhbVN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgbVBhcmFtQ29uZC5zaWduYWwoKTsKLSAgICAgICAgLy8gd2FpdCBmb3IgY29uZGl0aW9uIHdpdGggdGltZSBvdXQgaW4gY2FzZSB0aGUgdGhyZWFkIGNhbGxpbmcgVGhyZWFkQmFzZTo6c2V0UGFyYW1ldGVycygpCi0gICAgICAgIC8vIGFscmVhZHkgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHRoZSBzdGF0dXMgYW5kIHdpbGwgbmV2ZXIgc2lnbmFsIHRoZSBjb25kaXRpb24uCi0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywga1NldFBhcmFtZXRlcnNUaW1lb3V0TnMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7CisgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CisgICAgICAgICAgICBkZWxldGUgbUF1ZGlvTWl4ZXI7CisgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IG5hbWUgPSBnZXRUcmFja05hbWVfbChtVHJhY2tzW2ldLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tRm9ybWF0LCBtVHJhY2tzW2ldLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPm1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIShwcmV2aW91c0NvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKLSAgICAgICAgQUxPR19BU1NFUlQobUZhc3RNaXhlciAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQobUZhc3RNaXhlciAhPSAwKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICAgICAgQUxPR19BU1NFUlQoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRSk7CkBAIC0zNDY3LDkgKzM4NTcsNyBAQAogCiAgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9NaXhlciB0cmFja3M6ICUwOHhcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBBdWRpb01peGVyIHRyYWNrczogMHglMDh4XG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpKTsKIAogICAgIC8vIE1ha2UgYSBub24tYXRvbWljIGNvcHkgb2YgZmFzdCBtaXhlciBkdW1wIHN0YXRlIHNvIGl0IHdvbid0IGNoYW5nZSB1bmRlcm5lYXRoIHVzCiAgICAgY29uc3QgRmFzdE1peGVyRHVtcFN0YXRlIGNvcHkobUZhc3RNaXhlckR1bXBTdGF0ZSk7CkBAIC0zNTUwLDEzICszOTM4LDE3IEBACiAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOwogICAgICAgICBmbG9hdCB2ID0gbU1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CiAgICAgICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSAqcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKLSAgICAgICAgdWludDMyX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7Ci0gICAgICAgIGZsb2F0IHZfY2xhbXBlZCA9IHYgKiAodmxyICYgMHhGRkZGKTsKLSAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOKSB2X2NsYW1wZWQgPSBNQVhfR0FJTjsKLSAgICAgICAgbGVmdCA9IHZfY2xhbXBlZC9NQVhfR0FJTjsKLSAgICAgICAgdl9jbGFtcGVkID0gdiAqICh2bHIgPj4gMTYpOwotICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU4pIHZfY2xhbXBlZCA9IE1BWF9HQUlOOwotICAgICAgICByaWdodCA9IHZfY2xhbXBlZC9NQVhfR0FJTjsKKyAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgICAgIGxlZnQgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgICAgIGlmIChsZWZ0ID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICAgICAgbGVmdCA9IEdBSU5fRkxPQVRfVU5JVFk7CisgICAgICAgIH0KKyAgICAgICAgbGVmdCAqPSB2OworICAgICAgICByaWdodCA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CisgICAgICAgIGlmIChyaWdodCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgICAgIHJpZ2h0ID0gR0FJTl9GTE9BVF9VTklUWTsKKyAgICAgICAgfQorICAgICAgICByaWdodCAqPSB2OwogICAgIH0KIAogICAgIGlmIChsYXN0VHJhY2spIHsKQEAgLTM2MTEsMTQgKzQwMDMsMTQgQEAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0CiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lczsKLSAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpKSB7CisgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGluZ18xKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgbWluRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKLSAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKKyAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpICYmCisgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CiAKQEAgLTM2NDUsMTggKzQwMzcsMzAgQEAKICAgICAgICAgICAgIGlmICghbUVmZmVjdENoYWlucy5pc0VtcHR5KCkgJiYgbGFzdCkgewogICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbMF0tPmNsZWFySW5wdXRCdWZmZXIoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKLSAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSB8fAotICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGVkKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18xKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpIHx8CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1N0b3BwaW5nXzIoKSB8fCB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCiAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHRyYWNrcy4KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYmVoYXZpb3IgZm9yIGNvbXByZXNzZWQgYXVkaW8KLSAgICAgICAgICAgICAgICBzaXplX3QgYXVkaW9IQUxGcmFtZXMgPSAobGF0ZW5jeV9sKCkgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOworICAgICAgICAgICAgICAgIHNpemVfdCBhdWRpb0hBTEZyYW1lczsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICBhdWRpb0hBTEZyYW1lcyA9IChsYXRlbmN5X2woKSAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9IQUxGcmFtZXMgPSAwOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0gbUJ5dGVzV3JpdHRlbiAvIG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGFuZGJ5IHx8ICFsYXN0IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpGTFVTSEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hId19sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKQEAgLTM2ODcsNyArNDA5MSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjp0aHJlYWRMb29wX21peCgpCiB7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICBpbnQ4X3QgKmN1ckJ1ZiA9IChpbnQ4X3QgKiltTWl4QnVmZmVyOworICAgIGludDhfdCAqY3VyQnVmID0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwogICAgIC8vIG91dHB1dCBhdWRpbyB0byBoYXJkd2FyZQogICAgIHdoaWxlIChmcmFtZUNvdW50KSB7CiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CkBAIC0zNzAyLDcgKzQxMDYsNyBAQAogICAgICAgICBjdXJCdWYgKz0gYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgICAgICBtQWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAgICAgfQotICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBjdXJCdWYgLSAoaW50OF90ICopbU1peEJ1ZmZlcjsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gY3VyQnVmIC0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CiAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CkBAIC0zNzE3LDY4ICs0MTIxLDY5IEBACiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewotICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICBzbGVlcFRpbWUgPSAwOwogICAgIH0KIH0KIAogLy8gZ2V0VHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWludCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBzZXNzaW9uSWQpCitpbnQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrIF9fdW51c2VkLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgX191bnVzZWQsIGludCBzZXNzaW9uSWQgX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8vIGRlbGV0ZVRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lIF9fdW51c2VkKQogewogfQogCi0vLyBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwogCi0gICAgd2hpbGUgKCFtTmV3UGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlyID0gbU5ld1BhcmFtZXRlcnNbMF07Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKLSAgICAgICAgaW50IHZhbHVlOworICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGdhcmFudGllZAotICAgICAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgotICAgICAgICAgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOworICAgIGludCB2YWx1ZTsKKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCisgICAgICAgIGlmICh2YWx1ZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbU5ld1BhcmFtZXRlcnMucmVtb3ZlQXQoMCk7Ci0KLSAgICAgICAgbVBhcmFtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtUGFyYW1Db25kLnNpZ25hbCgpOwotICAgICAgICAvLyB3YWl0IGZvciBjb25kaXRpb24gd2l0aCB0aW1lIG91dCBpbiBjYXNlIHRoZSB0aHJlYWQgY2FsbGluZyBUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgLy8gYWxyZWFkeSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgdGhlIHN0YXR1cyBhbmQgd2lsbCBuZXZlciBzaWduYWwgdGhlIGNvbmRpdGlvbi4KLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyk7CiAgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBnYXJhbnRpZWQKKyAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgorICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CisgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgeworICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOworICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiByZWNvbmZpZzsKIH0KIApAQCAtMzgyOCw2ICs0MjMzLDEyIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpmbHVzaEh3X2woKQoreworICAgIGlmIChtT3V0cHV0LT5zdHJlYW0tPmZsdXNoICE9IE5VTEwpCisgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Zmx1c2gobU91dHB1dC0+c3RyZWFtKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkFzeW5jQ2FsbGJhY2tUaHJlYWQ6OkFzeW5jQ2FsbGJhY2tUaHJlYWQoCkBAIC0zOTUxLDcgKzQzNjIsMTAgQEAKICAgICAgICAgbU1peGVyU3RhdHVzID0gTUlYRVJfRFJBSU5fQUxMOwogICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgfQotICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOworICAgIGlmIChtVXNlQXN5bmNXcml0ZSkgeworICAgICAgICBBTE9HX0FTU0VSVChtQ2FsbGJhY2tUaHJlYWQgIT0gMCk7CisgICAgICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOworICAgIH0KICAgICBQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF9leGl0KCk7CiB9CiAKQEAgLTM5ODMsNiArNDM5NywxNyBAQAogICAgICAgICBzcDxUcmFjaz4gbCA9IG1MYXRlc3RBY3RpdmVUcmFjay5wcm9tb3RlKCk7CiAgICAgICAgIGJvb2wgbGFzdCA9IGwuZ2V0KCkgPT0gdHJhY2s7CiAKKyAgICAgICAgaWYgKHRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgQUxPR1coIkFuIGludmFsaWRhdGVkIHRyYWNrIHNob3VsZG4ndCBiZSBpbiBhY3RpdmUgbGlzdCIpOworICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6SURMRSkgeworICAgICAgICAgICAgQUxPR1coIkFuIGlkbGUgdHJhY2sgc2hvdWxkbid0IGJlIGluIGFjdGl2ZSBsaXN0Iik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkpIHsKICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC00MDAxLDMyICs0NDI2LDM5IEBACiAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsgICAgLy8gc3RvcCB3cml0aW5nCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKLSAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZnJhbWVzUmVhZHkoKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmlzRmx1c2hQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIHRyYWNrLT5mbHVzaEFjaygpOworICAgICAgICAgICAgaWYgKGxhc3QpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aXNSZXN1bWVQZW5kaW5nKCkpeworICAgICAgICAgICAgdHJhY2stPnJlc3VtZUFjaygpOworICAgICAgICAgICAgaWYgKGxhc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobVBhdXNlZEJ5dGVzUmVtYWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY29udGludWUgd3JpdGUgdGhhdCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1QYXVzZWRXcml0ZUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbVBhdXNlZEJ5dGVzUmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUh3UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGRvSHdSZXN1bWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcF9taXgoKSB3aWxsIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIGFuIGludGVycnVwdGVkIHdyaXRlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB3cml0ZSB0byBhdWRpbyBIQUwKKyAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOworCisgICAgICAgICAgICAgICAgLy8gRG8gbm90IGhhbmRsZSBuZXcgZGF0YSBpbiB0aGlzIGl0ZXJhdGlvbiBldmVuIGlmIHRyYWNrLT5mcmFtZXNSZWFkeSgpCisgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpICYmICF0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKICAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfRklMTEVEKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBwcm9jZXNzVm9sdW1lX2woKSB3aWxsIGFwcGx5IG5ldyB2b2x1bWUgZXZlbiBpZiAwCiAgICAgICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IG1SaWdodFZvbEZsb2F0ID0gLTEuMDsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkQnl0ZXNSZW1haW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNvbnRpbnVlIHdyaXRlIHRoYXQgd2FzIGludGVycnVwdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1QYXVzZWRXcml0ZUxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtUGF1c2VkQnl0ZXNSZW1haW5pbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSHdQYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWRMb29wX21peCgpIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHRoYXQgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSBhbiBpbnRlcnJ1cHRlZCB3cml0ZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIHdyaXRlIHRvIGF1ZGlvIEhBTAotICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTQwNTAsNyArNDQ4Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVrIHdoZW4gcmVzdW1pbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNUcmFjay0+c2Vzc2lvbklkKCkgIT0gdHJhY2stPnNlc3Npb25JZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUcmFjay0+aW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNDA5Niw3ICs0NTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGF1ZGlvSEFMRnJhbWVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU91dHB1dC0+c3RyZWFtLT5nZXRfbGF0ZW5jeShtT3V0cHV0LT5zdHJlYW0pKm1TYW1wbGVSYXRlKSAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuIC8gYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuIC8gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1PdXRwdXQtPnN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKQEAgLTQxMjYsOSArNDU1Nyw2IEBACiAgICAgLy8gaWYgcmVzdW1lIGlzIHJlY2VpdmVkIGJlZm9yZSBwYXVzZSBpcyBleGVjdXRlZC4KICAgICBpZiAoIW1TdGFuZGJ5ICYmIChkb0h3UGF1c2UgfHwgKG1GbHVzaFBlbmRpbmcgJiYgIW1Id1BhdXNlZCAmJiAoY291bnQgIT0gMCkpKSkgewogICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPnBhdXNlKG1PdXRwdXQtPnN0cmVhbSk7Ci0gICAgICAgIGlmICghZG9Id1BhdXNlKSB7Ci0gICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKLSAgICAgICAgfQogICAgIH0KICAgICBpZiAobUZsdXNoUGVuZGluZykgewogICAgICAgICBmbHVzaEh3X2woKTsKQEAgLTQxNDQsMTEgKzQ1NzIsNiBAQAogICAgIHJldHVybiBtaXhlclN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6OmZsdXNoT3V0cHV0X2woKQotewotICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwotfQotCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBtdXRleCBsb2NrZWQKIGJvb2wgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjp3YWl0aW5nQXN5bmNDYWxsYmFja19sKCkKIHsKQEAgLTQxNjMsMTUgKzQ1ODYsMTUgQEAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggdGhyZWFkIG11dGV4IGxvY2tlZAogYm9vbCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6OnNob3VsZFN0YW5kYnlfbCgpCiB7Ci0gICAgYm9vbCBUcmFja1BhdXNlZCA9IGZhbHNlOworICAgIGJvb2wgdHJhY2tQYXVzZWQgPSBmYWxzZTsKIAogICAgIC8vIGRvIG5vdCBwdXQgdGhlIEhBTCBpbiBzdGFuZGJ5IHdoZW4gcGF1c2VkLiBBd2Vzb21lUGxheWVyIGNsZWFyIHRoZSBvZmZsb2FkZWQgQXVkaW9UcmFjawogICAgIC8vIGFmdGVyIGEgdGltZW91dCBhbmQgd2Ugd2lsbCBlbnRlciBzdGFuZGJ5IHRoZW4uCiAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgewotICAgICAgICBUcmFja1BhdXNlZCA9IG1UcmFja3NbbVRyYWNrcy5zaXplKCkgLSAxXS0+aXNQYXVzZWQoKTsKKyAgICAgICAgdHJhY2tQYXVzZWQgPSBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPmlzUGF1c2VkKCk7CiAgICAgfQogCi0gICAgcmV0dXJuICFtU3RhbmRieSAmJiAhVHJhY2tQYXVzZWQ7CisgICAgcmV0dXJuICFtU3RhbmRieSAmJiAhdHJhY2tQYXVzZWQ7CiB9CiAKIApAQCAtNDE4MywxMiArNDYwNiwxNCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6Zmx1c2hId19sKCkKIHsKLSAgICBtT3V0cHV0LT5zdHJlYW0tPmZsdXNoKG1PdXRwdXQtPnN0cmVhbSk7CisgICAgRGlyZWN0T3V0cHV0VGhyZWFkOjpmbHVzaEh3X2woKTsKICAgICAvLyBGbHVzaCBhbnl0aGluZyBzdGlsbCB3YWl0aW5nIGluIHRoZSBtaXhidWZmZXIKICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gMDsKICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgIG1QYXVzZWRXcml0ZUxlbmd0aCA9IDA7CiAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nID0gMDsKKyAgICBtSHdQYXVzZWQgPSBmYWxzZTsKKwogICAgIGlmIChtVXNlQXN5bmNXcml0ZSkgewogICAgICAgICAvLyBkaXNjYXJkIGFueSBwZW5kaW5nIGRyYWluIG9yIHdyaXRlIGFjayBieSBpbmNyZW1lbnRpbmcgc2VxdWVuY2UKICAgICAgICAgbVdyaXRlQWNrU2VxdWVuY2UgPSAobVdyaXRlQWNrU2VxdWVuY2UgKyAyKSAmIH4xOwpAQCAtNDE5OSw2ICs0NjI0LDE4IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6b25BZGROZXdUcmFja19sKCkKK3sKKyAgICBzcDxUcmFjaz4gcHJldmlvdXNUcmFjayA9IG1QcmV2aW91c1RyYWNrLnByb21vdGUoKTsKKyAgICBzcDxUcmFjaz4gbGF0ZXN0VHJhY2sgPSBtTGF0ZXN0QWN0aXZlVHJhY2sucHJvbW90ZSgpOworCisgICAgaWYgKHByZXZpb3VzVHJhY2sgIT0gMCAmJiBsYXRlc3RUcmFjayAhPSAwICYmCisgICAgICAgIChwcmV2aW91c1RyYWNrLT5zZXNzaW9uSWQoKSAhPSBsYXRlc3RUcmFjay0+c2Vzc2lvbklkKCkpKSB7CisgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOworICAgIH0KKyAgICBQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6RHVwbGljYXRpbmdUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLApAQCAtNDIyMywxMSArNDY2MCwxNSBAQAogICAgIGlmIChvdXRwdXRzUmVhZHkob3V0cHV0VHJhY2tzKSkgewogICAgICAgICBtQXVkaW9NaXhlci0+cHJvY2VzcyhBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOworICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOworICAgICAgICB9CiAgICAgfQogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgd3JpdGVGcmFtZXMgPSBtTm9ybWFsRnJhbWVDb3VudDsKLSAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbWl4QnVmZmVyU2l6ZTsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OwogfQogCkBAIC00MjQyLDcgKzQ2ODMsNyBAQAogICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwKSB7CiAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKICAgICAgICAgICAgIHdyaXRlRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBmbHVzaCByZW1haW5pbmcgb3ZlcmZsb3cgYnVmZmVycyBpbiBvdXRwdXQgdHJhY2tzCiAgICAgICAgICAgICB3cml0ZUZyYW1lcyA9IDA7CkBAIC00MjU0LDEwICs0Njk1LDE4IEBACiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0VHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobU1peEJ1ZmZlciwgd3JpdGVGcmFtZXMpOworICAgICAgICAvLyBXZSBjb252ZXJ0IHRoZSBkdXBsaWNhdGluZyB0aHJlYWQgZm9ybWF0IHRvIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgIC8vIGZvciBkZWxpdmVyeSBkb3duc3RyZWFtIGFzIG5lZWRlZC4gVGhpcyBpbi1wbGFjZSBjb252ZXJzaW9uIGlzIHNhZmUgYXMKKyAgICAgICAgLy8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgaXMgc21hbGxlciB0aGFuIGFueSBvdGhlciBzdXBwb3J0ZWQgZm9ybWF0CisgICAgICAgIC8vIChBVURJT19GT1JNQVRfUENNXzhfQklUIGlzIG5vdCBhbGxvd2VkIGhlcmUpLgorICAgICAgICBpZiAobUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyLCBtRm9ybWF0LCB3cml0ZUZyYW1lcyAqIG1DaGFubmVsQ291bnQpOworICAgICAgICB9CisgICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obVNpbmtCdWZmZXIpLCB3cml0ZUZyYW1lcyk7CiAgICAgfQogICAgIG1TdGFuZGJ5ID0gZmFsc2U7Ci0gICAgcmV0dXJuIChzc2l6ZV90KW1peEJ1ZmZlclNpemU7CisgICAgcmV0dXJuIChzc2l6ZV90KW1TaW5rQnVmZmVyU2l6ZTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKQpAQCAtNDI4MywxMCArNDczMiwxNiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gRklYTUUgZXhwbGFpbiB0aGlzIGZvcm11bGEKICAgICBzaXplX3QgZnJhbWVDb3VudCA9ICgzICogbU5vcm1hbEZyYW1lQ291bnQgKiBtU2FtcGxlUmF0ZSkgLyB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAvLyBPdXRwdXRUcmFjayBpcyBmb3JjZWQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgcmVnYXJkbGVzcyBvZiBtRm9ybWF0CisgICAgLy8gZHVlIHRvIGN1cnJlbnQgdXNhZ2UgY2FzZSBhbmQgcmVzdHJpY3Rpb25zIG9uIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyLgorICAgIC8vIEFjdHVhbCBidWZmZXIgY29udmVyc2lvbiBpcyBkb25lIGluIHRocmVhZExvb3Bfd3JpdGUoKS4KKyAgICAvLworICAgIC8vIFRPRE86IFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBkZXBlbmRpbmcgb24gbXVsdGljaGFubmVsCisgICAgLy8gKGFuZCBub24gaW50MTZfdCopIHN1cHBvcnQgb24gQUY6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjawogICAgIE91dHB1dFRyYWNrICpvdXRwdXRUcmFjayA9IG5ldyBPdXRwdXRUcmFjayh0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtNDM3MSw4ICs0ODI2LDYgQEAKIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZQpAQCAtNDM4MSwyNyArNDgzNCwxNjIgQEAKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCksCi0gICAgbUlucHV0KGlucHV0KSwgbVJlc2FtcGxlcihOVUxMKSwgbVJzbXBPdXRCdWZmZXIoTlVMTCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCi0gICAgLy8gbVJzbXBJbkluZGV4IGFuZCBtQnVmZmVyU2l6ZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVycygpCi0gICAgbVJlcUNoYW5uZWxDb3VudChwb3Bjb3VudChjaGFubmVsTWFzaykpLAotICAgIG1SZXFTYW1wbGVSYXRlKHNhbXBsZVJhdGUpCi0gICAgLy8gbUJ5dGVzUmVhZCBpcyBvbmx5IG1lYW5pbmdmdWwgd2hpbGUgYWN0aXZlLCBhbmQgc28gaXMgY2xlYXJlZCBpbiBzdGFydCgpCi0gICAgLy8gKGJ1dCBtaWdodCBiZSBiZXR0ZXIgdG8gYWxzbyBjbGVhciBoZXJlIGZvciBkdW1wPykKKyAgICBtSW5wdXQoaW5wdXQpLCBtQWN0aXZlVHJhY2tzR2VuKDApLCBtUnNtcEluQnVmZmVyKE5VTEwpLAorICAgIC8vIG1Sc21wSW5GcmFtZXMgYW5kIG1Sc21wSW5GcmFtZXNQMiBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCisgICAgbVJzbXBJblJlYXIoMCkKICNpZmRlZiBURUVfU0lOSwogICAgICwgbVRlZVNpbmsodGVlU2luaykKICNlbmRpZgorICAgICwgbVJlYWRPbmx5SGVhcChuZXcgTWVtb3J5RGVhbGVyKGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplLAorICAgICAgICAgICAgIlJlY29yZFRocmVhZFJPIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSkpCisgICAgLy8gbUZhc3RDYXB0dXJlIGJlbG93CisgICAgLCBtRmFzdENhcHR1cmVGdXRleCgwKQorICAgIC8vIG1JbnB1dFNvdXJjZQorICAgIC8vIG1QaXBlU2luaworICAgIC8vIG1QaXBlU291cmNlCisgICAgLCBtUGlwZUZyYW1lc1AyKDApCisgICAgLy8gbVBpcGVNZW1vcnkKKyAgICAvLyBtRmFzdENhcHR1cmVOQkxvZ1dyaXRlcgorICAgICwgbUZhc3RUcmFja0F2YWlsKGZhbHNlKQogewogICAgIHNucHJpbnRmKG1OYW1lLCBrTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7CisgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbU5hbWUpOwogCi0gICAgcmVhZElucHV0UGFyYW1ldGVycygpOworICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOworCisgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNvdXJjZSBmb3IgdGhlIEhBTCBpbnB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKKyAgICBtSW5wdXRTb3VyY2UgPSBuZXcgQXVkaW9TdHJlYW1JblNvdXJjZShpbnB1dC0+c3RyZWFtKTsKKyAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KX07CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CisKKyAgICAvLyBpbml0aWFsaXplIGZhc3QgY2FwdHVyZSBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbgorICAgIGJvb2wgaW5pdEZhc3RDYXB0dXJlOworICAgIHN3aXRjaCAoa1VzZUZhc3RDYXB0dXJlKSB7CisgICAgY2FzZSBGYXN0Q2FwdHVyZV9OZXZlcjoKKyAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRmFzdENhcHR1cmVfQWx3YXlzOgorICAgICAgICBpbml0RmFzdENhcHR1cmUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZhc3RDYXB0dXJlX1N0YXRpYzoKKyAgICAgICAgdWludDMyX3QgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7CisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBfbChhdWRpb0ZsaW5nZXItPm1IYXJkd2FyZUxvY2spOworICAgICAgICAgICAgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPSBhdWRpb0ZsaW5nZXItPm1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZTsKKyAgICAgICAgfQorICAgICAgICBpbml0RmFzdENhcHR1cmUgPQorICAgICAgICAgICAgICAgIC8vIGVpdGhlciBjYXB0dXJlIHNhbXBsZSByYXRlIGlzIHNhbWUgYXMgKGEgcmVhc29uYWJsZSkgcHJpbWFyeSBvdXRwdXQgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAoKChwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSA0ODAwMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1TYW1wbGVSYXRlID09IHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlKSkgfHwKKyAgICAgICAgICAgICAgICAvLyBvciBwcmltYXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBpcyB1bmtub3duLCBhbmQgY2FwdHVyZSBzYW1wbGUgcmF0ZSBpcyByZWFzb25hYmxlCisgICAgICAgICAgICAgICAgKChwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoKG1TYW1wbGVSYXRlID09IDQ0MTAwIHx8IG1TYW1wbGVSYXRlID09IDQ4MDAwKSkpKSAmJgorICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgYnVmZmVyIHNpemUgaXMgPCAxMiBtcworICAgICAgICAgICAgICAgIChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUgPCAxMjsKKyAgICAgICAgYnJlYWs7CisgICAgLy8gY2FzZSBGYXN0Q2FwdHVyZV9EeW5hbWljOgorICAgIH0KKworICAgIGlmIChpbml0RmFzdENhcHR1cmUpIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSBmb3IgRmFzdE1peGVyIHRvIHdyaXRlIHRvLCBhbmQgZm9yIHVzIGFuZCBmYXN0IHRyYWNrcyB0byByZWFkIGZyb20KKyAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1JbnB1dFNvdXJjZS0+Zm9ybWF0KCk7CisgICAgICAgIHNpemVfdCBwaXBlRnJhbWVzUDIgPSByb3VuZHVwKG1TYW1wbGVSYXRlIC8gMjUpOyAgICAvLyBkb3VibGUtYnVmZmVyaW5nIG9mIDIwIG1zIGVhY2gKKyAgICAgICAgc2l6ZV90IHBpcGVTaXplID0gcGlwZUZyYW1lc1AyICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpOworICAgICAgICB2b2lkICpwaXBlQnVmZmVyOworICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+IHJvSGVhcChyZWFkT25seUhlYXAoKSk7CisgICAgICAgIHNwPElNZW1vcnk+IHBpcGVNZW1vcnk7CisgICAgICAgIGlmICgocm9IZWFwID09IDApIHx8CisgICAgICAgICAgICAgICAgKHBpcGVNZW1vcnkgPSByb0hlYXAtPmFsbG9jYXRlKHBpcGVTaXplKSkgPT0gMCB8fAorICAgICAgICAgICAgICAgIChwaXBlQnVmZmVyID0gcGlwZU1lbW9yeS0+cG9pbnRlcigpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHBpcGUgYnVmZmVyIHNpemU9JXp1IiwgcGlwZVNpemUpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gcGlwZSB3aWxsIGJlIHNoYXJlZCBkaXJlY3RseSB3aXRoIGZhc3QgY2xpZW50cywgc28gY2xlYXIgdG8gYXZvaWQgbGVha2luZyBvbGQgaW5mb3JtYXRpb24KKyAgICAgICAgbWVtc2V0KHBpcGVCdWZmZXIsIDAsIHBpcGVTaXplKTsKKyAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKHBpcGVGcmFtZXNQMiwgZm9ybWF0LCBwaXBlQnVmZmVyKTsKKyAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OworICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CisgICAgICAgIG1QaXBlU2luayA9IHBpcGU7CisgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7CisgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKKyAgICAgICAgbVBpcGVTb3VyY2UgPSBwaXBlUmVhZGVyOworICAgICAgICBtUGlwZUZyYW1lc1AyID0gcGlwZUZyYW1lc1AyOworICAgICAgICBtUGlwZU1lbW9yeSA9IHBpcGVNZW1vcnk7CisKKyAgICAgICAgLy8gY3JlYXRlIGZhc3QgY2FwdHVyZQorICAgICAgICBtRmFzdENhcHR1cmUgPSBuZXcgRmFzdENhcHR1cmUoKTsKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0Q2FwdHVyZS0+c3EoKTsKKyNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCisgICAgICAgIC8vIEZJWE1FCisjZW5kaWYKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgc3RhdGUtPm1DYmxrID0gTlVMTDsKKyAgICAgICAgc3RhdGUtPm1JbnB1dFNvdXJjZSA9IG1JbnB1dFNvdXJjZS5nZXQoKTsKKyAgICAgICAgc3RhdGUtPm1JbnB1dFNvdXJjZUdlbisrOworICAgICAgICBzdGF0ZS0+bVBpcGVTaW5rID0gcGlwZTsKKyAgICAgICAgc3RhdGUtPm1QaXBlU2lua0dlbisrOworICAgICAgICBzdGF0ZS0+bUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6Q09MRF9JRExFOworICAgICAgICAvLyBhbHJlYWR5IGRvbmUgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdAorICAgICAgICAvL21GYXN0Q2FwdHVyZUZ1dGV4ID0gMDsKKyAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0Q2FwdHVyZUZ1dGV4OworICAgICAgICBzdGF0ZS0+bUNvbGRHZW4rKzsKKyAgICAgICAgc3RhdGUtPm1EdW1wU3RhdGUgPSAmbUZhc3RDYXB0dXJlRHVtcFN0YXRlOworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIC8vIEZJWE1FCisjZW5kaWYKKyAgICAgICAgbUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtGYXN0Q2FwdHVyZUxvZ1NpemUsICJGYXN0Q2FwdHVyZSIpOworICAgICAgICBzdGF0ZS0+bU5CTG9nV3JpdGVyID0gbUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIuZ2V0KCk7CisgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgc3EtPnB1c2goRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOworCisgICAgICAgIC8vIHN0YXJ0IHRoZSBmYXN0IGNhcHR1cmUKKyAgICAgICAgbUZhc3RDYXB0dXJlLT5ydW4oIkZhc3RDYXB0dXJlIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOworICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdENhcHR1cmUtPmdldFRpZCgpOworICAgICAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiUG9saWN5IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgaXMgdW5hdmFpbGFibGUgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgICAga1ByaW9yaXR5RmFzdENhcHR1cmUsIGdldHBpZF9jYWNoZWQsIHRpZCwgZXJyKTsKKyAgICAgICAgfQorCisjaWZkZWYgQVVESU9fV0FUQ0hET0cKKyAgICAgICAgLy8gRklYTUUKKyNlbmRpZgorCisgICAgICAgIG1GYXN0VHJhY2tBdmFpbCA9IHRydWU7CisgICAgfQorZmFpbGVkOiA7CisKKyAgICAvLyBGSVhNRSBtTm9ybWFsU291cmNlCiB9CiAKIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6On5SZWNvcmRUaHJlYWQoKQogeworICAgIGlmIChtRmFzdENhcHR1cmUgIT0gMCkgeworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgKnNxID0gbUZhc3RDYXB0dXJlLT5zcSgpOworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RDYXB0dXJlU3RhdGU6OkNPTERfSURMRSkgeworICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19pbmMoJm1GYXN0Q2FwdHVyZUZ1dGV4KTsKKyAgICAgICAgICAgIGlmIChvbGQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUZhc3RDYXB0dXJlRnV0ZXgsIEZVVEVYX1dBS0VfUFJJVkFURSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6RVhJVDsKKyAgICAgICAgc3EtPmVuZCgpOworICAgICAgICBzcS0+cHVzaChGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CisgICAgICAgIG1GYXN0Q2FwdHVyZS0+am9pbigpOworICAgICAgICBtRmFzdENhcHR1cmUuY2xlYXIoKTsKKyAgICB9CisgICAgbUF1ZGlvRmxpbmdlci0+dW5yZWdpc3RlcldyaXRlcihtRmFzdENhcHR1cmVOQkxvZ1dyaXRlcik7CisgICAgbUF1ZGlvRmxpbmdlci0+dW5yZWdpc3RlcldyaXRlcihtTkJMb2dXcml0ZXIpOwogICAgIGRlbGV0ZVtdIG1Sc21wSW5CdWZmZXI7Ci0gICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgZGVsZXRlW10gbVJzbXBPdXRCdWZmZXI7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQpAQCAtNDQwOSwyMzAgKzQ5OTcsNDgyIEBACiAgICAgcnVuKG1OYW1lLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVhZHlUb1J1bigpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdENoZWNrKCk7Ci0gICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCJSZWNvcmRUaHJlYWQgJXAgY291bGQgbm90IGluaXRpYWxpemUiLCB0aGlzKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp0aHJlYWRMb29wKCkKIHsKLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwotICAgIHNwPFJlY29yZFRyYWNrPiBhY3RpdmVUcmFjazsKLSAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKLQogICAgIG5zZWNzX3QgbGFzdFdhcm5pbmcgPSAwOwogCiAgICAgaW5wdXRTdGFuZEJ5KCk7CisKK3JlYWNxdWlyZV93YWtlbG9jazoKKyAgICBzcDxSZWNvcmRUcmFjaz4gYWN0aXZlVHJhY2s7CisgICAgaW50IGFjdGl2ZVRyYWNrc0dlbjsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGFjdGl2ZVRyYWNrID0gbUFjdGl2ZVRyYWNrOwotICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbChhY3RpdmVUcmFjayAhPSAwID8gYWN0aXZlVHJhY2stPnVpZCgpIDogLTEpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOworICAgICAgICBhY3RpdmVUcmFja3NHZW4gPSBtQWN0aXZlVHJhY2tzR2VuOworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIGFuIGFyYml0cmFyeSBjaG9pY2UKKyAgICAgICAgICAgIGFjdGl2ZVRyYWNrID0gbUFjdGl2ZVRyYWNrc1swXTsKKyAgICAgICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKGFjdGl2ZVRyYWNrLT51aWQoKSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8aW50PiB0bXA7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wLmFkZChtQWN0aXZlVHJhY2tzW2ldLT51aWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwZGF0ZVdha2VMb2NrVWlkc19sKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgtMSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB1c2VkIHRvIHZlcmlmeSB3ZSd2ZSByZWFkIGF0IGxlYXN0IG9uY2UgYmVmb3JlIGV2YWx1YXRpbmcgaG93IG1hbnkgYnl0ZXMgd2VyZSByZWFkCi0gICAgYm9vbCByZWFkT25jZSA9IGZhbHNlOworICAgIC8vIHVzZWQgdG8gcmVxdWVzdCBhIGRlZmVycmVkIHNsZWVwLCB0byBiZSBleGVjdXRlZCBsYXRlciB3aGlsZSBtdXRleCBpcyB1bmxvY2tlZAorICAgIHVpbnQzMl90IHNsZWVwVXMgPSAwOwogCi0gICAgLy8gc3RhcnQgcmVjb3JkaW5nCi0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CisgICAgLy8gbG9vcCB3aGlsZSB0aGVyZSBpcyB3b3JrIHRvIGRvCisgICAgZm9yICg7OykgeworICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAotICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzKCk7CisgICAgICAgIC8vIHNsZWVwIHdpdGggbXV0ZXggdW5sb2NrZWQKKyAgICAgICAgaWYgKHNsZWVwVXMgPiAwKSB7CisgICAgICAgICAgICB1c2xlZXAoc2xlZXBVcyk7CisgICAgICAgICAgICBzbGVlcFVzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFjdGl2ZVRyYWNrcyBhY2N1bXVsYXRlcyBhIGNvcHkgb2YgYSBzdWJzZXQgb2YgbUFjdGl2ZVRyYWNrcworICAgICAgICBWZWN0b3I8IHNwPFJlY29yZFRyYWNrPiA+IGFjdGl2ZVRyYWNrczsKKworICAgICAgICAvLyByZWZlcmVuY2UgdG8gdGhlIChmaXJzdCBhbmQgb25seSkgYWN0aXZlIGZhc3QgdHJhY2sKKyAgICAgICAgc3A8UmVjb3JkVHJhY2s+IGZhc3RUcmFjazsKKworICAgICAgICAvLyByZWZlcmVuY2UgdG8gYSBmYXN0IHRyYWNrIHdoaWNoIGlzIGFib3V0IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgc3A8UmVjb3JkVHJhY2s+IGZhc3RUcmFja1RvUmVtb3ZlOwogCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCAmJiBhY3RpdmVUcmFjayAhPSBtQWN0aXZlVHJhY2spIHsKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8aW50PiB0bXA7Ci0gICAgICAgICAgICAgICAgdG1wLmFkZChtQWN0aXZlVHJhY2stPnVpZCgpKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVXYWtlTG9ja1VpZHNfbCh0bXApOworCisgICAgICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgZXhpdFBlbmRpbmcgaGVyZSBiZWNhdXNlIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkgYW5kCisgICAgICAgICAgICAvLyBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpIGNhbiB0ZW1wb3JhcmlseSByZWxlYXNlIG1Mb2NrCisgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBtQWN0aXZlVHJhY2s7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrID09IDAgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBzdGFuZGJ5KCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIC8vIGlmIG5vIGFjdGl2ZSB0cmFjayhzKSwgdGhlbiBzdGFuZGJ5IGFuZCByZWxlYXNlIHdha2Vsb2NrCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgICAvLyBleGl0UGVuZGluZygpIGNhbid0IGJlY29tZSB0cnVlIGhlcmUKICAgICAgICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tfbCgpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6IGxvb3Agc3RvcHBpbmciKTsKICAgICAgICAgICAgICAgICAvLyBnbyB0byBzbGVlcAogICAgICAgICAgICAgICAgIG1XYWl0V29ya0NWLndhaXQobUxvY2spOwogICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6IGxvb3Agc3RhcnRpbmciKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbChtQWN0aXZlVHJhY2sgIT0gMCA/IG1BY3RpdmVUcmFjay0+dWlkKCkgOiAtMSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZ290byByZWFjcXVpcmVfd2FrZWxvY2s7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKG1BY3RpdmVUcmFjayk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YW5kYnkoKTsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpSRVNVTUlORykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVJlcUNoYW5uZWxDb3VudCAhPSBtQWN0aXZlVHJhY2stPmNoYW5uZWxDb3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRPbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgc3RhcnQgc3VjY2VlZHMgb25seSBpZiBmaXJzdCByZWFkIGZyb20gYXVkaW8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWRzCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVhZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3NHZW4gIT0gYWN0aXZlVHJhY2tzR2VuKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzR2VuID0gbUFjdGl2ZVRyYWNrc0dlbjsKKyAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8aW50PiB0bXA7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wLmFkZChtQWN0aXZlVHJhY2tzW2ldLT51aWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwZGF0ZVdha2VMb2NrVWlkc19sKHRtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZG9Ccm9hZGNhc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKSB7CisKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFja3NbaV07CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFja1RvUmVtb3ZlID09IDApOworICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrVG9SZW1vdmUgPSBhY3RpdmVUcmFjazsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CisgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVHJhY2tCYXNlOjp0cmFja19zdGF0ZSBhY3RpdmVUcmFja1N0YXRlID0gYWN0aXZlVHJhY2stPm1TdGF0ZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGl2ZVRyYWNrU3RhdGUpIHsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTSU5HOgorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlNUQVJUSU5HXzE6CisgICAgICAgICAgICAgICAgICAgIHNsZWVwVXMgPSAxMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVEFSVElOR18yOgorICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6QUNUSVZFOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOgorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5leHBlY3RlZCBhY3RpdmVUcmFja1N0YXRlICVkIiwgYWN0aXZlVHJhY2tTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzLmFkZChhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgaSsrOworCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFtRmFzdFRyYWNrQXZhaWwpOworICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2sgPT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjayA9IGFjdGl2ZVRyYWNrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkb0Jyb2FkY2FzdCkgeworICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzbGVlcCBpZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHRyYWNrcyB0byBwcm9jZXNzCisgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNsZWVwVXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcFVzID0ga1JlY29yZFRocmVhZFNsZWVwVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXBVcyA9IDA7CiAKICAgICAgICAgICAgIGxvY2tFZmZlY3RDaGFpbnNfbChlZmZlY3RDaGFpbnMpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpBQ1RJVkUgJiYKLSAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OlJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKKyAgICAgICAgLy8gdGhyZWFkIG11dGV4IGlzIG5vdyB1bmxvY2tlZCwgbUFjdGl2ZVRyYWNrcyB1bmtub3duLCBhY3RpdmVUcmFja3Muc2l6ZSgpID4gMAorCisgICAgICAgIHNpemVfdCBzaXplID0gZWZmZWN0Q2hhaW5zLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIC8vIHRocmVhZCBtdXRleCBpcyBub3QgbG9ja2VkLCBidXQgZWZmZWN0IGNoYWluIGlzIGxvY2tlZAorICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFB1c2ggYSBuZXcgZmFzdCBjYXB0dXJlIHN0YXRlIGlmIGZhc3QgY2FwdHVyZSBpcyBub3QgYWxyZWFkeSBydW5uaW5nLCBvciBjYmxrIGNoYW5nZQorICAgICAgICBpZiAobUZhc3RDYXB0dXJlICE9IDApIHsKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdENhcHR1cmUtPnNxKCk7CisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICAgICAgYm9vbCBkaWRNb2RpZnkgPSBmYWxzZTsKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6YmxvY2tfdCBibG9jayA9IEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEOworICAgICAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCAhPSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEX1dSSVRFIC8qIEZJWE1FICYmCisgICAgICAgICAgICAgICAgICAgIChrVXNlRmFzdE1peGVyICE9IEZhc3RNaXhlcl9EeW5hbWljIHx8IHN0YXRlLT5tVHJhY2tNYXNrID4gMSkqLykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bUNvbW1hbmQgPT0gRmFzdENhcHR1cmVTdGF0ZTo6Q09MRF9JRExFKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtRmFzdENhcHR1cmVGdXRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtRmFzdENhcHR1cmVGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEX1dSSVRFOworI2lmIDAgICAvLyBGSVhNRQorICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5pbmNyZWFzZVNhbXBsaW5nTihtQXVkaW9GbGluZ2VyLT5pc0xvd1JhbURldmljZSgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlOjprU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlIDogRmFzdE1peGVyRHVtcFN0YXRlOjprU2FtcGxpbmdOKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QgKmNibGtPbGQgPSBzdGF0ZS0+bUNibGs7CisgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QgKmNibGtOZXcgPSBmYXN0VHJhY2sgIT0gMCA/IGZhc3RUcmFjay0+Y2JsaygpIDogTlVMTDsKKyAgICAgICAgICAgIGlmIChjYmxrTmV3ICE9IGNibGtPbGQpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUNibGsgPSBjYmxrTmV3OworICAgICAgICAgICAgICAgIC8vIGJsb2NrIHVudGlsIGFja2VkIGlmIHJlbW92aW5nIGEgZmFzdCB0cmFjaworICAgICAgICAgICAgICAgIGlmIChjYmxrT2xkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3EtPmVuZChkaWRNb2RpZnkpOworICAgICAgICAgICAgaWYgKGRpZE1vZGlmeSkgeworICAgICAgICAgICAgICAgIHNxLT5wdXNoKGJsb2NrKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgaWYgKGtVc2VGYXN0Q2FwdHVyZSA9PSBGYXN0Q2FwdHVyZV9EeW5hbWljKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxTb3VyY2UgPSBtUGlwZVNvdXJjZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBydW4gdGhlIGZhc3QgdHJhY2sgZGVzdHJ1Y3RvciB3aXRoIHRocmVhZCBtdXRleCB1bmxvY2tlZAorICAgICAgICBmYXN0VHJhY2tUb1JlbW92ZS5jbGVhcigpOworCisgICAgICAgIC8vIFJlYWQgZnJvbSBIQUwgdG8ga2VlcCB1cCB3aXRoIGZhc3Rlc3QgY2xpZW50IGlmIG11bHRpcGxlIGFjdGl2ZSB0cmFja3MsIG5vdCBzbG93ZXN0IG9uZS4KKyAgICAgICAgLy8gT25seSB0aGUgY2xpZW50KHMpIHRoYXQgYXJlIHRvbyBzbG93IHdpbGwgb3ZlcnJ1bi4gQnV0IGlmIGV2ZW4gdGhlIGZhc3Rlc3QgY2xpZW50IGlzIHRvbworICAgICAgICAvLyBzbG93LCB0aGVuIHRoaXMgUmVjb3JkVGhyZWFkIHdpbGwgb3ZlcnJ1biBieSBub3QgY2FsbGluZyBIQUwgcmVhZCBvZnRlbiBlbm91Z2guCisgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGlzIG5vbi1jb250aWd1b3VzLCBmaXJzdCByZWFkIHBhc3QgdGhlIG5vbWluYWwgZW5kIG9mIGJ1ZmZlciwgdGhlbgorICAgICAgICAvLyBjb3B5IHRvIHRoZSByaWdodCBwbGFjZS4gIFBlcm1pdHRlZCBiZWNhdXNlIG1Sc21wSW5CdWZmZXIgd2FzIG92ZXItYWxsb2NhdGVkLgorCisgICAgICAgIGludDMyX3QgcmVhciA9IG1Sc21wSW5SZWFyICYgKG1Sc21wSW5GcmFtZXNQMiAtIDEpOworICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQ7CisKKyAgICAgICAgLy8gSWYgYW4gTkJBSU8gc291cmNlIGlzIHByZXNlbnQsIHVzZSBpdCB0byByZWFkIHRoZSBub3JtYWwgY2FwdHVyZSdzIGRhdGEKKyAgICAgICAgaWYgKG1QaXBlU291cmNlICE9IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7CisgICAgICAgICAgICBmcmFtZXNSZWFkID0gbVBpcGVTb3VyY2UtPnJlYWQoJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLAorICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1JlYWQsIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKKyAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSBwaXBlIGlzIG5vbi1ibG9ja2luZywgc2ltdWxhdGUgYmxvY2tpbmcgaW5wdXQKKyAgICAgICAgICAgICAgICBzbGVlcFVzID0gKGZyYW1lc1RvUmVhZCAqIDEwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgSEFMIC8gQXVkaW9TdHJlYW1JbiBkaXJlY3RseQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSBtSW5wdXQtPnN0cmVhbS0+cmVhZChtSW5wdXQtPnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLCBtQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBieXRlc1JlYWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBieXRlc1JlYWQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPCAwIHx8IChmcmFtZXNSZWFkID09IDAgJiYgbVBpcGVTb3VyY2UgPT0gMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIGZhaWxlZDogZnJhbWVzUmVhZD0lZCIsIGZyYW1lc1JlYWQpOworICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAorICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7CisgICAgICAgICAgICBzbGVlcFVzID0ga1JlY29yZFRocmVhZFNsZWVwVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgZ290byB1bmxvY2s7CisgICAgICAgIH0KKyAgICAgICAgQUxPR19BU1NFUlQoZnJhbWVzUmVhZCA+IDApOworCisgICAgICAgIGlmIChtVGVlU2luayAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKCZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwgZnJhbWVzUmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gaXMgbm9uLWNvbnRpZ3VvdXMsIHdlIG5vdyBjb3JyZWN0IGZvciByZWFkaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlci4KKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gcmVhcjsKKyAgICAgICAgICAgIGlmICgoc2l6ZV90KSBmcmFtZXNSZWFkID4gcGFydDEpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkobVJzbXBJbkJ1ZmZlciwgJm1Sc21wSW5CdWZmZXJbbVJzbXBJbkZyYW1lc1AyICogbUNoYW5uZWxDb3VudF0sCisgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVzUmVhZCAtIHBhcnQxKSAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlYXIgPSBtUnNtcEluUmVhciArPSBmcmFtZXNSZWFkOworCisgICAgICAgIHNpemUgPSBhY3RpdmVUcmFja3Muc2l6ZSgpOworICAgICAgICAvLyBsb29wIG92ZXIgZWFjaCBhY3RpdmUgdHJhY2sKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGFjdGl2ZVRyYWNrID0gYWN0aXZlVHJhY2tzW2ldOworCisgICAgICAgICAgICAvLyBza2lwIGZhc3QgdHJhY2tzLCBhcyB0aG9zZSBhcmUgaGFuZGxlZCBkaXJlY3RseSBieSBGYXN0Q2FwdHVyZQorICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlYWRPbmNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzT3V0ID0gYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXNhbXBsZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZW51bSB7CisgICAgICAgICAgICAgICAgT1ZFUlJVTl9VTktOT1dOLAorICAgICAgICAgICAgICAgIE9WRVJSVU5fVFJVRSwKKyAgICAgICAgICAgICAgICBPVkVSUlVOX0ZBTFNFCisgICAgICAgICAgICB9IG92ZXJydW4gPSBPVkVSUlVOX1VOS05PV047CisKKyAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBnZXROZXh0QnVmZmVyIHRvIGhhbmRsZSBjaXJjdWxhciBzaW5rCisgICAgICAgICAgICBmb3IgKDs7KSB7CisKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsuZnJhbWVDb3VudCA9IH4wOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCZhY3RpdmVUcmFjay0+bVNpbmspOworICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVNpbmsuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzdGF0dXMgPT0gT0spICE9IChmcmFtZXNPdXQgPiAwKSk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZyb250ID0gYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udDsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW47CisKKyAgICAgICAgICAgICAgICBpZiAoZmlsbGVkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHRyZWF0IGxpa2UgYSBtYXNzaXZlIG92ZXJydW4gYW5kIHJlLXN5bmMKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSAwOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ID0gcmVhcjsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fVFJVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChzaXplX3QpIGZpbGxlZCA8PSBtUnNtcEluRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gKHNpemVfdCkgZmlsbGVkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBpcyBub3Qga2VlcGluZyB1cCB3aXRoIHNlcnZlciwgYnV0IGdpdmUgaXQgbGF0ZXN0IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBtUnNtcEluRnJhbWVzOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ID0gZnJvbnQgPSByZWFyIC0gZnJhbWVzSW47CisgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSAwIHx8IGZyYW1lc0luID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzYW1wbGluZwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZnJhbWVzT3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW4gPSBtRnJhbWVDb3VudCAtIG1Sc21wSW5JbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqc3JjID0gKGludDhfdCAqKW1Sc21wSW5CdWZmZXIgKyBtUnNtcEluSW5kZXggKiBtRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqZHN0ID0gYnVmZmVyLmk4ICsgKGJ1ZmZlci5mcmFtZUNvdW50IC0gZnJhbWVzT3V0KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPm1GcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luID4gZnJhbWVzT3V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc091dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXggKz0gZnJhbWVzSW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0IC09IGZyYW1lc0luOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IG1SZXFDaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBmcmFtZXNJbiAqIG1GcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbWl4X3RvX3N0ZXJlb19pMTZfZnJvbV9tb25vX2kxNigoaW50MTZfdCAqKWRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKilzcmMsIGZyYW1lc0luKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KChpbnQxNl90ICopZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKXNyYywgZnJhbWVzSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCAmJiBtRnJhbWVDb3VudCA9PSBtUnNtcEluSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWFkSW50bzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID09IG1GcmFtZUNvdW50ICYmIG1DaGFubmVsQ291bnQgPT0gbVJlcUNoYW5uZWxDb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW50byA9IGJ1ZmZlci5yYXc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludG8gPSBtUnNtcEluQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sIHJlYWRJbnRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZWFkIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtQnl0ZXNSZWFkIDwgMCkgJiYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlYWRpbmcgYXVkaW8gaW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIGlucHV0IGludG8gc3RhbmRieSBzbyB0aGF0IGl0IHRyaWVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGF0IG5leHQgcmVhZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0YW5kQnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUocmVhZEludG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA+PiBGb3JtYXRfZnJhbWVCaXRTaGlmdChtVGVlU2luay0+Zm9ybWF0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luID4gZnJhbWVzT3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGZyYW1lc0luOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDhfdCAqZHN0ID0gYWN0aXZlVHJhY2stPm1TaW5rLmk4OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZnJhbWVzSW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcm9udCAmPSBtUnNtcEluRnJhbWVzUDIgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gZnJvbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydDEgPiBmcmFtZXNJbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxID0gZnJhbWVzSW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnNyYyA9IChpbnQ4X3QgKiltUnNtcEluQnVmZmVyICsgKGZyb250ICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSBhY3RpdmVUcmFjay0+bUNoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgcGFydDEgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBtaXhfdG9fc3RlcmVvX2kxNl9mcm9tX21vbm9faTE2KChpbnQxNl90ICopZHN0LCAoY29uc3QgaW50MTZfdCAqKXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoKGludDE2X3QgKilkc3QsIChjb25zdCBpbnQxNl90ICopc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IHBhcnQxICogYWN0aXZlVHJhY2stPm1GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBmcm9udCArPSBwYXJ0MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luIC09IHBhcnQxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgKz0gZnJhbWVzT3V0OworCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmcmFtZXNJbk5lZWRlZCBzaG91bGQgcmVhbGx5IGJlIHBhcnQgb2YgcmVzYW1wbGVyIEFQSSwgYW5kIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBkZXBlbmQgb24gdGhlIFNSQyByYXRpbworICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB0byBrZWVwIG1Sc21wSW5CdWZmZXIgZnVsbCBzbyByZXNhbXBsZXIgYWx3YXlzIGhhcyBzdWZmaWNpZW50IGlucHV0CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNJbk5lZWRlZDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSByZS1jYWxjdWxhdGUgd2hlbiBpdCBjaGFuZ2VzLCBhbmQgb3B0aW1pemUgZm9yIGNvbW1vbiByYXRpb3MKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHByZWNvbXB1dGUgaW4vb3V0IGJlY2F1c2UgZmxvYXRpbmcgcG9pbnQgaXMgbm90IGFzc29jaWF0aXZlCisgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gYSpiL2MgIT0gYSooYi9jKS4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGluKG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIG91dChhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCA9IGNlaWwoZnJhbWVzT3V0ICogaW4gLyBvdXQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5lZWQgJXUgZnJhbWVzIGluIHRvIHByb2R1Y2UgJXUgb3V0IGdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBBbHRob3VnaCB3ZSB0aGVvcmV0aWNhbGx5IGhhdmUgZnJhbWVzSW4gaW4gY2lyY3VsYXIgYnVmZmVyLCBzb21lIG9mIHRob3NlIGFyZQorICAgICAgICAgICAgICAgICAgICAvLyB1bnJlbGVhc2VkIGZyYW1lcywgYW5kIHRodXMgbXVzdCBiZSBkaXNjb3VudGVkIGZvciBwdXJwb3NlIG9mIGJ1ZGdldGluZy4KKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVucmVsZWFzZWQgPSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsOworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc0luID4gdW5yZWxlYXNlZCA/IGZyYW1lc0luIC0gdW5yZWxlYXNlZCA6IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA8IGZyYW1lc0luTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibm90IGVub3VnaCB0byByZXNhbXBsZTogaGF2ZSAldSBmcmFtZXMgaW4gYnV0IG5lZWQgJXUgaW4gdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjZSAldSBvdXQgZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld0ZyYW1lc091dCA9IGZyYW1lc0luID4gMCA/IGZsb29yKChmcmFtZXNJbiAtIDEpICogb3V0IC8gaW4pIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmV3RnJhbWVzT3V0ID49IGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RnJhbWVzT3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkID0gY2VpbChuZXdGcmFtZXNPdXQgKiBpbiAvIG91dCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBuZWVkICV1IGZyYW1lcyBpbiB0byBwcm9kdWNlICV1IG91dCBnaXZlbiBvdXQvaW4gcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIG91dCAvIGluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZnJhbWVzSW4gPCBmcmFtZXNJbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VjY2VzcyAyOiBoYXZlICV1IGZyYW1lcyBpbiBhbmQgbmVlZCAldSBpbiB0byBwcm9kdWNlICV1IG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIGluIC8gb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IG5ld0ZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzIDE6IGhhdmUgJXUgaW4gYW5kIG5lZWQgJXUgaW4gdG8gcHJvZHVjZSAldSBvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluIC8gb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgbVJzbXBPdXRCdWZmZXIgYXMgbmVlZGVkOyB3ZSB3aWxsIGdyb3cgYnV0IG5ldmVyIHNocmluaworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1Sc21wT3V0RnJhbWVDb3VudCA8IGZyYW1lc091dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgd2h5IGRvZXMgZWFjaCB0cmFjayBuZWVkIGl0J3Mgb3duIG1Sc21wT3V0QnVmZmVyPyBjYW4ndCB0aGV5IHNoYXJlPworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlbworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyID0gbmV3IGludDMyX3RbZnJhbWVzT3V0ICogRkNDXzJdOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0RnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxlciBhY2N1bXVsYXRlcywgYnV0IHdlIG9ubHkgaGF2ZSBvbmUgc291cmNlIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldChtUnNtcE91dEJ1ZmZlciwgMCwgZnJhbWVzT3V0ICogRkNDXzIgKiBzaXplb2YoaW50MzJfdCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBhbHRlciBvdXRwdXQgZnJhbWUgY291bnQgYXMgaWYgd2Ugd2VyZSBleHBlY3Rpbmcgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA+Pj0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZShtUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgLyogQXVkaW9CdWZmZXJQcm92aWRlciogKi8pOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCAwLCBmcmFtZXNPdXQgKiBGQ0NfMiAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyLT5yZXNhbXBsZShhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBob3cgYWJvdXQgaGF2aW5nIGFjdGl2ZVRyYWNrIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpdHNlbGY/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhpcyovIC8qIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICovKTsKICAgICAgICAgICAgICAgICAgICAgLy8gZGl0aGVyQW5kQ2xhbXAoKSB3b3JrcyBhcyBsb25nIGFzIGFsbCBidWZmZXJzIHJldHVybmVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgIC8vIG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigpIGFyZSAzMiBiaXQgYWxpZ25lZCB3aGljaCBzaG91bGQgYmUgYWx3YXlzIHRydWUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDIgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSB0eXBlIHB1biBtUnNtcE91dEJ1ZmZlciBmcm9tIFExOS4xMiB0byBpbnQxNl90Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChtUnNtcE91dEJ1ZmZlciwgbVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCkgYXJlIDMyIGJpdCBhbGlnbmVkIHdoaWNoIHNob3VsZCBiZSBhbHdheXMgdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbXBvcmFyaWx5IHR5cGUgcHVuIG1Sc21wT3V0QnVmZmVyIGZyb20gUTQuMjcgdG8gaW50MTZfdAorICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlbyBzYW1wbGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gcG9zdCBzdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNihidWZmZXIuaTE2LCAoaW50MTZfdCAqKW1Sc21wT3V0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoYWN0aXZlVHJhY2stPm1TaW5rLmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKilhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCAqKWJ1ZmZlci5yYXcsIG1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QgKilhY3RpdmVUcmFjay0+bVNpbmsucmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGRvbmUgd2l0aCBtUnNtcE91dEJ1ZmZlcgogCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzdG9Ecm9wID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDAgJiYgKG92ZXJydW4gPT0gT1ZFUlJVTl9VTktOT1dOKSkgeworICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQgPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+cmVsZWFzZUJ1ZmZlcigmYWN0aXZlVHJhY2stPm1TaW5rKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzdG9Ecm9wID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc3RvRHJvcCAtPSBidWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzdG9Ecm9wIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNvdWxkIGRvIGEgcGFydGlhbCBkcm9wIG9mIGZyYW1lc091dAorICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCAtPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzdG9Ecm9wICs9IGJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXN0b0Ryb3AgPj0gMCB8fCBtU3luY1N0YXJ0RXZlbnQgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0YXJ0RXZlbnQtPmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wICs9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA+PSAwIHx8IGFjdGl2ZVRyYWNrLT5tU3luY1N0YXJ0RXZlbnQgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN5bmNTdGFydEV2ZW50LT5pc0NhbmNlbGxlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlN5bmNlZCByZWNvcmQgJXMsIHNlc3Npb24gJWQsIHRyaWdnZXIgc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1GcmFtZXN0b0Ryb3AgPj0gMCkgPyAidGltZWQgb3V0IiA6ICJjYW5jZWxsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+c2Vzc2lvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TeW5jU3RhcnRFdmVudCAhPSAwKSA/IG1TeW5jU3RhcnRFdmVudC0+dHJpZ2dlclNlc3Npb24oKSA6IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPj0gMCkgPyAidGltZWQgb3V0IiA6ICJjYW5jZWxsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5zZXNzaW9uSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aXZlVHJhY2stPm1TeW5jU3RhcnRFdmVudCAhPSAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN5bmNTdGFydEV2ZW50LT50cmlnZ2VyU2Vzc2lvbigpIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPmNsZWFyT3ZlcmZsb3coKTsKKworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGllbnQgaXNuJ3QgcmV0cmlldmluZyBidWZmZXJzIGZhc3QgZW5vdWdoCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFjay0+c2V0T3ZlcmZsb3coKSkgeworCisgICAgICAgICAgICBzd2l0Y2ggKG92ZXJydW4pIHsKKyAgICAgICAgICAgIGNhc2UgT1ZFUlJVTl9UUlVFOgorICAgICAgICAgICAgICAgIC8vIGNsaWVudCBpc24ndCByZXRyaWV2aW5nIGJ1ZmZlcnMgZmFzdCBlbm91Z2gKKyAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZVRyYWNrLT5zZXRPdmVyZmxvdygpKSB7CiAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgbGFzdFdhcm5pbmcgcGVyIHRyYWNrPwogICAgICAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY29yZFRocmVhZDogYnVmZmVyIG92ZXJmbG93Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IG5vdzsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBwcm9jZXNzb3IgZm9yIGEgd2hpbGUgYmVmb3JlIGFza2luZyBmb3IgYSBuZXcgYnVmZmVyLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBnaXZlIHRoZSBhcHBsaWNhdGlvbiBtb3JlIGNoYW5jZSB0byByZWFkIGZyb20gdGhlIGJ1ZmZlciBhbmQKLSAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgb3ZlcmZsb3cuCi0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1ZFUlJVTl9GQUxTRToKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+Y2xlYXJPdmVyZmxvdygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPVkVSUlVOX1VOS05PV046CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKICAgICAgICAgfQorCit1bmxvY2s6CiAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgogICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKLSAgICAgICAgZWZmZWN0Q2hhaW5zLmNsZWFyKCk7CisgICAgICAgIC8vIGVmZmVjdENoYWlucyBkb2Vzbid0IG5lZWQgdG8gYmUgY2xlYXJlZCwgc2luY2UgaXQgaXMgY2xlYXJlZCBieSBkZXN0cnVjdG9yIGF0IHNjb3BlIGVuZAogICAgIH0KIAotICAgIHN0YW5kYnkoKTsKKyAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC00NjQwLDcgKzU0ODAsOCBAQAogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIHRyYWNrLT5pbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CisgICAgICAgIG1BY3RpdmVUcmFja3MuY2xlYXIoKTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOwogICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKICAgICB9CiAKQEAgLTQ2NTAsNyArNTQ5MSw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdGFuZGJ5KCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKQogewogICAgIGlmICghbVN0YW5kYnkpIHsKICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7CkBAIC00NjYwLDkxICs1NTAxLDEzMCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppbnB1dFN0YW5kQnkoKQogeworICAgIC8vIElkbGUgdGhlIGZhc3QgY2FwdHVyZSBpZiBpdCdzIGN1cnJlbnRseSBydW5uaW5nCisgICAgaWYgKG1GYXN0Q2FwdHVyZSAhPSAwKSB7CisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdENhcHR1cmUtPnNxKCk7CisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RDYXB0dXJlU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0Q2FwdHVyZVN0YXRlOjpDT0xEX0lETEU7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbGRGdXRleEFkZHIgPSAmbUZhc3RDYXB0dXJlRnV0ZXg7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbGRHZW4rKzsKKyAgICAgICAgICAgIG1GYXN0Q2FwdHVyZUZ1dGV4ID0gMDsKKyAgICAgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgICAgIC8vIEJMT0NLX1VOVElMX1BVU0hFRCB3b3VsZCBiZSBpbnN1ZmZpY2llbnQsIGFzIHdlIG5lZWQgaXQgdG8gc3RvcCBkb2luZyBJL08gbm93CisgICAgICAgICAgICBzcS0+cHVzaChGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEKTsKKyNpZiAwCisgICAgICAgICAgICBpZiAoa1VzZUZhc3RDYXB0dXJlID09IEZhc3RDYXB0dXJlX0R5bmFtaWMpIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRQorICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgQVVESU9fV0FUQ0hET0cKKyAgICAgICAgICAgIC8vIEZJWE1FCisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNxLT5lbmQoZmFsc2UgLypkaWRNb2RpZnkqLyk7CisgICAgICAgIH0KKyAgICB9CiAgICAgbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKIH0KIAotc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiAgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZVJlY29yZFRyYWNrX2woCisvLyBSZWNvcmRUaHJlYWQ6OmNyZWF0ZVJlY29yZFRyYWNrX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAorc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y3JlYXRlUmVjb3JkVHJhY2tfbCgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHVpZCwKICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9ICpwRnJhbWVDb3VudDsKICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2s7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIAorICAgIC8vIGNsaWVudCBleHByZXNzZXMgYSBwcmVmZXJlbmNlIGZvciBGQVNULCBidXQgd2UgZ2V0IHRoZSBmaW5hbCBzYXkKKyAgICBpZiAoKmZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgeworICAgICAgaWYgKAorICAgICAgICAgICAgLy8gdXNlIGNhc2U6IGNhbGxiYWNrIGhhbmRsZXIKKyAgICAgICAgICAgICh0aWQgIT0gLTEpICYmCisgICAgICAgICAgICAvLyBmcmFtZSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyBleGFjdGx5IHRoZSBwaXBlIGRlcHRoCisgICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwgKGZyYW1lQ291bnQgPT0gbVBpcGVGcmFtZXNQMikpICYmCisgICAgICAgICAgICAvLyBQQ00gZGF0YQorICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCisgICAgICAgICAgICAvLyBuYXRpdmUgZm9ybWF0CisgICAgICAgICAgICAoZm9ybWF0ID09IG1Gb3JtYXQpICYmCisgICAgICAgICAgICAvLyBuYXRpdmUgY2hhbm5lbCBtYXNrCisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrKSAmJgorICAgICAgICAgICAgLy8gbmF0aXZlIGhhcmR3YXJlIHNhbXBsZSByYXRlCisgICAgICAgICAgICAoc2FtcGxlUmF0ZSA9PSBtU2FtcGxlUmF0ZSkgJiYKKyAgICAgICAgICAgIC8vIHJlY29yZCB0aHJlYWQgaGFzIGFuIGFzc29jaWF0ZWQgZmFzdCBjYXB0dXJlCisgICAgICAgICAgICBoYXNGYXN0Q2FwdHVyZSgpICYmCisgICAgICAgICAgICAvLyB0aGVyZSBhcmUgc3VmZmljaWVudCBmYXN0IHRyYWNrIHNsb3RzIGF2YWlsYWJsZQorICAgICAgICAgICAgbUZhc3RUcmFja0F2YWlsCisgICAgICAgICkgeworICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGFjY2VwdGVkOiBmcmFtZUNvdW50PSV1IG1GcmFtZUNvdW50PSV1IiwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZDogZnJhbWVDb3VudD0ldSBtRnJhbWVDb3VudD0ldSBtUGlwZUZyYW1lc1AyPSV1ICIKKyAgICAgICAgICAgICAgICAiZm9ybWF0PSUjeCBpc0xpbmVhcj0lZCBjaGFubmVsTWFzaz0lI3ggc2FtcGxlUmF0ZT0ldSBtU2FtcGxlUmF0ZT0ldSAiCisgICAgICAgICAgICAgICAgImhhc0Zhc3RDYXB0dXJlPSVkIHRpZD0lZCBtRmFzdFRyYWNrQXZhaWw9JWQiLAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50LCBtUGlwZUZyYW1lc1AyLAorICAgICAgICAgICAgICAgIGZvcm1hdCwgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCBjaGFubmVsTWFzaywgc2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgaGFzRmFzdENhcHR1cmUoKSwgdGlkLCBtRmFzdFRyYWNrQXZhaWwpOworICAgICAgICAqZmxhZ3MgJj0gfklBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CisgICAgICB9CisgICAgfQorCisgICAgLy8gY29tcHV0ZSB0cmFjayBidWZmZXIgc2l6ZSBpbiBmcmFtZXMsIGFuZCBzdWdnZXN0IHRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQKKyAgICBpZiAoKmZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgeworICAgICAgICAvLyBmYXN0IHRyYWNrOiBmcmFtZSBjb3VudCBpcyBleGFjdGx5IHRoZSBwaXBlIGRlcHRoCisgICAgICAgIGZyYW1lQ291bnQgPSBtUGlwZUZyYW1lc1AyOworICAgICAgICAvLyBpZ25vcmUgcmVxdWVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcywgYW5kIGFsd2F5cyBub3RpZnkgZXhhY3RseSBvbmNlIGV2ZXJ5IEhBTCBidWZmZXIKKyAgICAgICAgKm5vdGlmaWNhdGlvbkZyYW1lcyA9IG1GcmFtZUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG5vdCBmYXN0IHRyYWNrOiBtYXggbm90aWZpY2F0aW9uIHBlcmlvZCBpcyByZXNhbXBsZWQgZXF1aXZhbGVudCBvZiBvbmUgSEFMIGJ1ZmZlciB0aW1lCisgICAgICAgIC8vICAgICAgICAgICAgICAgICBvciAyMCBtcyBpZiB0aGVyZSBpcyBhIGZhc3QgY2FwdHVyZQorICAgICAgICAvLyBUT0RPIFRoaXMgY291bGQgYmUgYSByb3VuZHVwUmF0aW8gaW5saW5lLCBhbmQgY29uc3QKKyAgICAgICAgc2l6ZV90IG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9ICgoaW50NjRfdCkgKGhhc0Zhc3RDYXB0dXJlKCkgPyBtU2FtcGxlUmF0ZS81MCA6IG1GcmFtZUNvdW50KQorICAgICAgICAgICAgICAgICogc2FtcGxlUmF0ZSArIG1TYW1wbGVSYXRlIC0gMSkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgLy8gbWluaW11bSBudW1iZXIgb2Ygbm90aWZpY2F0aW9uIHBlcmlvZHMgaXMgYXQgbGVhc3Qga01pbk5vdGlmaWNhdGlvbnMsCisgICAgICAgIC8vIGFuZCBhdCBsZWFzdCBrTWluTXMgcm91bmRlZCB1cCB0byBhIHdob2xlIG5vdGlmaWNhdGlvbiBwZXJpb2QgKG1pbk5vdGlmaWNhdGlvbnNCeU1zKQorICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5Ob3RpZmljYXRpb25zID0gMzsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5NcyA9IDMwOworICAgICAgICAvLyBUT0RPIFRoaXMgY291bGQgYmUgYSByb3VuZHVwUmF0aW8gaW5saW5lCisgICAgICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZXNCeU1zID0gKHNhbXBsZVJhdGUgKiBrTWluTXMgKyAxMDAwIC0gMSkgLyAxMDAwOworICAgICAgICAvLyBUT0RPIFRoaXMgY291bGQgYmUgYSByb3VuZHVwUmF0aW8gaW5saW5lCisgICAgICAgIGNvbnN0IHNpemVfdCBtaW5Ob3RpZmljYXRpb25zQnlNcyA9IChtaW5GcmFtZXNCeU1zICsgbWF4Tm90aWZpY2F0aW9uRnJhbWVzIC0gMSkgLworICAgICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lczsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSBtYXhOb3RpZmljYXRpb25GcmFtZXMgKgorICAgICAgICAgICAgICAgIG1heChrTWluTm90aWZpY2F0aW9ucywgbWluTm90aWZpY2F0aW9uc0J5TXMpOworICAgICAgICBmcmFtZUNvdW50ID0gbWF4KGZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOworICAgICAgICBpZiAoKm5vdGlmaWNhdGlvbkZyYW1lcyA9PSAwIHx8ICpub3RpZmljYXRpb25GcmFtZXMgPiBtYXhOb3RpZmljYXRpb25GcmFtZXMpIHsKKyAgICAgICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBtYXhOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKwogICAgIGxTdGF0dXMgPSBpbml0Q2hlY2soKTsKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIGF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KLSAgICAvLyBjbGllbnQgZXhwcmVzc2VzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVCwgYnV0IHdlIGdldCB0aGUgZmluYWwgc2F5Ci0gICAgaWYgKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgIGlmICgKLSAgICAgICAgICAgIC8vIHVzZSBjYXNlOiBjYWxsYmFjayBoYW5kbGVyIGFuZCBmcmFtZSBjb3VudCBpcyBkZWZhdWx0IG9yIGF0IGxlYXN0IGFzIGxhcmdlIGFzIEhBTAotICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICh0aWQgIT0gLTEpICYmCi0gICAgICAgICAgICAgICAgKChmcmFtZUNvdW50ID09IDApIHx8Ci0gICAgICAgICAgICAgICAgKGZyYW1lQ291bnQgPj0gbUZyYW1lQ291bnQpKQotICAgICAgICAgICAgKSAmJgotICAgICAgICAgICAgLy8gRklYTUUgd2hlbiByZWNvcmQgc3VwcG9ydHMgbm9uLVBDTSBkYXRhLCBhbHNvIGNoZWNrIGZvciBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKLSAgICAgICAgICAgIC8vIG1vbm8gb3Igc3RlcmVvCi0gICAgICAgICAgICAoIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB8fAotICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSApICYmCi0gICAgICAgICAgICAvLyBoYXJkd2FyZSBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgKHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUpICYmCi0gICAgICAgICAgICAvLyByZWNvcmQgdGhyZWFkIGhhcyBhbiBhc3NvY2lhdGVkIGZhc3QgcmVjb3JkZXIKLSAgICAgICAgICAgIGhhc0Zhc3RSZWNvcmRlcigpCi0gICAgICAgICAgICAvLyBGSVhNRSB0ZXN0IHRoYXQgUmVjb3JkVGhyZWFkIGZvciB0aGlzIGZhc3QgdHJhY2sgaGFzIGEgY2FwYWJsZSBvdXRwdXQgSEFMCi0gICAgICAgICAgICAvLyBGSVhNRSBhZGQgYSBwZXJtaXNzaW9uIHRlc3QgYWxzbz8KLSAgICAgICAgKSB7Ci0gICAgICAgIC8vIGlmIGZyYW1lQ291bnQgbm90IHNwZWNpZmllZCwgdGhlbiBpdCBkZWZhdWx0cyB0byBmYXN0IHJlY29yZGVyIChIQUwpIGZyYW1lIGNvdW50Ci0gICAgICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCAqIGtGYXN0VHJhY2tNdWx0aXBsaWVyOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgYWNjZXB0ZWQ6IGZyYW1lQ291bnQ9JWQgbUZyYW1lQ291bnQ9JWQiLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkOiBmcmFtZUNvdW50PSVkICIKLSAgICAgICAgICAgICAgICAibUZyYW1lQ291bnQ9JWQgZm9ybWF0PSVkIGlzTGluZWFyPSVkIGNoYW5uZWxNYXNrPSUjeCBzYW1wbGVSYXRlPSV1IG1TYW1wbGVSYXRlPSV1ICIKLSAgICAgICAgICAgICAgICAiaGFzRmFzdFJlY29yZGVyPSVkIHRpZD0lZCIsCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYXNGYXN0UmVjb3JkZXIoKSwgdGlkKTsKLSAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwotICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEF1ZGlvUmVjb3JkIGNhbGN1bGF0aW9uLCBidWZmZXIgZGVwdGggaXMgZm9yY2VkCi0gICAgICAgIC8vIHRvIGJlIGF0IGxlYXN0IDIgeCB0aGUgcmVjb3JkIHRocmVhZCBmcmFtZSBjb3VudCBhbmQgY292ZXIgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeS4KLSAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSB0b28gY29uc2VydmF0aXZlLCBidXQgbGVnYWN5IGFwcGxpY2F0aW9uIGNvZGUgbWF5IGRlcGVuZCBvbiBpdC4KLSAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNhbGN1bGF0aW9uLCBhbHNvIHJldmlldyB0aGUgc3RhcnQgdGhyZXNob2xkIHdoaWNoIGlzIHJlbGF0ZWQuCi0gICAgICAgIHVpbnQzMl90IGxhdGVuY3lNcyA9IDUwOyAvLyBGSVhNRSBtSW5wdXQtPnN0cmVhbS0+Z2V0X2xhdGVuY3kobUlucHV0LT5zdHJlYW0pOwotICAgICAgICBzaXplX3QgbU5vcm1hbEZyYW1lQ291bnQgPSAyMDQ4OyAvLyBGSVhNRQotICAgICAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGxhdGVuY3lNcyAvICgoMTAwMCAqIG1Ob3JtYWxGcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDwgMikgewotICAgICAgICAgICAgbWluQnVmQ291bnQgPSAyOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtaW5CdWZDb3VudDsKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIEZJWE1FIHVzZSBmbGFncyBhbmQgdGlkIHNpbWlsYXIgdG8gY3JlYXRlVHJhY2tfbCgpCiAKICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgICAgIHRyYWNrID0gbmV3IFJlY29yZFRyYWNrKHRoaXMsIGNsaWVudCwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzZXNzaW9uSWQsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2Vzc2lvbklkLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCk7CiAKLSAgICAgICAgaWYgKHRyYWNrLT5nZXRDYmxrKCkgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBubyBjb250cm9sIGJsb2NrIik7Ci0gICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOworICAgICAgICBsU3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOworICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBpbml0Q2hlY2sgZmFpbGVkICVkOyBubyBjb250cm9sIGJsb2NrPyIsIGxTdGF0dXMpOwogICAgICAgICAgICAgLy8gdHJhY2sgbXVzdCBiZSBjbGVhcmVkIGZyb20gdGhlIGNhbGxlciBhcyB0aGUgY2FsbGVyIGhhcyB0aGUgQUYgbG9jawogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CkBAIC00NzYzLDEyICs1NjQzLDExIEBACiAgICAgICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50X2woY2FsbGluZ1BpZCwgdGlkLCBrUHJpb3JpdHlBdWRpb0FwcCk7CiAgICAgICAgIH0KICAgICB9CisKICAgICBsU3RhdHVzID0gTk9fRVJST1I7CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICB9CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrOwogfQogCkBAIC00NzgxLDgyICs1NjYwLDg2IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKICAgICBpZiAoZXZlbnQgPT0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSkgewotICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgfSBlbHNlIGlmIChldmVudCAhPSBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9TQU1FKSB7Ci0gICAgICAgIG1TeW5jU3RhcnRFdmVudCA9IG1BdWRpb0ZsaW5nZXItPmNyZWF0ZVN5bmNFdmVudChldmVudCwKKyAgICAgICAgcmVjb3JkVHJhY2stPm1TeW5jU3RhcnRFdmVudCA9IG1BdWRpb0ZsaW5nZXItPmNyZWF0ZVN5bmNFdmVudChldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPnNlc3Npb25JZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY1N0YXJ0RXZlbnRDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2spOwogICAgICAgICAvLyBTeW5jIGV2ZW50IGNhbiBiZSBjYW5jZWxsZWQgYnkgdGhlIHRyaWdnZXIgc2Vzc2lvbiBpZiB0aGUgdHJhY2sgaXMgbm90IGluIGEKICAgICAgICAgLy8gY29tcGF0aWJsZSBzdGF0ZSBpbiB3aGljaCBjYXNlIHdlIHN0YXJ0IHJlY29yZCBpbW1lZGlhdGVseQotICAgICAgICBpZiAobVN5bmNTdGFydEV2ZW50LT5pc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN5bmNTdGFydEV2ZW50LT5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIHRoZSBldmVudCBmb3IgbW9yZSB0aGFuIEF1ZGlvU3lzdGVtOjprU3luY1JlY29yZFN0YXJ0VGltZU91dE1zCi0gICAgICAgICAgICBtRnJhbWVzdG9Ecm9wID0gLSAoKEF1ZGlvU3lzdGVtOjprU3luY1JlY29yZFN0YXJ0VGltZU91dE1zICogbVJlcVNhbXBsZVJhdGUpIC8gMTAwMCk7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+bUZyYW1lc1RvRHJvcCA9IC0KKyAgICAgICAgICAgICAgICAgICAgKChBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcyAqIHJlY29yZFRyYWNrLT5tU2FtcGxlUmF0ZSkgLyAxMDAwKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHsKKyAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIGEgcmVuZGV6dm91cyBiZXR3ZWVuIGJpbmRlciB0aHJlYWQgZXhlY3V0aW5nIHN0YXJ0KCkgYW5kIFJlY29yZFRocmVhZAogICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrICE9IG1BY3RpdmVUcmFjay5nZXQoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FQlVTWTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPj0gMCkgeworICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImFjdGl2ZSByZWNvcmQgdHJhY2sgUEFVU0lORyAtPiBBQ1RJVkUiKTsKKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIHN0YXRlICVkIiwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKLSAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6SURMRTsKLSAgICAgICAgbUFjdGl2ZVRyYWNrID0gcmVjb3JkVHJhY2s7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChtSWQpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgLy8gVE9ETyBjb25zaWRlciBvdGhlciB3YXlzIG9mIGhhbmRsaW5nIHRoaXMsIHN1Y2ggYXMgY2hhbmdpbmcgdGhlIHN0YXRlIHRvIDpTVEFSVElORyBhbmQKKyAgICAgICAgLy8gICAgICBhZGRpbmcgdGhlIHRyYWNrIHRvIG1BY3RpdmVUcmFja3MgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoKSwKKyAgICAgICAgLy8gICAgICBvciB1c2luZyBhIHNlcGFyYXRlIGNvbW1hbmQgdGhyZWFkCisgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzE7CisgICAgICAgIG1BY3RpdmVUcmFja3MuYWRkKHJlY29yZFRyYWNrKTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChtSWQsIChhdWRpb19zZXNzaW9uX3QpcmVjb3JkVHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCB2ZXJpZnkgdGhhdCByZWNvcmRUcmFjayBpcyBzdGlsbCBpbiBtQWN0aXZlVHJhY2tzCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUocmVjb3JkVHJhY2spOworICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0YXJ0IGVycm9yICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1Sc21wSW5JbmRleCA9IG1GcmFtZUNvdW50OwotICAgICAgICBtQnl0ZXNSZWFkID0gMDsKLSAgICAgICAgaWYgKG1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVJlc2FtcGxlci0+cmVzZXQoKTsKKyAgICAgICAgLy8gQ2F0Y2ggdXAgd2l0aCBjdXJyZW50IGJ1ZmZlciBpbmRpY2VzIGlmIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcuCisgICAgICAgIC8vIFRoaXMgaXMgd2hhdCBtYWtlcyBhIG5ldyBjbGllbnQgZGlzY2FyZCBhbGwgYnVmZmVyZWQgZGF0YS4gIElmIHRoZSB0cmFjaydzIG1Sc21wSW5Gcm9udAorICAgICAgICAvLyB3YXMgaW5pdGlhbGl6ZWQgdG8gc29tZSB2YWx1ZSBjbG9zZXIgdG8gdGhlIHRocmVhZCdzIG1Sc21wSW5Gcm9udCwgdGhlbiB0aGUgdHJhY2sgY291bGQKKyAgICAgICAgLy8gc2VlIHByZXZpb3VzbHkgYnVmZmVyZWQgZGF0YSBiZWZvcmUgaXQgY2FsbGVkIHN0YXJ0KCksIGJ1dCB3aXRoIGdyZWF0ZXIgcmlzayBvZiBvdmVycnVuLgorCisgICAgICAgIHJlY29yZFRyYWNrLT5tUnNtcEluRnJvbnQgPSBtUnNtcEluUmVhcjsKKyAgICAgICAgcmVjb3JkVHJhY2stPm1Sc21wSW5VbnJlbCA9IDA7CisgICAgICAgIC8vIEZJWE1FIHdoeSByZXNldD8KKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tUmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tUmVzYW1wbGVyLT5yZXNldCgpOwogICAgICAgICB9Ci0gICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpSRVNVTUlORzsKKyAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKICAgICAgICAgLy8gc2lnbmFsIHRocmVhZCB0byBzdGFydAotICAgICAgICBBTE9HVigiU2lnbmFsIHJlY29yZCB0aHJlYWQiKTsKICAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7Ci0gICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCi0gICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgZ290byBzdGFydEVycm9yOwotICAgICAgICB9Ci0gICAgICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrID09IDApIHsKKyAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwKSB7CiAgICAgICAgICAgICBBTE9HVigiUmVjb3JkIGZhaWxlZCB0byBzdGFydCIpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBzdGFydEVycm9yOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJSZWNvcmQgc3RhcnRlZCBPSyIpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogc3RhcnRFcnJvcjoKLSAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1JZCk7Ci0gICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNsZWFyU3luY1N0YXJ0RXZlbnQoKQotewotICAgIGlmIChtU3luY1N0YXJ0RXZlbnQgIT0gMCkgewotICAgICAgICBtU3luY1N0YXJ0RXZlbnQtPmNhbmNlbCgpOworICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtSWQsIChhdWRpb19zZXNzaW9uX3QpcmVjb3JkVHJhY2stPnNlc3Npb25JZCgpKTsKICAgICB9Ci0gICAgbVN5bmNTdGFydEV2ZW50LmNsZWFyKCk7Ci0gICAgbUZyYW1lc3RvRHJvcCA9IDA7CisgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAvLyBGSVhNRSBJIHdvbmRlciB3aHkgd2UgZG8gbm90IHJlc2V0IHRoZSBzdGF0ZSBoZXJlPworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN5bmNTdGFydEV2ZW50Q2FsbGJhY2soY29uc3Qgd3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC00ODY0LDQ2ICs1NzQ3LDQyIEBACiAgICAgc3A8U3luY0V2ZW50PiBzdHJvbmdFdmVudCA9IGV2ZW50LnByb21vdGUoKTsKIAogICAgIGlmIChzdHJvbmdFdmVudCAhPSAwKSB7Ci0gICAgICAgIFJlY29yZFRocmVhZCAqbWUgPSAoUmVjb3JkVGhyZWFkICopc3Ryb25nRXZlbnQtPmNvb2tpZSgpOwotICAgICAgICBtZS0+aGFuZGxlU3luY1N0YXJ0RXZlbnQoc3Ryb25nRXZlbnQpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCi17Ci0gICAgaWYgKGV2ZW50ID09IG1TeW5jU3RhcnRFdmVudCkgewotICAgICAgICAvLyBUT0RPOiB1c2UgYWN0dWFsIGJ1ZmZlciBmaWxsaW5nIHN0YXR1cyBpbnN0ZWFkIG9mIDIgYnVmZmVycyB3aGVuIGluZm8gaXMgYXZhaWxhYmxlCi0gICAgICAgIC8vIGZyb20gYXVkaW8gSEFMCi0gICAgICAgIG1GcmFtZXN0b0Ryb3AgPSBtRnJhbWVDb3VudCAqIDI7CisgICAgICAgIHNwPFJlZkJhc2U+IHB0ciA9IHN0cm9uZ0V2ZW50LT5jb29raWUoKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChwdHIgIT0gMCkgeworICAgICAgICAgICAgUmVjb3JkVHJhY2sgKnJlY29yZFRyYWNrID0gKFJlY29yZFRyYWNrICopcHRyLmdldCgpOworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmhhbmRsZVN5bmNTdGFydEV2ZW50KHN0cm9uZ0V2ZW50KTsKKyAgICAgICAgfQogICAgIH0KIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RvcChSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgewogICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0b3AiKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIGlmIChyZWNvcmRUcmFjayAhPSBtQWN0aXZlVHJhY2suZ2V0KCkgfHwgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSAhPSAwIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgLy8gbm90ZSB0aGF0IHRocmVhZExvb3AgbWF5IHN0aWxsIGJlIHByb2Nlc3NpbmcgdGhlIHRyYWNrIGF0IHRoaXMgcG9pbnQgW3dpdGhvdXQgbG9ja10KICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTSU5HOwogICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCiAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorICAgIC8vIEZJWE1FIGluY29ycmVjdCB1c2FnZSBvZiB3YWl0OiBubyBleHBsaWNpdCBwcmVkaWNhdGUgb3IgbG9vcAogICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwotICAgIC8vIGlmIHdlIGhhdmUgYmVlbiByZXN0YXJ0ZWQsIHJlY29yZFRyYWNrID09IG1BY3RpdmVUcmFjay5nZXQoKSBoZXJlCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkgfHwgcmVjb3JkVHJhY2sgIT0gbUFjdGl2ZVRyYWNrLmdldCgpKSB7CisgICAgLy8gaWYgd2UgaGF2ZSBiZWVuIHJlc3RhcnRlZCwgcmVjb3JkVHJhY2sgaXMgaW4gbUFjdGl2ZVRyYWNrcyBoZXJlCisgICAgaWYgKGV4aXRQZW5kaW5nKCkgfHwgbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSAhPSAwKSB7CiAgICAgICAgIEFMT0dWKCJSZWNvcmQgc3RvcHBlZCBPSyIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdAorYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCBfX3VudXNlZCkgY29uc3QKIHsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50IF9fdW51c2VkKQogewogI2lmIDAgICAvLyBUaGlzIGJyYW5jaCBpcyBjdXJyZW50bHkgZGVhZCBjb2RlLCBidXQgaXMgcHJlc2VydmVkIGluIGNhc2UgaXQgd2lsbCBiZSBuZWVkZWQgaW4gZnV0dXJlCiAgICAgaWYgKCFpc1ZhbGlkU3luY0V2ZW50KGV2ZW50KSkgewpAQCAtNDkzNCw3ICs1ODEzLDcgQEAKICAgICB0cmFjay0+dGVybWluYXRlKCk7CiAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKICAgICAvLyBhY3RpdmUgdHJhY2tzIGFyZSByZW1vdmVkIGJ5IHRocmVhZExvb3AoKQotICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gdHJhY2spIHsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CiAgICAgfQogfQpAQCAtNDk0Myw2ICs1ODIyLDEwIEBACiB7CiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIC8vIG5lZWQgYW55dGhpbmcgcmVsYXRlZCB0byBlZmZlY3RzIGhlcmU/CisgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKCFtRmFzdFRyYWNrQXZhaWwpOworICAgICAgICBtRmFzdFRyYWNrQXZhaWwgPSB0cnVlOworICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC00OTU0LDIxNyArNTgzNywyMzYgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7CisgICAgZHByaW50ZihmZCwgIlxuSW5wdXQgdGhyZWFkICVwOlxuIiwgdGhpcyk7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0IHRocmVhZCAlcCBpbnRlcm5hbHNcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJJbiBpbmRleDogJWRcbiIsIG1Sc21wSW5JbmRleCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQnVmZmVyIHNpemU6ICV1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVzYW1wbGluZzogJWRcbiIsIChtUmVzYW1wbGVyICE9IE5VTEwpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXQgY2hhbm5lbCBjb3VudDogJXVcbiIsIG1SZXFDaGFubmVsQ291bnQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dCBzYW1wbGUgcmF0ZTogJXVcbiIsIG1SZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgQnVmZmVyIHNpemU6ICV6dSBieXRlc1xuIiwgbUJ1ZmZlclNpemUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk5vIGFjdGl2ZSByZWNvcmQgY2xpZW50XG4iKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIHJlY29yZCBjbGllbnRzXG4iKTsKICAgICB9Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0IGNhcHR1cmUgdGhyZWFkOiAlc1xuIiwgaGFzRmFzdENhcHR1cmUoKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbGFibGU6ICVzXG4iLCBtRmFzdFRyYWNrQXZhaWwgPyAieWVzIiA6ICJubyIpOwogCiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSW5wdXQgdGhyZWFkICVwIHRyYWNrc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgIGlmICh0cmFjayAhPSAwKSB7Ci0gICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOworICAgIGRwcmludGYoZmQsICIgICVkIFRyYWNrcyIsIG51bXRyYWNrcyk7CisgICAgaWYgKG51bXRyYWNrcykgeworICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICVkIGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CisgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSA9IG1BY3RpdmVUcmFja3MuaW5kZXhPZih0cmFjaykgPj0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRwcmludGYoZmQsICJcbiIpOwogICAgIH0KIAotICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0IHRocmVhZCAlcCBhY3RpdmUgdHJhY2tzXG4iLCB0aGlzKTsKKyAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKLSAgICAgICAgbUFjdGl2ZVRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgeworICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICB9CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyBfX3VudXNlZCkKIHsKLSAgICBzaXplX3QgZnJhbWVzUmVxID0gYnVmZmVyLT5mcmFtZUNvdW50OwotICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IG1GcmFtZUNvdW50IC0gbVJzbXBJbkluZGV4OwotICAgIGludCBjaGFubmVsQ291bnQ7Ci0KLSAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewotICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sIG1Sc21wSW5CdWZmZXIsIG1CdWZmZXJTaXplKTsKLSAgICAgICAgaWYgKG1CeXRlc1JlYWQgPD0gMCkgewotICAgICAgICAgICAgaWYgKChtQnl0ZXNSZWFkIDwgMCkgJiYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWNvcmRUaHJlYWQ6OmdldE5leHRCdWZmZXIoKSBFcnJvciByZWFkaW5nIGF1ZGlvIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8KLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGF0IG5leHQgcmVhZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICB9Ci0gICAgICAgIG1Sc21wSW5JbmRleCA9IDA7Ci0gICAgICAgIGZyYW1lc1JlYWR5ID0gbUZyYW1lQ291bnQ7CisgICAgUmVjb3JkVHJhY2sgKmFjdGl2ZVRyYWNrID0gbVJlY29yZFRyYWNrOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBhY3RpdmVUcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZEJhc2UgPT0gMCkgeworICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOworICAgIGludDMyX3QgcmVhciA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CisgICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBiZSBQMiAoZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSBsYXRlbmN5KQorICAgIC8vIEZJWE1FIGlmIGNsaWVudCBub3Qga2VlcGluZyB1cCwgZGlzY2FyZAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzKSk7CisgICAgLy8gJ2ZpbGxlZCcgbWF5IGJlIG5vbi1jb250aWd1b3VzLCBzbyByZXR1cm4gb25seSB0aGUgZmlyc3QgY29udGlndW91cyBjaHVuaworICAgIGZyb250ICY9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lc1AyIC0gMTsKKyAgICBzaXplX3QgcGFydDEgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXNQMiAtIGZyb250OworICAgIGlmIChwYXJ0MSA+IChzaXplX3QpIGZpbGxlZCkgeworICAgICAgICBwYXJ0MSA9IGZpbGxlZDsKKyAgICB9CisgICAgc2l6ZV90IGFzayA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBBTE9HX0FTU0VSVChhc2sgPiAwKTsKKyAgICBpZiAocGFydDEgPiBhc2spIHsKKyAgICAgICAgcGFydDEgPSBhc2s7CisgICAgfQorICAgIGlmIChwYXJ0MSA9PSAwKSB7CisgICAgICAgIC8vIEhpZ2hlci1sZXZlbCBzaG91bGQga2VlcCBtUnNtcEluQnVmZmVyIGZ1bGwsIGFuZCBub3QgY2FsbCByZXNhbXBsZXIgaWYgZW1wdHkKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiUmVjb3JkVGhyZWFkOjpnZXROZXh0QnVmZmVyKCkgc3RhcnZlZCIpOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIGlmIChmcmFtZXNSZXEgPiBmcmFtZXNSZWFkeSkgewotICAgICAgICBmcmFtZXNSZXEgPSBmcmFtZXNSZWFkeTsKLSAgICB9Ci0KLSAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMikgewotICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYW5uZWxDb3VudCA9IDI7Ci0gICAgfQotICAgIGJ1ZmZlci0+cmF3ID0gbVJzbXBJbkJ1ZmZlciArIG1Sc21wSW5JbmRleCAqIGNoYW5uZWxDb3VudDsKLSAgICBidWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNSZXE7CisgICAgYnVmZmVyLT5yYXcgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5CdWZmZXIgKyBmcm9udCAqIHJlY29yZFRocmVhZC0+bUNoYW5uZWxDb3VudDsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBwYXJ0MTsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsID0gcGFydDE7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBtUnNtcEluSW5kZXggKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIFJlY29yZFRyYWNrICphY3RpdmVUcmFjayA9IG1SZWNvcmRUcmFjazsKKyAgICBzaXplX3Qgc3RlcENvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIGlmIChzdGVwQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dfQVNTRVJUKHN0ZXBDb3VudCA8PSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsKTsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsIC09IHN0ZXBDb3VudDsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ICs9IHN0ZXBDb3VudDsKKyAgICBidWZmZXItPnJhdyA9IE5VTEw7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwogCi0gICAgd2hpbGUgKCFtTmV3UGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlyID0gbU5ld1BhcmFtZXRlcnNbMF07Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKLSAgICAgICAgaW50IHZhbHVlOwotICAgICAgICBhdWRpb19mb3JtYXRfdCByZXFGb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICB1aW50MzJfdCByZXFTYW1wbGluZ1JhdGUgPSBtUmVxU2FtcGxlUmF0ZTsKLSAgICAgICAgdWludDMyX3QgcmVxQ2hhbm5lbENvdW50ID0gbVJlcUNoYW5uZWxDb3VudDsKKyAgICBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcmVxU2FtcGxpbmdSYXRlID0gdmFsdWU7CisgICAgYXVkaW9fZm9ybWF0X3QgcmVxRm9ybWF0ID0gbUZvcm1hdDsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KG1DaGFubmVsQ291bnQpOworCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOworICAgIGludCB2YWx1ZTsKKyAgICAvLyBUT0RPIEludmVzdGlnYXRlIHdoZW4gdGhpcyBjb2RlIHJ1bnMuIENoZWNrIHdpdGggYXVkaW8gcG9saWN5IHdoZW4gYSBzYW1wbGUgcmF0ZSBhbmQKKyAgICAvLyAgICAgIGNoYW5uZWwgY291bnQgY2hhbmdlIGNhbiBiZSByZXF1ZXN0ZWQuIERvIHdlIG1hbmRhdGUgdGhlIGZpcnN0IGNsaWVudCBkZWZpbmVzIHRoZQorICAgIC8vICAgICAgSEFMIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgY291bnQgb3IgZG8gd2UgYWxsb3cgY2hhbmdlcyBvbiB0aGUgZmx5PworICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHZhbHVlOworICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmICgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXFGb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHZhbHVlOwogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVxRm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZTsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcmVxQ2hhbm5lbENvdW50ID0gcG9wY291bnQodmFsdWUpOworICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHZhbHVlOworICAgICAgICBpZiAobWFzayAhPSBBVURJT19DSEFOTkVMX0lOX01PTk8gJiYgbWFzayAhPSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykgeworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtYXNrOwogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKLSAgICAgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBndWFyYW50ZWVkCisgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KKyAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbCh2YWx1ZSk7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbCh2YWx1ZSk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gc3RvcmUgaW5wdXQgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlIGJ1dCBkbyBub3QgZm9yd2FyZCBvdXRwdXQgZGV2aWNlIHRvIGF1ZGlvIEhBTC4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBzdGF0dXMgaXMgaWdub3JlZCBieSB0aGUgY2FsbGVyIGZvciBvdXRwdXQgZGV2aWNlCi0gICAgICAgICAgICAvLyAoc2VlIEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycygpCi0gICAgICAgICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZXModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUluRGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCi0gICAgICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmdzCi0gICAgICAgICAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9OUywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBzdG9yZSBpbnB1dCBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UgYnV0IGRvIG5vdCBmb3J3YXJkIG91dHB1dCBkZXZpY2UgdG8gYXVkaW8gSEFMLgorICAgICAgICAvLyBOb3RlIHRoYXQgc3RhdHVzIGlzIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBmb3Igb3V0cHV0IGRldmljZQorICAgICAgICAvLyAoc2VlIEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycygpCisgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbkRldmljZSA9IHZhbHVlOworICAgICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCisgICAgICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKKyAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5idE5yZWNJc09mZigpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfQUVDLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfTlMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCB2YWx1ZSkgPT0gTk9fRVJST1IgJiYKLSAgICAgICAgICAgICAgICBtQXVkaW9Tb3VyY2UgIT0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlKSB7Ci0gICAgICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRBdWRpb1NvdXJjZV9sKChhdWRpb19zb3VyY2VfdCl2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpdmFsdWU7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCB2YWx1ZSkgPT0gTk9fRVJST1IgJiYKKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZSAhPSAoYXVkaW9fc291cmNlX3QpdmFsdWUpIHsKKyAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0QXVkaW9Tb3VyY2VfbCgoYXVkaW9fc291cmNlX3QpdmFsdWUpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICBpbnB1dFN0YW5kQnkoKTsKICAgICAgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlY29uZmlnKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSAmJgorICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9PSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pICYmCisgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCisgICAgICAgICAgICAgICAgKG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgPD0gKDIgKiBzYW1wbGluZ1JhdGUpKSAmJgorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pKSA8PSBGQ0NfMiAmJgorICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCi0gICAgICAgICAgICAgICAgICAgIChtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAoMiAqIHJlcVNhbXBsaW5nUmF0ZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHBvcGNvdW50KG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBGQ0NfMiAmJgotICAgICAgICAgICAgICAgICAgICAocmVxQ2hhbm5lbENvdW50IDw9IEZDQ18yKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CisgICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgbU5ld1BhcmFtZXRlcnMucmVtb3ZlQXQoMCk7Ci0KLSAgICAgICAgbVBhcmFtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtUGFyYW1Db25kLnNpZ25hbCgpOwotICAgICAgICAvLyB3YWl0IGZvciBjb25kaXRpb24gd2l0aCB0aW1lIG91dCBpbiBjYXNlIHRoZSB0aHJlYWQgY2FsbGluZyBUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgLy8gYWxyZWFkeSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgdGhlIHN0YXR1cyBhbmQgd2lsbCBuZXZlciBzaWduYWwgdGhlIGNvbmRpdGlvbi4KLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyk7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlY29uZmlnOwogfQogCkBAIC01MTgxLDkgKzYwODMsOSBAQAogICAgIHJldHVybiBvdXRfczg7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtKSB7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gX191bnVzZWQpIHsKICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwotICAgIHZvaWQgKnBhcmFtMiA9IE5VTEw7CisgICAgY29uc3Qgdm9pZCAqcGFyYW0yID0gTlVMTDsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQ6CkBAIC01MjAwLDU2ICs2MTAyLDQ3IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKIHsKLSAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOwotICAgIC8vIG1Sc21wSW5CdWZmZXIgaXMgYWx3YXlzIGFzc2lnbmVkIGEgbmV3W10gYmVsb3cKLSAgICBkZWxldGVbXSBtUnNtcE91dEJ1ZmZlcjsKLSAgICBtUnNtcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0KICAgICBtU2FtcGxlUmF0ZSA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtQ2hhbm5lbE1hc2sgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1DaGFubmVsTWFzayk7Ci0gICAgbUZvcm1hdCA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgbUhBTEZvcm1hdCA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7CiAgICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoIkhBTCBmb3JtYXQgJWQgbm90IHN1cHBvcnRlZDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsIG1Gb3JtYXQpOworICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsIG1Gb3JtYXQpOwogICAgIH0KLSAgICBtRnJhbWVTaXplID0gYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtSW5wdXQtPnN0cmVhbSk7CiAgICAgbUJ1ZmZlclNpemUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUZyYW1lQ291bnQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90W21GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudF07CisgICAgLy8gVGhpcyBpcyB0aGUgZm9ybXVsYSBmb3IgY2FsY3VsYXRpbmcgdGhlIHRlbXBvcmFyeSBidWZmZXIgc2l6ZS4KKyAgICAvLyBXaXRoIDcgSEFMIGJ1ZmZlcnMsIHdlIGNhbiBndWFyYW50ZWUgYWJpbGl0eSB0byBkb3duLXNhbXBsZSB0aGUgaW5wdXQgYnkgcmF0aW8gb2YgNjoxIHRvCisgICAgLy8gMSBmdWxsIG91dHB1dCBidWZmZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsaWdubWVudCBvZiB0aGUgYXZhaWxhYmxlIGlucHV0LgorICAgIC8vIFRoZSB2YWx1ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGxhcmdlci4KKyAgICAvLyBBIGxhcmdlciB2YWx1ZSBzaG91bGQgYWxsb3cgbW9yZSBvbGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIGEgdHJhY2sgY2FsbHMgc3RhcnQoKSwKKyAgICAvLyB3aXRob3V0IGluY3JlYXNpbmcgbGF0ZW5jeS4KKyAgICBtUnNtcEluRnJhbWVzID0gbUZyYW1lQ291bnQgKiA3OworICAgIG1Sc21wSW5GcmFtZXNQMiA9IHJvdW5kdXAobVJzbXBJbkZyYW1lcyk7CisgICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKIAotICAgIGlmIChtU2FtcGxlUmF0ZSAhPSBtUmVxU2FtcGxlUmF0ZSAmJiBtQ2hhbm5lbENvdW50IDw9IEZDQ18yICYmIG1SZXFDaGFubmVsQ291bnQgPD0gRkNDXzIpCi0gICAgewotICAgICAgICBpbnQgY2hhbm5lbENvdW50OwotICAgICAgICAvLyBvcHRpbWl6YXRpb246IGlmIG1vbm8gdG8gbW9ubywgdXNlIHRoZSByZXNhbXBsZXIgaW4gc3RlcmVvIHRvIHN0ZXJlbyBtb2RlIHRvIGF2b2lkCi0gICAgICAgIC8vIHN0ZXJlbyB0byBtb25vIHBvc3QgcHJvY2VzcyBhcyB0aGUgcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlby4KLSAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFubmVsQ291bnQgPSAyOwotICAgICAgICB9Ci0gICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKDE2LCBjaGFubmVsQ291bnQsIG1SZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb01peGVyOjpVTklUWV9HQUlOLCBBdWRpb01peGVyOjpVTklUWV9HQUlOKTsKLSAgICAgICAgbVJzbXBPdXRCdWZmZXIgPSBuZXcgaW50MzJfdFttRnJhbWVDb3VudCAqIEZDQ18yXTsKKyAgICAvLyBUT0RPIG9wdGltaXplIGF1ZGlvIGNhcHR1cmUgYnVmZmVyIHNpemVzIC4uLgorICAgIC8vIEhlcmUgd2UgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzbGlkaW5nIGJ1ZmZlciB1c2VkIGFzIGEgc291cmNlCisgICAgLy8gZm9yIHJlc2FtcGxpbmcuICBtUnNtcEluRnJhbWVzUDIgaXMgY3VycmVudGx5IHJvdW5kdXAobUZyYW1lQ291bnQgKiA3KS4KKyAgICAvLyBGb3IgY3VycmVudCBIQUwgZnJhbWUgY291bnRzLCB0aGlzIGlzIHVzdWFsbHkgMjA0OCA9IDQwIG1zLiAgSXQgd291bGQKKyAgICAvLyBiZSBiZXR0ZXIgdG8gaGF2ZSBpdCBkZXJpdmVkIGZyb20gdGhlIHBpcGUgZGVwdGggaW4gdGhlIGxvbmcgdGVybS4KKyAgICAvLyBUaGUgY3VycmVudCB2YWx1ZSBpcyBoaWdoZXIgdGhhbiBuZWNlc3NhcnkuICBIb3dldmVyIGl0IHNob3VsZCBub3QgYWRkIHRvIGxhdGVuY3kuCiAKLSAgICAgICAgLy8gb3B0bWl6YXRpb246IGlmIG1vbm8gdG8gbW9ubywgYWx0ZXIgaW5wdXQgZnJhbWUgY291bnQgYXMgaWYgd2Ugd2VyZSBpbnB1dGluZwotICAgICAgICAvLyBzdGVyZW8gc2FtcGxlcwotICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgbUZyYW1lQ291bnQgPj49IDE7Ci0gICAgICAgIH0KKyAgICAvLyBPdmVyLWFsbG9jYXRlIGJleW9uZCBtUnNtcEluRnJhbWVzUDIgdG8gcGVybWl0IGEgSEFMIHJlYWQgcGFzdCBlbmQgb2YgYnVmZmVyCisgICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90WyhtUnNtcEluRnJhbWVzUDIgKyBtRnJhbWVDb3VudCAtIDEpICogbUNoYW5uZWxDb3VudF07CiAKLSAgICB9Ci0gICAgbVJzbXBJbkluZGV4ID0gbUZyYW1lQ291bnQ7CisgICAgLy8gQXVkaW9SZWNvcmQgbVNhbXBsZVJhdGUgYW5kIG1DaGFubmVsQ291bnQgYXJlIGNvbnN0YW50IGR1ZSB0byBBdWRpb1JlY29yZCBBUEkgY29uc3RyYWludHMuCisgICAgLy8gQnV0IGlmIHRocmVhZCdzIG1TYW1wbGVSYXRlIG9yIG1DaGFubmVsQ291bnQgY2hhbmdlcywgaG93IHdpbGwgdGhhdCBhZmZlY3QgYWN0aXZlIHRyYWNrcz8KIH0KIAotdW5zaWduZWQgaW50IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKQordWludDMyX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldElucHV0RnJhbWVzTG9zdCgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAoaW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKQEAgLTUzMTIsMTUgKzYyMDUsMjAgQEAKIHsKICAgICAvLyBvbmx5IG9uZSBjaGFpbiBwZXIgaW5wdXQgdGhyZWFkCiAgICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgQUxPR1coImFkZEVmZmVjdENoYWluX2woKSBhbHJlYWR5IG9uZSBjaGFpbiAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7Ci0KKyAgICBjaGFpbi0+c2V0VGhyZWFkKHRoaXMpOwogICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihOVUxMKTsKICAgICBjaGFpbi0+c2V0T3V0QnVmZmVyKE5VTEwpOwogCiAgICAgY2hlY2tTdXNwZW5kT25BZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKIAorICAgIC8vIG1ha2Ugc3VyZSBlbmFibGVkIHByZSBwcm9jZXNzaW5nIGVmZmVjdHMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIHRoZSBIQUwgYXMgd2UKKyAgICAvLyBqdXN0IG1vdmVkIHRoZW0gdG8gYSBuZXcgaW5wdXQgc3RyZWFtLgorICAgIGNoYWluLT5zeW5jSGFsRWZmZWN0c1N0YXRlKCk7CisKICAgICBtRWZmZWN0Q2hhaW5zLmFkZChjaGFpbik7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01MzM4LDQgKzYyMzYsODAgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtSW5EZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCisgICAgICAgIC8vIHByZSBwcm9jZXNzaW5ncworICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPmJ0TnJlY0lzT2ZmKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9BRUMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX05TLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc3RvcmUgbmV3IHNvdXJjZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UpIHsKKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZSA9IHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0QXVkaW9Tb3VyY2VfbChtQXVkaW9Tb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInJlbGVhc2VBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1UcmFja3MuYWRkKHJlY29yZCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZGVzdHJveVRyYWNrX2wocmVjb3JkKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOworICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1BdWRpb1NvdXJjZTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IGJiOTJkZjEuLmVjYjhlNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtMzYsNiArMzYsOCBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRocmVhZEJhc2UoKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOworCiAgICAgdm9pZCBkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgZHVtcEVmZmVjdENoYWlucyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC00NCw2MCArNDYsMTY5IEBACiAgICAgLy8gYmFzZSBmb3IgcmVjb3JkIGFuZCBwbGF5YmFjawogICAgIGVudW0gewogICAgICAgICBDRkdfRVZFTlRfSU8sCi0gICAgICAgIENGR19FVkVOVF9QUklPCisgICAgICAgIENGR19FVkVOVF9QUklPLAorICAgICAgICBDRkdfRVZFTlRfU0VUX1BBUkFNRVRFUiwKKyAgICAgICAgQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSCwKKyAgICAgICAgQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0gsCiAgICAgfTsKIAotICAgIGNsYXNzIENvbmZpZ0V2ZW50IHsKKyAgICBjbGFzcyBDb25maWdFdmVudERhdGE6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlKSA6IG1UeXBlKHR5cGUpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkNvbmZpZ0V2ZW50KCkge30KLQotICAgICAgICAgICAgICAgICBpbnQgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CisgICAgICAgIHZpcnR1YWwgfkNvbmZpZ0V2ZW50RGF0YSgpIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IGludCBtVHlwZTsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIENvbmZpZ0V2ZW50RGF0YSgpIHt9CiAgICAgfTsKIAotICAgIGNsYXNzIElvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSkgOgotICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX0lPKSwgbUV2ZW50KGV2ZW50KSwgbVBhcmFtKGV2ZW50KSB7fQotICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KKyAgICAvLyBDb25maWcgZXZlbnQgc2VxdWVuY2UgYnkgY2xpZW50IGlmIHN0YXR1cyBuZWVkZWQgKGUuZyBiaW5kZXIgdGhyZWFkIGNhbGxpbmcgc2V0UGFyYW1ldGVycygpKToKKyAgICAvLyAgMS4gY3JlYXRlIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50LiBUaGlzIHNldHMgbVdhaXRTdGF0dXMgaW4gY29uZmlnIGV2ZW50CisgICAgLy8gIDIuIExvY2sgbUxvY2sKKyAgICAvLyAgMy4gQ2FsbCBzZW5kQ29uZmlnRXZlbnRfbCgpOiBBcHBlbmQgdG8gbUNvbmZpZ0V2ZW50cyBhbmQgbVdhaXRXb3JrQ1Yuc2lnbmFsCisgICAgLy8gIDQuIHNlbmRDb25maWdFdmVudF9sKCkgcmVhZHMgc3RhdHVzIGZyb20gZXZlbnQtPm1TdGF0dXM7CisgICAgLy8gIDUuIHNlbmRDb25maWdFdmVudF9sKCkgcmV0dXJucyBzdGF0dXMKKyAgICAvLyAgNi4gVW5sb2NrCisgICAgLy8KKyAgICAvLyBQYXJhbWV0ZXIgc2VxdWVuY2UgYnkgc2VydmVyOiB0aHJlYWRMb29wIGNhbGxpbmcgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk6CisgICAgLy8gMS4gTG9jayBtTG9jaworICAgIC8vIDIuIElmIHRoZXJlIGlzIGFuIGVudHJ5IGluIG1Db25maWdFdmVudHMgcHJvY2VlZCAuLi4KKyAgICAvLyAzLiBSZWFkIGZpcnN0IGVudHJ5IGluIG1Db25maWdFdmVudHMKKyAgICAvLyA0LiBSZW1vdmUgZmlyc3QgZW50cnkgZnJvbSBtQ29uZmlnRXZlbnRzCisgICAgLy8gNS4gUHJvY2VzcworICAgIC8vIDYuIFNldCBldmVudC0+bVN0YXR1cworICAgIC8vIDcuIGV2ZW50LT5tQ29uZC5zaWduYWwKKyAgICAvLyA4LiBVbmxvY2sKIAotICAgICAgICAgICAgICAgIGludCBldmVudCgpIGNvbnN0IHsgcmV0dXJuIG1FdmVudDsgfQotICAgICAgICAgICAgICAgIGludCBwYXJhbSgpIGNvbnN0IHsgcmV0dXJuIG1QYXJhbTsgfQorICAgIGNsYXNzIENvbmZpZ0V2ZW50OiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5Db25maWdFdmVudCgpIHt9CisKKyAgICAgICAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsgbURhdGEtPmR1bXAoYnVmZmVyLCBzaXplKTsgfQorCisgICAgICAgIGNvbnN0IGludCBtVHlwZTsgLy8gZXZlbnQgdHlwZSBlLmcuIENGR19FVkVOVF9JTworICAgICAgICBNdXRleCBtTG9jazsgICAgIC8vIG11dGV4IGFzc29jaWF0ZWQgd2l0aCBtQ29uZAorICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgorICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAvLyBzdGF0dXMgY29tbXVuaWNhdGVkIHRvIHNlbmRlcgorICAgICAgICBib29sIG1XYWl0U3RhdHVzOyAvLyB0cnVlIGlmIHNlbmRlciBpcyB3YWl0aW5nIGZvciBzdGF0dXMKKyAgICAgICAgc3A8Q29uZmlnRXZlbnREYXRhPiBtRGF0YTsgICAgIC8vIGV2ZW50IHNwZWNpZmljIHBhcmFtZXRlciBkYXRhCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlKSA6IG1UeXBlKHR5cGUpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpLCBtRGF0YShOVUxMKSB7fQorICAgIH07CisKKyAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW9Db25maWdFdmVudERhdGEoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKKyAgICAgICAgICAgIG1FdmVudChldmVudCksIG1QYXJhbShwYXJhbSkge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewogICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiSU8gZXZlbnQ6IGV2ZW50ICVkLCBwYXJhbSAlZFxuIiwgbUV2ZW50LCBtUGFyYW0pOwogICAgICAgICB9CiAKLSAgICBwcml2YXRlOgogICAgICAgICBjb25zdCBpbnQgbUV2ZW50OwogICAgICAgICBjb25zdCBpbnQgbVBhcmFtOwogICAgIH07CiAKLSAgICBjbGFzcyBQcmlvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIGNsYXNzIElvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgewogICAgIHB1YmxpYzoKLSAgICAgICAgUHJpb0NvbmZpZ0V2ZW50KHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pIDoKLSAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9QUklPKSwgbVBpZChwaWQpLCBtVGlkKHRpZCksIG1QcmlvKHByaW8pIHt9Ci0gICAgICAgIHZpcnR1YWwgflByaW9Db25maWdFdmVudCgpIHt9CisgICAgICAgIElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTykgeworICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KKyAgICB9OwogCi0gICAgICAgICAgICAgICAgcGlkX3QgcGlkKCkgY29uc3QgeyByZXR1cm4gbVBpZDsgfQotICAgICAgICAgICAgICAgIHBpZF90IHRpZCgpIGNvbnN0IHsgcmV0dXJuIG1UaWQ7IH0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW8oKSBjb25zdCB7IHJldHVybiBtUHJpbzsgfQorICAgIGNsYXNzIFByaW9Db25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFByaW9Db25maWdFdmVudERhdGEocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgorICAgICAgICAgICAgbVBpZChwaWQpLCBtVGlkKHRpZCksIG1QcmlvKHByaW8pIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlByaW8gZXZlbnQ6IHBpZCAlZCwgdGlkICVkLCBwcmlvICVkXG4iLCBtUGlkLCBtVGlkLCBtUHJpbyk7CiAgICAgICAgIH0KIAotICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IHBpZF90IG1QaWQ7CiAgICAgICAgIGNvbnN0IHBpZF90IG1UaWQ7CiAgICAgICAgIGNvbnN0IGludDMyX3QgbVByaW87CiAgICAgfTsKIAorICAgIGNsYXNzIFByaW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBQcmlvQ29uZmlnRXZlbnQocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgorICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1BSSU8pIHsKKyAgICAgICAgICAgIG1EYXRhID0gbmV3IFByaW9Db25maWdFdmVudERhdGEocGlkLCB0aWQsIHByaW8pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflByaW9Db25maWdFdmVudCgpIHt9CisgICAgfTsKKworICAgIGNsYXNzIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhKFN0cmluZzgga2V5VmFsdWVQYWlycykgOgorICAgICAgICAgICAgbUtleVZhbHVlUGFpcnMoa2V5VmFsdWVQYWlycykge30KKworICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiS2V5VmFsdWU6ICVzXG4iLCBtS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBTdHJpbmc4IG1LZXlWYWx1ZVBhaXJzOworICAgIH07CisKKyAgICBjbGFzcyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudChTdHJpbmc4IGtleVZhbHVlUGFpcnMpIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9TRVRfUEFSQU1FVEVSKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEoa2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBtV2FpdFN0YXR1cyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+U2V0UGFyYW1ldGVyQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CisKKyAgICBjbGFzcyBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIG1QYXRjaChwYXRjaCksIG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgfTsKKworICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENIKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhKHBhdGNoLCBoYW5kbGUpOworICAgICAgICAgICAgbVdhaXRTdGF0dXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkNyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudCgpIHt9CisgICAgfTsKKworICAgIGNsYXNzIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YShjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgfTsKKworICAgIGNsYXNzIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YShoYW5kbGUpOworICAgICAgICAgICAgbVdhaXRTdGF0dXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CiAKICAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CkBAIC0xMjQsOSArMjM1LDkgQEAKIAogICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgZXh0ZXJuYWxseS12aXNpYmxlCiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlOyB9Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9Ci0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1IQUxGb3JtYXQ7IH0KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9CiAgICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGJ5IEF1ZGlvRmxpbmdlcjo6ZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGFuZCBlZmZlY3RzLAogICAgICAgICAgICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSBbbm9ybWFsIG1peF0gYnVmZmVyJ3MgZnJhbWUgY291bnQuCiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0ID0gMDsKQEAgLTEzNSwxNCArMjQ2LDI5IEBACiAgICAgLy8gU2hvdWxkIGJlICJ2aXJ0dWFsIHN0YXR1c190IHJlcXVlc3RFeGl0QW5kV2FpdCgpIiBhbmQgb3ZlcnJpZGUgc2FtZQogICAgIC8vIG1ldGhvZCBpbiBUaHJlYWQsIGJ1dCBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIGlzIG5vdCB5ZXQgdmlydHVhbC4KICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSA9IDA7CisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKSA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCkgPSAwOworICAgICAgICAgICAgICAgIC8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCisgICAgICAgICAgICAgICAgLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tCisgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworCiAKICAgICAgICAgICAgICAgICAvLyBzZWUgbm90ZSBhdCBkZWNsYXJhdGlvbiBvZiBtU3RhbmRieSwgbU91dERldmljZSBhbmQgbUluRGV2aWNlCiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgc3RhbmRieSgpIGNvbnN0IHsgcmV0dXJuIG1TdGFuZGJ5OyB9CkBAIC0xNTgsMTAgKzI4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOwotICAgICAgICAgICAgICAgIHZvaWQgZGlzY29ubmVjdEVmZmVjdChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bnBpbklmTGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWVzIGZvciBoYXNBdWRpb1Nlc3Npb24gKGJpdCBmaWVsZCkKICAgICAgICAgICAgICAgICBlbnVtIGVmZmVjdF9zdGF0ZSB7CkBAIC0yMDAsMTMgKzMyMywxMyBAQAogICAgICAgICAgICAgICAgIC8vIGVmZmVjdAogICAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAgICAgICAgICAgICAgICAgLy8gZGV0YWNoIGFsbCB0cmFja3MgY29ubmVjdGVkIHRvIGFuIGF1eGlsaWFyeSBlZmZlY3QKLSAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCkge30KKyAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCBfX3VudXNlZCkge30KICAgICAgICAgICAgICAgICAvLyByZXR1cm5zIGVpdGhlciBFRkZFQ1RfU0VTU0lPTiBpZiBlZmZlY3RzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdCBpbiBvbmUKICAgICAgICAgICAgICAgICAvLyBjaGFpbiwgb3IgVFJBQ0tfU0VTU0lPTiBpZiB0cmFja3Mgb24gdGhpcyBhdWRpbyBzZXNzaW9uIGV4aXN0LCBvciBib3RoCiAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb24oaW50IHNlc3Npb25JZCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIG5vdCBpbXBvcnRhbnQgYXMgdGhlCiAgICAgICAgICAgICAgICAgLy8gc3RyYXRlZ3kgaXMgb25seSBtZWFuaW5nZnVsIGZvciBQbGF5YmFja1RocmVhZCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kCi0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkKSB7IHJldHVybiAwOyB9CisgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkIF9fdW51c2VkKSB7IHJldHVybiAwOyB9CiAKICAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIG9yIHJlc3RvcmUgZWZmZWN0IGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiBlZmZlY3QgcGFzc2VkLiBhIE5VTEwKICAgICAgICAgICAgICAgICAvLyB0eXBlIHBvaW50ZXIgbWVhbnMgc3VzcGVuZCBhbGwgZWZmZWN0cyBpbiB0aGUgc2Vzc2lvbgpAQCAtMjI1LDYgKzM0OCwxNSBAQAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSA9IDA7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICBpc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdCA9IDA7CiAKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBwZXItdGhyZWFkIGhlYXAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWxsb2NhdGUgSU1lbW9yeQorICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgdGhhdCB3aWxsIGJlIHJlYWQtb25seSB0byBjbGllbnQgcHJvY2Vzc2VzLCByZWFkL3dyaXRlIHRvIG1lZGlhc2VydmVyLAorICAgICAgICAgICAgICAgIC8vIGFuZCBzaGFyZWQgYnkgYWxsIGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIHRocmVhZC4KKyAgICAgICAgICAgICAgICAvLyBUaGUgaGVhcCBpcyBwZXItdGhyZWFkIHJhdGhlciB0aGFuIGNvbW1vbiBhY3Jvc3MgYWxsIHRocmVhZHMsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBjbGllbnRzIGNhbid0IGJlIHRydXN0ZWQgbm90IHRvIG1vZGlmeSB0aGUgb2Zmc2V0IG9mIHRoZSBJTWVtb3J5IHRoZXkgcmVjZWl2ZS4KKyAgICAgICAgICAgICAgICAvLyBJZiBhIHRocmVhZCBkb2VzIG5vdCBoYXZlIHN1Y2ggYSBoZWFwLCB0aGlzIG1ldGhvZCByZXR1cm5zIDAuCisgICAgICAgICAgICAgICAgdmlydHVhbCBzcDxNZW1vcnlEZWFsZXI+ICAgIHJlYWRPbmx5SGVhcCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gcGlwZU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KIAogICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogCkBAIC0yNjksNDggKzQwMSwyOSBAQAogCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiAgbUF1ZGlvRmxpbmdlcjsKIAotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkgb3IKLSAgICAgICAgICAgICAgICAvLyBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKSBvcgorICAgICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgLy8gb3V0cHV0IEhBTCwgZGlyZWN0IG91dHB1dCwgcmVjb3JkCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OworICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgICAvLyBTb3VyY2UgZm9ybWF0IGZvciBSZWNvcmRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZm9ybWF0IGZvciBQbGF5YmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luayBmb3JtYXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhBTCBmb3JtYXQgaWYgRmFzdG1peGVyIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUhBTEZvcm1hdDsKKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgICAgLy8gSEFMIGJ1ZmZlciBzaXplIGZvciByZWFkKCkgb3Igd3JpdGUoKQogCi0gICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIHNlcXVlbmNlIGJ5IGNsaWVudDogYmluZGVyIHRocmVhZCBjYWxsaW5nIHNldFBhcmFtZXRlcnMoKToKLSAgICAgICAgICAgICAgICAvLyAgMS4gTG9jayBtTG9jawotICAgICAgICAgICAgICAgIC8vICAyLiBBcHBlbmQgdG8gbU5ld1BhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAvLyAgMy4gbVdhaXRXb3JrQ1Yuc2lnbmFsCi0gICAgICAgICAgICAgICAgLy8gIDQuIG1QYXJhbUNvbmQud2FpdFJlbGF0aXZlIHdpdGggdGltZW91dAotICAgICAgICAgICAgICAgIC8vICA1LiByZWFkIG1QYXJhbVN0YXR1cwotICAgICAgICAgICAgICAgIC8vICA2LiBtV2FpdFdvcmtDVi5zaWduYWwKLSAgICAgICAgICAgICAgICAvLyAgNy4gVW5sb2NrCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgc2VxdWVuY2UgYnkgc2VydmVyOiB0aHJlYWRMb29wIGNhbGxpbmcgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKToKLSAgICAgICAgICAgICAgICAvLyAxLiBMb2NrIG1Mb2NrCi0gICAgICAgICAgICAgICAgLy8gMi4gSWYgdGhlcmUgaXMgYW4gZW50cnkgaW4gbU5ld1BhcmFtZXRlcnMgcHJvY2VlZCAuLi4KLSAgICAgICAgICAgICAgICAvLyAyLiBSZWFkIGZpcnN0IGVudHJ5IGluIG1OZXdQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgLy8gMy4gUHJvY2VzcwotICAgICAgICAgICAgICAgIC8vIDQuIFJlbW92ZSBmaXJzdCBlbnRyeSBmcm9tIG1OZXdQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgLy8gNS4gU2V0IG1QYXJhbVN0YXR1cwotICAgICAgICAgICAgICAgIC8vIDYuIG1QYXJhbUNvbmQuc2lnbmFsCi0gICAgICAgICAgICAgICAgLy8gNy4gbVdhaXRXb3JrQ1Yud2FpdCB3aXRoIHRpbWVvdXQgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlcndyaXRpbmcgbVBhcmFtU3RhdHVzKQotICAgICAgICAgICAgICAgIC8vIDguIFVubG9jawotICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgIG1QYXJhbUNvbmQ7Ci0gICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICAgICAgICAgbU5ld1BhcmFtZXRlcnM7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVBhcmFtU3RhdHVzOwotCi0gICAgICAgICAgICAgICAgLy8gdmVjdG9yIG93bnMgZWFjaCBDb25maWdFdmVudCAqLCBzbyBtdXN0IGRlbGV0ZSBhZnRlciByZW1vdmluZwotICAgICAgICAgICAgICAgIFZlY3RvcjxDb25maWdFdmVudCAqPiAgICAgbUNvbmZpZ0V2ZW50czsKKyAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPENvbmZpZ0V2ZW50PiA+ICAgICBtQ29uZmlnRXZlbnRzOwogCiAgICAgICAgICAgICAgICAgLy8gVGhlc2UgZmllbGRzIGFyZSB3cml0dGVuIGFuZCByZWFkIGJ5IHRocmVhZCBpdHNlbGYgd2l0aG91dCBsb2NrIG9yIGJhcnJpZXIsCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJlYWQgYnkgb3RoZXIgdGhyZWFkcyB3aXRob3V0IGxvY2sgb3IgYmFycmllciB2aWEgc3RhbmRieSgpICwgb3V0RGV2aWNlKCkKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZCBieSBvdGhlciB0aHJlYWRzIHdpdGhvdXQgbG9jayBvciBiYXJyaWVyIHZpYSBzdGFuZGJ5KCksIG91dERldmljZSgpCiAgICAgICAgICAgICAgICAgLy8gYW5kIGluRGV2aWNlKCkuCiAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGUgYWJzZW5jZSBvZiBhIGxvY2sgb3IgYmFycmllciwgYW55IG90aGVyIHRocmVhZCB0aGF0IHJlYWRzCiAgICAgICAgICAgICAgICAgLy8gdGhlc2UgZmllbGRzIG11c3QgdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiBpc29sYXRpb24sIG9yIGJlIHByZXBhcmVkIHRvIGRlYWwKICAgICAgICAgICAgICAgICAvLyB3aXRoIHBvc3NpYmlsaXR5IHRoYXQgaXQgbWlnaHQgYmUgaW5jb25zaXN0ZW50IHdpdGggb3RoZXIgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnk7ICAgLy8gV2hldGhlciB0aHJlYWQgaXMgY3VycmVudGx5IGluIHN0YW5kYnkuCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnk7ICAgICAvLyBXaGV0aGVyIHRocmVhZCBpcyBjdXJyZW50bHkgaW4gc3RhbmRieS4KICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtT3V0RGV2aWNlOyAgIC8vIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtSW5EZXZpY2U7ICAgIC8vIGlucHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90ICAgICAgICAgIG1BdWRpb1NvdXJjZTsgLy8gKHNlZSBhdWRpby5oLCBhdWRpb19zb3VyY2VfdCkKQEAgLTM2MCw3ICs0NzMsNiBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CiAKICAgICAvLyBSZWZCYXNlCkBAIC0zOTMsNyArNTA1LDcgQEAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFjaygpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrX2woKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBzaG91bGRTdGFuZGJ5X2woKTsKLQorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogCiAgICAgLy8gVGhyZWFkQmFzZSB2aXJ0dWFscwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHByZUV4aXQoKTsKQEAgLTQyMSwxMyArNTMzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGdldE91dHB1dCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBjbGVhck91dHB1dCgpOwpAQCAtNDQ3LDkgKzU1OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1TdXNwZW5kZWQpID4gMDsgfQogCiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgaW50MTZfdCAgICAgKm1peEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1NaXhCdWZmZXI7IH07CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcyk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgcmVuYW1lIG1peEJ1ZmZlcigpIHRvIHNpbmtCdWZmZXIoKSBhbmQgcmVtb3ZlIGludDE2X3QqIGRlcGVuZGVuY3kuCisgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgYWxzbyByZW1vdmluZyBhbmQgcGFzc2luZyBhbiBleHBsaWNpdCBtTWFpbkJ1ZmZlciBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciB0byBBRjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpUcmFjaygpLgorICAgICAgICAgICAgICAgIGludDE2X3QgICAgICptaXhCdWZmZXIoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4obVNpbmtCdWZmZXIpOyB9OwogCiAgICAgdmlydHVhbCAgICAgdm9pZCBkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQpOwogICAgICAgICAgICAgICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjaz4gdHJhY2ssCkBAIC00NzQsMTQgKzU5MCw3NiBAQAogICAgICAgICAgICAgICAgIC8vIFJldHVybidzIHRoZSBIQUwncyBmcmFtZSBjb3VudCBpLmUuIGZhc3QgbWl4ZXIgYnVmZmVyIHNpemUuCiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudEhBTCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgIGdldFRpbWVzdGFtcF9sKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcF9sKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOworCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKKworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKIHByb3RlY3RlZDoKLSAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkKKyAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKIAotICAgIGludDE2X3QqICAgICAgICAgICAgICAgICAgICAgICAgbU1peEJ1ZmZlcjsgICAgICAgICAvLyBmcmFtZSBzaXplIGFsaWduZWQgbWl4IGJ1ZmZlcgotICAgIGludDhfdCogICAgICAgICAgICAgICAgICAgICAgICAgbUFsbG9jTWl4QnVmZmVyOyAgICAvLyBtaXhlciBidWZmZXIgYWxsb2NhdGlvbiBhZGRyZXNzCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlcjsgICAgICAgICAvLyBmcmFtZSBzaXplIGFsaWduZWQgc2luayBidWZmZXIKKworICAgIC8vIFRPRE86CisgICAgLy8gUmVhcnJhbmdlIHRoZSBidWZmZXIgaW5mbyBpbnRvIGEgc3RydWN0L2NsYXNzIHdpdGgKKyAgICAvLyBjbGVhciwgY29weSwgY29uc3RydWN0aW9uLCBkZXN0cnVjdGlvbiBtZXRob2RzLgorICAgIC8vCisgICAgLy8gbVNpbmtCdWZmZXIgYWxzbyBoYXMgYXNzb2NpYXRlZCB3aXRoIGl0OgorICAgIC8vCisgICAgLy8gbVNpbmtCdWZmZXJTaXplOiBTaW5rIEJ1ZmZlciBTaXplCisgICAgLy8gbUZvcm1hdDogU2luayBCdWZmZXIgRm9ybWF0CisKKyAgICAvLyBNaXhlciBCdWZmZXIgKG1NaXhlckJ1ZmZlciopCisgICAgLy8KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiBmbG9hdGluZyBwb2ludCBvciBtdWx0aWNoYW5uZWwgZGF0YSwgd2hpY2ggaXMgbm90IGluIHRoZQorICAgIC8vIHNpbmsgZm9ybWF0LCBpdCBpcyByZXF1aXJlZCB0byBhY2N1bXVsYXRlIGluIGEgaGlnaGVyIHByZWNpc2lvbiBvciBncmVhdGVyIGNoYW5uZWwgY291bnQKKyAgICAvLyBidWZmZXIgYmVmb3JlIGRvd25taXhpbmcgb3IgZGF0YSBjb252ZXJzaW9uIHRvIHRoZSBzaW5rIGJ1ZmZlci4KKworICAgIC8vIFNldCB0byAidHJ1ZSIgdG8gZW5hYmxlIHRoZSBNaXhlciBCdWZmZXIgb3RoZXJ3aXNlIG1peGVyIG91dHB1dCBnb2VzIHRvIHNpbmsgYnVmZmVyLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyRW5hYmxlZDsKKworICAgIC8vIFN0b3JhZ2UsIDMyIGJ5dGUgYWxpZ25lZCAobWF5IG1ha2UgdGhpcyBhbGlnbm1lbnQgYSByZXF1aXJlbWVudCBsYXRlcikuCisgICAgLy8gRHVlIHRvIGNvbnN0cmFpbnRzIG9uIG1Ob3JtYWxGcmFtZUNvdW50LCB0aGUgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNiBmcmFtZXMuCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXI7CisKKyAgICAvLyBTaXplIG9mIG1NaXhlckJ1ZmZlciBpbiBieXRlczogbU5vcm1hbEZyYW1lQ291bnQgKiAjY2hhbm5lbHMgKiBzYW1wc2l6ZS4KKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemU7CisKKyAgICAvLyBUaGUgYXVkaW8gZm9ybWF0IG9mIG1NaXhlckJ1ZmZlci4gU2V0IHRvIEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkgb25seS4KKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdDsKKworICAgIC8vIEFuIGludGVybmFsIGZsYWcgc2V0IHRvIHRydWUgYnkgTWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgpCisgICAgLy8gd2hlbiBtTWl4ZXJCdWZmZXIgY29udGFpbnMgdmFsaWQgZGF0YSBhZnRlciBtaXhpbmcuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZDsKKworICAgIC8vIEVmZmVjdHMgQnVmZmVyIChtRWZmZWN0c0J1ZmZlciopCisgICAgLy8KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiBlZmZlY3RzIGRhdGEsIHdoaWNoIGlzIG5vdCBpbiB0aGUgc2luayBmb3JtYXQsCisgICAgLy8gaXQgaXMgcmVxdWlyZWQgdG8gYWNjdW11bGF0ZSBpbiBhIGRpZmZlcmVudCBidWZmZXIgYmVmb3JlIGRhdGEgY29udmVyc2lvbgorICAgIC8vIHRvIHRoZSBzaW5rIGJ1ZmZlci4KKworICAgIC8vIFNldCB0byAidHJ1ZSIgdG8gZW5hYmxlIHRoZSBFZmZlY3RzIEJ1ZmZlciBvdGhlcndpc2UgZWZmZWN0cyBvdXRwdXQgZ29lcyB0byBzaW5rIGJ1ZmZlci4KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkOworCisgICAgLy8gU3RvcmFnZSwgMzIgYnl0ZSBhbGlnbmVkIChtYXkgbWFrZSB0aGlzIGFsaWdubWVudCBhIHJlcXVpcmVtZW50IGxhdGVyKS4KKyAgICAvLyBEdWUgdG8gY29uc3RyYWludHMgb24gbU5vcm1hbEZyYW1lQ291bnQsIHRoZSBidWZmZXIgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2IGZyYW1lcy4KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXI7CisKKyAgICAvLyBTaXplIG9mIG1FZmZlY3RzQnVmZmVyIGluIGJ5dGVzOiBtTm9ybWFsRnJhbWVDb3VudCAqICNjaGFubmVscyAqIHNhbXBzaXplLgorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlclNpemU7CisKKyAgICAvLyBUaGUgYXVkaW8gZm9ybWF0IG9mIG1FZmZlY3RzQnVmZmVyLiBTZXQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgb25seS4KKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQ7CisKKyAgICAvLyBBbiBpbnRlcm5hbCBmbGFnIHNldCB0byB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKQorICAgIC8vIHdoZW4gbUVmZmVjdHNCdWZmZXIgY29udGFpbnMgdmFsaWQgZGF0YSBhZnRlciBtaXhpbmcuCisgICAgLy8KKyAgICAvLyBXaGVuIHRoaXMgaXMgc2V0LCBhbGwgbWl4ZXIgZGF0YSBpcyByb3V0ZWQgaW50byB0aGUgZWZmZWN0cyBidWZmZXIKKyAgICAvLyBmb3IgYW55IHByb2Nlc3NpbmcgKGluY2x1ZGluZyBvdXRwdXQgcHJvY2Vzc2luZykuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyVmFsaWQ7CiAKICAgICAvLyBzdXNwZW5kIGNvdW50LCA+IDAgbWVhbnMgc3VzcGVuZGVkLiAgV2hpbGUgc3VzcGVuZGVkLCB0aGUgdGhyZWFkIGNvbnRpbnVlcyB0byBwdWxsIGZyb20KICAgICAvLyB0cmFja3MgYW5kIG1peCwgYnV0IGRvZXNuJ3Qgd3JpdGUgdG8gSEFMLiAgQTJEUCBhbmQgU0NPIEhBTCBpbXBsZW1lbnRhdGlvbnMgY2FuJ3QgaGFuZGxlCkBAIC01MDcsNyArNjg1LDggQEAKIAogICAgIC8vIEFsbG9jYXRlIGEgdHJhY2sgbmFtZSBmb3IgYSBnaXZlbiBjaGFubmVsIG1hc2suCiAgICAgLy8gICBSZXR1cm5zIG5hbWUgPj0gMCBpZiBzdWNjZXNzZnVsLCAtMSBvbiBmYWlsdXJlLgotICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKSA9IDA7CisgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpID0gMDsKIAogICAgIC8vIFRpbWUgdG8gc2xlZXAgYmV0d2VlbiBjeWNsZXMgd2hlbjoKQEAgLTUyOSwxMSArNzA4LDE0IEBACiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0OwogCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKwogcHJpdmF0ZToKIAogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgLy8gZm9yIG51bWVyb3VzCiAKLSAgICBQbGF5YmFja1RocmVhZChjb25zdCBDbGllbnQmKTsKICAgICBQbGF5YmFja1RocmVhZCYgb3BlcmF0b3IgPSAoY29uc3QgUGxheWJhY2tUaHJlYWQmKTsKIAogICAgIHN0YXR1c190ICAgIGFkZFRyYWNrX2woY29uc3Qgc3A8VHJhY2s+JiB0cmFjayk7CkBAIC01NDEsNyArNzIzLDcgQEAKICAgICB2b2lkICAgICAgICByZW1vdmVUcmFja19sKGNvbnN0IHNwPFRyYWNrPiYgdHJhY2spOwogICAgIHZvaWQgICAgICAgIGJyb2FkY2FzdF9sKCk7CiAKLSAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOworICAgIHZvaWQgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpAQCAtNTYwLDcgKzc0Miw3IEBACiAKICAgICAvLyBGSVhNRSByZW5hbWUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBvZiB0aHJlYWRMb29wIHRvIHN0YW5kYXJkICJtIiBuYW1lcwogICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRieVRpbWU7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhCdWZmZXJTaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXJTaXplOwogCiAgICAgLy8gY2FjaGVkIGNvcGllcyBvZiBhY3RpdmVTbGVlcFRpbWVVcygpIGFuZCBpZGxlU2xlZXBUaW1lVXMoKSBtYWRlIGJ5IGNhY2hlUGFyYW1ldGVyc19sKCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNsZWVwVGltZTsKQEAgLTYyNSwxMyArODA3LDEyIEBACiAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyOwogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgZ2V0RmFzdFRyYWNrVW5kZXJydW5zKHNpemVfdCBmYXN0SW5kZXgpIGNvbnN0CisgICAgdmlydHVhbCAgICAgRmFzdFRyYWNrVW5kZXJydW5zIGdldEZhc3RUcmFja1VuZGVycnVucyhzaXplX3QgZmFzdEluZGV4IF9fdW51c2VkKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEZhc3RUcmFja1VuZGVycnVucyBkdW1teTsgcmV0dXJuIGR1bW15OyB9CiAKIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAvLyBhY2Nlc3NlZCBieSBib3RoIGJpbmRlciB0aHJlYWRzIGFuZCB3aXRoaW4gdGhyZWFkTG9vcCgpLCBsb2NrIG9uIG11dGV4IG5lZWRlZAogICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgIG1GYXN0VHJhY2tBdmFpbE1hc2s7ICAgIC8vIGJpdCBpIHNldCBpZiBmYXN0IHRyYWNrIFtpXSBpcyBhdmFpbGFibGUKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaE91dHB1dF9sKCk7CiAKIHByaXZhdGU6CiAgICAgLy8gdGltZXN0YW1wIGxhdGNoOgpAQCAtNjQwLDggKzgyMSwxMSBAQAogICAgIHN0cnVjdCB7CiAgICAgICAgIEF1ZGlvVGltZXN0YW1wICBtVGltZXN0YW1wOwogICAgICAgICB1aW50MzJfdCAgICAgICAgbVVucHJlc2VudGVkRnJhbWVzOworICAgICAgICBLZXllZFZlY3RvcjxUcmFjayAqLCB1aW50MzJfdD4gbUZyYW1lc1JlbGVhc2VkOwogICAgIH0gbUxhdGNoRCwgbUxhdGNoUTsKLSAgICBib29sIG1MYXRjaERWYWxpZDsgIC8vIHRydWUgbWVhbnMgbUxhdGNoRCBpcyB2YWxpZCwgYW5kIGNsb2NrIGl0IGludG8gbGF0Y2ggYXQgbmV4dCBvcHBvcnR1bml0eQorICAgIGJvb2wgbUxhdGNoRFZhbGlkOyAgLy8gdHJ1ZSBtZWFucyBtTGF0Y2hEIGlzIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGV4Y2VwdCBmb3IgbUZyYW1lc1JlbGVhc2VkIHdoaWNoIGlzIGZpbGxlZCBpbiBsYXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYW5kIGNsb2NrIGl0IGludG8gbGF0Y2ggYXQgbmV4dCBvcHBvcnR1bml0eQogICAgIGJvb2wgbUxhdGNoUVZhbGlkOyAgLy8gdHJ1ZSBtZWFucyBtTGF0Y2hRIGlzIHZhbGlkCiB9OwogCkBAIC02NTYsMTIgKzg0MCwxNCBAQAogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAKLSAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOworICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCAgICAgbWl4ZXJfc3RhdGUgcHJlcGFyZVRyYWNrc19sKFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKTsKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCk7CisgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSk7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaWRsZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc3VzcGVuZFNsZWVwVGltZVVzKCkgY29uc3Q7CkBAIC02NzgsNyArODY0LDcgQEAKICAgICAgICAgICAgICAgICBBdWRpb01peGVyKiBtQXVkaW9NaXhlcjsgICAgLy8gbm9ybWFsIG1peGVyCiBwcml2YXRlOgogICAgICAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZAotICAgICAgICAgICAgICAgIEZhc3RNaXhlciogIG1GYXN0TWl4ZXI7ICAgICAgICAgLy8gbm9uLU5VTEwgaWYgdGhlcmUgaXMgYWxzbyBhIGZhc3QgbWl4ZXIKKyAgICAgICAgICAgICAgICBzcDxGYXN0TWl4ZXI+ICAgICBtRmFzdE1peGVyOyAgICAgLy8gbm9uLTAgaWYgdGhlcmUgaXMgYWxzbyBhIGZhc3QgbWl4ZXIKICAgICAgICAgICAgICAgICBzcDxBdWRpb1dhdGNoZG9nPiBtQXVkaW9XYXRjaGRvZzsgLy8gbm9uLTAgaWYgdGhlcmUgaXMgYW4gYXVkaW8gd2F0Y2hkb2cgdGhyZWFkCiAKICAgICAgICAgICAgICAgICAvLyBjb250ZW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudCwgbm8gbG9ja3MgcmVxdWlyZWQKQEAgLTY5NCwxMSArODgwLDEyIEBACiAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgbUZhc3RNaXhlckZ1dGV4OyAgICAvLyBmb3IgY29sZCBpZGxlCiAKIHB1YmxpYzoKLSAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBtRmFzdE1peGVyICE9IE5VTEw7IH0KKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBtRmFzdE1peGVyICE9IDA7IH0KICAgICB2aXJ0dWFsICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgZ2V0RmFzdFRyYWNrVW5kZXJydW5zKHNpemVfdCBmYXN0SW5kZXgpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RJbmRleCA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUZhc3RNaXhlckR1bXBTdGF0ZS5tVHJhY2tzW2Zhc3RJbmRleF0ubVVuZGVycnVuczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIH07CiAKIGNsYXNzIERpcmVjdE91dHB1dFRocmVhZCA6IHB1YmxpYyBQbGF5YmFja1RocmVhZCB7CkBAIC03MTAsMTAgKzg5NywxMyBAQAogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAKLSAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOworICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCk7CisgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSk7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgYWN0aXZlU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBpZGxlU2xlZXBUaW1lVXMoKSBjb25zdDsKQEAgLTc0NSwxOSArOTM1LDE3IEBACiAgICAgT2ZmbG9hZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+T2ZmbG9hZFRocmVhZCgpIHt9OworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gdGhyZWFkTG9vcCBzbmlwcGV0cwogICAgIHZpcnR1YWwgICAgIG1peGVyX3N0YXRlIHByZXBhcmVUcmFja3NfbChWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9leGl0KCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hPdXRwdXRfbCgpOwogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2soKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFja19sKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgc2hvdWxkU3RhbmRieV9sKCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKIHByaXZhdGU6CiAgICAgYm9vbCAgICAgICAgbUh3UGF1c2VkOwpAQCAtODQwLDE3ICsxMDI4LDI4IEBACiAKIAogLy8gcmVjb3JkIHRocmVhZAotY2xhc3MgUmVjb3JkVGhyZWFkIDogcHVibGljIFRocmVhZEJhc2UsIHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVzIGZyb20gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgZm9yIHVzZSBieSByZXNhbXBsZXIKK2NsYXNzIFJlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlCiB7CiBwdWJsaWM6CiAKKyAgICBjbGFzcyBSZWNvcmRUcmFjazsKKyAgICBjbGFzcyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVzIGZyb20gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgZm9yIHVzZSBieSByZXNhbXBsZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcihSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIDogbVJlY29yZFRyYWNrKHJlY29yZFRyYWNrKSB7IH0KKyAgICAgICAgdmlydHVhbCB+UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoKSB7IH0KKyAgICAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CisgICAgcHJpdmF0ZToKKyAgICAgICAgUmVjb3JkVHJhY2sgKiBjb25zdCBtUmVjb3JkVHJhY2s7CisgICAgfTsKKwogI2luY2x1ZGUgIlJlY29yZFRyYWNrcy5oIgogCiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UKQEAgLTg2OSwyMyArMTA2OCwyOCBAQAogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CiAKICAgICAvLyBSZWZCYXNlCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIChtSW5wdXQgPT0gTlVMTCkgPyBOT19JTklUIDogTk9fRVJST1I7IH0KKworICAgIHZpcnR1YWwgc3A8TWVtb3J5RGVhbGVyPiAgICByZWFkT25seUhlYXAoKSBjb25zdCB7IHJldHVybiBtUmVhZE9ubHlIZWFwOyB9CisKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IHBpcGVNZW1vcnkoKSBjb25zdCB7IHJldHVybiBtUGlwZU1lbW9yeTsgfQorCiAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+ICBjcmVhdGVSZWNvcmRUcmFja19sKAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAogICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LApAQCAtODk5LDE1ICsxMTAzLDIxIEBACiAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiBjbGVhcklucHV0KCk7CiAgICAgICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90KiBzdHJlYW0oKSBjb25zdDsKIAotICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKIAotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCkge30KICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwotICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVycygpOwotICAgIHZpcnR1YWwgdW5zaWduZWQgaW50ICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CisgICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKICAgICB2aXJ0dWFsIHNpemVfdCByZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwpAQCAtOTIyLDQ1ICsxMTMyLDczIEBACiAgICAgdmlydHVhbCBib29sICAgICBpc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdDsKIAogICAgIHN0YXRpYyB2b2lkIHN5bmNTdGFydEV2ZW50Q2FsbGJhY2soY29uc3Qgd3A8U3luY0V2ZW50PiYgZXZlbnQpOwotICAgICAgICAgICB2b2lkIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9Ci0gICAgICAgICAgICBib29sICAgICAgICBoYXNGYXN0UmVjb3JkZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdENhcHR1cmUoKSBjb25zdCB7IHJldHVybiBtRmFzdENhcHR1cmUgIT0gMDsgfQorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogcHJpdmF0ZToKLSAgICAgICAgICAgIHZvaWQgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwotCiAgICAgICAgICAgICAvLyBFbnRlciBzdGFuZGJ5IGlmIG5vdCBhbHJlYWR5IGluIHN0YW5kYnksIGFuZCBzZXQgbVN0YW5kYnkgZmxhZwotICAgICAgICAgICAgdm9pZCBzdGFuZGJ5KCk7CisgICAgICAgICAgICB2b2lkICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKIAogICAgICAgICAgICAgLy8gQ2FsbCB0aGUgSEFMIHN0YW5kYnkgbWV0aG9kIHVuY29uZGl0aW9uYWxseSwgYW5kIGRvbid0IGNoYW5nZSBtU3RhbmRieSBmbGFnCi0gICAgICAgICAgICB2b2lkIGlucHV0U3RhbmRCeSgpOworICAgICAgICAgICAgdm9pZCAgICBpbnB1dFN0YW5kQnkoKTsKIAogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAgICAgICAgICAgICAgICAgICAgICAgKm1JbnB1dDsKICAgICAgICAgICAgIFNvcnRlZFZlY3RvciA8IHNwPFJlY29yZFRyYWNrPiA+ICAgIG1UcmFja3M7Ci0gICAgICAgICAgICAvLyBtQWN0aXZlVHJhY2sgaGFzIGR1YWwgcm9sZXM6ICBpdCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgYWN0aXZlIHRyYWNrLCBhbmQKKyAgICAgICAgICAgIC8vIG1BY3RpdmVUcmFja3MgaGFzIGR1YWwgcm9sZXM6ICBpdCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgYWN0aXZlIHRyYWNrKHMpLCBhbmQKICAgICAgICAgICAgIC8vIGlzIHVzZWQgdG9nZXRoZXIgd2l0aCBtU3RhcnRTdG9wQ29uZCB0byBpbmRpY2F0ZSBzdGFydCgpL3N0b3AoKSBwcm9ncmVzcwotICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+ICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxSZWNvcmRUcmFjaz4gPiAgICAgbUFjdGl2ZVRyYWNrczsKKyAgICAgICAgICAgIC8vIGdlbmVyYXRpb24gY291bnRlciBmb3IgbUFjdGl2ZVRyYWNrcworICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbjsKICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kOwogCi0gICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVycygpCi0gICAgICAgICAgICBBdWRpb1Jlc2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAqbVJlc2FtcGxlcjsKLSAgICAgICAgICAgIC8vIGludGVybGVhdmVkIHN0ZXJlbyBwYWlycyBvZiBmaXhlZC1wb2ludCBzaWduZWQgUTE5LjEyCi0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBPdXRCdWZmZXI7Ci0gICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBJbkJ1ZmZlcjsgLy8gW21GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudF0KLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleDsKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAgICAvLyBzdHJlYW0gYnVmZmVyIHNpemUgZm9yIHJlYWQoKQotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbVJlcUNoYW5uZWxDb3VudDsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1SZXFTYW1wbGVSYXRlOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZDsKLSAgICAgICAgICAgIC8vIHN5bmMgZXZlbnQgdHJpZ2dlcmluZyBhY3R1YWwgYXVkaW8gY2FwdHVyZS4gRnJhbWVzIHJlYWQgYmVmb3JlIHRoaXMgZXZlbnQgd2lsbAotICAgICAgICAgICAgLy8gYmUgZHJvcHBlZCBhbmQgdGhlcmVmb3JlIG5vdCByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIHNwPFN5bmNFdmVudD4gICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RhcnRFdmVudDsKLSAgICAgICAgICAgIC8vIG51bWJlciBvZiBjYXB0dXJlZCBmcmFtZXMgdG8gZHJvcCBhZnRlciB0aGUgc3RhcnQgc3luYyBldmVudCBoYXMgYmVlbiByZWNlaXZlZC4KLSAgICAgICAgICAgIC8vIHdoZW4gPCAwLCBtYXhpbXVtIGZyYW1lcyB0byBkcm9wIGJlZm9yZSBzdGFydGluZyBjYXB0dXJlIGV2ZW4gaWYgc3luYyBldmVudCBpcwotICAgICAgICAgICAgLy8gbm90IHJlY2VpdmVkCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzdG9Ecm9wOworICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGNvbnZlcnRzIGlucHV0IGF0IEhBTCBIeiB0byBvdXRwdXQgYXQgQXVkaW9SZWNvcmQgY2xpZW50IEh6CisgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBJbkJ1ZmZlcjsgLy8gc2VlIG5ld1tdIGZvciBkZXRhaWxzIG9uIHRoZSBzaXplCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJhbWVzOyAgLy8gc2l6ZSBvZiByZXNhbXBsZXIgaW5wdXQgaW4gZnJhbWVzCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJhbWVzUDI7Ly8gc2l6ZSByb3VuZGVkIHVwIHRvIGEgcG93ZXItb2YtMgorCisgICAgICAgICAgICAvLyByb2xsaW5nIGluZGV4IHRoYXQgaXMgbmV2ZXIgY2xlYXJlZAorICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblJlYXI7ICAgIC8vIGxhc3QgZmlsbGVkIGZyYW1lICsgMQogCiAgICAgICAgICAgICAvLyBGb3IgZHVtcHN5cwogICAgICAgICAgICAgY29uc3Qgc3A8TkJBSU9fU2luaz4gICAgICAgICAgICAgICAgbVRlZVNpbms7CisKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gICAgICAgICAgICAgIG1SZWFkT25seUhlYXA7CisKKyAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZAorICAgICAgICAgICAgc3A8RmFzdENhcHR1cmU+ICAgICAgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlOyAgIC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFsc28gYSBmYXN0IGNhcHR1cmUKKyAgICAgICAgICAgIC8vIEZJWE1FIGF1ZGlvIHdhdGNoZG9nIHRocmVhZAorCisgICAgICAgICAgICAvLyBjb250ZW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudCwgbm8gbG9ja3MgcmVxdWlyZWQKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZTsKKyNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCisgICAgICAgICAgICAvLyBGSVhNRSBTdGF0ZVF1ZXVlIG9ic2VydmVyIGFuZCBtdXRhdG9yIGR1bXAgZmllbGRzCisjZW5kaWYKKyAgICAgICAgICAgIC8vIEZJWE1FIGF1ZGlvIHdhdGNoZG9nIGR1bXAKKworICAgICAgICAgICAgLy8gYWNjZXNzaWJsZSBvbmx5IHdpdGhpbiB0aGUgdGhyZWFkTG9vcCgpLCBubyBsb2NrcyByZXF1aXJlZAorICAgICAgICAgICAgLy8gICAgICAgICAgbUZhc3RDYXB0dXJlLT5zcSgpICAgICAgLy8gZm9yIG11dGF0aW5nIGFuZCBwdXNoaW5nIHN0YXRlCisgICAgICAgICAgICBpbnQzMl90ICAgICBtRmFzdENhcHR1cmVGdXRleDsgICAgICAvLyBmb3IgY29sZCBpZGxlCisKKyAgICAgICAgICAgIC8vIFRoZSBIQUwgaW5wdXQgc291cmNlIGlzIHRyZWF0ZWQgYXMgbm9uLWJsb2NraW5nLAorICAgICAgICAgICAgLy8gYnV0IGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgYmxvY2tpbmcKKyAgICAgICAgICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsKKyAgICAgICAgICAgIC8vIFRoZSBzb3VyY2UgZm9yIHRoZSBub3JtYWwgY2FwdHVyZSB0aHJlYWQgdG8gcmVhZCBmcm9tOiBtSW5wdXRTb3VyY2Ugb3IgbVBpcGVTb3VyY2UKKyAgICAgICAgICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxTb3VyY2U7CisgICAgICAgICAgICAvLyBJZiBhIGZhc3QgY2FwdHVyZSBpcyBwcmVzZW50LCB0aGUgbm9uLWJsb2NraW5nIHBpcGUgc2luayB3cml0dGVuIHRvIGJ5IGZhc3QgY2FwdHVyZSwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjbGVhcgorICAgICAgICAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgICAgICAgICAgICAgbVBpcGVTaW5rOworICAgICAgICAgICAgLy8gSWYgYSBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudCwgdGhlIG5vbi1ibG9ja2luZyBwaXBlIHNvdXJjZSByZWFkIGJ5IG5vcm1hbCB0aHJlYWQsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgY2xlYXIKKyAgICAgICAgICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1QaXBlU291cmNlOworICAgICAgICAgICAgLy8gRGVwdGggb2YgcGlwZSBmcm9tIGZhc3QgY2FwdHVyZSB0byBub3JtYWwgdGhyZWFkIGFuZCBmYXN0IGNsaWVudHMsIGFsd2F5cyBwb3dlciBvZiAyCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGlwZUZyYW1lc1AyOworICAgICAgICAgICAgLy8gSWYgYSBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudCwgdGhlIFBpcGUgYXMgSU1lbW9yeSwgb3RoZXJ3aXNlIGNsZWFyCisgICAgICAgICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICAgICAgICAgICAgICBtUGlwZU1lbW9yeTsKKworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAgICAgICAgICAga0Zhc3RDYXB0dXJlTG9nU2l6ZSA9IDQgKiAxMDI0OworICAgICAgICAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlTkJMb2dXcml0ZXI7CisKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tBdmFpbDsgICAgLy8gdHJ1ZSBpZiBmYXN0IHRyYWNrIGF2YWlsYWJsZQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAppbmRleCBjZDIwMWQ5Li45OGJmOTZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCkBAIC0zNCw3ICszNCwyNSBAQAogICAgICAgICBSRVNVTUlORywKICAgICAgICAgQUNUSVZFLAogICAgICAgICBQQVVTSU5HLAotICAgICAgICBQQVVTRUQKKyAgICAgICAgUEFVU0VELAorICAgICAgICBTVEFSVElOR18xLCAgICAgLy8gZm9yIFJlY29yZFRyYWNrIG9ubHkKKyAgICAgICAgU1RBUlRJTkdfMiwgICAgIC8vIGZvciBSZWNvcmRUcmFjayBvbmx5CisgICAgfTsKKworICAgIC8vIHdoZXJlIHRvIGFsbG9jYXRlIHRoZSBkYXRhIGJ1ZmZlcgorICAgIGVudW0gYWxsb2NfdHlwZSB7CisgICAgICAgIEFMTE9DX0NCTEssICAgICAvLyBhbGxvY2F0ZSBpbW1lZGlhdGVseSBhZnRlciBjb250cm9sIGJsb2NrCisgICAgICAgIEFMTE9DX1JFQURPTkxZLCAvLyBhbGxvY2F0ZSBmcm9tIGEgc2VwYXJhdGUgcmVhZC1vbmx5IGhlYXAgcGVyIHRocmVhZAorICAgICAgICBBTExPQ19QSVBFLCAgICAgLy8gZG8gbm90IGFsbG9jYXRlOyB1c2UgdGhlIHBpcGUgYnVmZmVyCisgICAgICAgIEFMTE9DX0xPQ0FMLCAgICAvLyBhbGxvY2F0ZSBhIGxvY2FsIGJ1ZmZlcgorICAgICAgICBBTExPQ19OT05FLCAgICAgLy8gZG8gbm90IGFsbG9jYXRlOnVzZSB0aGUgYnVmZmVyIHBhc3NlZCB0byBUcmFja0Jhc2UgY29uc3RydWN0b3IKKyAgICB9OworCisgICAgZW51bSB0cmFja190eXBlIHsKKyAgICAgICAgVFlQRV9ERUZBVUxULAorICAgICAgICBUWVBFX1RJTUVELAorICAgICAgICBUWVBFX09VVFBVVCwKKyAgICAgICAgVFlQRV9QQVRDSCwKICAgICB9OwogCiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoVGhyZWFkQmFzZSAqdGhyZWFkLApAQCAtNDMsMTEgKzYxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY190eXBlIGFsbG9jID0gQUxMT0NfQ0JMSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlID0gVFlQRV9ERUZBVUxUKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFja0Jhc2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24pID0gMDsKQEAgLTU4LDYgKzgwLDE0IEBACiAgICAgICAgICAgICBpbnQgICAgICAgICB1aWQoKSBjb25zdCB7IHJldHVybiBtVWlkOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogCisgICAgICAgICAgICBzcDxJTWVtb3J5PiBnZXRCdWZmZXJzKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlck1lbW9yeTsgfQorICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lZFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfVElNRUQpOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc091dHB1dFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfT1VUUFVUKTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNQYXRjaFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfUEFUQ0gpOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0V4dGVybmFsVHJhY2soKSBjb25zdCB7IHJldHVybiAhaXNPdXRwdXRUcmFjaygpICYmICFpc1BhdGNoVHJhY2soKTsgfQorCiBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoY29uc3QgVHJhY2tCYXNlJik7CiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UmIG9wZXJhdG9yID0gKGNvbnN0IFRyYWNrQmFzZSYpOwpAQCAtNzgsMTUgKzEwOCw2IEBACiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogCi0gICAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBjb250aWd1b3VzIHNsaWNlIG9mIHRoZSB0cmFjayBidWZmZXIuCi0gICAgLy8gUGFyYW1ldGVyICdvZmZzZXQnIGlzIHRoZSByZXF1ZXN0ZWQgc3RhcnQgcG9zaXRpb24sIGV4cHJlc3NlZCBpbgotICAgIC8vIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBmcmFtZSB1bml0cyByZWxhdGl2ZSB0byB0aGUgdHJhY2sgZXBvY2guCi0gICAgLy8gUGFyYW1ldGVyICdmcmFtZXMnIGlzIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoLCBhbHNvIGluIGZyYW1lIHVuaXRzLgotICAgIC8vIEFsd2F5cyByZXR1cm5zIG5vbi1OVUxMLiAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvCi0gICAgLy8gdmVyaWZ5IHRoYXQgdGhpcyB3aWxsIGJlIHN1Y2Nlc3NmdWw7IHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzCi0gICAgLy8gZnVuY3Rpb24gd2l0aCBpbnZhbGlkICdvZmZzZXQnIG9yICdmcmFtZXMnIGlzIHVuZGVmaW5lZC4KLSAgICB2b2lkKiBnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0OwotCiAgICAgYm9vbCBpc1N0b3BwZWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAobVN0YXRlID09IFNUT1BQRUQgfHwgbVN0YXRlID09IEZMVVNIRUQpOwogICAgIH0KQEAgLTExOCw2ICsxMzksNyBAQAogICAgIC8qY29uc3QqLyBzcDxDbGllbnQ+IG1DbGllbnQ7ICAgLy8gc2VlIGV4cGxhbmF0aW9uIGF0IH5UcmFja0Jhc2UoKSB3aHkgbm90IGNvbnN0CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqIG1DYmxrOworICAgIHNwPElNZW1vcnk+ICAgICAgICAgbUJ1ZmZlck1lbW9yeTsgIC8vIGN1cnJlbnRseSBub24tMCBmb3IgZmFzdCBSZWNvcmRUcmFjayBvbmx5CiAgICAgdm9pZCogICAgICAgICAgICAgICBtQnVmZmVyOyAgICAvLyBzdGFydCBvZiB0cmFjayBidWZmZXIsIHR5cGljYWxseSBpbiBzaGFyZWQgbWVtb3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIE91dHB1dFRyYWNrIHdoZW4gaXQgaXMgaW4gbG9jYWwgbWVtb3J5CiAgICAgLy8gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgYSBsb2NrIGZvciB0aGVzZQpAQCAtMTM2LDEwICsxNTgsMjYgQEAKICAgICBjb25zdCBpbnQgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICBtVWlkOwogICAgIFZlY3RvciA8IHNwPFN5bmNFdmVudD4gPm1TeW5jRXZlbnRzOworICAgIGNvbnN0IElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgbUZsYWdzOwogICAgIGNvbnN0IGJvb2wgICAgICAgICAgbUlzT3V0OwogICAgIFNlcnZlclByb3h5KiAgICAgICAgbVNlcnZlclByb3h5OwogICAgIGNvbnN0IGludCAgICAgICAgICAgbUlkOwogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgbVRlZVNpbms7CiAgICAgc3A8TkJBSU9fU291cmNlPiAgICBtVGVlU291cmNlOwogICAgIGJvb2wgICAgICAgICAgICAgICAgbVRlcm1pbmF0ZWQ7CisgICAgdHJhY2tfdHlwZSAgICAgICAgICBtVHlwZTsgICAgICAvLyBtdXN0IGJlIG9uZSBvZiBUWVBFX0RFRkFVTFQsIFRZUEVfT1VUUFVULCBUWVBFX1BBVENIIC4uLgorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgbVRocmVhZElvSGFuZGxlOyAvLyBJL08gaGFuZGxlIG9mIHRoZSB0aHJlYWQgdGhlIHRyYWNrIGlzIGF0dGFjaGVkIHRvCit9OworCisvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IFBhdGNoVHJhY2sgYW5kIFBhdGNoUmVjb3JkLgorLy8gaXQgcHJvdmlkZXMgYnVmZmVyIGFjY2VzcyBtZXRob2RzIHRoYXQgbWFwIHRob3NlIG9mIGEgQ2xpZW50UHJveHkgKHNlZSBBdWRpb1RyYWNrU2hhcmVkLmgpCitjbGFzcyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIKK3sKK3B1YmxpYzoKKworICAgIHZpcnR1YWwgflBhdGNoUHJveHlCdWZmZXJQcm92aWRlcigpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQgPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcikgPSAwOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggZDZiOTkwOC4uYjkzMDhmYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgpAQCAtMzQsNiArMzUsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC02NiwxMCArNjgsMTMgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICBib29sIGlzT3V0KQorICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGJvb2wgaXNPdXQsCisgICAgICAgICAgICBhbGxvY190eXBlIGFsbG9jLAorICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKQogICAgIDogICBSZWZCYXNlKCksCiAgICAgICAgIG1UaHJlYWQodGhyZWFkKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLApAQCAtNzksMTUgKzg0LDIwIEBACiAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAogICAgICAgICBtRm9ybWF0KGZvcm1hdCksCiAgICAgICAgIG1DaGFubmVsTWFzayhjaGFubmVsTWFzayksCi0gICAgICAgIG1DaGFubmVsQ291bnQocG9wY291bnQoY2hhbm5lbE1hc2spKSwKKyAgICAgICAgbUNoYW5uZWxDb3VudChpc091dCA/CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA6CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spKSwKICAgICAgICAgbUZyYW1lU2l6ZShhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPwogICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgOiBzaXplb2YoaW50OF90KSksCiAgICAgICAgIG1GcmFtZUNvdW50KGZyYW1lQ291bnQpLAogICAgICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCksCisgICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICAgIG1Jc091dChpc091dCksCiAgICAgICAgIG1TZXJ2ZXJQcm94eShOVUxMKSwKICAgICAgICAgbUlkKGFuZHJvaWRfYXRvbWljX2luYygmbmV4dFRyYWNrSWQpKSwKLSAgICAgICAgbVRlcm1pbmF0ZWQoZmFsc2UpCisgICAgICAgIG1UZXJtaW5hdGVkKGZhbHNlKSwKKyAgICAgICAgbVR5cGUodHlwZSksCisgICAgICAgIG1UaHJlYWRJb0hhbmRsZSh0aHJlYWQtPmlkKCkpCiB7CiAgICAgLy8gaWYgdGhlIGNhbGxlciBpcyB1cywgdHJ1c3QgdGhlIHNwZWNpZmllZCB1aWQKICAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZF9jYWNoZWQgfHwgY2xpZW50VWlkID09IC0xKSB7CkBAIC0xMDEsMjcgKzExMSwyMCBAQAogICAgIC8vIGJhdHRlcnkgdXNhZ2Ugb24gaXQuCiAgICAgbVVpZCA9IGNsaWVudFVpZDsKIAotICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKLSAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7Ci0KLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7Ci0KICAgICAvLyBBTE9HRCgiQ3JlYXRpbmcgdHJhY2sgd2l0aCAlZCBidWZmZXJzIEAgJWQgYnl0ZXMiLCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSk7CiAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IChzaGFyZWRCdWZmZXIgPT0gMCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50KSAqIG1GcmFtZVNpemU7Ci0gICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAoYnVmZmVyID09IE5VTEwgPyByb3VuZHVwKGZyYW1lQ291bnQpIDogZnJhbWVDb3VudCkgKiBtRnJhbWVTaXplOworICAgIGlmIChidWZmZXIgPT0gTlVMTCAmJiBhbGxvYyA9PSBBTExPQ19DQkxLKSB7CiAgICAgICAgIHNpemUgKz0gYnVmZmVyU2l6ZTsKICAgICB9CiAKICAgICBpZiAoY2xpZW50ICE9IDApIHsKICAgICAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoc2l6ZSk7Ci0gICAgICAgIGlmIChtQ2Jsa01lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKTsKLSAgICAgICAgICAgIC8vIGNhbid0IGFzc3VtZSBtQ2JsayAhPSBOVUxMCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CisgICAgICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0ldSIsIHNpemUpOwogICAgICAgICAgICAgY2xpZW50LT5oZWFwKCktPmR1bXAoIkF1ZGlvVHJhY2siKTsKKyAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTMzLDIyICsxMzYsNTUgQEAKICAgICAvLyBjb25zdHJ1Y3QgdGhlIHNoYXJlZCBzdHJ1Y3R1cmUgaW4tcGxhY2UuCiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKICAgICAgICAgbmV3KG1DYmxrKSBhdWRpb190cmFja19jYmxrX3QoKTsKLSAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKLSAgICAgICAgbUNibGstPmZyYW1lQ291bnRfID0gZnJhbWVDb3VudDsKLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CisgICAgICAgIHN3aXRjaCAoYWxsb2MpIHsKKyAgICAgICAgY2FzZSBBTExPQ19SRUFET05MWTogeworICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiByb0hlYXAodGhyZWFkLT5yZWFkT25seUhlYXAoKSk7CisgICAgICAgICAgICBpZiAocm9IZWFwID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXJNZW1vcnkgPSByb0hlYXAtPmFsbG9jYXRlKGJ1ZmZlclNpemUpKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyID0gbUJ1ZmZlck1lbW9yeS0+cG9pbnRlcigpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkLW9ubHkgYnVmZmVyIHNpemU9JXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJvSGVhcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJvSGVhcC0+ZHVtcCgiYnVmZmVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeS5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBidWZmZXJTaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfUElQRToKKyAgICAgICAgICAgIG1CdWZmZXJNZW1vcnkgPSB0aHJlYWQtPnBpcGVNZW1vcnkoKTsKKyAgICAgICAgICAgIC8vIG1CdWZmZXIgaXMgdGhlIHZpcnR1YWwgYWRkcmVzcyBhcyBzZWVuIGZyb20gY3VycmVudCBwcm9jZXNzIChtZWRpYXNlcnZlciksCisgICAgICAgICAgICAvLyBhbmQgc2hvdWxkIG5vcm1hbGx5IGJlIGNvbWluZyBmcm9tIG1CdWZmZXJNZW1vcnktPnBvaW50ZXIoKS4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIgaW4gdGhpcyBjYXNlIHRoZSBUcmFja0Jhc2UgZG9lcyBub3QgcmVmZXJlbmNlIHRoZSBidWZmZXIgZGlyZWN0bHkuCisgICAgICAgICAgICAvLyBJdCBzaG91bGQgcmVmZXJlbmNlcyB0aGUgYnVmZmVyIHZpYSB0aGUgcGlwZS4KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgdG8gZGV0ZWN0IGluY29ycmVjdCB1c2FnZSBvZiB0aGUgYnVmZmVyLCB3ZSBzZXQgbUJ1ZmZlciB0byBOVUxMLgorICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTExPQ19DQkxLOgorICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAjaWYgMAotICAgICAgICAgICAgbUNibGstPm1GbGFncyA9IENCTEtfRk9SQ0VSRUFEWTsgICAgLy8gRklYTUUgaGFjaywgbmVlZCB0byBmaXggdGhlIHRyYWNrIHJlYWR5IGxvZ2ljCisgICAgICAgICAgICAgICAgbUNibGstPm1GbGFncyA9IENCTEtfRk9SQ0VSRUFEWTsgICAgLy8gRklYTUUgaGFjaywgbmVlZCB0byBmaXggdGhlIHRyYWNrIHJlYWR5IGxvZ2ljCiAjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX0xPQ0FMOgorICAgICAgICAgICAgbUJ1ZmZlciA9IGNhbGxvYygxLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX05PTkU6CisgICAgICAgICAgICBtQnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHBpcGVGb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIGlmIChwaXBlRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgICAgICAgICBOQkFJT19Gb3JtYXQgcGlwZUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpOworICAgICAgICAgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKHBpcGVGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKG1UZWVTaW5rVHJhY2tGcmFtZXMsIHBpcGVGb3JtYXQpOwogICAgICAgICAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKICAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge3BpcGVGb3JtYXR9OwpAQCAtMTY3LDYgKzIwMywxNyBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OmluaXRDaGVjaygpIGNvbnN0Cit7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChtVHlwZSA9PSBUWVBFX09VVFBVVCB8fCBtVHlwZSA9PSBUWVBFX1BBVENIKSB7CisgICAgICAgIHN0YXR1cyA9IGNibGsoKSAhPSBOVUxMID8gTk9fRVJST1IgOiBOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0Q2JsaygpICE9IDAgPyBOT19FUlJPUiA6IE5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6On5UcmFja0Jhc2UoKQogewogI2lmZGVmIFRFRV9TSU5LCkBAIC0xODMsMTMgKzIzMCwxNSBAQAogICAgIH0KICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOyAgICAvLyBmcmVlIHRoZSBzaGFyZWQgbWVtb3J5IGJlZm9yZSByZWxlYXNpbmcgdGhlIGhlYXAgaXQgYmVsb25ncyB0bwogICAgIGlmIChtQ2xpZW50ICE9IDApIHsKLSAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBydW4gd2l0aCBBdWRpb0ZsaW5nZXIgbXV0ZXggbG9ja2VkCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50LT5hdWRpb0ZsaW5nZXIoKS0+bUxvY2spOworICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBjbGllbnQgbXV0ZXggbG9ja2VkCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50LT5hdWRpb0ZsaW5nZXIoKS0+bUNsaWVudExvY2spOwogICAgICAgICAvLyBJZiB0aGUgY2xpZW50J3MgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8sIHRoZSBhc3NvY2lhdGVkIGRlc3RydWN0b3IKICAgICAgICAgLy8gbXVzdCBydW4gd2l0aCBBdWRpb0ZsaW5nZXIgbG9jayBoZWxkLiBUaHVzIHRoZSBleHBsaWNpdCBjbGVhcigpIHJhdGhlciB0aGFuCiAgICAgICAgIC8vIHJlbHlpbmcgb24gdGhlIGF1dG9tYXRpYyBjbGVhcigpIGF0IGVuZCBvZiBzY29wZS4KICAgICAgICAgbUNsaWVudC5jbGVhcigpOwogICAgIH0KKyAgICAvLyBmbHVzaCB0aGUgYmluZGVyIGNvbW1hbmQgYnVmZmVyCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQpAQCAtMjc1LDYgKzMyNCwxMSBAQAogICAgIGlmICghbVRyYWNrLT5pc1RpbWVkVHJhY2soKSkKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogCisgICAgaWYgKGJ1ZmZlciA9PSAwIHx8IGJ1ZmZlci0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInF1ZXVlVGltZWRCdWZmZXIoKSBidWZmZXIgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjayogdHQgPQogICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjayo+KG1UcmFjay5nZXQoKSk7CiAgICAgcmV0dXJuIHR0LT5xdWV1ZVRpbWVkQnVmZmVyKGJ1ZmZlciwgcHRzKTsKQEAgLTMyNCwxMiArMzc4LDE3IEBACiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncykKLSAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgdHJ1ZSAvKmlzT3V0Ki8pLAorICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSkKKyAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgKHNoYXJlZEJ1ZmZlciAhPSAwKSA/IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpIDogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGZsYWdzLCB0cnVlIC8qaXNPdXQqLywKKyAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfUEFUQ0gpID8gKCBidWZmZXIgPT0gTlVMTCA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSkgOiBBTExPQ19DQkxLLAorICAgICAgICAgICAgICAgICAgdHlwZSksCiAgICAgbUZpbGxpbmdVcFN0YXR1cyhGU19JTlZBTElEKSwKICAgICAvLyBtUmV0cnlDb3VudCBpbml0aWFsaXplZCBsYXRlciB3aGVuIG5lZWRlZAogICAgIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwKQEAgLTMzOSw0NiArMzk4LDU1IEBACiAgICAgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKSwKICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMoMCksCi0gICAgbUZsYWdzKGZsYWdzKSwKICAgICBtRmFzdEluZGV4KC0xKSwKICAgICBtQ2FjaGVkVm9sdW1lKDEuMCksCiAgICAgbUlzSW52YWxpZChmYWxzZSksCiAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShOVUxMKSwKLSAgICBtUmVzdW1lVG9TdG9wcGluZyhmYWxzZSkKKyAgICBtUmVzdW1lVG9TdG9wcGluZyhmYWxzZSksCisgICAgbUZsdXNoSHdQZW5kaW5nKGZhbHNlKSwKKyAgICBtUHJldmlvdXNWYWxpZChmYWxzZSksCisgICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbigwKQorICAgIC8vIG1QcmV2aW91c1RpbWVzdGFtcAogewotICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7Ci0gICAgICAgIC8vIHRvIGF2b2lkIGxlYWtpbmcgYSB0cmFjayBuYW1lLCBkbyBub3QgYWxsb2NhdGUgb25lIHVubGVzcyB0aGVyZSBpcyBhbiBtQ2JsawotICAgICAgICBtTmFtZSA9IHRocmVhZC0+Z2V0VHJhY2tOYW1lX2woY2hhbm5lbE1hc2ssIHNlc3Npb25JZCk7Ci0gICAgICAgIGlmIChtTmFtZSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJubyBtb3JlIHRyYWNrIG5hbWVzIGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIG9ubHkgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGlmIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZSBhIG5vcm1hbCB0cmFjayBuYW1lCi0gICAgICAgIGlmIChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5SXNDYWxsZWRCeU11bHRpcGxlVGhyZWFkcygpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICE9IDApOwotICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCgwIDwgaSAmJiBpIDwgKGludClGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwotICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyB0b28gZWFnZXIuICBXZSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggYmVmb3JlIHRoZQotICAgICAgICAgICAgLy8gICAgICAgZmFzdCB0cmFjayBiZWNvbWVzIGFjdGl2ZS4gIFNpbmNlIGZhc3QgdHJhY2tzIGFyZSBhIHNjYXJjZSByZXNvdXJjZSwKLSAgICAgICAgICAgIC8vICAgICAgIHRoaXMgbWVhbnMgd2UgYXJlIHBvdGVudGlhbGx5IGRlbnlpbmcgb3RoZXIgbW9yZSBpbXBvcnRhbnQgZmFzdCB0cmFja3MgZnJvbQotICAgICAgICAgICAgLy8gICAgICAgYmVpbmcgY3JlYXRlZC4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBhbGxvY2F0ZSB0aGUgaW5kZXggZHluYW1pY2FsbHkuCi0gICAgICAgICAgICBtRmFzdEluZGV4ID0gaTsKLSAgICAgICAgICAgIC8vIFJlYWQgdGhlIGluaXRpYWwgdW5kZXJydW5zIGJlY2F1c2UgdGhpcyBmaWVsZCBpcyBuZXZlciBjbGVhcmVkIGJ5IHRoZSBmYXN0IG1peGVyCi0gICAgICAgICAgICBtT2JzZXJ2ZWRVbmRlcnJ1bnMgPSB0aHJlYWQtPmdldEZhc3RUcmFja1VuZGVycnVucyhpKTsKLSAgICAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7Ci0gICAgICAgIH0KKyAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCisgICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOworCisgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlZCIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAorICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworCisgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBTE9HVigiVHJhY2sgY29uc3RydWN0b3IgbmFtZSAlZCwgY2FsbGluZyBwaWQgJWQiLCBtTmFtZSwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSwgIWlzRXh0ZXJuYWxUcmFjaygpLCBzYW1wbGVSYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKKyAgICB9CisgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKKworICAgIG1OYW1lID0gdGhyZWFkLT5nZXRUcmFja05hbWVfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQpOworICAgIGlmIChtTmFtZSA8IDApIHsKKyAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2sgbmFtZXMgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gb25seSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggaWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGEgbm9ybWFsIHRyYWNrIG5hbWUKKyAgICBpZiAoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CisgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5SXNDYWxsZWRCeU11bHRpcGxlVGhyZWFkcygpOworICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgIT0gMCk7CisgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eih0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2spOworICAgICAgICBBTE9HX0FTU0VSVCgwIDwgaSAmJiBpIDwgKGludClGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOworICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBlYWdlci4gIFdlIGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBiZWZvcmUgdGhlCisgICAgICAgIC8vICAgICAgIGZhc3QgdHJhY2sgYmVjb21lcyBhY3RpdmUuICBTaW5jZSBmYXN0IHRyYWNrcyBhcmUgYSBzY2FyY2UgcmVzb3VyY2UsCisgICAgICAgIC8vICAgICAgIHRoaXMgbWVhbnMgd2UgYXJlIHBvdGVudGlhbGx5IGRlbnlpbmcgb3RoZXIgbW9yZSBpbXBvcnRhbnQgZmFzdCB0cmFja3MgZnJvbQorICAgICAgICAvLyAgICAgICBiZWluZyBjcmVhdGVkLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG9jYXRlIHRoZSBpbmRleCBkeW5hbWljYWxseS4KKyAgICAgICAgbUZhc3RJbmRleCA9IGk7CisgICAgICAgIC8vIFJlYWQgdGhlIGluaXRpYWwgdW5kZXJydW5zIGJlY2F1c2UgdGhpcyBmaWVsZCBpcyBuZXZlciBjbGVhcmVkIGJ5IHRoZSBmYXN0IG1peGVyCisgICAgICAgIG1PYnNlcnZlZFVuZGVycnVucyA9IHRocmVhZC0+Z2V0RmFzdFRyYWNrVW5kZXJydW5zKGkpOworICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOworICAgIH0KIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6On5UcmFjaygpCkBAIC0zOTEsMTEgKzQ1OSwxOCBAQAogICAgIC8vIFRoaXMgcHJldmVudHMgdGhhdCBsZWFrLgogICAgIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwotICAgICAgICAvLyBmbHVzaCB0aGUgYmluZGVyIGNvbW1hbmQgYnVmZmVyCi0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppbml0Q2hlY2soKSBjb25zdAoreworICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWNrQmFzZTo6aW5pdENoZWNrKCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtTmFtZSA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkZXN0cm95KCkKIHsKICAgICAvLyBOT1RFOiBkZXN0cm95VHJhY2tfbCgpIGNhbiByZW1vdmUgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoaXMgVHJhY2sKQEAgLTQwOCwzMSArNDgzLDM0IEBACiAgICAgLy8gdGhpcyBUcmFjayB3aXRoIGl0cyBtZW1iZXIgbVRyYWNrLgogICAgIHNwPFRyYWNrPiBrZWVwKHRoaXMpOwogICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCisgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gcGxheWJhY2tUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwotICAgICAgICAgICAgaWYgKCFpc091dHB1dFRyYWNrKCkgJiYgIXdhc0FjdGl2ZSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRocmVhZC0+aWQoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB3YXNBY3RpdmUgPSBwbGF5YmFja1RocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpICYmICF3YXNBY3RpdmUpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSBDbGllbnQgVHlwZSAgICAgIEZtdCBDaG4gbWFzayBTZXNzaW9uIGZDb3VudCBTIEYgU1JhdGUgICIKKyAgICByZXN1bHQuYXBwZW5kKCIgICAgTmFtZSBBY3RpdmUgQ2xpZW50IFR5cGUgICAgICBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBmQ291bnQgUyBGIFNSYXRlICAiCiAgICAgICAgICAgICAgICAgICAiTCBkQiAgUiBkQiAgICBTZXJ2ZXIgTWFpbiBidWYgIEF1eCBCdWYgRmxhZ3MgVW5kRnJtQ250XG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKIHsKLSAgICB1aW50MzJfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOworICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CiAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICBGICUyZCIsIG1GYXN0SW5kZXgpOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBGICUyZCIsIG1GYXN0SW5kZXgpOworICAgIH0gZWxzZSBpZiAobU5hbWUgPj0gQXVkaW9NaXhlcjo6VFJBQ0swKSB7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgICU0ZCIsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKICAgICB9IGVsc2UgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICU0ZCIsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgbm9uZSIpOwogICAgIH0KICAgICB0cmFja19zdGF0ZSBzdGF0ZSA9IG1TdGF0ZTsKICAgICBjaGFyIHN0YXRlQ2hhcjsKQEAgLTQ4Nyw4ICs1NjUsOSBAQAogICAgICAgICBub3dJblVuZGVycnVuID0gJz8nOwogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgc25wcmludGYoJmJ1ZmZlcls3XSwgc2l6ZS03LCAiICU2dSAlNHUgJTA4WCAlMDhYICU3dSAlNnUgJTFjICUxZCAlNXUgJTUuMmcgJTUuMmcgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTA4WCAweCUwM1ggJTl1JWNcbiIsCisgICAgc25wcmludGYoJmJ1ZmZlcls4XSwgc2l6ZS04LCAiICU2cyAlNnUgJTR1ICUwOFggJTA4WCAlN3UgJTZ6dSAlMWMgJTFkICU1dSAlNS4yZyAlNS4yZyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJXAgJXAgMHglMDNYICU5dSVjXG4iLAorICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgIG1Gb3JtYXQsCkBAIC00OTgsMTEgKzU3NywxMSBAQAogICAgICAgICAgICAgc3RhdGVDaGFyLAogICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKSwKLSAgICAgICAgICAgIDIwLjAgKiBsb2cxMCgodmxyICYgMHhGRkZGKSAvIDQwOTYuMCksCi0gICAgICAgICAgICAyMC4wICogbG9nMTAoKHZsciA+PiAxNikgLyA0MDk2LjApLAorICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCisgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIChpbnQpbU1haW5CdWZmZXIsCi0gICAgICAgICAgICAoaW50KW1BdXhCdWZmZXIsCisgICAgICAgICAgICBtTWFpbkJ1ZmZlciwKKyAgICAgICAgICAgIG1BdXhCdWZmZXIsCiAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0VW5kZXJydW5GcmFtZXMoKSwKICAgICAgICAgICAgIG5vd0luVW5kZXJydW4pOwpAQCAtNTE0LDcgKzU5Myw3IEBACiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0TmV4dEJ1ZmZlcigKLSAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKQorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgX191bnVzZWQpCiB7CiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgc2l6ZV90IGRlc2lyZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CkBAIC01NTEsNyArNjMwLDE0IEBACiAKIC8vIERvbid0IGNhbGwgZm9yIGZhc3QgdHJhY2tzOyB0aGUgZnJhbWVzUmVhZHkoKSBjb3VsZCByZXN1bHQgaW4gcHJpb3JpdHkgaW52ZXJzaW9uCiBib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppc1JlYWR5KCkgY29uc3QgewotICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcgfHwgaXNTdG9wcGVkKCkgfHwgaXNQYXVzaW5nKCkgfHwgaXNTdG9wcGluZygpKSB7CisgICAgaWYgKG1GaWxsaW5nVXBTdGF0dXMgIT0gRlNfRklMTElORyB8fCBpc1N0b3BwZWQoKSB8fCBpc1BhdXNpbmcoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaXNTdG9wcGluZygpKSB7CisgICAgICAgIGlmIChmcmFtZXNSZWFkeSgpID4gMCkgeworICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExFRDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTU2NCw4ICs2NTAsOCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIEFMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLApAQCAtNTg4LDcgKzY3NCwxMCBAQAogICAgICAgICAvLyBoZXJlIHRoZSB0cmFjayBjb3VsZCBiZSBlaXRoZXIgbmV3LCBvciByZXN0YXJ0ZWQKICAgICAgICAgLy8gaW4gYm90aCBjYXNlcyAidW5zdG9wIiB0aGUgdHJhY2sKIAotICAgICAgICBpZiAoc3RhdGUgPT0gUEFVU0VEKSB7CisgICAgICAgIC8vIGluaXRpYWwgc3RhdGUtc3RvcHBpbmcuIG5leHQgc3RhdGUtcGF1c2luZy4KKyAgICAgICAgLy8gV2hhdCBpZiByZXN1bWUgaXMgY2FsbGVkID8KKworICAgICAgICBpZiAoc3RhdGUgPT0gUEFVU0VEIHx8IHN0YXRlID09IFBBVVNJTkcpIHsKICAgICAgICAgICAgIGlmIChtUmVzdW1lVG9TdG9wcGluZykgewogICAgICAgICAgICAgICAgIC8vIGhhcHBlbmVkIHdlIG5lZWQgdG8gcmVzdW1lIHRvIFNUT1BQSU5HXzEKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzE7CkBAIC02NDMsNyArNzMyLDcgQEAKICAgICAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZC0+bUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRoaXMpIDwgMCkgewogICAgICAgICAgICAgICAgIHJlc2V0KCk7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRmFzdFRyYWNrKCkgJiYgIWlzT2ZmbG9hZGVkKCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRmFzdFRyYWNrKCkgJiYgIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUEVEOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBGb3IgZmFzdCB0cmFja3MgcHJlcGFyZVRyYWNrc19sKCkgd2lsbCBzZXQgc3RhdGUgdG8gU1RPUFBJTkdfMgpAQCAtNzE5LDYgKzgwOCw3IEBACiAgICAgICAgICAgICAgICAgbVJldHJ5Q291bnQgPSBQbGF5YmFja1RocmVhZDo6a01heFRyYWNrUmV0cmllc09mZmxvYWQ7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIG1GbHVzaEh3UGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICBtUmVzdW1lVG9TdG9wcGluZyA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVE9QUElOR18xICYmIG1TdGF0ZSAhPSBTVE9QUElOR18yICYmIG1TdGF0ZSAhPSBTVE9QUEVEICYmCkBAIC03MzQsMTYgKzgyNCwyOCBAQAogICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gYWN0aXZlIHRyYWNrIGxpc3QsIHJlc2V0KCksIGFuZCB0cmlnZ2VyIHByZXNlbnRhdGlvbiBjb21wbGV0ZQogICAgICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkLT5tQWN0aXZlVHJhY2tzLmluZGV4T2YodGhpcykgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIERpcmVjdE91dHB1dFRocmVhZCAqdCA9IChEaXJlY3RPdXRwdXRUaHJlYWQgKilwbGF5YmFja1RocmVhZDsKKyAgICAgICAgICAgICAgICAgICAgdC0+Zmx1c2hId19sKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIFByZXZlbnQgZmx1c2ggYmVpbmcgbG9zdCBpZiB0aGUgdHJhY2sgaXMgZmx1c2hlZCBhbmQgdGhlbiByZXN1bWVkCiAgICAgICAgIC8vIGJlZm9yZSBtaXhlciB0aHJlYWQgY2FuIHJ1bi4gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBvZmZsb2FkaW5nCiAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGJ1ZmZlciBjb3VsZCBob2xkIGEgbGFyZ2UgYW1vdW50IG9mIGF1ZGlvCi0gICAgICAgIHBsYXliYWNrVGhyZWFkLT5mbHVzaE91dHB1dF9sKCk7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgIH0KIH0KIAorLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpmbHVzaEFjaygpCit7CisgICAgaWYgKCFpc09mZmxvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtRmx1c2hId1BlbmRpbmcgPSBmYWxzZTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cmVzZXQoKQogewogICAgIC8vIERvIG5vdCByZXNldCB0d2ljZSB0byBhdm9pZCBkaXNjYXJkaW5nIGRhdGEgd3JpdHRlbiBqdXN0IGFmdGVyIGEgZmx1c2ggYW5kIGJlZm9yZQpAQCAtNzc4LDI3ICs4ODAsNjAgQEAKIHsKICAgICAvLyBDbGllbnQgc2hvdWxkIGltcGxlbWVudCB0aGlzIHVzaW5nIFNTUTsgdGhlIHVucHJlc2VudGVkIGZyYW1lIGNvdW50IGluIGxhdGNoIGlzIGlycmVsZXZhbnQKICAgICBpZiAoaXNGYXN0VHJhY2soKSkgeworICAgICAgICAvLyBGSVhNRSBubyBsb2NrIGhlbGQgdG8gc2V0IG1QcmV2aW91c1ZhbGlkID0gZmFsc2UKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgLy8gRklYTUUgbm8gbG9jayBoZWxkIHRvIHNldCBtUHJldmlvdXNWYWxpZCA9IGZhbHNlCiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICBpZiAoIWlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKICAgICAgICAgaWYgKCFwbGF5YmFja1RocmVhZC0+bUxhdGNoUVZhbGlkKSB7CisgICAgICAgICAgICBtUHJldmlvdXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90IHVucHJlc2VudGVkRnJhbWVzID0KICAgICAgICAgICAgICAgICAoKGludDY0X3QpIHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1VbnByZXNlbnRlZEZyYW1lcyAqIG1TYW1wbGVSYXRlKSAvCiAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1TYW1wbGVSYXRlOwotICAgICAgICB1aW50MzJfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKTsKKyAgICAgICAgLy8gRklYTUUgU2luY2Ugd2UncmUgdXNpbmcgYSByYXcgcG9pbnRlciBhcyB0aGUga2V5LCBpdCBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlCisgICAgICAgIC8vICAgICAgIGZvciBhIGJyYW5kIG5ldyB0cmFjayB0byBzaGFyZSB0aGUgc2FtZSBhZGRyZXNzIGFzIGEgcmVjZW50bHkgZGVzdHJveWVkCisgICAgICAgIC8vICAgICAgIHRyYWNrLCBhbmQgdGh1cyBmb3IgdXMgdG8gZ2V0IHRoZSBmcmFtZXMgcmVsZWFzZWQgb2YgdGhlIHdyb25nIHRyYWNrLgorICAgICAgICAvLyAgICAgICBJdCBpcyB1bmxpa2VseSB0aGF0IHdlIHdvdWxkIGJlIGFibGUgdG8gY2FsbCBnZXRUaW1lc3RhbXAoKSBzbyBxdWlja2x5CisgICAgICAgIC8vICAgICAgIHJpZ2h0IGFmdGVyIGNyZWF0aW5nIGEgbmV3IHRyYWNrLiAgTmV2ZXJ0aGVsZXNzLCB0aGUgaW5kZXggaGVyZSBzaG91bGQKKyAgICAgICAgLy8gICAgICAgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgdGhhdCBpcyB1bmlxdWUuICBPciB1c2UgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzdHJhdGVneS4KKyAgICAgICAgc3NpemVfdCBpID0gcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubUZyYW1lc1JlbGVhc2VkLmluZGV4T2ZLZXkodGhpcyk7CisgICAgICAgIHVpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBpID49IDAgPworICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1GcmFtZXNSZWxlYXNlZFtpXSA6CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKTsKKyAgICAgICAgYm9vbCBjaGVja1ByZXZpb3VzVGltZXN0YW1wID0gbVByZXZpb3VzVmFsaWQgJiYgZnJhbWVzV3JpdHRlbiA+PSBtUHJldmlvdXNGcmFtZXNXcml0dGVuOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA8IHVucHJlc2VudGVkRnJhbWVzKSB7CisgICAgICAgICAgICBtUHJldmlvdXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBmcmFtZXNXcml0dGVuIC0gdW5wcmVzZW50ZWRGcmFtZXM7Ci0gICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1UaW1lc3RhbXAubVRpbWU7CisgICAgICAgIG1QcmV2aW91c0ZyYW1lc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuOworICAgICAgICB1aW50MzJfdCBwb3NpdGlvbiA9IGZyYW1lc1dyaXR0ZW4gLSB1bnByZXNlbnRlZEZyYW1lczsKKyAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWUgPSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVGltZXN0YW1wLm1UaW1lOworICAgICAgICBpZiAoY2hlY2tQcmV2aW91c1RpbWVzdGFtcCkgeworICAgICAgICAgICAgaWYgKHRpbWUudHZfc2VjIDwgbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lLnR2X3NlYyB8fAorICAgICAgICAgICAgICAgICAgICAodGltZS50dl9zZWMgPT0gbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lLnR2X3NlYyAmJgorICAgICAgICAgICAgICAgICAgICB0aW1lLnR2X25zZWMgPCBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUudHZfbnNlYykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiVGltZSBpcyBnb2luZyBiYWNrd2FyZHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBvc2l0aW9uIGNhbiBib2JibGUgc2xpZ2h0bHkgYXMgYW4gYXJ0aWZhY3Q7IHRoaXMgaGlkZXMgdGhlIGJvYmJsZQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1JTklNVU1fUE9TSVRJT05fREVMVEEgPSA4dTsKKyAgICAgICAgICAgIGlmICgocG9zaXRpb24gPD0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbikgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uIC0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbikgPCBNSU5JTVVNX1BPU0lUSU9OX0RFTFRBKSB7CisgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uOworICAgICAgICAgICAgICAgIHRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSB0aW1lOworICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIG1QcmV2aW91c1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIApAQCAtODg0LDggKzEwMTksNiBAQAogICAgIH0KIAogICAgIGlmIChmcmFtZXNXcml0dGVuID49IG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyB8fCBpc09mZmxvYWRlZCgpKSB7Ci0gICAgICAgIEFMT0dWKCJwcmVzZW50YXRpb25Db21wbGV0ZSgpIHNlc3Npb24gJWQgY29tcGxldGU6IGZyYW1lc1dyaXR0ZW4gJWQiLAotICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgZnJhbWVzV3JpdHRlbik7CiAgICAgICAgIHRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfUFJFU0VOVEFUSU9OX0NPTVBMRVRFKTsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0U3RyZWFtRW5kRG9uZSgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg5NSw3ICsxMDI4LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6dHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUpCiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW1TeW5jRXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3luY0V2ZW50cy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobVN5bmNFdmVudHNbaV0tPnR5cGUoKSA9PSB0eXBlKSB7CiAgICAgICAgICAgICBtU3luY0V2ZW50c1tpXS0+dHJpZ2dlcigpOwogICAgICAgICAgICAgbVN5bmNFdmVudHMucmVtb3ZlQXQoaSk7CkBAIC05MDYsMjcgKzEwMzksMjcgQEAKIAogLy8gaW1wbGVtZW50IFZvbHVtZUJ1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0Vm9sdW1lTFIoKQorZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFZvbHVtZUxSKCkKIHsKICAgICAvLyBjYWxsZWQgYnkgRmFzdE1peGVyLCBzbyBub3QgYWxsb3dlZCB0byB0YWtlIGFueSBsb2NrcywgYmxvY2ssIG9yIGRvIEkvTyBpbmNsdWRpbmcgbG9ncwogICAgIEFMT0dfQVNTRVJUKGlzRmFzdFRyYWNrKCkgJiYgKG1DYmxrICE9IE5VTEwpKTsKLSAgICB1aW50MzJfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOwotICAgIHVpbnQzMl90IHZsID0gdmxyICYgMHhGRkZGOwotICAgIHVpbnQzMl90IHZyID0gdmxyID4+IDE2OworICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgZmxvYXQgdmwgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgZmxvYXQgdnIgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwogICAgIC8vIHRyYWNrIHZvbHVtZXMgY29tZSBmcm9tIHNoYXJlZCBtZW1vcnksIHNvIGNhbid0IGJlIHRydXN0ZWQgYW5kIG11c3QgYmUgY2xhbXBlZAotICAgIGlmICh2bCA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICB2bCA9IE1BWF9HQUlOX0lOVDsKKyAgICBpZiAodmwgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgIHZsID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICB9Ci0gICAgaWYgKHZyID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgIHZyID0gTUFYX0dBSU5fSU5UOworICAgIGlmICh2ciA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgdnIgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgIH0KICAgICAvLyBub3cgYXBwbHkgdGhlIGNhY2hlZCBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWU7CiAgICAgLy8gdGhpcyBpcyB0cnVzdGVkIGJ1dCBsYWNrcyBhbnkgc3luY2hyb25pemF0aW9uIG9yIGJhcnJpZXIgc28gbWF5IGJlIHN0YWxlCiAgICAgZmxvYXQgdiA9IG1DYWNoZWRWb2x1bWU7CiAgICAgdmwgKj0gdjsKICAgICB2ciAqPSB2OwotICAgIC8vIHJlLWNvbWJpbmUgaW50byBVNC4xNgotICAgIHZsciA9ICh2ciA8PCAxNikgfCAodmwgJiAweEZGRkYpOworICAgIC8vIHJlLWNvbWJpbmUgaW50byBwYWNrZWQgbWluaWZsb2F0CisgICAgdmxyID0gZ2Fpbl9taW5pZmxvYXRfcGFjayhnYWluX2Zyb21fZmxvYXQodmwpLCBnYWluX2Zyb21fZmxvYXQodnIpKTsKICAgICAvLyBGSVhNRSBsb29rIGF0IG11dGUsIHBhdXNlLCBhbmQgc3RvcCBmbGFncwogICAgIHJldHVybiB2bHI7CiB9CkBAIC05NTIsNyArMTA4NSw3IEBACiAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmY2Jsay0+bUZsYWdzKTsKICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKDB4NDAwMDAwMDAsICZjYmxrLT5tRnV0ZXgpOwogICAgIC8vIGNsaWVudCBpcyBub3QgaW4gc2VydmVyLCBzbyBGVVRFWF9XQUtFIGlzIG5lZWRlZCBpbnN0ZWFkIG9mIEZVVEVYX1dBS0VfUFJJVkFURQotICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsIEZVVEVYX1dBS0UsIElOVF9NQVgpOworICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIEZVVEVYX1dBS0UsIElOVF9NQVgpOwogICAgIG1Jc0ludmFsaWQgPSB0cnVlOwogfQogCkBAIC05NjYsNiArMTA5OSwzMyBAQAogICAgIH0KIH0KIAorLy9UbyBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCitib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppc1Jlc3VtZVBlbmRpbmcoKSB7CisKKyAgICBpZiAobVN0YXRlID09IFJFU1VNSU5HKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvKiBSZXN1bWUgaXMgcGVuZGluZyBpZiB0cmFjayB3YXMgc3RvcHBpbmcgYmVmb3JlIHBhdXNlIHdhcyBjYWxsZWQgKi8KKyAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HXzEgJiYKKyAgICAgICAgbVJlc3VtZVRvU3RvcHBpbmcpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnJlc3VtZUFjaygpIHsKKworCisgICAgaWYgKG1TdGF0ZSA9PSBSRVNVTUlORykKKyAgICAgICAgbVN0YXRlID0gQUNUSVZFOworCisgICAgLy8gT3RoZXIgcG9zc2liaWxpdHkgb2YgIHBlbmRpbmcgcmVzdW1lIGlzIHN0b3BwaW5nXzEgc3RhdGUKKyAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSBzdGF0ZSBmcm9tIHN0b3BwaW5nIGFzIHRoaXMgcHJldmVudHMKKyAgICAvLyBkcmFpbiBiZWluZyBjYWxsZWQuCisgICAgaWYgKG1TdGF0ZSA9PSBTVE9QUElOR18xKSB7CisgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nID0gZmFsc2U7CisgICAgfQorfQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUaW1lZFRyYWNrPgpAQCAtOTc5LDcgKzExMzksOCBAQAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgIGludCB1aWQpIHsKKyAgICAgICAgICAgIGludCB1aWQpCit7CiAgICAgaWYgKCFjbGllbnQtPnJlc2VydmVUaW1lZFRyYWNrKCkpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC0xMDAwLDcgKzExNjEsOCBAQAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgIGludCB1aWQpCiAgICAgOiBUcmFjayh0aHJlYWQsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQsIElBdWRpb0ZsaW5nZXI6OlRSQUNLX1RJTUVEKSwKKyAgICAgICAgICAgIGZyYW1lQ291bnQsIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IE5VTEwsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIElBdWRpb0ZsaW5nZXI6OlRSQUNLX1RJTUVELCBUWVBFX1RJTUVEKSwKICAgICAgIG1RdWV1ZUhlYWRJbkZsaWdodChmYWxzZSksCiAgICAgICBtVHJpbVF1ZXVlSGVhZE9uUmVsZWFzZShmYWxzZSksCiAgICAgICBtRnJhbWVzUGVuZGluZ0luUXVldWUoMCksCkBAIC0xMDQ1LDE1ICsxMjA3LDE0IEBACiAKICAgICAgICAgbVRpbWVkTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrVGltZWRCdWZmZXJIZWFwU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVkaW9GbGluZ2VyVGltZWQiKTsKLSAgICAgICAgaWYgKG1UaW1lZE1lbW9yeURlYWxlciA9PSBOVUxMKQorICAgICAgICBpZiAobVRpbWVkTWVtb3J5RGVhbGVyID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBzcDxJTWVtb3J5PiBuZXdCdWZmZXIgPSBtVGltZWRNZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOwotICAgIGlmIChuZXdCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBuZXdCdWZmZXIgPSBtVGltZWRNZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOwotICAgICAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIGlmIChuZXdCdWZmZXIgPT0gMCB8fCBuZXdCdWZmZXItPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgfQogCiAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKQEAgLTExNTIsNyArMTMxMyw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjazo6dXBkYXRlRnJhbWVzUGVuZGluZ0FmdGVyVHJpbV9sKAogICAgICAgICBjb25zdCBUaW1lZEJ1ZmZlciYgYnVmLAotICAgICAgICBjb25zdCBjaGFyKiBsb2dUYWcpIHsKKyAgICAgICAgY29uc3QgY2hhciogbG9nVGFnIF9fdW51c2VkKSB7CiAgICAgdWludDMyX3QgYnVmQnl0ZXMgICAgICAgID0gYnVmLmJ1ZmZlcigpLT5zaXplKCk7CiAgICAgdWludDMyX3QgY29uc3VtZWRBbHJlYWR5ID0gYnVmLnBvc2l0aW9uKCk7CiAKQEAgLTE0NjMsNyArMTYyNCw3IEBACiAgICAgICAgICAgICBtVHJpbVF1ZXVlSGVhZE9uUmVsZWFzZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJUaW1lZFRyYWNrOjpyZWxlYXNlQnVmZmVyIG9mIG5vbi1zaWxlbmNlIGJ1ZmZlciB3aXRoIG5vIgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lZFRyYWNrOjpyZWxlYXNlQnVmZmVyIG9mIG5vbi1zaWxlbmNlIGJ1ZmZlciB3aXRoIG5vIgogICAgICAgICAgICAgICAgICAgIiBidWZmZXJzIGluIHRoZSB0aW1lZCBidWZmZXIgcXVldWUiKTsKICAgICB9CiAKQEAgLTE0OTYsNyArMTY1Nyw3IEBACiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGludCB1aWQpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIE5VTEwsIDAsIHVpZCwgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVCksCisgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgdWlkLCBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxULCBUWVBFX09VVFBVVCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKSwgbUNsaWVudFByb3h5KE5VTEwpCiB7CiAKQEAgLTE1MDQsMTcgKzE2NjUsMTYgQEAKICAgICAgICAgbU91dEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1UcmFja3MuYWRkKHRoaXMpOwogICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2sgY29uc3RydWN0b3IgbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKLSAgICAgICAgICAgICAgICAibUNibGstPmZyYW1lQ291bnRfICV1LCBtQ2hhbm5lbE1hc2sgMHglMDh4IiwKKyAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAldSwgbUNoYW5uZWxNYXNrIDB4JTA4eCIsCiAgICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsCi0gICAgICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnRfLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1DaGFubmVsTWFzayk7CiAgICAgICAgIC8vIHNpbmNlIGNsaWVudCBhbmQgc2VydmVyIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLAogICAgICAgICAvLyB0aGUgYnVmZmVyIGhhcyB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3Mgb24gYm90aCBzaWRlcwotICAgICAgICBtQ2xpZW50UHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBtRnJhbWVDb3VudCwgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIG1DbGllbnRQcm94eS0+c2V0Vm9sdW1lTFIoKHVpbnQzMl90KHVpbnQxNl90KDB4MTAwMCkpIDw8IDE2KSB8IHVpbnQxNl90KDB4MTAwMCkpOwotICAgICAgICBtQ2xpZW50UHJveHktPnNldFNlbmRMZXZlbCgwLjApOwotICAgICAgICBtQ2xpZW50UHJveHktPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAgICAgICAgIG1DbGllbnRQcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplLAogICAgICAgICAgICAgICAgIHRydWUgLypjbGllbnRJblNlcnZlciovKTsKKyAgICAgICAgbUNsaWVudFByb3h5LT5zZXRWb2x1bWVMUihHQUlOX01JTklGTE9BVF9QQUNLRURfVU5JVFkpOworICAgICAgICBtQ2xpZW50UHJveHktPnNldFNlbmRMZXZlbCgwLjApOworICAgICAgICBtQ2xpZW50UHJveHktPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coIkVycm9yIGNyZWF0aW5nIG91dHB1dCB0cmFjayBvbiB0aHJlYWQgJXAiLCBwbGF5YmFja1RocmVhZCk7CiAgICAgfQpAQCAtMTcwNSw2ICsxODY1LDc1IEBACiB9CiAKIAorQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpCisgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICBidWZmZXIsIDAsIDAsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQoreworICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOworICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7CisKKyAgICBBTE9HVigiUGF0Y2hUcmFjayAlcCBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6On5QYXRjaFRyYWNrKCkKK3sKK30KKworLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7CisgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiUGF0Y2hUcmFjaygpICVwIGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CisgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9CisgICAgc3RhdHVzID0gVHJhY2s6OmdldE5leHRCdWZmZXIoYnVmZmVyLCBwdHMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OworICAgIG1QZWVyUHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1Zik7CisgICAgVHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6Om9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0KQoreworICAgIHJldHVybiBtUHJveHktPm9idGFpbkJ1ZmZlcihidWZmZXIsIHRpbWVPdXQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKSAmIENCTEtfRElTQUJMRUQpIHsKKyAgICAgICAgQUxPR1coIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciKTsKKyAgICAgICAgc3RhcnQoKTsKKyAgICB9CisgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GT1JDRVJFQURZLCAmbUNibGstPm1GbGFncyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUmVjb3JkCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzIxLDEwICsxOTUwLDYgQEAKICAgICBtUmVjb3JkVHJhY2stPmRlc3Ryb3koKTsKIH0KIAotc3A8SU1lbW9yeT4gQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OmdldENibGsoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SZWNvcmRUcmFjay0+Z2V0Q2JsaygpOwotfQotCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LAogICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24pIHsKICAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdGFydCgpIik7CkBAIC0xNzQ4LDcgKzE5NzMsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIFJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCisvLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6UmVjb3JkVHJhY2soCiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCwKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKQEAgLTE3NTYsMjggKzE5ODEsNTkgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAotICAgICAgICAgICAgaW50IHVpZCkKKyAgICAgICAgICAgIGludCB1aWQsCisgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCAwIC8qc2hhcmVkQnVmZmVyKi8sIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8pLAotICAgICAgICBtT3ZlcmZsb3coZmFsc2UpCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgIGZsYWdzLCBmYWxzZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX0RFRkFVTFQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpID8gQUxMT0NfUElQRSA6IEFMTE9DX0NCTEspIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChidWZmZXIgPT0gTlVMTCkgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpLAorICAgICAgICAgICAgICAgICAgdHlwZSksCisgICAgICAgIG1PdmVyZmxvdyhmYWxzZSksIG1SZXNhbXBsZXIoTlVMTCksIG1Sc21wT3V0QnVmZmVyKE5VTEwpLCBtUnNtcE91dEZyYW1lQ291bnQoMCksCisgICAgICAgIC8vIFNlZSByZWFsIGluaXRpYWxpemF0aW9uIG9mIG1Sc21wSW5Gcm9udCBhdCBSZWNvcmRUaHJlYWQ6OnN0YXJ0KCkKKyAgICAgICAgbVJzbXBJblVucmVsKDApLCBtUnNtcEluRnJvbnQoMCksIG1GcmFtZXNUb0Ryb3AoMCksIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcihOVUxMKQogewotICAgIEFMT0dWKCJSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciIpOwotICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZFNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1JlY29yZFNlcnZlclByb3h5OworICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2VydmVyUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCAhaXNFeHRlcm5hbFRyYWNrKCkpOworCisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOworICAgIC8vIEZJWE1FIEkgZG9uJ3QgdW5kZXJzdGFuZCBlaXRoZXIgb2YgdGhlIGNoYW5uZWwgY291bnQgY2hlY2tzCisgICAgaWYgKHRocmVhZC0+bVNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSAmJiB0aHJlYWQtPm1DaGFubmVsQ291bnQgPD0gRkNDXzIgJiYKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA8PSBGQ0NfMikgeworICAgICAgICAvLyBzaW5rIFNSCisgICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIHNvdXJjZSBTUgorICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHRocmVhZC0+bVNhbXBsZVJhdGUpOworICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCwgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciA9IG5ldyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcih0aGlzKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwgPSBmYWxzZTsKICAgICB9CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6flJlY29yZFRyYWNrKCkKIHsKICAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIG1SZXNhbXBsZXI7CisgICAgZGVsZXRlW10gbVJzbXBPdXRCdWZmZXI7CisgICAgZGVsZXRlIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKLSAgICAgICAgaW50NjRfdCBwdHMpCisgICAgICAgIGludDY0X3QgcHRzIF9fdW51c2VkKQogewogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKQEAgLTE4MDgsOCArMjA2NCw4IEBACiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgaWYgKHJlY29yZFRocmVhZC0+c3RvcCh0aGlzKSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChyZWNvcmRUaHJlYWQtPmlkKCkpOworICAgICAgICBpZiAocmVjb3JkVGhyZWFkLT5zdG9wKHRoaXMpICYmIGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1UaHJlYWRJb0hhbmRsZSwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE4MTksMTIgKzIwNzUsMTQgQEAKICAgICAvLyBzZWUgY29tbWVudHMgYXQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmRlc3Ryb3koKQogICAgIHNwPFJlY29yZFRyYWNrPiBrZWVwKHRoaXMpOwogICAgIHsKKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gUkVTVU1JTkcpIHsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1UaHJlYWRJb0hhbmRsZSwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVRocmVhZElvSGFuZGxlLCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQpOworICAgICAgICB9CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQodGhyZWFkLT5pZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQodGhyZWFkLT5pZCgpKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWQuZ2V0KCk7CiAgICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwpAQCAtMTgzOSwyNSArMjA5NywxMTcgQEAKICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZjYmxrLT5tRmxhZ3MpOwogICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoMHg0MDAwMDAwMCwgJmNibGstPm1GdXRleCk7CiAgICAgLy8gY2xpZW50IGlzIG5vdCBpbiBzZXJ2ZXIsIHNvIEZVVEVYX1dBS0UgaXMgbmVlZGVkIGluc3RlYWQgb2YgRlVURVhfV0FLRV9QUklWQVRFCi0gICAgKHZvaWQpIF9fZnV0ZXhfc3lzY2FsbDMoJmNibGstPm1GdXRleCwgRlVURVhfV0FLRSwgSU5UX01BWCk7CisgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgRlVURVhfV0FLRSwgSU5UX01BWCk7CiB9CiAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IEZtdCBDaG4gbWFzayBTZXNzaW9uIFMgICBTZXJ2ZXIgZkNvdW50XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICAgQWN0aXZlIENsaWVudCBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBTICAgU2VydmVyIGZDb3VudCBTUmF0ZVxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2dVxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAgJTZzICU2dSAlM3UgJTA4WCAlN3UgJTFkICUwOFggJTZ6dSAlNXVcbiIsCisgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbVN0YXRlLAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCi0gICAgICAgICAgICBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCit7CisgICAgaWYgKGV2ZW50ID09IG1TeW5jU3RhcnRFdmVudCkgeworICAgICAgICBzc2l6ZV90IGZyYW1lc1RvRHJvcCA9IDA7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZEJhc2UgIT0gMCkgeworICAgICAgICAgICAgLy8gVE9ETzogdXNlIGFjdHVhbCBidWZmZXIgZmlsbGluZyBzdGF0dXMgaW5zdGVhZCBvZiAyIGJ1ZmZlcnMgd2hlbiBpbmZvIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgLy8gZnJvbSBhdWRpbyBIQUwKKyAgICAgICAgICAgIGZyYW1lc1RvRHJvcCA9IHRocmVhZEJhc2UtPm1GcmFtZUNvdW50ICogMjsKKyAgICAgICAgfQorICAgICAgICBtRnJhbWVzVG9Ecm9wID0gZnJhbWVzVG9Ecm9wOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmNsZWFyU3luY1N0YXJ0RXZlbnQoKQoreworICAgIGlmIChtU3luY1N0YXJ0RXZlbnQgIT0gMCkgeworICAgICAgICBtU3luY1N0YXJ0RXZlbnQtPmNhbmNlbCgpOworICAgICAgICBtU3luY1N0YXJ0RXZlbnQuY2xlYXIoKTsKKyAgICB9CisgICAgbUZyYW1lc1RvRHJvcCA9IDA7Cit9CisKKworQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncykKKyAgICA6ICAgUmVjb3JkVHJhY2socmVjb3JkVGhyZWFkLCBOVUxMLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIGJ1ZmZlciwgMCwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCit7CisgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOworICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7CisKKyAgICBBTE9HVigiUGF0Y2hSZWNvcmQgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1QZWVyVGltZW91dC50dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1QZWVyVGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCkpOworfQorCitBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6On5QYXRjaFJlY29yZCgpCit7Cit9CisKKy8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKKyAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyKCZidWYsICZtUGVlclRpbWVvdXQpOworICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAiUGF0Y2hSZWNvcmQoKSAlcCBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CisgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9CisgICAgc3RhdHVzID0gUmVjb3JkVHJhY2s6OmdldE5leHRCdWZmZXIoYnVmZmVyLCBwdHMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OworICAgIG1QZWVyUHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1Zik7CisgICAgVHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6b2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCkKK3sKKyAgICByZXR1cm4gbVByb3h5LT5vYnRhaW5CdWZmZXIoYnVmZmVyLCB0aW1lT3V0KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwCmluZGV4IDdhMzE0Y2YuLjg0YTY1NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAKQEAgLTE0LDggKzE0LDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMjQsODEgKzIyLDExNCBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RydWN0IEhlYWRlcldhdiB7Ci0gICAgSGVhZGVyV2F2KHNpemVfdCBzaXplLCBpbnQgbmMsIGludCBzciwgaW50IGJpdHMpIHsKLSAgICAgICAgc3RybmNweShSSUZGLCAiUklGRiIsIDQpOwotICAgICAgICBjaHVua1NpemUgPSBzaXplICsgc2l6ZW9mKEhlYWRlcldhdik7Ci0gICAgICAgIHN0cm5jcHkoV0FWRSwgIldBVkUiLCA0KTsKLSAgICAgICAgc3RybmNweShmbXQsICAiZm10ICIsIDQpOwotICAgICAgICBmbXRTaXplID0gMTY7Ci0gICAgICAgIGF1ZGlvRm9ybWF0ID0gMTsKLSAgICAgICAgbnVtQ2hhbm5lbHMgPSBuYzsKLSAgICAgICAgc2FtcGxlc1JhdGUgPSBzcjsKLSAgICAgICAgYnl0ZVJhdGUgPSBzciAqIG51bUNoYW5uZWxzICogKGJpdHMvOCk7Ci0gICAgICAgIGFsaWduID0gbmMqKGJpdHMvOCk7Ci0gICAgICAgIGJpdHNQZXJTYW1wbGUgPSBiaXRzOwotICAgICAgICBzdHJuY3B5KGRhdGEsICJkYXRhIiwgNCk7Ci0gICAgICAgIGRhdGFTaXplID0gc2l6ZTsKLSAgICB9Ci0KLSAgICBjaGFyIFJJRkZbNF07ICAgICAgICAgICAvLyBSSUZGCi0gICAgdWludDMyX3QgY2h1bmtTaXplOyAgICAgLy8gRmlsZSBzaXplCi0gICAgY2hhciBXQVZFWzRdOyAgICAgICAgLy8gV0FWRQotICAgIGNoYXIgZm10WzRdOyAgICAgICAgICAgIC8vIGZtdFwwCi0gICAgdWludDMyX3QgZm10U2l6ZTsgICAgICAgLy8gZm10IHNpemUKLSAgICB1aW50MTZfdCBhdWRpb0Zvcm1hdDsgICAvLyAxPVBDTQotICAgIHVpbnQxNl90IG51bUNoYW5uZWxzOyAgIC8vIG51bSBjaGFubmVscwotICAgIHVpbnQzMl90IHNhbXBsZXNSYXRlOyAgIC8vIHNhbXBsZSByYXRlIGluIGh6Ci0gICAgdWludDMyX3QgYnl0ZVJhdGU7ICAgICAgLy8gQnBzCi0gICAgdWludDE2X3QgYWxpZ247ICAgICAgICAgLy8gMj0xNi1iaXQgbW9ubywgND0xNi1iaXQgc3RlcmVvCi0gICAgdWludDE2X3QgYml0c1BlclNhbXBsZTsgLy8gYml0cyBwZXIgc2FtcGxlCi0gICAgY2hhciBkYXRhWzRdOyAgICAgICAgICAgLy8gImRhdGEiCi0gICAgdWludDMyX3QgZGF0YVNpemU7ICAgICAgLy8gc2l6ZQotfTsKK3N0YXRpYyBib29sIGdWZXJib3NlID0gZmFsc2U7CiAKIHN0YXRpYyBpbnQgdXNhZ2UoY29uc3QgY2hhciogbmFtZSkgewotICAgIGZwcmludGYoc3RkZXJyLCJVc2FnZTogJXMgWy1wXSBbLWhdIFstc10gWy1xIHtkcXxscXxtcXxocXx2aHF9XSBbLWkgaW5wdXQtc2FtcGxlLXJhdGVdICIKLSAgICAgICAgICAgICAgICAgICAiWy1vIG91dHB1dC1zYW1wbGUtcmF0ZV0gWzxpbnB1dC1maWxlPl0gPG91dHB1dC1maWxlPlxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsIlVzYWdlOiAlcyBbLXBdIFstZl0gWy1GXSBbLXZdIFstYyBjaGFubmVsc10iCisgICAgICAgICAgICAgICAgICAgIiBbLXEge2RxfGxxfG1xfGhxfHZocXxkbHF8ZG1xfGRocX1dIgorICAgICAgICAgICAgICAgICAgICIgWy1pIGlucHV0LXNhbXBsZS1yYXRlXSBbLW8gb3V0cHV0LXNhbXBsZS1yYXRlXSIKKyAgICAgICAgICAgICAgICAgICAiIFstTyBjc3ZdIFstUCBjc3ZdIFs8aW5wdXQtZmlsZT5dIgorICAgICAgICAgICAgICAgICAgICIgPG91dHB1dC1maWxlPlxuIiwgbmFtZSk7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAtcCAgICBlbmFibGUgcHJvZmlsaW5nXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1oICAgIGNyZWF0ZSB3YXYgZmlsZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsIiAgICAtcyAgICBzdGVyZW9cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWYgICAgZW5hYmxlIGZpbHRlciBwcm9maWxpbmdcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLUYgICAgZW5hYmxlIGZsb2F0aW5nIHBvaW50IC1xIHtkbHF8ZG1xfGRocX0gb25seSIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXYgICAgdmVyYm9zZSA6IGxvZyBidWZmZXIgcHJvdmlkZXIgY2FsbHNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWMgICAgIyBjaGFubmVscyAoMS0yIGZvciBscXxtcXxocTsgMS04IGZvciBkbHF8ZG1xfGRocSlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXEgICAgcmVzYW1wbGVyIHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRxICA6IGRlZmF1bHQgcXVhbGl0eVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgbHEgIDogbG93IHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIG1xICA6IG1lZGl1bSBxdWFsaXR5XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBocSAgOiBoaWdoIHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIHZocSA6IHZlcnkgaGlnaCBxdWFsaXR5XG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1pICAgIGlucHV0IGZpbGUgc2FtcGxlIHJhdGVcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRscSA6IGR5bmFtaWMgbG93IHF1YWxpdHlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRtcSA6IGR5bmFtaWMgbWVkaXVtIHF1YWxpdHlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRocSA6IGR5bmFtaWMgaGlnaCBxdWFsaXR5XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1pICAgIGlucHV0IGZpbGUgc2FtcGxlIHJhdGUgKGlnbm9yZWQgaWYgaW5wdXQgZmlsZSBpcyBzcGVjaWZpZWQpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1vICAgIG91dHB1dCBmaWxlIHNhbXBsZSByYXRlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1PICAgICMgZnJhbWVzIG91dHB1dCBwZXIgY2FsbCB0byByZXNhbXBsZSgpIGluIENTViBmb3JtYXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLVAgICAgIyBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwgdG8gcmVzYW1wbGUoKSBpbiBDU1YgZm9ybWF0XG4iKTsKICAgICByZXR1cm4gLTE7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKy8vIENvbnZlcnQgYSBsaXN0IG9mIGludGVnZXJzIGluIENTViBmb3JtYXQgdG8gYSBWZWN0b3Igb2YgdGhvc2UgdmFsdWVzLgorLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LCBvciAtMSBvbiBlcnJvci4KK2ludCBwYXJzZUNTVihjb25zdCBjaGFyICpzdHJpbmcsIFZlY3RvcjxpbnQ+JiB2YWx1ZXMpCit7CisgICAgLy8gcGFzcyAxOiBjb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBhbmQgZG8gc3ludGF4IGNoZWNrCisgICAgc2l6ZV90IG51bVZhbHVlcyA9IDA7CisgICAgYm9vbCBoYWREaWdpdCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgY2hhciAqcCA9IHN0cmluZzsgOyApIHsKKyAgICAgICAgc3dpdGNoICgqcCsrKSB7CisgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgICAgICAgaGFkRGlnaXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIC8vIHBhc3MgMjogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdmVjdG9yIG9mIHZhbHVlcworICAgICAgICAgICAgICAgIHZhbHVlcy5yZXNpemUoKytudW1WYWx1ZXMpOworICAgICAgICAgICAgICAgIHZhbHVlcy5lZGl0SXRlbUF0KDApID0gYXRvaShwID0gb3B0YXJnKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bVZhbHVlczsgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCsrID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmVkaXRJdGVtQXQoaSsrKSA9IGF0b2kocCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bVZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIGhhZERpZ2l0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbnVtVmFsdWVzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KK30KIAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICAgIGNvbnN0IGNoYXIqIGNvbnN0IHByb2duYW1lID0gYXJndlswXTsKLSAgICBib29sIHByb2ZpbGluZyA9IGZhbHNlOwotICAgIGJvb2wgd3JpdGVIZWFkZXIgPSBmYWxzZTsKKyAgICBib29sIHByb2ZpbGVSZXNhbXBsZSA9IGZhbHNlOworICAgIGJvb2wgcHJvZmlsZUZpbHRlciA9IGZhbHNlOworICAgIGJvb2wgdXNlRmxvYXQgPSBmYWxzZTsKICAgICBpbnQgY2hhbm5lbHMgPSAxOwogICAgIGludCBpbnB1dF9mcmVxID0gMDsKICAgICBpbnQgb3V0cHV0X2ZyZXEgPSAwOwogICAgIEF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKKyAgICBWZWN0b3I8aW50PiBPdmFsdWVzOworICAgIFZlY3RvcjxpbnQ+IFB2YWx1ZXM7CiAKICAgICBpbnQgY2g7Ci0gICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAicGhzcTppOm86IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAicGZGdmM6cTppOm86TzpQOiIpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgcHJvZmlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHByb2ZpbGVSZXNhbXBsZSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICB3cml0ZUhlYWRlciA9IHRydWU7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgcHJvZmlsZUZpbHRlciA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICBjaGFubmVscyA9IDI7CisgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgdXNlRmxvYXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgZ1ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgY2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAncSc6CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJkcSIpKQpAQCAtMTExLDYgKzE0MiwxMiBAQAogICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZOwogICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJ2aHEiKSkKICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJkbHEiKSkKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZG1xIikpCisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFk7CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImRocSIpKQorICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWTsKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHVzYWdlKHByb2duYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xMjIsMTIgKzE1OSwzNSBAQAogICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgIG91dHB1dF9mcmVxID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ08nOgorICAgICAgICAgICAgaWYgKHBhcnNlQ1NWKG9wdGFyZywgT3ZhbHVlcykgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvcnJlY3Qgc3ludGF4IGZvciAtTyBvcHRpb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgIGlmIChwYXJzZUNTVihvcHRhcmcsIFB2YWx1ZXMpIDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb3JyZWN0IHN5bnRheCBmb3IgLVAgb3B0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB1c2FnZShwcm9nbmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBpZiAoY2hhbm5lbHMgPCAxCisgICAgICAgICAgICB8fCBjaGFubmVscyA+IChxdWFsaXR5IDwgQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSA/IDIgOiA4KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzICVkXG4iLCBjaGFubmVscyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHVzZUZsb2F0ICYmIHF1YWxpdHkgPCBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmxvYXQgcHJvY2Vzc2luZyBpcyBvbmx5IHBvc3NpYmxlIGZvciBkeW5hbWljIHJlc2FtcGxlcnNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgYXJnYyAtPSBvcHRpbmQ7CiAgICAgYXJndiArPSBvcHRpbmQ7CiAKQEAgLTE0OCwyNSArMjA4LDIyIEBACiAgICAgc2l6ZV90IGlucHV0X3NpemU7CiAgICAgdm9pZCogaW5wdXRfdmFkZHI7CiAgICAgaWYgKGFyZ2MgPT0gMikgewotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgICAgaWYgKHN0YXQoZmlsZV9pbiwgJnN0KSA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3RhdDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFNGX0lORk8gaW5mbzsKKyAgICAgICAgaW5mby5mb3JtYXQgPSAwOworICAgICAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4oZmlsZV9pbiwgU0ZNX1JFQUQsICZpbmZvKTsKKyAgICAgICAgaWYgKHNmID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBlcnJvcihmaWxlX2luKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgICAgIH0KLQotICAgICAgICBpbnQgaW5wdXRfZmQgPSBvcGVuKGZpbGVfaW4sIE9fUkRPTkxZKTsKLSAgICAgICAgaWYgKGlucHV0X2ZkIDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlucHV0X3NpemUgPSBzdC5zdF9zaXplOwotICAgICAgICBpbnB1dF92YWRkciA9IG1tYXAoMCwgaW5wdXRfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgaW5wdXRfZmQsIDApOwotICAgICAgICBpZiAoaW5wdXRfdmFkZHIgPT0gTUFQX0ZBSUxFRCApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibW1hcDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgaW5wdXRfc2l6ZSA9IGluZm8uZnJhbWVzICogaW5mby5jaGFubmVscyAqIHNpemVvZihzaG9ydCk7CisgICAgICAgIGlucHV0X3ZhZGRyID0gbWFsbG9jKGlucHV0X3NpemUpOworICAgICAgICAodm9pZCkgc2ZfcmVhZGZfc2hvcnQoc2YsIChzaG9ydCAqKSBpbnB1dF92YWRkciwgaW5mby5mcmFtZXMpOworICAgICAgICBzZl9jbG9zZShzZik7CisgICAgICAgIGNoYW5uZWxzID0gaW5mby5jaGFubmVsczsKKyAgICAgICAgaW5wdXRfZnJlcSA9IGluZm8uc2FtcGxlcmF0ZTsKICAgICB9IGVsc2UgeworICAgICAgICAvLyBkYXRhIGZvciB0ZXN0aW5nIGlzIGV4YWN0bHkgKGlucHV0IHNhbXBsaW5nIHJhdGUvMTAwMCkvMiBzZWNvbmRzCisgICAgICAgIC8vIHNvIDQ0LjFraHogaW5wdXQgaXMgMjIuMDUgc2Vjb25kcwogICAgICAgICBkb3VibGUgayA9IDEwMDA7IC8vIEh6IC8gcwogICAgICAgICBkb3VibGUgdGltZSA9IChpbnB1dF9mcmVxIC8gMikgLyBrOwogICAgICAgICBzaXplX3QgaW5wdXRfZnJhbWVzID0gc2l6ZV90KGlucHV0X2ZyZXEgKiB0aW1lKTsKQEAgLTE3Nyw5OCArMjM0LDI3NiBAQAogICAgICAgICAgICAgZG91YmxlIHQgPSBkb3VibGUoaSkgLyBpbnB1dF9mcmVxOwogICAgICAgICAgICAgZG91YmxlIHkgPSBzaW4oTV9QSSAqIGsgKiB0ICogdCk7CiAgICAgICAgICAgICBpbnQxNl90IHlpID0gZmxvb3IoeSAqIDMyNzY3LjAgKyAwLjUpOwotICAgICAgICAgICAgZm9yIChzaXplX3Qgaj0wIDsgajwoc2l6ZV90KWNoYW5uZWxzIDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW5baSpjaGFubmVscyArIGpdID0geWkgLyAoMStqKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgIGluW2kqY2hhbm5lbHMgKyBqXSA9IHlpIC8gKDEgKyBqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICBzaXplX3QgaW5wdXRfZnJhbWVzaXplID0gY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgc2l6ZV90IGlucHV0X2ZyYW1lcyA9IGlucHV0X3NpemUgLyBpbnB1dF9mcmFtZXNpemU7CisKKyAgICAvLyBGb3IgZmxvYXQgcHJvY2Vzc2luZywgY29udmVydCBpbnB1dCBpbnQxNl90IHRvIGZsb2F0IGFycmF5CisgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgIHZvaWQgKm5ld192YWRkcjsKKworICAgICAgICBpbnB1dF9mcmFtZXNpemUgPSBjaGFubmVscyAqIHNpemVvZihmbG9hdCk7CisgICAgICAgIGlucHV0X3NpemUgPSBpbnB1dF9mcmFtZXMgKiBpbnB1dF9mcmFtZXNpemU7CisgICAgICAgIG5ld192YWRkciA9IG1hbGxvYyhpbnB1dF9zaXplKTsKKyAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihuZXdfdmFkZHIpLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGlucHV0X3ZhZGRyKSwgaW5wdXRfZnJhbWVzICogY2hhbm5lbHMpOworICAgICAgICBmcmVlKGlucHV0X3ZhZGRyKTsKKyAgICAgICAgaW5wdXRfdmFkZHIgPSBuZXdfdmFkZHI7CisgICAgfQogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgY2xhc3MgUHJvdmlkZXI6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLSAgICAgICAgaW50MTZfdCogbUFkZHI7Ci0gICAgICAgIHNpemVfdCBtTnVtRnJhbWVzOworICAgICAgICBjb25zdCB2b2lkKiAgICAgbUFkZHI7ICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgIGNvbnN0IHNpemVfdCAgICBtTnVtRnJhbWVzOyAvLyB0b3RhbCBmcmFtZXMKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1GcmFtZVNpemU7IC8vIHNpemUgb2YgZWFjaCBmcmFtZSBpbiBieXRlcworICAgICAgICBzaXplX3QgICAgICAgICAgbU5leHRGcmFtZTsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBwcm92aWRlCisgICAgICAgIHNpemVfdCAgICAgICAgICBtVW5yZWw7ICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIG5vdCB5ZXQgcmVsZWFzZWQKKyAgICAgICAgY29uc3QgVmVjdG9yPGludD4gbVB2YWx1ZXM7IC8vIG51bWJlciBvZiBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwKKyAgICAgICAgc2l6ZV90ICAgICAgICAgIG1OZXh0UGlkeDsgIC8vIGluZGV4IG9mIG5leHQgZW50cnkgaW4gbVB2YWx1ZXMgdG8gdXNlCiAgICAgcHVibGljOgotICAgICAgICBQcm92aWRlcihjb25zdCB2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGNoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQWRkciA9IChpbnQxNl90KikgYWRkcjsKLSAgICAgICAgICAgIG1OdW1GcmFtZXMgPSBzaXplIC8gKGNoYW5uZWxzKnNpemVvZihpbnQxNl90KSk7CisgICAgICAgIFByb3ZpZGVyKGNvbnN0IHZvaWQqIGFkZHIsIHNpemVfdCBmcmFtZXMsIHNpemVfdCBmcmFtZVNpemUsIGNvbnN0IFZlY3RvcjxpbnQ+JiBQdmFsdWVzKQorICAgICAgICAgIDogbUFkZHIoYWRkciksCisgICAgICAgICAgICBtTnVtRnJhbWVzKGZyYW1lcyksCisgICAgICAgICAgICBtRnJhbWVTaXplKGZyYW1lU2l6ZSksCisgICAgICAgICAgICBtTmV4dEZyYW1lKDApLCBtVW5yZWwoMCksIG1QdmFsdWVzKFB2YWx1ZXMpLCBtTmV4dFBpZHgoMCkgewogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyA9IGtJbnZhbGlkUFRTKSB7Ci0gICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtTnVtRnJhbWVzOwotICAgICAgICAgICAgYnVmZmVyLT5pMTYgPSBtQWRkcjsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICh2b2lkKXB0czsgLy8gc3VwcHJlc3Mgd2FybmluZworICAgICAgICAgICAgc2l6ZV90IHJlcXVlc3RlZEZyYW1lcyA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRGcmFtZXMgPiBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtUHZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcHJvdmlkZWQgPSBtUHZhbHVlc1ttTmV4dFBpZHgrK107CisgICAgICAgICAgICAgICAgcHJpbnRmKCJtUHZhbHVlWyV6dV09JXp1IG5vdCAlenVcbiIsIG1OZXh0UGlkeC0xLCBwcm92aWRlZCwgYnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQgPCBidWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gcHJvdmlkZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtTmV4dFBpZHggPj0gbVB2YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0UGlkeCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJnZXROZXh0QnVmZmVyKCkgcmVxdWVzdGVkICV6dSBmcmFtZXMgb3V0IG9mICV6dSBmcmFtZXMgYXZhaWxhYmxlLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIHJldHVybmVkICV6dSBmcmFtZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGcmFtZXMsIChzaXplX3QpIChtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSksIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVW5yZWwgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIgKiltQWRkciArIG1GcmFtZVNpemUgKiBtTmV4dEZyYW1lOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtVW5yZWwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIHJlbGVhc2VCdWZmZXIoKSByZWxlYXNlZCAlenUgZnJhbWVzIGJ1dCBvbmx5ICV6dSBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInRvIHJlbGVhc2VcbiIsIGJ1ZmZlci0+ZnJhbWVDb3VudCwgbVVucmVsKTsKKyAgICAgICAgICAgICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKKyAgICAgICAgICAgICAgICBtVW5yZWwgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJyZWxlYXNlQnVmZmVyKCkgcmVsZWFzZWQgJXp1IGZyYW1lcyBvdXQgb2YgJXp1IGZyYW1lcyBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byByZWxlYXNlXG4iLCBidWZmZXItPmZyYW1lQ291bnQsIG1VbnJlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgIG1VbnJlbCAtPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOwogICAgICAgICB9Ci0gICAgfSBwcm92aWRlcihpbnB1dF92YWRkciwgaW5wdXRfc2l6ZSwgY2hhbm5lbHMpOworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgbU5leHRGcmFtZSA9IDA7CisgICAgICAgIH0KKyAgICB9IHByb3ZpZGVyKGlucHV0X3ZhZGRyLCBpbnB1dF9mcmFtZXMsIGlucHV0X2ZyYW1lc2l6ZSwgUHZhbHVlcyk7CiAKLSAgICBzaXplX3QgaW5wdXRfZnJhbWVzID0gaW5wdXRfc2l6ZSAvIChjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgc2l6ZV90IG91dHB1dF9zaXplID0gMiAqIDQgKiAoKGludDY0X3QpIGlucHV0X2ZyYW1lcyAqIG91dHB1dF9mcmVxKSAvIGlucHV0X2ZyZXE7Ci0gICAgb3V0cHV0X3NpemUgJj0gfjc7IC8vIGFsd2F5cyBzdGVyZW8sIDMyLWJpdHMKKyAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCIlenUgaW5wdXQgZnJhbWVzXG4iLCBpbnB1dF9mcmFtZXMpOworICAgIH0KIAotICAgIHZvaWQqIG91dHB1dF92YWRkciA9IG1hbGxvYyhvdXRwdXRfc2l6ZSk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gdXNlRmxvYXQgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgaW50IG91dHB1dF9jaGFubmVscyA9IGNoYW5uZWxzID4gMiA/IGNoYW5uZWxzIDogMjsgLy8gb3V0cHV0IGlzIGF0IGxlYXN0IHN0ZXJlbyBzYW1wbGVzCisgICAgc2l6ZV90IG91dHB1dF9mcmFtZXNpemUgPSBvdXRwdXRfY2hhbm5lbHMgKiAodXNlRmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDMyX3QpKTsKKyAgICBzaXplX3Qgb3V0cHV0X2ZyYW1lcyA9ICgoaW50NjRfdCkgaW5wdXRfZnJhbWVzICogb3V0cHV0X2ZyZXEpIC8gaW5wdXRfZnJlcTsKKyAgICBzaXplX3Qgb3V0cHV0X3NpemUgPSBvdXRwdXRfZnJhbWVzICogb3V0cHV0X2ZyYW1lc2l6ZTsKIAotICAgIGlmIChwcm9maWxpbmcpIHsKLSAgICAgICAgQXVkaW9SZXNhbXBsZXIqIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoMTYsIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgIG91dHB1dF9mcmVxLCBxdWFsaXR5KTsKLQotICAgICAgICBzaXplX3Qgb3V0X2ZyYW1lcyA9IG91dHB1dF9zaXplLzg7Ci0gICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dF9mcmVxKTsKLSAgICAgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoMHgxMDAwLCAweDEwMDApOwotCi0gICAgICAgIG1lbXNldChvdXRwdXRfdmFkZHIsIDAsIG91dHB1dF9zaXplKTsKKyAgICBpZiAocHJvZmlsZUZpbHRlcikgeworICAgICAgICAvLyBDaGVjayBob3cgZmFzdCBzYW1wbGUgcmF0ZSBjaGFuZ2VzIGFyZSB0aGF0IHJlcXVpcmUgZmlsdGVyIGNoYW5nZXMuCisgICAgICAgIC8vIFRoZSBkZWx0YSBzYW1wbGUgcmF0ZSBjaGFuZ2VzIG11c3QgaW5kaWNhdGUgYSBkb3duc2FtcGxpbmcgcmF0aW8sCisgICAgICAgIC8vIGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIDEwJSBjaGFuZ2VzLgorICAgICAgICAvLworICAgICAgICAvLyBPbiBmYXN0IGRldmljZXMsIGZpbHRlcnMgc2hvdWxkIGJlIGdlbmVyYXRlZCBiZXR3ZWVuIDAuMW1zIC0gMW1zLgorICAgICAgICAvLyAoc2luZ2xlIHRocmVhZGVkKS4KKyAgICAgICAgQXVkaW9SZXNhbXBsZXIqIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoZm9ybWF0LCBjaGFubmVscywKKyAgICAgICAgICAgICAgICA4MDAwLCBxdWFsaXR5KTsKKyAgICAgICAgaW50IGxvb3BsaW1pdCA9IDEwMDsKICAgICAgICAgdGltZXNwZWMgc3RhcnQsIGVuZDsKICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydCk7Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0X2ZyYW1lcywgJnByb3ZpZGVyKTsKLSAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRfZnJhbWVzLCAmcHJvdmlkZXIpOwotICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0X2ZyYW1lcywgJnByb3ZpZGVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wbGltaXQ7ICsraSkgeworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDkwMDApOworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDEyMDAwKTsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgyMDAwMCk7CisgICAgICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoMzAwMDApOworICAgICAgICB9CiAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmZW5kKTsKICAgICAgICAgaW50NjRfdCBzdGFydF9ucyA9IHN0YXJ0LnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHN0YXJ0LnR2X25zZWM7CiAgICAgICAgIGludDY0X3QgZW5kX25zID0gZW5kLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIGVuZC50dl9uc2VjOwotICAgICAgICBpbnQ2NF90IHRpbWUgPSAoZW5kX25zIC0gc3RhcnRfbnMpLzQ7Ci0gICAgICAgIHByaW50ZigiJWYgTXNwbC9zXG4iLCBvdXRfZnJhbWVzLyh0aW1lLzFlOSkvMWU2KTsKKyAgICAgICAgaW50NjRfdCB0aW1lID0gZW5kX25zIC0gc3RhcnRfbnM7CisgICAgICAgIHByaW50ZigiJS4yZiBzYW1wbGUgcmF0ZSBjaGFuZ2VzIHdpdGggZmlsdGVyIGNhbGN1bGF0aW9uL3NlY1xuIiwKKyAgICAgICAgICAgICAgICBsb29wbGltaXQgKiA0IC8gKHRpbWUgLyAxZTkpKTsKIAorICAgICAgICAvLyBDaGVjayBob3cgZmFzdCBzYW1wbGUgcmF0ZSBjaGFuZ2VzIGFyZSB3aXRob3V0IGZpbHRlciBjaGFuZ2VzLgorICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSB2ZXJ5IGZhc3QsIHByb2JhYmx5IDAuMXVzIC0gMXVzIHBlciBzYW1wbGUgcmF0ZQorICAgICAgICAvLyBjaGFuZ2UuCisgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgxMDAwKTsKKyAgICAgICAgbG9vcGxpbWl0ID0gMTAwMDsKKyAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcGxpbWl0OyArK2kpIHsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgxMDAwK2kpOworICAgICAgICB9CisgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmZW5kKTsKKyAgICAgICAgc3RhcnRfbnMgPSBzdGFydC50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyBzdGFydC50dl9uc2VjOworICAgICAgICBlbmRfbnMgPSBlbmQudHZfc2VjICogMTAwMDAwMDAwMExMICsgZW5kLnR2X25zZWM7CisgICAgICAgIHRpbWUgPSBlbmRfbnMgLSBzdGFydF9uczsKKyAgICAgICAgcHJpbnRmKCIlLjJmIHNhbXBsZSByYXRlIGNoYW5nZXMgd2l0aG91dCBmaWx0ZXIgY2FsY3VsYXRpb24vc2VjXG4iLAorICAgICAgICAgICAgICAgIGxvb3BsaW1pdCAvICh0aW1lIC8gMWU5KSk7CisgICAgICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKICAgICAgICAgZGVsZXRlIHJlc2FtcGxlcjsKICAgICB9CiAKLSAgICBBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgxNiwgY2hhbm5lbHMsCisgICAgdm9pZCogb3V0cHV0X3ZhZGRyID0gbWFsbG9jKG91dHB1dF9zaXplKTsKKyAgICBBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShmb3JtYXQsIGNoYW5uZWxzLAogICAgICAgICAgICAgb3V0cHV0X2ZyZXEsIHF1YWxpdHkpOwotICAgIHNpemVfdCBvdXRfZnJhbWVzID0gb3V0cHV0X3NpemUvODsKKwogICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dF9mcmVxKTsKLSAgICByZXNhbXBsZXItPnNldFZvbHVtZSgweDEwMDAsIDB4MTAwMCk7CisgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoQXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQsIEF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKworICAgIGlmIChwcm9maWxlUmVzYW1wbGUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIHByb2ZpbGluZyBvbiBtb2JpbGUgZGV2aWNlcywgdXBvbiBleHBlcmltZW50YXRpb24KKyAgICAgICAgICogaXQgaXMgYmV0dGVyIHRvIHJ1biBhIGZldyB0cmlhbHMgd2l0aCBhIHNob3J0ZXIgbG9vcCBsaW1pdCwKKyAgICAgICAgICogYW5kIHRha2UgdGhlIG1pbmltdW0gdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTG9uZyB0ZXN0cyBjYW4gY2F1c2UgQ1BVIHRlbXBlcmF0dXJlIHRvIGJ1aWxkIHVwIGFuZCB0aGVybWFsIHRocm90dGxpbmcKKyAgICAgICAgICogdG8gcmVkdWNlIENQVSBmcmVxdWVuY3kuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBmcmVxdWVuY3kgY2hlY2tzIChpbmRleD0wLCBvciAxLCBldGMuKToKKyAgICAgICAgICogImNhdCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUke2luZGV4fS9jcHVmcmVxL3NjYWxpbmdfKl9mcmVxIgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgdGVtcGVyYXR1cmUgY2hlY2tzIChpbmRleD0wLCBvciAxLCBldGMuKToKKyAgICAgICAgICogImNhdCAvc3lzL2NsYXNzL3RoZXJtYWwvdGhlcm1hbF96b25lJHtpbmRleH0vdGVtcCIKKyAgICAgICAgICoKKyAgICAgICAgICogQW5vdGhlciB3YXkgdG8gYXZvaWQgdGhlcm1hbCB0aHJvdHRsaW5nIGlzIHRvIGZpeCB0aGUgQ1BVIGZyZXF1ZW5jeQorICAgICAgICAgKiBhdCBhIGxvd2VyIGxldmVsIHdoaWNoIHByZXZlbnRzIGV4Y2Vzc2l2ZSB0ZW1wZXJhdHVyZXMuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBpbnQgdHJpYWxzID0gNDsKKyAgICAgICAgY29uc3QgaW50IGxvb3BsaW1pdCA9IDQ7CisgICAgICAgIHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CisgICAgICAgIGludDY0X3QgdGltZSA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCB0cmlhbHM7ICsrbikgeworICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BsaW1pdDsgKytpKSB7CisgICAgICAgICAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRwdXRfZnJhbWVzLCAmcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlc2V0KCk7IC8vICBkdXJpbmcgYmVuY2htYXJraW5nIHJlc2V0IG9ubHkgdGhlIHByb3ZpZGVyCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmVuZCk7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0X25zID0gc3RhcnQudHZfc2VjICogMTAwMDAwMDAwMExMICsgc3RhcnQudHZfbnNlYzsKKyAgICAgICAgICAgIGludDY0X3QgZW5kX25zID0gZW5kLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIGVuZC50dl9uc2VjOworICAgICAgICAgICAgaW50NjRfdCBkaWZmX25zID0gZW5kX25zIC0gc3RhcnRfbnM7CisgICAgICAgICAgICBpZiAobiA9PSAwIHx8IGRpZmZfbnMgPCB0aW1lKSB7CisgICAgICAgICAgICAgICAgdGltZSA9IGRpZmZfbnM7ICAgLy8gc2F2ZSB0aGUgYmVzdCBvdXQgb2Ygb3VyIHRyaWFscy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBNZnJtcy9zIGlzICJNaWxsaW9ucyBvZiBvdXRwdXQgZnJhbWVzIHBlciBzZWNvbmQiLgorICAgICAgICBwcmludGYoInF1YWxpdHk6ICVkICBjaGFubmVsczogJWQgIG1zZWM6ICUiIFBSSWQ2NCAiICBNZnJtcy9zOiAlLjJsZlxuIiwKKyAgICAgICAgICAgICAgICBxdWFsaXR5LCBjaGFubmVscywgdGltZS8xMDAwMDAwLCBvdXRwdXRfZnJhbWVzICogbG9vcGxpbWl0IC8gKHRpbWUgLyAxZTkpIC8gMWU2KTsKKyAgICAgICAgcmVzYW1wbGVyLT5yZXNldCgpOworICAgIH0KIAogICAgIG1lbXNldChvdXRwdXRfdmFkZHIsIDAsIG91dHB1dF9zaXplKTsKLSAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7CisgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigicmVzYW1wbGUoKSAlenUgb3V0cHV0IGZyYW1lc1xuIiwgb3V0cHV0X2ZyYW1lcyk7CisgICAgfQorICAgIGlmIChPdmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICBPdmFsdWVzLnB1c2gob3V0cHV0X2ZyYW1lcyk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwLCBqID0gMDsgaSA8IG91dHB1dF9mcmFtZXM7ICkgeworICAgICAgICBzaXplX3QgdGhpc0ZyYW1lcyA9IE92YWx1ZXNbaisrXTsKKyAgICAgICAgaWYgKGogPj0gT3ZhbHVlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzRnJhbWVzID09IDAgfHwgdGhpc0ZyYW1lcyA+IG91dHB1dF9mcmFtZXMgLSBpKSB7CisgICAgICAgICAgICB0aGlzRnJhbWVzID0gb3V0cHV0X2ZyYW1lcyAtIGk7CisgICAgICAgIH0KKyAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyICsgb3V0cHV0X2NoYW5uZWxzKmksIHRoaXNGcmFtZXMsICZwcm92aWRlcik7CisgICAgICAgIGkgKz0gdGhpc0ZyYW1lczsKKyAgICB9CisgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigicmVzYW1wbGUoKSBjb21wbGV0ZVxuIik7CisgICAgfQorICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKKyAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCJyZXNldCgpIGNvbXBsZXRlXG4iKTsKKyAgICB9CisgICAgZGVsZXRlIHJlc2FtcGxlcjsKKyAgICByZXNhbXBsZXIgPSBOVUxMOwogCi0gICAgLy8gZG93bi1taXggKHdlIGp1c3QgdHJ1bmNhdGUgYW5kIGtlZXAgdGhlIGxlZnQgY2hhbm5lbCkKKyAgICAvLyBGb3IgZmxvYXQgcHJvY2Vzc2luZywgY29udmVydCBvdXRwdXQgZm9ybWF0IGZyb20gZmxvYXQgdG8gUTQuMjcsCisgICAgLy8gd2hpY2ggaXMgdGhlbiBjb252ZXJ0ZWQgdG8gaW50MTZfdCBmb3IgZmluYWwgc3RvcmFnZS4KKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgbWVtY3B5X3RvX3E0XzI3X2Zyb21fZmxvYXQocmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4ob3V0cHV0X3ZhZGRyKSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0cHV0X3ZhZGRyKSwgb3V0cHV0X2ZyYW1lcyAqIG91dHB1dF9jaGFubmVscyk7CisgICAgfQorCisgICAgLy8gbW9ubyB0YWtlcyBsZWZ0IGNoYW5uZWwgb25seSAob3V0IG9mIHN0ZXJlbyBvdXRwdXQgcGFpcikKKyAgICAvLyBzdGVyZW8gYW5kIG11bHRpY2hhbm5lbCBwcmVzZXJ2ZSBhbGwgY2hhbm5lbHMuCiAgICAgaW50MzJfdCogb3V0ID0gKGludDMyX3QqKSBvdXRwdXRfdmFkZHI7Ci0gICAgaW50MTZfdCogY29udmVydCA9IChpbnQxNl90KikgbWFsbG9jKG91dF9mcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRfZnJhbWVzOyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajxjaGFubmVscyA7IGorKykgewotICAgICAgICAgICAgaW50MzJfdCBzID0gb3V0W2kgKiAyICsgal0gPj4gMTI7Ci0gICAgICAgICAgICBpZiAocyA+IDMyNzY3KSAgICAgICBzID0gIDMyNzY3OwotICAgICAgICAgICAgZWxzZSBpZiAocyA8IC0zMjc2OCkgcyA9IC0zMjc2ODsKKyAgICBpbnQxNl90KiBjb252ZXJ0ID0gKGludDE2X3QqKSBtYWxsb2Mob3V0cHV0X2ZyYW1lcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgIGNvbnN0IGludCB2b2x1bWVTaGlmdCA9IDEyOyAvLyBzaGlmdCByZXF1aXJlbWVudCBmb3IgUTQuMjcgdG8gUS4xNQorICAgIC8vIHJvdW5kIHRvIGhhbGYgdG93YXJkcyB6ZXJvIGFuZCBzYXR1cmF0ZSBhdCBpbnQxNiAobm9uLWRpdGhlcmVkKQorICAgIGNvbnN0IGludCByb3VuZFZhbCA9ICgxPDwodm9sdW1lU2hpZnQtMSkpIC0gMTsgLy8gdm9sdW1lUHJlY2lzaW9uID4gMAorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICBpbnQzMl90IHMgPSBvdXRbaSAqIG91dHB1dF9jaGFubmVscyArIGpdICsgcm91bmRWYWw7IC8vIGFkZCBvZmZzZXQgaGVyZQorICAgICAgICAgICAgaWYgKHMgPCAwKSB7CisgICAgICAgICAgICAgICAgcyA9IChzICsgMSkgPj4gdm9sdW1lU2hpZnQ7IC8vIHJvdW5kIHRvIDAKKyAgICAgICAgICAgICAgICBpZiAocyA8IC0zMjc2OCkgeworICAgICAgICAgICAgICAgICAgICBzID0gLTMyNzY4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA9IHMgPj4gdm9sdW1lU2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKHMgPiAzMjc2NykgeworICAgICAgICAgICAgICAgICAgICBzID0gMzI3Njc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udmVydFtpICogY2hhbm5lbHMgKyBqXSA9IGludDE2X3Qocyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyB3cml0ZSBvdXRwdXQgdG8gZGlzawotICAgIGludCBvdXRwdXRfZmQgPSBvcGVuKGZpbGVfb3V0LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAotICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7Ci0gICAgaWYgKG91dHB1dF9mZCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIFNGX0lORk8gaW5mbzsKKyAgICBpbmZvLmZyYW1lcyA9IDA7CisgICAgaW5mby5zYW1wbGVyYXRlID0gb3V0cHV0X2ZyZXE7CisgICAgaW5mby5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGluZm8uZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IFNGX0ZPUk1BVF9QQ01fMTY7CisgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKGZpbGVfb3V0LCBTRk1fV1JJVEUsICZpbmZvKTsKKyAgICBpZiAoc2YgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZV9vdXQpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0KKyAgICAodm9pZCkgc2Zfd3JpdGVmX3Nob3J0KHNmLCBjb252ZXJ0LCBvdXRwdXRfZnJhbWVzKTsKKyAgICBzZl9jbG9zZShzZik7CiAKLSAgICBpZiAod3JpdGVIZWFkZXIpIHsKLSAgICAgICAgSGVhZGVyV2F2IHdhdihvdXRfZnJhbWVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksIGNoYW5uZWxzLCBvdXRwdXRfZnJlcSwgMTYpOwotICAgICAgICB3cml0ZShvdXRwdXRfZmQsICZ3YXYsIHNpemVvZih3YXYpKTsKLSAgICB9Ci0KLSAgICB3cml0ZShvdXRwdXRfZmQsIGNvbnZlcnQsIG91dF9mcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgY2xvc2Uob3V0cHV0X2ZkKTsKLQotICAgIHJldHVybiAwOworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYmEwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDczIEBACisjIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBhdWRpb2ZsaW5nZXIKKworIworIyByZXNhbXBsZXIgdW5pdCB0ZXN0CisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJsb2cgXAorCWxpYnV0aWxzIFwKKwlsaWJjdXRpbHMgXAorCWxpYnN0bHBvcnQgXAorCWxpYmF1ZGlvdXRpbHMgXAorCWxpYmF1ZGlvcmVzYW1wbGVyCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorCWxpYmd0ZXN0IFwKKwlsaWJndGVzdF9tYWluCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAorCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJcmVzYW1wbGVyX3Rlc3RzLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gcmVzYW1wbGVyX3Rlc3RzCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIworIyBhdWRpbyBtaXhlciB0ZXN0IHRvb2wKKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdGVzdC1taXhlci5jcHAgXAorCS4uL0F1ZGlvTWl4ZXIuY3BwLmFybSBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisJZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisJbGlic25kZmlsZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGxwb3J0IFwKKwlsaWJlZmZlY3RzIFwKKwlsaWJuYmFpbyBcCisJbGliY29tbW9uX3RpbWVfY2xpZW50IFwKKwlsaWJhdWRpb3Jlc2FtcGxlciBcCisJbGliYXVkaW91dGlscyBcCisJbGliZGwgXAorCWxpYmN1dGlscyBcCisJbGlidXRpbHMgXAorCWxpYmxvZworCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW1peGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYzQ1M2IwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL2Jhc2gKKworaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgIGV4aXQgLTEKK2ZpCisKKyMgZW5zdXJlIHdlIGhhdmUgbW0KKy4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKK3B1c2hkICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlci8KK3B3ZAorbW0KKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CithZGIgcHVzaCAkT1VUL3N5c3RlbS9saWIvbGliYXVkaW9yZXNhbXBsZXIuc28gL3N5c3RlbS9saWIKK2FkYiBwdXNoICRPVVQvc3lzdGVtL2Jpbi9yZXNhbXBsZXJfdGVzdHMgL3N5c3RlbS9iaW4KKworc2ggJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorCitwb3BkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL21peGVyX3RvX3dhdl90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YjM5ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL21peGVyX3RvX3dhdl90ZXN0cy5zaApAQCAtMCwwICsxLDEzNCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVGhpcyBzY3JpcHQgdXNlcyB0ZXN0LW1peGVyIHRvIGdlbmVyYXRlIFdBViBmaWxlcworIyBmb3IgZXZhbHVhdGlvbiBvZiB0aGUgQXVkaW9NaXhlciBjb21wb25lbnQuCisjCisjIFNpbmUgYW5kIGNoaXJwIHNpZ25hbHMgYXJlIHVzZWQgZm9yIGlucHV0IGJlY2F1c2UgdGhleQorIyBzaG93IHVwIGFzIGNsZWFyIGxpbmVzLCBlaXRoZXIgaG9yaXpvbnRhbCBvciBkaWFnb25hbCwKKyMgb24gYSBzcGVjdHJvZ3JhbS4gVGhpcyBtZWFucyBlYXN5IHZlcmlmaWNhdGlvbiBvZiBtdWx0aXBsZQorIyB0cmFjayBtaXhpbmcuCisjCisjIEFmdGVyIGV4ZWN1dGlvbiwgbG9vayBmb3IgY3JlYXRlZCBzdWJkaXJlY3RvcmllcyBsaWtlCisjIG1peGVyX2lfaQorIyBtaXhlcl9pX2YKKyMgbWl4ZXJfZl9mCisjCisjIFJlY29tbWVuZCB1c2luZyBhIHByb2dyYW0gc3VjaCBhcyBhdWRhY2l0eSB0byBldmFsdWF0ZQorIyB0aGUgb3V0cHV0IFdBViBmaWxlcywgZS5nLgorIworIyBjZCB0ZXN0ZGlyCisjIGF1ZGFjaXR5ICoud2F2CisjCisjIFVzaW5nIEF1ZGFjaXR5OgorIworIyBVbmRlciAiV2F2ZWZvcm0iIHZpZXcgbW9kZSB5b3UgY2FuIHpvb20gaW50byB0aGUKKyMgc3RhcnQgb2YgdGhlIFdBViBmaWxlIHRvIHZlcmlmeSBwcm9wZXIgcmFtcGluZy4KKyMKKyMgU2VsZWN0ICJTcGVjdHJvZ3JhbSIgdG8gc2VlIHZlcmlmeSB0aGUgbGluZXMKKyMgKHNpbmUgPSBob3Jpem9udGFsLCBjaGlycCA9IGRpYWdvbmFsKSB3aGljaCBzaG91bGQKKyMgYmUgY2xlYXIgKGV4Y2VwdCBmb3IgYXJvdW5kIHRoZSBzdGFydCBhcyB0aGUgdm9sdW1lCisjIHJhbXBpbmcgY2F1c2VzIHNwZWN0cmFsIGRpc3RvcnRpb24pLgorCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworIyBlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworcHVzaGQgJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyLworCisjIGJ1aWxkCitwd2QKK21tCisKKyMgc2VuZCB0byBkZXZpY2UKK2VjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliL2xpYmF1ZGlvcmVzYW1wbGVyLnNvIC9zeXN0ZW0vbGliCithZGIgcHVzaCAkT1VUL3N5c3RlbS9iaW4vdGVzdC1taXhlciAvc3lzdGVtL2JpbgorCisjIGNyZWF0ZXdhdiBjcmVhdGVzIGEgc2VyaWVzIG9mIFdBViBmaWxlcyB0ZXN0aW5nIHZhcmlvdXMKKyMgbWl4ZXIgc2V0dGluZ3MKKyMgJDEgPSBmbGFncworIyAkMiA9IGRpcmVjdG9yeQorZnVuY3Rpb24gY3JlYXRld2F2KCkgeworIyBjcmVhdGUgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICBpZiBbICEgLWQgJDIgXTsgdGhlbgorICAgICAgICBta2RpciAkMgorICAgIGZpCisKKyMgVGVzdDoKKyMgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcKKyMgdHJhY2tfX1Jlc2FtcGxlIC8gdHJhY2tfX2dlbmVyaWNSZXNhbXBsZQorICAgIGFkYiBzaGVsbCB0ZXN0LW1peGVyICQxIC1zIDQ4MDAwIFwKKyAgICAgICAgLW8gL3NkY2FyZC90bTQ4MDAwZ3Iud2F2IFwKKyAgICAgICAgc2luZToyLDQwMDAsNzUyMCBjaGlycDoyLDkyMDAgc2luZToxLDMwMDAsMTgwMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtNDgwMDBnci53YXYgJDIKKworIyBUZXN0OgorIyBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGUKKyMgdHJhY2tfX1Jlc2FtcGxlIC8gdHJhY2tfX2dlbmVyaWNSZXNhbXBsZQorIyB0cmFja19fTm9SZXNhbXBsZSAvIHRyYWNrX18xNkJpdHNTdGVyZW8gLyB0cmFja19fMTZCaXRzTW9ubworIyBBdXggYnVmZmVyCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLWMgNSAtcyA5MzA3IFwKKyAgICAgICAgLWEgL3NkY2FyZC9hdXg5MzA3Z3JhLndhdiAtbyAvc2RjYXJkL3RtOTMwN2dyYS53YXYgXAorICAgICAgICBzaW5lOjQsMTAwMCwzMDAwIHNpbmU6MSwyMDAwLDkzMDcgY2hpcnA6Myw5MzA3CisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTkzMDdncmEud2F2ICQyCisgICAgYWRiIHB1bGwgL3NkY2FyZC9hdXg5MzA3Z3JhLndhdiAkMgorCisjIFRlc3Q6CisjIHByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcKKyMgdHJhY2tfX05vUmVzYW1wbGUgLyB0cmFja19fMTZCaXRzU3RlcmVvIC8gdHJhY2tfXzE2Qml0c01vbm8KKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyAzMjAwMCBcCisgICAgICAgIC1vIC9zZGNhcmQvdG0zMjAwMGduci53YXYgXAorICAgICAgICBzaW5lOjIsMTAwMCwzMjAwMCBjaGlycDoyLDMyMDAwICBzaW5lOjEsMzAwMCwzMjAwMAorICAgIGFkYiBwdWxsIC9zZGNhcmQvdG0zMjAwMGduci53YXYgJDIKKworIyBUZXN0OgorIyBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nCisjIHRyYWNrX19Ob1Jlc2FtcGxlIC8gdHJhY2tfXzE2Qml0c1N0ZXJlbyAvIHRyYWNrX18xNkJpdHNNb25vCisjIEF1eCBidWZmZXIKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyAzMjAwMCBcCisgICAgICAgIC1hIC9zZGNhcmQvYXV4MzIwMDBnbnJhLndhdiAtbyAvc2RjYXJkL3RtMzIwMDBnbnJhLndhdiBcCisgICAgICAgIHNpbmU6MiwxMDAwLDMyMDAwIGNoaXJwOjIsMzIwMDAgIHNpbmU6MSwzMDAwLDMyMDAwCisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTMyMDAwZ25yYS53YXYgJDIKKyAgICBhZGIgcHVsbCAvc2RjYXJkL2F1eDMyMDAwZ25yYS53YXYgJDIKKworIyBUZXN0OgorIyBwcm9jZXNzX19Ob1Jlc2FtcGxlT25lVHJhY2sgLyBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZworIyBEb3dubWl4ZXIKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyAzMjAwMCBcCisgICAgICAgIC1vIC9zZGNhcmQvdG0zMjAwMG5yb3Qud2F2IFwKKyAgICAgICAgc2luZTo2LDEwMDAsMzIwMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtMzIwMDBucm90LndhdiAkMgorCisjIFRlc3Q6CisjIHByb2Nlc3NfX05vUmVzYW1wbGVPbmVUcmFjayAvIE9uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nCisjIEF1eCBidWZmZXIKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyA0NDEwMCBcCisgICAgICAgIC1hIC9zZGNhcmQvYXV4NDQxMDBucm90YS53YXYgLW8gL3NkY2FyZC90bTQ0MTAwbnJvdGEud2F2IFwKKyAgICAgICAgc2luZToyLDIwMDAsNDQxMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtNDQxMDBucm90YS53YXYgJDIKKyAgICBhZGIgcHVsbCAvc2RjYXJkL2F1eDQ0MTAwbnJvdGEud2F2ICQyCit9CisKKyMKKyMgQ2FsbCBjcmVhdGV3YXYgdG8gZ2VuZXJhdGUgV0FWIGZpbGVzIGluIHZhcmlvdXMgY29tYmluYXRpb25zCisjCisjIGlfaSA9IGludGVnZXIgaW5wdXQgdHJhY2ssIGludGVnZXIgbWl4ZXIgb3V0cHV0CisjIGZfZiA9IGZsb2F0IGlucHV0IHRyYWNrLCAgIGZsb2F0IG1peGVyIG91dHB1dAorIyBpX2YgPSBpbnRlZ2VyIGlucHV0IHRyYWNrLCBmbG9hdF9taXhlciBvdXRwdXQKKyMKKyMgSWYgdGhlIG1peGVyIG91dHB1dCBpcyBmbG9hdCwgdGhlbiB0aGUgb3V0cHV0IFdBViBmaWxlIGlzIHBjbSBmbG9hdC4KKyMKKyMgVE9ETzogY3JlYXRlIGEgInNuciIgbGlrZSAiZGlmZiIgdG8gYXV0b21hdGljYWxseQorIyBjb21wYXJlIGZpbGVzIGluIHRoZXNlIGRpcmVjdG9yaWVzIHRvZ2V0aGVyLgorIworCitjcmVhdGV3YXYgIiIgInRlc3RzL21peGVyX2lfaSIKK2NyZWF0ZXdhdiAiLWYgLW0iICJ0ZXN0cy9taXhlcl9mX2YiCitjcmVhdGV3YXYgIi1tIiAidGVzdHMvbWl4ZXJfaV9mIgorCitwb3BkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjE3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcApAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiYXVkaW9mbGluZ2VyX3Jlc2FtcGxlcl90ZXN0cyIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgorI2luY2x1ZGUgInRlc3RfdXRpbHMuaCIKKwordm9pZCByZXNhbXBsZShpbnQgY2hhbm5lbHMsIHZvaWQgKm91dHB1dCwKKyAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lcywgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmb3V0cHV0SW5jciwKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyICpyZXNhbXBsZXIpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGogPSAwOyBpIDwgb3V0cHV0RnJhbWVzOyApIHsKKyAgICAgICAgc2l6ZV90IHRoaXNGcmFtZXMgPSBvdXRwdXRJbmNyW2orK107CisgICAgICAgIGlmIChqID49IG91dHB1dEluY3Iuc2l6ZSgpKSB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpc0ZyYW1lcyA9PSAwIHx8IHRoaXNGcmFtZXMgPiBvdXRwdXRGcmFtZXMgLSBpKSB7CisgICAgICAgICAgICB0aGlzRnJhbWVzID0gb3V0cHV0RnJhbWVzIC0gaTsKKyAgICAgICAgfQorICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90Kikgb3V0cHV0ICsgY2hhbm5lbHMqaSwgdGhpc0ZyYW1lcywgcHJvdmlkZXIpOworICAgICAgICBpICs9IHRoaXNGcmFtZXM7CisgICAgfQorfQorCit2b2lkIGJ1ZmZlcmNtcChjb25zdCB2b2lkICpyZWZlcmVuY2UsIGNvbnN0IHZvaWQgKnRlc3QsCisgICAgICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsIHNpemVfdCBvdXRwdXRGcmFtZXMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRGcmFtZXM7ICsraSkgeworICAgICAgICBpbnQgY2hlY2sgPSBtZW1jbXAoKGNvbnN0IGNoYXIqKXJlZmVyZW5jZSArIGkgKiBvdXRwdXRGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKXRlc3QgKyBpICogb3V0cHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUpOworICAgICAgICBpZiAoY2hlY2spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsdXJlIGF0IGZyYW1lICV6dSIsIGkpOworICAgICAgICAgICAgQVNTRVJUX0VRKGNoZWNrLCAwKTsgLyogZmFpbHMgKi8KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB0ZXN0QnVmZmVySW5jcmVtZW50KHNpemVfdCBjaGFubmVscywgYm9vbCB1c2VGbG9hdCwKKyAgICAgICAgdW5zaWduZWQgaW5wdXRGcmVxLCB1bnNpZ25lZCBvdXRwdXRGcmVxLAorICAgICAgICBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5KQoreworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHVzZUZsb2F0ID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIC8vIGNyZWF0ZSB0aGUgcHJvdmlkZXIKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGlucHV0SW5jcjsKKyAgICBTaWduYWxQcm92aWRlciBwcm92aWRlcjsKKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgcHJvdmlkZXIuc2V0Q2hpcnA8ZmxvYXQ+KGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIDAuLCBvdXRwdXRGcmVxLzIuLCBvdXRwdXRGcmVxLCBvdXRwdXRGcmVxLzIwMDAuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm92aWRlci5zZXRDaGlycDxpbnQxNl90PihjaGFubmVscywKKyAgICAgICAgICAgICAgICAwLiwgb3V0cHV0RnJlcS8yLiwgb3V0cHV0RnJlcSwgb3V0cHV0RnJlcS8yMDAwLik7CisgICAgfQorICAgIHByb3ZpZGVyLnNldEluY3IoaW5wdXRJbmNyKTsKKworICAgIC8vIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IHNpemUKKyAgICBzaXplX3Qgb3V0cHV0RnJhbWVzID0gKChpbnQ2NF90KSBwcm92aWRlci5nZXROdW1GcmFtZXMoKSAqIG91dHB1dEZyZXEpIC8gaW5wdXRGcmVxOworICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUgPSBjaGFubmVscyAqICh1c2VGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MzJfdCkpOworICAgIHNpemVfdCBvdXRwdXRTaXplID0gb3V0cHV0RnJhbWVTaXplICogb3V0cHV0RnJhbWVzOworICAgIG91dHB1dFNpemUgJj0gfjc7CisKKyAgICAvLyBjcmVhdGUgdGhlIHJlc2FtcGxlcgorICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXI7CisKKyAgICByZXNhbXBsZXIgPSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGZvcm1hdCwgY2hhbm5lbHMsIG91dHB1dEZyZXEsIHF1YWxpdHkpOworICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dEZyZXEpOworICAgIHJlc2FtcGxlci0+c2V0Vm9sdW1lKGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FULAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQpOworCisgICAgLy8gc2V0IHVwIHRoZSByZWZlcmVuY2UgcnVuCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiByZWZJbmNyOworICAgIHJlZkluY3IucHVzaF9iYWNrKG91dHB1dEZyYW1lcyk7CisgICAgdm9pZCogcmVmZXJlbmNlID0gbWFsbG9jKG91dHB1dFNpemUpOworICAgIHJlc2FtcGxlKGNoYW5uZWxzLCByZWZlcmVuY2UsIG91dHB1dEZyYW1lcywgcmVmSW5jciwgJnByb3ZpZGVyLCByZXNhbXBsZXIpOworCisgICAgcHJvdmlkZXIucmVzZXQoKTsKKworI2lmIDAKKyAgICAvKiB0aGlzIHRlc3Qgd2lsbCBmYWlsIC0gQVBJIGludGVyZmFjZSBpc3N1ZTogcmVzZXQoKSBkb2VzIG5vdCBjbGVhciBpbnRlcm5hbCBidWZmZXJzICovCisgICAgcmVzYW1wbGVyLT5yZXNldCgpOworI2Vsc2UKKyAgICBkZWxldGUgcmVzYW1wbGVyOworICAgIHJlc2FtcGxlciA9IGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoZm9ybWF0LCBjaGFubmVscywgb3V0cHV0RnJlcSwgcXVhbGl0eSk7CisgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0RnJlcSk7CisgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQsCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CisjZW5kaWYKKworICAgIC8vIHNldCB1cCB0aGUgdGVzdCBydW4KKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IG91dEluY3I7CisgICAgb3V0SW5jci5wdXNoX2JhY2soMSk7CisgICAgb3V0SW5jci5wdXNoX2JhY2soMik7CisgICAgb3V0SW5jci5wdXNoX2JhY2soMyk7CisgICAgdm9pZCogdGVzdCA9IG1hbGxvYyhvdXRwdXRTaXplKTsKKyAgICBpbnB1dEluY3IucHVzaF9iYWNrKDEpOworICAgIGlucHV0SW5jci5wdXNoX2JhY2soMyk7CisgICAgcHJvdmlkZXIuc2V0SW5jcihpbnB1dEluY3IpOworICAgIHJlc2FtcGxlKGNoYW5uZWxzLCB0ZXN0LCBvdXRwdXRGcmFtZXMsIG91dEluY3IsICZwcm92aWRlciwgcmVzYW1wbGVyKTsKKworICAgIC8vIGNoZWNrCisgICAgYnVmZmVyY21wKHJlZmVyZW5jZSwgdGVzdCwgb3V0cHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZXMpOworCisgICAgZnJlZShyZWZlcmVuY2UpOworICAgIGZyZWUodGVzdCk7CisgICAgZGVsZXRlIHJlc2FtcGxlcjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgZG91YmxlIHNxcihUIHYpCit7CisgICAgZG91YmxlIGR2ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPih2KTsKKyAgICByZXR1cm4gZHYgKiBkdjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citkb3VibGUgc2lnbmFsRW5lcmd5KFQgKnN0YXJ0LCBUICplbmQsIHVuc2lnbmVkIHN0cmlkZSkKK3sKKyAgICBkb3VibGUgYWNjdW0gPSAwOworCisgICAgZm9yIChUICpwID0gc3RhcnQ7IHAgPCBlbmQ7IHAgKz0gc3RyaWRlKSB7CisgICAgICAgIGFjY3VtICs9IHNxcigqcCk7CisgICAgfQorICAgIHVuc2lnbmVkIGNvdW50ID0gKGVuZCAtIHN0YXJ0ICsgc3RyaWRlIC0gMSkgLyBzdHJpZGU7CisgICAgcmV0dXJuIGFjY3VtIC8gY291bnQ7Cit9CisKKy8vIFRJID0gcmVzYW1wbGVyIGlucHV0IHR5cGUsIGludDE2X3Qgb3IgZmxvYXQKKy8vIFRPID0gcmVzYW1wbGVyIG91dHB1dCB0eXBlLCBpbnQzMl90IG9yIGZsb2F0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbihzaXplX3QgY2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGlucHV0RnJlcSwgdW5zaWduZWQgb3V0cHV0RnJlcSwKKyAgICAgICAgdW5zaWduZWQgcGFzc2JhbmQsIHVuc2lnbmVkIHN0b3BiYW5kLAorICAgICAgICBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5KQoreworICAgIC8vIGNyZWF0ZSB0aGUgcHJvdmlkZXIKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGlucHV0SW5jcjsKKyAgICBTaWduYWxQcm92aWRlciBwcm92aWRlcjsKKyAgICBwcm92aWRlci5zZXRDaGlycDxUST4oY2hhbm5lbHMsCisgICAgICAgICAgICAwLiwgaW5wdXRGcmVxLzIuLCBpbnB1dEZyZXEsIGlucHV0RnJlcS8yMDAwLik7CisgICAgcHJvdmlkZXIuc2V0SW5jcihpbnB1dEluY3IpOworCisgICAgLy8gY2FsY3VsYXRlIHRoZSBvdXRwdXQgc2l6ZQorICAgIHNpemVfdCBvdXRwdXRGcmFtZXMgPSAoKGludDY0X3QpIHByb3ZpZGVyLmdldE51bUZyYW1lcygpICogb3V0cHV0RnJlcSkgLyBpbnB1dEZyZXE7CisgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSA9IGNoYW5uZWxzICogc2l6ZW9mKFRPKTsKKyAgICBzaXplX3Qgb3V0cHV0U2l6ZSA9IG91dHB1dEZyYW1lU2l6ZSAqIG91dHB1dEZyYW1lczsKKyAgICBvdXRwdXRTaXplICY9IH43OworCisgICAgLy8gY3JlYXRlIHRoZSByZXNhbXBsZXIKKyAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyOworCisgICAgcmVzYW1wbGVyID0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKKyAgICAgICAgICAgIGlzX3NhbWU8VEksIGludDE2X3Q+Ojp2YWx1ZSA/IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICAgICAgICAgIGNoYW5uZWxzLCBvdXRwdXRGcmVxLCBxdWFsaXR5KTsKKyAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5wdXRGcmVxKTsKKyAgICByZXNhbXBsZXItPnNldFZvbHVtZShhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKworICAgIC8vIHNldCB1cCB0aGUgcmVmZXJlbmNlIHJ1bgorICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gcmVmSW5jcjsKKyAgICByZWZJbmNyLnB1c2hfYmFjayhvdXRwdXRGcmFtZXMpOworICAgIHZvaWQqIHJlZmVyZW5jZSA9IG1hbGxvYyhvdXRwdXRTaXplKTsKKyAgICByZXNhbXBsZShjaGFubmVscywgcmVmZXJlbmNlLCBvdXRwdXRGcmFtZXMsIHJlZkluY3IsICZwcm92aWRlciwgcmVzYW1wbGVyKTsKKworICAgIFRPICpvdXQgPSByZWludGVycHJldF9jYXN0PFRPICo+KHJlZmVyZW5jZSk7CisKKyAgICAvLyBjaGVjayBzaWduYWwgZW5lcmd5IGluIHBhc3NiYW5kCisgICAgY29uc3QgdW5zaWduZWQgcGFzc2JhbmRGcmFtZSA9IHBhc3NiYW5kICogb3V0cHV0RnJlcSAvIDEwMDAuOworICAgIGNvbnN0IHVuc2lnbmVkIHN0b3BiYW5kRnJhbWUgPSBzdG9wYmFuZCAqIG91dHB1dEZyZXEgLyAxMDAwLjsKKworICAgIC8vIGNoZWNrIGVhY2ggY2hhbm5lbCBzZXBhcmF0ZWx5CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFubmVsczsgKytpKSB7CisgICAgICAgIGRvdWJsZSBwYXNzYmFuZEVuZXJneSA9IHNpZ25hbEVuZXJneShvdXQsIG91dCArIHBhc3NiYW5kRnJhbWUgKiBjaGFubmVscywgY2hhbm5lbHMpOworICAgICAgICBkb3VibGUgc3RvcGJhbmRFbmVyZ3kgPSBzaWduYWxFbmVyZ3kob3V0ICsgc3RvcGJhbmRGcmFtZSAqIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIG91dCArIG91dHB1dEZyYW1lcyAqIGNoYW5uZWxzLCBjaGFubmVscyk7CisgICAgICAgIGRvdWJsZSBkYkF0dGVuID0gLTEwLiAqIGxvZzEwKHN0b3BiYW5kRW5lcmd5IC8gcGFzc2JhbmRFbmVyZ3kpOworICAgICAgICBBU1NFUlRfR1QoZGJBdHRlbiwgNjAuKTsKKworI2lmIDAKKyAgICAgICAgLy8gaW50ZXJuYWwgdmVyaWZpY2F0aW9uCisgICAgICAgIHByaW50ZigiaWY6JWQgIG9mOiVkICBwYmY6JWQgIHNiZjolZCAgc2JlOiAlZiAgcGJlOiAlZiAgZGI6ICUuMmZcbiIsCisgICAgICAgICAgICAgICAgcHJvdmlkZXIuZ2V0TnVtRnJhbWVzKCksIG91dHB1dEZyYW1lcywKKyAgICAgICAgICAgICAgICBwYXNzYmFuZEZyYW1lLCBzdG9wYmFuZEZyYW1lLCBzdG9wYmFuZEVuZXJneSwgcGFzc2JhbmRFbmVyZ3ksIGRiQXR0ZW4pOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBvdXRbaStwYXNzYmFuZEZyYW1lKmNoYW5uZWxzXSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgb3V0W2krc3RvcGJhbmRGcmFtZSpjaGFubmVsc10gPDwgc3RkOjplbmRsOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBmcmVlKHJlZmVyZW5jZSk7CisgICAgZGVsZXRlIHJlc2FtcGxlcjsKK30KKworLyogQnVmZmVyIGluY3JlbWVudCB0ZXN0CisgKgorICogV2UgY29tcGFyZSBhIHJlZmVyZW5jZSBvdXRwdXQsIHdoZXJlIHdlIGNvbnN1bWUgYW5kIHByb2Nlc3MgdGhlIGVudGlyZQorICogYnVmZmVyIGF0IGEgdGltZSwgYW5kIGEgdGVzdCBvdXRwdXQsIHdoZXJlIHdlIHByb3ZpZGUgc21hbGwgY2h1bmtzIG9mIGlucHV0CisgKiBkYXRhIGFuZCBwcm9jZXNzIHNtYWxsIGNodW5rcyBvZiBvdXRwdXQgKHdoaWNoIG1heSBub3QgYmUgZXF1aXZhbGVudCBpbiBzaXplKS4KKyAqCisgKiBUd28gc3VidGVzdHMgLSBmaXhlZCBwaGFzZSAoMzoyIGRvd24pIGFuZCBpbnRlcnBvbGF0ZWQgcGhhc2UgKDE0NzozMjAgdXApCisgKi8KK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgYnVmZmVyaW5jcmVtZW50X2ZpeGVkcGhhc2UpIHsKKyAgICAvLyBhbGwgb2YgdGhlc2Ugd29yaworICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdEJ1ZmZlckluY3JlbWVudCgyLCBmYWxzZSwgNDgwMDAsIDMyMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgYnVmZmVyaW5jcmVtZW50X2ludGVycG9sYXRlZHBoYXNlKSB7CisgICAgLy8gYWxsIG9mIHRoZXNlIHdvcmsgZXhjZXB0IGxvdyBxdWFsaXR5CisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKy8vICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdEJ1ZmZlckluY3JlbWVudCgyLCBmYWxzZSwgMjIwNTAsIDQ4MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgYnVmZmVyaW5jcmVtZW50X2ZpeGVkcGhhc2VfbXVsdGkpIHsKKyAgICAvLyBvbmx5IGR5bmFtaWMgcXVhbGl0eQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0QnVmZmVySW5jcmVtZW50KDQsIGZhbHNlLCA0ODAwMCwgMzIwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBidWZmZXJpbmNyZW1lbnRfaW50ZXJwb2xhdGVkcGhhc2VfbXVsdGlfZmxvYXQpIHsKKyAgICAvLyBvbmx5IGR5bmFtaWMgcXVhbGl0eQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0QnVmZmVySW5jcmVtZW50KDgsIHRydWUsIDIyMDUwLCA0ODAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCisvKiBTaW1wbGUgYWxpYXNpbmcgdGVzdAorICoKKyAqIFRoaXMgY2hlY2tzIHN0b3BiYW5kIHJlc3BvbnNlIG9mIHRoZSBjaGlycCBzaWduYWwgdG8gbWFrZSBzdXJlIGZyZXF1ZW5jaWVzCisgKiBhcmUgcHJvcGVybHkgc3VwcHJlc3NlZC4gIEl0IHVzZXMgZG93bnNhbXBsaW5nIGJlY2F1c2UgdGhlIHN0b3BiYW5kIGNhbiBiZQorICogY2xlYXJseSBpc29sYXRlZCBieSBpbnB1dCBmcmVxdWVuY2llcyBleGNlZWRpbmcgdGhlIG91dHB1dCBzYW1wbGUgcmF0ZSAobnlxdWlzdCkuCisgKi8KK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgc3RvcGJhbmRyZXNwb25zZV9pbnRlZ2VyKSB7CisgICAgLy8gbm90IGFsbCBvZiB0aGVzZSBtYXkgd29yayAob2xkIHJlc2FtcGxlcnMgZmFpbCBvbiBkb3duc2FtcGxpbmcpCisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpWRVJZX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDEya0h6IGFuZCAyMGtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248aW50MTZfdCwgaW50MzJfdD4oCisgICAgICAgICAgICAgICAgMiwgNDgwMDAsIDMyMDAwLCAxMjAwMCwgMjAwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDdrSHogYW5kIDE1a0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICAvLyAodGhlIHdlaXJkIHJhdGlvIHRyaWdnZXJzIGludGVycG9sYXRpdmUgcmVzYW1wbGluZykKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxpbnQxNl90LCBpbnQzMl90PigKKyAgICAgICAgICAgICAgICAyLCA0ODAwMCwgMjIxMDEsIDcwMDAsIDE1MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgc3RvcGJhbmRyZXNwb25zZV9pbnRlZ2VyX211bHRpY2hhbm5lbCkgeworICAgIC8vIG5vdCBhbGwgb2YgdGhlc2UgbWF5IHdvcmsgKG9sZCByZXNhbXBsZXJzIGZhaWwgb24gZG93bnNhbXBsaW5nKQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6Ok1FRF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VkVSWV9ISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiAxMmtIeiBhbmQgMjBrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGludDE2X3QsIGludDMyX3Q+KAorICAgICAgICAgICAgICAgIDgsIDQ4MDAwLCAzMjAwMCwgMTIwMDAsIDIwMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiA3a0h6IGFuZCAxNWtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgLy8gKHRoZSB3ZWlyZCByYXRpbyB0cmlnZ2VycyBpbnRlcnBvbGF0aXZlIHJlc2FtcGxpbmcpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248aW50MTZfdCwgaW50MzJfdD4oCisgICAgICAgICAgICAgICAgOCwgNDgwMDAsIDIyMTAxLCA3MDAwLCAxNTAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIHN0b3BiYW5kcmVzcG9uc2VfZmxvYXQpIHsKKyAgICAvLyBub3QgYWxsIG9mIHRoZXNlIG1heSB3b3JrIChvbGQgcmVzYW1wbGVycyBmYWlsIG9uIGRvd25zYW1wbGluZykKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpNRURfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gMTJrSHogYW5kIDIwa0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxmbG9hdCwgZmxvYXQ+KAorICAgICAgICAgICAgICAgIDIsIDQ4MDAwLCAzMjAwMCwgMTIwMDAsIDIwMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiA3a0h6IGFuZCAxNWtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgLy8gKHRoZSB3ZWlyZCByYXRpbyB0cmlnZ2VycyBpbnRlcnBvbGF0aXZlIHJlc2FtcGxpbmcpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248ZmxvYXQsIGZsb2F0PigKKyAgICAgICAgICAgICAgICAyLCA0ODAwMCwgMjIxMDEsIDcwMDAsIDE1MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgc3RvcGJhbmRyZXNwb25zZV9mbG9hdF9tdWx0aWNoYW5uZWwpIHsKKyAgICAvLyBub3QgYWxsIG9mIHRoZXNlIG1heSB3b3JrIChvbGQgcmVzYW1wbGVycyBmYWlsIG9uIGRvd25zYW1wbGluZykKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpNRURfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gMTJrSHogYW5kIDIwa0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxmbG9hdCwgZmxvYXQ+KAorICAgICAgICAgICAgICAgIDgsIDQ4MDAwLCAzMjAwMCwgMTIwMDAsIDIwMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiA3a0h6IGFuZCAxNWtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgLy8gKHRoZSB3ZWlyZCByYXRpbyB0cmlnZ2VycyBpbnRlcnBvbGF0aXZlIHJlc2FtcGxpbmcpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248ZmxvYXQsIGZsb2F0PigKKyAgICAgICAgICAgICAgICA4LCA0ODAwMCwgMjIxMDEsIDcwMDAsIDE1MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcnVuX2FsbF91bml0X3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmYWU2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKKworYWRiIHNoZWxsIC9zeXN0ZW0vYmluL3Jlc2FtcGxlcl90ZXN0cwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGZhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgorI2luY2x1ZGUgInRlc3RfdXRpbHMuaCIKKworLyogVGVzdGluZyBpcyB0eXBpY2FsbHkgdGhyb3VnaCBjcmVhdGlvbiBvZiBhbiBvdXRwdXQgV0FWIGZpbGUgZnJvbSBzZXZlcmFsCisgKiBzb3VyY2UgaW5wdXRzLCB0byBiZSBsYXRlciBhbmFseXplZCBieSBhbiBhdWRpbyBwcm9ncmFtIHN1Y2ggYXMgQXVkYWNpdHkuCisgKgorICogU2luZSBvciBjaGlycCBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBtb3JlIHVzZWZ1bCBhcyBpbnB1dCB0byB0aGUgbWl4ZXIKKyAqIGFzIHRoZXkgc2hvdyB1cCBhcyBzdHJhaWdodCBsaW5lcyBvbiBhIHNwZWN0cm9ncmFtIGlmIHN1Y2Nlc3NmdWxseSBtaXhlZC4KKyAqCisgKiBBIHNhbXBsZSBzaGVsbCBzY3JpcHQgaXMgcHJvdmlkZWQ6IG1peGVyX3RvX3dhdmVfdGVzdHMuc2gKKyAqLworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciogbmFtZSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZl0gWy1tXSBbLWMgY2hhbm5lbHNdIgorICAgICAgICAgICAgICAgICAgICAiIFstcyBzYW1wbGUtcmF0ZV0gWy1vIDxvdXRwdXQtZmlsZT5dIFstYSA8YXV4LWJ1ZmZlci1maWxlPl0gWy1QIGNzdl0iCisgICAgICAgICAgICAgICAgICAgICIgKDxpbnB1dC1maWxlPiB8IDxjb21tYW5kPikrXG4iLCBuYW1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtZiAgICBlbmFibGUgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdHJhY2tcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1tICAgIGVuYWJsZSBmbG9hdGluZyBwb2ludCBtaXhlciBvdXRwdXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1jICAgIG51bWJlciBvZiBtaXhlciBvdXRwdXQgY2hhbm5lbHNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1zICAgIG1peGVyIHNhbXBsZS1yYXRlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbyAgICA8b3V0cHV0LWZpbGU+IFdBViBmaWxlLCBwY20xNiAob3IgZmxvYXQgaWYgLW0gc3BlY2lmaWVkKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWEgICAgPGF1eC1idWZmZXItZmlsZT5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1QICAgICMgZnJhbWVzIHByb3ZpZGVkIHBlciBjYWxsIHRvIHJlc2FtcGxlKCkgaW4gQ1NWIGZvcm1hdFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgPGlucHV0LWZpbGU+IGlzIGEgV0FWIGZpbGVcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxjb21tYW5kPiBjYW4gYmUgJ3NpbmU6PGNoYW5uZWxzPiw8ZnJlcXVlbmN5Piw8c2FtcGxlcmF0ZT4nXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICdjaGlycDo8Y2hhbm5lbHM+LDxzYW1wbGVyYXRlPidcbiIpOworfQorCitzdGF0aWMgaW50IHdyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgYm9vbCBpc0J1ZmZlckZsb2F0KSB7CisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIG9rIHRvIHBhc3MgaW4gTlVMTCBmaWxlbmFtZQorICAgIH0KKyAgICAvLyB3cml0ZSBvdXRwdXQgdG8gZmlsZS4KKyAgICBTRl9JTkZPIGluZm87CisgICAgaW5mby5mcmFtZXMgPSAwOworICAgIGluZm8uc2FtcGxlcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgaW5mby5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGluZm8uZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IChpc0J1ZmZlckZsb2F0ID8gU0ZfRk9STUFUX0ZMT0FUIDogU0ZfRk9STUFUX1BDTV8xNik7CisgICAgcHJpbnRmKCJzYXZpbmcgZmlsZTolcyAgY2hhbm5lbHM6JXUgIHNhbXBsZXJhdGU6JXUgIGZyYW1lczolenVcbiIsCisgICAgICAgICAgICBmaWxlbmFtZSwgaW5mby5jaGFubmVscywgaW5mby5zYW1wbGVyYXRlLCBmcmFtZXMpOworICAgIFNOREZJTEUgKnNmID0gc2Zfb3BlbihmaWxlbmFtZSwgU0ZNX1dSSVRFLCAmaW5mbyk7CisgICAgaWYgKHNmID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaWYgKGlzQnVmZmVyRmxvYXQpIHsKKyAgICAgICAgKHZvaWQpIHNmX3dyaXRlZl9mbG9hdChzZiwgKGZsb2F0KilidWZmZXIsIGZyYW1lcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKHZvaWQpIHNmX3dyaXRlZl9zaG9ydChzZiwgKHNob3J0KilidWZmZXIsIGZyYW1lcyk7CisgICAgfQorICAgIHNmX2Nsb3NlKHNmKTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgY29uc3QgY2hhciogY29uc3QgcHJvZ25hbWUgPSBhcmd2WzBdOworICAgIGJvb2wgdXNlSW5wdXRGbG9hdCA9IGZhbHNlOworICAgIGJvb2wgdXNlTWl4ZXJGbG9hdCA9IGZhbHNlOworICAgIGJvb2wgdXNlUmFtcCA9IHRydWU7CisgICAgdWludDMyX3Qgb3V0cHV0U2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgIHVpbnQzMl90IG91dHB1dENoYW5uZWxzID0gMjsgLy8gc3RlcmVvIGZvciBub3cKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IFB2YWx1ZXM7CisgICAgY29uc3QgY2hhciogb3V0cHV0RmlsZW5hbWUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIqIGF1eEZpbGVuYW1lID0gTlVMTDsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBOYW1lczsKKyAgICBzdGQ6OnZlY3RvcjxTaWduYWxQcm92aWRlcj4gUHJvdmlkZXJzOworCisgICAgZm9yIChpbnQgY2g7IChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZm1jOnM6bzphOlA6IikpICE9IC0xOykgeworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgdXNlSW5wdXRGbG9hdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICB1c2VNaXhlckZsb2F0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIG91dHB1dENoYW5uZWxzID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgb3V0cHV0U2FtcGxlUmF0ZSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIG91dHB1dEZpbGVuYW1lID0gb3B0YXJnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICAgICAgYXV4RmlsZW5hbWUgPSBvcHRhcmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICBpZiAocGFyc2VDU1Yob3B0YXJnLCBQdmFsdWVzKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluY29ycmVjdCBzeW50YXggZm9yIC1QIG9wdGlvblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHVzYWdlKHByb2duYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisKKyAgICBpZiAoYXJnYyA9PSAwKSB7CisgICAgICAgIHVzYWdlKHByb2duYW1lKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaWYgKCh1bnNpZ25lZClhcmdjID4gQXVkaW9NaXhlcjo6TUFYX05VTV9UUkFDS1MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSB0cmFja3M6ICVkID4gJXUiLCBhcmdjLCBBdWRpb01peGVyOjpNQVhfTlVNX1RSQUNLUyk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgc2l6ZV90IG91dHB1dEZyYW1lcyA9IDA7CisKKyAgICAvLyBjcmVhdGUgcHJvdmlkZXJzIGZvciBlYWNoIHRyYWNrCisgICAgUHJvdmlkZXJzLnJlc2l6ZShhcmdjKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGlycFtdID0gImNoaXJwOiI7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNpbmVbXSA9ICJzaW5lOiI7CisgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUga1NlY29uZHMgPSAxOworCisgICAgICAgIGlmICghc3RybmNtcChhcmd2W2ldLCBjaGlycCwgc3RybGVuKGNoaXJwKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdjsKKworICAgICAgICAgICAgcGFyc2VDU1YoYXJndltpXSArIHN0cmxlbihjaGlycCksIHYpOworICAgICAgICAgICAgaWYgKHYuc2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNyZWF0aW5nIGNoaXJwKCVkICVkKVxuIiwgdlswXSwgdlsxXSk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldENoaXJwPGZsb2F0Pih2WzBdLCAwLCB2WzFdLzIsIHZbMV0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0Q2hpcnA8aW50MTZfdD4odlswXSwgMCwgdlsxXS8yLCB2WzFdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGZvcm1lZCBpbnB1dCAnJXMnXG4iLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCBzaW5lLCBzdHJsZW4oc2luZSkpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisKKyAgICAgICAgICAgIHBhcnNlQ1NWKGFyZ3ZbaV0gKyBzdHJsZW4oc2luZSksIHYpOworICAgICAgICAgICAgaWYgKHYuc2l6ZSgpID09IDMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNyZWF0aW5nIHNpbmUoJWQgJWQgJWQpXG4iLCB2WzBdLCB2WzFdLCB2WzJdKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlSW5wdXRGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0U2luZTxmbG9hdD4odlswXSwgdlsxXSwgdlsyXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRTaW5lPGludDE2X3Q+KHZbMF0sIHZbMV0sIHZbMl0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEluY3IoUHZhbHVlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsZm9ybWVkIGlucHV0ICclcydcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyBmaWxlbmFtZSglcylcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgaWYgKHVzZUlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0RmlsZTxmbG9hdD4oYXJndltpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRGaWxlPHNob3J0Pihhcmd2W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICB9CisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMKKyAgICAgICAgc2l6ZV90IG5mcmFtZXMgPSAoaW50NjRfdCkgUHJvdmlkZXJzW2ldLmdldE51bUZyYW1lcygpICogb3V0cHV0U2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgIC8gUHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBvdXRwdXRGcmFtZXMgPiBuZnJhbWVzKSB7IC8vIGNob29zZSBtaW5pbXVtIGZvciBvdXRwdXRGcmFtZXMKKyAgICAgICAgICAgIG91dHB1dEZyYW1lcyA9IG5mcmFtZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIG91dHB1dCBidWZmZXIuCisgICAgY29uc3Qgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSA9IG91dHB1dENoYW5uZWxzCisgICAgICAgICAgICAqICh1c2VNaXhlckZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KSk7CisgICAgY29uc3Qgc2l6ZV90IG91dHB1dFNpemUgPSBvdXRwdXRGcmFtZXMgKiBvdXRwdXRGcmFtZVNpemU7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG91dHB1dENoYW5uZWxzKTsKKyAgICB2b2lkICpvdXRwdXRBZGRyID0gTlVMTDsKKyAgICAodm9pZCkgcG9zaXhfbWVtYWxpZ24oJm91dHB1dEFkZHIsIDMyLCBvdXRwdXRTaXplKTsKKyAgICBtZW1zZXQob3V0cHV0QWRkciwgMCwgb3V0cHV0U2l6ZSk7CisKKyAgICAvLyBjcmVhdGUgdGhlIGF1eCBidWZmZXIsIGlmIG5lZWRlZC4KKyAgICBjb25zdCBzaXplX3QgYXV4RnJhbWVTaXplID0gc2l6ZW9mKGludDMyX3QpOyAvLyBRNC4yNyBhbHdheXMKKyAgICBjb25zdCBzaXplX3QgYXV4U2l6ZSA9IG91dHB1dEZyYW1lcyAqIGF1eEZyYW1lU2l6ZTsKKyAgICB2b2lkICphdXhBZGRyID0gTlVMTDsKKyAgICBpZiAoYXV4RmlsZW5hbWUpIHsKKyAgICAgICAgKHZvaWQpIHBvc2l4X21lbWFsaWduKCZhdXhBZGRyLCAzMiwgYXV4U2l6ZSk7CisgICAgICAgIG1lbXNldChhdXhBZGRyLCAwLCBhdXhTaXplKTsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIG1peGVyLgorICAgIGNvbnN0IHNpemVfdCBtaXhlckZyYW1lQ291bnQgPSAzMjA7IC8vIHR5cGljYWwgbnVtYmVycyBtYXkgcmFuZ2UgZnJvbSAyNDAgb3IgOTYwCisgICAgQXVkaW9NaXhlciAqbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtaXhlckZyYW1lQ291bnQsIG91dHB1dFNhbXBsZVJhdGUpOworICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0ID0gdXNlSW5wdXRGbG9hdAorICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJGb3JtYXQgPSB1c2VNaXhlckZsb2F0CisgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCAvIFByb3ZpZGVycy5zaXplKCk7IC8vIG5vcm1hbGl6ZSB2b2x1bWUgYnkgIyB0cmFja3MKKyAgICBzdGF0aWMgZmxvYXQgZjA7IC8vIHplcm8KKworICAgIC8vIHNldCB1cCB0aGUgdHJhY2tzLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgUHJvdmlkZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vcHJpbnRmKCJ0cmFjayAlZCBvdXQgb2YgJWRcbiIsIGksIFByb3ZpZGVycy5zaXplKCkpOworICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChQcm92aWRlcnNbaV0uZ2V0TnVtQ2hhbm5lbHMoKSk7CisgICAgICAgIGludDMyX3QgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7CisgICAgICAgIE5hbWVzLnB1c2hfYmFjayhuYW1lKTsKKyAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsICZQcm92aWRlcnNbaV0pOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKW91dHB1dEFkZHIpOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltaXhlckZvcm1hdCk7CisgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpGT1JNQVQsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWlucHV0Rm9ybWF0KTsKKyAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3Qpb3V0cHV0Q2hhbm5lbE1hc2spOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCljaGFubmVsTWFzayk7CisgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpUHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgIGlmICh1c2VSYW1wKSB7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYwKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZjApOworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1eEZpbGVuYW1lKSB7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpBVVhfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBhdXhBZGRyKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJmYwKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUUsIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmZik7CisgICAgICAgIH0KKyAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICB9CisKKyAgICAvLyBwdW1wIHRoZSBtaXhlciB0byBwcm9jZXNzIGRhdGEuCisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG91dHB1dEZyYW1lcyAtIG1peGVyRnJhbWVDb3VudDsgaSArPSBtaXhlckZyYW1lQ291bnQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBOYW1lcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihOYW1lc1tqXSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBvdXRwdXRBZGRyICsgaSAqIG91dHB1dEZyYW1lU2l6ZSk7CisgICAgICAgICAgICBpZiAoYXV4RmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKE5hbWVzW2pdLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6QVVYX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIGF1eEFkZHIgKyBpICogYXV4RnJhbWVTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtaXhlci0+cHJvY2VzcyhBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CisgICAgfQorICAgIG91dHB1dEZyYW1lcyA9IGk7IC8vIHJlc2V0IG91dHB1dCBmcmFtZXMgdG8gdGhlIGRhdGEgYWN0dWFsbHkgcHJvZHVjZWQuCisKKyAgICAvLyB3cml0ZSB0byBmaWxlcworICAgIHdyaXRlRmlsZShvdXRwdXRGaWxlbmFtZSwgb3V0cHV0QWRkciwKKyAgICAgICAgICAgIG91dHB1dFNhbXBsZVJhdGUsIG91dHB1dENoYW5uZWxzLCBvdXRwdXRGcmFtZXMsIHVzZU1peGVyRmxvYXQpOworICAgIGlmIChhdXhGaWxlbmFtZSkgeworICAgICAgICAvLyBBdXggYnVmZmVyIGlzIGFsd2F5cyBpbiBxNF8yNyBmb3JtYXQgZm9yIG5vdy4KKyAgICAgICAgLy8gbWVtY3B5X3RvX2kxNl9mcm9tX3E0XzI3KCksIGJ1dCB3aXRoIHN0ZXJlbyBmcmFtZSBjb3VudCAobm90IHNhbXBsZSBjb3VudCkKKyAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QqKWF1eEFkZHIsIChpbnQzMl90KilhdXhBZGRyLCBvdXRwdXRGcmFtZXMgPj4gMSk7CisgICAgICAgIHdyaXRlRmlsZShhdXhGaWxlbmFtZSwgYXV4QWRkciwgb3V0cHV0U2FtcGxlUmF0ZSwgMSwgb3V0cHV0RnJhbWVzLCBmYWxzZSk7CisgICAgfQorCisgICAgZGVsZXRlIG1peGVyOworICAgIGZyZWUob3V0cHV0QWRkcik7CisgICAgZnJlZShhdXhBZGRyKTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3RfdXRpbHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1MWNkYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0X3V0aWxzLmgKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fVEVTVF9VVElMU19ICisjZGVmaW5lIEFORFJPSURfQVVESU9fVEVTVF9VVElMU19ICisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisKKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGlzX3NhbWUKK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19zYW1lPFQsIFQ+ICAvLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgVCBjb252ZXJ0VmFsdWUoZG91YmxlIHZhbCkKK3sKKyAgICBpZiAoaXNfc2FtZTxULCBpbnQxNl90Pjo6dmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGZsb29yKHZhbCAqIDMyNzY3LjAgKyAwLjUpOworICAgIH0gZWxzZSBpZiAoaXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGZsb29yKHZhbCAqICgxVUw8PDMxKSArIDAuNSk7CisgICAgfQorICAgIHJldHVybiB2YWw7IC8vIGFzc3VtZSBmbG9hdCBvciBkb3VibGUKK30KKworLy8gQ29udmVydCBhIGxpc3Qgb2YgaW50ZWdlcnMgaW4gQ1NWIGZvcm1hdCB0byBhIFZlY3RvciBvZiB0aG9zZSB2YWx1ZXMuCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QsIG9yIC0xIG9uIGVycm9yLgorc3RhdGljIGlubGluZSBpbnQgcGFyc2VDU1YoY29uc3QgY2hhciAqc3RyaW5nLCBzdGQ6OnZlY3RvcjxpbnQ+JiB2YWx1ZXMpCit7CisgICAgLy8gcGFzcyAxOiBjb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBhbmQgZG8gc3ludGF4IGNoZWNrCisgICAgc2l6ZV90IG51bVZhbHVlcyA9IDA7CisgICAgYm9vbCBoYWREaWdpdCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgY2hhciAqcCA9IHN0cmluZzsgOyApIHsKKyAgICAgICAgc3dpdGNoICgqcCsrKSB7CisgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgICAgICAgaGFkRGlnaXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIC8vIHBhc3MgMjogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdmVjdG9yIG9mIHZhbHVlcworICAgICAgICAgICAgICAgIHZhbHVlcy5yZXNpemUoKytudW1WYWx1ZXMpOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGF0b2kocCA9IHN0cmluZyk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1WYWx1ZXM7ICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnArKyA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpKytdID0gYXRvaShwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtVmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgaWYgKGhhZERpZ2l0KSB7CisgICAgICAgICAgICAgICAgaGFkRGlnaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBudW1WYWx1ZXMrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDcmVhdGVzIGEgdHlwZS1pbmRlcGVuZGVudCBhdWRpbyBidWZmZXIgcHJvdmlkZXIgZnJvbQorICogYSBidWZmZXIgYmFzZSBhZGRyZXNzLCBzaXplLCBmcmFtZXNpemUsIGFuZCBpbnB1dCBpbmNyZW1lbnQgYXJyYXkuCisgKgorICogTm8gYWxsb2NhdGlvbiBvciBkZWFsbG9jYXRpb24gb2YgdGhlIHByb3ZpZGVkIGJ1ZmZlciBpcyBkb25lLgorICovCitjbGFzcyBUZXN0UHJvdmlkZXIgOiBwdWJsaWMgYW5kcm9pZDo6QXVkaW9CdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgVGVzdFByb3ZpZGVyKHZvaWQqIGFkZHIsIHNpemVfdCBmcmFtZXMsIHNpemVfdCBmcmFtZVNpemUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbnB1dEluY3IpCisgICAgOiBtQWRkcihhZGRyKSwKKyAgICAgIG1OdW1GcmFtZXMoZnJhbWVzKSwKKyAgICAgIG1GcmFtZVNpemUoZnJhbWVTaXplKSwKKyAgICAgIG1OZXh0RnJhbWUoMCksIG1VbnJlbCgwKSwgbUlucHV0SW5jcihpbnB1dEluY3IpLCBtTmV4dElkeCgwKQorICAgIHsKKyAgICB9CisKKyAgICBUZXN0UHJvdmlkZXIoKQorICAgIDogbUFkZHIoTlVMTCksIG1OdW1GcmFtZXMoMCksIG1GcmFtZVNpemUoMCksCisgICAgICBtTmV4dEZyYW1lKDApLCBtVW5yZWwoMCksIG1OZXh0SWR4KDApCisgICAgeworICAgIH0KKworICAgIHZvaWQgc2V0SW5jcihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbnB1dEluY3IpIHsKKyAgICAgICAgbUlucHV0SW5jciA9IGlucHV0SW5jcjsKKyAgICAgICAgbU5leHRJZHggPSAwOworICAgIH0KKworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgX191bnVzZWQgPSBrSW52YWxpZFBUUykKKyAgICB7CisgICAgICAgIHNpemVfdCByZXF1ZXN0ZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRGcmFtZXMgPiBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSkgeworICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtSW5wdXRJbmNyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBwcm92aWRlZCA9IG1JbnB1dEluY3JbbU5leHRJZHgrK107CisgICAgICAgICAgICBBTE9HVigiZ2V0TmV4dEJ1ZmZlcigpIG1WYWx1ZVslenVdPSV6dSBub3QgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbU5leHRJZHgtMSwgcHJvdmlkZWQsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgICAgICBpZiAocHJvdmlkZWQgPCBidWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBwcm92aWRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTmV4dElkeCA+PSBtSW5wdXRJbmNyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIG1OZXh0SWR4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZ2V0TmV4dEJ1ZmZlcigpIHJlcXVlc3RlZCAlenUgZnJhbWVzIG91dCBvZiAlenUgZnJhbWVzIGF2YWlsYWJsZSIKKyAgICAgICAgICAgICAgICAiIGFuZCByZXR1cm5lZCAlenUgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGcmFtZXMsIG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lLCBidWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICBtVW5yZWwgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgICAgICBidWZmZXItPnJhdyA9IChjaGFyICopbUFkZHIgKyBtRnJhbWVTaXplICogbU5leHRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtVW5yZWwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWxlYXNlQnVmZmVyKCkgcmVsZWFzZWQgJXp1IGZyYW1lcyBidXQgb25seSAlenUgYXZhaWxhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgInRvIHJlbGVhc2UiLCBidWZmZXItPmZyYW1lQ291bnQsIG1VbnJlbCk7CisgICAgICAgICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKKyAgICAgICAgICAgIG1VbnJlbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQnVmZmVyKCkgcmVsZWFzZWQgJXp1IGZyYW1lcyBvdXQgb2YgJXp1IGZyYW1lcyBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAidG8gcmVsZWFzZSIsIGJ1ZmZlci0+ZnJhbWVDb3VudCwgbVVucmVsKTsKKyAgICAgICAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgbVVucmVsIC09IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgfQorCisgICAgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBtTmV4dEZyYW1lID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgZ2V0TnVtRnJhbWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtTnVtRnJhbWVzOworICAgIH0KKworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCogbUFkZHI7ICAgLy8gYmFzZSBhZGRyZXNzCisgICAgc2l6ZV90IG1OdW1GcmFtZXM7ICAgLy8gdG90YWwgZnJhbWVzCisgICAgaW50IG1GcmFtZVNpemU7ICAgICAgLy8gZnJhbWUgc2l6ZSAoIyBjaGFubmVscyAqIGJ5dGVzIHBlciBzYW1wbGUpCisgICAgc2l6ZV90IG1OZXh0RnJhbWU7ICAgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBwcm92aWRlCisgICAgc2l6ZV90IG1VbnJlbDsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBub3QgeWV0IHJlbGVhc2VkCisgICAgc3RkOjp2ZWN0b3I8aW50PiBtSW5wdXRJbmNyOyAvLyBudW1iZXIgb2YgZnJhbWVzIHByb3ZpZGVkIHBlciBjYWxsCisgICAgc2l6ZV90IG1OZXh0SWR4OyAgICAgLy8gaW5kZXggb2YgbmV4dCBlbnRyeSBpbiBtSW5wdXRJbmNyIHRvIHVzZQorfTsKKworLyogQ3JlYXRlcyBhIGJ1ZmZlciBmaWxsZWQgd2l0aCBhIHNpbmUgd2F2ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIGNyZWF0ZVNpbmUodm9pZCAqdmJ1ZmZlciwgc2l6ZV90IGZyYW1lcywKKyAgICAgICAgc2l6ZV90IGNoYW5uZWxzLCBkb3VibGUgc2FtcGxlUmF0ZSwgZG91YmxlIGZyZXEpCit7CisgICAgZG91YmxlIHRzY2FsZSA9IDEuIC8gc2FtcGxlUmF0ZTsKKyAgICBUKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PFQqPih2YnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisgICAgICAgIGRvdWJsZSB0ID0gaSAqIHRzY2FsZTsKKyAgICAgICAgZG91YmxlIHkgPSBzaW4oMi4gKiBNX1BJICogZnJlcSAqIHQpOworICAgICAgICBUIHl0ID0gY29udmVydFZhbHVlPFQ+KHkpOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2hhbm5lbHM7ICsraikgeworICAgICAgICAgICAgYnVmZmVyW2kqY2hhbm5lbHMgKyBqXSA9IHl0IC8gVChqICsgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENyZWF0ZXMgYSBidWZmZXIgZmlsbGVkIHdpdGggYSBjaGlycCBzaWduYWwgKGEgc2luZSB3YXZlIHN3ZWVwKS4KKyAqCisgKiBXaGVuIGNyZWF0aW5nIHRoZSBDaGlycCwgbm90ZSB0aGF0IHRoZSBmcmVxdWVuY3kgaXMgdGhlIHRydWUgc2ludXNvaWRhbAorICogZnJlcXVlbmN5IG5vdCB0aGUgc2FtcGxpbmcgcmF0ZS4KKyAqCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NoaXJwCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBjcmVhdGVDaGlycCh2b2lkICp2YnVmZmVyLCBzaXplX3QgZnJhbWVzLAorICAgICAgICBzaXplX3QgY2hhbm5lbHMsIGRvdWJsZSBzYW1wbGVSYXRlLCAgZG91YmxlIG1pbmZyZXEsIGRvdWJsZSBtYXhmcmVxKQoreworICAgIGRvdWJsZSB0c2NhbGUgPSAxLiAvIHNhbXBsZVJhdGU7CisgICAgVCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxUKj4odmJ1ZmZlcik7CisgICAgLy8gbm90ZSB0aGUgY2hpcnAgY29uc3RhbnQgayBoYXMgYSBkaXZpZGUtYnktdHdvLgorICAgIGRvdWJsZSBrID0gKG1heGZyZXEgLSBtaW5mcmVxKSAvICgyLiAqIHRzY2FsZSAqIGZyYW1lcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBkb3VibGUgdCA9IGkgKiB0c2NhbGU7CisgICAgICAgIGRvdWJsZSB5ID0gc2luKDIuICogTV9QSSAqIChrICogdCArIG1pbmZyZXEpICogdCk7CisgICAgICAgIFQgeXQgPSBjb252ZXJ0VmFsdWU8VD4oeSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjaGFubmVsczsgKytqKSB7CisgICAgICAgICAgICBidWZmZXJbaSpjaGFubmVscyArIGpdID0geXQgLyBUKGogKyAxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogVGhpcyBkZXJpdmVkIGNsYXNzIGNyZWF0ZXMgYSBidWZmZXIgcHJvdmlkZXIgb2YgZGF0YXR5cGUgVCwKKyAqIGNvbnNpc3Rpbmcgb2YgYW4gaW5wdXQgc2lnbmFsLCBlLmcuIGZyb20gY3JlYXRlQ2hpcnAoKS4KKyAqIFRoZSBudW1iZXIgb2YgZnJhbWVzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBiYXNlIGNsYXNzCisgKiBUZXN0UHJvdmlkZXI6OmdldE51bUZyYW1lcygpLgorICovCisKK2NsYXNzIFNpZ25hbFByb3ZpZGVyIDogcHVibGljIFRlc3RQcm92aWRlciB7CitwdWJsaWM6CisgICAgU2lnbmFsUHJvdmlkZXIoKQorICAgIDogbVNhbXBsZVJhdGUoMCksCisgICAgICBtQ2hhbm5lbHMoMCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB+U2lnbmFsUHJvdmlkZXIoKQorICAgIHsKKyAgICAgICAgZnJlZShtQWRkcik7CisgICAgICAgIG1BZGRyID0gTlVMTDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHNldENoaXJwKHNpemVfdCBjaGFubmVscywgZG91YmxlIG1pbmZyZXEsIGRvdWJsZSBtYXhmcmVxLCBkb3VibGUgc2FtcGxlUmF0ZSwgZG91YmxlIHRpbWUpCisgICAgeworICAgICAgICBjcmVhdGVCdWZmZXJCeUZyYW1lczxUPihjaGFubmVscywgc2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSp0aW1lKTsKKyAgICAgICAgY3JlYXRlQ2hpcnA8VD4obUFkZHIsIG1OdW1GcmFtZXMsIG1DaGFubmVscywgbVNhbXBsZVJhdGUsIG1pbmZyZXEsIG1heGZyZXEpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgc2V0U2luZShzaXplX3QgY2hhbm5lbHMsCisgICAgICAgICAgICBkb3VibGUgZnJlcSwgZG91YmxlIHNhbXBsZVJhdGUsIGRvdWJsZSB0aW1lKQorICAgIHsKKyAgICAgICAgY3JlYXRlQnVmZmVyQnlGcmFtZXM8VD4oY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHNhbXBsZVJhdGUqdGltZSk7CisgICAgICAgIGNyZWF0ZVNpbmU8VD4obUFkZHIsIG1OdW1GcmFtZXMsICBtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlLCBmcmVxKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHNldEZpbGUoY29uc3QgY2hhciAqZmlsZV9pbikKKyAgICB7CisgICAgICAgIFNGX0lORk8gaW5mbzsKKyAgICAgICAgaW5mby5mb3JtYXQgPSAwOworICAgICAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4oZmlsZV9pbiwgU0ZNX1JFQUQsICZpbmZvKTsKKyAgICAgICAgaWYgKHNmID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBlcnJvcihmaWxlX2luKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjcmVhdGVCdWZmZXJCeUZyYW1lczxUPihpbmZvLmNoYW5uZWxzLCBpbmZvLnNhbXBsZXJhdGUsIGluZm8uZnJhbWVzKTsKKyAgICAgICAgaWYgKGlzX3NhbWU8VCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgKHZvaWQpIHNmX3JlYWRmX2Zsb2F0KHNmLCAoZmxvYXQgKikgbUFkZHIsIG1OdW1GcmFtZXMpOworICAgICAgICB9IGVsc2UgaWYgKGlzX3NhbWU8VCwgc2hvcnQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgKHZvaWQpIHNmX3JlYWRmX3Nob3J0KHNmLCAoc2hvcnQgKikgbUFkZHIsIG1OdW1GcmFtZXMpOworICAgICAgICB9CisgICAgICAgIHNmX2Nsb3NlKHNmKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGNyZWF0ZUJ1ZmZlckJ5RnJhbWVzKHNpemVfdCBjaGFubmVscywgdWludDMyX3Qgc2FtcGxlUmF0ZSwgc2l6ZV90IGZyYW1lcykKKyAgICB7CisgICAgICAgIG1OdW1GcmFtZXMgPSBmcmFtZXM7CisgICAgICAgIG1DaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxzICogc2l6ZW9mKFQpOworICAgICAgICBmcmVlKG1BZGRyKTsKKyAgICAgICAgbUFkZHIgPSBtYWxsb2MobUZyYW1lU2l6ZSAqIG1OdW1GcmFtZXMpOworICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVSYXRlOworICAgIH0KKworICAgIHVpbnQzMl90IGdldE51bUNoYW5uZWxzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNoYW5uZWxzOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHVpbnQzMl90IG1DaGFubmVsczsKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPX1RFU1RfVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxMmMzOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKQEAgLTAsMCArMSw4NiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBcCisgICAgQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorCitpZmVxICgkKFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZKSwgMSkKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcCBcCisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcAorCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKK2Vsc2UKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYmJpbmRlciBcCisgICAgbGlibWVkaWEgXAorICAgIGxpYmhhcmR3YXJlIFwKKyAgICBsaWJoYXJkd2FyZV9sZWdhY3kKKworaWZuZXEgKCQoVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kpLCAxKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCisgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyCitlbmRpZgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYnNlcnZpY2V1dGlsaXR5CisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5c2VydmljZQorCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKworaWZuZXEgKCQoVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kpLCAxKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIEF1ZGlvUG9saWN5TWFuYWdlci5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGlibG9nIFwKKyAgICBsaWJzb3VuZHRyaWdnZXIKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWFfaGVscGVyCisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitpZm5lcSAoJChVU0VfQ1VTVE9NX0FVRElPX1BPTElDWSksIDEpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5bWFuYWdlcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwOTBlOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5Q2xpZW50SW1wbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpZW50IGludGVyZmFjZSBmcm9tIHRoZSBwb2xpY3kgbWFuYWdlciAqLworCithdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmxvYWRId01vZHVsZShuYW1lKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQobW9kdWxlLCBvdXRwdXQsIGNvbmZpZywgZGV2aWNlcywgYWRkcmVzcywgbGF0ZW5jeU1zLCBmbGFncyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9wZW5EdXBsaWNhdGVPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBhZi0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQxLCBvdXRwdXQyKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+b3BlbklucHV0KG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6aW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGVsYXlfbXMpOworfQorCitTdHJpbmc4IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleXMpCit7CisgICAgU3RyaW5nOCByZXN1bHQgPSBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIGtleXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RvcFRvbmUoKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om1vdmVFZmZlY3RzKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNfb3V0cHV0LCBkc3Rfb3V0cHV0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5jbGllbnRDcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+Y2xpZW50UmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c2V0QXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPmNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcsIGRlbGF5TXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworfQorCithdWRpb191bmlxdWVfaWRfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpuZXdBdWRpb1VuaXF1ZUlkKCkKK3sKKyAgICByZXR1cm4gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzE5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjdW5kZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIF9fU1RESU5UX0xJTUlUUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisvLyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwb2xpY3kgbWFuYWdlciAqLworZXh0ZXJuICJDIiB7CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBhcHNfbG9hZF9od19tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmxvYWRId01vZHVsZShuYW1lKTsKK30KKworc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5fb3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIGlmIChwU2FtcGxpbmdSYXRlID09IE5VTEwgfHwgcEZvcm1hdCA9PSBOVUxMIHx8IHBDaGFubmVsTWFzayA9PSBOVUxMIHx8CisgICAgICAgICAgICBwRGV2aWNlcyA9PSBOVUxMIHx8IHBMYXRlbmN5TXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBjb25maWcuc2FtcGxlX3JhdGUgPSAqcFNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWcuZm9ybWF0ID0gKnBGb3JtYXQ7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9ICpwQ2hhbm5lbE1hc2s7CisgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICB9CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWYtPm9wZW5PdXRwdXQobW9kdWxlLCAmb3V0cHV0LCAmY29uZmlnLCBwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwgcExhdGVuY3lNcywgZmxhZ3MpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKnBTYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICpwRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgKnBDaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAqKChhdWRpb19vZmZsb2FkX2luZm9fdCAqKW9mZmxvYWRJbmZvKSA9IGNvbmZpZy5vZmZsb2FkX2luZm87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dDsKK30KKworLy8gZGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSgpCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgcmV0dXJuIG9wZW5fb3V0cHV0KChhdWRpb19tb2R1bGVfaGFuZGxlX3QpMCwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcExhdGVuY3lNcywgZmxhZ3MsIE5VTEwpOworfQorCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICByZXR1cm4gb3Blbl9vdXRwdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBhZi0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQxLCBvdXRwdXQyKTsKK30KKworaW50IGFwc19jbG9zZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKK30KKworaW50IGFwc19zdXNwZW5kX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Cit9CisKK2ludCBhcHNfcmVzdG9yZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOworfQorCitzdGF0aWMgYXVkaW9faW9faGFuZGxlX3Qgb3Blbl9pbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIGlmIChwU2FtcGxpbmdSYXRlID09IE5VTEwgfHwgcEZvcm1hdCA9PSBOVUxMIHx8IHBDaGFubmVsTWFzayA9PSBOVUxMIHx8IHBEZXZpY2VzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7OworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9ICpwU2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy5mb3JtYXQgPSAqcEZvcm1hdDsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKnBDaGFubmVsTWFzazsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5vcGVuSW5wdXQobW9kdWxlLCAmaW5wdXQsICZjb25maWcsIHBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksIEFVRElPX1NPVVJDRV9NSUMsIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCAvKkZJWE1FKi8pOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKnBTYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICpwRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgKnBDaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKworCisvLyBkZXByZWNhdGVkOiByZXBsYWNlZCBieSBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUoKSwgYW5kIGFjb3VzdGljcyBwYXJhbWV0ZXIgaXMgaWdub3JlZAorYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzIF9fdW51c2VkKQoreworICAgIHJldHVybiAgb3Blbl9pbnB1dCgoYXVkaW9fbW9kdWxlX2hhbmRsZV90KTAsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOworfQorCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQoreworICAgIHJldHVybiAgb3Blbl9pbnB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOworfQorCitpbnQgYXBzX2Nsb3NlX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7Cit9CisKK2ludCBhcHNfaW52YWxpZGF0ZV9zdHJlYW0odm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7Cit9CisKK2ludCBhcHNfbW92ZV9lZmZlY3RzKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3Rfb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbiwgc3JjX291dHB1dCwgZHN0X291dHB1dCk7Cit9CisKK2NoYXIgKiBhcHNfZ2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleXMpCit7CisgICAgU3RyaW5nOCByZXN1bHQgPSBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIFN0cmluZzgoa2V5cykpOworICAgIHJldHVybiBzdHJkdXAocmVzdWx0LnN0cmluZygpKTsKK30KKwordm9pZCBhcHNfc2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprdl9wYWlycywgaW50IGRlbGF5X21zKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBrdl9wYWlycywgZGVsYXlfbXMpOworfQorCitpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zKTsKK30KKworaW50IGFwc19zdGFydF90b25lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKK30KKworaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSkKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RvcFRvbmUoKTsKK30KKworaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKK30KKworfTsgLy8gZXh0ZXJuICJDIgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlMWIzNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTAsMCArMSw2NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5RWZmZWN0cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeUVmZmVjdHMgSW1wbGVtZW50YXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXVkaW9Qb2xpY3lFZmZlY3RzOjpBdWRpb1BvbGljeUVmZmVjdHMoKQoreworICAgIC8vIGxvYWQgYXV0b21hdGljIGF1ZGlvIGVmZmVjdCBtb2R1bGVzCisgICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKKyAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICBsb2FkQXVkaW9FZmZlY3RDb25maWcoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOworICAgIH0KK30KKworCitBdWRpb1BvbGljeUVmZmVjdHM6On5BdWRpb1BvbGljeUVmZmVjdHMoKQoreworICAgIHNpemVfdCBpID0gMDsKKyAgICAvLyByZWxlYXNlIGF1ZGlvIGlucHV0IHByb2Nlc3NpbmcgcmVzb3VyY2VzCisgICAgZm9yIChpID0gMDsgaSA8IG1JbnB1dFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1JbnB1dFNvdXJjZXMudmFsdWVBdChpKTsKKyAgICB9CisgICAgbUlucHV0U291cmNlcy5jbGVhcigpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0cy52YWx1ZUF0KGkpLT5tRWZmZWN0cy5jbGVhcigpOworICAgICAgICBkZWxldGUgbUlucHV0cy52YWx1ZUF0KGkpOworICAgIH0KKyAgICBtSW5wdXRzLmNsZWFyKCk7CisKKyAgICAvLyByZWxlYXNlIGF1ZGlvIG91dHB1dCBwcm9jZXNzaW5nIHJlc291cmNlcworICAgIGZvciAoaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgbU91dHB1dFN0cmVhbXMudmFsdWVBdChpKTsKKyAgICB9CisgICAgbU91dHB1dFN0cmVhbXMuY2xlYXIoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtT3V0cHV0U2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU91dHB1dFNlc3Npb25zLnZhbHVlQXQoaSktPm1FZmZlY3RzLmNsZWFyKCk7CisgICAgICAgIGRlbGV0ZSBtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpKTsKKyAgICB9CisgICAgbU91dHB1dFNlc3Npb25zLmNsZWFyKCk7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjphZGRJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKKyAgICBhdWRpb19zb3VyY2VfdCBhbGlhc1NvdXJjZSA9IChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIDogaW5wdXRTb3VyY2U7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2VzLmluZGV4T2ZLZXkoYWxpYXNTb3VyY2UpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoImFkZElucHV0RWZmZWN0cygpOiBubyBwcm9jZXNzaW5nIG5lZWRzIHRvIGJlIGF0dGFjaGVkIHRvIHRoaXMgc291cmNlIik7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHNzaXplX3QgaWR4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBFZmZlY3RWZWN0b3IgKmlucHV0RGVzYzsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBpbnB1dERlc2MgPSBuZXcgRWZmZWN0VmVjdG9yKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVmZmVjdFZlY3RvciBpcyBleGlzdGluZyBhbmQgd2UganVzdCBuZWVkIHRvIGluY3JlYXNlIHJlZiBjb3VudAorICAgICAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaWR4KTsKKyAgICB9CisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQrKzsKKworICAgIEFMT0dWKCJhZGRJbnB1dEVmZmVjdHMoKTogaW5wdXQ6ICVkLCByZWZDb3VudDogJWQiLCBpbnB1dCwgaW5wdXREZXNjLT5tUmVmQ291bnQpOworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAxKSB7CisgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJhZGRJbnB1dEVmZmVjdHMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBzb3VyY2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+bU5hbWUsIChpbnQzMl90KWFsaWFzU291cmNlKTsKKyAgICAgICAgICAgICAgICAvLyBmeCBnb2VzIG91dCBvZiBzY29wZSBhbmQgc3Ryb25nIHJlZiBvbiBBdWRpb0VmZmVjdCBpcyByZWxlYXNlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBlZmZlY3QtPm1QYXJhbXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmeC0+c2V0UGFyYW1ldGVyKGVmZmVjdC0+bVBhcmFtc1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiYWRkSW5wdXRFZmZlY3RzKCk6IGFkZGVkIEZ4ICVzIG9uIHNvdXJjZTogJWQiLAorICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tTmFtZSwgKGludDMyX3QpYWxpYXNTb3VyY2UpOworICAgICAgICAgICAgaW5wdXREZXNjLT5tRWZmZWN0cy5hZGQoZngpOworICAgICAgICB9CisgICAgICAgIGlucHV0RGVzYy0+c2V0UHJvY2Vzc29yRW5hYmxlZCh0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbGVhc2VJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgRWZmZWN0VmVjdG9yICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIGlucHV0RGVzYy0+bVJlZkNvdW50LS07CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dEVmZmVjdHMoKTogaW5wdXQ6ICVkLCByZWZDb3VudDogJWQiLCBpbnB1dCwgaW5wdXREZXNjLT5tUmVmQ291bnQpOworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIGlucHV0RGVzYy0+c2V0UHJvY2Vzc29yRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGRlbGV0ZSBpbnB1dERlc2M7CisgICAgICAgIG1JbnB1dHMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXRFZmZlY3RzKCk6IGFsbCBlZmZlY3RzIHJlbGVhc2VkIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2l6ZV90IGluZGV4OworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChtSW5wdXRzLnZhbHVlQXQoaW5kZXgpLT5tU2Vzc2lvbklkID09IGF1ZGlvU2Vzc2lvbikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluZGV4ID09IG1JbnB1dHMuc2l6ZSgpKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID4gZWZmZWN0cyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IGVmZmVjdHNbaV0tPmRlc2NyaXB0b3IoKTsKKyAgICAgICAgaWYgKGkgPCAqY291bnQpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldID0gZGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZWZmZWN0cy5zaXplKCkgPiAqY291bnQpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgIH0KKyAgICAqY291bnQgPSBlZmZlY3RzLnNpemUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cXVlcnlEZWZhdWx0T3V0cHV0U2Vzc2lvbkVmZmVjdHMoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtT3V0cHV0U2Vzc2lvbnMuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpbmRleCktPm1TZXNzaW9uSWQgPT0gYXVkaW9TZXNzaW9uKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gbU91dHB1dFNlc3Npb25zLnNpemUoKSkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+IGVmZmVjdHMgPSBtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IGVmZmVjdHNbaV0tPmRlc2NyaXB0b3IoKTsKKyAgICAgICAgaWYgKGkgPCAqY291bnQpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldID0gZGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZWZmZWN0cy5zaXplKCkgPiAqY291bnQpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgIH0KKyAgICAqY291bnQgPSBlZmZlY3RzLnNpemUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW0pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoImFkZE91dHB1dFNlc3Npb25FZmZlY3RzKCk6IG5vIG91dHB1dCBwcm9jZXNzaW5nIG5lZWRlZCBmb3IgdGhpcyBzdHJlYW0iKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFNlc3Npb25zLmluZGV4T2ZLZXkoYXVkaW9TZXNzaW9uKTsKKyAgICBFZmZlY3RWZWN0b3IgKnByb2NEZXNjOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIHByb2NEZXNjID0gbmV3IEVmZmVjdFZlY3RvcihhdWRpb1Nlc3Npb24pOworICAgICAgICBtT3V0cHV0U2Vzc2lvbnMuYWRkKGF1ZGlvU2Vzc2lvbiwgcHJvY0Rlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVmZmVjdFZlY3RvciBpcyBleGlzdGluZyBhbmQgd2UganVzdCBuZWVkIHRvIGluY3JlYXNlIHJlZiBjb3VudAorICAgICAgICBwcm9jRGVzYyA9IG1PdXRwdXRTZXNzaW9ucy52YWx1ZUF0KGlkeCk7CisgICAgfQorICAgIHByb2NEZXNjLT5tUmVmQ291bnQrKzsKKworICAgIEFMT0dWKCJhZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBzZXNzaW9uOiAlZCwgcmVmQ291bnQ6ICVkIiwKKyAgICAgICAgICBhdWRpb1Nlc3Npb24sIHByb2NEZXNjLT5tUmVmQ291bnQpOworICAgIGlmIChwcm9jRGVzYy0+bVJlZkNvdW50ID09IDEpIHsKKyAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sIG91dHB1dCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBmYWlsZWQgdG8gY3JlYXRlIEZ4ICAlcyBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1OYW1lLCBhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgICAgIC8vIGZ4IGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBzdHJvbmcgcmVmIG9uIEF1ZGlvRWZmZWN0IGlzIHJlbGVhc2VkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiYWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogYWRkZWQgRnggJXMgb24gc2Vzc2lvbjogJWQgZm9yIHN0cmVhbTogJWQiLAorICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tTmFtZSwgYXVkaW9TZXNzaW9uLCAoaW50MzJfdClzdHJlYW0pOworICAgICAgICAgICAgcHJvY0Rlc2MtPm1FZmZlY3RzLmFkZChmeCk7CisgICAgICAgIH0KKworICAgICAgICBwcm9jRGVzYy0+c2V0UHJvY2Vzc29yRW5hYmxlZCh0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgKHZvaWQpIG91dHB1dDsgLy8gYXJndW1lbnQgbm90IHVzZWQgZm9yIG5vdworICAgICh2b2lkKSBzdHJlYW07IC8vIGFyZ3VtZW50IG5vdCB1c2VkIGZvciBub3cKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRTZXNzaW9ucy5pbmRleE9mS2V5KGF1ZGlvU2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVigicmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzOiBubyBvdXRwdXQgcHJvY2Vzc2luZyB3YXMgYXR0YWNoZWQgdG8gdGhpcyBzdHJlYW0iKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIEVmZmVjdFZlY3RvciAqcHJvY0Rlc2MgPSBtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpbmRleCk7CisgICAgcHJvY0Rlc2MtPm1SZWZDb3VudC0tOworICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogc2Vzc2lvbjogJWQsIHJlZkNvdW50OiAlZCIsCisgICAgICAgICAgYXVkaW9TZXNzaW9uLCBwcm9jRGVzYy0+bVJlZkNvdW50KTsKKyAgICBpZiAocHJvY0Rlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIHByb2NEZXNjLT5zZXRQcm9jZXNzb3JFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgcHJvY0Rlc2MtPm1FZmZlY3RzLmNsZWFyKCk7CisgICAgICAgIGRlbGV0ZSBwcm9jRGVzYzsKKyAgICAgICAgbU91dHB1dFNlc3Npb25zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBBTE9HVigicmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKCk6IG91dHB1dCBwcm9jZXNzaW5nIHJlbGVhc2VkIGZyb20gc2Vzc2lvbjogJWQiLAorICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lFZmZlY3RzOjpFZmZlY3RWZWN0b3I6OnNldFByb2Nlc3NvckVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHMuaXRlbUF0KGkpLT5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpbyBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLypzdGF0aWMqLyBjb25zdCBjaGFyICogY29uc3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjprSW5wdXRTb3VyY2VOYW1lc1tBVURJT19TT1VSQ0VfQ05UIC0xXSA9IHsKKyAgICBNSUNfU1JDX1RBRywKKyAgICBWT0lDRV9VTF9TUkNfVEFHLAorICAgIFZPSUNFX0RMX1NSQ19UQUcsCisgICAgVk9JQ0VfQ0FMTF9TUkNfVEFHLAorICAgIENBTUNPUkRFUl9TUkNfVEFHLAorICAgIFZPSUNFX1JFQ19TUkNfVEFHLAorICAgIFZPSUNFX0NPTU1fU1JDX1RBRworfTsKKworLy8gcmV0dXJucyB0aGUgYXVkaW9fc291cmNlX3QgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgbmFtZSBvcgorLy8gQVVESU9fU09VUkNFX0NOVCBpcyBubyBtYXRjaCBmb3VuZAorLypzdGF0aWMqLyBhdWRpb19zb3VyY2VfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IEFVRElPX1NPVVJDRV9NSUM7IGkgPCBBVURJT19TT1VSQ0VfQ05UOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBrSW5wdXRTb3VyY2VOYW1lc1tpIC0gQVVESU9fU09VUkNFX01JQ10pID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJpbnB1dFNvdXJjZU5hbWVUb0VudW0gZm91bmQgc291cmNlICVzICVkIiwgbmFtZSwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGF1ZGlvX3NvdXJjZV90KWk7Cit9CisKK2NvbnN0IGNoYXIgKkF1ZGlvUG9saWN5RWZmZWN0czo6a1N0cmVhbU5hbWVzW0FVRElPX1NUUkVBTV9DTlQrMV0gPSB7CisgICAgQVVESU9fU1RSRUFNX0RFRkFVTFRfVEFHLAorICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMX1RBRywKKyAgICBBVURJT19TVFJFQU1fU1lTVEVNX1RBRywKKyAgICBBVURJT19TVFJFQU1fUklOR19UQUcsCisgICAgQVVESU9fU1RSRUFNX01VU0lDX1RBRywKKyAgICBBVURJT19TVFJFQU1fQUxBUk1fVEFHLAorICAgIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT05fVEFHLAorICAgIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPX1RBRywKKyAgICBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRV9UQUcsCisgICAgQVVESU9fU1RSRUFNX0RUTUZfVEFHLAorICAgIEFVRElPX1NUUkVBTV9UVFNfVEFHCit9OworCisvLyByZXR1cm5zIHRoZSBhdWRpb19zdHJlYW1fdCBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dCBzdHJlYW0gbmFtZSBvcgorLy8gQVVESU9fU1RSRUFNX0NOVCBpcyBubyBtYXRjaCBmb3VuZAorYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnN0cmVhbU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBBVURJT19TVFJFQU1fREVGQVVMVDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIGtTdHJlYW1OYW1lc1tpIC0gQVVESU9fU1RSRUFNX0RFRkFVTFRdKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic3RyZWFtTmFtZVRvRW51bSBmb3VuZCBzdHJlYW0gJXMgJWQiLCBuYW1lLCBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoYXVkaW9fc3RyZWFtX3R5cGVfdClpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpbyBFZmZlY3QgQ29uZmlnIHBhcnNlcgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzaXplX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpncm93UGFyYW1TaXplKGNoYXIgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpCit7CisgICAgLy8gKmN1clNpemUgaXMgYXQgbGVhc3Qgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIDIgKiBzaXplb2YoaW50KQorICAgIHNpemVfdCBwb3MgPSAoKCpjdXJTaXplIC0gMSApIC8gc2l6ZSArIDEpICogc2l6ZTsKKworICAgIGlmIChwb3MgKyBzaXplID4gKnRvdFNpemUpIHsKKyAgICAgICAgd2hpbGUgKHBvcyArIHNpemUgPiAqdG90U2l6ZSkgeworICAgICAgICAgICAgKnRvdFNpemUgKz0gKCgqdG90U2l6ZSArIDcpIC8gOCkgKiA0OworICAgICAgICB9CisgICAgICAgIHBhcmFtID0gKGNoYXIgKilyZWFsbG9jKHBhcmFtLCAqdG90U2l6ZSk7CisgICAgfQorICAgICpjdXJTaXplID0gcG9zICsgc2l6ZTsKKyAgICByZXR1cm4gcG9zOworfQorCitzaXplX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZWFkUGFyYW1WYWx1ZShjbm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKQoreworICAgIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIFNIT1JUX1RBRywgc2l6ZW9mKFNIT1JUX1RBRykgKyAxKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2Yoc2hvcnQpLCBjdXJTaXplLCB0b3RTaXplKTsKKyAgICAgICAgKihzaG9ydCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IChzaG9ydClhdG9pKG5vZGUtPnZhbHVlKTsKKyAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBzaG9ydCAlZCIsICooc2hvcnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOworICAgICAgICByZXR1cm4gc2l6ZW9mKHNob3J0KTsKKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgSU5UX1RBRywgc2l6ZW9mKElOVF9UQUcpICsgMSkgPT0gMCkgeworICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGludCksIGN1clNpemUsIHRvdFNpemUpOworICAgICAgICAqKGludCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IGF0b2kobm9kZS0+dmFsdWUpOworICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGludCAlZCIsICooaW50ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihpbnQpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBGTE9BVF9UQUcsIHNpemVvZihGTE9BVF9UQUcpICsgMSkgPT0gMCkgeworICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGZsb2F0KSwgY3VyU2l6ZSwgdG90U2l6ZSk7CisgICAgICAgICooZmxvYXQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSAoZmxvYXQpYXRvZihub2RlLT52YWx1ZSk7CisgICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgZmxvYXQgJWYiLCooZmxvYXQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOworICAgICAgICByZXR1cm4gc2l6ZW9mKGZsb2F0KTsKKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgQk9PTF9UQUcsIHNpemVvZihCT09MX1RBRykgKyAxKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoYm9vbCksIGN1clNpemUsIHRvdFNpemUpOworICAgICAgICBpZiAoc3RybmNtcChub2RlLT52YWx1ZSwgImZhbHNlIiwgc3RybGVuKCJmYWxzZSIpICsgMSkgPT0gMCkgeworICAgICAgICAgICAgKihib29sICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgYm9vbCAlcyIsKihib29sICopKChjaGFyICopcGFyYW0gKyBwb3MpID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIHJldHVybiBzaXplb2YoYm9vbCk7CisgICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIFNUUklOR19UQUcsIHNpemVvZihTVFJJTkdfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cm5sZW4obm9kZS0+dmFsdWUsIEVGRkVDVF9TVFJJTkdfTEVOX01BWCk7CisgICAgICAgIGlmICgqY3VyU2l6ZSArIGxlbiArIDEgPiAqdG90U2l6ZSkgeworICAgICAgICAgICAgKnRvdFNpemUgPSAqY3VyU2l6ZSArIGxlbiArIDE7CisgICAgICAgICAgICBwYXJhbSA9IChjaGFyICopcmVhbGxvYyhwYXJhbSwgKnRvdFNpemUpOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkocGFyYW0gKyAqY3VyU2l6ZSwgbm9kZS0+dmFsdWUsIGxlbik7CisgICAgICAgICpjdXJTaXplICs9IGxlbjsKKyAgICAgICAgcGFyYW1bKmN1clNpemVdID0gJ1wwJzsKKyAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBzdHJpbmcgJXMiLCBwYXJhbSArICpjdXJTaXplIC0gbGVuKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgQUxPR1coInJlYWRQYXJhbVZhbHVlKCkgdW5rbm93biBwYXJhbSB0eXBlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2VmZmVjdF9wYXJhbV90ICpBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRFZmZlY3RQYXJhbWV0ZXIoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKnBhcmFtOworICAgIGNub2RlICp2YWx1ZTsKKyAgICBzaXplX3QgY3VyU2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCk7CisgICAgc2l6ZV90IHRvdFNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZihpbnQpOworICAgIGVmZmVjdF9wYXJhbV90ICpmeF9wYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKW1hbGxvYyh0b3RTaXplKTsKKworICAgIHBhcmFtID0gY29uZmlnX2ZpbmQocm9vdCwgUEFSQU1fVEFHKTsKKyAgICB2YWx1ZSA9IGNvbmZpZ19maW5kKHJvb3QsIFZBTFVFX1RBRyk7CisgICAgaWYgKHBhcmFtID09IE5VTEwgJiYgdmFsdWUgPT0gTlVMTCkgeworICAgICAgICAvLyB0cnkgdG8gcGFyc2Ugc2ltcGxlIHBhcmFtZXRlciBmb3JtIHtpbnQgaW50fQorICAgICAgICBwYXJhbSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgICAgICBpZiAocGFyYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gTm90ZTogdGhhdCBhIHBhaXIgb2YgcmFuZG9tIHN0cmluZ3MgaXMgcmVhZCBhcyAwIDAKKyAgICAgICAgICAgIGludCAqcHRyID0gKGludCAqKWZ4X3BhcmFtLT5kYXRhOworICAgICAgICAgICAgaW50ICpwdHIyID0gKGludCAqKSgoY2hhciAqKXBhcmFtICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSk7CisgICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdFBhcmFtZXRlcigpIHB0ciAlcCBwdHIyICVwIiwgcHRyLCBwdHIyKTsKKyAgICAgICAgICAgICpwdHIrKyA9IGF0b2kocGFyYW0tPm5hbWUpOworICAgICAgICAgICAgKnB0ciA9IGF0b2kocGFyYW0tPnZhbHVlKTsKKyAgICAgICAgICAgIGZ4X3BhcmFtLT5wc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICAgICAgZnhfcGFyYW0tPnZzaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgICAgICByZXR1cm4gZnhfcGFyYW07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW1ldGVyIGRlc2NyaXB0aW9uICVzIiwgcm9vdC0+bmFtZSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZnhfcGFyYW0tPnBzaXplID0gMDsKKyAgICBwYXJhbSA9IHBhcmFtLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAocGFyYW0pIHsKKyAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHBhcmFtIG9mIHR5cGUgJXMiLCBwYXJhbS0+bmFtZSk7CisgICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUocGFyYW0sIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7CisgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZnhfcGFyYW0tPnBzaXplICs9IHNpemU7CisgICAgICAgIHBhcmFtID0gcGFyYW0tPm5leHQ7CisgICAgfQorCisgICAgLy8gYWxpZ24gc3RhcnQgb2YgdmFsdWUgZmllbGQgb24gMzIgYml0IGJvdW5kYXJ5CisgICAgY3VyU2l6ZSA9ICgoY3VyU2l6ZSAtIDEgKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKKworICAgIGZ4X3BhcmFtLT52c2l6ZSA9IDA7CisgICAgdmFsdWUgPSB2YWx1ZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKHZhbHVlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcmVhZGluZyB2YWx1ZSBvZiB0eXBlICVzIiwgdmFsdWUtPm5hbWUpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IHJlYWRQYXJhbVZhbHVlKHZhbHVlLCAoY2hhciAqKWZ4X3BhcmFtLCAmY3VyU2l6ZSwgJnRvdFNpemUpOworICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGZ4X3BhcmFtLT52c2l6ZSArPSBzaXplOworICAgICAgICB2YWx1ZSA9IHZhbHVlLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBmeF9wYXJhbTsKKworZXJyb3I6CisgICAgZGVsZXRlIGZ4X3BhcmFtOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEVmZmVjdFBhcmFtZXRlcnMoY25vZGUgKnJvb3QsIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4mIHBhcmFtcykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0UGFyYW1ldGVycygpIGxvYWRpbmcgcGFyYW0gJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnBhcmFtID0gbG9hZEVmZmVjdFBhcmFtZXRlcihub2RlKTsKKyAgICAgICAgaWYgKHBhcmFtID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1zLmFkZChwYXJhbSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKworCitBdWRpb1BvbGljeUVmZmVjdHM6OkVmZmVjdERlc2NWZWN0b3IgKkF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEVmZmVjdENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNub2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZElucHV0U291cmNlKCkgZW1wdHkgZWxlbWVudCAlcyIsIHJvb3QtPm5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgRWZmZWN0RGVzY1ZlY3RvciAqZGVzYyA9IG5ldyBFZmZlY3REZXNjVmVjdG9yKCk7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChlZmZlY3RzW2ldLT5tTmFtZSwgbm9kZS0+bmFtZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RDb25maWcoKSBmb3VuZCBlZmZlY3QgJXMgaW4gbGlzdCIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID09IGVmZmVjdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEVmZmVjdENvbmZpZygpIGVmZmVjdCAlcyBub3QgaW4gbGlzdCIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygqZWZmZWN0c1tpXSk7ICAgLy8gZGVlcCBjb3B5CisgICAgICAgIGxvYWRFZmZlY3RQYXJhbWV0ZXJzKG5vZGUsIGVmZmVjdC0+bVBhcmFtcyk7CisgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0Q29uZmlnKCkgYWRkaW5nIGVmZmVjdCAlcyB1dWlkICUwOHgiLAorICAgICAgICAgICAgICBlZmZlY3QtPm1OYW1lLCBlZmZlY3QtPm1VdWlkLnRpbWVMb3cpOworICAgICAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIGlmIChkZXNjLT5tRWZmZWN0cy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdENvbmZpZygpIG5vIHZhbGlkIGVmZmVjdHMgZm91bmQgaW4gY29uZmlnICVzIiwgcm9vdC0+bmFtZSk7CisgICAgICAgIGRlbGV0ZSBkZXNjOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGRlc2M7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZElucHV0RWZmZWN0Q29uZmlndXJhdGlvbnMoY25vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFBSRVBST0NFU1NJTkdfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gaW5wdXRTb3VyY2VOYW1lVG9FbnVtKG5vZGUtPm5hbWUpOworICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9DTlQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJsb2FkSW5wdXRTb3VyY2VzKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZXMoKSBsb2FkaW5nIGlucHV0IHNvdXJjZSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gbG9hZEVmZmVjdENvbmZpZyhub2RlLCBlZmZlY3RzKTsKKyAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRTb3VyY2VzLmFkZChzb3VyY2UsIGRlc2MpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRTdHJlYW1FZmZlY3RDb25maWd1cmF0aW9ucyhjbm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVF9TRVNTSU9OX1BST0NFU1NJTkdfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1OYW1lVG9FbnVtKG5vZGUtPm5hbWUpOworICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJsb2FkU3RyZWFtRWZmZWN0Q29uZmlndXJhdGlvbnMoKSBpbnZhbGlkIG91dHB1dCBzdHJlYW0gJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImxvYWRTdHJlYW1FZmZlY3RDb25maWd1cmF0aW9ucygpIGxvYWRpbmcgb3V0cHV0IHN0cmVhbSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gbG9hZEVmZmVjdENvbmZpZyhub2RlLCBlZmZlY3RzKTsKKyAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtT3V0cHV0U3RyZWFtcy5hZGQoc3RyZWFtLCBkZXNjKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworQXVkaW9Qb2xpY3lFZmZlY3RzOjpFZmZlY3REZXNjICpBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGlmIChBdWRpb0VmZmVjdDo6c3RyaW5nVG9HdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEVmZmVjdERlc2Mocm9vdC0+bmFtZSwgdXVpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RzKCkgbG9hZGluZyBlZmZlY3QgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbG9hZEVmZmVjdChub2RlKTsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKworICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzOworICAgIGxvYWRFZmZlY3RzKHJvb3QsIGVmZmVjdHMpOworICAgIGxvYWRJbnB1dEVmZmVjdENvbmZpZ3VyYXRpb25zKHJvb3QsIGVmZmVjdHMpOworICAgIGxvYWRTdHJlYW1FZmZlY3RDb25maWd1cmF0aW9ucyhyb290LCBlZmZlY3RzKTsKKworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjBkNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lFRkZFQ1RTX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWUVGRkVDVFNfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBdWRpb1BvbGljeUVmZmVjdHMgY2xhc3MKKy8vIFRoaXMgY2xhc3Mgd2lsbCBtYW5hZ2UgYWxsIGVmZmVjdHMgYXR0YWNoZWQgdG8gaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIGluCisvLyBBdWRpb1BvbGljeVNlcnZpY2UgYXMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYuCitjbGFzcyBBdWRpb1BvbGljeUVmZmVjdHMgOiBwdWJsaWMgUmVmQmFzZQoreworCitwdWJsaWM6CisKKyAgICAvLyBUaGUgY29uc3RydWN0b3Igd2lsbCBwYXJzZSBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICAvLyBGaXJzdCBpdCB3aWxsIGxvb2sgd2hldGhlciB2ZW5kb3Igc3BlY2lmaWMgZmlsZSBleGlzdHMsCisgICAgLy8gb3RoZXJ3aXNlIGl0IHdpbGwgcGFyc2UgdGhlIHN5c3RlbSBkZWZhdWx0IGZpbGUuCisJICAgICAgICAgQXVkaW9Qb2xpY3lFZmZlY3RzKCk7CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lFZmZlY3RzKCk7CisKKyAgICAvLyBOT1RFOiBtZXRob2RzIG9uIEF1ZGlvUG9saWN5RWZmZWN0cyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggdGhlIEF1ZGlvUG9saWN5U2VydmljZQorICAgIC8vIG1haW4gbXV0ZXggKG1Mb2NrKSBoZWxkIGFzIHRoZXkgd2lsbCBpbmRpcmVjdGx5IGNhbGwgYmFjayBpbnRvIEF1ZGlvUG9saWN5U2VydmljZSB3aGVuCisgICAgLy8gbWFuYWdpbmcgYXVkaW8gZWZmZWN0cy4KKworICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZWZmZWN0IGRlc2NyaXB0b3JzIGZvciBkZWZhdWx0IGlucHV0IGVmZmVjdHMKKyAgICAvLyBhc3NvY2lhdGVkIHdpdGggYXVkaW9TZXNzaW9uCisgICAgc3RhdHVzX3QgcXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworCisgICAgLy8gQWRkIGFsbCBpbnB1dCBlZmZlY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlucHV0CisgICAgLy8gRWZmZWN0cyBhcmUgYXR0YWNoZWQgZGVwZW5kaW5nIG9uIHRoZSBhdWRpb19zb3VyY2VfdAorICAgIHN0YXR1c190IGFkZElucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pOworCisgICAgLy8gQWRkIGFsbCBpbnB1dCBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBpbnB1dAorICAgIHN0YXR1c190IHJlbGVhc2VJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworCisKKyAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGVmZmVjdCBkZXNjcmlwdG9ycyBmb3IgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cworICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBhdWRpb1Nlc3Npb24KKyAgICBzdGF0dXNfdCBxdWVyeURlZmF1bHRPdXRwdXRTZXNzaW9uRWZmZWN0cyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKKworICAgIC8vIEFkZCBhbGwgb3V0cHV0IGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIG91dHB1dAorICAgIC8vIEVmZmVjdHMgYXJlIGF0dGFjaGVkIGRlcGVuZGluZyBvbiB0aGUgYXVkaW9fc3RyZWFtX3R5cGVfdAorICAgIHN0YXR1c190IGFkZE91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pOworCisgICAgLy8gcmVsZWFzZSBhbGwgb3V0cHV0IGVmZmVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3V0cHV0IHN0cmVhbSBhbmQgYXVkaW9zZXNzaW9uCisgICAgc3RhdHVzX3QgcmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pOworCitwcml2YXRlOgorCisgICAgLy8gY2xhc3MgdG8gc3RvcmUgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIGVmZmVjdHMgYW5kIGl0cyBwYXJhbWV0ZXJzCisgICAgLy8gYXMgZGVmaW5lZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICBjbGFzcyBFZmZlY3REZXNjIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpIHsgfQorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IEVmZmVjdERlc2MmIG9yaWcpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChvcmlnLm1OYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVlcCBjb3B5IG1QYXJhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG9yaWcubVBhcmFtcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqb3JpZ1BhcmFtID0gb3JpZy5tUGFyYW1zW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwc2l6ZSBhbmQgdnNpemUgYXJlIHJvdW5kZWQgdXAgdG8gYW4gaW50IGJvdW5kYXJ5IGZvciBhbGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvcmlnU2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9yaWdQYXJhbS0+cHNpemUgKyAzKSAmIH4zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JpZ1BhcmFtLT52c2l6ZSArIDMpICYgfjMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqZHVwUGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKG9yaWdTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGR1cFBhcmFtLCBvcmlnUGFyYW0sIG9yaWdTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBwYXJhbSBidWZmZXIgYWxsb2NhdGlvbiBpcyBhbHNvIGRvbmUgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGVzIG9mIDQgYnl0ZXMgb3JpZ2luYWxseS4gSW4gdGhlb3J5IHdlIHNob3VsZCBtZW1jcHkgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHBhcmFtIHNpemUsIHRoYXQgaXMgd2l0aG91dCByb3VuZGluZyB2c2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5hZGQoZHVwUGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLyp2aXJ0dWFsKi8gfkVmZmVjdERlc2MoKSB7CisgICAgICAgICAgICBmcmVlKG1OYW1lKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbVBhcmFtcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgIGZyZWUobVBhcmFtc1trXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2hhciAqbU5hbWU7CisgICAgICAgIGVmZmVjdF91dWlkX3QgbVV1aWQ7CisgICAgICAgIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4gbVBhcmFtczsKKyAgICB9OworCisgICAgLy8gY2xhc3MgdG8gc3RvcmUgdm9jdG9yIG9mIEVmZmVjdERlc2MKKyAgICBjbGFzcyBFZmZlY3REZXNjVmVjdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IoKSB7fQorICAgICAgICAvKnZpcnR1YWwqLyB+RWZmZWN0RGVzY1ZlY3RvcigpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUVmZmVjdHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgbUVmZmVjdHNbal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IG1FZmZlY3RzOworICAgIH07CisKKyAgICAvLyBjbGFzcyB0byBzdG9yZSB2b2N0b3Igb2YgQXVkaW9FZmZlY3RzCisgICAgY2xhc3MgRWZmZWN0VmVjdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVmZmVjdFZlY3RvcihpbnQgc2Vzc2lvbikgOiBtU2Vzc2lvbklkKHNlc3Npb24pLCBtUmVmQ291bnQoMCkge30KKyAgICAgICAgLyp2aXJ0dWFsKi8gfkVmZmVjdFZlY3RvcigpIHt9CisKKyAgICAgICAgLy8gRW5hYmxlIG9yIGRpc2FibGUgYWxsIGVmZmVjdHMgaW4gZWZmZWN0IHZlY3RvcgorICAgICAgICB2b2lkIHNldFByb2Nlc3NvckVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICBjb25zdCBpbnQgbVNlc3Npb25JZDsKKyAgICAgICAgLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyIGtlZXBzIG1Mb2NrLCBubyBuZWVkIGZvciBsb2NrIG9uIHJlZmVyZW5jZSBjb3VudCBoZXJlCisgICAgICAgIGludCBtUmVmQ291bnQ7CisgICAgICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID5tRWZmZWN0czsKKyAgICB9OworCisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdOworICAgIHN0YXRpYyBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa1N0cmVhbU5hbWVzW0FVRElPX1NUUkVBTV9DTlQrMV07IC8vKzEgcmVxdWlyZWQgYXMgc3RyZWFtcyBzdGFydCBmcm9tIC0xCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1OYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgLy8gUGFyc2UgYXVkaW9fZWZmZWN0cy5jb25mCisgICAgc3RhdHVzX3QgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworCisgICAgLy8gTG9hZCBhbGwgZWZmZWN0cyBkZXNjcmlwdG9ycyBpbiBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBzdGF0dXNfdCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKyAgICBFZmZlY3REZXNjICpsb2FkRWZmZWN0KGNub2RlICpyb290KTsKKworICAgIC8vIExvYWQgYWxsIGF1dG9tYXRpYyBlZmZlY3QgY29uZmlndXJhdGlvbnMKKyAgICBzdGF0dXNfdCBsb2FkSW5wdXRFZmZlY3RDb25maWd1cmF0aW9ucyhjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKyAgICBzdGF0dXNfdCBsb2FkU3RyZWFtRWZmZWN0Q29uZmlndXJhdGlvbnMoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CisgICAgRWZmZWN0RGVzY1ZlY3RvciAqbG9hZEVmZmVjdENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKworICAgIC8vIExvYWQgYWxsIGF1dG9tYXRpYyBlZmZlY3QgcGFyYW1ldGVycworICAgIHZvaWQgbG9hZEVmZmVjdFBhcmFtZXRlcnMoY25vZGUgKnJvb3QsIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4mIHBhcmFtcyk7CisgICAgZWZmZWN0X3BhcmFtX3QgKmxvYWRFZmZlY3RQYXJhbWV0ZXIoY25vZGUgKnJvb3QpOworICAgIHNpemVfdCByZWFkUGFyYW1WYWx1ZShjbm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKKyAgICBzaXplX3QgZ3Jvd1BhcmFtU2l6ZShjaGFyICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKKworICAgIC8vIHByb3RlY3RzIGFjY2VzcyB0byBtSW5wdXRTb3VyY2VzLCBtSW5wdXRzLCBtT3V0cHV0U3RyZWFtcywgbU91dHB1dFNlc3Npb25zCisgICAgTXV0ZXggbUxvY2s7CisgICAgLy8gQXV0b21hdGljIGlucHV0IGVmZmVjdHMgYXJlIGNvbmZpZ3VyZWQgcGVyIGF1ZGlvX3NvdXJjZV90CisgICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX3NvdXJjZV90LCBFZmZlY3REZXNjVmVjdG9yKiA+IG1JbnB1dFNvdXJjZXM7CisgICAgLy8gQXV0b21hdGljIGlucHV0IGVmZmVjdHMgYXJlIHVuaXF1ZSBmb3IgYXVkaW9faW9faGFuZGxlX3QKKyAgICBLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIEVmZmVjdFZlY3RvciogPiBtSW5wdXRzOworCisgICAgLy8gQXV0b21hdGljIG91dHB1dCBlZmZlY3RzIGFyZSBvcmdhbml6ZWQgcGVyIGF1ZGlvX3N0cmVhbV90eXBlX3QKKyAgICBLZXllZFZlY3RvcjwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgRWZmZWN0RGVzY1ZlY3RvciogPiBtT3V0cHV0U3RyZWFtczsKKyAgICAvLyBBdXRvbWF0aWMgb3V0cHV0IGVmZmVjdHMgYXJlIHVuaXF1ZSBmb3IgYXVkaW9zZXNzaW9uIElECisgICAgS2V5ZWRWZWN0b3I8IGludDMyX3QsIEVmZmVjdFZlY3RvciogPiBtT3V0cHV0U2Vzc2lvbnM7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT1BPTElDWUVGRkVDVFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlN2JjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gIkMiIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoCisgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCit7CisgICAgcmV0dXJuIG5ldyBBdWRpb1BvbGljeU1hbmFnZXIoY2xpZW50SW50ZXJmYWNlKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKyAgICBkZWxldGUgaW50ZXJmYWNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyNDQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoZSBBdWRpb1BvbGljeUludGVyZmFjZSBhbmQgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgY2xhc3NlcyBkZWZpbmUgdGhlIGNvbW11bmljYXRpb24gaW50ZXJmYWNlcworLy8gYmV0d2VlbiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgYW5kIEFuZHJvaWQgZ2VuZXJpYyBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBtdXN0IGltcGxlbWVudCBtZXRob2RzIG9mIHRoZSBBdWRpb1BvbGljeUludGVyZmFjZSBjbGFzcy4KKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIHRoZSBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSB0byBjb250cm9sIHRoZSBhY3Rpdml0eSBhbmQKKy8vIGNvbmZpZ3VyYXRpb24gb2YgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorLy8KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBpbiBjaGFyZ2Ugb2YgdGhlIGF1ZGlvIHJvdXRpbmcgYW5kIHZvbHVtZSBjb250cm9sCisvLyBwb2xpY2llcyBmb3IgYSBnaXZlbiBwbGF0Zm9ybS4KKy8vIFRoZSBtYWluIHJvbGVzIG9mIHRoaXMgbW9kdWxlIGFyZToKKy8vICAgLSBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgc3lzdGVtIHN0YXRlIChyZW1vdmFibGUgZGV2aWNlIGNvbm5lY3Rpb25zLCBwaG9uZSBzdGF0ZSwgdXNlciByZXF1ZXN0cy4uLikuCisvLyAgIFN5c3RlbSBzdGF0ZSBjaGFuZ2VzIGFuZCB1c2VyIGFjdGlvbnMgYXJlIG5vdGlmaWVkIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpdGggbWV0aG9kcyBvZiB0aGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UuCisvLyAgIC0gcHJvY2VzcyBnZXRPdXRwdXQoKSBxdWVyaWVzIHJlY2VpdmVkIHdoZW4gQXVkaW9UcmFjayBvYmplY3RzIGFyZSBjcmVhdGVkOiBUaG9zZSBxdWVyaWVzCisvLyAgIHJldHVybiBhIGhhbmRsZXIgb24gYW4gb3V0cHV0IHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbmZpZ3VyZWQgYW5kIG9wZW5lZCBieSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgYW5kIHRoYXQKKy8vICAgbXVzdCBiZSB1c2VkIGJ5IHRoZSBBdWRpb1RyYWNrIHdoZW4gcmVnaXN0ZXJpbmcgdG8gdGhlIEF1ZGlvRmxpbmdlciB3aXRoIHRoZSBjcmVhdGVUcmFjaygpIG1ldGhvZC4KKy8vICAgV2hlbiB0aGUgQXVkaW9UcmFjayBvYmplY3QgaXMgcmVsZWFzZWQsIGEgcHV0T3V0cHV0KCkgcXVlcnkgaXMgcmVjZWl2ZWQgYW5kIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gZGVjaWRlCisvLyAgIHRvIGNsb3NlIG9yIHJlY29uZmlndXJlIHRoZSBvdXRwdXQgZGVwZW5kaW5nIG9uIG90aGVyIHN0cmVhbXMgdXNpbmcgdGhpcyBvdXRwdXQgYW5kIGN1cnJlbnQgc3lzdGVtIHN0YXRlLgorLy8gICAtIHNpbWlsYXJseSBwcm9jZXNzIGdldElucHV0KCkgYW5kIHB1dElucHV0KCkgcXVlcmllcyByZWNlaXZlZCBmcm9tIEF1ZGlvUmVjb3JkIG9iamVjdHMgYW5kIGNvbmZpZ3VyZSBhdWRpbyBpbnB1dHMuCisvLyAgIC0gcHJvY2VzcyB2b2x1bWUgY29udHJvbCByZXF1ZXN0czogdGhlIHN0cmVhbSB2b2x1bWUgaXMgY29udmVydGVkIGZyb20gYW4gaW5kZXggdmFsdWUgKHJlY2VpdmVkIGZyb20gVUkpIHRvIGEgZmxvYXQgdmFsdWUKKy8vICAgYXBwbGljYWJsZSB0byBlYWNoIG91dHB1dCBhcyBhIGZ1bmN0aW9uIG9mIHBsYXRmb3JtIHNwZWNpZmljIHNldHRpbmdzIGFuZCBjdXJyZW50IG91dHB1dCByb3V0ZSAoZGVzdGluYXRpb24gZGV2aWNlKS4gSXQKKy8vICAgYWxzbyBtYWtlIHN1cmUgdGhhdCBzdHJlYW1zIGFyZSBub3QgbXV0ZWQgaWYgbm90IGFsbG93ZWQgKGUuZy4gY2FtZXJhIHNodXR0ZXIgc291bmQgaW4gc29tZSBjb3VudHJpZXMpLgorLy8KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBwcm92aWRlZCBhcyBhIHNoYXJlZCBsaWJyYXJ5IGJ5IHBsYXRmb3JtIHZlbmRvcnMgKGFzIGZvciBsaWJhdWRpby5zbykKKy8vIGFuZCBpcyBsaW5rZWQgd2l0aCBsaWJhdWRpb2ZsaW5nZXIuc28KKworCisvLyAgICBBdWRpbyBQb2xpY3kgTWFuYWdlciBJbnRlcmZhY2UKK2NsYXNzIEF1ZGlvUG9saWN5SW50ZXJmYWNlCit7CisKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUludGVyZmFjZSgpIHt9CisgICAgLy8KKyAgICAvLyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CisgICAgLy8gcmV0cmlldmUgYSBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKKyAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBwaG9uZSBzdGF0ZS4gVmFsaWQgcGhvbmVzIHN0YXRlcyBhcmUgZGVmaW5lZCBieSBhdWRpb19tb2RlX3QKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpID0gMDsKKyAgICAvLyBmb3JjZSB1c2luZyBhIHNwZWNpZmljIGRldmljZSBjYXRlZ29yeSBmb3IgdGhlIHNwZWNpZmllZCB1c2FnZQorICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSA9IDA7CisgICAgLy8gcmV0cmlldmUgY3VycmVudCBkZXZpY2UgY2F0ZWdvcnkgZm9yY2VkIGZvciBhIGdpdmVuIHVzYWdlCisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgPSAwOworICAgIC8vIHNldCBhIHN5c3RlbSBwcm9wZXJ0eSAoZS5nLiBjYW1lcmEgc291bmQgYWx3YXlzIGF1ZGlibGUpCisgICAgdmlydHVhbCB2b2lkIHNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkgPSAwOworICAgIC8vIGNoZWNrIHByb3BlciBpbml0aWFsaXphdGlvbgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgPSAwOworCisgICAgLy8KKyAgICAvLyBBdWRpbyByb3V0aW5nIHF1ZXJ5IGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyByZXF1ZXN0IGFuIG91dHB1dCBhcHByb3ByaWF0ZSBmb3IgcGxheWJhY2sgb2YgdGhlIHN1cHBsaWVkIHN0cmVhbSB0eXBlIGFuZCBwYXJhbWV0ZXJzCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykgPSAwOworICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0YXJ0cyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKKyAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdG9wcyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKKyAgICAvLyByZWxlYXNlcyB0aGUgb3V0cHV0LgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOworCisgICAgLy8gcmVxdWVzdCBhbiBpbnB1dCBhcHByb3ByaWF0ZSBmb3IgcmVjb3JkIGZyb20gdGhlIHN1cHBsaWVkIGRldmljZSB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgLy8gcmVsZWFzZXMgdGhlIGlucHV0LgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworCisgICAgLy8KKyAgICAvLyB2b2x1bWUgY29udHJvbCBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gaW5pdGlhbGlzZXMgc3RyZWFtIHZvbHVtZSBjb252ZXJzaW9uIHBhcmFtZXRlcnMgYnkgc3BlY2lmeWluZyB2b2x1bWUgaW5kZXggcmFuZ2UuCisgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KSA9IDA7CisKKyAgICAvLyBzZXRzIHRoZSBuZXcgc3RyZWFtIHZvbHVtZSBhdCBhIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cHBsaWVkIGluZGV4IGZvciB0aGUKKyAgICAvLyBzdXBwbGllZCBkZXZpY2UuIEJ5IGNvbnZlbnRpb24sIHNwZWNpZnlpbmcgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIG1lYW5zCisgICAgLy8gc2V0dGluZyB2b2x1bWUgZm9yIGFsbCBkZXZpY2VzCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIC8vIHJldHJpZXZlIGN1cnJlbnQgdm9sdW1lIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbSBhbmQgdGhlCisgICAgLy8gc3BlY2lmaWVkIGRldmljZS4gQnkgY29udmVudGlvbiwgc3BlY2lmeWluZyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQgbWVhbnMKKyAgICAvLyBxdWVyeWluZyB0aGUgdm9sdW1lIG9mIHRoZSBhY3RpdmUgZGV2aWNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCisgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisKKyAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQorICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8vIEF1ZGlvIGVmZmVjdCBtYW5hZ2VtZW50CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QgPSAwOworCisgICAgLy9kdW1wIHN0YXRlCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworfTsKKworCisvLyBBdWRpbyBQb2xpY3kgY2xpZW50IEludGVyZmFjZQorY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSgpIHt9CisKKyAgICAvLworICAgIC8vIEF1ZGlvIEhXIG1vZHVsZSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gbG9hZHMgYSBIVyBtb2R1bGUuCisgICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpID0gMDsKKworICAgIC8vCisgICAgLy8gQXVkaW8gb3V0cHV0IENvbnRyb2wgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIG9wZW5zIGFuIGF1ZGlvIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGluZGljYXRlIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAgICAvLyBpbiBjYXNlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBoYXMgbm8gc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciB0aGUgb3V0cHV0IGJlaW5nIG9wZW5lZC4KKyAgICAvLyBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgcGFyYW1ldGVyIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgYnkgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uCisgICAgLy8gVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBjaGVjayBpZiB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycyBhcmUgc3VpdGFibGUgb3Igbm90IGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICAvLyBjcmVhdGVzIGEgc3BlY2lhbCBvdXRwdXQgdGhhdCBpcyBkdXBsaWNhdGVkIHRvIHRoZSB0d28gb3V0cHV0cyBwYXNzZWQgYXMgYXJndW1lbnRzLiBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5CisgICAgLy8gYSBzcGVjaWFsIG1peGVyIHRocmVhZCBpbiB0aGUgQXVkaW9GbGluZ2VyLgorICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKSA9IDA7CisgICAgLy8gY2xvc2VzIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKyAgICAvLyBzdXNwZW5kcyB0aGUgb3V0cHV0LiBXaGVuIGFuIG91dHB1dCBpcyBzdXNwZW5kZWQsIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0gaXMgcGxhY2VkIGluCisgICAgLy8gc3RhbmRieSBhbmQgdGhlIEF1ZGlvVHJhY2tzIGF0dGFjaGVkIHRvIHRoZSBtaXhlciB0aHJlYWQgYXJlIHN0aWxsIHByb2Nlc3NlZCBidXQgdGhlIG91dHB1dCBtaXggaXMgZGlzY2FyZGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKyAgICAvLyByZXN0b3JlcyBhIHN1c3BlbmRlZCBvdXRwdXQuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOworCisgICAgLy8KKyAgICAvLyBBdWRpbyBpbnB1dCBDb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBvcGVucyBhbiBhdWRpbyBpbnB1dAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgPSAwOworICAgIC8vIGNsb3NlcyBhbiBhdWRpbyBpbnB1dAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOworICAgIC8vCisgICAgLy8gbWlzYyBjb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBzZXQgYSBzdHJlYW0gdm9sdW1lIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0LiBGb3IgdGhlIHNhbWUgdXNlciBzZXR0aW5nLCBhIGdpdmVuIHN0cmVhbSB0eXBlIGNhbiBoYXZlIGRpZmZlcmVudCB2b2x1bWVzCisgICAgLy8gZm9yIGVhY2ggb3V0cHV0IChkZXN0aW5hdGlvbiBkZXZpY2UpIGl0IGlzIGF0dGFjaGVkIHRvLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisKKyAgICAvLyBpbnZhbGlkYXRlIGEgc3RyZWFtIHR5cGUsIGNhdXNpbmcgYSByZXJvdXRlIHRvIGFuIHVuc3BlY2lmaWVkIG5ldyBvdXRwdXQKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHNlbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlLgorICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApID0gMDsKKyAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOworCisgICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCisgICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpID0gMDsKKworICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApID0gMDsKKworICAgIC8vIG1vdmUgZWZmZWN0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0CisgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpID0gMDsKKworICAgIC8qIFJlbGVhc2UgYSBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpID0gMDsKKworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywgaW50IGRlbGF5TXMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpID0gMDsKK307CisKK2V4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKK2V4dGVybiAiQyIgdm9pZCBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5SW50ZXJmYWNlICppbnRlcmZhY2UpOworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QwYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMCwwICsxLDU4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lJbnRlZmFjZUltcGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKKworICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKKyAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOworICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19tb2RlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQaG9uZVN0YXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtUGhvbmVTdGF0ZTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEZvcmNlVXNlKHVzYWdlKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dChzdHJlYW0sIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigic3RvcE91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIHN0cmVhbQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBBTE9HVigiZG9SZWxlYXNlT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChvdXRwdXQpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBhbHJlYWR5IGNoZWNrZWQgYnkgY2xpZW50LCBidXQgZG91YmxlLWNoZWNrIGluIGNhc2UgdGhlIGNsaWVudCB3cmFwcGVyIGlzIGJ5cGFzc2VkCisgICAgaWYgKGlucHV0U291cmNlID49IEFVRElPX1NPVVJDRV9DTlQgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCisgICAgICAgIGlucHV0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SW5wdXQoaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpYXVkaW9TZXNzaW9uLCBmbGFncyk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChpbnB1dCA9PSAwKSB7CisgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcmUgcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gaW5wdXQgc291cmNlCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkSW5wdXRFZmZlY3RzKGlucHV0LCBpbnB1dFNvdXJjZSwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlucHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KGlucHV0LCBzZXNzaW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChpbnB1dCwgc2Vzc2lvbik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KGlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dAorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoaW5wdXQpOworICAgICAgICBpZihzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKK30KKworLy9hdWRpbyBwb2xpY3k6IHVzZSBhdWRpb19kZXZpY2VfdCBhcHByb3ByaWF0ZWx5CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkwOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIC8vIEZJWE1FIGNoYW5nZSByZXR1cm4gdHlwZSB0byBzdGF0dXNfdCwgYW5kIHJldHVybiBOT19JTklUIGhlcmUKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JFZmZlY3QoZGVzYyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+dW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgPT0gMCkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKGF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIHR5cGUsIG51bV9wb3J0cywgcG9ydHMsIGdlbmVyYXRpb24pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRBdWRpb1BvcnQocG9ydCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMsIGdlbmVyYXRpb24pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5hY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uLCBpb0hhbmRsZSwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZTgxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCkBAIC0wLDAgKzEsNTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSAmJgorICAgICAgICAgICAgc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9kZXZpY2VfY29ubmVjdGlvbl9zdGF0ZShtcEF1ZGlvUG9saWN5LCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOworfQorCithdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RhdGUpID49IEFVRElPX01PREVfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSIpOworCisgICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgorICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+c2V0X3Bob25lX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIHN0YXRlKTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fbW9kZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGhvbmVTdGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVBob25lU3RhdGU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoY29uZmlnIDwgMCB8fCBjb25maWcgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInNldEZvcmNlVXNlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UsIGNvbmZpZyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQUxPR1YoImdldE91dHB1dCgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKKyAgICAvLyBjcmVhdGUgYXVkaW8gcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gc3RyZWFtCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigic3RvcE91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBzdHJlYW0KKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBBTE9HVigiZG9SZWxlYXNlT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+cmVsZWFzZV9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0KTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgX191bnVzZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAorICAgIGlmIChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCisgICAgICAgIGlucHV0ID0gbXBBdWRpb1BvbGljeS0+Z2V0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9faW5fYWNvdXN0aWNzX3QpIDApOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoaW5wdXQgPT0gMCkgeworICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorCisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcmUgcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gaW5wdXQgc291cmNlCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkSW5wdXRFZmZlY3RzKGlucHV0LCBpbnB1dFNvdXJjZSwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlucHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2VfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhpbnB1dCk7CisgICAgICAgIGlmKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5pbml0X3N0cmVhbV92b2x1bWUobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZSkgeworICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZShtcEF1ZGlvUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4KTsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJhdGVneV9mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Cit9CisKKy8vYXVkaW8gcG9saWN5OiB1c2UgYXVkaW9fZGV2aWNlX3QgYXBwcm9wcmlhdGVseQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpMDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9kZXZpY2VzX2Zvcl9zdHJlYW0obXBBdWRpb1BvbGljeSwgc3RyZWFtKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gTk9fSU5JVCBoZXJlCisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dF9mb3JfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+cmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT51bnJlZ2lzdGVyX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X2VmZmVjdF9lbmFibGVkKG1wQXVkaW9Qb2xpY3ksIGlkLCBlbmFibGVkKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zdHJlYW1fYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZV9yZW1vdGVseShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmlzX3NvdXJjZV9hY3RpdmUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3NvdXJjZV9hY3RpdmUobXBBdWRpb1BvbGljeSwgc291cmNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzID09IDApIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibXBBdWRpb1BvbGljeSA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfb2ZmbG9hZF9zdXBwb3J0ZWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiSEFMIGRvZXMgbm90IGltcGxlbWVudCBpc19vZmZsb2FkX3N1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkKG1wQXVkaW9Qb2xpY3ksICZpbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24gX191bnVzZWQpCit7CisgICAgKm51bV9wb3J0cyA9IDA7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoIF9fdW51c2VkLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlIF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgX191bnVzZWQpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzIF9fdW51c2VkLAorICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24gX191bnVzZWQpCit7CisgICAgKm51bV9wYXRjaGVzID0gMDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnIF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOworCisgICAgcmV0dXJuIGdldE91dHB1dChzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2OTg3YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTAsMCArMSw3MjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeU1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInZpcnR1YWwiIHdoZW4gZXZhbHVhdGluZworLy8gYWN0aXZlIGlucHV0cyBpbiBnZXRBY3RpdmVJbnB1dCgpCisjZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gb3V0cHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAicmVtb3RlIiB3aGVuIGV2YWx1YXRpbmcKKy8vIGFjdGl2ZSBvdXRwdXQgZGV2aWNlcyBpbiBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KCkKKyNkZWZpbmUgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHdoZXJlIG1hdGNoaW5nIGlucHV0cy9vdXRwdXRzIG9uIGRldmljZQorLy8gdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiB0aGUgYWRkcmVzcyBtdXN0IG1hdGNoIHRvbworI2RlZmluZSBBUE1fQVVESU9fREVWSUNFX01BVENIX0FERFJFU1NfQUxMIChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBTdHJpbmdUb0VudW0geworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdWludDMyX3QgdmFsdWU7Cit9OworCisjZGVmaW5lIFNUUklOR19UT19FTlVNKHN0cmluZykgeyAjc3RyaW5nLCBzdHJpbmcgfQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKworY29uc3QgU3RyaW5nVG9FbnVtIHNEZXZpY2VOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUERJRiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9GTSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FNQklFTlQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MSU5FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fU1BESUYpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzRm9ybWF0TmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfMjRfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNX0ZMT0FUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9NUDMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTUFJTiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TU1IpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTFRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX1NDQUxBQkxFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VSTEMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRUxEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfVk9SQklTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YyKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfT1BVUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FDMyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0VfQUMzKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9NT05PKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOX1NURVJFTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfSk9JTlQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX1JBTVApLAorfTsKKworCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmluZ1RvRW51bShjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAodGFibGVbaV0ubmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInN0cmluZ1RvRW51bSgpIGZvdW5kICVzIiwgdGFibGVbaV0ubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gdGFibGVbaV0udmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKkF1ZGlvUG9saWN5TWFuYWdlcjo6ZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZVtpXS52YWx1ZSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLm5hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIHJldHVybiAoKHN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkgPT0gMCkgfHwgKHN0cmNtcCgiMSIsIHZhbHVlKSA9PSAwKSk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2U6ICV4LCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICBkZXZpY2UsIHN0YXRlLCBhZGRyZXNzLnN0cmluZygpKTsKKworICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7CisgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisKKyAgICAgICAgLy8gc2F2ZSBhIGNvcHkgb2YgdGhlIG9wZW5lZCBvdXRwdXQgZGVzY3JpcHRvcnMgYmVmb3JlIGFueSBvdXRwdXQgaXMgb3BlbmVkIG9yIGNsb3NlZAorICAgICAgICAvLyBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4gVGhpcyB3aWxsIGJlIG5lZWRlZCBieSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOgorICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmV3IGRldmljZSBhcyBhdmFpbGFibGUKKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldkRlc2MpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbW9kdWxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBhZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBvdXRwdXRzIHNob3VsZCBuZXZlciBiZSBlbXB0eSBoZXJlCisgICAgICAgICAgICBBTE9HX0FTU0VSVChvdXRwdXRzLnNpemUoKSAhPSAwLCAic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IgorICAgICAgICAgICAgICAgICAgICAiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgbm8gb3V0cHV0cyBidXQgc3RhdHVzIE9LIik7CisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgJXp1IG91dHB1dHMiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0cy5zaXplKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihhZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSBkZXZpY2UgZnJvbSBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKworICAgICAgICAgICAgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCisgICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KKyAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXRzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAorICAgICAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXQgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtT3V0cHV0cy5rZXlBdChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAgICAgLy8gZG8gbm90IGZvcmNlIGRldmljZSBjaGFuZ2Ugb24gZHVwbGljYXRlZCBvdXRwdXQgYmVjYXVzZSBpZiBkZXZpY2UgaXMgMCwgaXQgd2lsbAorICAgICAgICAgICAgICAgIC8vIGFsc28gZm9yY2UgYSBkZXZpY2UgMCBmb3IgdGhlIHR3byBvdXRwdXRzIGl0IGlzIGR1cGxpY2F0ZWQgdG8gd2hpY2ggbWF5IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgLy8gYSB2YWxpZCBkZXZpY2Ugc2VsZWN0aW9uIG9uIHRob3NlIG91dHB1dHMuCisgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9ICFtT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIGZvcmNlIHdoZW4gZGlzY29ubmVjdGluZyAoYSBub24tZHVwbGljYXRlZCBkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQorCisgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKKyAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzOworCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKKyAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKQorICAgICAgICB7CisgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIGlucHV0cywgYWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1vZHVsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBpbnB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOworCisgICAgICAgICAgICAvLyBTZXQgRGlzY29ubmVjdCB0byBIQUxzCisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGFkZHJlc3MpOworICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX0RFVklDRV9ESVNDT05ORUNUKSwgZGV2aWNlKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgaW5wdXRzLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworCisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBjbG9zZUFsbElucHV0cygpOworCisgICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gLy8gZW5kIGlmIGlzIGlucHV0IGRldmljZQorCisgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSA9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOworICAgIGRldkRlc2MtPm1BZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICBzc2l6ZV90IGluZGV4OworICAgIERldmljZVZlY3RvciAqZGV2aWNlVmVjdG9yOworCisgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZU91dHB1dERldmljZXM7CisgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgaW5kZXggPSBkZXZpY2VWZWN0b3ItPmluZGV4T2YoZGV2RGVzYyk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMpCit7CisgICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlOworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OworCisgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJTA4eCB0eERldmljZSAlMDh4IiwgcnhEZXZpY2UsIHR4RGV2aWNlKTsKKworICAgIC8vIHJlbGVhc2UgZXhpc3RpbmcgUlggcGF0Y2ggaWYgYW55CisgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7CisgICAgfQorICAgIC8vIHJlbGVhc2UgVFggcGF0Y2ggaWYgYW55CisgICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIFJYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHRoZW4gdXNlIGxlZ2FjeSByb3V0aW5nIG1ldGhvZCBmb3Igdm9pY2UgY2FsbHMKKyAgICAvLyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCisgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgorICAgIGlmIChhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpICYgcnhEZXZpY2UpIHsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgdHJ1ZSwgZGVsYXlNcyk7CisgICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgYWxzbyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHNldE91dHB1dERldmljZSgpIHdpbGwgdGFrZSBjYXJlCisgICAgICAgIC8vIG9mIGl0IGR1ZSB0byBsZWdhY3kgaW1wbGVtZW50YXRpb24uIElmIG5vdCwgY3JlYXRlIGEgcGF0Y2guCisgICAgICAgIGlmICgoYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgdHhEZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikKKyAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBjcmVhdGUgUlggcGF0aCBhdWRpbyBwYXRjaAorICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHJ4RGV2aWNlKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBzZWxlY3RlZCBkZXZpY2Ugbm90IGluIG91dHB1dCBkZXZpY2UgbGlzdCIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNpbmtEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgUlggZGV2aWNlIik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U291cmNlRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworCisgICAgICAgIHJ4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICByeFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworCisgICAgICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIFJYIGRldmljZQorICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHJ4RGV2aWNlLCBtT3V0cHV0cyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICB9CisKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBlcnJvciAlZCBjcmVhdGluZyBSWCBhdWRpbyBwYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DYWxsUnhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIG1DYWxsUnhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CisgICAgfQorICAgIGlmIChjcmVhdGVUeFBhdGNoKSB7CisKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSh0eERldmljZSk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgc2VsZWN0ZWQgZGV2aWNlIG5vdCBpbiBpbnB1dCBkZXZpY2UgbGlzdCIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNvdXJjZURldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBUWCBkZXZpY2UiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTaW5rRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICB0eFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIG1PdXRwdXRzKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSBUWAorICAgICAgICAvLyBwYXRoIG91dHB1dCBkZXZpY2UKKyAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICB9CisKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAic2V0UGhvbmVTdGF0ZSgpIGVycm9yICVkIGNyZWF0aW5nIFRYIGF1ZGlvIHBhdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbUNhbGxUeFBhdGNoID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgbUNhbGxUeFBhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQoreworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgPT0gbVBob25lU3RhdGUgKSB7CisgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgc2V0dGluZyBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgbGVhdmluZyBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCisgICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCisgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKKyAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdworICAgIGludCBvbGRTdGF0ZSA9IG1QaG9uZVN0YXRlOworICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CisgICAgYm9vbCBmb3JjZSA9IGZhbHNlOworCisgICAgLy8gYXJlIHdlIGVudGVyaW5nIG9yIHN0YXJ0aW5nIGEgY2FsbAorICAgIGlmICghaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgRW50ZXJpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gc3RhcnRpbmcgYSBjYWxsCisgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICAgICAgZm9yY2UgPSB0cnVlOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgeworICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0RUTUZdLm1Wb2x1bWVDdXJ2ZVtqXSA9CisgICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTF1bal07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmICFpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGV4aXRpbmcgYSBjYWxsCisgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICAgICAgZm9yY2UgPSB0cnVlOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgeworICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0RUTUZdLm1Wb2x1bWVDdXJ2ZVtqXSA9CisgICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fRFRNRl1bal07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpICYmIChzdGF0ZSAhPSBvbGRTdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgU3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAKKyAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAorICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisKKyAgICBpbnQgZGVsYXlNcyA9IDA7CisgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIC8vIG11dGUgbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0CisgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIGFueSBvdXRwdXQgd2hlcmUgZWl0aGVyIHN0cmF0ZWd5IGlzIGFjdGl2ZS4KKyAgICAgICAgICAgIC8vIFRoaXMgYXZvaWQgc2VuZGluZyB0aGUgcmluZyB0b25lIG9yIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KKyAgICAgICAgICAgIGlmICgoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9NRURJQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSB8fAorICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bUxhdGVuY3kqMikpIHsKKyAgICAgICAgICAgICAgICBkZWxheU1zID0gZGVzYy0+bUxhdGVuY3kqMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgdHJ1ZSwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgbU91dHB1dHMua2V5QXQoaSksIE1VVEVfVElNRV9NUywKKyAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSwgbU91dHB1dHMua2V5QXQoaSksIE1VVEVfVElNRV9NUywKKyAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUgLypmcm9tQ2FjaGUqLykpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2UoKSBpcyBjYWxsZWQgb24gdGhlIHByaW1hcnkgb3V0cHV0LAorICAgIC8vIHRoZSBkZXZpY2UgcmV0dXJuZWQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWNoYWJsZSB2aWEgdGhpcyBvdXRwdXQKKyAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCisgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAorICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByeERldmljZSA9IGh3T3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7CisgICAgfSBlbHNlIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgfQorICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKKyAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKKyAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKKyAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIHRydWUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmxhZyB0aGF0IHJpbmd0b25lIHZvbHVtZSBtdXN0IGJlIGxpbWl0ZWQgdG8gbXVzaWMgdm9sdW1lIHVudGlsIHdlIGV4aXQgTU9ERV9SSU5HVE9ORQorICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FICYmCisgICAgICAgIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpKSB7CisgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgQUxPR1YoInNldEZvcmNlVXNlKCkgdXNhZ2UgJWQsIGNvbmZpZyAlZCwgbVBob25lU3RhdGUgJWQiLCB1c2FnZSwgY29uZmlnLCBtUGhvbmVTdGF0ZSk7CisKKyAgICBib29sIGZvcmNlVm9sdW1lUmVldmFsID0gZmFsc2U7CisgICAgc3dpdGNoKHVzYWdlKSB7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT046CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9DT01NVU5JQ0FUSU9OIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQToKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSEVBRFBIT05FUyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0EyRFAgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9NRURJQSIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRDoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfUkVDT1JEIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSzoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0NBUl9ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0RFU0tfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0RPQ0siLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTToKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfU1lTVEVNIiwgY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9ySERNSV9TWVNURU1fQVVESU8iLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgZm9yY2UgdXNhZ2UKKyAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkpIHsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSkgeworICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgbmV3RGV2aWNlLCAwLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgeworICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVJbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlSW5wdXQpKTsKKyAgICB9CisKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKK3sKKyAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKyAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOworfQorCisvLyBGaW5kIGEgZGlyZWN0IG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQsIGV2ZW4gaWYgdGhlIGlucHV0IGZsYWdzIGRvCisvLyBub3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IG91dHB1dAorc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sIGZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIDogQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCAmJiAobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgQUxPR1YoImdldE91dHB1dCgpIGRldmljZSAlZCwgc3RyZWFtICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAleCwgY2hhbm5lbE1hc2sgJXgsIGZsYWdzICV4IiwKKyAgICAgICAgICBkZXZpY2UsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICByZXR1cm4gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsCisgICAgICAgICAgICBvZmZsb2FkSW5mbyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChhdHRyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBjYWxsZWQgd2l0aCBOVUxMIGF1ZGlvIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgdXNhZ2U9JWQsIGNvbnRlbnQ9JWQsIHRhZz0lcyBmbGFncz0lMDh4IiwKKyAgICAgICAgICAgIGF0dHItPnVzYWdlLCBhdHRyLT5jb250ZW50X3R5cGUsIGF0dHItPnRhZ3MsIGF0dHItPmZsYWdzKTsKKworICAgIC8vIFRPRE8gdGhpcyBpcyB3aGVyZSBmaWx0ZXJpbmcgZm9yIGN1c3RvbSBwb2xpY2llcyAocmVyb3V0aW5nLCBkeW5hbWljIHNvdXJjZXMpIHdpbGwgZ28KKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cihhdHRyKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCisgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGF0dHIpOworICAgIHJldHVybiBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsCisgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB1aW50MzJfdCBsYXRlbmN5ID0gMDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGlmIChtQ3VyT3V0cHV0ICE9IDApIHsKKyAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHRlc3Qgb3V0cHV0IG1DdXJPdXRwdXQgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwgbURpcmVjdE91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgbUN1ck91dHB1dCwgbVRlc3RTYW1wbGluZ1JhdGUsIG1UZXN0Rm9ybWF0LCBtVGVzdENoYW5uZWxzLCBtRGlyZWN0T3V0cHV0KTsKKworICAgICAgICBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBvcGVuaW5nIHRlc3Qgb3V0cHV0Iik7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IG1UZXN0RGV2aWNlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBtVGVzdExhdGVuY3lNczsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9CisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobURpcmVjdE91dHB1dCA/IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCA6IDApOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVRlc3RTYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gbVRlc3RDaGFubmVsczsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBtVGVzdEZvcm1hdDsKKyAgICAgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksbUN1ck91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLG91dHB1dENtZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAvLyBvcGVuIGEgZGlyZWN0IG91dHB1dCBpZiByZXF1aXJlZCBieSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KKyAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZworICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CisKKyAgICAvLyBza2lwIGRpcmVjdCBvdXRwdXQgc2VsZWN0aW9uIGlmIHRoZSByZXF1ZXN0IGNhbiBvYnZpb3VzbHkgYmUgYXR0YWNoZWQgdG8gYSBtaXhlZCBvdXRwdXQKKyAgICAvLyBhbmQgbm90IGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCisgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2FtcGxpbmdSYXRlIDw9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFICYmCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDw9IDIpIHsKKyAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgb2ZmbG9hZGluZyBpZiBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpcyBlbmFibGVkLiBUaGlzIHByZXZlbnRzIGZyb20KKyAgICAvLyBjcmVhdGluZyBhbiBvZmZsb2FkZWQgdHJhY2sgYW5kIHRlYXJpbmcgaXQgZG93biBpbW1lZGlhdGVseSBhZnRlciBzdGFydCB3aGVuIGF1ZGlvZmxpbmdlcgorICAgIC8vIGRldGVjdHMgdGhlcmUgaXMgYW4gYWN0aXZlIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QuCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayB0aGUgYXVkaW8gc2Vzc2lvbiBoZXJlIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCBpbiB0aGlzIGNvbnRleHQuCisgICAgLy8gVGhpcyBtYXkgcHJldmVudCBvZmZsb2FkaW5nIGluIHJhcmUgc2l0dWF0aW9ucyB3aGVyZSBlZmZlY3RzIGFyZSBsZWZ0IGFjdGl2ZSBieSBhcHBzCisgICAgLy8gaW4gdGhlIGJhY2tncm91bmQuCisKKyAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CisgICAgICAgICAgICAhaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MpOworICAgIH0KKworICAgIGlmIChwcm9maWxlICE9IDApIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAocHJvZmlsZSA9PSBkZXNjLT5tUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gZGVzYzsKKyAgICAgICAgICAgICAgICAvLyByZXVzZSBkaXJlY3Qgb3V0cHV0IGlmIGN1cnJlbnRseSBvcGVuIGFuZCBjb25maWd1cmVkIHdpdGggc2FtZSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgaWYgKChzYW1wbGluZ1JhdGUgPT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgPT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHJldXNpbmcgZGlyZWN0IG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBjbG9zZSBkaXJlY3Qgb3V0cHV0IGlmIGN1cnJlbnRseSBvcGVuIGFuZCBjb25maWd1cmVkIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKG91dHB1dERlc2MgIT0gTlVMTCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MgPShhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG91dHB1dERlc2MtPm1GbGFncyB8IGZsYWdzKTsKKyAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisKKyAgICAgICAgLy8gb25seSBhY2NlcHQgYW4gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gMCAmJiBzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAgICAgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBmb3JtYXQgIT0gY29uZmlnLmZvcm1hdCkgfHwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayAhPSAwICYmIGNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAlZCAlZCwiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWxNYXNrICUwNHggJTA0eCIsIG91dHB1dCwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBmb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9IDE7CisKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKKyAgICAgICAgaWYgKGRzdE91dHB1dCA9PSBvdXRwdXQpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIHNyY091dHB1dCwgZHN0T3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXR1cm5zIG5ldyBkaXJlY3Qgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKworbm9uX2RpcmVjdF9vdXRwdXQ6CisKKyAgICAvLyBpZ25vcmluZyBjaGFubmVsIG1hc2sgZHVlIHRvIGRvd25taXggY2FwYWJpbGl0eSBpbiBtaXhlcgorCisgICAgLy8gb3BlbiBhIG5vbiBkaXJlY3Qgb3V0cHV0CisKKyAgICAvLyBmb3Igbm9uIGRpcmVjdCBvdXRwdXRzLCBvbmx5IFBDTSBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCisgICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAorICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworCisgICAgICAgIC8vIGF0IHRoaXMgc3RhZ2Ugd2Ugc2hvdWxkIGlnbm9yZSB0aGUgRElSRUNUIGZsYWcgYXMgbm8gZGlyZWN0IG91dHB1dCBjb3VsZCBiZSBmb3VuZCBlYXJsaWVyCisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgZmxhZ3MsIGZvcm1hdCk7CisgICAgfQorICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXQoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCIKKyAgICAgICAgICAgICJmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBmbGFncyAleCIsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBvdXRwdXQgJWQiLCBvdXRwdXQpOworCisgICAgcmV0dXJuIG91dHB1dDsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCB0aGF0IHByb3ZpZGUgYSBwYXRoIHRvIGEgcGFydGljdWxhciBkZXZpY2Ugb3Igc2V0IG9mCisgICAgLy8gZGV2aWNlcyAodGhlIGxpc3Qgd2FzIHByZXZpb3VzbHkgYnVpbGQgYnkgZ2V0T3V0cHV0c0ZvckRldmljZSgpKS4KKyAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKKyAgICAvLyAxOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwb2xpY3kgZmxhZ3MKKyAgICAvLyAyOiB0aGUgcHJpbWFyeSBvdXRwdXQKKyAgICAvLyAzOiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CisKKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dHNbMF07CisgICAgfQorCisgICAgaW50IG1heENvbW1vbkZsYWdzID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGbGFncyA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0UHJpbWFyeSA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIGlmIGEgdmFsaWQgZm9ybWF0IGlzIHNwZWNpZmllZCwgc2tpcCBvdXRwdXQgaWYgbm90IGNvbXBhdGlibGUKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY29tbW9uRmxhZ3MgPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tUHJvZmlsZS0+bUZsYWdzICYgZmxhZ3MpOworICAgICAgICAgICAgaWYgKGNvbW1vbkZsYWdzID4gbWF4Q29tbW9uRmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRGbGFncyA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgbWF4Q29tbW9uRmxhZ3MgPSBjb21tb25GbGFnczsKKyAgICAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0KCkgY29tbW9uRmxhZ3MgZm9yIG91dHB1dCAlZCwgJTA0eCIsIG91dHB1dHNbaV0sIGNvbW1vbkZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICAgICAgICAgIG91dHB1dFByaW1hcnkgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dEZsYWdzICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dEZsYWdzOworICAgIH0KKyAgICBpZiAob3V0cHV0UHJpbWFyeSAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRQcmltYXJ5OworICAgIH0KKworICAgIHJldHVybiBvdXRwdXRzWzBdOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIC8vIGluY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgdGhpcyBzdHJlYW0gb24gdGhlIHJlcXVlc3RlZCBvdXRwdXQ6CisgICAgLy8gTk9URSB0aGF0IHRoZSB1c2FnZSBjb3VudCBpcyB0aGUgc2FtZSBmb3IgZHVwbGljYXRlZCBvdXRwdXQgYW5kIGhhcmR3YXJlIG91dHB1dCB3aGljaCBpcworICAgIC8vIG5lY2Vzc2FyeSBmb3IgYSBjb3JyZWN0IGNvbnRyb2wgb2YgaGFyZHdhcmUgb3V0cHV0IHJvdXRpbmcgYnkgc3RhcnRPdXRwdXQoKSBhbmQgc3RvcE91dHB1dCgpCisgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAxKTsKKworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgICAgIGJvb2wgc2hvdWxkV2FpdCA9IChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICAgICAgdWludDMyX3Qgd2FpdE1zID0gMDsKKyAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKGRlc2MgIT0gb3V0cHV0RGVzYykgeworICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgZGV2aWNlIGNoYW5nZSBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzIG1hbmFnZWQgYnkgdGhlIHNhbWUgaHcKKyAgICAgICAgICAgICAgICAvLyBtb2R1bGUgYW5kIGhhcyBhIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiB0aGF0IGRpZmZlcnMgZnJvbSBzZWxlY3RlZCBkZXZpY2UuCisgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgYXVkaW8gSEFMIG11c3QgcmVjZWl2ZSB0aGUgbmV3IGRldmljZSBzZWxlY3Rpb24gc28gdGhhdCBpdCBjYW4KKyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRldmljZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnkgdGhlIG90aGVyIGFjdGl2ZSBvdXRwdXQuCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgorICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXZpY2UoKSAhPSBuZXdEZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBhdWRpbyBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyB0byBiZSBwcmVzZW50ZWQgd2hlbiBzdGFydGluZworICAgICAgICAgICAgICAgIC8vIGEgbm90aWZpY2F0aW9uIHNvIHRoYXQgYXVkaW8gZm9jdXMgZWZmZWN0IGNhbiBwcm9wYWdhdGUuCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkV2FpdCAmJiBkZXNjLT5pc0FjdGl2ZShsYXRlbmN5ICogMikgJiYgKHdhaXRNcyA8IGxhdGVuY3kpKSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXRNcyA9IGxhdGVuY3k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZvcmNlKTsKKworICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQorICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgobmV3RGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2UpOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCisgICAgICAgIC8vIHJvdXRpbmcKKyAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOworICAgICAgICBpZiAod2FpdE1zID4gbXV0ZVdhaXRNcykgeworICAgICAgICAgICAgdXNsZWVwKCh3YWl0TXMgLSBtdXRlV2FpdE1zKSAqIDIgKiAxMDAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKKyAgICAgICAgLy8gZGVjcmVtZW50IHVzYWdlIGNvdW50IG9mIHRoaXMgc3RyZWFtIG9uIHRoZSBvdXRwdXQKKyAgICAgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAtMSk7CisgICAgICAgIC8vIHN0b3JlIHRpbWUgYXQgd2hpY2ggdGhlIHN0cmVhbSB3YXMgc3RvcHBlZCAtIHNlZSBpc1N0cmVhbUFjdGl2ZSgpCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIC8vIGRlbGF5IHRoZSBkZXZpY2Ugc3dpdGNoIGJ5IHR3aWNlIHRoZSBsYXRlbmN5IGJlY2F1c2Ugc3RvcE91dHB1dCgpIGlzIGV4ZWN1dGVkIHdoZW4KKyAgICAgICAgICAgIC8vIHRoZSB0cmFjayBzdG9wKCkgY29tbWFuZCBpcyByZWNlaXZlZCBhbmQgYXQgdGhhdCB0aW1lIHRoZSBhdWRpbyB0cmFjayBidWZmZXIgY2FuCisgICAgICAgICAgICAvLyBzdGlsbCBjb250YWluIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBkcmFpbmVkLiBUaGUgbGF0ZW5jeSBvbmx5IGNvdmVycyB0aGUgYXVkaW8gSEFMCisgICAgICAgICAgICAvLyBhbmQga2VybmVsIGJ1ZmZlcnMuIEFsc28gdGhlIGxhdGVuY3kgZG9lcyBub3QgYWx3YXlzIGluY2x1ZGUgYWRkaXRpb25hbCBkZWxheSBpbiB0aGUKKyAgICAgICAgICAgIC8vIGF1ZGlvIHBhdGggKGF1ZGlvIERTUCwgQ09ERUMgLi4uKQorICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCBmYWxzZSwgb3V0cHV0RGVzYy0+bUxhdGVuY3kqMik7CisKKyAgICAgICAgICAgIC8vIGZvcmNlIHJlc3RvcmluZyB0aGUgZGV2aWNlIHNlbGVjdGlvbiBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCisgICAgICAgICAgICAvLyBvbmUgYmVpbmcgc2VsZWN0ZWQgZm9yIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgY3VyT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyT3V0cHV0ICE9IG91dHB1dCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+aXNBY3RpdmUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobmV3RGV2aWNlICE9IGRlc2MtPmRldmljZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoY3VyT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKGN1ck91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kqMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0b3BwaW5nIG9uZSB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24gcm91dGluZworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIHJlZmNvdW50IGlzIGFscmVhZHkgMCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIHJlbGVhc2luZyB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGludCB0ZXN0SW5kZXggPSB0ZXN0T3V0cHV0SW5kZXgob3V0cHV0KTsKKyAgICBpZiAodGVzdEluZGV4ICE9IDApIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKKyAgICAgICAgICAgIG1UZXN0T3V0cHV0c1t0ZXN0SW5kZXhdID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIGlmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgaWYgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgeworICAgICAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgZm9yIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0tZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgLy8gSWYgZWZmZWN0cyB3aGVyZSBwcmVzZW50IG9uIHRoZSBvdXRwdXQsIGF1ZGlvZmxpbmdlciBtb3ZlZCB0aGVtIHRvIHRoZSBwcmltYXJ5CisgICAgICAgICAgICAvLyBvdXRwdXQgYnkgZGVmYXVsdDogbW92ZSB0aGVtIGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIG91dHB1dC4KKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICAgICAgaWYgKGRzdE91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIG1QcmltYXJ5T3V0cHV0LCBkc3RPdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorfQorCisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBBTE9HVigiZ2V0SW5wdXQoKSBpbnB1dFNvdXJjZSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4LCBzZXNzaW9uICVkLCAiCisgICAgICAgICAgImZsYWdzICUjeCIsCisgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc2Vzc2lvbiwgZmxhZ3MpOworCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKKworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgQUxPR1coImdldElucHV0KCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBpbnB1dFNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIC8vIGFkYXB0IGNoYW5uZWwgc2VsZWN0aW9uIHRvIGlucHV0IHNvdXJjZQorICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CisgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTks7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgorICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgorICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LIHwgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciA9IGZhbHNlOworICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGlucHV0ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOworICAgICAgICAgICAgaXNTb3VuZFRyaWdnZXIgPSB0cnVlOworICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQpOworICAgICAgICAgICAgQUxPR1YoIlNvdW5kVHJpZ2dlciBjYXB0dXJlIG9uIHNlc3Npb24gJWQgaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChwcm9maWxlID09IDApIHsKKyAgICAgICAgLy9yZXRyeSB3aXRob3V0IGZsYWdzCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbG9nX2ZsYWdzID0gZmxhZ3M7CisgICAgICAgIGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgICAgICBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICBpZiAocHJvZmlsZSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXQoKSBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgMHglWCwgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICAgICAgICJjaGFubmVsTWFzayAweCVYLCBmbGFncyAlI3giLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbG9nX2ZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldElucHV0KCk6IEhXIG1vZHVsZSAlcyBub3Qgb3BlbmVkIiwgcHJvZmlsZS0+bU1vZHVsZS0+bU5hbWUpOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorCisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8CisgICAgICAgIChmb3JtYXQgIT0gY29uZmlnLmZvcm1hdCkgfHwKKyAgICAgICAgKGNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgIEFMT0dXKCJnZXRJbnB1dCgpIGZhaWxlZCBvcGVuaW5nIGlucHV0OiBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIGlmIChpbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUpOworICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQgPSAwOworICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA9IDE7CisgICAgaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgIGlucHV0RGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKKyAgICBpbnB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpbnB1dERlc2MtPm1TZXNzaW9ucy5hZGQoc2Vzc2lvbik7CisgICAgaW5wdXREZXNjLT5tSXNTb3VuZFRyaWdnZXIgPSBpc1NvdW5kVHJpZ2dlcjsKKworICAgIGFkZElucHV0KGlucHV0LCBpbnB1dERlc2MpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RhcnRJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIHZpcnR1YWwgaW5wdXQgZGV2aWNlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGlucHV0IGRldmljZXMKKyAgICBpZiAoIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKworICAgICAgICAvLyBmb3IgYSBub24tdmlydHVhbCBpbnB1dCBkZXZpY2UsIGNoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgKG5vbi12aXJ0dWFsKSBhY3RpdmUgaW5wdXQKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBnZXRBY3RpdmVJbnB1dCgpOworICAgICAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCAmJiBhY3RpdmVJbnB1dCAhPSBpbnB1dCkgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgYWxyZWFkeSBhY3RpdmUgaW5wdXQgdXNlcyBBVURJT19TT1VSQ0VfSE9UV09SRCB0aGVuIGl0IGlzIGNsb3NlZCwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgYWN0aXZlIGlucHV0IGNvbnRpbnVlcyBhbmQgdGhlIG5ldyBpbnB1dCBjYW5ub3QgYmUgc3RhcnRlZC4KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gbUlucHV0cy52YWx1ZUZvcihhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bUlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIHByZWVtcHRpbmcgbG93LXByaW9yaXR5IGlucHV0ICVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZURlc2MtPm1TZXNzaW9ucy5pdGVtQXQoMCkpOworICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlRGVzYy0+bVNlc3Npb25zLml0ZW1BdCgwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgaWYgKGFjdGl2ZUlucHV0c0NvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0KSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CisKKyAgICAgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZC4KKyAgICAgICAgLy8gRm9yIHJlbW90ZSBzdWJtaXggKGEgdmlydHVhbCBkZXZpY2UpLCB3ZSBvcGVuIG9ubHkgb25lIGlucHV0IHBlciBjYXB0dXJlIHJlcXVlc3QuCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwgQVVESU9fUkVNT1RFX1NVQk1JWF9ERVZJQ0VfQUREUkVTUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KCkgaW5wdXQgc291cmNlID0gJWQiLCBpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7CisKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudCsrOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RvcElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudC0tOworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQKKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKyAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsIEFVRElPX1JFTU9URV9TVUJNSVhfREVWSUNFX0FERFJFU1MpOworICAgICAgICB9CisKKyAgICAgICAgcmVzZXRJbnB1dERldmljZShpbnB1dCk7CisKKyAgICAgICAgaWYgKGFjdGl2ZUlucHV0c0NvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dfQVNTRVJUKGlucHV0RGVzYyAhPSAwKTsKKworICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXREZXNjLT5tU2Vzc2lvbnMucmVtb3ZlKHNlc3Npb24pOworICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgaW52YWxpZCBvcGVuIHJlZiBjb3VudCAlZCIsIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50LS07CisgICAgaWYgKGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA+IDApIHsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQgPiAwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjbG9zZUlucHV0KGlucHV0KTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQiKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWxsSW5wdXRzKCkgeworICAgIGJvb2wgcGF0Y2hSZW1vdmVkID0gZmFsc2U7CisKKyAgICBmb3Ioc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgc3NpemVfdCBwYXRjaF9pbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgIGlmIChwYXRjaF9pbmRleCA+PSAwKSB7CisgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQocGF0Y2hfaW5kZXgpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KHBhdGNoX2luZGV4KTsKKyAgICAgICAgICAgIHBhdGNoUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgIH0KKyAgICBtSW5wdXRzLmNsZWFyKCk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKworICAgIGlmIChwYXRjaFJlbW92ZWQpIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3sKKyAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKKyAgICAgICAgQUxPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4gPSBpbmRleE1pbjsKKyAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heCA9IGluZGV4TWF4OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKworICAgIGlmICgoaW5kZXggPCBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1pbikgfHwgKGluZGV4ID4gbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRm9yY2UgbWF4IHZvbHVtZSBpZiBzdHJlYW0gY2Fubm90IGJlIG11dGVkCisgICAgaWYgKCFtU3RyZWFtc1tzdHJlYW1dLm1DYW5CZU11dGVkKSBpbmRleCA9IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworCisgICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA0eCwgaW5kZXggJWQiLAorICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7CisKKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIHNldCBkZWZhdWx0IHZhbHVlIGFuZAorICAgIC8vIGNsZWFyIGFsbCBkZXZpY2Ugc3BlY2lmaWMgdmFsdWVzCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKKyAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIuY2xlYXIoKTsKKyAgICB9CisgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOworCisgICAgLy8gY29tcHV0ZSBhbmQgYXBwbHkgc3RyZWFtIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhY2NvcmRpbmcgdG8gY29ubmVjdGVkIGRldmljZQorICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9CisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yVm9sdW1lKG1PdXRwdXRzLnZhbHVlQXQoaSktPmRldmljZSgpKTsKKyAgICAgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB8fCAoZGV2aWNlID09IGN1ckRldmljZSkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgaW5kZXgsIG1PdXRwdXRzLmtleUF0KGkpLCBjdXJEZXZpY2UpOworICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGUgc3RyYXRlZ3kgdGhlIHN0cmVhbSBiZWxvbmdzIHRvLgorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIGRldmljZSA9IGdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworCisgICAgKmluZGV4ID0gIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKKyAgICBBTE9HVigiZ2V0U3RyZWFtVm9sdW1lSW5kZXgoKSBzdHJlYW0gJWQgZGV2aWNlICUwOHggaW5kZXggJWQiLCBzdHJlYW0sIGRldmljZSwgKmluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0Rm9yRWZmZWN0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cykKK3sKKyAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHN1aXRhYmxlIGZvciBnbG9iYWwgZWZmZWN0cy4KKyAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKKyAgICAvLyAxOiBBbiBvZmZsb2FkZWQgb3V0cHV0LiBJZiB0aGUgZWZmZWN0IGVuZHMgdXAgbm90IGJlaW5nIG9mZmxvYWRhYmxlLAorICAgIC8vICAgIEF1ZGlvRmxpbmdlciB3aWxsIGludmFsaWRhdGUgdGhlIHRyYWNrIGFuZCB0aGUgb2ZmbG9hZGVkIG91dHB1dAorICAgIC8vICAgIHdpbGwgYmUgY2xvc2VkIGNhdXNpbmcgdGhlIGVmZmVjdCB0byBiZSBtb3ZlZCB0byBhIFBDTSBvdXRwdXQuCisgICAgLy8gMjogQSBkZWVwIGJ1ZmZlciBvdXRwdXQKKyAgICAvLyAzOiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CisKKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRPZmZsb2FkZWQgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dERlZXBCdWZmZXIgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyBvdXRwdXRzWyV6dV0gZmxhZ3MgJXgiLCBpLCBkZXNjLT5tRmxhZ3MpOworICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCA9IG91dHB1dHNbaV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgeworICAgICAgICAgICAgb3V0cHV0RGVlcEJ1ZmZlciA9IG91dHB1dHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyBvdXRwdXRPZmZsb2FkZWQgJWQgb3V0cHV0RGVlcEJ1ZmZlciAlZCIsCisgICAgICAgICAgb3V0cHV0T2ZmbG9hZGVkLCBvdXRwdXREZWVwQnVmZmVyKTsKKyAgICBpZiAob3V0cHV0T2ZmbG9hZGVkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dE9mZmxvYWRlZDsKKyAgICB9CisgICAgaWYgKG91dHB1dERlZXBCdWZmZXIgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGVlcEJ1ZmZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0c1swXTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICAvLyBhcHBseSBzaW1wbGUgcnVsZSB3aGVyZSBnbG9iYWwgZWZmZWN0cyBhcmUgYXR0YWNoZWQgdG8gdGhlIHNhbWUgb3V0cHV0IGFzIE1VU0lDIHN0cmVhbXMKKworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoZHN0T3V0cHV0cyk7CisgICAgQUxPR1YoImdldE91dHB1dEZvckVmZmVjdCgpIGdvdCBvdXRwdXQgJWQgZm9yIGZ4ICVzIGZsYWdzICV4IiwKKyAgICAgICAgICBvdXRwdXQsIChkZXNjID09IE5VTEwpID8gInVuc3BlY2lmaWVkIiA6IGRlc2MtPm5hbWUsICAoZGVzYyA9PSBOVUxMKSA/IDAgOiBkZXNjLT5mbGFncyk7CisKKyAgICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShpbyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbyk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJyZWdpc3RlckVmZmVjdCgpIHVua25vd24gaW8gJWQiLCBpbyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSArIGRlc2MtPm1lbW9yeVVzYWdlID4gZ2V0TWF4RWZmZWN0c01lbW9yeSgpKSB7CisgICAgICAgIEFMT0dXKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIE1lbW9yeSAlZCBLQiIsCisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgZGVzYy0+bWVtb3J5VXNhZ2UpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgKz0gZGVzYy0+bWVtb3J5VXNhZ2U7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBpbyAlZCwgc3RyYXRlZ3kgJWQgc2Vzc2lvbiAlZCBpZCAlZCIsCisgICAgICAgICAgICBkZXNjLT5uYW1lLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQsIHRvdGFsIG1lbW9yeSAlZCIsIGRlc2MtPm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcigpOworICAgIG1lbWNweSAoJmVmZmVjdERlc2MtPm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGVmZmVjdERlc2MtPm1JbyA9IGlvOworICAgIGVmZmVjdERlc2MtPm1TdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KXN0cmF0ZWd5OworICAgIGVmZmVjdERlc2MtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBlZmZlY3REZXNjLT5tRW5hYmxlZCA9IGZhbHNlOworCisgICAgbUVmZmVjdHMuYWRkKGlkLCBlZmZlY3REZXNjKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVmZmVjdHMuaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaW5kZXgpOworCisgICAgc2V0RWZmZWN0RW5hYmxlZChlZmZlY3REZXNjLCBmYWxzZSk7CisKKyAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSA8IGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlKSB7CisgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkIHRvbyBiaWcgZm9yIHRvdGFsICVkIiwKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlID0gbVRvdGFsRWZmZWN0c01lbW9yeTsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c01lbW9yeSAtPSBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZTsKKyAgICBBTE9HVigidW5yZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgSUQgJWQsIG1lbW9yeSAlZCB0b3RhbCBtZW1vcnkgJWQiLAorICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgaWQsIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKworICAgIG1FZmZlY3RzLnJlbW92ZUl0ZW0oaWQpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1FZmZlY3RzLmluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKG1FZmZlY3RzLnZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+JiBlZmZlY3REZXNjLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQgPT0gZWZmZWN0RGVzYy0+bUVuYWJsZWQpIHsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQoJXMpIGVmZmVjdCBhbHJlYWR5ICVzIiwKKyAgICAgICAgICAgICBlbmFibGVkPyJ0cnVlIjoiZmFsc2UiLCBlbmFibGVkPyJlbmFibGVkIjoiZGlzYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCArIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQgPiBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpKSB7CisgICAgICAgICAgICBBTE9HVygic2V0RWZmZWN0RW5hYmxlZCh0cnVlKSBDUFUgTG9hZCBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIENQVSAlZiBNSVBTIiwKKyAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgKGZsb2F0KWVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQvMTApOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkICs9IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQ7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKHRydWUpIHRvdGFsIENQVSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgPCBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkKSB7CisgICAgICAgICAgICBBTE9HVygic2V0RWZmZWN0RW5hYmxlZChmYWxzZSkgQ1BVIGxvYWQgJWQgdG9vIGhpZ2ggZm9yIHRvdGFsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCA9IG1Ub3RhbEVmZmVjdHNDcHVMb2FkOworICAgICAgICB9CisgICAgICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkIC09IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQ7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKGZhbHNlKSB0b3RhbCBDUFUgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgfQorICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZW5hYmxlZDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1FbmFibGVkICYmIChlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpICYmCisgICAgICAgICAgICAgICAgKChlZmZlY3REZXNjLT5tRGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSA9PSAwKSkgeworICAgICAgICAgICAgQUxPR1YoImlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCAlcyBlbmFibGVkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgZWZmZWN0RGVzYy0+bVNlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpICE9IDApICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gKGludClzb3VyY2UgfHwKKyAgICAgICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiAmJgorICAgICAgICAgICAgICAgICBpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpCisgICAgICAgICAgICAgJiYgKGlucHV0RGVzY3JpcHRvci0+bVJlZkNvdW50ID4gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsIG1QcmltYXJ5T3V0cHV0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlZFxuIiwgbVBob25lU3RhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBjb21tdW5pY2F0aW9ucyAlZFxuIiwKKyAgICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIG1lZGlhICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciByZWNvcmQgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHN5c3RlbSAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGhkbWkgc3lzdGVtIGF1ZGlvICVkXG4iLAorICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzOlxuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPmR1bXAoZmQsIDIsIGkpOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiBBdmFpbGFibGUgaW5wdXQgZGV2aWNlczpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+ZHVtcChmZCwgMiwgaSk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtSHdNb2R1bGVzW2ldLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbU91dHB1dHMudmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBJbnB1dCAlZCBkdW1wOlxuIiwgbUlucHV0cy5rZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbUlucHV0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbVN0cmVhbXNbaV0uZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5Ub3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgVG90YWwgRWZmZWN0cyBtZW1vcnk6ICVkIEtCXG4iLAorICAgICAgICAgICAgKGZsb2F0KW1Ub3RhbEVmZmVjdHNDcHVMb2FkLzEwLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJSZWdpc3RlcmVkIGVmZmVjdHM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEVmZmVjdCAlZCBkdW1wOlxuIiwgbUVmZmVjdHMua2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1FZmZlY3RzLnZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gUGF0Y2hlczpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF1ZGlvUGF0Y2hlc1tpXS0+ZHVtcChmZCwgMiwgaSk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgdGhlIHBhcmFtZXRlcnMgd2hpY2ggY2FuIGJlIG9mZmxvYWRlZC4KKy8vIFRoaXMgY2FuIGJlIGVuaGFuY2VkIGRlcGVuZGluZyBvbiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgRFNQIGFuZCBwb2xpY3kKKy8vIG9mIHRoZSBzeXN0ZW0uCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykKK3sKKyAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBTUj0ldSwgQ009MHgleCwgRm9ybWF0PTB4JXgsIFN0cmVhbVR5cGU9JWQsIgorICAgICAiIEJpdFJhdGU9JXUsIGR1cmF0aW9uPSUiIFBSSWQ2NCAiIHVzLCBoYXNfdmlkZW89JWQiLAorICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAorICAgICBvZmZsb2FkSW5mby5mb3JtYXQsCisgICAgIG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlLCBvZmZsb2FkSW5mby5iaXRfcmF0ZSwgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMsCisgICAgIG9mZmxvYWRJbmZvLmhhc192aWRlbyk7CisKKyAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGhhcyBiZWVuIGRpc2FibGVkCisgICAgY2hhciBwcm9wVmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBwcm9wVmFsdWUsICIwIikpIHsKKyAgICAgICAgaWYgKGF0b2kocHJvcFZhbHVlKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGU9JXMiLCBwcm9wVmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGlmIHN0cmVhbSB0eXBlIGlzIG11c2ljLCB0aGVuIG9ubHkgYWxsb3cgb2ZmbG9hZCBhcyBvZiBub3cuCisgICAgaWYgKG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykKKyAgICB7CisgICAgICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IHN0cmVhbV90eXBlICE9IE1VU0lDLCByZXR1cm5pbmcgZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vVE9ETzogZW5hYmxlIGF1ZGlvIG9mZmxvYWRpbmcgd2l0aCB2aWRlbyB3aGVuIHJlYWR5CisgICAgaWYgKG9mZmxvYWRJbmZvLmhhc192aWRlbykKKyAgICB7CisgICAgICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IGhhc192aWRlbyA9PSB0cnVlLCByZXR1cm5pbmcgZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCisgICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIHByb3BWYWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgKGF0b2kocHJvcFZhbHVlKSAqIDEwMDAwMDAgKSkgeworICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JXMpIiwgcHJvcFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CisgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGRlZmF1bHQgbWluKD0ldSkiLCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorICAgIGlmIChpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwcm9maWxlIHRvIHN1cHBvcnQgdGhpcy4KKyAgICAvLyBBVURJT19ERVZJQ0VfTk9ORQorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoQVVESU9fREVWSUNFX05PTkUgLyppZ25vcmUgZGV2aWNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSBwcm9maWxlICVzZm91bmQiLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIik7CisgICAgcmV0dXJuIChwcm9maWxlICE9IDApOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKCpudW1fcG9ydHMgIT0gMCAmJiBwb3J0cyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cygpIHJvbGUgJWQgdHlwZSAlZCBudW1fcG9ydHMgJWQgcG9ydHMgJXAiLCByb2xlLCB0eXBlLCAqbnVtX3BvcnRzLCBwb3J0cyk7CisgICAgaWYgKHBvcnRzID09IE5VTEwpIHsKKyAgICAgICAgKm51bV9wb3J0cyA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IHBvcnRzV3JpdHRlbiA9IDA7CisgICAgc2l6ZV90IHBvcnRzTWF4ID0gKm51bV9wb3J0czsKKyAgICAqbnVtX3BvcnRzID0gMDsKKyAgICBpZiAodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTk9ORSB8fCB0eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX05PTkUgfHwgdHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgeworICAgICAgICAgICAgICAgIG1JbnB1dHNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtSW5wdXRzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRzID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1PdXRwdXRzW2ldLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXRzKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0c1dyaXR0ZW4gPCBwb3J0c01heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBudW1PdXRwdXRzOworICAgICAgICB9CisgICAgfQorICAgICpnZW5lcmF0aW9uID0gY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cygpIGdvdCAlenUgcG9ydHMgbmVlZGVkICVkIiwgcG9ydHNXcml0dGVuLCAqbnVtX3BvcnRzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQoreworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0RnJvbUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dERlc2M7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGcm9tSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Cit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzYy0+bUlkID09IGlkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5wdXREZXNjOworfQorCitzcCA8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNb2R1bGVGb3JEZXZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Cit7CisgICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbW9kdWxlOworfQorCitzcCA8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAoreworICAgIHNwIDxId01vZHVsZT4gbW9kdWxlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChtSHdNb2R1bGVzW2ldLT5tTmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1Id01vZHVsZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKQoreworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOworICAgIHJldHVybiBkZXZpY2VzICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpCit7CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHByaW1hcnlIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCktPm1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tTW9kdWxlLT5tSGFuZGxlID09IHByaW1hcnlIYW5kbGUpIHsKKyAgICAgICAgICAgIGRldmljZXMgfD0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bURldmljZVR5cGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCit7CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSIpOworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOworCisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAorICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8IHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdworICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPiAxKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKworICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoIHNvdXJjZSBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0udHlwZSk7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc2luayAlZDogaWQgJWQgcm9sZSAlZCB0eXBlICVkIiwgaSwgcGF0Y2gtPnNpbmtzW2ldLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbVVpZENhY2hlZCAlZCBwYXRjaERlc2MtPm1VaWQgJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPm1VaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpoYW5kbGUgPSAwOworICAgIH0KKworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLCJkdXBsaWNhdGVkIG91dHB1dCAlZCBpbiBzb3VyY2UgaW4gcG9ydHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwKSB7CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCAhPSBwYXRjaC0+c291cmNlc1swXS5pZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIGlkIGRpZmZlcnMgZm9yIHBhdGNoIGN1cnJlbnQgaWQgJWQgbmV3IGlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0IG1peCB0byBkZXZpY2VzIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIFRPRE8gYWRkIHN1cHBvcnQgZm9yIG1peCB0byBtaXggY29ubmVjdGlvbgorICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBtaXggYnV0IHNpbmsgaXMgbm90IGEgZGV2aWNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOworICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgb3V0IGRldmljZSBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNpbmtzW2ldLmlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW91dHB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPm1EZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkU2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FIC8qRklYTUUqLykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHByb2ZpbGUgbm90IHN1cHBvcnRlZCBmb3IgZGV2aWNlICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQorICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgZGV2aWNlcy50eXBlcygpLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VzLnR5cGVzKCksIHRydWUsIDAsIGhhbmRsZSk7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAvLyBpbnB1dCBkZXZpY2UgdG8gaW5wdXQgbWl4IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHNpbmsgc3VwcG9ydGVkIHdoZW4gY29ubmVjdGluZyBhbiBpbnB1dCBkZXZpY2UgdG8gYSBtaXgKKyAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1swXS5pZCAhPSBwYXRjaC0+c2lua3NbMF0uaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qdXBkYXRlZFNhbXBsZVJhdGUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmb3IgdGhlIHBhcmFtZXRlciB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBOT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQorICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1EZXZpY2VUeXBlLCBpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2RGVzYy0+bURldmljZVR5cGUsIHRydWUsIGhhbmRsZSk7CisgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRJbnB1dERldmljZSgpIGZhaWxlZCB0byBjcmVhdGUgYSBwYXRjaCIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAvLyBkZXZpY2UgdG8gZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3VwZGF0ZSBzb3VyY2UgYW5kIHNpbmsgd2l0aCBvdXIgb3duIGRhdGEgYXMgdGhlIGRhdGEgcGFzc2VkIGluIHRoZSBwYXRjaCBtYXkKKyAgICAgICAgICAgIC8vIGJlIGluY29tcGxldGUuCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbmV3UGF0Y2ggPSAqcGF0Y2g7CisgICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBkZXZpY2UgYnV0IG9uZSBzaW5rIGlzIG5vdCBhIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYy0+bU1vZHVsZSAhPSBzaW5rRGV2aWNlRGVzYy0+bU1vZHVsZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG9uZSBzaW5rIHN1cHBvcnRlZCB3aGVuIGNvbm5lY3RlZCBkZXZpY2VzIGFjcm9zcyBIVyBtb2R1bGVzCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZURlc2MtPm1EZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8gZ28gdmlhCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaCBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1sxXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZyb20gcm91dGluZyBjYXBhYmlsaXRpZXMgaW4gY29uZmlnIGZpbGUgYW5kIG90aGVyIGNvbmZsaWN0aW5nIHBhdGNoZXMKKworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJm5ld1BhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1BhdGNoLCB1aWQpOworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IG5ld1BhdGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCit7CisgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgcGF0Y2ggJWQiLCBoYW5kbGUpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIG1VaWRDYWNoZWQgJWQgcGF0Y2hEZXNjLT5tVWlkICVkIHVpZCAlZCIsCisgICAgICAgICAgbVVpZENhY2hlZCwgcGF0Y2hEZXNjLT5tVWlkLCB1aWQpOworICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5tVWlkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnBhdGNoRGVzYy0+bVBhdGNoOworICAgIHBhdGNoRGVzYy0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgdHJ1ZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgaW5wdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICgqbnVtX3BhdGNoZXMgIT0gMCAmJiBwYXRjaGVzID09IE5VTEwpIHx8CisgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBudW1fcGF0Y2hlcyAlZCBwYXRjaGVzICVwIGF2YWlsYWJsZSBwYXRjaGVzICV6dSIsCisgICAgICAgICAgKm51bV9wYXRjaGVzLCBwYXRjaGVzLCBtQXVkaW9QYXRjaGVzLnNpemUoKSk7CisgICAgaWYgKHBhdGNoZXMgPT0gTlVMTCkgeworICAgICAgICAqbnVtX3BhdGNoZXMgPSAwOworICAgIH0KKworICAgIHNpemVfdCBwYXRjaGVzV3JpdHRlbiA9IDA7CisgICAgc2l6ZV90IHBhdGNoZXNNYXggPSAqbnVtX3BhdGNoZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICBpICA8IG1BdWRpb1BhdGNoZXMuc2l6ZSgpICYmIHBhdGNoZXNXcml0dGVuIDwgcGF0Y2hlc01heDsgaSsrKSB7CisgICAgICAgIHBhdGNoZXNbcGF0Y2hlc1dyaXR0ZW5dID0gbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoOworICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuKytdLmlkID0gbUF1ZGlvUGF0Y2hlc1tpXS0+bUhhbmRsZTsKKyAgICAgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBwYXRjaCAlenUgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKKyAgICAgICAgICAgICAgaSwgbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoLm51bV9zb3VyY2VzLCBtQXVkaW9QYXRjaGVzW2ldLT5tUGF0Y2gubnVtX3NpbmtzKTsKKyAgICB9CisgICAgKm51bV9wYXRjaGVzID0gbUF1ZGlvUGF0Y2hlcy5zaXplKCk7CisKKyAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcygpIGdvdCAlenUgcGF0Y2hlcyBuZWVkZWQgJWQiLCBwYXRjaGVzV3JpdHRlbiwgKm51bV9wYXRjaGVzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWcoKSIpOworCisgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWcoKSBvbiBwb3J0IGhhbmRsZSAlZCIsIGNvbmZpZy0+aWQpOworICAgIC8vIE9ubHkgc3VwcG9ydCBnYWluIGNvbmZpZ3VyYXRpb24gZm9yIG5vdworICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICE9IEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNwPEF1ZGlvUG9ydENvbmZpZz4gYXVkaW9Qb3J0Q29uZmlnOworICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldE91dHB1dEZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldEF1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gb3V0cHV0RGVzYzsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb1BvcnRDb25maWcgPSBpbnB1dERlc2M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOworICAgICAgICBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKKyAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VEZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gZGV2aWNlRGVzYzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsICZiYWNrdXBDb25maWcpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZzsKKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoJmJhY2t1cENvbmZpZyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCkKK3sKKyAgICBmb3IgKHNzaXplX3QgaSA9IDA7IGkgPCAoc3NpemVfdCltQXVkaW9QYXRjaGVzLnNpemUoKTsgaSsrKSAgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICAvLyByZWxlYXNlQXVkaW9QYXRjaCgpIHJlbW92ZXMgdGhlIHBhdGNoIGZyb20gbUF1ZGlvUGF0Y2hlcworICAgICAgICAgICAgaWYgKHJlbGVhc2VBdWRpb1BhdGNoKG1BdWRpb1BhdGNoZXMua2V5QXQoaSksIHVpZCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCit7CisgICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKCk7CisgICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKCk7CisgICAgKmRldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9IT1RXT1JEKTsKKworICAgIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5hZGQoKnNlc3Npb24sICppb0hhbmRsZSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgcmVnaXN0ZXJlZCIsIHNlc3Npb24pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb24pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiYgcGF0Y2gpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOworCisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgQUxPR1coImFkZEF1ZGlvUGF0Y2goKSBwYXRjaCAlZCBhbHJlYWR5IGluIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBtQXVkaW9QYXRjaGVzLmFkZChoYW5kbGUsIHBhdGNoKTsKKyAgICBBTE9HVigiYWRkQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIHNvdXJjZSBoYW5kbGUgJWQiCisgICAgICAgICAgICAic2luayBoYW5kbGUgJWQiLAorICAgICAgICAgIGhhbmRsZSwgcGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rcywKKyAgICAgICAgICBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uaWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZW1vdmVBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgbm90IGluIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBBTE9HVigicmVtb3ZlQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQiLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KS0+bUFmUGF0Y2hIYW5kbGUpOworICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeU1hbmFnZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0VW5pcXVlSWQoKQoreworICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6Om5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCkKK3sKKyAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtQXVkaW9Qb3J0R2VuZXJhdGlvbik7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCisgICAgOgorI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgVGhyZWFkKGZhbHNlKSwKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisgICAgbVByaW1hcnlPdXRwdXQoKGF1ZGlvX2lvX2hhbmRsZV90KTApLAorICAgIG1QaG9uZVN0YXRlKEFVRElPX01PREVfTk9STUFMKSwKKyAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1MYXN0Vm9pY2VWb2x1bWUoLTEuMGYpLAorICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApLAorICAgIG1BMmRwU3VzcGVuZGVkKGZhbHNlKSwKKyAgICBtU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpLCBtTmV4dFVuaXF1ZUlkKDEpLAorICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpCit7CisgICAgbVVpZENhY2hlZCA9IGdldHVpZCgpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlID0gY2xpZW50SW50ZXJmYWNlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSsrKSB7CisgICAgICAgIG1Gb3JjZVVzZVtpXSA9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKworICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CisgICAgaWYgKGxvYWRBdWRpb1BvbGljeUNvbmZpZyhBVURJT19QT0xJQ1lfVkVORE9SX0NPTkZJR19GSUxFKSAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAobG9hZEF1ZGlvUG9saWN5Q29uZmlnKEFVRElPX1BPTElDWV9DT05GSUdfRklMRSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgbG9hZCBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlLCBzZXR0aW5nIGRlZmF1bHRzIik7CisgICAgICAgICAgICBkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBhbmQgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBub3cgY29udGFpbiBhbGwgYXR0YWNoZWQgZGV2aWNlcworCisgICAgLy8gbXVzdCBiZSBkb25lIGFmdGVyIHJlYWRpbmcgdGhlIHBvbGljeQorICAgIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKTsKKworICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcworICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUobUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IG9wZW4gSFcgbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCisgICAgICAgIC8vIGV4Y2VwdCBmb3IgZGlyZWN0IG91dHB1dCBzdHJlYW1zIHRoYXQgYXJlIG9ubHkgb3BlbmVkIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkKKyAgICAgICAgLy8gcmVxdWlyZWQgYnkgYW4gYXBwLgorICAgICAgICAvLyBUaGlzIGFsc28gdmFsaWRhdGVzIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3QKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gb3V0UHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKworICAgICAgICAgICAgaWYgKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGUpICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgorICAgICAgICAgICAgICAgIC8vIG91dHB1dERldmljZVR5cGVzCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+bURldmljZVR5cGU7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBvdXRwdXREZXZpY2VUeXBlcykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3Iob3V0UHJvZmlsZSk7CisKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBwcm9maWxlVHlwZTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG91dFByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbmRleCA+PSAwKSAmJiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tSWQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCisgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IGluUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOworCisgICAgICAgICAgICBpZiAoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAvLyBpbnB1dERldmljZVR5cGVzCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlKTsKKworICAgICAgICAgICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7CisKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBpbnB1dERlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBpbnB1dERlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChpblByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+bURldmljZVR5cGU7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbmRleCA+PSAwKSAmJiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgeworICAgICAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPm1JZCA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiSW5wdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+bURldmljZVR5cGUpOworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7KSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tSWQgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bURldmljZVR5cGUpOworICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKKyAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihtRGVmYXVsdE91dHB1dERldmljZSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJEZWZhdWx0IGRldmljZSAlMDh4IGlzIHVucmVhY2hhYmxlIiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKTsKKyAgICB9CisKKyAgICBBTE9HRV9JRigobVByaW1hcnlPdXRwdXQgPT0gMCksICJGYWlsZWQgdG8gb3BlbiBwcmltYXJ5IG91dHB1dCIpOworCisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaWYgKG1QcmltYXJ5T3V0cHV0ICE9IDApIHsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1QcmltYXJ5T3V0cHV0LCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbVRlc3REZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgICAgIG1UZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIG1UZXN0Q2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICBtVGVzdExhdGVuY3lNcyA9IDA7CisgICAgICAgIG1DdXJPdXRwdXQgPSAwOworICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdE91dHB1dHNbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Iik7CisgICAgICAgIHJ1bihidWZmZXIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6fkF1ZGlvUG9saWN5TWFuYWdlcigpCit7CisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBleGl0KCk7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobU91dHB1dHMua2V5QXQoaSkpOworICAgfQorICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaSkpOworICAgfQorICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuY2xlYXIoKTsKKyAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuY2xlYXIoKTsKKyAgIG1PdXRwdXRzLmNsZWFyKCk7CisgICBtSW5wdXRzLmNsZWFyKCk7CisgICBtSHdNb2R1bGVzLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gKG1QcmltYXJ5T3V0cHV0ID09IDApID8gTk9fSU5JVCA6IE5PX0VSUk9SOworfQorCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0aHJlYWRMb29wKCkKK3sKKyAgICBBTE9HVigiZW50ZXJpbmcgdGhyZWFkTG9vcCgpIik7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQorICAgIHsKKyAgICAgICAgU3RyaW5nOCBjb21tYW5kOworICAgICAgICBpbnQgdmFsdWVJbnQ7CisgICAgICAgIFN0cmluZzggdmFsdWU7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBtaWxsaXNlY29uZHMoNTApKTsKKworICAgICAgICBjb21tYW5kID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IikpOworICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGNvbW1hbmQpOworCisgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUiAmJgorICAgICAgICAgICAgdmFsdWVJbnQgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIlRlc3QgY29tbWFuZCAlcyByZWNlaXZlZCIsIGNvbW1hbmQuc3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nOCB0YXJnZXQ7CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRhcmdldCIpLCB0YXJnZXQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gIk1hbmFnZXIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IikpOworICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQgPSB2YWx1ZUludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gImZhbHNlIikgeworICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpKTsKKyAgICAgICAgICAgICAgICBtVGVzdElucHV0ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpKTsKKyAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJQQ00gMTYgYml0cyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiUENNIDggYml0cyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV84X0JJVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDb21wcmVzc2VkIE1QMyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX01QMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJmb3JtYXQiKSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIikpOworICAgICAgICAgICAgICAgIGludCBjaGFubmVscyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIFN0ZXJlbyIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIE1vbm8iKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX01PTk87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJjaGFubmVscyIpLCBjaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlSW50ID49IDAgJiYgdmFsdWVJbnQgPD0gOTYwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsaW5nUmF0ZSA9IHZhbHVlSW50OworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJzYW1wbGluZ19yYXRlIiksIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSk7CisKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1QcmltYXJ5T3V0cHV0KTsKKworICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUgPSBvdXRwdXREZXNjLT5tTW9kdWxlLT5tSGFuZGxlOworCisgICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShtUHJpbWFyeU91dHB1dCk7CisKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtb2R1bGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1QcmltYXJ5T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlb3BlbiBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxpbmdSYXRlOiAlZCwgZm9ybWF0ICVkLCBjaGFubmVscyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5tRm9ybWF0LCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVByaW1hcnlPdXRwdXQsIG91dHB1dENtZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1QcmltYXJ5T3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5PSIpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpleGl0KCkKK3sKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgICAgIHJlcXVlc3RFeGl0KCk7CisgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIH0KKyAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKK30KKworaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6dGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgeworICAgICAgICBpZiAob3V0cHV0ID09IG1UZXN0T3V0cHV0c1tpXSkgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworLy8gLS0tCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCit7CisgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OworICAgIG91dHB1dERlc2MtPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgIG1PdXRwdXRzLmFkZChvdXRwdXQsIG91dHB1dERlc2MpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYykKK3sKKyAgICBpbnB1dERlc2MtPm1Jb0hhbmRsZSA9IGlucHV0OworICAgIGlucHV0RGVzYy0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzIC8qaW4qLywKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKSB7CisgICAgLy8gbG9vayBmb3IgYSBtYXRjaCBvbiB0aGUgZ2l2ZW4gYWRkcmVzcyBvbiB0aGUgYWRkcmVzc2VzIG9mIHRoZSBvdXRwdXRzOgorICAgIC8vIGZpbmQgdGhlIGFkZHJlc3MgYnkgZmluZGluZyB0aGUgcGF0Y2ggdGhhdCBtYXBzIHRvIHRoaXMgb3V0cHV0CisgICAgc3NpemVfdCBwYXRjaElkeCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShkZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIC8vQUxPR1YoIiAgICBpbnNwZWN0aW5nIG91dHB1dCAlZCAocGF0Y2ggJWQpIGZvciBzdXBwb3J0ZWQgZGV2aWNlPTB4JXgiLAorICAgIC8vICAgICAgICBvdXRwdXRJZHgsIHBhdGNoSWR4LCAgZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworICAgIGlmIChwYXRjaElkeCA+PSAwKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChwYXRjaElkeCk7CisgICAgICAgIGNvbnN0IGludCBudW1TaW5rcyA9IHBhdGNoRGVzYy0+bVBhdGNoLm51bV9zaW5rczsKKyAgICAgICAgZm9yIChzc2l6ZV90IGo9MDsgaiA8IG51bVNpbmtzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1tqXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRjaEFkZHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2guc2lua3Nbal0uZXh0LmRldmljZS5hZGRyZXNzOworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKHBhdGNoQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gc2FtZSBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tSW9IYW5kbGUsICBwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1tqXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT5tRGV2aWNlVHlwZTsKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCisgICAgZGV2RGVzYy0+Y2xlYXJDYXBhYmlsaXRpZXMoKTsKKworICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgeworICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGlmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgYWRkcmVzcywgb3V0cHV0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHRoZW4gbG9vayBmb3Igb3V0cHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICV6dSIsIGosIGkpOworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQobUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiICBmb3VuZCAlZCBwcm9maWxlcywgJWQgb3V0cHV0cyIsIHByb2ZpbGVzLnNpemUoKSwgb3V0cHV0cy5zaXplKCkpOworCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkgJiYgb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9wZW4gb3V0cHV0cyBmb3IgbWF0Y2hpbmcgcHJvZmlsZXMgaWYgbmVlZGVkLiBEaXJlY3Qgb3V0cHV0cyBhcmUgYWxzbyBvcGVuZWQgdG8KKyAgICAgICAgLy8gcXVlcnkgZm9yIGR5bmFtaWMgcGFyYW1ldGVycyBhbmQgd2lsbCBiZSBjbG9zZWQgbGF0ZXIgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKKyAgICAgICAgZm9yIChzc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOyBwcm9maWxlX2luZGV4IDwgKHNzaXplX3QpcHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlX2luZGV4KyspIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IHByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworCisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGlmIG9uZSBvdXRwdXQgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZQorICAgICAgICAgICAgc2l6ZV90IGo7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzLml0ZW1BdChqKSk7CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHByb2ZpbGU6IHNhdmUgdGhlIHNhbXBsZSByYXRlcywgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2tzIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgcHJvZmlsZSBpbiBvdXIgZGV2aWNlIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiAhPSBvdXRwdXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpKTsKKyAgICAgICAgICAgIGRlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUpOworICAgICAgICAgICAgZGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgdGhlIG91dF9zZXRfcGFyYW1ldGVycygpIGZvciBjYXJkICYgZGV2aWNlIGdldHMgY2FsbGVkCisgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIFN0cmluZzgocGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB3ZSBzdGVwIHRocm91Z2ggYW5kIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OworICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZE91dENoYW5uZWxzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgbWlzc2luZyBwYXJhbSIpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwIHx8IHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgc3RyZWFtIHZvbHVtZSBmb3IgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBkZXZpY2UsIDAsIHRydWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBhdWRpbyBlZmZlY3Qgb3V0cHV0IHN0YWdlIGhlcmUKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBhIGR1cGxpY2F0aW5nIG91dHB1dCB0aHJlYWQgZm9yIHRoZSBuZXcgb3V0cHV0IGFuZCB0aGUgcHJpbWFyeSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWRPdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZWRPdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZHVwbGljYXRlZCBvdXRwdXQgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tRm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBkZXNjLT5tTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoZHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGR1cGxpY2F0ZWRPdXRwdXQsIGRldmljZSwgMCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChvdXRwdXQpOworICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2UoZGV2PTB4JXgsIGFkZHI9JXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBkZXZpY2UsIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8sIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gRGlzY29ubmVjdAorICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIG91dHB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAgKCEoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdCBtYXRjaCBvbiBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSA9PSBkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgYWRkcmVzcywgb3V0cHV0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gaW5wdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIGlucHV0ICVkIiwgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIGlucHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKKyAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2lkeCA9IDA7IG1vZHVsZV9pZHggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2lkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBpbnB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3BlbiBpbnB1dHMgZm9yIG1hdGNoaW5nIHByb2ZpbGVzIGlmIG5lZWRlZC4gRGlyZWN0IGlucHV0cyBhcmUgYWxzbyBvcGVuZWQgdG8KKyAgICAgICAgLy8gcXVlcnkgZm9yIGR5bmFtaWMgcGFyYW1ldGVycyBhbmQgd2lsbCBiZSBjbG9zZWQgbGF0ZXIgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKKyAgICAgICAgZm9yIChzc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOyBwcm9maWxlX2luZGV4IDwgKHNzaXplX3QpcHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlX2luZGV4KyspIHsKKworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGlmIG9uZSBpbnB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCisgICAgICAgICAgICBzaXplX3QgaW5wdXRfaW5kZXg7CisgICAgICAgICAgICBmb3IgKGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnB1dF9pbmRleCAhPSBtSW5wdXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigib3BlbmluZyBpbnB1dCBmb3IgZGV2aWNlIDB4JVggd2l0aCBwYXJhbXMgJXMiLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FIC8qRklYTUUqLyk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBTdHJpbmc4KHBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgd2Ugc3RlcCB0aHJvdWdoIGFuZCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzCisgICAgICAgICAgICAgICAgU3RyaW5nOCByZXBseTsKKyAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgc2FtcGxpbmcgcmF0ZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBmb3JtYXRzICVzIiwgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgY2hhbm5lbCBtYXNrcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IDApICYmIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPCAyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IG1pc3NpbmcgcGFyYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZElucHV0KGlucHV0LCBkZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKKworICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlucHV0cy5hZGQoaW5wdXQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy8gZW5kIHNjYW4gcHJvZmlsZXMKKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdAorICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIGlucHV0IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgYWZ0ZXIgZGlzY29ubmVjdGluZyBvbmUgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICBpZiAoIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgaW5wdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaW5kZXggPSAwOyBtb2R1bGVfaW5kZXggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2luZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogY2xlYXJpbmcgZGlyZWN0IGlucHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBtb2R1bGVfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvLyBlbmQgZGlzY29ubmVjdAorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoImNsb3NlT3V0cHV0KCVkKSIsIG91dHB1dCk7CisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImNsb3NlT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbG9vayBmb3IgZHVwbGljYXRlZCBvdXRwdXRzIGNvbm5lY3RlZCB0byB0aGUgb3V0cHV0IGJlaW5nIHJlbW92ZWQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAorICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MyOworICAgICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAorICAgICAgICAgICAgLy8gYW5kIGFzIHRoZXkgd2VyZSBhbHNvIHJlZmVyZW5jZWQgb24gdGhlIG90aGVyIG91dHB1dCwgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KKyAgICAgICAgICAgIC8vIHRoZSBvdGhlciBvdXRwdXQuCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHVwbGljYXRlZE91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCkgY2xvc2luZyBhbHNvIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgZHVwbGljYXRlZE91dHB1dCk7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0oZHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9CisKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBwYXJhbS5hZGQoU3RyaW5nOCgiY2xvc2luZyIpLCBTdHJpbmc4KCJ0cnVlIikpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7CisgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBBTE9HVigiY2xvc2VJbnB1dCglZCkiLCBpbnB1dCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJjbG9zZUlucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgIG1JbnB1dHMucmVtb3ZlSXRlbShpbnB1dCk7Cit9CisKK1NvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBvcGVuT3V0cHV0cykKK3sKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CisKKyAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVlYoIm91dHB1dCAlZCBpc0R1cGxpY2F0ZWQ9JWQgZGV2aWNlPSUwNHgiLAorICAgICAgICAgICAgICAgIGksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRlZCgpLCBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBpZiAoKGRldmljZSAmIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSkgPT0gZGV2aWNlKSB7CisgICAgICAgICAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBmb3VuZCBvdXRwdXQgJWQiLCBvcGVuT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICBvdXRwdXRzLmFkZChvcGVuT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dHM7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKQoreworICAgIGlmIChvdXRwdXRzMS5zaXplKCkgIT0gb3V0cHV0czIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzMS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAob3V0cHV0czFbaV0gIT0gb3V0cHV0czJbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgICBhdWRpb19kZXZpY2VzX3Qgb2xkRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNyY091dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG9sZERldmljZSwgbVByZXZpb3VzT3V0cHV0cyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShuZXdEZXZpY2UsIG1PdXRwdXRzKTsKKworICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKKyAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgbW92aW5nIGZyb20gb3V0cHV0ICVkIHRvIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgIHN0cmF0ZWd5LCBzcmNPdXRwdXRzWzBdLCBkc3RPdXRwdXRzWzBdKTsKKyAgICAgICAgLy8gbXV0ZSBzdHJhdGVneSB3aGlsZSBtb3ZpbmcgdHJhY2tzIGZyb20gb25lIG91dHB1dCB0byBhbm90aGVyCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3JjT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Ioc3JjT3V0cHV0c1tpXSk7CisgICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShzdHJhdGVneSkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIHNyY091dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIHNyY091dHB1dHNbaV0sIE1VVEVfVElNRV9NUywgbmV3RGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGZ4T3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gbW92ZWQ7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1TZXNzaW9uID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvICE9IGZ4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZC5pbmRleE9mKGVmZmVjdERlc2MtPm1JbykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBlZmZlY3QgJWQgdG8gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzLmtleUF0KGkpLCBmeE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBlZmZlY3REZXNjLT5tSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWQuYWRkKGVmZmVjdERlc2MtPm1Jbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvID0gZnhPdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCit7CisgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKKyAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQorICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEEyZHBPdXRwdXQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCit7CisgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IGdldEEyZHBPdXRwdXQoKTsKKyAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7CisgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KKyAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSAhPSAwOworICAgIC8vIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWY6CisgICAgLy8gICAgICAoTk9UIGFscmVhZHkgc3VzcGVuZGVkKSAmJgorICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIGNvbm5lY3RlZCAmJgorICAgIC8vICAgICAgIChmb3JjZWQgdXNhZ2UgZm9yIGNvbW11bmljYXRpb24gfHwgZm9yIHJlY29yZCBpcyBTQ08pKSkgfHwKKyAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyByaW5naW5nIHx8IGluIGNhbGwpCisgICAgLy8KKyAgICAvLyByZXN0b3JlIEEyRFAgb3V0cHV0IGlmOgorICAgIC8vICAgICAgKEFscmVhZHkgc3VzcGVuZGVkKSAmJgorICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQgfHwKKyAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIE5PVCBmb3IgY29tbXVuaWNhdGlvbiAmJiBOT1QgZm9yIHJlY29yZCBpcyBTQ08pKSkgJiYKKyAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyBOT1QgcmluZ2luZyAmJiBOT1QgaW4gY2FsbCkKKyAgICAvLworICAgIGlmIChtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICBpZiAoKCFpc1Njb0Nvbm5lY3RlZCB8fAorICAgICAgICAgICAgICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKKyAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSAmJgorICAgICAgICAgICAgICgobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgorICAgICAgICAgICAgICAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9SSU5HVE9ORSkpKSB7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZXN0b3JlT3V0cHV0KGEyZHBPdXRwdXQpOworICAgICAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoaXNTY29Db25uZWN0ZWQgJiYKKyAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgfHwKKyAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgICAgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUpKSkgeworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3VzcGVuZE91dHB1dChhMmRwT3V0cHV0KTsKKyAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGVjayB0aGUgZm9sbG93aW5nIGJ5IG9yZGVyIG9mIHByaW9yaXR5IHRvIHJlcXVlc3QgYSByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3Nhcnk6CisgICAgLy8gMTogdGhlIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGFuZCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQorICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCisgICAgLy8gMzogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQorICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KKyAgICAvLyA1OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24KKyAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgbWVkaWEgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYQorICAgIC8vIDc6IHRoZSBzdHJhdGVneSBEVE1GIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgRFRNRgorICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1BIT05FKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfTUVESUEpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9EVE1GKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GLCBmcm9tQ2FjaGUpOworICAgIH0KKworICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgeworICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKKyAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+bURldmljZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7CisKKyAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICByZXR1cm4gKHVpbnQzMl90KWdldFN0cmF0ZWd5KHN0cmVhbSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAorICAgIC8vIGdldFN0cmF0ZWd5J3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4gIGdldFN0cmF0ZWd5IHdvdWxkIGRvIGEgQUxPR0UKKyAgICAvLyBhbmQgdGhlbiByZXR1cm4gU1RSQVRFR1lfTUVESUEsIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgorICAgIGlmIChzdHJlYW0gPCAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzOworICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6cm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgZGV2aWNlcyA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlcywgbU91dHB1dHMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc3RyYXRlZ3kpKSB7CisgICAgICAgICAgICBkZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qRmlsdGVyIFNQRUFLRVJfU0FGRSBvdXQgb2YgcmVzdWx0cywgYXMgQXVkaW9TZXJ2aWNlIGRvZXNuJ3Qga25vdyBhYm91dCBpdAorICAgICAgYW5kIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8uKi8KKyAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7CisgICAgICAgIGRldmljZXMgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICB9CisKKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3koCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICBzd2l0Y2ggKHN0cmVhbSkgeworICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CisgICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CisgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047CisgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7CisgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoInVua25vd24gc3RyZWFtIHR5cGUiKTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgIC8vIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKKyAgICAgICAgLy8gd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgeworICAgIC8vIGZsYWdzIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICB9CisKKyAgICAvLyB1c2FnZSB0byBzdHJhdGVneSBtYXBwaW5nCisgICAgc3dpdGNoIChhdHRyLT51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX01FRElBOworCisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9QSE9ORTsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9EVE1GOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1NPTklGSUNBVElPTjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9NRURJQTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgc3dpdGNoKHN0cmVhbSkgeworICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQoreworICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgaWYgKGZyb21DYWNoZSkgeworICAgICAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4IiwKKyAgICAgICAgICAgICAgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOworICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKKyAgICB9CisgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7CisKKyAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOgorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCisgICAgICAgICAgICAvLyAgIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKKyAgICAgICAgICAgIC8vICAgaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZworICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiAmJiAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpCisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgICAgIH0gZWxzZSBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgKG9yIGhhcyByZWNlbnRseSBwbGF5ZWQpLCB1c2UgdGhlIHNhbWUgZGV2aWNlCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3aGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgLy91c2VyICJzYWZlIiBzcGVha2VyIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIG5vcm1hbCBzcGVha2VyIHRvIGF2b2lkIHRyaWdnZXJpbmcKKyAgICAgICAgICAgIC8vb3RoZXIgYWNvdXN0aWMgc2FmZXR5IG1lY2hhbmlzbXMgZm9yIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIgJiYgKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKQorICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUUkFURUdZX0RUTUY6CisgICAgICAgIGlmICghaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgLy8gd2hlbiBvZmYgY2FsbCwgRFRNRiBzdHJhdGVneSBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIE1FRElBIHN0cmF0ZWd5CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyB3aGVuIGluIGNhbGwsIERUTUYgYW5kIFBIT05FIHN0cmF0ZWdpZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzCisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9QSE9ORToKKyAgICAgICAgLy8gRm9yY2UgdXNlIG9mIG9ubHkgZGV2aWNlcyBvbiBwcmltYXJ5IG91dHB1dCBpZjoKKyAgICAgICAgLy8gLSBpbiBjYWxsIEFORAorICAgICAgICAvLyAgIC0gY2Fubm90IHJvdXRlIGZyb20gdm9pY2UgY2FsbCBSWCBPUgorICAgICAgICAvLyAgIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPCAzLjAgYW5kIFRYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICBpZiAoKChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICgoKHR4RGV2aWNlICYgYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGh3T3V0cHV0RGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPm1IYWxWZXJzaW9uIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkpKSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgPSBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5IG9yZGVyCisgICAgICAgIC8vIG9mIHByaW9yaXR5CisgICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpIHx8IHN0cmF0ZWd5ICE9IFNUUkFURUdZX0RUTUYpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCisgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0byBBMkRQCisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGdldEEyZHBPdXRwdXQoKSAhPSAwKSAmJiAhbUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGlmIChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6CisgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0bworICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCisgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkgJiYgIW1BMmRwU3VzcGVuZGVkKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfTElORTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FLCBGT1JDRV9TUEVBS0VSIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CisKKyAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQorICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICAvLyBzdHJhdGVneSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIHVzZXMgc2FtZSByb3V0aW5nIHBvbGljeSBhcyBTVFJBVEVHWV9TT05JRklDQVRJT04KKyAgICAgICAgLy8gZXhjZXB0OgorICAgICAgICAvLyAgIC0gd2hlbiBpbiBjYWxsIHdoZXJlIGl0IGRvZXNuJ3QgZGVmYXVsdCB0byBTVFJBVEVHWV9QSE9ORSBiZWhhdmlvcgorICAgICAgICAvLyAgIC0gaW4gY291bnRyaWVzIHdoZXJlIG5vdCBlbmZvcmNlZCBpbiB3aGljaCBjYXNlIGl0IGZvbGxvd3MgU1RSQVRFR1lfTUVESUEKKworICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSkgeworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3BlYWtlciBkZXZpY2Ugbm90IGZvdW5kIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT04iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgc2Vjb25kIGRldmljZSB1c2VkIGZvciBzb25pZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGRldmljZSB1c2VkIGJ5IG1lZGlhIHN0cmF0ZWd5CisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9NRURJQTogeworICAgICAgICB1aW50MzJfdCBkZXZpY2UyID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGlmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfTElORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CisgICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gYXV4IGRpZ2l0YWwgKGUuZy4gSERNSSkKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0spKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0KKyAgICAgICAgaW50IGRldmljZTMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7CisgICAgICAgICAgICAvLyBBUkMsIFNQRElGIGFuZCBBVVhfTElORSBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMuCisgICAgICAgICAgICBkZXZpY2UzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOworICAgICAgICAgICAgZGV2aWNlMyB8PSAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRElGKTsKKyAgICAgICAgICAgIGRldmljZTMgfD0gKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSk7CisgICAgICAgIH0KKworICAgICAgICBkZXZpY2UyIHw9IGRldmljZTM7CisgICAgICAgIC8vIGRldmljZSBpcyBERVZJQ0VfT1VUX1NQRUFLRVIgaWYgd2UgY29tZSBmcm9tIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIG9yCisgICAgICAgIC8vIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIEFVRElPX0RFVklDRV9OT05FIG90aGVyd2lzZQorICAgICAgICBkZXZpY2UgfD0gZGV2aWNlMjsKKworICAgICAgICAvLyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCisgICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpICYmCisgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID09CisgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSkgeworICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX01FRElBIik7CisgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsIHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIG1EZXZpY2VGb3JTdHJhdGVneVtpXSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKyAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcykKK3sKKyAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KKyAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKKyAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQorICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgYm9vbCBzaG91bGRNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAocG9wY291bnQoZGV2aWNlKSA+PSAyKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGJvb2wgbXV0ZSA9IHNob3VsZE11dGUgJiYgKGN1ckRldmljZSAmIGRldmljZSkgJiYgKGN1ckRldmljZSAhPSBkZXZpY2UpOworICAgICAgICBib29sIGRvTXV0ZSA9IGZhbHNlOworCisgICAgICAgIGlmIChtdXRlICYmICFvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKSB7CisgICAgICAgICAgICBkb011dGUgPSB0cnVlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIW11dGUgJiYgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSl7CisgICAgICAgICAgICBkb011dGUgPSB0cnVlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChkb011dGUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOworICAgICAgICAgICAgICAgIC8vIHNraXAgb3V0cHV0IGlmIGl0IGRvZXMgbm90IHNoYXJlIGFueSBkZXZpY2Ugd2l0aCBjdXJyZW50IG91dHB1dAorICAgICAgICAgICAgICAgIGlmICgoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGN1ck91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGopOworICAgICAgICAgICAgICAgIEFMT0dWVigiY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpICVzIHN0cmF0ZWd5ICVkIChjdXJEZXZpY2UgJTA0eCkgb24gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBpLCBjdXJEZXZpY2UsIGN1ck91dHB1dCk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIG11dGUsIGN1ck91dHB1dCwgbXV0ZSA/IDAgOiBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZSgocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBub3QgbmVlZCB0byBkb3VibGUgbGF0ZW5jeSBpZiB2b2x1bWUgY291bGQgYmUgYXBwbGllZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYnkgdGhlIGF1ZGlvZmxpbmdlciBtaXhlci4gV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgZGVsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gbm93IGFuZCB0aGUgbmV4dCB0aW1lIHRoZSBhdWRpb2ZsaW5nZXIgdGhyZWFkIGZvciB0aGlzIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwcm9jZXNzIGEgYnVmZmVyICh3aGljaCBjb3JyZXNwb25kcyB0byBvbmUgYnVmZmVyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c3VhbGx5IDEvMiBvciAxLzQgb2YgdGhlIGxhdGVuY3kpLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGVXYWl0TXMgPCBkZXNjLT5sYXRlbmN5KCkgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IGRlc2MtPmxhdGVuY3koKSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBvdXRwdXQgaWYgZGV2aWNlIHNlbGVjdGlvbiBjaGFuZ2VzIHRvIGF2b2lkIHZvbHVtZSBidXJzdHMgZHVlIHRvCisgICAgLy8gZGlmZmVyZW50IHBlciBkZXZpY2Ugdm9sdW1lcworICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2UgIT0gcHJldkRldmljZSkpIHsKKyAgICAgICAgaWYgKG11dGVXYWl0TXMgPCBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyKSB7CisgICAgICAgICAgICBtdXRlV2FpdE1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIHRydWUsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8gZG8gdGVtcE11dGUgdW5tdXRlIGFmdGVyIHR3aWNlIHRoZSBtdXRlIHdhaXQgdGltZQorICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlV2FpdE1zICoyLCBkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2FpdCBmb3IgdGhlIFBDTSBvdXRwdXQgYnVmZmVycyB0byBlbXB0eSBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kCisgICAgaWYgKG11dGVXYWl0TXMgPiBkZWxheU1zKSB7CisgICAgICAgIG11dGVXYWl0TXMgLT0gZGVsYXlNczsKKyAgICAgICAgdXNsZWVwKG11dGVXYWl0TXMgKiAxMDAwKTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcykKK3sKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgb3V0cHV0ICVkIGRldmljZSAlMDR4IGRlbGF5TXMgJWQiLCBvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICB1aW50MzJfdCBtdXRlV2FpdE1zOworCisgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bU91dHB1dDEtPm1Jb0hhbmRsZSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7CisgICAgICAgIG11dGVXYWl0TXMgKz0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1PdXRwdXQyLT5tSW9IYW5kbGUsIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOworICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICB9CisgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKKyAgICAvLyBvdXRwdXQgcHJvZmlsZQorICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgKChkZXZpY2UgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSkgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gZmlsdGVyIGRldmljZXMgYWNjb3JkaW5nIHRvIG91dHB1dCBzZWxlY3RlZAorICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlID0gb3V0cHV0RGVzYy0+bURldmljZTsKKworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBwcmV2RGV2aWNlICUwNHgiLCBwcmV2RGV2aWNlKTsKKworICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICB9CisgICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZSwgZGVsYXlNcyk7CisKKyAgICAvLyBEbyBub3QgY2hhbmdlIHRoZSByb3V0aW5nIGlmOgorICAgIC8vICAtIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9OT05FCisgICAgLy8gIC0gdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMgY3VycmVudCBkZXZpY2UgYW5kIGZvcmNlIGlzIG5vdCBzcGVjaWZpZWQuCisgICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlKCkgd2l0aG91dCBjb25kaXRpb25zCisgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgZGV2aWNlID09IHByZXZEZXZpY2UpICYmICFmb3JjZSkgeworICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAlMDR4IG9yIG51bGwgZGV2aWNlIGZvciBvdXRwdXQgJWQiLCBkZXZpY2UsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjaGFuZ2luZyBkZXZpY2UiKTsKKworICAgIC8vIGRvIHRoZSByb3V0aW5nCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXQsIGRlbGF5TXMsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gKGFkZHJlc3MgPT0gTlVMTCkgPworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpCisgICAgICAgICAgICAgICAgOiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDA7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpICYmIGkgPCBBVURJT19QQVRDSF9QT1JUU19NQVg7IGkrKykgeworICAgICAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KGkpLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbaV0pOworICAgICAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKKyAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCisgICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7CisgICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQorICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7CisKKyAgICByZXR1cm4gbXV0ZVdhaXRNczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCit7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CisgICAgQUxPR1YoInJlc2V0T3V0cHV0RGV2aWNlKCkgcmVsZWFzZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQiLCBzdGF0dXMpOworICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7CisgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seToKKyAgICAgICAgICAgIC8vIGhhbmRsZWQgYXMgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIGJ5IHRoZSBhdWRpbyBIQUwKKyAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCisgICAgICAgICAgICAgICAgICAgICFpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlcikgeworICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICAgICAgLy9vbmx5IG9uZSBpbnB1dCBkZXZpY2UgZm9yIG5vdworICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoMCktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7CisgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICBBTE9HVigicmVzZXRJbnB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKKyAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgLy8gQ2hvb3NlIGFuIGlucHV0IHByb2ZpbGUgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBjYXB0dXJlIHBhcmFtZXRlcnM6IHNlbGVjdCB0aGUgZmlyc3QgYXZhaWxhYmxlCisgICAgLy8gcHJvZmlsZSBzdXBwb3J0aW5nIGFsbCByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGZsYWdzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6CisgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUDsKKyAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOworICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIC8vIEFsbG93IG9ubHkgdXNlIG9mIGRldmljZXMgb24gcHJpbWFyeSBpbnB1dCBpZiBpbiBjYWxsIGFuZCBIQUwgZG9lcyBub3Qgc3VwcG9ydCByb3V0aW5nCisgICAgICAgIC8vIHRvIHZvaWNlIGNhbGwgcGF0aC4KKyAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCisgICAgICAgICAgICAgICAgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgPT0gMCkgeworICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046CisgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKKyAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgorICAgICAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUM7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgorICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIGludmFsaWQgaW5wdXQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQUxPR1YoImdldERldmljZUZvcklucHV0U291cmNlKClpbnB1dCBzb3VyY2UgJWQsIGRldmljZSAlMDh4IiwgaW5wdXRTb3VyY2UsIGRldmljZSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmlydHVhbElucHV0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB7CisgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgaWYgKChwb3Bjb3VudChkZXZpY2UpID09IDEpICYmICgoZGV2aWNlICYgfkFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190IGRldmljZSkgeworICAgIHJldHVybiAoKGRldmljZSAmIEFQTV9BVURJT19ERVZJQ0VfTUFUQ0hfQUREUkVTU19BTEwpICE9IDApOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dF9kZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKGlucHV0X2Rlc2NyaXB0b3ItPm1SZWZDb3VudCA+IDApCisgICAgICAgICAgICAgICAgJiYgKCFpZ25vcmVWaXJ0dWFsSW5wdXRzIHx8ICFpc1ZpcnR1YWxJbnB1dERldmljZShpbnB1dF9kZXNjcmlwdG9yLT5tRGV2aWNlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRzLmtleUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFjdGl2ZUlucHV0c0NvdW50KCkgY29uc3QKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MtPm1SZWZDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIHRoaXMgaGFwcGVucyB3aGVuIGZvcmNpbmcgYSByb3V0ZSB1cGRhdGUgYW5kIG5vIHRyYWNrIGlzIGFjdGl2ZSBvbiBhbiBvdXRwdXQuCisgICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgY2F0ZWdvcnkgaXMgbm90IGltcG9ydGFudC4KKyAgICAgICAgZGV2aWNlID0gIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICB9IGVsc2UgaWYgKHBvcGNvdW50KGRldmljZSkgPiAxKSB7CisgICAgICAgIC8vIE11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24gaXMgZWl0aGVyOgorICAgICAgICAvLyAgLSBzcGVha2VyICsgb25lIG90aGVyIGRldmljZTogZ2l2ZSBwcmlvcml0eSB0byBzcGVha2VyIGluIHRoaXMgY2FzZS4KKyAgICAgICAgLy8gIC0gb25lIEEyRFAgZGV2aWNlICsgYW5vdGhlciBkZXZpY2U6IGhhcHBlbnMgd2l0aCBkdXBsaWNhdGVkIG91dHB1dC4gSW4gdGhpcyBjYXNlCisgICAgICAgIC8vIHJldGFpbiB0aGUgZGV2aWNlIG9uIHRoZSBBMkRQIG91dHB1dCBhcyB0aGUgb3RoZXIgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmUKKyAgICAgICAgLy8gc2VsZWN0aW9uIGlmIG5vdCB0aGUgc3BlYWtlci4KKyAgICAgICAgLy8gIC0gSERNSS1DRUMgc3lzdGVtIGF1ZGlvIG1vZGUgb25seSBvdXRwdXQ6IGdpdmUgcHJpb3JpdHkgdG8gYXZhaWxhYmxlIGl0ZW0gaW4gb3JkZXIuCisgICAgICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkU7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUERJRikgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUERJRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOworICAgICAgICB9CisgICAgfQorCisgICAgLypTUEVBS0VSX1NBRkUgaXMgYW4gYWxpYXMgb2YgU1BFQUtFUiBmb3IgcHVycG9zZXMgb2Ygdm9sdW1lIGNvbnRyb2wqLworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpCisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKworICAgIEFMT0dXX0lGKHBvcGNvdW50KGRldmljZSkgIT0gMSwKKyAgICAgICAgICAgICJnZXREZXZpY2VGb3JWb2x1bWUoKSBpbnZhbGlkIGRldmljZSBjb21iaW5hdGlvbjogJTA4eCIsCisgICAgICAgICAgICBkZXZpY2UpOworCisgICAgcmV0dXJuIGRldmljZTsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VfY2F0ZWdvcnkgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIHN3aXRjaChnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKSkgeworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U6CisgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFOworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ086CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CisgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQ7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9MSU5FOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw6CisgICAgICAgIC8qVVNCPyAgUmVtb3RlIHN1Ym1peD8qLworICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9TUEVBS0VSOworICAgIH0KK30KKworZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2b2xJbmRleFRvQW1wbChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjLAorICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSA9IGdldERldmljZUNhdGVnb3J5KGRldmljZSk7CisgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqY3VydmUgPSBzdHJlYW1EZXNjLm1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV07CisKKyAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtIHR5cGUKKyAgICBpbnQgbmJTdGVwcyA9IDEgKyBjdXJ2ZVtWT0xNQVhdLm1JbmRleCAtCisgICAgICAgICAgICBjdXJ2ZVtWT0xNSU5dLm1JbmRleDsKKyAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gc3RyZWFtRGVzYy5tSW5kZXhNaW4pKSAvCisgICAgICAgICAgICAoc3RyZWFtRGVzYy5tSW5kZXhNYXggLSBzdHJlYW1EZXNjLm1JbmRleE1pbik7CisKKyAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCisgICAgaW50IHNlZ21lbnQgPSAwOworICAgIGlmICh2b2xJZHggPCBjdXJ2ZVtWT0xNSU5dLm1JbmRleCkgeyAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKKyAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWT0xLTkVFMV0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAwOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVk9MS05FRTJdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBjdXJ2ZVtWT0xNQVhdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMjsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKKyAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgfQorCisgICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCisgICAgZmxvYXQgZGVjaWJlbHMgPSBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiArCisgICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSAqCisgICAgICAgICAgICAgICAgKCAoY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiAtCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbikgLworICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKTsKKworICAgIGZsb2F0IGFtcGxpZmljYXRpb24gPSBleHAoIGRlY2liZWxzICogMC4xMTUxMjlmKTsgLy8gZXhwKCBkQiAqIGxuKDEwKSAvIDIwICkKKworICAgIEFMT0dWVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIGFtcGw9JS41ZiIsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgsIHZvbElkeCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4LAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24sCisgICAgICAgICAgICBkZWNpYmVscywKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24sCisgICAgICAgICAgICBhbXBsaWZpY2F0aW9uKTsKKworICAgIHJldHVybiBhbXBsaWZpY2F0aW9uOworfQorCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0Vm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtNDkuNWZ9LCB7MzMsIC0zMy41Zn0sIHs2NiwgLTE3LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0yMS4wZn0sIHsxMDAsIC0xMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU2LjBmfSwgezIwLCAtMzQuMGZ9LCB7NjAsIC0xMS4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01NS4wZn0sIHsyMCwgLTQzLjBmfSwgezg2LCAtMTIuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTI5LjdmfSwgezMzLCAtMjAuMWZ9LCB7NjYsIC0xMC4yZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMzUuN2Z9LCB7MzMsIC0yNi4xZn0sIHs2NiwgLTEzLjJmfSwgezEwMCwgMC4wZn0KK307CisKKy8vIEFVRElPX1NUUkVBTV9TWVNURU0sIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIGFuZCBBVURJT19TVFJFQU1fRFRNRiB2b2x1bWUgdHJhY2tzCisvLyBBVURJT19TVFJFQU1fUklORyBvbiBwaG9uZXMgYW5kIEFVRElPX1NUUkVBTV9NVVNJQyBvbiB0YWJsZXRzLgorLy8gQVVESU9fU1RSRUFNX0RUTUYgdHJhY2tzIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHdoaWxlIGluIGNhbGwgKFNlZSBBdWRpb1NlcnZpY2UuamF2YSkuCisvLyBUaGUgcmFuZ2UgaXMgY29uc3RyYWluZWQgYmV0d2VlbiAtMjRkQiBhbmQgLTZkQiBvdmVyIHNwZWFrZXIgYW5kIC0zMGRCIGFuZCAtMThkQiBvdmVyIGhlYWRzZXQuCisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0yNC4wZn0sIHszMywgLTE4LjBmfSwgezY2LCAtMTIuMGZ9LCB7MTAwLCAtNi4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0zNC4wZn0sIHszMywgLTI0LjBmfSwgezY2LCAtMTUuMGZ9LCB7MTAwLCAtNi4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0zMC4wZn0sIHszMywgLTI2LjBmfSwgezY2LCAtMjIuMGZ9LCB7MTAwLCAtMTguMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezAsIC00Mi4wZn0sIHszMywgLTI4LjBmfSwgezY2LCAtMTQuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHswLCAtMjQuMGZ9LCB7MzMsIC0xNi4wZn0sIHs2NiwgLTguMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgICAgICAgICAqQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBdWRpb1BvbGljeU1hbmFnZXI6OkRFVklDRV9DQVRFR09SWV9DTlRdID0geworICAgIHsgLy8gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwKKyAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fU1lTVEVNCisgICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08KKyAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRQorICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCisgICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorfTsKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tpXS5tVm9sdW1lQ3VydmVbal0gPQorICAgICAgICAgICAgICAgICAgICBzVm9sdW1lUHJvZmlsZXNbaV1bal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgb2YgRFJDIG9uIHNwZWFrZXIgcGF0aDogaWYgYXZhaWxhYmxlLCBvdmVycmlkZSBzb21lIG9mIHRoZSBzcGVha2VyIGN1cnZlcworICAgIGlmIChtU3BlYWtlckRyY0VuYWJsZWQpIHsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX1NZU1RFTV0ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyYzsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX1JJTkddLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmM7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9BTEFSTV0ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYzsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX05PVElGSUNBVElPTl0ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYzsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX01VU0lDXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmM7CisgICAgfQorfQorCitmbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGZsb2F0IHZvbHVtZSA9IDEuMDsKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSBtU3RyZWFtc1tzdHJlYW1dOworCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICB9CisKKyAgICB2b2x1bWUgPSB2b2xJbmRleFRvQW1wbChkZXZpY2UsIHN0cmVhbURlc2MsIGluZGV4KTsKKworICAgIC8vIGlmIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQsIGFwcGx5IHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8gcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucworICAgIC8vIHRvIGF2b2lkIHNvdW5kIGxldmVsIGJ1cnN0cyBpbiB1c2VyJ3MgZWFyczoKKyAgICAvLyAtIGFsd2F5cyBhdHRlbnVhdGUgcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucyB2b2x1bWUgYnkgNmRCCisgICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKKyAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSkgJiYKKyAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQorICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCisgICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQorICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCisgICAgICAgIHN0cmVhbURlc2MubUNhbkJlTXV0ZWQpIHsKKyAgICAgICAgdm9sdW1lICo9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1I7CisgICAgICAgIC8vIHdoZW4gdGhlIHBob25lIGlzIHJpbmdpbmcgd2UgbXVzdCBjb25zaWRlciB0aGF0IG11c2ljIGNvdWxkIGhhdmUgYmVlbiBwYXVzZWQganVzdCBiZWZvcmUKKyAgICAgICAgLy8gYnkgdGhlIG11c2ljIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgbXVzaWMgd2FzIGFjdGl2ZSBpZiB0aGUgbGFzdCBtdXNpYyB0cmFjayB3YXMKKyAgICAgICAgLy8ganVzdCBzdG9wcGVkCisgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSB8fAorICAgICAgICAgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX01VU0lDXS5nZXRWb2x1bWVJbmRleChtdXNpY0RldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKTsKKyAgICAgICAgICAgIGZsb2F0IG1pblZvbCA9IChtdXNpY1ZvbCA+IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNWb2wgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOOworICAgICAgICAgICAgaWYgKHZvbHVtZSA+IG1pblZvbCkgeworICAgICAgICAgICAgICAgIHZvbHVtZSA9IG1pblZvbDsKKyAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2wsIG11c2ljVm9sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2b2x1bWU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworCisgICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgc3RyZWFtIHZvbHVtZSBpZiB0aGUgc3RyZWFtIGlzIG11dGVkCisgICAgaWYgKG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1NdXRlQ291bnRbc3RyZWFtXSAhPSAwKSB7CisgICAgICAgIEFMT0dWVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBzdHJlYW0gJWQgbXV0ZWQgY291bnQgJWQiLAorICAgICAgICAgICAgICBzdHJlYW0sIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1NdXRlQ291bnRbc3RyZWFtXSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBkbyBub3QgY2hhbmdlIGluIGNhbGwgdm9sdW1lIGlmIGJsdWV0b290aCBpcyBjb25uZWN0ZWQgYW5kIHZpY2UgdmVyc2EKKyAgICBpZiAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJgorICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKKyAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyAmJgorICAgICAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSB7CisgICAgICAgIEFMT0dWKCJjaGVja0FuZFNldFZvbHVtZSgpIGNhbm5vdCBzZXQgc3RyZWFtICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwKKyAgICAgICAgICAgICBzdHJlYW0sIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGZsb2F0IHZvbHVtZSA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgb3V0cHV0LCBkZXZpY2UpOworICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgorICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCisgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKKyAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fAorICAgICAgICAgICAgZm9yY2UpIHsKKyAgICAgICAgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOworICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgZm9yIG91dHB1dCAlZCBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBvdXRwdXQsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMKKyAgICAgICAgLy8gZW5hYmxlZAorICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CisgICAgICAgIH0KKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8CisgICAgICAgIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKKyAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAorICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dCA9PSBtUHJpbWFyeU91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFwcGx5U3RyZWFtVm9sdW1lcyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIEFMT0dWVigiYXBwbHlTdHJlYW1Wb2x1bWVzKCkgZm9yIG91dHB1dCAlZCBhbmQgZGV2aWNlICV4Iiwgb3V0cHV0LCBkZXZpY2UpOworCisgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tzdHJlYW1dLmdldFZvbHVtZUluZGV4KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIEFMT0dWVigic2V0U3RyYXRlZ3lNdXRlKCkgc3RyYXRlZ3kgJWQsIG11dGUgJWQsIG91dHB1dCAlZCIsIHN0cmF0ZWd5LCBvbiwgb3V0cHV0KTsKKyAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG9uLCBvdXRwdXQsIGRlbGF5TXMsIGRldmljZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkLCBtTXV0ZUNvdW50ICVkIGRldmljZSAlMDR4IiwKKyAgICAgICAgICBzdHJlYW0sIG9uLCBvdXRwdXQsIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSwgZGV2aWNlKTsKKworICAgIGlmIChvbikgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjLm1DYW5CZU11dGVkICYmCisgICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgeworICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgMCwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKKyAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKK3sKKyAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAorICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCisgICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90CisgICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQorICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKKyAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgeworICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7CisgICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgeworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0luQ2FsbCgpCit7CisgICAgcmV0dXJuIGlzU3RhdGVJbkNhbGwobVBob25lU3RhdGUpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpIHsKKyAgICByZXR1cm4gKChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8CisgICAgICAgICAgICAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKSk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKQoreworICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhFZmZlY3RzTWVtb3J5KCkKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOworfQorCisKKy8vIC0tLSBBdWRpb091dHB1dERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSkKKyAgICA6IG1JZCgwKSwgbUlvSGFuZGxlKDApLCBtTGF0ZW5jeSgwKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLCBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVBhdGNoSGFuZGxlKDApLAorICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbVByb2ZpbGUocHJvZmlsZSksIG1EaXJlY3RPcGVuQ291bnQoMCkKK3sKKyAgICAvLyBjbGVhciB1c2FnZSBjb3VudCBmb3IgYWxsIHN0cmVhbSB0eXBlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIG1SZWZDb3VudFtpXSA9IDA7CisgICAgICAgIG1DdXJWb2x1bWVbaV0gPSAtMS4wOworICAgICAgICBtTXV0ZUNvdW50W2ldID0gMDsKKyAgICAgICAgbVN0b3BUaW1lW2ldID0gMDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgeworICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+bUZsYWdzOworICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOworICAgICAgICBtRm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPm1EZXZpY2UgfCBtT3V0cHV0Mi0+bURldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2U7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bGF0ZW5jeSgpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAobU91dHB1dDEtPm1MYXRlbmN5ID4gbU91dHB1dDItPm1MYXRlbmN5KSA/IG1PdXRwdXQxLT5tTGF0ZW5jeSA6IG1PdXRwdXQyLT5tTGF0ZW5jeTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUxhdGVuY3k7CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYykKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXQxLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYykgfHwgbU91dHB1dDItPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKXsKKyAgICAgICAgcmV0dXJuIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5tT3V0cHV0MSkgfHwgc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPm1PdXRwdXQyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKG1Qcm9maWxlLT5tTW9kdWxlID09IG91dHB1dERlc2MtPm1Qcm9maWxlLT5tTW9kdWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3sKKyAgICAvLyBmb3J3YXJkIHVzYWdlIGNvdW50IGNoYW5nZSB0byBhdHRhY2hlZCBvdXRwdXRzCisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG1PdXRwdXQxLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICAgICAgbU91dHB1dDItPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOworICAgIH0KKyAgICBpZiAoKGRlbHRhICsgKGludCltUmVmQ291bnRbc3RyZWFtXSkgPCAwKSB7CisgICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLAorICAgICAgICAgICAgICBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7CisgICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUmVmQ291bnRbc3RyZWFtXSArPSBkZWx0YTsKKyAgICBBTE9HVigiY2hhbmdlUmVmQ291bnQoKSBzdHJlYW0gJWQsIGNvdW50ICVkIiwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+c3VwcG9ydGVkRGV2aWNlcygpIHwgbU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpIDsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIHJldHVybiBpc1N0cmF0ZWd5QWN0aXZlKE5VTV9TVFJBVEVHSUVTLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyYXRlZ3lBY3RpdmUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKK3sKKyAgICBpZiAoKHN5c1RpbWUgPT0gMCkgJiYgKGluUGFzdE1zICE9IDApKSB7CisgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgaWYgKCgoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHx8CisgICAgICAgICAgICAgICAgKE5VTV9TVFJBVEVHSUVTID09IHN0cmF0ZWd5KSkgJiYKKyAgICAgICAgICAgICAgICBpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChpblBhc3RNcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN5c1RpbWUgPT0gMCkgeworICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIH0KKyAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZVtzdHJlYW1dKSA8IGluUGFzdE1zKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0Q29uZmlnKCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKKworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmlkID0gbUlkOworICAgIGRzdENvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQoIWlzRHVwbGljYXRlZCgpLCAidG9BdWRpb1BvcnQoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBtSW9IYW5kbGUpOworICAgIG1Qcm9maWxlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmxhdGVuY3lfY2xhc3MgPQorICAgICAgICAgICAgbUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCA/IEFVRElPX0xBVEVOQ1lfTE9XIDogQVVESU9fTEFURU5DWV9OT1JNQUw7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIG1JZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgZGV2aWNlKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyZWFtIHZvbHVtZSByZWZDb3VudCBtdXRlQ291bnRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJkICAgICAlLjAzZiAgICAgJTAyZCAgICAgICAlMDJkXG4iLAorICAgICAgICAgICAgICAgICBpLCBtQ3VyVm9sdW1lW2ldLCBtUmVmQ291bnRbaV0sIG1NdXRlQ291bnRbaV0pOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0gQXVkaW9JbnB1dERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSkKKyAgICA6IG1JZCgwKSwgbUlvSGFuZGxlKDApLAorICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1QYXRjaEhhbmRsZSgwKSwgbVJlZkNvdW50KDApLAorICAgICAgbUlucHV0U291cmNlKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwgbVByb2ZpbGUocHJvZmlsZSksIG1Jc1NvdW5kVHJpZ2dlcihmYWxzZSkKK3sKKyAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7CisgICAgICAgIG1Gb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7CisgICAgICAgIG1DaGFubmVsTWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOworICAgICAgICBpZiAocHJvZmlsZS0+bUdhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLAorICAgICAgICAgICAgICAgICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBpbnB1dCB3aXRoIG51bGwgcHJvZmlsZSAlZCIsIG1Jb0hhbmRsZSk7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOworICAgIH0KKworICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworCisgICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKKyAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1JbnB1dFNvdXJjZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLCAidG9BdWRpb1BvcnQoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOworCisgICAgbVByb2ZpbGUtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIHBvcnQtPmlkID0gbUlkOworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKKyAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOworICAgIHBvcnQtPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIHBvcnQtPmV4dC5taXgubGF0ZW5jeV9jbGFzcyA9IEFVRElPX0xBVEVOQ1lfTk9STUFMOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIG1JZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBtRGV2aWNlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFJlZiBDb3VudCAlZFxuIiwgbVJlZkNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE9wZW4gUmVmIENvdW50ICVkXG4iLCBtT3BlblJlZkNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tIFN0cmVhbURlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpTdHJlYW1EZXNjcmlwdG9yKCkKKyAgICA6ICAgbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCit7CisgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIDApOworfQorCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGRldmljZSA9IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVAorICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQ7CisgICAgfQorICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OlN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCisgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKKyAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAorICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCisvLyAtLS0gRWZmZWN0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkVmZmVjdERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEkvTzogJWRcbiIsIG1Jbyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICVzXG4iLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBId01vZHVsZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpId01vZHVsZShjb25zdCBjaGFyICpuYW1lKQorICAgIDogbU5hbWUoc3RybmR1cChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTUFYX0xFTikpLAorICAgICAgbUhhbFZlcnNpb24oQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTiksIG1IYW5kbGUoMCkKK3sKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6fkh3TW9kdWxlKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7CisgICAgfQorICAgIGZyZWUoKHZvaWQgKiltTmFtZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmxvYWRJbnB1dChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU0lOSywgdGhpcyk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkSW5DaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gcGFyc2VJbnB1dEZsYWdOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBmb3JtYXRzIik7CisgICAgaWYgKCFwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSAhPSAwKSkgeworCisgICAgICAgIEFMT0dWKCJsb2FkSW5wdXQoKSBhZGRpbmcgaW5wdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCIsCisgICAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworCisgICAgICAgIG1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpsb2FkT3V0cHV0KGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgocm9vdC0+bmFtZSksIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIHRoaXMpOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZE91dENoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMubG9hZERldmljZXNGcm9tTmFtZSgoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tRmxhZ3MgPSBwYXJzZU91dHB1dEZsYWdOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOworICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKKworICAgICAgICBBTE9HVigibG9hZE91dHB1dCgpIGFkZGluZyBvdXRwdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAorICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpLCBwcm9maWxlLT5tRmxhZ3MpOworCisgICAgICAgIG1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6bG9hZERldmljZShjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRV9UWVBFKSA9PSAwKSB7CisgICAgICAgICAgICB0eXBlID0gcGFyc2VEZXZpY2VOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAorICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkpKSB7CisgICAgICAgIEFMT0dXKCJsb2FkRGV2aWNlKCkgYmFkIHR5cGUgJTA4eCIsIHR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOChyb290LT5uYW1lKSwgdHlwZSk7CisgICAgZGV2aWNlRGVzYy0+bU1vZHVsZSA9IHRoaXM7CisKKyAgICBub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VfQUREUkVTUykgPT0gMCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYy0+bUFkZHJlc3MgPSBTdHJpbmc4KChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkSW5DaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZE91dENoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRHYWlucyhub2RlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisKKyAgICBBTE9HVigibG9hZERldmljZSgpIGFkZGluZyBkZXZpY2UgbmFtZSAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsCisgICAgICAgICAgZGV2aWNlRGVzYy0+bU5hbWUuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKKworICAgIG1EZWNsYXJlZERldmljZXMuYWRkKGRldmljZURlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIG5hbWU6ICVzXG4iLCBtTmFtZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIHZlcnNpb246ICV1LiV1XG4iLCBtSGFsVmVyc2lvbiA+PiA4LCBtSGFsVmVyc2lvbiAmIDB4RkYpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgeworICAgICAgICB3cml0ZShmZCwgIiAgLSBvdXRwdXRzOlxuIiwgc3RybGVuKCIgIC0gb3V0cHV0czpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1EZWNsYXJlZERldmljZXMuc2l6ZSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCAiICAtIGRldmljZXM6XG4iLCBzdHJsZW4oIiAgLSBkZXZpY2VzOlxuIikpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNsYXJlZERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXNbaV0tPmR1bXAoZmQsIDQsIGkpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0gQXVkaW9Qb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uCisKKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OkF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKSA6CisgICAgbU5hbWUobmFtZSksIG1UeXBlKHR5cGUpLCBtUm9sZShyb2xlKSwgbU1vZHVsZShtb2R1bGUpLCBtRmxhZ3MoMCkKK3sKKyAgICBtVXNlSW5DaGFubmVsTWFzayA9ICgodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIHBvcnQtPnJvbGUgPSBtUm9sZTsKKyAgICBwb3J0LT50eXBlID0gbVR5cGU7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfU0FNUExJTkdfUkFURVM7IGkrKykgeworICAgICAgICBpZiAobVNhbXBsaW5nUmF0ZXNbaV0gIT0gMCkgeworICAgICAgICAgICAgcG9ydC0+c2FtcGxlX3JhdGVzW2ldID0gbVNhbXBsaW5nUmF0ZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcG9ydC0+bnVtX3NhbXBsZV9yYXRlcyA9IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9DSEFOTkVMX01BU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gIT0gMCkgeworICAgICAgICAgICAgcG9ydC0+Y2hhbm5lbF9tYXNrc1tpXSA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcG9ydC0+bnVtX2NoYW5uZWxfbWFza3MgPSBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0ZPUk1BVFM7IGkrKykgeworICAgICAgICBpZiAobUZvcm1hdHNbaV0gIT0gMCkgeworICAgICAgICAgICAgcG9ydC0+Zm9ybWF0c1tpXSA9IG1Gb3JtYXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPm51bV9mb3JtYXRzID0gaTsKKworICAgIEFMT0dWKCJBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KCkgbnVtIGdhaW5zICV6dSIsIG1HYWlucy5zaXplKCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1HYWlucy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0dBSU5TOyBpKyspIHsKKyAgICAgICAgcG9ydC0+Z2FpbnNbaV0gPSBtR2FpbnNbaV0tPm1HYWluOworICAgIH0KKyAgICBwb3J0LT5udW1fZ2FpbnMgPSBpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KSB7CisgICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgaysrKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHJhdGUgPSBwb3J0LT5tU2FtcGxpbmdSYXRlcy5pdGVtQXQoayk7CisgICAgICAgIGlmIChyYXRlICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgcmF0ZXMKKyAgICAgICAgICAgIGJvb2wgaGFzUmF0ZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJhdGUgPT0gbVNhbXBsaW5nUmF0ZXMuaXRlbUF0KGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1JhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc1JhdGUpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgc2FtcGxpbmcgcmF0ZSB0d2ljZQorICAgICAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gcG9ydC0+bUNoYW5uZWxNYXNrcy5pdGVtQXQoayk7CisgICAgICAgIGlmIChtYXNrICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgbWFza3MKKyAgICAgICAgICAgIGJvb2wgaGFzTWFzayA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWFzayA9PSBtQ2hhbm5lbE1hc2tzLml0ZW1BdChsKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNNYXNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNNYXNrKSB7IC8vIG5ldmVyIGltcG9ydCBhIGNoYW5uZWwgbWFzayB0d2ljZQorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1Gb3JtYXRzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwb3J0LT5tRm9ybWF0cy5pdGVtQXQoayk7CisgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBmb3JtYXRzCisgICAgICAgICAgICBib29sIGhhc0Zvcm1hdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUZvcm1hdHMuc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBtRm9ybWF0cy5pdGVtQXQobCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNGb3JtYXQpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgY2hhbm5lbCBtYXNrIHR3aWNlCisgICAgICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNsZWFyQ2FwYWJpbGl0aWVzKCkgeworICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICBtRm9ybWF0cy5jbGVhcigpOworICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRTYW1wbGluZ1JhdGVzKGNoYXIgKm5hbWUpCit7CisgICAgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1TYW1wbGluZ1JhdGVzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHNhbXBsaW5nCisgICAgLy8gcmF0ZXMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCByYXRlID0gYXRvaShzdHIpOworICAgICAgICBpZiAocmF0ZSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZFNhbXBsaW5nUmF0ZXMoKSBhZGRpbmcgcmF0ZSAlZCIsIHJhdGUpOworICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHJhdGUpOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEZvcm1hdHMoY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUZvcm1hdHMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cworICAgIC8vIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClzdHJpbmdUb0VudW0oc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNGb3JtYXROYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIG1Gb3JtYXRzLmFkZChmb3JtYXQpOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpICVzIiwgbmFtZSk7CisKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIGlmIChjaGFubmVsTWFzayAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEluQ2hhbm5lbHMoKSBhZGRpbmcgY2hhbm5lbE1hc2sgJTA0eCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRPdXRDaGFubmVscygpICVzIiwgbmFtZSk7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1DaGFubmVsTWFza3MgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgY2hhbm5lbAorICAgIC8vIG1hc2tzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgeworICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2F1ZGlvX2dhaW5fbW9kZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2Fpbk1vZGUoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkR2Fpbk1vZGUoKSAlcyIsIG5hbWUpOworICAgIGF1ZGlvX2dhaW5fbW9kZV90IG1vZGUgPSAwOworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBtb2RlIHw9IChhdWRpb19nYWluX21vZGVfdClzdHJpbmdUb0VudW0oc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIHJldHVybiBtb2RlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2Fpbihjbm9kZSAqcm9vdCwgaW50IGluZGV4KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisKKyAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4LCBtVXNlSW5DaGFubmVsTWFzayk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTU9ERSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSA9IGxvYWRHYWluTW9kZSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9DSEFOTkVMUykgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1heF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fREVGQVVMVF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uZGVmYXVsdF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fU1RFUF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uc3RlcF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1JBTVBfTVMpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1pbl9yYW1wX21zID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfUkFNUF9NUykgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIEFMT0dWKCJsb2FkR2FpbigpIGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsCisgICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSwgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrLCBnYWluLT5tR2Fpbi5taW5fdmFsdWUsIGdhaW4tPm1HYWluLm1heF92YWx1ZSk7CisKKyAgICBpZiAoZ2Fpbi0+bUdhaW4ubW9kZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUdhaW5zLmFkZChnYWluKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEdhaW5zKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGxvYWRHYWluKG5vZGUsIGluZGV4KyspOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAobVNhbXBsaW5nUmF0ZXNbaV0gPT0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdAoreworICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgdGhhdCBpcyBhYm92ZSAocHJlZmVycmVkKQorICAgIC8vIG9yIGJlbG93IChhY2NlcHRhYmxlKSB0aGUgZGVzaXJlZCBzYW1wbGluZyByYXRlLCB3aXRoaW4gYSBwZXJtaXR0ZWQgcmF0aW8uCisgICAgLy8gVGhlIHNhbXBsaW5nIHJhdGVzIGRvIG5vdCBuZWVkIHRvIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgc3NpemVfdCBtYXhCZWxvdyA9IC0xOworICAgIHNzaXplX3QgbWluQWJvdmUgPSAtMTsKKyAgICB1aW50MzJfdCBjYW5kaWRhdGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBjYW5kaWRhdGUgPCBkZXNpcmVkCisgICAgICAgIGlmIChjYW5kaWRhdGUgPCBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmIChtYXhCZWxvdyA8IDAgfHwgY2FuZGlkYXRlID4gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddKSB7CisgICAgICAgICAgICAgICAgbWF4QmVsb3cgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAvLyBjYW5kaWRhdGUgPiBkZXNpcmVkCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobWluQWJvdmUgPCAwIHx8IGNhbmRpZGF0ZSA8IG1TYW1wbGluZ1JhdGVzW21pbkFib3ZlXSkgeworICAgICAgICAgICAgICAgIG1pbkFib3ZlID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUaGlzIHVzZXMgaGFyZC1jb2RlZCBrbm93bGVkZ2UgYWJvdXQgQXVkaW9GbGluZ2VyIHJlc2FtcGxpbmcgcmF0aW9zLgorICAgIC8vIFRPRE8gTW92ZSB0aGVzZSBhc3N1bXB0aW9ucyBvdXQuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhEb3duU2FtcGxlUmF0aW8gPSA2OyAgLy8gYmV5b25kIHRoaXMgYWxpYXNpbmcgb2NjdXJzCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhVcFNhbXBsZVJhdGlvID0gMjU2OyAgLy8gYmV5b25kIHRoaXMgc2FtcGxlIHJhdGUgaW5hY2N1cmFjaWVzIG9jY3VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIGFwcHJveGltYXRpb24gYnkgYW4gaW50MzJfdCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZSBpbmNyZW1lbnRzCisgICAgLy8gUHJlZmVyIHRvIGRvd24tc2FtcGxlIGZyb20gYSBoaWdoZXIgc2FtcGxpbmcgcmF0ZSwgYXMgd2UgZ2V0IHRoZSBkZXNpcmVkIGZyZXF1ZW5jeSBzcGVjdHJ1bS4KKyAgICBpZiAobWluQWJvdmUgPj0gMCkgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1ttaW5BYm92ZV07CisgICAgICAgIGlmIChjYW5kaWRhdGUgLyBrTWF4RG93blNhbXBsZVJhdGlvIDw9IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIEJ1dCBpZiB3ZSBoYXZlIHRvIHVwLXNhbXBsZSBmcm9tIGEgbG93ZXIgc2FtcGxpbmcgcmF0ZSwgdGhhdCdzIE9LLgorICAgIGlmIChtYXhCZWxvdyA+PSAwKSB7CisgICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW21heEJlbG93XTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSAqIGtNYXhVcFNhbXBsZVJhdGlvID49IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIGxlYXZlIHVwZGF0ZWRTYW1wbGluZ1JhdGUgdW5tb2RpZmllZAorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQ2hhbm5lbE1hc2tzW2ldID09IGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKQorICAgICAgICBjb25zdAoreworICAgIGNvbnN0IGJvb2wgaXNSZWNvcmRUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgLy8gRklYTUUgRG9lcyBub3QgaGFuZGxlIG11bHRpLWNoYW5uZWwgYXV0b21hdGljIGNvbnZlcnNpb25zIHlldAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBzdXBwb3J0ZWQgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICBpZiAoc3VwcG9ydGVkID09IGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUmVjb3JkVGhyZWFkKSB7CisgICAgICAgICAgICAvLyBUaGlzIHVzZXMgaGFyZC1jb2RlZCBrbm93bGVkZ2UgdGhhdCBBdWRpb0ZsaW5nZXIgY2FuIHNpbGVudGx5IGRvd24tbWl4IGFuZCB1cC1taXguCisgICAgICAgICAgICAvLyBGSVhNRSBBYnN0cmFjdCB0aGlzIG91dCB0byBhIHRhYmxlLgorICAgICAgICAgICAgaWYgKCgoc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyB8fCBzdXBwb3J0ZWQgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pCisgICAgICAgICAgICAgICAgICAgICYmIGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTykgfHwKKyAgICAgICAgICAgICAgICAoc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTyAmJiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLCisgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAobUZvcm1hdHNbaV0gPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6cGlja1NhbXBsaW5nUmF0ZSgpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMSAmJiBtU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIHNhbXBsaW5nIHJhdGU6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKKyAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAorICAgIC8vIHNpbmsKKyAgICBpZiAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkpIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gVUlOVF9NQVg7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldIDwgc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPiAwKSkgeworICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2FtcGxpbmdSYXRlID09IFVJTlRfTUFYKSA/IDAgOiBzYW1wbGluZ1JhdGU7CisgICAgfQorCisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMDsKKyAgICB1aW50MzJfdCBtYXhSYXRlID0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEU7CisKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuIERvIG5vdAorICAgIC8vIGxpbWl0IHNhbXBsaW5nIHJhdGUgb3RoZXJ3aXNlCisgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgbWF4UmF0ZSA9IFVJTlRfTUFYOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldID4gc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPD0gbWF4UmF0ZSkpIHsKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzYW1wbGluZ1JhdGU7Cit9CisKK2F1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpwaWNrQ2hhbm5lbE1hc2soKSBjb25zdAoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKKyAgICBpZiAobUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMSAmJiBtQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB9CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisKKyAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBjaGFubmVsIGNvdW50OiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCisgICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKKyAgICAvLyBzaW5rCisgICAgaWYgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpKSB7CisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IFVJTlRfTUFYOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKKyAgICAgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjbmxDb3VudCA8IGNoYW5uZWxDb3VudCkgJiYgKGNubENvdW50ID4gMCkpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrOworICAgIH0KKworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IDA7CisgICAgdWludDMyX3QgbWF4Q291bnQgPSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVDsKKworICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIG1heCBtaXhlciBjaGFubmVsIGNvdW50LiBEbyBub3QKKyAgICAvLyBsaW1pdCBjaGFubmVsIGNvdW50IG90aGVyd2lzZQorICAgIGlmIChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIG1heENvdW50ID0gVUlOVF9NQVg7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgdWludDMyX3QgY25sQ291bnQ7CisgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICB9CisgICAgICAgIGlmICgoY25sQ291bnQgPiBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA8PSBtYXhDb3VudCkpIHsKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNubENvdW50OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjaGFubmVsTWFzazsKK30KKworLyogZm9ybWF0IGluIG9yZGVyIG9mIGluY3JlYXNpbmcgcHJlZmVyZW5jZSAqLworY29uc3QgYXVkaW9fZm9ybWF0X3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbXSA9IHsKKyAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorfTsKKworaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKQoreworICAgIC8vIE5PVEU6IEFVRElPX0ZPUk1BVF9JTlZBTElEIGlzIGFsc28gY29uc2lkZXJlZCBub3QgUENNIGFuZCB3aWxsIGJlIGNvbXBhcmVkIGVxdWFsIHRvIGFueQorICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFuZCBiZXR0ZXIgdGhhbiBhbnkgUENNIGZvcm1hdC4gVGhpcyBpcyBieSBkZXNpZ24gb2YgcGlja0Zvcm1hdCgpCisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdDEpKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IGluZGV4MSA9IC0xLCBpbmRleDIgPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgIChpIDwgQVJSQVlfU0laRShzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSkgJiYgKChpbmRleDEgPT0gLTEpIHx8IChpbmRleDIgPT0gLTEpKTsKKyAgICAgICAgICAgIGkgKyspIHsKKyAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MSkgeworICAgICAgICAgICAgaW5kZXgxID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtpXSA9PSBmb3JtYXQyKSB7CisgICAgICAgICAgICBpbmRleDIgPSBpOworICAgICAgICB9CisgICAgfQorICAgIC8vIGZvcm1hdDEgbm90IGZvdW5kID0+IGluZGV4MSA8IDAgPT4gZm9ybWF0MiA+IGZvcm1hdDEKKyAgICAvLyBmb3JtYXQyIG5vdCBmb3VuZCA9PiBpbmRleDIgPCAwID0+IGZvcm1hdDIgPCBmb3JtYXQxCisgICAgcmV0dXJuIGluZGV4MSAtIGluZGV4MjsKK30KKworYXVkaW9fZm9ybWF0X3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnBpY2tGb3JtYXQoKSBjb25zdAoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKKyAgICBpZiAobUZvcm1hdHMuc2l6ZSgpID09IDEgJiYgbUZvcm1hdHNbMF0gPT0gMCkgeworICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgfQorCisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9CisgICAgICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVsKKyAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSAtIDFdOworICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIGJlc3QgbWl4ZXIgb3V0cHV0IGZvcm1hdC4gRG8gbm90CisgICAgLy8gbGltaXQgZm9ybWF0IG90aGVyd2lzZQorICAgIGlmICgobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgfHwKKyAgICAgICAgICAgICgobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgICAoKChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpICE9IDApKSkpIHsKKyAgICAgICAgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmICgoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGZvcm1hdCkgPiAwKSAmJgorICAgICAgICAgICAgICAgIChjb21wYXJlRm9ybWF0cyhtRm9ybWF0c1tpXSwgYmVzdEZvcm1hdCkgPD0gMCkpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IG1Gb3JtYXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0dhaW4oY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpnYWluQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgaWYgKGluZGV4IDwgMCB8fCAoc2l6ZV90KWluZGV4ID49IG1HYWlucy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIG1HYWluc1tpbmRleF0tPmNoZWNrQ29uZmlnKGdhaW5Db25maWcpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIGlmIChtTmFtZS5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICBpZiAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGluZyByYXRlczogIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBtU2FtcGxpbmdSYXRlc1tpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgaWYgKG1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2tzOiAiLCBzcGFjZXMsICIiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb1BvcnQ6OmR1bXAgbUNoYW5uZWxNYXNrcyAlenUgJTA4eCIsIGksIG1DaGFubmVsTWFza3NbaV0pOworCisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIG1DaGFubmVsTWFza3NbaV0gPT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgaWYgKG1Gb3JtYXRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0czogIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0U3RyID0gZW51bVRvU3RyaW5nKHNGb3JtYXROYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRm9ybWF0TmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0c1tpXSk7CisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIHN0cmNtcChmb3JtYXRTdHIsICIiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyIsIGZvcm1hdFN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1Gb3JtYXRzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBpZiAobUdhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikgKyAxKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1HYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLS0tIEF1ZGlvR2FpbiBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6QXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKQoreworICAgIG1JbmRleCA9IGluZGV4OworICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gdXNlSW5DaGFubmVsTWFzazsKKyAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW4pKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6Z2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKK3sKKyAgICBjb25maWctPmluZGV4ID0gbUluZGV4OworICAgIGNvbmZpZy0+bW9kZSA9IG1HYWluLm1vZGU7CisgICAgY29uZmlnLT5jaGFubmVsX21hc2sgPSBtR2Fpbi5jaGFubmVsX21hc2s7CisgICAgaWYgKChtR2Fpbi5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKKyAgICAgICAgY29uZmlnLT52YWx1ZXNbMF0gPSBtR2Fpbi5kZWZhdWx0X3ZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgeworICAgICAgICAgICAgY29uZmlnLT52YWx1ZXNbaV0gPSBtR2Fpbi5kZWZhdWx0X3ZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9SQU1QKSA9PSBBVURJT19HQUlOX01PREVfUkFNUCkgeworICAgICAgICBjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPSBtR2Fpbi5taW5fcmFtcF9tczsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9HYWluOjpjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKK3sKKyAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIH5tR2Fpbi5tb2RlKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKKyAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1swXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzWzBdID4gbUdhaW4ubWF4X3ZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+bUdhaW4uY2hhbm5lbF9tYXNrKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbaV0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1tpXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX1JBTVApID09IEFVRElPX0dBSU5fTU9ERV9SQU1QKSB7CisgICAgICAgIGlmICgoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zIDwgbUdhaW4ubWluX3JhbXBfbXMpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPiBtR2Fpbi5tYXhfcmFtcF9tcykpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworLy8gLS0tIEF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6QXVkaW9Qb3J0Q29uZmlnKCkKK3sKKyAgICBtU2FtcGxpbmdSYXRlID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIG1HYWluLmluZGV4ID0gLTE7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQoreworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIGxvY2FsQmFja3VwQ29uZmlnLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOworCisgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKKyAgICBpZiAoYXVkaW9wb3J0ID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tFeGFjdFNhbXBsaW5nUmF0ZShjb25maWctPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RDaGFubmVsTWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtQ2hhbm5lbE1hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0Zvcm1hdChjb25maWctPmZvcm1hdCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47CisgICAgfQorCitleGl0OgorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgYXBwbHlBdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKKyAgICB9CisgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgICpiYWNrdXBDb25maWcgPSBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBzcmNDb25maWctPnNhbXBsZV9yYXRlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IDA7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gc3JjQ29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBtRm9ybWF0OworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gc3JjQ29uZmlnLT5mb3JtYXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgZHN0Q29uZmlnLT5nYWluID0gbUdhaW47CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IHNyY0NvbmZpZy0+Z2FpbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+Z2Fpbi5pbmRleCA9IC0xOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5nYWluLmluZGV4ICE9IC0xKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIH0KK30KKworLy8gLS0tIElPUHJvZmlsZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6SU9Qcm9maWxlKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQorICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUsIG1vZHVsZSkKK3sKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6On5JT1Byb2ZpbGUoKQoreworfQorCisvLyBjaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorLy8gU2FtcGxpbmcgcmF0ZSwgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2sgbXVzdCBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8KKy8vIGdldCBhIHZhbGlkIGEgbWF0Y2gKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3QKK3sKKyAgICBjb25zdCBib29sIGlzUGxheWJhY2tUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgQUxPR19BU1NFUlQoaXNQbGF5YmFja1RocmVhZCAhPSBpc1JlY29yZFRocmVhZCk7CisKKyAgICBpZiAoKG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpICE9IGRldmljZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHNhbXBsaW5nUmF0ZSA9PSAwKSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVpbnQzMl90IG15VXBkYXRlZFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmIGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUsICZteVVwZGF0ZWRTYW1wbGluZ1JhdGUpICE9CisgICAgICAgICAgICBOT19FUlJPUikgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgY2hlY2tGb3JtYXQoZm9ybWF0KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykgfHwKKyAgICAgICAgICAgIGNoZWNrRXhhY3RDaGFubmVsTWFzayhjaGFubmVsTWFzaykgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykgfHwKKyAgICAgICAgICAgIGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIChtRmxhZ3MgJiBmbGFncykgIT0gZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBUaGUgb25seSBpbnB1dCBmbGFnIHRoYXQgaXMgYWxsb3dlZCB0byBiZSBkaWZmZXJlbnQgaXMgdGhlIGZhc3QgZmxhZy4KKyAgICAvLyBBbiBleGlzdGluZyBmYXN0IHN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggYSBub3JtYWwgdHJhY2sgcmVxdWVzdC4KKyAgICAvLyBBbiBleGlzdGluZyBub3JtYWwgc3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBhIGZhc3QgdHJhY2sgcmVxdWVzdCwKKyAgICAvLyBidXQgdGhlIGZhc3QgcmVxdWVzdCB3aWxsIGJlIGRlbmllZCBieSBBdWRpb0ZsaW5nZXIgYW5kIGNvbnZlcnRlZCB0byBub3JtYWwgdHJhY2suCisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmICgobUZsYWdzIF4gZmxhZ3MpICYKKyAgICAgICAgICAgIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gbXlVcGRhdGVkU2FtcGxpbmdSYXRlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIDQpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZGV2aWNlczpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzW2ldLT5kdW1wKGZkLCA2LCBpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OmxvZygpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBBTE9HVigiICAgIC0gc2FtcGxpbmcgcmF0ZXM6ICIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiAgJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7CisgICAgfQorCisgICAgQUxPR1YoIiAgICAtIGNoYW5uZWwgbWFza3M6ICIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiICAweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICB9CisKKyAgICBBTE9HVigiICAgIC0gZm9ybWF0czogIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiICAweCUwOHgiLCBtRm9ybWF0c1tpXSk7CisgICAgfQorCisgICAgQUxPR1YoIiAgICAtIGRldmljZXM6IDB4JTA0eFxuIiwgbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7CisgICAgQUxPR1YoIiAgICAtIGZsYWdzOiAweCUwNHhcbiIsIG1GbGFncyk7Cit9CisKKworLy8gLS0tIERldmljZURlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24KKworCitBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fZGV2aWNlc190IHR5cGUpIDoKKyAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgbURldmljZVR5cGUodHlwZSksIG1BZGRyZXNzKCIiKSwgbUlkKDApCit7CisgICAgaWYgKG1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgIG1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOworICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OmVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0Cit7CisgICAgLy8gRGV2aWNlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5OgorICAgIC8vIC0gYXJlIG9mIHRoZSBzYW1lIHR5cGUgKGEgZGV2aWNlIHR5cGUgY2Fubm90IGJlIEFVRElPX0RFVklDRV9OT05FKQorICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcworICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBjaGFubmVsIG1hc2sgb3Igb25lIGRldmljZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjaGFubmVsIG1hc2sKKyAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYKKyAgICAgICAgICAgKG1BZGRyZXNzID09ICIiIHx8IG90aGVyLT5tQWRkcmVzcyA9PSAiIiB8fCBtQWRkcmVzcyA9PSBvdGhlci0+bUFkZHJlc3MpICYmCisgICAgICAgICAgIChtQ2hhbm5lbE1hc2sgPT0gMCB8fCBvdGhlci0+bUNoYW5uZWxNYXNrID09IDAgfHwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gb3RoZXItPm1DaGFubmVsTWFzayk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpCit7CisgICAgbURldmljZVR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIG1EZXZpY2VUeXBlcyB8PSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlOworICAgIH0KKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKSBtRGV2aWNlVHlwZXMgJTA4eCIsIG1EZXZpY2VUeXBlcyk7Cit9CisKK3NzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0Cit7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtLT5lcXVhbHMoaXRlbUF0KGkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjphZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCit7CisgICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0ID0gU29ydGVkVmVjdG9yOjphZGQoaXRlbSk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjphZGQgZGV2aWNlICUwOHggYWxyZWFkeSBpbiIsIGl0ZW0tPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OnJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkKK3sKKyAgICBzaXplX3QgaTsKKyAgICBzc2l6ZV90IHJldCA9IGluZGV4T2YoaXRlbSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjpyZW1vdmUgZGV2aWNlICUwOHggbm90IGluIiwgaXRlbS0+bURldmljZVR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6cmVtb3ZlQXQocmV0KTsKKyAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICByZWZyZXNoVHlwZXMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIHVpbnQzMl90IHJvbGVfYml0ID0gQVVESU9fREVWSUNFX0JJVF9JTiAmIHR5cGVzOworICAgIHR5cGVzICY9IH5yb2xlX2JpdDsKKworICAgIHdoaWxlICh0eXBlcykgeworICAgICAgICB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGVzKTsKKyAgICAgICAgdWludDMyX3QgdHlwZSA9IDEgPDwgaTsKKyAgICAgICAgdHlwZXMgJj0gfnR5cGU7CisgICAgICAgIGFkZChuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgdHlwZSB8IHJvbGVfYml0KSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21OYW1lKGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGVjbGFyZWREZXZpY2VzKQoreworICAgIGNoYXIgKmRldk5hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZGV2TmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4oZGV2TmFtZSkgIT0gMCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBzdHJpbmdUb0VudW0oc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZOYW1lKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgYWRkKG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCB0eXBlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzLmdldERldmljZUZyb21OYW1lKFN0cmluZzgoZGV2TmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkKGRldmljZURlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgZGV2TmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgICB9Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlZCBhZGRyZXNzICVzIGZvdW5kICVwIiwKKyAgICAgICAgICB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCkpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoJWQpIGl0ZW1BdCglenUpLT5tSWQgJWQiLCBpZCwgaSwgaXRlbUF0KGkpLT5tSWQpOworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgKGkgPCBzaXplKCkpICYmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1EZXZpY2VUeXBlICYgdHlwZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOworICAgICAgICAgICAgdHlwZSAmPSB+aXRlbUF0KGkpLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgpIGZvciB0eXBlICV4IGZvdW5kICVwIiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1BdChpKS0+bURldmljZVR5cGUsIGl0ZW1BdChpKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVBZGRyKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIC8vQUxPR1YoIiAgIGxvb2tpbmcgZm9yIGRldmljZT0leCwgYWRkcj0lcyIsIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgLy9BTE9HVigiICAgICBhdCBpPSVkOiBkZXZpY2U9JXgsIGFkZHI9JXMiLAorICAgICAgICAvLyAgICAgICAgaSwgaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSwgaXRlbUF0KGkpLT5tQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1EZXZpY2VUeXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCIgICAgICBmb3VuZCBtYXRjaGluZyBhZGRyZXNzICVzIiwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbU5hbWUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bU5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOworICAgIH0KKworICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworCisgICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKKyAgICBkc3RDb25maWctPnJvbGUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKG1EZXZpY2VUeXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU0lOSyA6IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOworICAgIHN0cm5jcHkoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICV4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CisgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7CisgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOworICAgIHN0cm5jcHkocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUlkICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHBhdGNoICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1IYW5kbGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGF1ZGlvIGZsaW5nZXIgaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1BZlBhdGNoSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVVpZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc291cmNlczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc291cmNlcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zb3VyY2VzOyBpKyspIHsKKyAgICAgICAgaWYgKG1QYXRjaC5zb3VyY2VzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLCBtUGF0Y2guc2lua3NbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpwYXJzZU91dHB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKQoreworICAgIHVpbnQzMl90IGZsYWcgPSAwOworCisgICAgLy8gaXQgaXMgT0sgdG8gY2FzdCBuYW1lIHRvIG5vbiBjb25zdCBoZXJlIGFzIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGFmdGVyCisgICAgLy8gc3RydG9rKCkgbW9kaWZpZXMgaXQKKyAgICBjaGFyICpmbGFnTmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChmbGFnTmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4oZmxhZ05hbWUpICE9IDApIHsKKyAgICAgICAgICAgIGZsYWcgfD0gc3RyaW5nVG9FbnVtKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCisgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKKyAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIGlmICgoZmxhZyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZyB8PSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIGZsYWc7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6cGFyc2VJbnB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKQoreworICAgIHVpbnQzMl90IGZsYWcgPSAwOworCisgICAgLy8gaXQgaXMgT0sgdG8gY2FzdCBuYW1lIHRvIG5vbiBjb25zdCBoZXJlIGFzIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGFmdGVyCisgICAgLy8gc3RydG9rKCkgbW9kaWZpZXMgaXQKKyAgICBjaGFyICpmbGFnTmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChmbGFnTmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4oZmxhZ05hbWUpICE9IDApIHsKKyAgICAgICAgICAgIGZsYWcgfD0gc3RyaW5nVG9FbnVtKHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5wdXRGbGFnTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ05hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgcmV0dXJuIGZsYWc7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSAwOworCisgICAgY2hhciAqZGV2TmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChkZXZOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihkZXZOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgfD0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7CisgICAgICAgICB9CisgICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgY25vZGUgKm5vZGU7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShyb290LT5uYW1lKTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBkZXZpY2UgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZERldmljZShub2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkT3V0cHV0KG5vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkSW5wdXQobm9kZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgbW9kdWxlKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgQVVESU9fSFdfTU9EVUxFX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGVzKCkgbG9hZGluZyBtb2R1bGUgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgbG9hZEh3TW9kdWxlKG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEdMT0JBTF9DT05GSUdfVEFHKTsKKworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzOworICAgIGlmIChtb2R1bGUgIT0gTlVMTCkgeworICAgICAgICBkZWNsYXJlZERldmljZXMgPSBtb2R1bGUtPm1EZWNsYXJlZERldmljZXM7CisgICAgfQorCisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAoQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF0dGFjaGVkIE91dHB1dCBEZXZpY2VzICUwOHgiLAorICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKERFRkFVTFRfT1VUUFVUX0RFVklDRV9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KXN0cmluZ1RvRW51bShzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIG1TcGVha2VyRHJjRW5hYmxlZCA9IHN0cmluZ1RvQm9vbCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbVNwZWFrZXJEcmNFbmFibGVkID0gJWQiLCBtU3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7CisgICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKG1ham9yLCBtaW5vcik7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1IYWxWZXJzaW9uID0gJTA0eCBtYWpvciAldSBtaW5vciAldSIsCisgICAgICAgICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uLCBtYWpvciwgbWlub3IpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworCisgICAgbG9hZEh3TW9kdWxlcyhyb290KTsKKyAgICAvLyBsZWdhY3kgYXVkaW9fcG9saWN5LmNvbmYgZmlsZXMgaGF2ZSBvbmUgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gc2VjdGlvbgorICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpKTsKKyAgICBjb25maWdfZnJlZShyb290KTsKKyAgICBmcmVlKHJvb3QpOworICAgIGZyZWUoZGF0YSk7CisKKyAgICBBTE9HSSgibG9hZEF1ZGlvUG9saWN5Q29uZmlnKCkgbG9hZGVkICVzXG4iLCBwYXRoKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKQoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7CisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOworCisgICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKCJwcmltYXJ5Iik7CisKKyAgICBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IiksIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIG1vZHVsZSk7CisgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDQ0MTAwKTsKKyAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKKyAgICBwcm9maWxlLT5tRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZOworICAgIG1vZHVsZS0+bU91dHB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKworICAgIHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIG1vZHVsZSk7CisgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDgwMDApOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9JTl9NT05PKTsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKyAgICBtb2R1bGUtPm1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKworICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQoreworICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOworICAgIH0KKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKKyAgICB9CisKKyAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgc3dpdGNoIChhdHRyLT51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOworCisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICB9Cit9Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWE3Yjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKQEAgLTAsMCArMSw4NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEF0dGVudWF0aW9uIGFwcGxpZWQgdG8gU1RSQVRFR1lfU09OSUZJQ0FUSU9OIHN0cmVhbXMgd2hlbiBhIGhlYWRzZXQgaXMgY29ubmVjdGVkOiA2ZEIKKyNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUiAwLjUKKy8vIE1pbiB2b2x1bWUgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gbGltaXRlZCBieSBtdXNpYyB2b2x1bWU6IC0zNmRCCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4gIDAuMDE2CisvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCBtdXNpYyBpcyBzdGlsbCBhY3RpdmUgYWZ0ZXIgYSBtdXNpYworLy8gdHJhY2sgd2FzIHN0b3BwZWQgLSBzZWUgY29tcHV0ZVZvbHVtZSgpCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZICA1MDAwCisvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciBtZWRpYSBzdG9wcGVkIHBsYXlpbmcgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgdGhlCisvLyBzb25pZmljYXRpb24gc2hvdWxkIGJlIGFzIHVub2J0cnVzaXZlIGFzIGR1cmluZyB0aGUgdGltZSBtZWRpYSB3YXMgcGxheWluZy4KKyNkZWZpbmUgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkgNTAwMAorLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdpdGNoIHNvbWUgc3RyZWFtcyBhcmUgbXV0ZWQgd2hpbGUgdGhlIGF1ZGlvIHBhdGgKKy8vIGlzIHN3aXRjaGVkCisjZGVmaW5lIE1VVEVfVElNRV9NUyAyMDAwCisKKyNkZWZpbmUgTlVNX1RFU1RfT1VUUFVUUyA1CisKKyNkZWZpbmUgTlVNX1ZPTF9DVVJWRV9LTkVFUyAyCisKKy8vIERlZmF1bHQgbWluaW11bSBsZW5ndGggYWxsb3dlZCBmb3Igb2ZmbG9hZGluZyBhIGNvbXByZXNzZWQgdHJhY2sKKy8vIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIHByb3BlcnR5CisjZGVmaW5lIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyA2MAorCisjZGVmaW5lIE1BWF9NSVhFUl9TQU1QTElOR19SQVRFIDQ4MDAwCisjZGVmaW5lIE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UIDgKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyIGltcGxlbWVudHMgYXVkaW8gcG9saWN5IG1hbmFnZXIgYmVoYXZpb3IgY29tbW9uIHRvIGFsbCBwbGF0Zm9ybXMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlcjogcHVibGljIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAsIHB1YmxpYyBUaHJlYWQKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCit7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CisgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlcigpOworCisgICAgICAgIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworCisgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKworICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2VBbGxJbnB1dHMoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOworCisgICAgICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworCisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MgPSBOVUxMKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICAgICAgLy8gcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICAgIC8vICAgbG9jYWwvcmVtb3RlIHBsYXliYWNrLCB1c2VkIGZvciBpbnN0YW5jZSBieSBub3RpZmljYXRpb24gbWFuYWdlciB0byBub3QgbWFrZQorICAgICAgICAvLyAgIG1lZGlhIHBsYXllcnMgbG9zZSBhdWRpbyBmb2N1cyB3aGVuIG5vdCBwbGF5aW5nIGxvY2FsbHkKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKK3Byb3RlY3RlZDoKKworICAgICAgICBlbnVtIHJvdXRpbmdfc3RyYXRlZ3kgeworICAgICAgICAgICAgU1RSQVRFR1lfTUVESUEsCisgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwKKyAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAorICAgICAgICAgICAgU1RSQVRFR1lfRFRNRiwKKyAgICAgICAgICAgIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsCisgICAgICAgICAgICBOVU1fU1RSQVRFR0lFUworICAgICAgICB9OworCisgICAgICAgIC8vIDQgcG9pbnRzIHRvIGRlZmluZSB0aGUgdm9sdW1lIGF0dGVudWF0aW9uIGN1cnZlLCBlYWNoIGNoYXJhY3Rlcml6ZWQgYnkgdGhlIHZvbHVtZQorICAgICAgICAvLyBpbmRleCAoZnJvbSAwIHRvIDEwMCkgYXQgd2hpY2ggdGhleSBhcHBseSwgYW5kIHRoZSBhdHRlbnVhdGlvbiBpbiBkQiBhdCB0aGF0IGluZGV4LgorICAgICAgICAvLyB3ZSB1c2UgMTAwIHN0ZXBzIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycyB3aGVuIGNvbXB1dGluZyB0aGUgdm9sdW1lIGluIHZvbEluZGV4VG9BbXBsKCkKKworICAgICAgICBlbnVtIHsgVk9MTUlOID0gMCwgVk9MS05FRTEgPSAxLCBWT0xLTkVFMiA9IDIsIFZPTE1BWCA9IDMsIFZPTENOVCA9IDR9OworCisgICAgICAgIGNsYXNzIFZvbHVtZUN1cnZlUG9pbnQKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBpbnQgbUluZGV4OworICAgICAgICAgICAgZmxvYXQgbURCQXR0ZW51YXRpb247CisgICAgICAgIH07CisKKyAgICAgICAgLy8gZGV2aWNlIGNhdGVnb3JpZXMgdXNlZCBmb3Igdm9sdW1lIGN1cnZlIG1hbmFnZW1lbnQuCisgICAgICAgIGVudW0gZGV2aWNlX2NhdGVnb3J5IHsKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9IRUFEU0VULAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UsCisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBLAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0NOVAorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEh3TW9kdWxlOworCisgICAgICAgIGNsYXNzIEF1ZGlvR2FpbjogcHVibGljIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIHVzZUluQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9HYWluKCkge30KKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgICAgICAgICAgdm9pZCBnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19nYWluIG1HYWluOworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQXVkaW9Qb3J0OiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9Qb3J0KCkge30KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgICAgICAgICAgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KTsKKyAgICAgICAgICAgIHZvaWQgY2xlYXJDYXBhYmlsaXRpZXMoKTsKKworICAgICAgICAgICAgdm9pZCBsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZEZvcm1hdHMoY2hhciAqbmFtZSk7CisgICAgICAgICAgICB2b2lkIGxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSk7CisKKyAgICAgICAgICAgIGF1ZGlvX2dhaW5fbW9kZV90IGxvYWRHYWluTW9kZShjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCk7CisgICAgICAgICAgICB2b2lkIGxvYWRHYWlucyhjbm9kZSAqcm9vdCk7CisKKyAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaAorICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdFNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUpIGNvbnN0OworICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgYW5kIHJldHVybnMgdGhlIGJlc3QgbWF0Y2ggdmlhIHVwZGF0ZWRTYW1wbGluZ1JhdGUKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdDsKKyAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaAorICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKKyAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgaW5wdXQgY2hhbm5lbCBtYXNrcyBvbmx5CisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7CisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywgaW50IGluZGV4KSBjb25zdDsKKworICAgICAgICAgICAgdWludDMyX3QgcGlja1NhbXBsaW5nUmF0ZSgpIGNvbnN0OworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcGlja0NoYW5uZWxNYXNrKCkgY29uc3Q7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBwaWNrRm9ybWF0KCkgY29uc3Q7CisKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBhdWRpb19mb3JtYXRfdCBzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW107CisgICAgICAgICAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDEsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDIpOworCisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKworICAgICAgICAgICAgU3RyaW5nOCAgICAgICAgICAgbU5hbWU7CisgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBtVHlwZTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1TYW1wbGluZ1JhdGVzLCBtQ2hhbm5lbE1hc2tzIG9yIG1Gb3JtYXRzCisgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgIC8vIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgICAgIFZlY3RvciA8dWludDMyX3Q+IG1TYW1wbGluZ1JhdGVzOyAvLyBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMKKyAgICAgICAgICAgIFZlY3RvciA8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IG1DaGFubmVsTWFza3M7IC8vIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICBWZWN0b3IgPGF1ZGlvX2Zvcm1hdF90PiBtRm9ybWF0czsgLy8gc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMKKyAgICAgICAgICAgIFZlY3RvciA8IHNwPEF1ZGlvR2Fpbj4gPiBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKKyAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQorICAgICAgICAgICAgdWludDMyX3QgbUZsYWdzOyAvLyBhdHRyaWJ1dGUgZmxhZ3MgKGUuZyBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdCBvdXRwdXQuLi4pLgorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEF1ZGlvUG9ydENvbmZpZzogcHVibGljIHZpcnR1YWwgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvUG9ydENvbmZpZygpOworICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9Qb3J0Q29uZmlnKCkge30KKworICAgICAgICAgICAgc3RhdHVzX3QgYXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZyA9IE5VTEwpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbjsKKyAgICAgICAgfTsKKworCisgICAgICAgIGNsYXNzIEF1ZGlvUGF0Y2g6IHB1YmxpYyBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZShoYW5kbGUpLCBtUGF0Y2goKnBhdGNoKSwgbVVpZCh1aWQpLCBtQWZQYXRjaEhhbmRsZSgwKSB7fQorCisgICAgICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgICAgICAgICB1aWRfdCBtVWlkOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUFmUGF0Y2hIYW5kbGU7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydCwgcHVibGljIEF1ZGlvUG9ydENvbmZpZworICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIERldmljZURlc2NyaXB0b3IoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fZGV2aWNlc190IHR5cGUpOworCisgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VEZXNjcmlwdG9yKCkge30KKworICAgICAgICAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiAoQXVkaW9Qb3J0KikgdGhpczsgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlOworICAgICAgICAgICAgU3RyaW5nOCBtQWRkcmVzczsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8IHNwPERldmljZURlc2NyaXB0b3I+ID4KKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpLCBtRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX05PTkUpIHt9CisKKyAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CisgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlczsgfQorCisgICAgICAgICAgICB2b2lkIGxvYWREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZERldmljZXNGcm9tTmFtZShjaGFyICpuYW1lLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRlY2xhcmVkRGV2aWNlcyk7CisKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdDsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21OYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpIGNvbnN0OworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgY29uc3Q7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZVR5cGVzOworICAgICAgICB9OworCisgICAgICAgIC8vIHRoZSBJT1Byb2ZpbGUgY2xhc3MgZGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYW4gb3V0cHV0IG9yIGlucHV0IHN0cmVhbS4KKyAgICAgICAgLy8gSXQgaXMgY3VycmVudGx5IGFzc3VtZWQgdGhhdCBhbGwgY29tYmluYXRpb24gb2YgbGlzdGVkIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZC4KKyAgICAgICAgLy8gSXQgaXMgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgdG8gZGV0ZXJtaW5lIGlmIGFuIG91dHB1dCBvciBpbnB1dCBpcyBzdWl0YWJsZSBmb3IKKyAgICAgICAgLy8gYSBnaXZlbiB1c2UgY2FzZSwgIG9wZW4vY2xvc2UgaXQgYWNjb3JkaW5nbHkgYW5kIGNvbm5lY3QvZGlzY29ubmVjdCBhdWRpbyB0cmFja3MKKyAgICAgICAgLy8gdG8vZnJvbSBpdC4KKyAgICAgICAgY2xhc3MgSU9Qcm9maWxlIDogcHVibGljIEF1ZGlvUG9ydAorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgICAgICAgICB2aXJ0dWFsIH5JT1Byb2ZpbGUoKTsKKworICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgYm90aCBvdXRwdXQgYW5kIGlucHV0LgorICAgICAgICAgICAgLy8gSWYgcGFyYW1ldGVyIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaXMgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCisgICAgICAgICAgICAvLyBGb3IgaW5wdXQsIGZsYWdzIGlzIGludGVycHJldGVkIGFzIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgICAgICAgICAvLyBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgICAgICAgIGJvb2wgaXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIGNvbnN0OworCisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICAgICAgICAgIHZvaWQgbG9nKCk7CisKKyAgICAgICAgICAgIERldmljZVZlY3RvciAgbVN1cHBvcnRlZERldmljZXM7IC8vIHN1cHBvcnRlZCBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZGV2aWNlcyB0aGlzIG91dHB1dCBjYW4gYmUgcm91dGVkIHRvKQorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEh3TW9kdWxlIDogcHVibGljIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgIEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOworICAgICAgICAgICAgICAgICAgICB+SHdNb2R1bGUoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgbG9hZE91dHB1dChjbm9kZSAqcm9vdCk7CisgICAgICAgICAgICBzdGF0dXNfdCBsb2FkSW5wdXQoY25vZGUgKnJvb3QpOworICAgICAgICAgICAgc3RhdHVzX3QgbG9hZERldmljZShjbm9kZSAqcm9vdCk7CisKKyAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOworCisgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAgICAgICAgbU5hbWU7IC8vIGJhc2UgbmFtZSBvZiB0aGUgYXVkaW8gSFcgbW9kdWxlIChwcmltYXJ5LCBhMmRwIC4uLikKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBtSGFsVmVyc2lvbjsgLy8gYXVkaW8gSEFMIEFQSSB2ZXJzaW9uCisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgICAgbUhhbmRsZTsKKyAgICAgICAgICAgIFZlY3RvciA8IHNwPElPUHJvZmlsZT4gPiBtT3V0cHV0UHJvZmlsZXM7IC8vIG91dHB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCisgICAgICAgICAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlczsgLy8gZGV2aWNlcyBkZWNsYXJlZCBpbiBhdWRpb19wb2xpY3kuY29uZgorCisgICAgICAgIH07CisKKyAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG5vbi1tZWRpYSBhdWRpbyBvbiBleHQgbWVkaWEgb3V0cHV0cyAoSERNSSwgTGluZSwgZXRjKQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXMgcGVyIHN0cmVhbSBhbmQgZGV2aWNlIGNhdGVnb3J5LiBTZWUgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07CisKKyAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gb3V0cHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gb3V0cHV0CisgICAgICAgIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgorICAgICAgICBjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OworICAgICAgICAgICAgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKKworICAgICAgICAgICAgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKTsKKyAgICAgICAgICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7CisgICAgICAgICAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgICAgICAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworICAgICAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZTsgfQorICAgICAgICAgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQorICAgICAgICAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgICAgICAgICAgdWludDMyX3QgbVJlZkNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAvLyBudW1iZXIgb2Ygc3RyZWFtcyBvZiBlYWNoIHR5cGUgdXNpbmcgdGhpcyBvdXRwdXQKKyAgICAgICAgICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAorICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKKyAgICAgICAgICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lCisgICAgICAgICAgICBpbnQgbU11dGVDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgICAgIC8vIG11dGUgcmVxdWVzdCBjb3VudGVyCisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KKyAgICAgICAgICAgIGJvb2wgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtOVU1fU1RSQVRFR0lFU107IC8vIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBzZWxlY3Rpb24uIFNlZSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKKyAgICAgICAgICAgIHVpbnQzMl90IG1EaXJlY3RPcGVuQ291bnQ7IC8vIG51bWJlciBvZiBjbGllbnRzIHVzaW5nIHRoaXMgb3V0cHV0IChkaXJlY3Qgb3V0cHV0cyBvbmx5KQorICAgICAgICB9OworCisgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIGlucHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gaW5wdXQKKyAgICAgICAgLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgaW5wdXQuCisgICAgICAgIGNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgbUlkOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgICAgICAgbUlvSGFuZGxlOyAgICAgICAvLyBpbnB1dCBoYW5kbGUKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgICAgICAgIG1EZXZpY2U7ICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8KKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgIG1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb3VudDsgICAgICAgLy8gbnVtYmVyIG9mIEF1ZGlvUmVjb3JkIGNsaWVudHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpbnB1dAorICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbU9wZW5SZWZDb3VudDsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90ICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsgICAgLy8gaW5wdXQgc291cmNlIHNlbGVjdGVkIGJ5IGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vKG1lZGlhcmVjb3JkZXIuaCkKKyAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gICAgICAgICAgIG1Qcm9maWxlOyAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtU2Vzc2lvbnM7ICAgICAgIC8vIGF1ZGlvIHNlc3Npb25zIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1NvdW5kVHJpZ2dlcjsgLy8gdXNlZCBieSBhIHNvdW5kdHJpZ2dlciBjYXB0dXJlCisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZTsgfQorICAgICAgICAgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgY2xhc3MgU3RyZWFtRGVzY3JpcHRvcgorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFN0cmVhbURlc2NyaXB0b3IoKTsKKworICAgICAgICAgICAgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGludCBtSW5kZXhNaW47ICAgICAgLy8gbWluIHZvbHVtZSBpbmRleAorICAgICAgICAgICAgaW50IG1JbmRleE1heDsgICAgICAvLyBtYXggdm9sdW1lIGluZGV4CisgICAgICAgICAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAgIC8vIGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UKKyAgICAgICAgICAgIGJvb2wgbUNhbkJlTXV0ZWQ7ICAgLy8gdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZAorCisgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICptVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX0NOVF07CisgICAgICAgIH07CisKKyAgICAgICAgLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgY2xhc3MgRWZmZWN0RGVzY3JpcHRvciA6IHB1YmxpYyBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorCisgICAgICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGludCBtSW87ICAgICAgICAgICAgICAgIC8vIGlvIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8KKyAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bworICAgICAgICAgICAgaW50IG1TZXNzaW9uOyAgICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBtRGVzYzsgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgICAgICAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIGFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7CisgICAgICAgIHZvaWQgYWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpOworCisgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICAgIHN0YXRpYyByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgICAgICAvLyByZXR1cm4gYXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBhY2NvcmRpbmcgdG8gY3VycmVudAorICAgICAgICAvLyBwaG9uZSBzdGF0ZSwgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgICAgLy8gaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBtRGV2aWNlRm9yU3RyYXRlZ3lbXSwKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZSBieSBjdXJyZW50IHN0YXRlCisgICAgICAgIC8vIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQorICAgICAgICAvLyBUaGlzIGFsbG93cyB0bzoKKyAgICAgICAgLy8gIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAgICAvLyAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICAgIC8vICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKKyAgICAgICAgLy8gIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKKyAgICAgICAgLy8gIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOworCisgICAgICAgIC8vIGNoYW5nZSB0aGUgcm91dGUgb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3ZSBoYXZlIHNsZXB0IHRvCisgICAgICAgIC8vIGFsbG93IG5ldyByb3V0aW5nIHRvIHRha2UgZWZmZWN0IGluIGNlcnRhaW4gY2FzZXMuCisgICAgICAgIHVpbnQzMl90IHNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisKKyAgICAgICAgLy8gc2VsZWN0IGlucHV0IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RlZCBhdWRpbyBzb3VyY2UKKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpOworCisgICAgICAgIC8vIHJldHVybiBpbyBoYW5kbGUgb2YgYWN0aXZlIGlucHV0IG9yIDAgaWYgbm8gaW5wdXQgaXMgYWN0aXZlCisgICAgICAgIC8vICAgIE9ubHkgY29uc2lkZXJzIGlucHV0cyBmcm9tIHBoeXNpY2FsIGRldmljZXMgKGUuZy4gbWFpbiBtaWMsIGhlYWRzZXQgbWljKSB3aGVuCisgICAgICAgIC8vICAgIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0QWN0aXZlSW5wdXQoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzID0gdHJ1ZSk7CisKKyAgICAgICAgdWludDMyX3QgYWN0aXZlSW5wdXRzQ291bnQoKSBjb25zdDsKKworICAgICAgICAvLyBpbml0aWFsaXplIHZvbHVtZSBjdXJ2ZXMgZm9yIGVhY2ggc3RyYXRlZ3kgYW5kIGRldmljZSBjYXRlZ29yeQorICAgICAgICB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKTsKKworICAgICAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdm9sdW1lIGZvciBhIGdpdmVuIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyCisgICAgICAgIC8vIGRldmljZQorICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB2b2x1bWUgY2hhbmdlIGlzIHBlcm1pdHRlZCwgY29tcHV0ZSBhbmQgc2VuZCBuZXcgdm9sdW1lIHRvIGF1ZGlvIGhhcmR3YXJlCisgICAgICAgIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgICAgIC8vIGFwcGx5IGFsbCBzdHJlYW0gdm9sdW1lcyB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBhbmQgZGV2aWNlCisgICAgICAgIHZvaWQgYXBwbHlTdHJlYW1Wb2x1bWVzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CisKKyAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgdGhlIHN0cmVhbSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2b2lkIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CisKKyAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSB3aGlsZSBpbiBjYWxsOiBtdXRlIHN0cmVhbXMgb3IgcmVwbGFjZSBieQorICAgICAgICAvLyBhIHNwZWNpYWwgdG9uZSBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIGNvbW11bmljYXRpb24KKyAgICAgICAgdm9pZCBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpOworCisgICAgICAgIC8vIHRydWUgaWYgZGV2aWNlIGlzIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbkNhbGwoKTsKKworICAgICAgICAvLyB0cnVlIGlmIGdpdmVuIHN0YXRlIHJlcHJlc2VudHMgYSBkZXZpY2UgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0YXRlSW5DYWxsKGludCBzdGF0ZSk7CisKKyAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvcGVuIG91dHB1dCBjYW4gYmUgcm91dGVkCisgICAgICAgIC8vIHRvIHRoaXMgZGV2aWNlLiBJZiBub25lIGlzIG9wZW4sIHRyaWVzIHRvIG9wZW4gb25lIG9mIHRoZSBhdmFpbGFibGUgb3V0cHV0cy4KKyAgICAgICAgLy8gUmV0dXJucyBhbiBvdXRwdXQgc3VpdGFibGUgdG8gdGhpcyBkZXZpY2Ugb3IgMC4KKyAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvdXRwdXQgaXMgbm90IHVzZWQgYW55IG1vcmUgYW5kCisgICAgICAgIC8vIHJldHVybnMgaXRzIGhhbmRsZSBpZiBhbnkuCisgICAgICAgIC8vIHRyYW5zZmVycyB0aGUgYXVkaW8gdHJhY2tzIGFuZCBlZmZlY3RzIGZyb20gb25lIG91dHB1dCB0aHJlYWQgdG8gYW5vdGhlciBhY2NvcmRpbmdseS4KKyAgICAgICAgc3RhdHVzX3QgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKTsKKworICAgICAgICBzdGF0dXNfdCBjaGVja0lucHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKTsKKworICAgICAgICAvLyBjbG9zZSBhbiBvdXRwdXQgYW5kIGl0cyBjb21wYW5pb24gZHVwbGljYXRpbmcgb3V0cHV0LgorICAgICAgICB2b2lkIGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisKKyAgICAgICAgLy8gY2xvc2UgYW4gaW5wdXQuCisgICAgICAgIHZvaWQgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisKKyAgICAgICAgLy8gY2hlY2tzIGFuZCBpZiBuZWNlc3NhcnkgY2hhbmdlcyBvdXRwdXRzIHVzZWQgZm9yIGFsbCBzdHJhdGVnaWVzLgorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneQorICAgICAgICAvLyBjaGFuZ2VzOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCisgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKworICAgICAgICAvLyBTYW1lIGFzIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBidXQgZm9yIGEgYWxsIHN0cmF0ZWdpZXMgaW4gb3JkZXIgb2YgcHJpb3JpdHkKKyAgICAgICAgdm9pZCBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKworICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQorICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKKworICAgICAgICAvLyByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBMmRwT3V0cHV0KCk7CisKKyAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gb3V0cHV0IGZvciBjdXJyZW50IHN0YXRlCisgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIG91dHB1dCBpcworICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBvdXRwdXQgc3RhcnQsIG91dHB1dCBzdG9wLi4KKyAgICAgICAgLy8gc2VlIGdldERldmljZUZvclN0cmF0ZWd5KCkgZm9yIHRoZSB1c2Ugb2YgZnJvbUNhY2hlIHBhcmFtZXRlcgorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpOworCisgICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcworICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCisgICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICB2b2lkIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gaW5wdXQgZm9yIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNDcHVMb2FkKCk7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TWF4RWZmZWN0c01lbW9yeSgpOworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOworICAgICAgICBpbnQgdGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgY2F0ZWdvcnkgdGhlIGRldmljZSBiZWxvbmdzIHRvIHdpdGggcmVnYXJkIHRvIHZvbHVtZSBjdXJ2ZSBtYW5hZ2VtZW50CisgICAgICAgIHN0YXRpYyBkZXZpY2VfY2F0ZWdvcnkgZ2V0RGV2aWNlQ2F0ZWdvcnkoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgLy8gZXh0cmFjdCBvbmUgZGV2aWNlIHJlbGV2YW50IGZvciB2b2x1bWUgY29udHJvbCBmcm9tIG11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24KKyAgICAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBvcGVuT3V0cHV0cyk7CisgICAgICAgIGJvb2wgdmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKTsKKworICAgICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KKyAgICAgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKKyAgICAgICAgdWludDMyX3QgIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CisKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgICAgIC8vIHNhbXBsaW5nUmF0ZSBwYXJhbWV0ZXIgaXMgYW4gaW4vb3V0IGFuZCBzbyBtYXkgYmUgbW9kaWZpZWQKKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyk7CisKKyAgICAgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpOworCisgICAgICAgIHN0YXR1c190IGFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCk7CisgICAgICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldE91dHB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OworICAgICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworICAgICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOworCisgICAgICAgIHZvaWQgdXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCBpbnQgZGVsYXlNcyA9IDApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2luZyAoYXVkaW9fcG9saWN5LmNvbmYpCisgICAgICAgIC8vCisgICAgICAgIHN0YXRpYyB1aW50MzJfdCBzdHJpbmdUb0VudW0oY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICplbnVtVG9TdHJpbmcoY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSk7CisgICAgICAgIHN0YXRpYyBib29sIHN0cmluZ1RvQm9vbChjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgICAgIHN0YXRpYyB1aW50MzJfdCBwYXJzZU91dHB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKTsKKyAgICAgICAgc3RhdGljIHVpbnQzMl90IHBhcnNlSW5wdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgcGFyc2VEZXZpY2VOYW1lcyhjaGFyICpuYW1lKTsKKyAgICAgICAgdm9pZCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QpOworICAgICAgICB2b2lkIGxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QpOworICAgICAgICB2b2lkIGxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICAgICAgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworICAgICAgICB2b2lkIGRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKTsKKworCisgICAgICAgIHVpZF90IG1VaWRDYWNoZWQ7CisgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptcENsaWVudEludGVyZmFjZTsgIC8vIGF1ZGlvIHBvbGljeSBjbGllbnQgaW50ZXJmYWNlCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1QcmltYXJ5T3V0cHV0OyAgICAgICAgICAgICAgLy8gcHJpbWFyeSBvdXRwdXQgaGFuZGxlCisgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZAorICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBtT3V0cHV0czsKKyAgICAgICAgLy8gY29weSBvZiBtT3V0cHV0cyBiZWZvcmUgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgb3BlbnMgbmV3IG91dHB1dHMKKyAgICAgICAgLy8gcmVzZXQgdG8gbU91dHB1dHMgd2hlbiB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gbVByZXZpb3VzT3V0cHV0czsKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBtSW5wdXRzOyAgICAgLy8gbGlzdCBvZiBpbnB1dCBkZXNjcmlwdG9ycworICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzOyAvLyBhbGwgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCisgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZUlucHV0RGV2aWNlczsgIC8vIGFsbCBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcworICAgICAgICBpbnQgbVBob25lU3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcGhvbmUgc3RhdGUKKyAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdOyAgIC8vIGN1cnJlbnQgZm9yY2VkIHVzZSBjb25maWd1cmF0aW9uCisKKyAgICAgICAgU3RyZWFtRGVzY3JpcHRvciBtU3RyZWFtc1tBVURJT19TVFJFQU1fQ05UXTsgICAgICAgICAgIC8vIHN0cmVhbSBkZXNjcmlwdG9ycyBmb3Igdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgYm9vbCAgICBtTGltaXRSaW5ndG9uZVZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW1pdCByaW5ndG9uZSB2b2x1bWUgdG8gbXVzaWMgdm9sdW1lIGlmIGhlYWRzZXQgY29ubmVjdGVkCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlRm9yU3RyYXRlZ3lbTlVNX1NUUkFURUdJRVNdOworICAgICAgICBmbG9hdCAgIG1MYXN0Vm9pY2VWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgdm9pY2Ugdm9sdW1lIHZhbHVlIHNlbnQgdG8gYXVkaW8gSEFMCisKKyAgICAgICAgLy8gTWF4aW11bSBDUFUgbG9hZCBhbGxvY2F0ZWQgdG8gYXVkaW8gZWZmZWN0cyBpbiAwLjEgTUlQUyAoQVJNdjVURSwgMCBXUyBtZW1vcnkpIHVuaXRzCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfRUZGRUNUU19DUFVfTE9BRCA9IDEwMDA7CisgICAgICAgIC8vIE1heGltdW0gbWVtb3J5IGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIEtCCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfRUZGRUNUU19NRU1PUlkgPSA1MTI7CisgICAgICAgIHVpbnQzMl90IG1Ub3RhbEVmZmVjdHNDcHVMb2FkOyAvLyBjdXJyZW50IENQVSBsb2FkIHVzZWQgYnkgZWZmZWN0cworICAgICAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzTWVtb3J5OyAgLy8gY3VycmVudCBtZW1vcnkgdXNlZCBieSBlZmZlY3RzCisgICAgICAgIEtleWVkVmVjdG9yPGludCwgc3A8RWZmZWN0RGVzY3JpcHRvcj4gPiBtRWZmZWN0czsgIC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBhdWRpbyBlZmZlY3RzCisgICAgICAgIGJvb2wgICAgbUEyZHBTdXNwZW5kZWQ7ICAvLyB0cnVlIGlmIEEyRFAgb3V0cHV0IGlzIHN1c3BlbmRlZAorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGVmYXVsdE91dHB1dERldmljZTsgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0IGF0IGJvb3QgdGltZQorICAgICAgICBib29sIG1TcGVha2VyRHJjRW5hYmxlZDsvLyB0cnVlIG9uIGRldmljZXMgdGhhdCB1c2UgRFJDIG9uIHRoZSBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5CisKKyAgICAgICAgVmVjdG9yIDwgc3A8SHdNb2R1bGU+ID4gbUh3TW9kdWxlczsKKyAgICAgICAgdm9sYXRpbGUgaW50MzJfdCBtTmV4dFVuaXF1ZUlkOworICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1BdWRpb1BvcnRHZW5lcmF0aW9uOworCisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8QXVkaW9QYXRjaD4gPiBtQXVkaW9QYXRjaGVzOworCisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIGF1ZGlvX2lvX2hhbmRsZV90PiBtU291bmRUcmlnZ2VyU2Vzc2lvbnM7CisKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxUeFBhdGNoOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFJ4UGF0Y2g7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgICAgICBNdXRleCAgIG1Mb2NrOworICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CisKKyAgICAgICAgaW50ICAgICAgICAgICAgIG1DdXJPdXRwdXQ7CisgICAgICAgIGJvb2wgICAgICAgICAgICBtRGlyZWN0T3V0cHV0OworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtVGVzdE91dHB1dHNbTlVNX1RFU1RfT1VUUFVUU107CisgICAgICAgIGludCAgICAgICAgICAgICBtVGVzdElucHV0OworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3REZXZpY2U7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZTsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0Rm9ybWF0OworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RDaGFubmVsczsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0TGF0ZW5jeU1zOworI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIGZsb2F0IHZvbEluZGV4VG9BbXBsKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSk7CisgICAgICAgIC8vIHVwZGF0ZXMgZGV2aWNlIGNhY2hpbmcgYW5kIG91dHB1dCBmb3Igc3RyZWFtcyB0aGF0IGNhbiBpbmZsdWVuY2UgdGhlCisgICAgICAgIC8vICAgIHJvdXRpbmcgb2Ygbm90aWZpY2F0aW9ucworICAgICAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICBzdGF0aWMgYm9vbCBpc1ZpcnR1YWxJbnB1dERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgc3RhdGljIGJvb2wgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgLy8gZmluZCB0aGUgb3V0cHV0cyBvbiBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gYWRkcmVzcy4KKyAgICAgICAgLy8gdG8gYmUgY2FsbGVkIG9uIGFuIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciB3aG9zZSBzdXBwb3J0ZWQgZGV2aWNlcyAoYXMgZGVmaW5lZAorICAgICAgICAvLyAgIGluIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcykgbWF0Y2hlcyB0aGUgZGV2aWNlIHdob3NlIGFkZHJlc3MgaXMgdG8gYmUgbWF0Y2hlZC4KKyAgICAgICAgLy8gc2VlIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190KSBmb3Igd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCisgICAgICAgIC8vICAgd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIuCisgICAgICAgIHZvaWQgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgLyppbiovLAorICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyAvKmluKi8sCisgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKTsKKyAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIHVpbnQzMl90IG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQorICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBzdHJlYW0gdHlwZSB2YWx1ZSBmcm9tIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKK307CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQwNjdmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDEwNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5U2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyN1bmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgX19TVERJTlRfTElNSVRTCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOworc3RhdGljIGNvbnN0IGNoYXIga0NtZERlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCB0aHJlYWQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CisKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CisKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtBdWRpb0NvbW1hbmRUaW1lb3V0TnMgPSBzZWNvbmRzKDMpOyAvLyAzIHNlY29uZHMKKworbmFtZXNwYWNlIHsKKyAgICBleHRlcm4gc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBhcHNfb3BzOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5U2VydmljZSgpCisgICAgOiBCbkF1ZGlvUG9saWN5U2VydmljZSgpLCBtcEF1ZGlvUG9saWN5RGV2KE5VTEwpLCBtcEF1ZGlvUG9saWN5KE5VTEwpLAorICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlcihOVUxMKSwgbUF1ZGlvUG9saWN5Q2xpZW50KE5VTEwpLCBtUGhvbmVTdGF0ZShBVURJT19NT0RFX0lOVkFMSUQpCit7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGU7CisgICAgaW50IGZvcmNlZF92YWw7CisgICAgaW50IHJjOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgICAgIC8vIHN0YXJ0IHRvbmUgcGxheWJhY2sgdGhyZWFkCisgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbVRvbmUiKSwgdGhpcyk7CisgICAgICAgIC8vIHN0YXJ0IGF1ZGlvIGNvbW1hbmRzIHRocmVhZAorICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1BdWRpbyIpLCB0aGlzKTsKKyAgICAgICAgLy8gc3RhcnQgb3V0cHV0IGFjdGl2aXR5IGNvbW1hbmQgdGhyZWFkCisgICAgICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1PdXRwdXQiKSwgdGhpcyk7CisKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgICAgICBBTE9HSSgiQXVkaW9Qb2xpY3lTZXJ2aWNlIENTVE9SIGluIGxlZ2FjeSBtb2RlIik7CisKKyAgICAgICAgLyogaW5zdGFudGlhdGUgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyICovCisgICAgICAgIHJjID0gaHdfZ2V0X21vZHVsZShBVURJT19QT0xJQ1lfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBhdWRpb19wb2xpY3lfZGV2X29wZW4obW9kdWxlLCAmbXBBdWRpb1BvbGljeURldik7CisgICAgICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3Qgb3BlbiBhdWRpbyBwb2xpY3kgZGV2aWNlICglcykiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICByYyA9IG1wQXVkaW9Qb2xpY3lEZXYtPmNyZWF0ZV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgJmFwc19vcHMsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXBBdWRpb1BvbGljeSk7CisgICAgICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3QgY3JlYXRlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtcEF1ZGlvUG9saWN5LT5pbml0X2NoZWNrKG1wQXVkaW9Qb2xpY3kpOworICAgICAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IGluaXRfY2hlY2sgdGhlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFMT0dJKCJMb2FkZWQgYXVkaW8gcG9saWN5IGZyb20gJXMgKCVzKSIsIG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7CisjZWxzZQorICAgICAgICBBTE9HSSgiQXVkaW9Qb2xpY3lTZXJ2aWNlIENTVE9SIGluIG5ldyBtb2RlIik7CisKKyAgICAgICAgbUF1ZGlvUG9saWN5Q2xpZW50ID0gbmV3IEF1ZGlvUG9saWN5Q2xpZW50KHRoaXMpOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyID0gY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKG1BdWRpb1BvbGljeUNsaWVudCk7CisjZW5kaWYKKyAgICB9CisgICAgLy8gbG9hZCBhdWRpbyBwcm9jZXNzaW5nIG1vZHVsZXMKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzID0gbmV3IEF1ZGlvUG9saWN5RWZmZWN0cygpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5RWZmZWN0cyA9IGF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9Cit9CisKK0F1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCit7CisgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZXhpdCgpOworICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmV4aXQoKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+ZXhpdCgpOworCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICBpZiAobXBBdWRpb1BvbGljeSAhPSBOVUxMICYmIG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkgeworICAgICAgICBtcEF1ZGlvUG9saWN5RGV2LT5kZXN0cm95X2F1ZGlvX3BvbGljeShtcEF1ZGlvUG9saWN5RGV2LCBtcEF1ZGlvUG9saWN5KTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19wb2xpY3lfZGV2X2Nsb3NlKG1wQXVkaW9Qb2xpY3lEZXYpOworICAgIH0KKyNlbHNlCisgICAgZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcihtQXVkaW9Qb2xpY3lNYW5hZ2VyKTsKKyAgICBkZWxldGUgbUF1ZGlvUG9saWN5Q2xpZW50OworI2VuZGlmCisKKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5jbGVhcigpOworICAgIG1BdWRpb1BvbGljeUVmZmVjdHMuY2xlYXIoKTsKK30KKworLy8gQSBub3RpZmljYXRpb24gY2xpZW50IGlzIGFsd2F5cyByZWdpc3RlcmVkIGJ5IEF1ZGlvU3lzdGVtIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzCisvLyBjb25uZWN0cyB0byBBdWRpb1BvbGljeVNlcnZpY2UuCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCkKK3sKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCIsIGNsaWVudC5nZXQoKSwgdWlkKTsKKworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodWlkLCBub3RpZmljYXRpb25DbGllbnQpOworCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKKyAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOworICAgIH0KK30KKworLy8gcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KCkgaXMgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzIGRpZXMuCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbSh1aWQpOworCisjaWZuZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCisgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5jbGVhckF1ZGlvUGF0Y2hlcyh1aWQpOworICAgICAgICB9CisjZW5kaWYKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCit7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnVwZGF0ZUF1ZGlvUG9ydExpc3RDb21tYW5kKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT51cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKHBhdGNoLCBoYW5kbGUsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsaWVudFJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvQ29tbWFuZFRocmVhZC0+cmVsZWFzZUF1ZGlvUGF0Y2hDb21tYW5kKGhhbmRsZSwgZGVsYXlNcyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Db21tYW5kVGhyZWFkLT5zZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKGNvbmZpZywgZGVsYXlNcyk7Cit9CisKK0F1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQorICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpCit7Cit9CisKK0F1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50Ojp+Tm90aWZpY2F0aW9uQ2xpZW50KCkKK3sKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQoreworICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4ga2VlcCh0aGlzKTsKKyAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gMCkgeworICAgICAgICBzZXJ2aWNlLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVVpZCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwKSB7CisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKKyAgICBBTE9HVygiYmluZGVyRGllZCgpICVwLCBjYWxsaW5nIHBpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworfQorCitzdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKK3sKKyAgICBib29sIGxvY2tlZCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7CisgICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXBVcyk7CisgICAgfQorICAgIHJldHVybiBsb2NrZWQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcEludGVybmFscyhpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBvbGljeU1hbmFnZXIgSW50ZXJmYWNlOiAlcFxuIiwgbXBBdWRpb1BvbGljeSk7CisjZWxzZQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvUG9saWN5TWFuYWdlcjogJXBcbiIsIG1BdWRpb1BvbGljeU1hbmFnZXIpOworI2VuZGlmCisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNvbW1hbmQgVGhyZWFkOiAlcFxuIiwgbUF1ZGlvQ29tbWFuZFRocmVhZC5nZXQoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRvbmVzIFRocmVhZDogJXBcbiIsIG1Ub25lUGxheWJhY2tUaHJlYWQuZ2V0KCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKK3sKKyAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKKyAgICAgICAgZHVtcFBlcm1pc3Npb25EZW5pYWwoZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7CisgICAgICAgIGlmICghbG9ja2VkKSB7CisgICAgICAgICAgICBTdHJpbmc4IHJlc3VsdChrRGVhZGxvY2tlZFN0cmluZyk7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGR1bXBJbnRlcm5hbHMoZmQpOworICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKKyAgICAgICAgfQorCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICAgICAgaWYgKG1wQXVkaW9Qb2xpY3kpIHsKKyAgICAgICAgICAgIG1wQXVkaW9Qb2xpY3ktPmR1bXAobXBBdWRpb1BvbGljeSwgZmQpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+ZHVtcChmZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBlcm1pc3Npb24gRGVuaWFsOiAiCisgICAgICAgICAgICAiY2FuJ3QgZHVtcCBBdWRpb1BvbGljeVNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHJldHVybiBCbkF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworfQorCisKKy8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKK0F1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKQorICAgIDogVGhyZWFkKGZhbHNlKSwgbU5hbWUobmFtZSksIG1TZXJ2aWNlKHNlcnZpY2UpCit7CisgICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKK30KKworCitBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6fkF1ZGlvQ29tbWFuZFRocmVhZCgpCit7CisgICAgaWYgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOworICAgIH0KKyAgICBtQXVkaW9Db21tYW5kcy5jbGVhcigpOworICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQoreworICAgIHJ1bihtTmFtZS5zdHJpbmcoKSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIG5zZWNzX3Qgd2FpdFRpbWUgPSBJTlQ2NF9NQVg7CisKKyAgICBtTG9jay5sb2NrKCk7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQorICAgIHsKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzdmM7CisgICAgICAgIHdoaWxlICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICBuc2Vjc190IGN1clRpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogZXhlY3V0ZSB0aGVtIGZyb20gaW5kZXggMCBhbmQgdXAKKyAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgPD0gY3VyVGltZSkgeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG1BdWRpb0NvbW1hbmRzWzBdOworICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgIG1MYXN0Q29tbWFuZCA9IGNvbW1hbmQ7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFSVF9UT05FOiB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBUb25lRGF0YSAqZGF0YSA9IChUb25lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RhcnQgdG9uZSAlZCBvbiBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1UeXBlLCBkYXRhLT5tU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gbmV3IFRvbmVHZW5lcmF0b3IoZGF0YS0+bVN0cmVhbSwgMS4wKTsKKyAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdGFydFRvbmUoZGF0YS0+bVR5cGUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUT1BfVE9ORTogeworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCB0b25lIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtcFRvbmVHZW5lcmF0b3IgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdG9wVG9uZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CisgICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1Wb2x1bWUsIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lKGRhdGEtPm1TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGRhdGEtPm1JTywgZGF0YS0+bUtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CisgICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRWb2ljZVZvbHVtZShkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKKyAgICAgICAgICAgICAgICAgICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSAoU3RvcE91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOiB7CisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VPdXRwdXREYXRhICpkYXRhID0gKFJlbGVhc2VPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgICAgICAgICBDcmVhdGVBdWRpb1BhdGNoRGF0YSAqZGF0YSA9IChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgY3JlYXRlIGF1ZGlvIHBhdGNoIik7CisgICAgICAgICAgICAgICAgICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPmNyZWF0ZUF1ZGlvUGF0Y2goJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqZGF0YSA9IChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2UgYXVkaW8gcGF0Y2giKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+cmVsZWFzZUF1ZGlvUGF0Y2goZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BVURJT1BPUlRfTElTVDogeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyB1cGRhdGUgYXVkaW8gcG9ydCBsaXN0Iik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BVURJT1BBVENIX0xJU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgdXBkYXRlIGF1ZGlvIHBhdGNoIGxpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9BVURJT1BPUlRfQ09ORklHOiB7CisgICAgICAgICAgICAgICAgICAgIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKmRhdGEgPSAoU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBvcnQgY29uZmlnIik7CisgICAgICAgICAgICAgICAgICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnNldEF1ZGlvUG9ydENvbmZpZygmZGF0YS0+bUNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9Db21tYW5kVGhyZWFkKCkgdW5rbm93biBjb21tYW5kICVkIiwgY29tbWFuZC0+bUNvbW1hbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChjb21tYW5kLT5tTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gSU5UNjRfTUFYOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3YWl0VGltZSA9IG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSAtIGN1clRpbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBtTG9jayBiZWZvcmUgcmVsZWFzaW5nIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIHNlcnZpY2UgYXMKKyAgICAgICAgLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGRlc3RydWN0b3IgY2FsbHMgQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkgd2hpY2ggYWNxdWlyZXMgbUxvY2suCisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICBzdmMuY2xlYXIoKTsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBpZiAoIWV4aXRQZW5kaW5nKCkgJiYgbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrCisgICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgZ29pbmcgdG8gc2xlZXAiKTsKKyAgICAgICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgd2FpdFRpbWUpOworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHdha2luZyB1cCIpOworICAgICAgICB9CisgICAgfQorICAgIC8vIHJlbGVhc2UgZGVsYXllZCBjb21tYW5kcyB3YWtlIGxvY2sgYmVmb3JlIHF1aXR0aW5nCisgICAgaWYgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOworICAgIH0KKyAgICBtTG9jay51bmxvY2soKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvQ29tbWFuZFRocmVhZCAlcCBEdW1wXG4iLCB0aGlzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOworICAgIGlmICghbG9ja2VkKSB7CisgICAgICAgIFN0cmluZzggcmVzdWx0MihrQ21kRGVhZGxvY2tlZFN0cmluZyk7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQyLnN0cmluZygpLCByZXN1bHQyLnNpemUoKSk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBDb21tYW5kczpcbiIpOworICAgIHJlc3VsdCA9IFN0cmluZzgoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICBDb21tYW5kIFRpbWUgICAgICAgIFdhaXQgcFBhcmFtXG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0NvbW1hbmRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdWRpb0NvbW1hbmRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiICBMYXN0IENvbW1hbmRcbiIpOworICAgIGlmIChtTGFzdENvbW1hbmQgIT0gMCkgeworICAgICAgICBtTGFzdENvbW1hbmQtPmR1bXAoYnVmZmVyLCBTSVpFKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAgbm9uZVxuIik7CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RBUlRfVE9ORTsKKyAgICBzcDxUb25lRGF0YT4gZGF0YSA9IG5ldyBUb25lRGF0YSgpOworICAgIGRhdGEtPm1UeXBlID0gdHlwZTsKKyAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0YXJ0IHR5cGUgJWQsIHN0cmVhbSAlZCIsIHR5cGUsIHN0cmVhbSk7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BUb25lQ29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9UT05FOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdG9wIik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1ZPTFVNRTsKKyAgICBzcDxWb2x1bWVEYXRhPiBkYXRhID0gbmV3IFZvbHVtZURhdGEoKTsKKyAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOworICAgIGRhdGEtPm1Wb2x1bWUgPSB2b2x1bWU7CisgICAgZGF0YS0+bUlPID0gb3V0cHV0OworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgb3V0cHV0ICVkIiwKKyAgICAgICAgICAgIHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1BBUkFNRVRFUlM7CisgICAgc3A8UGFyYW1ldGVyc0RhdGE+IGRhdGEgPSBuZXcgUGFyYW1ldGVyc0RhdGEoKTsKKyAgICBkYXRhLT5tSU8gPSBpb0hhbmRsZTsKKyAgICBkYXRhLT5tS2V5VmFsdWVQYWlycyA9IFN0cmluZzgoa2V5VmFsdWVQYWlycyk7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgcGFyYW1ldGVyIHN0cmluZyAlcywgaW8gJWQgLGRlbGF5ICVkIiwKKyAgICAgICAgICAgIGtleVZhbHVlUGFpcnMsIGlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfVk9JQ0VfVk9MVU1FOworICAgIHNwPFZvaWNlVm9sdW1lRGF0YT4gZGF0YSA9IG5ldyBWb2ljZVZvbHVtZURhdGEoKTsKKyAgICBkYXRhLT5tVm9sdW1lID0gdm9sdW1lOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLCB2b2x1bWUpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX09VVFBVVDsKKyAgICBzcDxTdG9wT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBTdG9wT3V0cHV0RGF0YSgpOworICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKKyAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOworICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc3RvcCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9PVVRQVVQ7CisgICAgc3A8UmVsZWFzZU91dHB1dERhdGE+IGRhdGEgPSBuZXcgUmVsZWFzZU91dHB1dERhdGEoKTsKKyAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IENSRUFURV9BVURJT19QQVRDSDsKKyAgICBDcmVhdGVBdWRpb1BhdGNoRGF0YSAqZGF0YSA9IG5ldyBDcmVhdGVBdWRpb1BhdGNoRGF0YSgpOworICAgIGRhdGEtPm1QYXRjaCA9ICpwYXRjaDsKKyAgICBkYXRhLT5tSGFuZGxlID0gKmhhbmRsZTsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIGNyZWF0ZSBwYXRjaCBkZWxheSAlZCIsIGRlbGF5TXMpOworICAgIHN0YXR1cyA9IHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKmhhbmRsZSA9IGRhdGEtPm1IYW5kbGU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlQXVkaW9QYXRjaENvbW1hbmQoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFTEVBU0VfQVVESU9fUEFUQ0g7CisgICAgUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICpkYXRhID0gbmV3IFJlbGVhc2VBdWRpb1BhdGNoRGF0YSgpOworICAgIGRhdGEtPm1IYW5kbGUgPSBoYW5kbGU7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIHBhdGNoIGRlbGF5ICVkIiwgZGVsYXlNcyk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp1cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gVVBEQVRFX0FVRElPUE9SVF9MSVNUOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdXBkYXRlIGF1ZGlvIHBvcnQgbGlzdCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD5jb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gVVBEQVRFX0FVRElPUEFUQ0hfTElTVDsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHVwZGF0ZSBhdWRpbyBwYXRjaCBsaXN0Iik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX0FVRElPUE9SVF9DT05GSUc7CisgICAgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqZGF0YSA9IG5ldyBTZXRBdWRpb1BvcnRDb25maWdEYXRhKCk7CisgICAgZGF0YS0+bUNvbmZpZyA9ICpjb25maWc7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgcG9ydCBjb25maWcgZGVsYXkgJWQiLCBkZWxheU1zKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKK3sKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChjb21tYW5kLT5tTG9jayk7CisgICAgd2hpbGUgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7CisgICAgICAgIG5zZWNzX3QgdGltZU91dE5zID0ga0F1ZGlvQ29tbWFuZFRpbWVvdXROcyArIG1pbGxpc2Vjb25kcyhkZWxheU1zKTsKKyAgICAgICAgaWYgKGNvbW1hbmQtPm1Db25kLndhaXRSZWxhdGl2ZShjb21tYW5kLT5tTG9jaywgdGltZU91dE5zKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFRJTUVEX09VVDsKKyAgICAgICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbW1hbmQtPm1TdGF0dXM7Cit9CisKKy8vIGluc2VydENvbW1hbmRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6aW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zKQoreworICAgIHNzaXplX3QgaTsgIC8vIG5vdCBzaXplX3QgYmVjYXVzZSBpIHdpbGwgY291bnQgZG93biB0byAtMQorICAgIFZlY3RvciA8IHNwPEF1ZGlvQ29tbWFuZD4gPiByZW1vdmVkQ29tbWFuZHM7CisgICAgY29tbWFuZC0+bVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHMoZGVsYXlNcyk7CisKKyAgICAvLyBhY3F1aXJlIHdha2UgbG9jayB0byBtYWtlIHN1cmUgZGVsYXllZCBjb21tYW5kcyBhcmUgcHJvY2Vzc2VkCisgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICBhY3F1aXJlX3dha2VfbG9jayhQQVJUSUFMX1dBS0VfTE9DSywgbU5hbWUuc3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIHNhbWUgcGVuZGluZyBjb21tYW5kcyB3aXRoIGxhdGVyIHRpbWUgc3RhbXBzIGFuZCBlbGltaW5hdGUgdGhlbQorICAgIGZvciAoaSA9IG1BdWRpb0NvbW1hbmRzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQyID0gbUF1ZGlvQ29tbWFuZHNbaV07CisgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBubyBuZWVkIHRvIHNjYW4gdGhlIHJlc3Qgb2YgbUF1ZGlvQ29tbWFuZHMKKyAgICAgICAgaWYgKGNvbW1hbmQyLT5tVGltZSA8PSBjb21tYW5kLT5tVGltZSkgYnJlYWs7CisKKyAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHBhdGNoIG9yIHJlbGVhc2UgYXVkaW8gcGF0Y2ggY29tbWFuZHMgYXJlIGVxdWl2YWxlbnQKKyAgICAgICAgLy8gd2l0aCByZWdhcmQgdG8gZmlsdGVyaW5nCisgICAgICAgIGlmICgoY29tbWFuZC0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSB8fAorICAgICAgICAgICAgICAgIChjb21tYW5kLT5tQ29tbWFuZCA9PSBSRUxFQVNFX0FVRElPX1BBVENIKSkgeworICAgICAgICAgICAgaWYgKChjb21tYW5kMi0+bUNvbW1hbmQgIT0gQ1JFQVRFX0FVRElPX1BBVENIKSAmJgorICAgICAgICAgICAgICAgICAgICAoY29tbWFuZDItPm1Db21tYW5kICE9IFJFTEVBU0VfQVVESU9fUEFUQ0gpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZDItPm1Db21tYW5kICE9IGNvbW1hbmQtPm1Db21tYW5kKSBjb250aW51ZTsKKworICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7CisgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKKyAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEyID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChkYXRhLT5tSU8gIT0gZGF0YTItPm1JTykgYnJlYWs7CisgICAgICAgICAgICBBTE9HVigiQ29tcGFyaW5nIHBhcmFtZXRlciBjb21tYW5kICVzIHRvIG5ldyBjb21tYW5kICVzIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YTItPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtMiA9IEF1ZGlvUGFyYW1ldGVyKGRhdGEyLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhcmFtLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXk7CisgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBwYXJhbS5nZXRBdChqLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBhcmFtMi5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGtleTI7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUyOworICAgICAgICAgICAgICAgICAgICBwYXJhbTIuZ2V0QXQoaywga2V5MiwgdmFsdWUyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleTIgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIucmVtb3ZlKGtleTIpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgcGFyYW1ldGVyICVzIiwga2V5Mi5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIGFsbCBrZXlzIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQsIHJlbW92ZSB0aGUgY29tbWFuZC4KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXBkYXRlIHRoZSBrZXkgdmFsdWUgcGFpcnMKKyAgICAgICAgICAgIGlmIChwYXJhbTIuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGF0YTItPm1LZXlWYWx1ZVBhaXJzID0gcGFyYW0yLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21tYW5kLT5tVGltZSA9IGNvbW1hbmQyLT5tVGltZTsKKyAgICAgICAgICAgIC8vIGZvcmNlIGRlbGF5TXMgdG8gbm9uIDAgc28gdGhhdCBjb2RlIGJlbG93IGRvZXMgbm90IHJlcXVlc3QgdG8gd2FpdCBmb3IKKyAgICAgICAgICAgIC8vIGNvbW1hbmQgc3RhdHVzIGFzIHRoZSBjb21tYW5kIGlzIG5vdyBkZWxheWVkCisgICAgICAgICAgICBkZWxheU1zID0gMTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKKyAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEyID0gKFZvbHVtZURhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgaWYgKGRhdGEtPm1JTyAhPSBkYXRhMi0+bUlPKSBicmVhazsKKyAgICAgICAgICAgIGlmIChkYXRhLT5tU3RyZWFtICE9IGRhdGEyLT5tU3RyZWFtKSBicmVhazsKKyAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0IHZvbHVtZSBjb21tYW5kIG9uIG91dHB1dCAlZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtKTsKKyAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOworICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7CisgICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCisgICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAorICAgICAgICAgICAgZGVsYXlNcyA9IDE7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6CisgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgeworICAgICAgICAgICAgICAgIGhhbmRsZSA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIHBhdGNoID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZGxlID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlMjsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDI7CisgICAgICAgICAgICBpZiAoY29tbWFuZDItPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgeworICAgICAgICAgICAgICAgIGhhbmRsZTIgPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2gyID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCkpLT5tUGF0Y2g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbmRsZTIgPSAoKFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhbmRsZSAhPSBoYW5kbGUyKSBicmVhazsKKyAgICAgICAgICAgIC8qIEZpbHRlciBDUkVBVEVfQVVESU9fUEFUQ0ggY29tbWFuZHMgb25seSB3aGVuIHRoZXkgYXJlIGlzc3VlZCBmb3IKKyAgICAgICAgICAgICAgIHNhbWUgb3V0cHV0LiAqLworICAgICAgICAgICAgaWYoIChjb21tYW5kLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpICYmCisgICAgICAgICAgICAgICAgKGNvbW1hbmQyLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpICkgeworICAgICAgICAgICAgICAgIGJvb2wgaXNPdXRwdXREaWZmID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLm51bV9zb3VyY2VzID09IHBhdGNoMi5udW1fc291cmNlcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGNvdW50ID0gMDsgY291bnQgPCBwYXRjaC5udW1fc291cmNlczsgY291bnQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLnNvdXJjZXNbY291bnRdLmlkICE9IHBhdGNoMi5zb3VyY2VzW2NvdW50XS5pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0cHV0RGlmZiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzT3V0cHV0RGlmZikKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgJXMgYXVkaW8gcGF0Y2ggY29tbWFuZCBmb3IgaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgIChjb21tYW5kLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpID8gImNyZWF0ZSIgOiAicmVsZWFzZSIsIGhhbmRsZSk7CisgICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKKyAgICAgICAgICAgIGNvbW1hbmQtPm1UaW1lID0gY29tbWFuZDItPm1UaW1lOworICAgICAgICAgICAgLy8gZm9yY2UgZGVsYXlNcyB0byBub24gMCBzbyB0aGF0IGNvZGUgYmVsb3cgZG9lcyBub3QgcmVxdWVzdCB0byB3YWl0IGZvcgorICAgICAgICAgICAgLy8gY29tbWFuZCBzdGF0dXMgYXMgdGhlIGNvbW1hbmQgaXMgbm93IGRlbGF5ZWQKKyAgICAgICAgICAgIGRlbGF5TXMgPSAxOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBUlRfVE9ORToKKyAgICAgICAgY2FzZSBTVE9QX1RPTkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJlbW92ZSBmaWx0ZXJlZCBjb21tYW5kcworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVtb3ZlZENvbW1hbmRzLnNpemUoKTsgaisrKSB7CisgICAgICAgIC8vIHJlbW92ZWQgY29tbWFuZHMgYWx3YXlzIGhhdmUgdGltZSBzdGFtcHMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgY29tbWFuZAorICAgICAgICBmb3IgKHNpemVfdCBrID0gaSArIDE7IGsgPCBtQXVkaW9Db21tYW5kcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzW2tdLmdldCgpID09IHJlbW92ZWRDb21tYW5kc1tqXS5nZXQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzdXBwcmVzc2luZyBjb21tYW5kOiAlZCIsIG1BdWRpb0NvbW1hbmRzW2tdLT5tQ29tbWFuZCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZHMucmVtb3ZlQXQoayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmVtb3ZlZENvbW1hbmRzLmNsZWFyKCk7CisKKyAgICAvLyBEaXNhYmxlIHdhaXQgZm9yIHN0YXR1cyBpZiBkZWxheSBpcyBub3QgMAorICAgIGlmIChkZWxheU1zICE9IDApIHsKKyAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbnNlcnQgY29tbWFuZCBhdCB0aGUgcmlnaHQgcGxhY2UgYWNjb3JkaW5nIHRvIGl0cyB0aW1lIHN0YW1wCisgICAgQUxPR1YoImluc2VydGluZyBjb21tYW5kOiAlZCBhdCBpbmRleCAlemQsIG51bSBjb21tYW5kcyAlenUiLAorICAgICAgICAgICAgY29tbWFuZC0+bUNvbW1hbmQsIGkrMSwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpKTsKKyAgICBtQXVkaW9Db21tYW5kcy5pbnNlcnRBdChjb21tYW5kLCBpICsgMSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmV4aXQoKQoreworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQ6OmV4aXQiKTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgICAgIHJlcXVlc3RFeGl0KCk7CisgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIH0KKyAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgJTAyZCAgICAgICUwNmQuJTAzZCAgJTAxdSAgICAlcFxuIiwKKyAgICAgICAgICAgIG1Db21tYW5kLAorICAgICAgICAgICAgKGludCluczJzKG1UaW1lKSwKKyAgICAgICAgICAgIChpbnQpbnMybXMobVRpbWUpJTEwMDAsCisgICAgICAgICAgICBtV2FpdFN0YXR1cywKKyAgICAgICAgICAgIG1QYXJhbS5nZXQoKSk7Cit9CisKKy8qKioqKioqIGhlbHBlcnMgZm9yIHRoZSBzZXJ2aWNlX29wcyBjYWxsYmFja3MgZGVmaW5lZCBiZWxvdyAqKioqKioqKiovCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5wYXJhbWV0ZXJzQ29tbWFuZChpb0hhbmRsZSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKK30KKworaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9sdW1lQ29tbWFuZChzdHJlYW0sIHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgZGVsYXlNcyk7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKHRvbmUgIT0gQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04pIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCB0b25lIHJlcXVlc3RlZCAoJWQpIiwgdG9uZSk7CisgICAgfQorICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCBzdHJlYW0gKCVkKSByZXF1ZXN0ZWQgZm9yIHRvbmUgJWQiLCBzdHJlYW0sCisgICAgICAgICAgICB0b25lKTsKKyAgICB9CisgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjpUT05FX1NVUF9DQUxMX1dBSVRJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BUb25lKCkKK3sKKyAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdG9wVG9uZUNvbW1hbmQoKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gKGludCltQXVkaW9Db21tYW5kVGhyZWFkLT52b2ljZVZvbHVtZUNvbW1hbmQodm9sdW1lLCBkZWxheU1zKTsKK30KKworZXh0ZXJuICJDIiB7CithdWRpb19tb2R1bGVfaGFuZGxlX3QgYXBzX2xvYWRfaHdfbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2R1cF9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpOworaW50IGFwc19jbG9zZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2ludCBhcHNfc3VzcGVuZF9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2ludCBhcHNfcmVzdG9yZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcyBfX3VudXNlZCk7CithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKTsKK2ludCBhcHNfY2xvc2VfaW5wdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworaW50IGFwc19pbnZhbGlkYXRlX3N0cmVhbSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CitpbnQgYXBzX21vdmVfZWZmZWN0cyh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0X291dHB1dCk7CitjaGFyICogYXBzX2dldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzKTsKK3ZvaWQgYXBzX3NldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3ZfcGFpcnMsIGludCBkZWxheV9tcyk7CitpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcyk7CitpbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSk7CitpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpOworfTsKKworbmFtZXNwYWNlIHsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGFwc19vcHMgPSB7CisgICAgICAgIC5vcGVuX291dHB1dCAgICAgICAgICAgPSBhcHNfb3Blbl9vdXRwdXQsCisgICAgICAgIC5vcGVuX2R1cGxpY2F0ZV9vdXRwdXQgPSBhcHNfb3Blbl9kdXBfb3V0cHV0LAorICAgICAgICAuY2xvc2Vfb3V0cHV0ICAgICAgICAgID0gYXBzX2Nsb3NlX291dHB1dCwKKyAgICAgICAgLnN1c3BlbmRfb3V0cHV0ICAgICAgICA9IGFwc19zdXNwZW5kX291dHB1dCwKKyAgICAgICAgLnJlc3RvcmVfb3V0cHV0ICAgICAgICA9IGFwc19yZXN0b3JlX291dHB1dCwKKyAgICAgICAgLm9wZW5faW5wdXQgICAgICAgICAgICA9IGFwc19vcGVuX2lucHV0LAorICAgICAgICAuY2xvc2VfaW5wdXQgICAgICAgICAgID0gYXBzX2Nsb3NlX2lucHV0LAorICAgICAgICAuc2V0X3N0cmVhbV92b2x1bWUgICAgID0gYXBzX3NldF9zdHJlYW1fdm9sdW1lLAorICAgICAgICAuaW52YWxpZGF0ZV9zdHJlYW0gICAgID0gYXBzX2ludmFsaWRhdGVfc3RyZWFtLAorICAgICAgICAuc2V0X3BhcmFtZXRlcnMgICAgICAgID0gYXBzX3NldF9wYXJhbWV0ZXJzLAorICAgICAgICAuZ2V0X3BhcmFtZXRlcnMgICAgICAgID0gYXBzX2dldF9wYXJhbWV0ZXJzLAorICAgICAgICAuc3RhcnRfdG9uZSAgICAgICAgICAgID0gYXBzX3N0YXJ0X3RvbmUsCisgICAgICAgIC5zdG9wX3RvbmUgICAgICAgICAgICAgPSBhcHNfc3RvcF90b25lLAorICAgICAgICAuc2V0X3ZvaWNlX3ZvbHVtZSAgICAgID0gYXBzX3NldF92b2ljZV92b2x1bWUsCisgICAgICAgIC5tb3ZlX2VmZmVjdHMgICAgICAgICAgPSBhcHNfbW92ZV9lZmZlY3RzLAorICAgICAgICAubG9hZF9od19tb2R1bGUgICAgICAgID0gYXBzX2xvYWRfaHdfbW9kdWxlLAorICAgICAgICAub3Blbl9vdXRwdXRfb25fbW9kdWxlID0gYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSwKKyAgICAgICAgLm9wZW5faW5wdXRfb25fbW9kdWxlICA9IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSwKKyAgICB9OworfTsgLy8gbmFtZXNwYWNlIDx1bm5hbWVkPgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTY4YWIxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTAsMCArMSw1MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAorCisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlIDoKKyAgICBwdWJsaWMgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+LAorICAgIHB1YmxpYyBCbkF1ZGlvUG9saWN5U2VydmljZSwKKyAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK3sKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+OworCitwdWJsaWM6CisgICAgLy8gZm9yIEJpbmRlclNlcnZpY2UKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0U2VydmljZU5hbWUoKSBBTkRST0lEX0FQSSB7IHJldHVybiAibWVkaWEuYXVkaW9fcG9saWN5IjsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAvLworICAgIC8vIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpCisgICAgLy8KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgLy8gUmVmQmFzZQorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKKworICAgIC8vCisgICAgLy8gSGVscGVycyBmb3IgdGhlIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgaW1wbGVtZW50YXRpb24uCisgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBmb3IgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQKKyAgICAvLyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIHBvbGljeSBzZXJ2aWNlLgorICAgIC8vCisgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOworICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmNvbmZpZyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgICAgICAgICAgc3RhdHVzX3QgY2xpZW50Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRSZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKworICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKTsKKyAgICAgICAgICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisKK3ByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKSBBTkRST0lEX0FQSTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb1BvbGljeVNlcnZpY2UoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcEludGVybmFscyhpbnQgZmQpOworCisgICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKKyAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQorICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0CisgICAgLy8gb3Igc3RvcCB3aWxsIGNhdXNlIGNhbGxzIHRvIEF1ZGlvUG9saWN5U2VydmljZSBhbmQgYW4gYXR0ZW1wdCB0byBsb2NrIG1Mb2NrLgorICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZworICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KKyAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kOworICAgIHB1YmxpYzoKKworICAgICAgICAvLyBjb21tYW5kcyBmb3IgdG9uZSBBdWRpb0NvbW1hbmQKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBTVEFSVF9UT05FLAorICAgICAgICAgICAgU1RPUF9UT05FLAorICAgICAgICAgICAgU0VUX1ZPTFVNRSwKKyAgICAgICAgICAgIFNFVF9QQVJBTUVURVJTLAorICAgICAgICAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKKyAgICAgICAgICAgIFNUT1BfT1VUUFVULAorICAgICAgICAgICAgUkVMRUFTRV9PVVRQVVQsCisgICAgICAgICAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCisgICAgICAgICAgICBSRUxFQVNFX0FVRElPX1BBVENILAorICAgICAgICAgICAgVVBEQVRFX0FVRElPUE9SVF9MSVNULAorICAgICAgICAgICAgVVBEQVRFX0FVRElPUEFUQ0hfTElTVCwKKyAgICAgICAgICAgIFNFVF9BVURJT1BPUlRfQ09ORklHLAorICAgICAgICB9OworCisgICAgICAgIEF1ZGlvQ29tbWFuZFRocmVhZCAoU3RyaW5nOCBuYW1lLCBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKTsKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Db21tYW5kVGhyZWFkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworCisgICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscworICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CisgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKKworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wVG9uZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb21tYW5kKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoQ29tbWFuZChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUF1ZGlvUG9ydExpc3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUF1ZGlvUGF0Y2hMaXN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZERhdGE7CisKKyAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgcmVxdWVzdGVkIHRvbmUgcGxheWJhY2sgZXZlbnQKKyAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kOiBwdWJsaWMgUmVmQmFzZSB7CisKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9Db21tYW5kKCkKKyAgICAgICAgICAgIDogbUNvbW1hbmQoLTEpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpIHt9CisKKyAgICAgICAgICAgIHZvaWQgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKworICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNUQVJUX1RPTkUsIFNUT1BfVE9ORSAuLi4KKyAgICAgICAgICAgIG5zZWNzX3QgbVRpbWU7ICAvLyB0aW1lIHN0YW1wCisgICAgICAgICAgICBNdXRleCBtTG9jazsgICAgLy8gbXV0ZXggYXNzb2NpYXRlZCB0byBtQ29uZAorICAgICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KKyAgICAgICAgICAgIHN0YXR1c190IG1TdGF0dXM7IC8vIGNvbW1hbmQgc3RhdHVzCisgICAgICAgICAgICBib29sIG1XYWl0U3RhdHVzOyAvLyB0cnVlIGlmIGNhbGxlciBpcyB3YWl0aW5nIGZvciBzdGF0dXMKKyAgICAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZERhdGE+IG1QYXJhbTsgICAgIC8vIGNvbW1hbmQgc3BlY2lmaWMgcGFyYW1ldGVyIGRhdGEKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvQ29tbWFuZERhdGEoKSB7fQorICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICBBdWRpb0NvbW1hbmREYXRhKCkge30KKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUb25lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIG1UeXBlOyAvLyB0b25lIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsgICAgLy8gc3RyZWFtIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBWb2x1bWVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgICAgICAgICBmbG9hdCBtVm9sdW1lOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFBhcmFtZXRlcnNEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87CisgICAgICAgICAgICBTdHJpbmc4IG1LZXlWYWx1ZVBhaXJzOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFZvaWNlVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgZmxvYXQgbVZvbHVtZTsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBTdG9wT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOworICAgICAgICAgICAgaW50IG1TZXNzaW9uOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFJlbGVhc2VBdWRpb1BhdGNoRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBTZXRBdWRpb1BvcnRDb25maWdEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbUNvbmZpZzsKKyAgICAgICAgfTsKKworICAgICAgICBNdXRleCAgIG1Mb2NrOworICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CisgICAgICAgIFZlY3RvciA8IHNwPEF1ZGlvQ29tbWFuZD4gPiBtQXVkaW9Db21tYW5kczsgLy8gbGlzdCBvZiBwZW5kaW5nIGNvbW1hbmRzCisgICAgICAgIFRvbmVHZW5lcmF0b3IgKm1wVG9uZUdlbmVyYXRvcjsgICAgIC8vIHRoZSB0b25lIGdlbmVyYXRvcgorICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IG1MYXN0Q29tbWFuZDsgICAgICAvLyBsYXN0IHByb2Nlc3NlZCBjb21tYW5kICh1c2VkIGJ5IGR1bXApCisgICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCisgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CisgICAgfTsKKworICAgIGNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50IDogcHVibGljIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCisgICAgeworICAgICBwdWJsaWM6CisgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50KEF1ZGlvUG9saWN5U2VydmljZSAqc2VydmljZSkgOiBtQXVkaW9Qb2xpY3lTZXJ2aWNlKHNlcnZpY2UpIHt9CisgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5Q2xpZW50KCkge30KKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBIVyBtb2R1bGUgZnVuY3Rpb25zCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gbG9hZHMgYSBIVyBtb2R1bGUuCisgICAgICAgIHZpcnR1YWwgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBvdXRwdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBvcGVucyBhbiBhdWRpbyBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMuIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGNhbiBpbmRpY2F0ZSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzCisgICAgICAgIC8vIGluIGNhc2UgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGhhcyBubyBzcGVjaWZpYyByZXF1aXJlbWVudHMgZm9yIHRoZSBvdXRwdXQgYmVpbmcgb3BlbmVkLgorICAgICAgICAvLyBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgcGFyYW1ldGVyIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgYnkgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uCisgICAgICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgIC8vIGNyZWF0ZXMgYSBzcGVjaWFsIG91dHB1dCB0aGF0IGlzIGR1cGxpY2F0ZWQgdG8gdGhlIHR3byBvdXRwdXRzIHBhc3NlZCBhcyBhcmd1bWVudHMuIFRoZSBkdXBsaWNhdGlvbiBpcyBwZXJmb3JtZWQgYnkKKyAgICAgICAgLy8gYSBzcGVjaWFsIG1peGVyIHRocmVhZCBpbiB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7CisgICAgICAgIC8vIGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIC8vIHN1c3BlbmRzIHRoZSBvdXRwdXQuIFdoZW4gYW4gb3V0cHV0IGlzIHN1c3BlbmRlZCwgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSBpcyBwbGFjZWQgaW4KKyAgICAgICAgLy8gc3RhbmRieSBhbmQgdGhlIEF1ZGlvVHJhY2tzIGF0dGFjaGVkIHRvIHRoZSBtaXhlciB0aHJlYWQgYXJlIHN0aWxsIHByb2Nlc3NlZCBidXQgdGhlIG91dHB1dCBtaXggaXMgZGlzY2FyZGVkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICAgICAgLy8gcmVzdG9yZXMgYSBzdXNwZW5kZWQgb3V0cHV0LgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBpbnB1dCBDb250cm9sIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIG9wZW5zIGFuIGF1ZGlvIGlucHV0CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAvLyBjbG9zZXMgYW4gYXVkaW8gaW5wdXQKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gbWlzYyBjb250cm9sIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIHNldCBhIHN0cmVhbSB2b2x1bWUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQuIEZvciB0aGUgc2FtZSB1c2VyIHNldHRpbmcsIGEgZ2l2ZW4gc3RyZWFtIHR5cGUgY2FuIGhhdmUgZGlmZmVyZW50IHZvbHVtZXMKKyAgICAgICAgLy8gZm9yIGVhY2ggb3V0cHV0IChkZXN0aW5hdGlvbiBkZXZpY2UpIGl0IGlzIGF0dGFjaGVkIHRvLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8gaW52YWxpZGF0ZSBhIHN0cmVhbSB0eXBlLCBjYXVzaW5nIGEgcmVyb3V0ZSB0byBhbiB1bnNwZWNpZmllZCBuZXcgb3V0cHV0CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gc2VuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0byBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UuCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOworCisgICAgICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZworICAgICAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOworCisgICAgICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgICAgICAvLyBtb3ZlIGVmZmVjdCB0byB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCk7CisKKyAgICAgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKworICAgICAgICAvKiBSZWxlYXNlIGEgcGF0Y2ggKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworCisgICAgICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisKKyAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CisKKyAgICAgcHJpdmF0ZToKKyAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICptQXVkaW9Qb2xpY3lTZXJ2aWNlOworICAgIH07CisKKyAgICAvLyAtLS0gTm90aWZpY2F0aW9uIENsaWVudCAtLS0KKyAgICBjbGFzcyBOb3RpZmljYXRpb25DbGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Ob3RpZmljYXRpb25DbGllbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKworICAgICAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IE5vdGlmaWNhdGlvbkNsaWVudCYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudCYgb3BlcmF0b3IgPSAoY29uc3QgTm90aWZpY2F0aW9uQ2xpZW50Jik7CisKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiAgICAgICAgbVNlcnZpY2U7CisgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7CisgICAgfTsKKworICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgorICAgIHN0YXR1c190IGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCk7CisKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7ICAgIC8vIHByZXZlbnRzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIEF1ZGlvUG9saWN5IG1hbmFnZXIgZnVuY3Rpb25zIGNoYW5naW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgIG9yIHJvdXRpbmcKKyAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKKyAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAorICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKKyAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OworICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlICptQXVkaW9Qb2xpY3lNYW5hZ2VyOworICAgIEF1ZGlvUG9saWN5Q2xpZW50ICptQXVkaW9Qb2xpY3lDbGllbnQ7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHVpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisKKyAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeS5jb25mIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4M2ZlZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeS5jb25mCkBAIC0wLDAgKzEsMTQ1IEBACisjCisjIFRlbXBsYXRlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyMKKworIyBHbG9iYWwgY29uZmlndXJhdGlvbiBzZWN0aW9uOgorIyAtIGJlZm9yZSBhdWRpbyBIQUwgdmVyc2lvbiAzLjA6CisjICAgbGlzdHMgaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIGFsd2F5cyBwcmVzZW50IG9uIHRoZSBkZXZpY2UKKyMgICBhcyB3ZWxsIGFzIHRoZSBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCisjICAgRGV2aWNlcyBhcmUgZGVzaWduYXRlZCBieSBhIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlbnVtIGluIGF1ZGlvLmgKKyMKKyMgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKKyMgICAgYXR0YWNoZWRfb3V0cHV0X2RldmljZXMgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisjICAgIGRlZmF1bHRfb3V0cHV0X2RldmljZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyMgICAgYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN8QVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyMgIH0KKyMKKyMgLSBhZnRlciBhbmQgaW5jbHVkaW5nIGF1ZGlvIEhBTCAzLjAgdGhlIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24gaXMgaW5jbHVkZWQgaW4gZWFjaAorIyAgIGhhcmR3YXJlIG1vZHVsZSBzZWN0aW9uLgorIyAgIGl0IGFsc28gaW5jbHVkZXMgdGhlIGF1ZGlvIEhBTCB2ZXJzaW9uIG9mIHRoaXMgaHcgbW9kdWxlOgorIyAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24geworIyAgICAuLi4KKyMgICAgIGF1ZGlvX2hhbF92ZXJzaW9uIDxtYWpvci5taW5vcj4gICMgYXVkaW8gSEFMIHZlcnNpb24gaW4gZS5nLiAzLjAKKyMgIH0KKyMgICBvdGhlciBhdHRyaWJ1dGVzIChhdHRhY2hlZCBkZXZpY2VzLCBkZWZhdWx0IGRldmljZSkgaGF2ZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKKyMgICBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uIG9mIGVhY2ggaGFyZHdhcmUgbW9kdWxlCisKKworIyBhdWRpbyBoYXJkd2FyZSBtb2R1bGUgc2VjdGlvbjogY29udGFpbnMgZGVzY3JpcHRvcnMgZm9yIGFsbCBhdWRpbyBodyBtb2R1bGVzIHByZXNlbnQgb24gdGhlCisjIGRldmljZS4gRWFjaCBodyBtb2R1bGUgbm9kZSBpcyBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBodyBtb2R1bGUgbGlicmFyeSBiYXNlIG5hbWUuCisjIEZvciBpbnN0YW5jZSwgInByaW1hcnkiIGNvcnJlc3BvbmRzIHRvIGF1ZGlvLnByaW1hcnkuPGRldmljZT4uc28uCisjIFRoZSAicHJpbWFyeSIgbW9kdWxlIGlzIG1hbmRhdG9yeSBhbmQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBvdXRwdXQgd2l0aAorIyBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIGZsYWcuCisjIEVhY2ggbW9kdWxlIGRlc2NyaXB0b3IgY29udGFpbnMgb25lIG9yIG1vcmUgb3V0cHV0IHByb2ZpbGUgZGVzY3JpcHRvcnMgYW5kIHplcm8gb3IgbW9yZQorIyBpbnB1dCBwcm9maWxlIGRlc2NyaXB0b3JzLiBFYWNoIHByb2ZpbGUgbGlzdHMgYWxsIHRoZSBwYXJhbWV0ZXJzIHN1cHBvcnRlZCBieSBhIGdpdmVuIG91dHB1dAorIyBvciBpbnB1dCBzdHJlYW0gY2F0ZWdvcnkuCisjIFRoZSAiY2hhbm5lbF9tYXNrcyIsICJmb3JtYXRzIiwgImRldmljZXMiIGFuZCAiZmxhZ3MiIGFyZSBzcGVjaWZpZWQgdXNpbmcgc3RyaW5ncyBjb3JyZXNwb25kaW5nCisjIHRvIGVudW1zIGluIGF1ZGlvLmggYW5kIGF1ZGlvX3BvbGljeS5oLiBUaGV5IGFyZSBjb25jYXRlbmF0ZWQgYnkgdXNlIG9mICJ8IiB3aXRob3V0IHNwYWNlIG9yICJcbiIuCisjCisjIEZvciBhdWRpbyBIQUwgdmVyc2lvbiBwb3N0ZXJpb3IgdG8gMy4wIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgb3Igc3ViIHNlY3Rpb25zIGNhbiBiZSBwcmVzZW50IGluCisjIGEgaHcgbW9kdWxlIHNlY3Rpb246CisjIC0gQSAiZ2xvYmFsX2NvbmZpZ3VyYXRpb24iIHNlY3Rpb246IHNlZSBhYm92ZQorIyAtIE9wdGlvbmFsbHkgYSAiZGV2aWNlcyIgc2VjdGlvbjoKKyMgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGVzY3JpcHRvcnMgZm9yIGF1ZGlvIGRldmljZXMgd2l0aCBhdHRyaWJ1dGVzIGxpa2UgYW4gYWRkcmVzcyBvciBhCisjICAgZ2FpbiBjb250cm9sbGVyLiBUaGUgc3ludGF4IGZvciB0aGUgZGV2aWNlcyBzZWN0aW9uIGFuZCBkZXZpY2UgZGVzY3JpcHRvciBpcyBhcyBmb2xsb3dzOgorIyAgICBkZXZpY2VzIHsKKyMgICAgICA8ZGV2aWNlIG5hbWU+IHsgICAgICAgICAgICAgICMgPGRldmljZSBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlCisjICAgICAgICB0eXBlIDxkZXZpY2UgdHlwZT4gICAgICAgICAjIDxkZXZpY2UgdHlwZT4gZS5nLiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyMgICAgICAgIGFkZHJlc3MgPGFkZHJlc3M+ICAgICAgICAgICMgb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQgaW4gbGVuZ3RoCisjICAgICAgfQorIyAgICB9CisjIC0gb25lIG9yIG1vcmUgImdhaW5zIiBzZWN0aW9ucyBjYW4gYmUgcHJlc2VudCBpbiBhIGRldmljZSBkZXNjcmlwdG9yIHNlY3Rpb24uCisjICAgSWYgcHJlc2VudCwgdGhleSBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIGdhaW4gY29udHJvbGxlcnMgYXR0YWNoZWQgdG8gdGhpcyBpbnB1dCBvcgorIyAgIG91dHB1dCBkZXZpY2UuIGUuZy4gOgorIyAgIDxkZXZpY2UgbmFtZT4geyAgICAgICAgICAgICAgICAgICMgPGRldmljZSBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlCisjICAgICB0eXBlIDxkZXZpY2UgdHlwZT4gICAgICAgICAgICAgIyA8ZGV2aWNlIHR5cGU+IGUuZy4gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisjICAgICBhZGRyZXNzIDxhZGRyZXNzPiAgICAgICAgICAgICAgIyBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NCBpbiBsZW5ndGgKKyMgICAgIGdhaW5zIHsKKyMgICAgICAgPGdhaW4gbmFtZT4geworIyAgICAgICAgIG1vZGUgPGdhaW4gbW9kZXMgc3VwcG9ydGVkPiAgICAgICAgICAgICAgIyBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUworIyAgICAgICAgIGNoYW5uZWxfbWFzayA8Y29udHJvbGxlZCBjaGFubmVscz4gICAgICAgIyBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMKKyMgICAgICAgICBtaW5fdmFsdWVfbUIgPG1pbiB2YWx1ZSBpbiBtaWxsaWJlbD4KKyMgICAgICAgICBtYXhfdmFsdWVfbUIgPG1heCB2YWx1ZSBpbiBtaWxsaWJlbD4KKyMgICAgICAgICBkZWZhdWx0X3ZhbHVlX21CIDxkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsPgorIyAgICAgICAgIHN0ZXBfdmFsdWVfbUIgPHN0ZXAgdmFsdWUgaW4gbWlsbGliZWw+CisjICAgICAgICAgbWluX3JhbXBfbXMgPG1pbiBkdXJhdGlvbiBpbiBtcz4gICAgICAgICAjIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QCisjICAgICAgICAgbWF4X3JhbXBfbXMgPG1heCBkdXJhdGlvbiBtcz4gICAgICAgICAgICAjIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QCisjICAgICAgIH0KKyMgICAgIH0KKyMgICB9CisjIC0gd2hlbiBhIGRldmljZSBkZXNjcmlwdG9yIGlzIHByZXNlbnQsIG91dHB1dCBhbmQgaW5wdXQgcHJvZmlsZXMgY2FuIHJlZmVyIHRvIHRoaXMgZGV2aWNlIGJ5CisjIGl0cyBuYW1lIGluIHRoZWlyICJkZXZpY2VzIiBzZWN0aW9uIGluc3RlYWQgb2Ygc3BlY2lmeWluZyBhIGRldmljZSB0eXBlLiBlLmcuIDoKKyMgICBvdXRwdXRzIHsKKyMgICAgIHByaW1hcnkgeworIyAgICAgICBzYW1wbGluZ19yYXRlcyA0NDEwMAorIyAgICAgICBjaGFubmVsX21hc2tzIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTworIyAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisjICAgICAgIGRldmljZXMgPGRldmljZSBuYW1lPgorIyAgICAgICBmbGFncyBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZCisjICAgICB9CisjICAgfQorIyBzYW1wbGUgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBiZWxvdworCithdWRpb19od19tb2R1bGVzIHsKKyAgcHJpbWFyeSB7CisgICAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24geworICAgICAgYXR0YWNoZWRfb3V0cHV0X2RldmljZXMgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisgICAgICBkZWZhdWx0X291dHB1dF9kZXZpY2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisgICAgICBhdHRhY2hlZF9pbnB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQworICAgICAgYXVkaW9faGFsX3ZlcnNpb24gMy4wCisgICAgfQorICAgIGRldmljZXMgeworICAgICAgc3BlYWtlciB7CisgICAgICAgIHR5cGUgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisgICAgICAgIGdhaW5zIHsKKyAgICAgICAgICBnYWluXzEgeworICAgICAgICAgICAgbW9kZSBBVURJT19HQUlOX01PREVfSk9JTlQKKyAgICAgICAgICAgIG1pbl92YWx1ZV9tQiAtODQwMAorICAgICAgICAgICAgbWF4X3ZhbHVlX21CIDQwMDAKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWVfbUIgMAorICAgICAgICAgICAgc3RlcF92YWx1ZV9tQiAxMDAKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgb3V0cHV0cyB7CisgICAgICBwcmltYXJ5IHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKKyAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICBkZXZpY2VzIHNwZWFrZXIKKyAgICAgICAgZmxhZ3MgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWQorICAgICAgfQorICAgIH0KKyAgICBpbnB1dHMgeworICAgICAgcHJpbWFyeSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGVzIDgwMDB8MTYwMDAKKyAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX0lOX01PTk8KKyAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICBkZXZpY2VzIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQworICAgICAgfQorICAgIH0KKyAgfQorICByX3N1Ym1peCB7CisgICAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24geworICAgICAgYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorICAgICAgYXVkaW9faGFsX3ZlcnNpb24gMi4wCisgICAgfQorICAgIG91dHB1dHMgeworICAgICAgc3VibWl4IHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKKyAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICBkZXZpY2VzIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgICAgfQorICAgIH0KKyAgICBpbnB1dHMgeworICAgICAgc3VibWl4IHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKKyAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX0lOX1NURVJFTworICAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgIGRldmljZXMgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzVhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgRGVmaW5pdGlvbnMgZm9yIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgKGF1ZGlvX3BvbGljeS5jb25mKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NQVhfTEVOIDMyCisKKyNkZWZpbmUgQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFICIvc3lzdGVtL2V0Yy9hdWRpb19wb2xpY3kuY29uZiIKKyNkZWZpbmUgQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSAiL3ZlbmRvci9ldGMvYXVkaW9fcG9saWN5LmNvbmYiCisKKy8vIGdsb2JhbCBjb25maWd1cmF0aW9uCisjZGVmaW5lIEdMT0JBTF9DT05GSUdfVEFHICJnbG9iYWxfY29uZmlndXJhdGlvbiIKKworI2RlZmluZSBBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcgImF0dGFjaGVkX291dHB1dF9kZXZpY2VzIgorI2RlZmluZSBERUZBVUxUX09VVFBVVF9ERVZJQ0VfVEFHICJkZWZhdWx0X291dHB1dF9kZXZpY2UiCisjZGVmaW5lIEFUVEFDSEVEX0lOUFVUX0RFVklDRVNfVEFHICJhdHRhY2hlZF9pbnB1dF9kZXZpY2VzIgorI2RlZmluZSBTUEVBS0VSX0RSQ19FTkFCTEVEX1RBRyAic3BlYWtlcl9kcmNfZW5hYmxlZCIKKyNkZWZpbmUgQVVESU9fSEFMX1ZFUlNJT05fVEFHICJhdWRpb19oYWxfdmVyc2lvbiIKKworLy8gaHcgbW9kdWxlcyBkZXNjcmlwdGlvbnMKKyNkZWZpbmUgQVVESU9fSFdfTU9EVUxFX1RBRyAiYXVkaW9faHdfbW9kdWxlcyIKKworI2RlZmluZSBPVVRQVVRTX1RBRyAib3V0cHV0cyIKKyNkZWZpbmUgSU5QVVRTX1RBRyAiaW5wdXRzIgorCisjZGVmaW5lIFNBTVBMSU5HX1JBVEVTX1RBRyAic2FtcGxpbmdfcmF0ZXMiCisjZGVmaW5lIEZPUk1BVFNfVEFHICJmb3JtYXRzIgorI2RlZmluZSBDSEFOTkVMU19UQUcgImNoYW5uZWxfbWFza3MiCisjZGVmaW5lIERFVklDRVNfVEFHICJkZXZpY2VzIgorI2RlZmluZSBGTEFHU19UQUcgImZsYWdzIgorCisjZGVmaW5lIERZTkFNSUNfVkFMVUVfVEFHICJkeW5hbWljIiAvLyBzcGVjaWFsIHZhbHVlIGZvciAiY2hhbm5lbF9tYXNrcyIsICJzYW1wbGluZ19yYXRlcyIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiZm9ybWF0cyIgaW4gb3V0cHV0cyBkZXNjcmlwdG9ycyBpbmRpY2F0aW5nIHRoYXQgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgc2hvdWxkIGJlIHF1ZXJpZWQgYWZ0ZXIgb3BlbmluZyB0aGUgb3V0cHV0LgorCisjZGVmaW5lIERFVklDRVNfVEFHICJkZXZpY2VzIgorI2RlZmluZSBERVZJQ0VfVFlQRSAidHlwZSIKKyNkZWZpbmUgREVWSUNFX0FERFJFU1MgImFkZHJlc3MiCisKKyNkZWZpbmUgTUlYRVJTX1RBRyAibWl4ZXJzIgorI2RlZmluZSBNSVhFUl9UWVBFICJ0eXBlIgorI2RlZmluZSBNSVhFUl9UWVBFX01VWCAibXV4IgorI2RlZmluZSBNSVhFUl9UWVBFX01JWCAibWl4IgorCisjZGVmaW5lIEdBSU5TX1RBRyAiZ2FpbnMiCisjZGVmaW5lIEdBSU5fTU9ERSAibW9kZSIKKyNkZWZpbmUgR0FJTl9DSEFOTkVMUyAiY2hhbm5lbF9tYXNrIgorI2RlZmluZSBHQUlOX01JTl9WQUxVRSAibWluX3ZhbHVlX21CIgorI2RlZmluZSBHQUlOX01BWF9WQUxVRSAibWF4X3ZhbHVlX21CIgorI2RlZmluZSBHQUlOX0RFRkFVTFRfVkFMVUUgImRlZmF1bHRfdmFsdWVfbUIiCisjZGVmaW5lIEdBSU5fU1RFUF9WQUxVRSAic3RlcF92YWx1ZV9tQiIKKyNkZWZpbmUgR0FJTl9NSU5fUkFNUF9NUyAibWluX3JhbXBfbXMiCisjZGVmaW5lIEdBSU5fTUFYX1JBTVBfTVMgIm1heF9yYW1wX21zIgorCisKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX1BPTElDWV9DT05GX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDUxYmE2OTguLmUxODRkOTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMSwzICsxLDE3IEBACisjIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCiAjCkBAIC0yMCw2ICszNCw3IEBACiAgICAgYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBcCisgICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5jcHAgXAogICAgIGFwaTEvY2xpZW50Mi9CdXJzdENhcHR1cmUuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgXApAQCAtMzMsNiArNDgsNyBAQAogICAgIGRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBcCiAgICAgZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBcCiAgICAgZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcCBcCisgICAgZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIFwKICAgICBkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIFwKICAgICBndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBcCiAgICAgdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBcCkBAIC01Myw2ICs2OSw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgIHN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCisgICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAogICAgIGV4dGVybmFsL2pwZWcKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCmluZGV4IDdmZGYzMDQuLmJmZWY1MGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCkBAIC00Niw2ICs0Niw4IEBACiAgICAgICAgICAgICBkZXZpY2UgPSBuZXcgQ2FtZXJhMkRldmljZShjYW1lcmFJZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgICAgIGRldmljZSA9IG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCAwNmMxNjI2Li5mZDVhNDI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtMSwyNCArMSwyNCBAQAogLyoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2UiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIApAQCAtMzIsMTAgKzMyLDE1IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX3ZlbmRvcl90YWdzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmEuaD4KIAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYUNsaWVudC5oIgpAQCAtMTMwLDYgKzEzNSwxMiBAQAogICAgICAgICAgICAgbU1vZHVsZS0+c2V0X2NhbGxiYWNrcyh0aGlzKTsKICAgICAgICAgfQogCisgICAgICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworCisgICAgICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8yKSB7CisgICAgICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICAgICAgfQorCiAgICAgICAgIENhbWVyYURldmljZUZhY3Rvcnk6OnJlZ2lzdGVyU2VydmljZSh0aGlzKTsKICAgICB9CiB9CkBAIC0xNDEsNiArMTUyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIGdDYW1lcmFTZXJ2aWNlID0gTlVMTDsKIH0KIApAQCAtMTY4LDYgKzE4MCw5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1TZXJ2aWNlTG9jayk7CiAKKyAgICAgICAgICAgLyogUmVtb3ZlIGNhY2hlZCBwYXJhbWV0ZXJzIGZyb20gc2hpbSBjYWNoZSAqLworICAgICAgICAgICBtU2hpbVBhcmFtcy5yZW1vdmVJdGVtKGNhbWVyYUlkKTsKKwogICAgICAgICAgICAvKiBGaW5kIGFsbCBjbGllbnRzIHRoYXQgd2UgbmVlZCB0byBkaXNjb25uZWN0ICovCiAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50W2NhbWVyYUlkXS5wcm9tb3RlKCk7CiAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgIT0gTlVMTCkgewpAQCAtMTk2LDcgKzIxMSw3IEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCIlczogQWZ0ZXIgdW5wbHVnLCBkaXNjb25uZWN0ZWQgJWQgY2xpZW50cyIsCisgICAgICAgIEFMT0dWKCIlczogQWZ0ZXIgdW5wbHVnLCBkaXNjb25uZWN0ZWQgJXp1IGNsaWVudHMiLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNsaWVudHNUb0Rpc2Nvbm5lY3Quc2l6ZSgpKTsKICAgICB9CiAKQEAgLTIyMCwxMiArMjM1LDk5IEBACiAgICAgfQogCiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgc3RhdHVzX3QgcmMgPSBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKTsKKyAgICBzdGF0dXNfdCByYyA9IGZpbHRlckdldEluZm9FcnJvckNvZGUoCisgICAgICAgIG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pKTsKICAgICBjYW1lcmFJbmZvLT5mYWNpbmcgPSBpbmZvLmZhY2luZzsKICAgICBjYW1lcmFJbmZvLT5vcmllbnRhdGlvbiA9IGluZm8ub3JpZW50YXRpb247CiAgICAgcmV0dXJuIHJjOwogfQogCisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdlbmVyYXRlU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgc3RydWN0IENhbWVyYUluZm8gaW5mbzsKKyAgICBpZiAoKHJldCA9IGdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBzaGltSW5mbzsKKyAgICBpbnQzMl90IG9yaWVudGF0aW9uID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5mby5vcmllbnRhdGlvbik7CisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfT1JJRU5UQVRJT04sICZvcmllbnRhdGlvbiwgMSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdWludDhfdCBmYWNpbmcgPSAoaW5mby5mYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCkgPworICAgICAgICAgICAgQU5EUk9JRF9MRU5TX0ZBQ0lOR19GUk9OVCA6IEFORFJPSURfTEVOU19GQUNJTkdfQkFDSzsKKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX0xFTlNfRkFDSU5HLCAmZmFjaW5nLCAxKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHNoaW1QYXJhbXM7CisgICAgaWYgKChyZXQgPSBnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShjYW1lcmFJZCwgLypvdXQqLyZzaGltUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgLy8gRXJyb3IgbG9nZ2VkIGJ5IGNhbGxlZQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFZlY3RvcjxTaXplPiBzaXplczsKKyAgICBWZWN0b3I8U2l6ZT4ganBlZ1NpemVzOworICAgIFZlY3RvcjxpbnQzMl90PiBmb3JtYXRzOworICAgIGNvbnN0IGNoYXIqIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzOworICAgIHsKKyAgICAgICAgc2hpbVBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoLypvdXQqL3NpemVzKTsKKyAgICAgICAgc2hpbVBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cygvKm91dCovZm9ybWF0cyk7CisgICAgICAgIHNoaW1QYXJhbXMuZ2V0U3VwcG9ydGVkUGljdHVyZVNpemVzKC8qb3V0Ki9qcGVnU2l6ZXMpOworICAgIH0KKworICAgIC8vIEFsd2F5cyBpbmNsdWRlIElNUExFTUVOVEFUSU9OX0RFRklORUQKKyAgICBmb3JtYXRzLmFkZChIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworCisgICAgY29uc3Qgc2l6ZV90IElOVFNfUEVSX0NPTkZJRyA9IDQ7CisKKyAgICAvLyBCdWlsZCBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG1ldGFkYXRhCisgICAgc2l6ZV90IHN0cmVhbUNvbmZpZ1NpemUgPSAoc2l6ZXMuc2l6ZSgpICogZm9ybWF0cy5zaXplKCkgKyBqcGVnU2l6ZXMuc2l6ZSgpKSAqIElOVFNfUEVSX0NPTkZJRzsKKworICAgIFZlY3RvcjxpbnQzMl90PiBzdHJlYW1Db25maWdzOworICAgIHN0cmVhbUNvbmZpZ3Muc2V0Q2FwYWNpdHkoc3RyZWFtQ29uZmlnU2l6ZSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoZm9ybWF0c1tpXSk7CisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFkZChzaXplc1tqXS53aWR0aCk7CisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFkZChzaXplc1tqXS5oZWlnaHQpOworICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBqcGVnU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoanBlZ1NpemVzW2ldLndpZHRoKTsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoanBlZ1NpemVzW2ldLmhlaWdodCk7CisgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hcnJheSgpLCBzdHJlYW1Db25maWdTaXplKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZha2VNaW5GcmFtZXNbMF07CisgICAgLy8gVE9ETzogRml4bWUsIGRvbid0IGZha2UgbWluIGZyYW1lIGR1cmF0aW9ucy4KKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGZha2VNaW5GcmFtZXMsIDApKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludDY0X3QgZmFrZVN0YWxsc1swXTsKKyAgICAvLyBUT0RPOiBGaXhtZSwgZG9uJ3QgZmFrZSBzdGFsbCBkdXJhdGlvbnMuCisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGZha2VTdGFsbHMsIDApKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpjYW1lcmFJbmZvID0gc2hpbUluZm87CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pIHsKICAgICBpZiAoIWNhbWVyYUluZm8pIHsKQEAgLTIzOCwzNyArMzQwLDUxIEBACiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KIAotICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKLSAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgb25jZSBIQUwxIHNoaW0gaXMgaW4gcGxhY2UuCi0gICAgICAgIEFMT0dFKCIlczogT25seSBIQUwgbW9kdWxlIHZlcnNpb24gVjIgb3IgaGlnaGVyIHN1cHBvcnRzIHN0YXRpYyBtZXRhZGF0YSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCiAgICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSB7CiAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgaWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaW50IGZhY2luZzsKLSAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZykgPT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKLSAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgb25jZSBIQUwxIHNoaW0gaXMgaW4gcGxhY2UuCi0gICAgICAgIEFMT0dFKCIlczogSEFMMSBkb2Vzbid0IHN1cHBvcnQgc3RhdGljIG1ldGFkYXRhIHlldCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzAgfHwKKyAgICAgICAgICAgIGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xICkgeworICAgICAgICAvKioKKyAgICAgICAgICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgbW9kZSBmb3Igb2xkIEhBTHM6CisgICAgICAgICAqIC0gQ29udmVydCBDYW1lcmFJbmZvIGludG8gc3RhdGljIENhbWVyYU1ldGFkYXRhIHByb3BlcnRpZXMuCisgICAgICAgICAqIC0gUmV0cmlldmUgY2FjaGVkIENhbWVyYVBhcmFtZXRlcnMgZm9yIHRoaXMgY2FtZXJhLiAgSWYgbm9uZSBleGlzdCwKKyAgICAgICAgICogICBhdHRlbXB0IHRvIG9wZW4gQ2FtZXJhQ2xpZW50IGFuZCByZXRyaWV2ZSB0aGUgQ2FtZXJhUGFyYW1ldGVycy4KKyAgICAgICAgICogLSBDb252ZXJ0IGNhY2hlZCBDYW1lcmFQYXJhbWV0ZXJzIGludG8gc3RhdGljIENhbWVyYU1ldGFkYXRhCisgICAgICAgICAqICAgcHJvcGVydGllcy4KKyAgICAgICAgICovCisgICAgICAgIEFMT0dJKCIlczogU3dpdGNoaW5nIHRvIEhBTDEgc2hpbSBpbXBsZW1lbnRhdGlvbi4uLiIsIF9fRlVOQ1RJT05fXyk7CiAKLSAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZykgPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzEpIHsKLSAgICAgICAgLy8gRGlzYWJsZSBIQUwyLnggc3VwcG9ydCBmb3IgY2FtZXJhMiBBUEkgZm9yIG5vdy4KLSAgICAgICAgQUxPR1coIiVzOiBIQUwyLnggZG9lc24ndCBzdXBwb3J0IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3Igbm93IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisgICAgICAgIGlmICgocmV0ID0gZ2VuZXJhdGVTaGltTWV0YWRhdGEoY2FtZXJhSWQsIGNhbWVyYUluZm8pKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCi0gICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgc3RhdHVzX3QgcmV0ID0gbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbyk7Ci0gICAgKmNhbWVyYUluZm8gPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3JtYWwgSEFMIDIuMSsgY29kZXBhdGguCisgICAgICAgICAqLworICAgICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKKyAgICAgICAgcmV0ID0gZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSk7CisgICAgICAgICpjYW1lcmFJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKC8qb3V0Ki9zcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgeworICAgIGlmICghbU1vZHVsZSkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBoYXJkd2FyZSBtb2R1bGUgZG9lc24ndCBleGlzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIGRlc2MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgcmV0dXJuIE9LOworfQorCiBpbnQgQ2FtZXJhU2VydmljZTo6Z2V0RGV2aWNlVmVyc2lvbihpbnQgY2FtZXJhSWQsIGludCogZmFjaW5nKSB7CiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87CiAgICAgaWYgKG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pICE9IE9LKSB7CkBAIC0yODksMjEgKzQwNSwxNjIgQEAKICAgICByZXR1cm4gZGV2aWNlVmVyc2lvbjsKIH0KIAotYm9vbCBDYW1lcmFTZXJ2aWNlOjppc1ZhbGlkQ2FtZXJhSWQoaW50IGNhbWVyYUlkKSB7Ci0gICAgaW50IGZhY2luZzsKLSAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgIGNhc2UgLUVCVVNZOgorICAgICAgICBjYXNlIC1FSU5WQUw6CisgICAgICAgIGNhc2UgLUVVU0VSUzoKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIC1FTk9ERVY7Cit9CiAKLSAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6Ci0gICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgotICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0Ogorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgIGNhc2UgLUVJTlZBTDoKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIC1FTk9ERVY7Cit9CisKK2Jvb2wgQ2FtZXJhU2VydmljZTo6c2V0VXBWZW5kb3JUYWdzKCkgeworICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wcyA9IHZlbmRvcl90YWdfb3BzX3QoKTsKKworICAgIC8vIENoZWNrIGlmIHZlbmRvciBvcGVyYXRpb25zIGhhdmUgYmVlbiBpbXBsZW1lbnRlZAorICAgIGlmIChtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HSSgiJXM6IE5vIHZlbmRvciB0YWdzIGRlZmluZWQgZm9yIHRoaXMgZGV2aWNlLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMiKTsKKyAgICBtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMoJnZPcHMpOworICAgIEFUUkFDRV9FTkQoKTsKKworICAgIC8vIEVuc3VyZSBhbGwgdmVuZG9yIG9wZXJhdGlvbnMgYXJlIHByZXNlbnQKKyAgICBpZiAodk9wcy5nZXRfdGFnX2NvdW50ID09IE5VTEwgfHwgdk9wcy5nZXRfYWxsX3RhZ3MgPT0gTlVMTCB8fAorICAgICAgICAgICAgdk9wcy5nZXRfc2VjdGlvbl9uYW1lID09IE5VTEwgfHwgdk9wcy5nZXRfdGFnX25hbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgdk9wcy5nZXRfdGFnX3R5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgb3BlcmF0aW9ucyBub3QgZnVsbHkgZGVmaW5lZC4gSWdub3JpbmcgZGVmaW5pdGlvbnMuIgorICAgICAgICAgICAgICAgLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2M7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21PcHMoJnZPcHMsIC8qb3V0Ki9kZXNjKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNldCB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IgdG8gdXNlIHdpdGggY2FtZXJhIG1ldGFkYXRhCisgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6c2V0QXNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKGRlc2MpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgeworICAgIGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBzdGF0dXNfdCByZXQgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIHVpZCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBib29sIG5lZWRzTmV3Q2xpZW50ID0gZmFsc2U7CisgICAgc3A8Q2xpZW50PiBjbGllbnQ7CisKKyAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJtZWRpYSIpOworICAgIHsgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIGlmIChtQ2xpZW50W2NhbWVyYUlkXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihtQ2xpZW50W2NhbWVyYUlkXS5wcm9tb3RlKCkuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgbmVlZHNOZXdDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgcmV0ID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNhbWVyYUNsaWVudCovTlVMTCwgLy8gRW1wdHkgYmluZGVyIGNhbGxiYWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworCisgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgY29ubmVjdCB0byBjbGllbnQgY2FtZXJhIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggcmF3UGFyYW1zID0gY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHJhd1BhcmFtcyk7CisgICAgICAgIG1TaGltUGFyYW1zLmFkZChjYW1lcmFJZCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBjbGllbnQgaWYgb25lIHdhcyBvcGVuZWQgc29sZWx5IGZvciB0aGlzIGNhbGwKKyAgICBpZiAobmVlZHNOZXdDbGllbnQpIHsKKyAgICAgICAgY2xpZW50LT5kaXNjb25uZWN0KCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoaW50IGNhbWVyYUlkLAorICAgICAgICAvKm91dCovCisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMqIHBhcmFtZXRlcnMpIHsKKworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYUlkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworCisgICAgc3RhdHVzX3QgcmV0ID0gMDsKKworICAgIGlmIChwYXJhbWV0ZXJzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSAtMTsKKyAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgICAgICBpbmRleCA9IG1TaGltUGFyYW1zLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgICAgICAvLyBSZWxlYXNlIHNlcnZpY2UgbG9jayBzbyBpbml0aWFsaXplU2hpbU1ldGFkYXRhIGNhbiBiZSBjYWxsZWQgY29ycmVjdGx5LgorCisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IG1TaGltUGFyYW1zW2luZGV4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHJldCA9IGluaXRpYWxpemVTaGltTWV0YWRhdGEoY2FtZXJhSWQpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgeyAgIC8vIFNjb3BlIGZvciBzZXJ2aWNlIGxvY2sKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgICAgICBpbmRleCA9IG1TaGltUGFyYW1zLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4IHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQiKTsKKworICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBtU2hpbVBhcmFtc1tpbmRleF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OnZhbGlkYXRlQ29ubmVjdChpbnQgY2FtZXJhSWQsCkBAIC00MDIsNiArNjU5LDc3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXJMb2NrZWQoCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAvKmluKi8KKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGludCBjbGllbnRVaWQsCisgICAgICAgIGludCBjYWxsaW5nUGlkLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgYm9vbCBsZWdhY3lNb2RlKSB7CisKKyAgICBpbnQgZmFjaW5nID0gLTE7CisgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKKworICAgIGlmIChoYWxWZXJzaW9uIDwgMCB8fCBoYWxWZXJzaW9uID09IGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgLy8gRGVmYXVsdCBwYXRoOiBIQUwgdmVyc2lvbiBpcyB1bnNwZWNpZmllZCBieSBjYWxsZXIsIGNyZWF0ZSBDYW1lcmFDbGllbnQKKyAgICAgICAgLy8gYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBpZCAlZCIsIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBIHBhcnRpY3VsYXIgSEFMIHZlcnNpb24gaXMgcmVxdWVzdGVkIGJ5IGNhbGxlci4gQ3JlYXRlIENhbWVyYUNsaWVudAorICAgICAgICAvLyBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIEhBTCB2ZXJzaW9uLgorICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wICYmCisgICAgICAgICAgICBoYWxWZXJzaW9uID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CisgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgaGlnaGVyIEhBTCB2ZXJzaW9uIGRldmljZSBvcGVuZWQgYXMgSEFMMS4wIGRldmljZS4KKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPdGhlciBjb21iaW5hdGlvbnMgKGUuZy4gSEFMMy54IG9wZW4gYXMgSEFMMi54KSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgSEFMIHZlcnNpb24gJXg6IEhBTCAleCBkZXZpY2UgY2FuIG9ubHkgYmUiCisgICAgICAgICAgICAgICAgICAgICIgb3BlbmVkIGFzIEhBTCAleCBkZXZpY2UiLCBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RmluaXNoVW5zYWZlKGNsaWVudCwgY2xpZW50LT5nZXRSZW1vdGUoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vdCByZWNvdmVyYWJsZS4uIG1heWJlIHRoZSBjbGllbnQgY2FuIHRyeSBhZ2FpbgorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoaWQgJWQsIHRoaXMgcGlkIGlzICVkKSIsIGNhbWVyYUlkLAorICAgICAgICAgZ2V0cGlkKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0KAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBpbnQgY2FtZXJhSWQsCkBAIC00MzUsNTAgKzc2Myw4MSBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGZhY2luZyA9IC0xOwotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBvdGhlciBub24tZXhjbHVzaXZlIHVzZXJzIG9mIHRoZSBjYW1lcmEsCi0gICAgICAgIC8vICB0aGlzIHdpbGwgdGVhciB0aGVtIGRvd24gYmVmb3JlIHdlIGNhbiByZXVzZSB0aGUgY2FtZXJhCi0gICAgICAgIGlmIChpc1ZhbGlkQ2FtZXJhSWQoY2FtZXJhSWQpKSB7Ci0gICAgICAgICAgICAvLyB0cmFuc2l0aW9uIGZyb20gUFJFU0VOVCAtPiBOT1RfQVZBSUxBQkxFCi0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKKyAgICAgICAgc3RhdHVzID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgbm90IHJlY292ZXJhYmxlLi4gbWF5YmUgdGhlIGNsaWVudCBjYW4gdHJ5IGFnYWluCi0gICAgICAgICAgICAvLyBPSzogd2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgd2Ugd2VyZSBvcmlnaW5hbGx5IGluIFBSRVNFTlQgc3RhdGUKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwgY2FtZXJhSWQpOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OwotICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKGlkICVkLCB0aGlzIHBpZCBpcyAlZCkiLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICBnZXRwaWQoKSk7CisgICAgfQorICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKKyAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQorCisgICAgZGV2aWNlID0gY2xpZW50OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdExlZ2FjeSgKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICAvKm91dCovCisgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpIHsKKworICAgIGlmIChoYWxWZXJzaW9uICE9IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgJiYKKyAgICAgICAgICAgIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMykgeworICAgICAgICAvKgorICAgICAgICAgKiBFaXRoZXIgdGhlIEhBTCB2ZXJzaW9uIGlzIHVuc3BlY2lmaWVkIGluIHdoaWNoIGNhc2UgdGhpcyBqdXN0IGNyZWF0ZXMKKyAgICAgICAgICogYSBjYW1lcmEgY2xpZW50IHNlbGVjdGVkIGJ5IHRoZSBsYXRlc3QgZGV2aWNlIHZlcnNpb24sIG9yCisgICAgICAgICAqIGl0J3MgYSBwYXJ0aWN1bGFyIHZlcnNpb24gaW4gd2hpY2ggY2FzZSB0aGUgSEFMIG11c3Qgc3VwcG9ydGVkCisgICAgICAgICAqIHRoZSBvcGVuX2xlZ2FjeSBjYWxsCisgICAgICAgICAqLworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBIQUwgbW9kdWxlIHZlcnNpb24gJXggZG9lc24ndCBzdXBwb3J0IGNvbm5lY3RpbmcgdG8gbGVnYWN5IEhBTCBkZXZpY2VzISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOworICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworCisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBsZWdhY3kgRSAocGlkICVkIFwiJXNcIiwgaWQgJWQpIiwgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNwPENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcDsKKyAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnRUbXApKSB7CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9IGVsc2UgaWYgKGNsaWVudC5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihjbGllbnRUbXAuZ2V0KCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovdHJ1ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgIH0KICAgICAvLyBpbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrCiAgICAgLy8gICAgaW50byB0aGUgc2VydmljZSBmcm9tIGl0cyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKQEAgLTQ5Myw4ICs4NTIsOSBAQAogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0KLSAgICByZW1vdGVDYWxsYmFjay0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKHJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgcmVtb3RlQ2FsbGJhY2stPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTUwNyw2ICs4NjcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVByb0NhbWVyYVVzZXI+JiBkZXZpY2UpCiB7CisgICAgaWYgKGNhbWVyYUNiID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBTdHJpbmc4IGNsaWVudE5hbWU4KGNsaWVudFBhY2thZ2VOYW1lKTsKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKIApAQCAtNTQxLDYgKzkwNiw4IEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgICAgY2xpZW50ID0gbmV3IFByb0NhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjAzLDE0ICs5NzAsNiBAQAogICAgICAgICBpbnQgZmFjaW5nID0gLTE7CiAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CiAKLSAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG90aGVyIG5vbi1leGNsdXNpdmUgdXNlcnMgb2YgdGhlIGNhbWVyYSwKLSAgICAgICAgLy8gIHRoaXMgd2lsbCB0ZWFyIHRoZW0gZG93biBiZWZvcmUgd2UgY2FuIHJldXNlIHRoZSBjYW1lcmEKLSAgICAgICAgaWYgKGlzVmFsaWRDYW1lcmFJZChjYW1lcmFJZCkpIHsKLSAgICAgICAgICAgIC8vIHRyYW5zaXRpb24gZnJvbSBQUkVTRU5UIC0+IE5PVF9BVkFJTEFCTEUKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCk7Ci0gICAgICAgIH0KLQogICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CiAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIHVzaW5nIG9sZCBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKQEAgLTYxOSw2ICs5NzgsOCBAQAogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjMzLDggKzk5NCw2IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBub3QgcmVjb3ZlcmFibGUuLiBtYXliZSB0aGUgY2xpZW50IGNhbiB0cnkgYWdhaW4KLSAgICAgICAgICAgIC8vIE9LOiB3ZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSB3ZXJlIG9yaWdpbmFsbHkgaW4gUFJFU0VOVCBzdGF0ZQotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULCBjYW1lcmFJZCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKQEAgLTcwOSw2ICsxMDY4LDc4IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVycygKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKSB7CisgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhIElEID0gJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKworICAgIGlmIChwYXJhbWV0ZXJzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IHJldCA9IDA7CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHNoaW1QYXJhbXM7CisgICAgaWYgKChyZXQgPSBnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShjYW1lcmFJZCwgLypvdXQqLyZzaGltUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgLy8gRXJyb3IgbG9nZ2VkIGJ5IGNhbGxlcgorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFN0cmluZzggc2hpbVBhcmFtc1N0cmluZzggPSBzaGltUGFyYW1zLmZsYXR0ZW4oKTsKKyAgICBTdHJpbmcxNiBzaGltUGFyYW1zU3RyaW5nMTYgPSBTdHJpbmcxNihzaGltUGFyYW1zU3RyaW5nOCk7CisKKyAgICAqcGFyYW1ldGVycyA9IHNoaW1QYXJhbXNTdHJpbmcxNjsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6c3VwcG9ydHNDYW1lcmFBcGkoaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgeworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYSBJRCA9ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisKKyAgICBzd2l0Y2ggKGFwaVZlcnNpb24pIHsKKyAgICAgICAgY2FzZSBBUElfVkVSU0lPTl8xOgorICAgICAgICBjYXNlIEFQSV9WRVJTSU9OXzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogQmFkIEFQSSB2ZXJzaW9uICVkIiwgX19GVU5DVElPTl9fLCBhcGlWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50IGZhY2luZyA9IC0xOworICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CisKKyAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgIGlmIChhcGlWZXJzaW9uID09IEFQSV9WRVJTSU9OXzIpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVkIHVzZXMgSEFMIHByaW9yIHRvIEhBTDMuMiwgZG9lc24ndCBzdXBwb3J0IGFwaTIgd2l0aG91dCBzaGltIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0gZWxzZSB7IC8vIGlmIChhcGlWZXJzaW9uID09IEFQSV9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVkIHVzZXMgb2xkZXIgSEFMIGJlZm9yZSAzLjIsIGJ1dCBhcGkxIGlzIGFsd2F5cyBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJWQgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlVmVyc2lvbik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50QnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIHJlbW90ZUJpbmRlcikgewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudEJ5UmVtb3RlIEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKQEAgLTcyMyw5ICsxMTU0LDEzIEBACiAgICAgaWYgKGNsaWVudCAhPSAwKSB7CiAgICAgICAgIC8vIEZvdW5kIG91ciBjYW1lcmEsIGNsZWFyIGFuZCBsZWF2ZS4KICAgICAgICAgTE9HMSgicmVtb3ZlQ2xpZW50OiBjbGVhciBjYW1lcmEgJWQiLCBvdXRJbmRleCk7Ci0gICAgICAgIG1DbGllbnRbb3V0SW5kZXhdLmNsZWFyKCk7CiAKLSAgICAgICAgY2xpZW50LT5nZXRSZW1vdGUoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gY2xpZW50LT5nZXRSZW1vdGUoKTsKKyAgICAgICAgaWYgKHJlbW90ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZW1vdGUtPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBtQ2xpZW50W291dEluZGV4XS5jbGVhcigpOwogICAgIH0gZWxzZSB7CiAKICAgICAgICAgc3A8UHJvQ2xpZW50PiBjbGllbnRQcm8gPSBmaW5kUHJvQ2xpZW50VW5zYWZlKHJlbW90ZUJpbmRlcik7CkBAIC04MzUsNiArMTI3MCw3IEBACiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUOgogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9QUk86CiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0RFVklDRToKKyAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfTEVHQUNZOgogICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICAgICAgICAgIGNvbnN0IGludCBzZWxmX3BpZCA9IGdldHBpZCgpOwogICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmX3BpZCkgewpAQCAtODc3LDcgKzEzMTMsNyBAQAogCiBNZWRpYVBsYXllciogQ2FtZXJhU2VydmljZTo6bmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSkgewogICAgIE1lZGlhUGxheWVyKiBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgeworICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgewogICAgICAgICBtcC0+c2V0QXVkaW9TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKTsKICAgICAgICAgbXAtPnByZXBhcmUoKTsKICAgICB9IGVsc2UgewpAQCAtOTgxLDEzICsxNDE3LDE1IEBACiB2b2lkIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpkaXNjb25uZWN0KCkgewogICAgIEFMT0dWKCJCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCIpOwogICAgIG1DYW1lcmFTZXJ2aWNlLT5yZW1vdmVDbGllbnRCeVJlbW90ZShtUmVtb3RlQmluZGVyKTsKKworICAgIGZpbmlzaENhbWVyYU9wcygpOwogICAgIC8vIGNsaWVudCBzaG91bGRuJ3QgYmUgYWJsZSB0byBjYWxsIGludG8gdXMgYW55bW9yZQogICAgIG1DbGllbnRQaWQgPSAwOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6c3RhcnRDYW1lcmFPcHMoKSB7CiAgICAgaW50MzJfdCByZXM7Ci0KKyAgICAvLyBOb3RpZnkgYXBwIG9wcyB0aGF0IHRoZSBjYW1lcmEgaXMgbm90IGF2YWlsYWJsZQogICAgIG1PcHNDYWxsYmFjayA9IG5ldyBPcHNDYWxsYmFjayh0aGlzKTsKIAogICAgIHsKQEAgLTEwMDUsMTYgKzE0NDMsMzkgQEAKICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisKICAgICBtT3BzQWN0aXZlID0gdHJ1ZTsKKworICAgIC8vIFRyYW5zaXRpb24gZGV2aWNlIGF2YWlsYWJpbGl0eSBsaXN0ZW5lcnMgZnJvbSBQUkVTRU5UIC0+IE5PVF9BVkFJTEFCTEUKKyAgICBtQ2FtZXJhU2VydmljZS0+dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFLAorICAgICAgICAgICAgbUNhbWVyYUlkKTsKKwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmZpbmlzaENhbWVyYU9wcygpIHsKKyAgICAvLyBDaGVjayBpZiBzdGFydENhbWVyYU9wcyBzdWNjZWVkZWQsIGFuZCBpZiBzbywgZmluaXNoIHRoZSBjYW1lcmEgb3AKICAgICBpZiAobU9wc0FjdGl2ZSkgeworICAgICAgICAvLyBOb3RpZnkgYXBwIG9wcyB0aGF0IHRoZSBjYW1lcmEgaXMgYXZhaWxhYmxlIGFnYWluCiAgICAgICAgIG1BcHBPcHNNYW5hZ2VyLmZpbmlzaE9wKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBtT3BzQWN0aXZlID0gZmFsc2U7CisKKyAgICAgICAgLy8gTm90aWZ5IGRldmljZSBhdmFpbGFiaWxpdHkgbGlzdGVuZXJzIHRoYXQgdGhpcyBjYW1lcmEgaXMgYXZhaWxhYmxlCisgICAgICAgIC8vIGFnYWluCisKKyAgICAgICAgU3RhdHVzVmVjdG9yIHJlamVjdFNvdXJjZVN0YXRlczsKKyAgICAgICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQpOworICAgICAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORyk7CisKKyAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiBhYm92ZSAyCisgICAgICAgIC8vIHN0YXRlcworICAgICAgICBtQ2FtZXJhU2VydmljZS0+dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAmcmVqZWN0U291cmNlU3RhdGVzKTsKKwogICAgIH0KKyAgICAvLyBBbHdheXMgc3RvcCB3YXRjaGluZywgZXZlbiBpZiBubyBjYW1lcmEgb3AgaXMgYWN0aXZlCiAgICAgbUFwcE9wc01hbmFnZXIuc3RvcFdhdGNoaW5nTW9kZShtT3BzQ2FsbGJhY2spOwogICAgIG1PcHNDYWxsYmFjay5jbGVhcigpOwogCkBAIC0xMDQ1LDcgKzE1MDYsOCBAQAogICAgICAgICAvLyBSZXNldCB0aGUgY2xpZW50IFBJRCB0byBhbGxvdyBzZXJ2ZXItaW5pdGlhdGVkIGRpc2Nvbm5lY3QsCiAgICAgICAgIC8vIGFuZCB0byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgYnkgY2xpZW50LgogICAgICAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBub3RpZnlFcnJvcigpOworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsgLy8gYSBkdW1teSByZXN1bHQgKGludmFsaWQpCisgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9TRVJWSUNFLCByZXN1bHRFeHRyYXMpOwogICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgfQogfQpAQCAtMTA1MywxMyArMTUxNSwxMyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBNdXRleCogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSh2b2lkKiB1c2VyKSB7Ci0gICAgcmV0dXJuIGdDYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRMb2NrQnlJZCgoaW50KSB1c2VyKTsKKyAgICByZXR1cm4gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudExvY2tCeUlkKChpbnQpKGludHB0cl90KSB1c2VyKTsKIH0KIAogLy8gUHJvdmlkZSBjbGllbnQgcG9pbnRlciBmb3IgY2FsbGJhY2tzLiBDbGllbnQgbG9jayByZXR1cm5lZCBmcm9tIGdldENsaWVudExvY2tGcm9tQ29va2llIHNob3VsZAogLy8gYmUgYWNxdWlyZWQgZm9yIHRoaXMgdG8gYmUgc2FmZQogQ2FtZXJhU2VydmljZTo6Q2xpZW50KiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcikgewotICAgIEJhc2ljQ2xpZW50ICpiYXNpY0NsaWVudCA9IGdDYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRCeUlkVW5zYWZlKChpbnQpIHVzZXIpOworICAgIEJhc2ljQ2xpZW50ICpiYXNpY0NsaWVudCA9IGdDYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRCeUlkVW5zYWZlKChpbnQpKGludHB0cl90KSB1c2VyKTsKICAgICAvLyBPSzogb25seSBDYW1lcmFDbGllbnQgY2FsbHMgdGhpcywgYW5kIHRoZXkgYWxyZWFkeSBjYXN0IGFueXdheS4KICAgICBDbGllbnQqIGNsaWVudCA9IHN0YXRpY19jYXN0PENsaWVudCo+KGJhc2ljQ2xpZW50KTsKIApAQCAtMTA3NCw3ICsxNTM2LDggQEAKICAgICByZXR1cm4gY2xpZW50OwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6bm90aWZ5RXJyb3IoKSB7Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CiAgICAgbVJlbW90ZUNhbGxiYWNrLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfUkVMRUFTRUQsIDApOwogfQogCkBAIC0xMDgzLDE1ICsxNTQ2LDYgQEAKICAgICBBTE9HVigiQ2xpZW50OjpkaXNjb25uZWN0Iik7CiAgICAgQmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKICAgICBtQ2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhRnJlZShtQ2FtZXJhSWQpOwotCi0gICAgU3RhdHVzVmVjdG9yIHJlamVjdFNvdXJjZVN0YXRlczsKLSAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCk7Ci0gICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpOwotCi0gICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiBhYm92ZSAyIHN0YXRlcwotICAgIG1DYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVqZWN0U291cmNlU3RhdGVzKTsKIH0KIAogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpPcHNDYWxsYmFjazo6T3BzQ2FsbGJhY2sod3A8QmFzaWNDbGllbnQ+IGNsaWVudCk6CkBAIC0xMTI4LDcgKzE1ODIsOCBAQAogQ2FtZXJhU2VydmljZTo6UHJvQ2xpZW50Ojp+UHJvQ2xpZW50KCkgewogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6bm90aWZ5RXJyb3IoKSB7Cit2b2lkIENhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CiAgICAgbVJlbW90ZUNhbGxiYWNrLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfUkVMRUFTRUQsIDApOwogfQogCkBAIC0xMTcwLDYgKzE2MjUsNyBAQAogICAgICAgICBpZiAoIW1Nb2R1bGUpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiTm8gY2FtZXJhIG1vZHVsZSBhdmFpbGFibGUhXG4iKTsKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTExODIsNyArMTYzOCwyMCBAQAogICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDYW1lcmEgbW9kdWxlIGF1dGhvcjogJXNcbiIsCiAgICAgICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLmF1dGhvcik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIk51bWJlciBvZiBjYW1lcmEgZGV2aWNlczogJWRcblxuIiwgbU51bWJlck9mQ2FtZXJhcyk7CisKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiVmVuZG9yIHRhZ3MgbGVmdCB1bmltcGxlbWVudGVkLlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJWZW5kb3IgdGFnIGRlZmluaXRpb25zOlxuIik7CisgICAgICAgIH0KKwogICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgICAgICBpZiAoZGVzYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZXNjLT5kdW1wKGZkLCAvKnZlcmJvc2l0eSovMiwgLyppbmRlbnRhdGlvbiovNCk7CisgICAgICAgIH0KKwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7IGkrKykgewogICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJWQgc3RhdGljIGluZm9ybWF0aW9uOlxuIiwgaSk7CiAgICAgICAgICAgICBjYW1lcmFfaW5mbyBpbmZvOwpAQCAtMTIwNyw3ICsxNjc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBEZXZpY2Ugc3RhdGljIG1ldGFkYXRhOlxuIik7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBkdW1wX2luZGVudGVkX2NhbWVyYV9tZXRhZGF0YShpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLCAyLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwgLyp2ZXJib3NpdHkqLzIsIC8qaW5kZW50YXRpb24qLzQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCBhZDZhNTgyLi5hNzMyOGNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0xLDI0ICsxLDI0IEBACiAvKgotKioKLSoqIENvcHlyaWdodCAoQykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKIAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JQXBwT3BzQ2FsbGJhY2suaD4KQEAgLTMxLDYgKzMxLDkgQEAKICNpbmNsdWRlIDxjYW1lcmEvSVByb0NhbWVyYUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KIApAQCAtNzMsMTIgKzc2LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcigvKm91dCovIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LCBpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdExlZ2FjeShjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LCBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RQcm8oY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGNhbWVyYUNiLAogICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAvKm91dCovCkBAIC05Niw2ICsxMDUsMTUgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbW92ZUxpc3RlbmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TGVnYWN5UGFyYW1ldGVycygKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKTsKKworICAgIC8vIE9LID0gc3VwcG9ydHMgYXBpIG9mIHRoYXQgdmVyc2lvbiwgLUVPUE5PVFNVUFAgPSBkb2VzIG5vdCBzdXBwb3J0CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdXBwb3J0c0NhbWVyYUFwaSgKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pOworCiAgICAgLy8gRXh0cmEgcGVybWlzc2lvbnMgY2hlY2tzCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwpAQCAtMTIwLDYgKzEzOCwxMCBAQAogICAgIC8vIENhbWVyYURldmljZUZhY3RvcnkgZnVuY3Rpb25hbGl0eQogICAgIGludCAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVmVyc2lvbihpbnQgY2FtZXJhSWQsIGludCogZmFjaW5nID0gTlVMTCk7CiAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTaGFyZWQgdXRpbGl0aWVzCisgICAgc3RhdGljIHN0YXR1c190ICAgICBmaWx0ZXJPcGVuRXJyb3JDb2RlKHN0YXR1c190IGVycik7CisgICAgc3RhdGljIHN0YXR1c190ICAgICBmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKHN0YXR1c190IGVycik7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBDYW1lcmFDbGllbnQgZnVuY3Rpb25hbGl0eQpAQCAtMTMxLDIwICsxNTMsMTkgQEAKIAogICAgIGNsYXNzIEJhc2ljQ2xpZW50IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiAgICAgcHVibGljOgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpID0gMDsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZGlzY29ubmVjdCgpOwogCiAgICAgICAgIC8vIGJlY2F1c2Ugd2UgY2FuJ3QgdmlydHVhbGx5IGluaGVyaXQgSUludGVyZmFjZSwgd2hpY2ggYnJlYWtzCiAgICAgICAgIC8vIHZpcnR1YWwgaW5oZXJpdGFuY2UKICAgICAgICAgdmlydHVhbCBzcDxJQmluZGVyPiBhc0JpbmRlcldyYXBwZXIoKSA9IDA7CiAKICAgICAgICAgLy8gUmV0dXJuIHRoZSByZW1vdGUgY2FsbGJhY2sgYmluZGVyIG9iamVjdCAoZS5nLiBJUHJvQ2FtZXJhQ2FsbGJhY2tzKQotICAgICAgICBzcDxJQmluZGVyPiAgICAgZ2V0UmVtb3RlKCkgeworICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgIGdldFJlbW90ZSgpIHsKICAgICAgICAgICAgIHJldHVybiBtUmVtb3RlQmluZGVyOwogICAgICAgICB9CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKIAogICAgIHByb3RlY3RlZDoKICAgICAgICAgQmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCkBAIC0xODEsNyArMjAyLDkgQEAKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hDYW1lcmFPcHMoKTsKIAogICAgICAgICAvLyBOb3RpZnkgY2xpZW50IGFib3V0IGEgZmF0YWwgZXJyb3IKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvcigpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOwogICAgIHByaXZhdGU6CiAgICAgICAgIEFwcE9wc01hbmFnZXIgICAgICAgICAgICAgICAgICAgbUFwcE9wc01hbmFnZXI7CiAKQEAgLTI1OCw3ICsyODEsOCBAQAogICAgICAgICAvLyBjb252ZXJ0IGNsaWVudCBmcm9tIGNvb2tpZS4gQ2xpZW50IGxvY2sgc2hvdWxkIGJlIGFjcXVpcmVkIGJlZm9yZSBnZXR0aW5nIENsaWVudC4KICAgICAgICAgc3RhdGljIENsaWVudCogICAgICAgZ2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKTsKIAotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBub3RpZnlFcnJvcigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogCiAgICAgICAgIC8vIEluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCiAKQEAgLTMwNiw3ICszMzAsOCBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25FeGNsdXNpdmVMb2NrU3RvbGVuKCkgPSAwOwogCiAgICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5RXJyb3IoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogCiAgICAgICAgIHNwPElQcm9DYW1lcmFDYWxsYmFja3M+IG1SZW1vdGVDYWxsYmFjazsKICAgICB9OyAvLyBjbGFzcyBQcm9DbGllbnQKQEAgLTM4Nyw2ICs0MTIsNTcgQEAKICAgICAvLyBIZWxwZXJzCiAKICAgICBib29sICAgICAgICAgICAgICAgIGlzVmFsaWRDYW1lcmFJZChpbnQgY2FtZXJhSWQpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKKworICAgIC8qKgorICAgICAqIEEgbWFwcGluZyBvZiBjYW1lcmEgaWRzIHRvIENhbWVyYVBhcmFtZXRlcnMgcmV0dXJuZWQgYnkgdGhhdCBjYW1lcmEgZGV2aWNlLgorICAgICAqCisgICAgICogVGhpcyBjYWNoZSBpcyB1c2VkIHRvIGdlbmVyYXRlIENhbWVyYUNoYXJhY3RlcmlzdGljIG1ldGFkYXRhIHdoZW4gdXNpbmcKKyAgICAgKiB0aGUgSEFMMSBzaGltLgorICAgICAqLworICAgIEtleWVkVmVjdG9yPGludCwgQ2FtZXJhUGFyYW1ldGVycz4gICAgbVNoaW1QYXJhbXM7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGFuZCBjYWNoZSB0aGUgbWV0YWRhdGEgdXNlZCBieSB0aGUgSEFMMSBzaGltIGZvciBhIGdpdmVuIGNhbWVyYUlkLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgICBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNhY2hlZCBDYW1lcmFQYXJhbWV0ZXJzIGZvciB0aGUgY2FtZXJhLiBJZiB0aGV5IGhhdmVuJ3QgYmVlbgorICAgICAqIGNhY2hlZCB5ZXQsIHRoZW4gaW5pdGlhbGl6ZSB0aGVtIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgICAgZ2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoaW50IGNhbWVyYUlkLCAvKm91dCovQ2FtZXJhUGFyYW1ldGVycyogcGFyYW1ldGVycyk7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIG1ldGFkYXRhIHJlcXVpcmVkIGJ5IHRoZSBDYW1lcmEyIEFQSQorICAgICAqIGZyb20gdGhlIGF2YWlsYWJsZSBIQUwxIENhbWVyYVBhcmFtZXRlcnMgYW5kIENhbWVyYUluZm8uCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgIGdlbmVyYXRlU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKTsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgYSBuZXcgY2FtZXJhIGNsaWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGlsZSBob2xkaW5nIHRoZQorICAgICAqIG11dGV4IGZvciBtU2VydmljZUxvY2suCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgIGNvbm5lY3RIZWxwZXJMb2NrZWQoCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAvKmluKi8KKyAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICAgICAgaW50IGNhbGxpbmdQaWQsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiA9IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZSk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBiMDkzOTQ2Li5mM2E4OGExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCkBAIC01MywxNiArNTQsMTcgQEAKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgaW50IGRldmljZVZlcnNpb24pOgorICAgICAgICBib29sIGxlZ2FjeU1vZGUpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKLSAgICAgICAgbVBhcmFtZXRlcnMoY2FtZXJhSWQsIGNhbWVyYUZhY2luZyksCi0gICAgICAgIG1EZXZpY2VWZXJzaW9uKGRldmljZVZlcnNpb24pCisgICAgICAgIG1QYXJhbWV0ZXJzKGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9IFBhcmFtZXRlcnM6OkRJU0NPTk5FQ1RFRDsKKworICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkKQEAgLTc5LDcgKzgxLDcgQEAKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAKLSAgICAgICAgcmVzID0gbC5tUGFyYW1ldGVycy5pbml0aWFsaXplKCYobURldmljZS0+aW5mbygpKSk7CisgICAgICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuaW5pdGlhbGl6ZSgmKG1EZXZpY2UtPmluZm8oKSksIG1EZXZpY2VWZXJzaW9uKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuYWJsZSB0byBidWlsZCBkZWZhdWx0czogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTExNyw3ICsxMTksOSBAQAogICAgICAgICAgICAgbVpzbFByb2Nlc3NvclRocmVhZCA9IHpzbFByb2M7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOnsKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjogewogICAgICAgICAgICAgc3A8WnNsUHJvY2Vzc29yMz4genNsUHJvYyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBac2xQcm9jZXNzb3IzKHRoaXMsIG1DYXB0dXJlU2VxdWVuY2VyKTsKICAgICAgICAgICAgIG1ac2xQcm9jZXNzb3IgPSB6c2xQcm9jOwpAQCAtMTkzLDcgKzE5Nyw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBHUFMgbGF0IHggbG9uZyB4IGFsdDogJWYgeCAlZiB4ICVmXG4iLAogICAgICAgICAgICAgICAgIHAuZ3BzQ29vcmRpbmF0ZXNbMF0sIHAuZ3BzQ29vcmRpbmF0ZXNbMV0sCiAgICAgICAgICAgICAgICAgcC5ncHNDb29yZGluYXRlc1syXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBHUFMgdGltZXN0YW1wOiAlbGxkXG4iLAorICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgR1BTIHRpbWVzdGFtcDogJSIgUFJJZDY0ICJcbiIsCiAgICAgICAgICAgICAgICAgcC5ncHNUaW1lc3RhbXApOwogICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgR1BTIHByb2Nlc3NpbmcgbWV0aG9kOiAlc1xuIiwKICAgICAgICAgICAgICAgICBwLmdwc1Byb2Nlc3NpbmdNZXRob2Quc3RyaW5nKCkpOwpAQCAtMjM3LDcgKzI0MSw3IEBACiAKICAgICByZXN1bHQuYXBwZW5kKCIgICAgU2NlbmUgbW9kZTogIik7CiAgICAgc3dpdGNoIChwLnNjZW5lTW9kZSkgewotICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOgogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiQVVUT1xuIik7IGJyZWFrOwogICAgICAgICBDQVNFX0FQUEVORF9FTlVNKEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0FDVElPTikKICAgICAgICAgQ0FTRV9BUFBFTkRfRU5VTShBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9QT1JUUkFJVCkKQEAgLTQxNSwxMiArNDE5LDIwIEBACiAKICAgICBBTE9HVigiQ2FtZXJhICVkOiBXYWl0aW5nIGZvciB0aHJlYWRzIiwgbUNhbWVyYUlkKTsKIAotICAgIG1TdHJlYW1pbmdQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBtRnJhbWVQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBtQ2FwdHVyZVNlcXVlbmNlci0+am9pbigpOwotICAgIG1KcGVnUHJvY2Vzc29yLT5qb2luKCk7Ci0gICAgbVpzbFByb2Nlc3NvclRocmVhZC0+am9pbigpOwotICAgIG1DYWxsYmFja1Byb2Nlc3Nvci0+am9pbigpOworICAgIHsKKyAgICAgICAgLy8gRG9uJ3Qgd2FpdCB3aXRoIGxvY2sgaGVsZCwgaW4gY2FzZSB0aGUgb3RoZXIgdGhyZWFkcyBuZWVkIHRvCisgICAgICAgIC8vIGNvbXBsZXRlIGNhbGxiYWNrcyB0aGF0IHJlLWVudGVyIENhbWVyYTJDbGllbnQKKyAgICAgICAgbUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrLnVubG9jaygpOworCisgICAgICAgIG1TdHJlYW1pbmdQcm9jZXNzb3ItPmpvaW4oKTsKKyAgICAgICAgbUZyYW1lUHJvY2Vzc29yLT5qb2luKCk7CisgICAgICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5qb2luKCk7CisgICAgICAgIG1KcGVnUHJvY2Vzc29yLT5qb2luKCk7CisgICAgICAgIG1ac2xQcm9jZXNzb3JUaHJlYWQtPmpvaW4oKTsKKyAgICAgICAgbUNhbGxiYWNrUHJvY2Vzc29yLT5qb2luKCk7CisKKyAgICAgICAgbUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrLmxvY2soKTsKKyAgICB9CiAKICAgICBBTE9HVigiQ2FtZXJhICVkOiBEZWxldGluZyBzdHJlYW1zIiwgbUNhbWVyYUlkKTsKIApAQCAtNDMwLDYgKzQ0Miw5IEBACiAgICAgbUNhbGxiYWNrUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKICAgICBtWnNsUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKIAorICAgIC8vIFJlbW92ZSBhbGwgWlNMIHN0cmVhbSBzdGF0ZSBiZWZvcmUgZGlzY29ubmVjdDsgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGIvMTU0MDgxMjguCisgICAgbVpzbFByb2Nlc3Nvci0+ZGlzY29ubmVjdCgpOworCiAgICAgQUxPR1YoIkNhbWVyYSAlZDogRGlzY29ubmVjdGluZyBkZXZpY2UiLCBtQ2FtZXJhSWQpOwogCiAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOwpAQCAtNzUyLDYgKzc2Nyw3IEBACiAgICAgLy8gZXZlciB0YWtlIGEgcGljdHVyZS4KICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIGNvbXByb21pc2UsIHRob3VnaCB0aGlzIGxpa2VseSB3b3VsZCBpbnZvbHZlIEhBTAogICAgIC8vIGNoYW5nZXMuCisgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcHJlLWNvbmZpZ3VyZSBzdGlsbCBpbWFnZSAiCkBAIC03NTksNiArNzc1LDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorICAgIGJvb2wganBlZ1N0cmVhbUNoYW5nZWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKSAhPSBsYXN0SnBlZ1N0cmVhbUlkOwogCiAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbXM7CiAgICAgYm9vbCBjYWxsYmFja3NFbmFibGVkID0gKHBhcmFtcy5wcmV2aWV3Q2FsbGJhY2tGbGFncyAmCkBAIC04MDcsMTQgKzgyNCwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocGFyYW1zLnpzbE1vZGUgJiYgIXBhcmFtcy5yZWNvcmRpbmdIaW50KSB7CisKKyAgICBpZiAocGFyYW1zLnpzbE1vZGUgJiYgIXBhcmFtcy5yZWNvcmRpbmdIaW50ICYmCisgICAgICAgICAgICBnZXRSZWNvcmRpbmdTdHJlYW1JZCgpID09IE5PX1NUUkVBTSkgewogICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obVpzbFByb2Nlc3NvciwgcGFyYW1zKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgWlNMIHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoanBlZ1N0cmVhbUNoYW5nZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDbGVhciBaU0wgYnVmZmVyIHF1ZXVlIHdoZW4gSnBlZyBzaXplIGlzIGNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgIH0KICAgICAgICAgb3V0cHV0U3RyZWFtcy5wdXNoKGdldFpzbFN0cmVhbUlkKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1ac2xQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOwogICAgIH0KIAogICAgIG91dHB1dFN0cmVhbXMucHVzaChnZXRQcmV2aWV3U3RyZWFtSWQoKSk7CkBAIC04OTUsNiArOTIyLDIwIEBACiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdG8gc3RvcCBzdHJlYW1pbmcgZmFpbGVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENsZWFuIHVwIHJlY29yZGluZyBzdHJlYW0KKyAgICAgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPmRlbGV0ZVJlY29yZGluZ1N0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gZGVsZXRlIHJlY29yZGluZyBzdHJlYW0gYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdG9wIHByZXZpZXc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIHJlY292ZXIgdGhlIG92ZXJyaWRlIGFmdGVyIHJlY29yZGluZyBzdG9wcGVkLCBidXQKKyAgICAgICAgICAgICAgICAvLyByaWdodCBub3cgcmVjb3JkaW5nIHN0cmVhbSB3aWxsIGxpdmUgdW50aWwgaGVyZSwgc28gd2UgYXJlIGZvcmNlZCB0bworICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgaGVyZS4gVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoYXQgKGIvMTc0OTUxNjUpCisgICAgICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnJlY292ZXJPdmVycmlkZGVuSnBlZ1NpemUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIGJyZWFrCiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6V0FJVElOR19GT1JfUFJFVklFV19XSU5ET1c6IHsKICAgICAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CkBAIC05NjIsNiArMTAwMywxMCBAQAogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlNUT1BQRUQ6CiAgICAgICAgICAgICByZXMgPSBzdGFydFByZXZpZXdMKHBhcmFtcywgZmFsc2UpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBmaXJzdCBwcmV2aWV3IHJlcXVlc3QgaXMgc3VibWl0dGVkIHRvIHRoZSBIQUwgZGV2aWNlIHRvIGF2b2lkCisgICAgICAgICAgICAvLyB0d28gY29uc2VjdXRpdmUgc2V0IG9mIGNvbmZpZ3VyZV9zdHJlYW1zIGJlaW5nIGNhbGxlZCBpbnRvIHRoZSBIQUwuCisgICAgICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciB0aGlzIHRvIGF2b2lkIGluaXRpYWwgcHJldmlldyBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgc3luY1dpdGhEZXZpY2UoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlBSRVZJRVc6CiAgICAgICAgICAgICAvLyBSZWFkeSB0byBnbwpAQCAtMTAxNSwxOCArMTA2MCw5NSBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIE9uIGN1cnJlbnQgSEFMcywgY2xlYW4gdXAgWlNMIGJlZm9yZSB0cmFuc2l0aW9uaW5nIGludG8gcmVjb3JkaW5nCisgICAgaWYgKG1EZXZpY2VWZXJzaW9uICE9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgIGlmIChtWnNsUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpICE9IE5PX1NUUkVBTSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENsZWFyaW5nIG91dCB6c2wgc3RyZWFtIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyByZWNvcmRpbmcgc3RyZWFtIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RvcFN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBzdG9wIHN0cmVhbWluZyB0byBkZWxldGUgY2FsbGJhY2sgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIHRvIHN0b3Agc3RyZWFtaW5nIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNsZWFyIHpzbCBxdWV1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IG1ac2xQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gZGVsZXRlIHpzbCBzdHJlYW0gYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWNvcmQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBEaXNhYmxlIGNhbGxiYWNrcyBpZiB0aGV5J3JlIGVuYWJsZWQ7IGNhbid0IHJlY29yZCBhbmQgdXNlIGNhbGxiYWNrcywKICAgICAvLyBhbmQgd2UgY2FuJ3QgZmFpbCByZWNvcmQgc3RhcnQgd2l0aG91dCBzdGFnZWZyaWdodCBhc3NlcnRpbmcuCiAgICAgcGFyYW1zLnByZXZpZXdDYWxsYmFja0ZsYWdzID0gMDsKIAotICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbTwKLSAgICAgICAgICAgIFN0cmVhbWluZ1Byb2Nlc3NvciwKLSAgICAgICAgICAgICZTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1N0cmVhbT4obVN0cmVhbWluZ1Byb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIHJlY29yZGluZyBzdHJlYW06ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAobURldmljZVZlcnNpb24gIT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgLy8gRm9yIG5ld2VyIGRldmljZXMsIG1heSBuZWVkIHRvIHJlY29uZmlndXJlIHZpZGVvIHNuYXBzaG90IEpQRUcgc2l6ZXMKKyAgICAgICAgLy8gZHVyaW5nIHJlY29yZGluZyBzdGFydHVwLCBzbyBuZWVkIGEgbW9yZSBjb21wbGV4IHNlcXVlbmNlIGhlcmUgdG8KKyAgICAgICAgLy8gZW5zdXJlIGFuIGVhcmx5IHN0cmVhbSByZWNvbmZpZ3VyYXRpb24gZG9lc24ndCBoYXBwZW4KKyAgICAgICAgYm9vbCByZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZTsKKyAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+cmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUocGFyYW1zLCAmcmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcXVlcnkgcmVjb3JkaW5nIHN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gc3RvcCBzdHJlYW0gaGVyZSBzbyB1cGRhdGVQcm9jZXNzb3JTdHJlYW0gd29uJ3QgdHJpZ2dlciBjb25maWd1cmVTdHJlYW0KKyAgICAgICAgICAgIC8vIFJpZ2h0IG5vdyBjYW1lcmEgZGV2aWNlIGNhbm5vdCBoYW5kbGUgY29uZmlndXJlU3RyZWFtIGZhaWx1cmUgZ3JhY2VmdWxseQorICAgICAgICAgICAgLy8gd2hlbiBkZXZpY2UgaXMgc3RyZWFtaW5nCisgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zdG9wU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHN0b3Agc3RyZWFtaW5nIHRvIHVwZGF0ZSByZWNvcmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIHRvIHN0b3Agc3RyZWFtaW5nIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW08CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbWluZ1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgJlN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nU3RyZWFtPigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1pbmdQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIHJlY29yZGluZyBzdHJlYW06ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTWFpbnRhaW4gY2FsbCBzZXF1ZW5jaW5nIGZvciBIQUx2MiBkZXZpY2VzLgorICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW08CisgICAgICAgICAgICAgICAgU3RyZWFtaW5nUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICZTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1N0cmVhbT4obVN0cmVhbWluZ1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgcmVjb3JkaW5nIHN0cmVhbTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KICAgICB9CiAKICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtczsKQEAgLTEwMzUsNiArMTE1NywxNiBAQAogCiAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RhcnRTdHJlYW0oU3RyZWFtaW5nUHJvY2Vzc29yOjpSRUNPUkQsCiAgICAgICAgICAgICBvdXRwdXRTdHJlYW1zKTsKKworICAgIC8vIHN0YXJ0U3RyZWFtIG1pZ2h0IHRyaWdnZXIgYSBjb25maWd1cmVTdHJlYW0gY2FsbCBhbmQgZGV2aWNlIG1pZ2h0IGZhaWwKKyAgICAvLyBjb25maWd1cmVTdHJlYW0gZHVlIHRvIGpwZWcgc2l6ZSA+IHZpZGVvIHNpemUuIFRyeSBhZ2FpbiB3aXRoIGpwZWcgc2l6ZSBvdmVycmlkZGVuCisgICAgLy8gdG8gdmlkZW8gc2l6ZS4KKyAgICBpZiAocmVzID09IEJBRF9WQUxVRSkgeworICAgICAgICBvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKHBhcmFtcyk7CisgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnN0YXJ0U3RyZWFtKFN0cmVhbWluZ1Byb2Nlc3Nvcjo6UkVDT1JELAorICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbXMpOworICAgIH0KKwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzdGFydCByZWNvcmRpbmcgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMTE5LDYgKzEyNTEsOCBAQAogICAgIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuc3RhdGUgPCBQYXJhbWV0ZXJzOjpQUkVWSUVXKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FsbCBhdXRvRm9jdXMgd2hlbiBwcmV2aWV3IGlzIGluYWN0aXZlIChzdGF0ZSA9ICVkKS4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgbC5tUGFyYW1ldGVycy5zdGF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIApAQCAtMTE2MSw3ICsxMjk1LDcgQEAKICAgICAgICAgICogSGFuZGxlIHF1aXJrIG1vZGUgZm9yIEFGIGluIHNjZW5lIG1vZGVzCiAgICAgICAgICAqLwogICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5xdWlya3MudHJpZ2dlckFmV2l0aEF1dG8gJiYKLSAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRCAmJgorICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc2NlbmVNb2RlICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEICYmCiAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5mb2N1c01vZGUgIT0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPICYmCiAgICAgICAgICAgICAgICAgIWwubVBhcmFtZXRlcnMuZm9jdXNpbmdBcmVhc1swXS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogUXVpcms6IFN3aXRjaGluZyBmcm9tIGZvY3VzTW9kZSAlZCB0byBBVVRPIiwKQEAgLTEyMTgsNiArMTM1Miw5IEBACiAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQorICAgICAgICBpZiAobC5tUGFyYW1ldGVycy56c2xNb2RlKSB7CisgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgc3luY1dpdGhEZXZpY2UoKTsKIApAQCAtMTI2NSwxMyArMTQwMiwyOCBAQAogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdGFydGluZyBwaWN0dXJlIGNhcHR1cmUiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAKKyAgICAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKICAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gSWYgdmlkZW8gc25hcHNob3QgZmFpbCB0byBjb25maWd1cmVTdHJlYW0sIHRyeSBvdmVycmlkZSB2aWRlbyBzbmFwc2hvdCBzaXplIHRvCisgICAgICAgIC8vIHZpZGVvIHNpemUKKyAgICAgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUgJiYgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgeworICAgICAgICAgICAgb3ZlcnJpZGVWaWRlb1NuYXBzaG90U2l6ZShsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgbC5tUGFyYW1ldGVycyk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHNldCB1cCBzdGlsbCBpbWFnZSBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIHRha2VQaWN0dXJlQ291bnRlciA9ICsrbC5tUGFyYW1ldGVycy50YWtlUGljdHVyZUNvdW50ZXI7CisKKyAgICAgICAgLy8gQ2xlYXIgWlNMIGJ1ZmZlciBxdWV1ZSB3aGVuIEpwZWcgc2l6ZSBpcyBjaGFuZ2VkLgorICAgICAgICBib29sIGpwZWdTdHJlYW1DaGFuZ2VkID0gbUpwZWdQcm9jZXNzb3ItPmdldFN0cmVhbUlkKCkgIT0gbGFzdEpwZWdTdHJlYW1JZDsKKyAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuenNsTW9kZSAmJiBqcGVnU3RyZWFtQ2hhbmdlZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENsZWFyIFpTTCBidWZmZXIgcXVldWUgd2hlbiBKcGVnIHNpemUgaXMgY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEFUUkFDRV9BU1lOQ19CRUdJTihrVGFrZXBpY3R1cmVMYWJlbCwgdGFrZVBpY3R1cmVDb3VudGVyKTsKQEAgLTEyOTcsOCArMTQ0OSwxNCBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKIAorICAgIFBhcmFtZXRlcnM6OmZvY3VzTW9kZV90IGZvY3VzTW9kZUJlZm9yZSA9IGwubVBhcmFtZXRlcnMuZm9jdXNNb2RlOwogICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuc2V0KHBhcmFtcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICBQYXJhbWV0ZXJzOjpmb2N1c01vZGVfdCBmb2N1c01vZGVBZnRlciA9IGwubVBhcmFtZXRlcnMuZm9jdXNNb2RlOworCisgICAgaWYgKGwubVBhcmFtZXRlcnMuenNsTW9kZSAmJiBmb2N1c01vZGVBZnRlciAhPSBmb2N1c01vZGVCZWZvcmUpIHsKKyAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOworICAgIH0KIAogICAgIHJlcyA9IHVwZGF0ZVJlcXVlc3RzKGwubVBhcmFtZXRlcnMpOwogCkBAIC0xMzA5LDcgKzE0NjcsOCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIGlmICggY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKKyAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCisgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOwogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6UmVhZExvY2sgbChtUGFyYW1ldGVycyk7CiAKQEAgLTEzODksNiArMTU0OCwxMyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAorICAgIGlmIChtTGVnYWN5TW9kZSkgeworICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQogICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKQEAgLTE2NTQsOCArMTgyMCw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OnJlZ2lzdGVyRnJhbWVMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLAotICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpIHsKLSAgICByZXR1cm4gbUZyYW1lUHJvY2Vzc29yLT5yZWdpc3Rlckxpc3RlbmVyKG1pbklkLCBtYXhJZCwgbGlzdGVuZXIpOworICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgc2VuZFBhcnRpYWxzKSB7CisgICAgcmV0dXJuIG1GcmFtZVByb2Nlc3Nvci0+cmVnaXN0ZXJMaXN0ZW5lcihtaW5JZCwgbWF4SWQsIGxpc3RlbmVyLCBzZW5kUGFydGlhbHMpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpyZW1vdmVGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCkBAIC0xODI0LDYgKzE5OTAsMTggQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKFBhcmFtZXRlcnMgJnBhcmFtcykgeworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBjb25maWd1cmUgc3RpbGwgc2l6ZSB0byB2aWRlbyBzaXplIGJlZm9yZSByZWNvcmRpbmciCisgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICBwYXJhbXMub3ZlcnJpZGVKcGVnU2l6ZUJ5VmlkZW9TaXplKCk7CisgICAgc3RhdHVzX3QgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBwYXJhbXMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IG92ZXJyaWRlIHZpZGVvIHNuYXBzaG90IHNpemUgdG8gdmlkZW8gc2l6ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCiBjb25zdCBjaGFyKiBDYW1lcmEyQ2xpZW50OjprQXV0b2ZvY3VzTGFiZWwgPSAiYXV0b2ZvY3VzIjsKIGNvbnN0IGNoYXIqIENhbWVyYTJDbGllbnQ6OmtUYWtlcGljdHVyZUxhYmVsID0gInRha2VfcGljdHVyZSI7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggZmUwYmY3NC4uZDY4YmIyOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKQEAgLTExOCw3ICsxMTgsOCBAQAogICAgIGludCBnZXRac2xTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCi0gICAgICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOworICAgICAgICAgICAgd3A8Y2FtZXJhMjo6RnJhbWVQcm9jZXNzb3I6OkZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLAorICAgICAgICAgICAgYm9vbCBzZW5kUGFydGlhbHMgPSB0cnVlKTsKICAgICBzdGF0dXNfdCByZW1vdmVGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCiAgICAgICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogCkBAIC0xNzAsNyArMTcxLDYgQEAKIAogICAgIHZvaWQgICAgIHNldFByZXZpZXdDYWxsYmFja0ZsYWdMKFBhcmFtZXRlcnMgJnBhcmFtcywgaW50IGZsYWcpOwogICAgIHN0YXR1c190IHVwZGF0ZVJlcXVlc3RzKFBhcmFtZXRlcnMgJnBhcmFtcyk7Ci0gICAgaW50IG1EZXZpY2VWZXJzaW9uOwogCiAgICAgLy8gVXNlZCB3aXRoIHN0cmVhbSBJRHMKICAgICBzdGF0aWMgY29uc3QgaW50IE5PX1NUUkVBTSA9IC0xOwpAQCAtMjA0LDkgKzIwNCwxMyBAQAogICAgIGJvb2wgbUFmSW5Nb3Rpb247CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCisgICAgYm9vbCBtTGVnYWN5TW9kZTsKIAogICAgIC8vIFdhaXQgdW50aWwgdGhlIGNhbWVyYSBkZXZpY2UgaGFzIHJlY2VpdmVkIHRoZSBsYXRlc3QgY29udHJvbCBzZXR0aW5ncwogICAgIHN0YXR1c190IHN5bmNXaXRoRGV2aWNlKCk7CisKKyAgICAvLyBWaWRlbyBzbmFwc2hvdCBqcGVnIHNpemUgb3ZlcnJpZGluZyBoZWxwZXIgZnVuY3Rpb24KKyAgICBzdGF0dXNfdCBvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKFBhcmFtZXRlcnMgJnBhcmFtcyk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGJkNjgwNWQuLjFhNGQ5YTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CiAgICAgICAgIENsaWVudChjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQogewpAQCAtNTQsNiArNTQsNyBAQAogICAgIC8vIENhbGxiYWNrIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7CiAgICAgbU9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oMCwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKKyAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogfQpAQCAtNzksMTMgKzgwLDEzIEBACiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgbUhhcmR3YXJlLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIG1IYXJkd2FyZS0+c2V0Q2FsbGJhY2tzKG5vdGlmeUNhbGxiYWNrLAogICAgICAgICAgICAgZGF0YUNhbGxiYWNrLAogICAgICAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wLAotICAgICAgICAgICAgKHZvaWQgKiltQ2FtZXJhSWQpOworICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1DYW1lcmFJZCk7CiAKICAgICAvLyBFbmFibGUgem9vbSwgZXJyb3IsIGZvY3VzLCBhbmQgbWV0YWRhdGEgbWVzc2FnZXMgYnkgZGVmYXVsdAogICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19FUlJPUiB8IENBTUVSQV9NU0dfWk9PTSB8IENBTUVSQV9NU0dfRk9DVVMgfApAQCAtMTIxLDYgKzEyMiwxNiBAQAogICAgICAgICAgICAgbUNsaWVudFBpZCk7CiAgICAgbGVuID0gKGxlbiA+IFNJWkUgLSAxKSA/IFNJWkUgLSAxIDogbGVuOwogICAgIHdyaXRlKGZkLCBidWZmZXIsIGxlbik7CisKKyAgICBsZW4gPSBzbnByaW50ZihidWZmZXIsIFNJWkUsICJMYXRlc3Qgc2V0IHBhcmFtZXRlcnM6XG4iKTsKKyAgICBsZW4gPSAobGVuID4gU0laRSAtIDEpID8gU0laRSAtIDEgOiBsZW47CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgbGVuKTsKKworICAgIG1MYXRlc3RTZXRQYXJhbWV0ZXJzLmR1bXAoZmQsIGFyZ3MpOworCisgICAgY29uc3QgY2hhciAqZW5kZHVtcCA9ICJcblxuIjsKKyAgICB3cml0ZShmZCwgZW5kZHVtcCwgc3RybGVuKGVuZGR1bXApKTsKKwogICAgIHJldHVybiBtSGFyZHdhcmUtPmR1bXAoZmQsIGFyZ3MpOwogfQogCkBAIC01NDksNiArNTYwLDcgQEAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKIAorICAgIG1MYXRlc3RTZXRQYXJhbWV0ZXJzID0gQ2FtZXJhUGFyYW1ldGVycyhwYXJhbXMpOwogICAgIENhbWVyYVBhcmFtZXRlcnMgcChwYXJhbXMpOwogICAgIHJldHVybiBtSGFyZHdhcmUtPnNldFBhcmFtZXRlcnMocCk7CiB9CkBAIC01NTYsNyArNTY4LDggQEAKIC8vIGdldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogU3RyaW5nOCBDYW1lcmFDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBTdHJpbmc4KCk7CisgICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcworICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gU3RyaW5nOCgpOwogCiAgICAgU3RyaW5nOCBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkuZmxhdHRlbigpKTsKICAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CkBAIC01NzUsNiArNTg4LDEzIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCisgICAgaWYgKG1MZWdhY3lNb2RlKSB7CisgICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKICAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC05MjksNyArOTQ5LDIwIEBACiAgICAgfQogICAgIHByZXZpZXdCdWZmZXIgPSBtUHJldmlld0J1ZmZlcjsKIAotICAgIG1lbWNweShwcmV2aWV3QnVmZmVyLT5iYXNlKCksICh1aW50OF90ICopaGVhcC0+YmFzZSgpICsgb2Zmc2V0LCBzaXplKTsKKyAgICB2b2lkKiBwcmV2aWV3QnVmZmVyQmFzZSA9IHByZXZpZXdCdWZmZXItPmJhc2UoKTsKKyAgICB2b2lkKiBoZWFwQmFzZSA9IGhlYXAtPmJhc2UoKTsKKworICAgIGlmIChoZWFwQmFzZSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIG1tYXAgaGVhcCBmb3IgcHJldmlldyBmcmFtZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocHJldmlld0J1ZmZlckJhc2UgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBtbWFwIHByZXZpZXcgYnVmZmVyIGZvciBwcmV2aWV3IGZyYW1lLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWVtY3B5KHByZXZpZXdCdWZmZXJCYXNlLCAodWludDhfdCAqKSBoZWFwQmFzZSArIG9mZnNldCwgc2l6ZSk7CiAKICAgICBzcDxNZW1vcnlCYXNlPiBmcmFtZSA9IG5ldyBNZW1vcnlCYXNlKHByZXZpZXdCdWZmZXIsIDAsIHNpemUpOwogICAgIGlmIChmcmFtZSA9PSAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCA0Yjg5NTY0Li42M2E5ZDBmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTY0LDcgKzY0LDggQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAorICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAogICAgIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOwpAQCAtMTI5LDYgKzEzMCw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlld0NhbGxiYWNrRmxhZzsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsgICAgIC8vIEN1cnJlbnQgZGlzcGxheSBvcmllbnRhdGlvbgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlTaHV0dGVyU291bmQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGVnYWN5TW9kZTsgLy8gY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGU/CiAKICAgICAvLyBFbnN1cmVzIGF0b21pY2l0eSBhbW9uZyB0aGUgcHVibGljIG1ldGhvZHMKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwpAQCAtMTQwLDYgKzE0Miw5IEBACiAgICAgLy8gb2YgdGhlIG9yaWdpbmFsIG9uZSksIHdlIGFsbG9jYXRlIG1QcmV2aWV3QnVmZmVyIGFuZCByZXVzZSBpdCBpZiBwb3NzaWJsZS4KICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gICAgICAgICAgICAgIG1QcmV2aWV3QnVmZmVyOwogCisgICAgLy8gRGVidWdnaW5nIGluZm9ybWF0aW9uCisgICAgQ2FtZXJhUGFyYW1ldGVycyAgICAgICAgICAgICAgICBtTGF0ZXN0U2V0UGFyYW1ldGVyczsKKwogICAgIC8vIFdlIG5lZWQgdG8gYXZvaWQgdGhlIGRlYWRsb2NrIHdoZW4gdGhlIGluY29taW5nIGNvbW1hbmQgdGhyZWFkIGFuZAogICAgIC8vIHRoZSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSBjYWxsYmFjayB0aHJlYWQgYm90aCB3YW50IHRvIGdyYWIgbUxvY2suCiAgICAgLy8gQW4gZXh0cmEgZmxhZyBpcyB1c2VkIHRvIHRlbGwgdGhlIGNhbGxiYWNrIHRocmVhZCB0aGF0IGl0IHNob3VsZCBzdG9wCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcAppbmRleCBkMmFjNzljLi5iZjMzMThlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKQEAgLTExMCwxMSArMTEwLDEzIEBACiAgICAgaWYgKCFtQ2FsbGJhY2tUb0FwcCAmJiBtQ2FsbGJhY2tDb25zdW1lciA9PSAwKSB7CiAgICAgICAgIC8vIENyZWF0ZSBDUFUgYnVmZmVyIHF1ZXVlIGVuZHBvaW50LCBzaW5jZSBhcHAgaGFzbid0IGdpdmVuIHVzIG9uZQogICAgICAgICAvLyBNYWtlIGl0IGFzeW5jIHRvIGF2b2lkIGRpc2Nvbm5lY3QgZGVhZGxvY2tzCi0gICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICBtQ2FsbGJhY2tDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihicSwga0NhbGxiYWNrSGVhcENvdW50KTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtQ2FsbGJhY2tDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwga0NhbGxiYWNrSGVhcENvdW50KTsKICAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTJDbGllbnQ6OkNhbGxiYWNrQ29uc3VtZXIiKSk7Ci0gICAgICAgIG1DYWxsYmFja1dpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbUNhbGxiYWNrV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgIH0KIAogICAgIGlmIChtQ2FsbGJhY2tTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKQEAgLTE1Myw3ICsxNTUsNyBAQAogICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9ybWF0LCBwYXJhbXMucHJldmlld0Zvcm1hdCk7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1DYWxsYmFja1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucHJldmlld1dpZHRoLCBwYXJhbXMucHJldmlld0hlaWdodCwKLSAgICAgICAgICAgICAgICBjYWxsYmFja0Zvcm1hdCwgMCwgJm1DYWxsYmFja1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0Zvcm1hdCwgJm1DYWxsYmFja1N0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBjYWxsYmFja3M6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAppbmRleCA4YTRjZTRlLi45ODQ5ZjRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMTA0LDEzICsxMDYsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKSB7Ci0gICAgQUxPR1YoIiVzOiBMaXN0ZW5lciBmb3VuZCBuZXcgZnJhbWUiLCBfX0ZVTkNUSU9OX18pOwordm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogTmV3IHJlc3VsdCBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7Ci0gICAgbU5ld0ZyYW1lSWQgPSByZXF1ZXN0SWQ7Ci0gICAgbU5ld0ZyYW1lID0gZnJhbWU7CisgICAgbU5ld0ZyYW1lSWQgPSByZXN1bHQubVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgbU5ld0ZyYW1lID0gcmVzdWx0Lm1NZXRhZGF0YTsKICAgICBpZiAoIW1OZXdGcmFtZVJlY2VpdmVkKSB7CiAgICAgICAgIG1OZXdGcmFtZVJlY2VpdmVkID0gdHJ1ZTsKICAgICAgICAgbU5ld0ZyYW1lU2lnbmFsLnNpZ25hbCgpOwpAQCAtMzQ5LDggKzM1MCwxMCBAQAogICAgICAgICByZXR1cm4gRE9ORTsKICAgICB9CiAKKyAgICAvLyBXZSBkb24ndCB3YW50IHRvIGdldCBwYXJ0aWFsIHJlc3VsdHMgZm9yIFpTTCBjYXB0dXJlLgogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKG1DYXB0dXJlSWQsIG1DYXB0dXJlSWQgKyAxLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIC8vIFRPRE86IEFjdHVhbGx5IHNlbGVjdCB0aGUgcmlnaHQgdGhpbmcgaGVyZS4KICAgICByZXMgPSBwcm9jZXNzb3ItPnB1c2hUb1JlcHJvY2VzcyhtQ2FwdHVyZUlkKTsKQEAgLTM5Miw4ICszOTUsMTQgQEAKIAogICAgIGJvb2wgaXNBZUNvbnZlcmdlZCA9IGZhbHNlOwogICAgIC8vIEdldCB0aGUgb25GcmFtZUF2YWlsYWJsZSBjYWxsYmFjayB3aGVuIHRoZSByZXF1ZXN0SUQgPT0gbUNhcHR1cmVJZAorICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZ2V0IHBhcnRpYWwgcmVzdWx0cyBmb3Igbm9ybWFsIGNhcHR1cmUsIGFzIHdlIG5lZWQKKyAgICAvLyBHZXQgQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QIGZyb20gdGhlIGNhcHR1cmUgcmVzdWx0LCBidXQgcGFydGlhbAorICAgIC8vIHJlc3VsdCBkb2Vzbid0IGhhdmUgdG8gaGF2ZSB0aGlzIG1ldGFkYXRhIGF2YWlsYWJsZS4KKyAgICAvLyBUT0RPOiBVcGRhdGUgdG8gdXNlIHRoZSBIQUx2MyBzaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVtb3ZlIHRoZQorICAgIC8vIG5lZWQgZm9yIHRoaXMgbGlzdGVuZXIgYW5kIG1ha2UgaXQgZmFzdGVyLiBzZWUgYnVnIDEyNTMwNjI4LgogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKG1DYXB0dXJlSWQsIG1DYXB0dXJlSWQgKyAxLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwpAQCAtNDM2LDExICs0NDUsMTggQEAKICAgICBpZiAobU5ld0FFU3RhdGUpIHsKICAgICAgICAgaWYgKCFtQWVJblByZWNhcHR1cmUpIHsKICAgICAgICAgICAgIC8vIFdhaXRpbmcgdG8gc2VlIFBSRUNBUFRVUkUgc3RhdGUKLSAgICAgICAgICAgIGlmIChtQUVUcmlnZ2VySWQgPT0gbVRyaWdnZXJJZCAmJgotICAgICAgICAgICAgICAgICAgICBtQUVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfUFJFQ0FQVFVSRSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogR290IHByZWNhcHR1cmUgc3RhcnQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIG1BZUluUHJlY2FwdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVRpbWVvdXRDb3VudCA9IGtNYXhUaW1lb3V0c0ZvclByZWNhcHR1cmVFbmQ7CisgICAgICAgICAgICBpZiAobUFFVHJpZ2dlcklkID09IG1UcmlnZ2VySWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX1BSRUNBUFRVUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBHb3QgcHJlY2FwdHVyZSBzdGFydCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIG1BZUluUHJlY2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lb3V0Q291bnQgPSBrTWF4VGltZW91dHNGb3JQcmVjYXB0dXJlRW5kOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0NPTlZFUkdFRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0ZMQVNIX1JFUVVJUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGxlZ2FsIHRvIHRyYW5zaXQgdG8gQ09OVkVSR0VEIG9yIEZMQVNIX1JFUVVJUkVECisgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIGEgdHJpZ2dlci4KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBBRSBpcyBhbHJlYWR5IGluIGdvb2Qgc3RhdGUsIHN0YXJ0IGNhcHR1cmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBXYWl0aW5nIHRvIHNlZSBQUkVDQVBUVVJFIHN0YXRlIGVuZApAQCAtNTgzLDEyICs1OTksMTUgQEAKICAgICAgICAgZW50cnkgPSBtTmV3RnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIk5vIHRpbWVzdGFtcCBmaWVsZCBpbiBjYXB0dXJlIGZyYW1lISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbnRyeS5kYXRhLmk2NFswXSAhPSBtQ2FwdHVyZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgQUxPR1coIk1pc21hdGNoZWQgY2FwdHVyZSB0aW1lc3RhbXBzOiBNZXRhZGF0YSBmcmFtZSAlbGxkLCIKLSAgICAgICAgICAgICAgICAgICAgIiBjYXB0dXJlZCBidWZmZXIgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTY0WzBdLAotICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVRpbWVzdGFtcCk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEuaTY0WzBdICE9IG1DYXB0dXJlVGltZXN0YW1wKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk1pc21hdGNoZWQgY2FwdHVyZSB0aW1lc3RhbXBzOiBNZXRhZGF0YSBmcmFtZSAlIiBQUklkNjQgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNhcHR1cmVkIGJ1ZmZlciAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmk2NFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlVGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJUaW1lc3RhbXAgbWV0YWRhdGEgaXMgbWFsZm9ybWVkISIpOwogICAgICAgICB9CiAgICAgICAgIGNsaWVudC0+cmVtb3ZlRnJhbWVMaXN0ZW5lcihtQ2FwdHVyZUlkLCBtQ2FwdHVyZUlkICsgMSwgdGhpcyk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCmluZGV4IDlmYjRlZTcuLmQ0MmFiMTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CiAjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKICNpbmNsdWRlICJQYXJhbWV0ZXJzLmgiCiAjaW5jbHVkZSAiRnJhbWVQcm9jZXNzb3IuaCIKIApAQCAtNjEsOCArNjIsOCBAQAogICAgIC8vIE5vdGlmaWNhdGlvbnMgYWJvdXQgQUUgc3RhdGUgY2hhbmdlcwogICAgIHZvaWQgbm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogCi0gICAgLy8gTm90aWZpY2F0aW9ucyBmcm9tIHRoZSBmcmFtZSBwcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICAvLyBOb3RpZmljYXRpb24gZnJvbSB0aGUgZnJhbWUgcHJvY2Vzc29yCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKICAgICAvLyBOb3RpZmljYXRpb25zIGZyb20gdGhlIEpQRUcgcHJvY2Vzc29yCiAgICAgdm9pZCBvbkNhcHR1cmVBdmFpbGFibGUobnNlY3NfdCB0aW1lc3RhbXAsIHNwPE1lbW9yeUJhc2U+IGNhcHR1cmVCdWZmZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKaW5kZXggMTlhY2FlNC4uMzEyYTc4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCkBAIC00MCw3ICs0MCwxMiBAQAogCiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwotICAgICAgICBtVXNlUGFydGlhbFF1aXJrID0gbC5tUGFyYW1ldGVycy5xdWlya3MucGFydGlhbFJlc3VsdHM7CisKKyAgICAgICAgaWYgKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCA9IChtTnVtUGFydGlhbFJlc3VsdHMgPiAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0ID0gbC5tUGFyYW1ldGVycy5xdWlya3MucGFydGlhbFJlc3VsdHM7CisgICAgICAgIH0KIAogICAgICAgICAvLyBJbml0aWFsaXplIHN0YXJ0aW5nIDNBIHN0YXRlCiAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkID0gbC5tUGFyYW1ldGVycy5hZlRyaWdnZXJDb3VudGVyOwpAQCAtNTUsNyArNjAsNyBAQAogRnJhbWVQcm9jZXNzb3I6On5GcmFtZVByb2Nlc3NvcigpIHsKIH0KIAotYm9vbCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhbWVyYU1ldGFkYXRhICZmcmFtZSwKK2Jvb2wgRnJhbWVQcm9jZXNzb3I6OnByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAKICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKQEAgLTYzLDE3ICs2OCwyMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgYm9vbCBwYXJ0aWFsUmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKG1Vc2VQYXJ0aWFsUXVpcmspIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7Ci0gICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCk7Ci0gICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDAgJiYKLSAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKLSAgICAgICAgICAgIHBhcnRpYWxSZXN1bHQgPSB0cnVlOworICAgIGJvb2wgaXNQYXJ0aWFsUmVzdWx0ID0gZmFsc2U7CisgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgIGlmIChjbGllbnQtPmdldENhbWVyYURldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gZnJhbWUubVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPCBtTnVtUGFydGlhbFJlc3VsdHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKKyAgICAgICAgICAgIGVudHJ5ID0gZnJhbWUubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKKyAgICAgICAgICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFwYXJ0aWFsUmVzdWx0ICYmIHByb2Nlc3NGYWNlRGV0ZWN0KGZyYW1lLCBjbGllbnQpICE9IE9LKSB7CisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQgJiYgcHJvY2Vzc0ZhY2VEZXRlY3QoZnJhbWUubU1ldGFkYXRhLCBjbGllbnQpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTE2OCw3ICsxNzcsNyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZhY2VTY29yZXNbaV0gPiAxMDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IEZhY2UgaW5kZXggJWQgd2l0aCBvdXQgb2YgcmFuZ2Ugc2NvcmUgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dXKCIlczogRmFjZSBpbmRleCAlenUgd2l0aCBvdXQgb2YgcmFuZ2Ugc2NvcmUgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpLCBmYWNlU2NvcmVzW2ldKTsKICAgICAgICAgICAgIH0KIApAQCAtMjEyLDE0ICsyMjEsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEZyYW1lUHJvY2Vzc29yOjpwcm9jZXNzM2FTdGF0ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCitzdGF0dXNfdCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2VzczNhU3RhdGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmZnJhbWUsCiAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpIHsKIAogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gZnJhbWUubU1ldGFkYXRhOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwogICAgIGludCBjYW1lcmFJZCA9IGNsaWVudC0+Z2V0Q2FtZXJhSWQoKTsKIAotICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOworICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOwogICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBlbnRyeS5kYXRhLmkzMlswXTsKIAogICAgIC8vIERvbid0IHNlbmQgM0Egbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNhbWUgZnJhbWUgbnVtYmVyIHR3aWNlCkBAIC0yMzgsMjYgKzI0OCwzMSBAQAogCiAgICAgLy8gVE9ETzogQWxzbyB1c2UgQUUgbW9kZSwgQUUgdHJpZ2dlciBJRAogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWZNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hd2JNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZVN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAorICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZuZXczYVN0YXRlLmF3YlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PGludDMyX3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKLSAgICAgICAgICAgICZuZXczYVN0YXRlLmFmVHJpZ2dlcklkLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOworICAgIGlmIChjbGllbnQtPmdldENhbWVyYURldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBuZXczYVN0YXRlLmFmVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZDsKKyAgICAgICAgbmV3M2FTdGF0ZS5hZVRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8aW50MzJfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAorICAgICAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDxpbnQzMl90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQsCi0gICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKKyAgICAgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PGludDMyX3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKKyAgICAgICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CisgICAgfQogCiAgICAgaWYgKCFnb3RBbGxTdGF0ZXMpIHJldHVybiBCQURfVkFMVUU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKaW5kZXggODU2YWQzMi4uNjhjZjU1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKQEAgLTUxLDE0ICs1MSwxNCBAQAogCiAgICAgdm9pZCBwcm9jZXNzTmV3RnJhbWVzKGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpOwogCi0gICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCiAgICAgc3RhdHVzX3QgcHJvY2Vzc0ZhY2VEZXRlY3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4gJmNsaWVudCk7CiAKICAgICAvLyBTZW5kIDNBIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGNsaWVudCBiYXNlZCBvbiBmcmFtZSBtZXRhZGF0YQotICAgIHN0YXR1c190IHByb2Nlc3MzYVN0YXRlKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKKyAgICBzdGF0dXNfdCBwcm9jZXNzM2FTdGF0ZShjb25zdCBDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpOwogCiAgICAgLy8gSGVscGVyIGZvciBwcm9jZXNzM2FTdGF0ZQpAQCAtOTEsOCArOTEsOCBAQAogICAgICAgICB9CiAgICAgfSBtM2FTdGF0ZTsKIAotICAgIC8vIFdoZXRoZXIgdGhlIHBhcnRpYWwgcmVzdWx0IHF1aXJrIGlzIGVuYWJsZWQgZm9yIHRoaXMgZGV2aWNlCi0gICAgYm9vbCBtVXNlUGFydGlhbFF1aXJrOworICAgIC8vIFdoZXRoZXIgdGhlIHBhcnRpYWwgcmVzdWx0IGlzIGVuYWJsZWQgZm9yIHRoaXMgZGV2aWNlCisgICAgYm9vbCBtVXNlUGFydGlhbFJlc3VsdDsKIAogICAgIC8vIFRyYWNrIG1vc3QgcmVjZW50IGZyYW1lIG51bWJlciBmb3Igd2hpY2ggM0Egbm90aWZpY2F0aW9ucyB3ZXJlIHNlbnQgZm9yLgogICAgIC8vIFVzZWQgdG8gZmlsdGVyIGFnYWluc3Qgc2VuZGluZyAzQSBub3RpZmljYXRpb25zIGZvciB0aGUgc2FtZSBmcmFtZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAKaW5kZXggMmYwYzY3ZC4uOWVjYWI3MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwCkBAIC0xOTcsNyArMTk3LDcgQEAKIHZvaWQgSnBlZ0NvbXByZXNzb3I6OmpwZWdJbml0RGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIEpwZWdEZXN0aW5hdGlvbiAqZGVzdD0gc3RhdGljX2Nhc3Q8SnBlZ0Rlc3RpbmF0aW9uKj4oY2luZm8tPmRlc3QpOwotICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXN0aW5hdGlvbiB0byAlcCwgc2l6ZSAlZCIsCisgICAgQUxPR1YoIiVzOiBTZXR0aW5nIGRlc3RpbmF0aW9uIHRvICVwLCBzaXplICV6dSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlc3QtPnBhcmVudC0+bUpwZWdCdWZmZXItPmRhdGEsIGtNYXhKcGVnU2l6ZSk7CiAgICAgZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IChKT0NURVQqKShkZXN0LT5wYXJlbnQtPm1KcGVnQnVmZmVyLT5kYXRhKTsKICAgICBkZXN0LT5mcmVlX2luX2J1ZmZlciA9IGtNYXhKcGVnU2l6ZTsKQEAgLTIxMyw3ICsyMTMsNyBAQAogdm9pZCBKcGVnQ29tcHJlc3Nvcjo6anBlZ1Rlcm1EZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykgewogICAgICh2b2lkKSBjaW5mbzsgLy8gVE9ETzogY2xlYW4gdXAKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIEFMT0dWKCIlczogRG9uZSB3cml0aW5nIEpQRUcgZGF0YS4gJWQgYnl0ZXMgbGVmdCBpbiBidWZmZXIiLAorICAgIEFMT0dWKCIlczogRG9uZSB3cml0aW5nIEpQRUcgZGF0YS4gJXp1IGJ5dGVzIGxlZnQgaW4gYnVmZmVyIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IGVjODE0NTYuLmI0MzM3ODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTczLDMwICs3Myw0MyBAQAogICAgIH0KIAogICAgIC8vIEZpbmQgb3V0IGJ1ZmZlciBzaXplIGZvciBKUEVHCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4SnBlZ1NpemUgPQotICAgICAgICAgICAgcGFyYW1zLnN0YXRpY0luZm8oQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKLSAgICBpZiAobWF4SnBlZ1NpemUuY291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBBTkRST0lEX0pQRUdfTUFYX1NJWkUhIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgc3NpemVfdCBtYXhKcGVnU2l6ZSA9IGRldmljZS0+Z2V0SnBlZ0J1ZmZlclNpemUocGFyYW1zLnBpY3R1cmVXaWR0aCwgcGFyYW1zLnBpY3R1cmVIZWlnaHQpOworICAgIGlmIChtYXhKcGVnU2l6ZSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBKcGVnIGJ1ZmZlciBzaXplICglenUpIGlzIGludmFsaWQgIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbWF4SnBlZ1NpemUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgaWYgKG1DYXB0dXJlQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludAotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihicSwgMSk7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUNvbnN1bWVyIikpOwotICAgICAgICBtQ2FwdHVyZVdpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbUNhcHR1cmVXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisgICAgfQorCisgICAgLy8gU2luY2UgYXNobWVtIGhlYXBzIGFyZSByb3VuZGVkIHVwIHRvIHBhZ2Ugc2l6ZSwgZG9uJ3QgcmVhbGxvY2F0ZSBpZgorICAgIC8vIHRoZSBjYXB0dXJlIGhlYXAgaXNuJ3QgZXhhY3RseSB0aGUgc2FtZSBzaXplIGFzIHRoZSByZXF1aXJlZCBKUEVHIGJ1ZmZlcgorICAgIGNvbnN0IHNpemVfdCBIRUFQX1NMQUNLX0ZBQ1RPUiA9IDI7CisgICAgaWYgKG1DYXB0dXJlSGVhcCA9PSAwIHx8CisgICAgICAgICAgICAobUNhcHR1cmVIZWFwLT5nZXRTaXplKCkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1heEpwZWdTaXplKSkgfHwKKyAgICAgICAgICAgIChtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSA+CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obWF4SnBlZ1NpemUpICogSEVBUF9TTEFDS19GQUNUT1IpICkgewogICAgICAgICAvLyBDcmVhdGUgbWVtb3J5IGZvciBBUEkgY29uc3VtcHRpb24KLSAgICAgICAgbUNhcHR1cmVIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1heEpwZWdTaXplLmRhdGEuaTMyWzBdLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYTJDbGllbnQ6OkNhcHR1cmVIZWFwIik7CisgICAgICAgIG1DYXB0dXJlSGVhcC5jbGVhcigpOworICAgICAgICBtQ2FwdHVyZUhlYXAgPQorICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlIZWFwQmFzZShtYXhKcGVnU2l6ZSwgMCwgIkNhbWVyYTJDbGllbnQ6OkNhcHR1cmVIZWFwIik7CiAgICAgICAgIGlmIChtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2FwdHVyZSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KICAgICB9CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEpQRUcgY2FwdHVyZSBoZWFwIG5vdyAlZCBieXRlczsgcmVxdWVzdGVkICVkIGJ5dGVzIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSwgbWF4SnBlZ1NpemUpOwogCiAgICAgaWYgKG1DYXB0dXJlU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCkBAIC0xMzIsOCArMTQ1LDcgQEAKICAgICAgICAgLy8gQ3JlYXRlIHN0cmVhbSBmb3IgSEFMIHByb2R1Y3Rpb24KICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUNhcHR1cmVXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnBpY3R1cmVXaWR0aCwgcGFyYW1zLnBpY3R1cmVIZWlnaHQsCi0gICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBtYXhKcGVnU2l6ZS5kYXRhLmkzMlswXSwKLSAgICAgICAgICAgICAgICAmbUNhcHR1cmVTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCAmbUNhcHR1cmVTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FwdHVyZTogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtMjQxLDcgKzI1Myw3IEBACiAgICAgICAgIHNpemVfdCBoZWFwU2l6ZSA9IG1DYXB0dXJlSGVhcC0+Z2V0U2l6ZSgpOwogICAgICAgICBpZiAoanBlZ1NpemUgPiBoZWFwU2l6ZSkgewogICAgICAgICAgICAgQUxPR1coIiVzOiBKUEVHIGltYWdlIGlzIGxhcmdlciB0aGFuIGV4cGVjdGVkLCB0cnVuY2F0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgIihnb3QgJWQsIGV4cGVjdGVkIGF0IG1vc3QgJWQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgIihnb3QgJXp1LCBleHBlY3RlZCBhdCBtb3N0ICV6dSBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGpwZWdTaXplLCBoZWFwU2l6ZSk7CiAgICAgICAgICAgICBqcGVnU2l6ZSA9IGhlYXBTaXplOwogICAgICAgICB9CkBAIC0zMzUsMTMgKzM0NywxMyBAQAogICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemUgLSBNQVJLRVJfTEVOR1RIOwogICAgICAgICAgICAgdWludDhfdCAqZW5kID0ganBlZ0J1ZmZlciArIG9mZnNldDsKICAgICAgICAgICAgIGlmIChjaGVja0pwZWdTdGFydChqcGVnQnVmZmVyKSAmJiBjaGVja0pwZWdFbmQoZW5kKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJGb3VuZCBKUEVHIHRyYW5zcG9ydCBoZWFkZXIsIGltZyBzaXplICVkIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIEpQRUcgdHJhbnNwb3J0IGhlYWRlciwgaW1nIHNpemUgJXp1Iiwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dXKCJGb3VuZCBKUEVHIHRyYW5zcG9ydCBoZWFkZXIgd2l0aCBiYWQgSW1hZ2UgU3RhcnQvRW5kIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiRm91bmQgSlBFRyB0cmFuc3BvcnQgaGVhZGVyIHdpdGggYmFkIHNpemUgJWQiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dXKCJGb3VuZCBKUEVHIHRyYW5zcG9ydCBoZWFkZXIgd2l0aCBiYWQgc2l6ZSAlenUiLCBzaXplKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzU3LDE1ICszNjksMTUgQEAKICAgICAgICAgc2VnbWVudF90ICpzZWdtZW50ID0gKHNlZ21lbnRfdCopKGpwZWdCdWZmZXIgKyBzaXplKTsKICAgICAgICAgdWludDhfdCB0eXBlID0gY2hlY2tKcGVnTWFya2VyKHNlZ21lbnQtPm1hcmtlcik7CiAgICAgICAgIGlmICh0eXBlID09IDApIHsgLy8gaW52YWxpZCBtYXJrZXIsIG5vIG1vcmUgc2VnbWVudHMsIGJlZ2luIEpQRUcgZGF0YQotICAgICAgICAgICAgQUxPR1YoIkpQRUcgc3RyZWFtIGZvdW5kIGJlZ2lubmluZyBhdCBvZmZzZXQgJWQiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dWKCJKUEVHIHN0cmVhbSBmb3VuZCBiZWdpbm5pbmcgYXQgb2Zmc2V0ICV6dSIsIHNpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gRU9JIHx8IHNpemUgPiBtYXhTaXplIC0gc2l6ZW9mKHNlZ21lbnRfdCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJHb3QgcHJlbWF0dXJlIEVuZCBiZWZvcmUgSlBFRyBkYXRhLCBvZmZzZXQgJWQiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCJHb3QgcHJlbWF0dXJlIEVuZCBiZWZvcmUgSlBFRyBkYXRhLCBvZmZzZXQgJXp1Iiwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBzaXplX3QgbGVuZ3RoID0gbnRvaHMoc2VnbWVudC0+bGVuZ3RoKTsKLSAgICAgICAgQUxPR1YoIkpGSUYgU2VnbWVudCwgdHlwZSAleCBsZW5ndGggJXgiLCB0eXBlLCBsZW5ndGgpOworICAgICAgICBBTE9HVigiSkZJRiBTZWdtZW50LCB0eXBlICV4IGxlbmd0aCAlengiLCB0eXBlLCBsZW5ndGgpOwogICAgICAgICBzaXplICs9IGxlbmd0aCArIE1BUktFUl9MRU5HVEg7CiAgICAgfQogCkBAIC0zODUsMTAgKzM5NywxMCBAQAogICAgIH0KIAogICAgIGlmIChzaXplID4gbWF4U2l6ZSkgewotICAgICAgICBBTE9HVygiSlBFRyBzaXplICVkIHRvbyBsYXJnZSwgcmVkdWNpbmcgdG8gbWF4U2l6ZSAlZCIsIHNpemUsIG1heFNpemUpOworICAgICAgICBBTE9HVygiSlBFRyBzaXplICV6dSB0b28gbGFyZ2UsIHJlZHVjaW5nIHRvIG1heFNpemUgJXp1Iiwgc2l6ZSwgbWF4U2l6ZSk7CiAgICAgICAgIHNpemUgPSBtYXhTaXplOwogICAgIH0KLSAgICBBTE9HVigiRmluYWwgSlBFRyBzaXplICVkIiwgc2l6ZSk7CisgICAgQUxPR1YoIkZpbmFsIEpQRUcgc2l6ZSAlenUiLCBzaXplKTsKICAgICByZXR1cm4gc2l6ZTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDYxZTM1ODguLjdiOTBkMjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTI5LDYgKzI5LDkgQEAKIAogI2luY2x1ZGUgIlBhcmFtZXRlcnMuaCIKICNpbmNsdWRlICJzeXN0ZW0vY2FtZXJhLmgiCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oIgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEyIHsKQEAgLTQzLDcgKzQ2LDcgQEAKIFBhcmFtZXRlcnM6On5QYXJhbWV0ZXJzKCkgewogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJzOjppbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvKSB7CitzdGF0dXNfdCBQYXJhbWV0ZXJzOjppbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvLCBpbnQgZGV2aWNlVmVyc2lvbikgewogICAgIHN0YXR1c190IHJlczsKIAogICAgIGlmIChpbmZvLT5lbnRyeUNvdW50KCkgPT0gMCkgewpAQCAtNTEsNiArNTQsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBQYXJhbWV0ZXJzOjppbmZvID0gaW5mbzsKKyAgICBtRGV2aWNlVmVyc2lvbiA9IGRldmljZVZlcnNpb247CiAKICAgICByZXMgPSBidWlsZEZhc3RJbmZvKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKQEAgLTU5LDEyICs2Myw0MiBAQAogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBjb25zdCBTaXplIE1BWF9QUkVWSUVXX1NJWkUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFByZXZpZXdTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KKyAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CisgICAgaW50MzJfdCBtYXhWaWRlb1dpZHRoID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIFZJREVPX0VOQ09ERVJfSDI2NCk7CisgICAgaW50MzJfdCBtYXhWaWRlb0hlaWdodCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5oZWlnaHQubWF4IiwgVklERU9fRU5DT0RFUl9IMjY0KTsKKyAgICBjb25zdCBTaXplIE1BWF9WSURFT19TSVpFID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CisgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKE1BWF9WSURFT19TSVpFLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIC8vIFRPRE86IFBpY2sgbW9yZSBpbnRlbGxpZ2VudGx5Ci0gICAgcHJldmlld1dpZHRoID0gYXZhaWxhYmxlUHJldmlld1NpemVzWzBdLndpZHRoOwotICAgIHByZXZpZXdIZWlnaHQgPSBhdmFpbGFibGVQcmV2aWV3U2l6ZXNbMF0uaGVpZ2h0OworICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZAorICAgIC8vIG9uIHRoZSBsaXN0IG9mIGJvdGggcHJldmlldyBhbmQgcmVjb3JkaW5nIHNpemVzCisgICAgcHJldmlld1dpZHRoID0gMDsKKyAgICBwcmV2aWV3SGVpZ2h0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBhdmFpbGFibGVQcmV2aWV3U2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaW50IG5ld1dpZHRoID0gYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLndpZHRoOworICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLmhlaWdodDsKKyAgICAgICAgaWYgKG5ld1dpZHRoID49IHByZXZpZXdXaWR0aCAmJiBuZXdIZWlnaHQgPj0gcHJldmlld0hlaWdodCAmJgorICAgICAgICAgICAgICAgIG5ld1dpZHRoIDw9IE1BWF9JTklUSUFMX1BSRVZJRVdfV0lEVEggJiYKKyAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPD0gTUFYX0lOSVRJQUxfUFJFVklFV19IRUlHSFQpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVWaWRlb1NpemVzW2pdLndpZHRoID09IG5ld1dpZHRoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2pdLmhlaWdodCA9PSBuZXdIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld1dpZHRoID0gbmV3V2lkdGg7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdIZWlnaHQgPSBuZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwcmV2aWV3V2lkdGggPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGluaXRpYWwgcHJldmlldyBzaXplIGNhbiBiZSBmb3VuZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICB2aWRlb1dpZHRoID0gcHJldmlld1dpZHRoOwogICAgIHZpZGVvSGVpZ2h0ID0gcHJldmlld0hlaWdodDsKIApAQCAtODQsOCArMTE4LDE3IEBACiAgICAgICAgIEFMT0dWKCJTdXBwb3J0ZWQgcHJldmlldyBzaXplcyBhcmU6ICVzIiwgc3VwcG9ydGVkUHJldmlld1NpemVzLnN0cmluZygpKTsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMsCiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKworICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZFZpZGVvU2l6ZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkgc3VwcG9ydGVkVmlkZW9TaXplcyArPSAiLCI7CisgICAgICAgICAgICBzdXBwb3J0ZWRWaWRlb1NpemVzICs9IFN0cmluZzg6OmZvcm1hdCgiJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2ldLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2ldLmhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlN1cHBvcnRlZCB2aWRlbyBzaXplcyBhcmU6ICVzIiwgc3VwcG9ydGVkVmlkZW9TaXplcy5zdHJpbmcoKSk7CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9WSURFT19TSVpFUywKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMpOworICAgICAgICAgICAgICAgIHN1cHBvcnRlZFZpZGVvU2l6ZXMpOwogICAgIH0KIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZwc1JhbmdlcyA9CkBAIC05OSwxNiArMTQyLDE0IEBACiAgICAgcHJldmlld1RyYW5zZm9ybSA9IGRlZ1RvVHJhbnNmb3JtKDAsCiAgICAgICAgICAgICBjYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7Ci0KICAgICB7CiAgICAgICAgIFN0cmluZzggc3VwcG9ydGVkUHJldmlld0Zvcm1hdHM7CisgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBvdXRwdXRGb3JtYXRzID0gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOwogICAgICAgICBib29sIGFkZENvbW1hID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBvdXRwdXRGb3JtYXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzICs9ICIsIjsKICAgICAgICAgICAgIGFkZENvbW1hID0gdHJ1ZTsKLSAgICAgICAgICAgIHN3aXRjaCAoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSkgeworICAgICAgICAgICAgc3dpdGNoIChvdXRwdXRGb3JtYXRzW2ldKSB7CiAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzICs9CiAgICAgICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJTUDsKQEAgLTE1MCw3ICsxOTEsNyBAQAogCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBVbmtub3duIHByZXZpZXcgZm9ybWF0OiAleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCBhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIG91dHB1dEZvcm1hdHNbaV0pOwogICAgICAgICAgICAgICAgIGFkZENvbW1hID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yMjIsMjQgKzI2MywyNiBAQAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdGcmFtZVJhdGVzKTsKICAgICB9CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVKcGVnU2l6ZXMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9KUEVHX1NJWkVTLCAyKTsKLSAgICBpZiAoIWF2YWlsYWJsZUpwZWdTaXplcy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZUpwZWdTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOworICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICAvLyBUT0RPOiBQaWNrIG1heGltdW0KLSAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbMF07Ci0gICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMlsxXTsKKyAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0ud2lkdGg7CisgICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS5oZWlnaHQ7CisgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CisgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSBmYWxzZTsKIAogICAgIHBhcmFtcy5zZXRQaWN0dXJlU2l6ZShwaWN0dXJlV2lkdGgsCiAgICAgICAgICAgICBwaWN0dXJlSGVpZ2h0KTsKIAogICAgIHsKICAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRQaWN0dXJlU2l6ZXM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSArPSAyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKGkgIT0gMCkgc3VwcG9ydGVkUGljdHVyZVNpemVzICs9ICIsIjsKICAgICAgICAgICAgIHN1cHBvcnRlZFBpY3R1cmVTaXplcyArPSBTdHJpbmc4Ojpmb3JtYXQoIiVkeCVkIiwKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2ldLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSsxXSk7CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUpwZWdTaXplc1tpXS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzW2ldLmhlaWdodCk7CiAgICAgICAgIH0KICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BJQ1RVUkVfU0laRVMsCiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUGljdHVyZVNpemVzKTsKQEAgLTQ3MCw3ICs1MTMsNyBAQAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZEFudGliYW5kaW5nKTsKICAgICB9CiAKLSAgICBzY2VuZU1vZGUgPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICBzY2VuZU1vZGUgPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TQ0VORV9NT0RFLAogICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BVVRPKTsKIApAQCAtNDg2LDcgKzUyOSw3IEBACiAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHN1cHBvcnRlZFNjZW5lTW9kZXMgKz0gIiwiOwogICAgICAgICAgICAgYWRkQ29tbWEgPSB0cnVlOwogICAgICAgICAgICAgc3dpdGNoIChhdmFpbGFibGVTY2VuZU1vZGVzLmRhdGEudThbaV0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ6CiAgICAgICAgICAgICAgICAgICAgIG5vU2NlbmVNb2RlcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRkFDRV9QUklPUklUWToKQEAgLTU3OSw4ICs2MjIsOCBAQAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUFlTW9kZXMgPQogICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9BRV9BVkFJTEFCTEVfTU9ERVMsIDAsIDAsIGZhbHNlKTsKIAorICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwogICAgIGlmIChpc0ZsYXNoQXZhaWxhYmxlKSB7Ci0gICAgICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAogICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKIApAQCAtNjAwLDExICs2NDMsMTAgQEAKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTLAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZEZsYXNoTW9kZXMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwotICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAotICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKLSAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTLAotICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKKyAgICAgICAgLy8gTm8gZmxhc2ggbWVhbnMgbnVsbCBmbGFzaCBtb2RlIGFuZCBzdXBwb3J0ZWQgZmxhc2ggbW9kZXMga2V5cywgc28KKyAgICAgICAgLy8gcmVtb3ZlIHRoZW0ganVzdCB0byBiZSBzYWZlCisgICAgICAgIHBhcmFtcy5yZW1vdmUoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUpOworICAgICAgICBwYXJhbXMucmVtb3ZlKENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVMpOwogICAgIH0KIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1pbkZvY3VzRGlzdGFuY2UgPQpAQCAtNjI0LDggKzY2NiwxNyBAQAogICAgICAgICBmb2N1c01vZGUgPSBQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0FVVE87CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX01PREUsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPKTsKLSAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRGb2N1c01vZGVzKENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfSU5GSU5JVFkpOwotICAgICAgICBib29sIGFkZENvbW1hID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRGb2N1c01vZGVzOworICAgICAgICBib29sIGFkZENvbW1hID0gZmFsc2U7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbiA9CisgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OLCAwLCAwLCBmYWxzZSk7CisKKyAgICAgICAgaWYgKGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5jb3VudCAmJgorICAgICAgICAgICAgICAgIGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5kYXRhLnU4WzBdICE9CisgICAgICAgICAgICAgICAgQU5EUk9JRF9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT05fVU5DQUxJQlJBVEVEKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRGb2N1c01vZGVzICs9IENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfSU5GSU5JVFk7CisgICAgICAgICAgICBhZGRDb21tYSA9IHRydWU7CisgICAgICAgIH0KIAogICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVBZk1vZGVzLmNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmIChhZGRDb21tYSkgc3VwcG9ydGVkRm9jdXNNb2RlcyArPSAiLCI7CkBAIC02NjgsMTMgKzcxOSwxMyBAQAogICAgIGZvY3VzU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfSU5BQ1RJVkU7CiAgICAgc2hhZG93Rm9jdXNNb2RlID0gRk9DVVNfTU9ERV9JTlZBTElEOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4M2FSZWdpb25zID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsIDEsIDEpOwotICAgIGlmICghbWF4M2FSZWdpb25zLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXgzYVJlZ2lvbnMgPSBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pOworICAgIGlmIChtYXgzYVJlZ2lvbnMuY291bnQgIT0gUGFyYW1ldGVyczo6TlVNX1JFR0lPTikgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICBpbnQzMl90IG1heE51bUZvY3VzQXJlYXMgPSAwOwogICAgIGlmIChmb2N1c01vZGUgIT0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9GSVhFRCkgewotICAgICAgICBtYXhOdW1Gb2N1c0FyZWFzID0gbWF4M2FSZWdpb25zLmRhdGEuaTMyWzBdOworICAgICAgICBtYXhOdW1Gb2N1c0FyZWFzID0gbWF4M2FSZWdpb25zLmRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRl07CiAgICAgfQogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9OVU1fRk9DVVNfQVJFQVMsIG1heE51bUZvY3VzQXJlYXMpOwogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTLApAQCAtNzM0LDcgKzc4NSw3IEBACiAKICAgICBtZXRlcmluZ0FyZWFzLmFkZChQYXJhbWV0ZXJzOjpBcmVhKDAsIDAsIDAsIDAsIDApKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfTlVNX01FVEVSSU5HX0FSRUFTLAotICAgICAgICAgICAgbWF4M2FSZWdpb25zLmRhdGEuaTMyWzBdKTsKKyAgICAgICAgICAgIG1heDNhUmVnaW9ucy5kYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUVdKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NRVRFUklOR19BUkVBUywKICAgICAgICAgICAgICIoMCwwLDAsMCwwKSIpOwogCkBAIC05MzEsMTMgKzk4MiwxOSBAQAogICAgIGJvb2wgZml4ZWRMZW5zID0gbWluRm9jdXNEaXN0YW5jZS5jb3VudCA9PSAwIHx8CiAgICAgICAgIG1pbkZvY3VzRGlzdGFuY2UuZGF0YS5mWzBdID09IDA7CiAKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24gPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGJvb2wgY2FuRm9jdXNJbmZpbml0eSA9IChmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24uY291bnQgJiYKKyAgICAgICAgICAgIGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5kYXRhLnU4WzBdICE9CisgICAgICAgICAgICBBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTl9VTkNBTElCUkFURUQpOworCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9jYWxMZW5ndGhzID0KICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfRk9DQUxfTEVOR1RIUyk7CiAgICAgaWYgKCFhdmFpbGFibGVGb2NhbExlbmd0aHMuY291bnQpIHJldHVybiBOT19JTklUOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9ybWF0cyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMpOwotICAgIGlmICghYXZhaWxhYmxlRm9ybWF0cy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGF2YWlsYWJsZUZvcm1hdHMgPSBnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCk7CisgICAgaWYgKCFhdmFpbGFibGVGb3JtYXRzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKIAogICAgIGlmIChzY2VuZU1vZGVPdmVycmlkZXMuY291bnQgPiAwKSB7CkBAIC05NDgsNyArMTAwNSw3IEBACiAgICAgICAgIGlmIChzY2VuZU1vZGVPdmVycmlkZXMuY291bnQgIT0KICAgICAgICAgICAgICAgICBhdmFpbGFibGVTY2VuZU1vZGVzLmNvdW50ICoga01vZGVzUGVyU2NlbmVNb2RlKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2NlbmUgbW9kZSBvdmVycmlkZSBsaXN0IGlzIGFuICIKLSAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgc2l6ZTogJWQgKGV4cGVjdGVkICVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgc2l6ZTogJXp1IChleHBlY3RlZCAlenUpIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgc2NlbmVNb2RlT3ZlcnJpZGVzLmNvdW50LAogICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTY2VuZU1vZGVzLmNvdW50KTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtOTgyLDYgKzEwMzksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgc2NlbmVNb2RlT3ZlcnJpZGVzLmRhdGEudThbaSAqIGtNb2Rlc1BlclNjZW5lTW9kZSArIDJdOwogICAgICAgICAgICAgc3dpdGNoKGFmTW9kZSkgewogICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWZpeGVkTGVucyAmJiAhY2FuRm9jdXNJbmZpbml0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNjZW5lIG1vZGUgb3ZlcnJpZGUgbGlzdHMgYXNrcyBmb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZml4ZWQgZm9jdXMgb24gYSBkZXZpY2Ugd2l0aCBmb2N1c2VyIGJ1dCBub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2FsaWJyYXRlZCBmb3IgaW5maW5pdHkgZm9jdXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1vZGVzLmZvY3VzTW9kZSA9IGZpeGVkTGVucyA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9DVVNfTU9ERV9GSVhFRCA6IEZPQ1VTX01PREVfSU5GSU5JVFk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAyMSw4ICsxMDg1LDggQEAKIAogICAgIC8vIENoZWNrIGlmIHRoZSBIQUwgc3VwcG9ydHMgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4CiAgICAgZmFzdEluZm8udXNlRmxleGlibGVZdXYgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgewotICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUZvcm1hdHNbaV0gPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7CiAgICAgICAgICAgICBmYXN0SW5mby51c2VGbGV4aWJsZVl1diA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTA3OCw3ICsxMTQyLDcgQEAKICAgICAgICAgY29uc3QgY2hhciogdGFnTmFtZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfdGFnX25hbWUodGFnKTsKICAgICAgICAgaWYgKHRhZ05hbWUgPT0gTlVMTCkgdGFnTmFtZSA9ICI8dW5rbm93bj4iOwogICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIHN0YXRpYyBtZXRhZGF0YSBlbnRyeSAnJXMuJXMnICgleCk6IgotICAgICAgICAgICAgICAgICJFeHBlY3RlZCBiZXR3ZWVuICVkIGFuZCAlZCB2YWx1ZXMsIGJ1dCBnb3QgJWQgdmFsdWVzIiwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYmV0d2VlbiAlenUgYW5kICV6dSB2YWx1ZXMsIGJ1dCBnb3QgJXp1IHZhbHVlcyIsCiAgICAgICAgICAgICAgICAgdGFnU2VjdGlvbiwgdGFnTmFtZSwgdGFnLCBtaW5Db3VudCwgbWF4Q291bnQsIGVudHJ5LmNvdW50KTsKICAgICB9CiAKQEAgLTEyMjUsOCArMTI4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICJpcyBhY3RpdmUhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9ybWF0cyA9Ci0gICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTKTsKKyAgICAgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGF2YWlsYWJsZUZvcm1hdHMgPSBnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCk7CiAgICAgICAgIC8vIElmIHVzaW5nIGZsZXhpYmxlIFlVViwgYWx3YXlzIHN1cHBvcnQgTlYyMS9ZVjEyLiBPdGhlcndpc2UsIGNoZWNrCiAgICAgICAgIC8vIEhBTCdzIGxpc3QuCiAgICAgICAgIGlmICghIChmYXN0SW5mby51c2VGbGV4aWJsZVl1diAmJgpAQCAtMTIzNSwxMSArMTI5OCwxMCBAQAogICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zvcm1hdCA9PQogICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSApICkgewogICAgICAgICAgICAgLy8gTm90IHVzaW5nIGZsZXhpYmxlIFlVViBmb3JtYXQsIHNvIGNoZWNrIGV4cGxpY2l0bHkKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLmNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGb3JtYXQpIGJyZWFrOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0c1tpXSA9PSB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zvcm1hdCkgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVGb3JtYXRzLmNvdW50KSB7CisgICAgICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVGb3JtYXRzLnNpemUoKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIHByZXZpZXcgZm9ybWF0ICVzICgweCV4KSBpcyBub3Qgc3VwcG9ydGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3UGFyYW1zLmdldFByZXZpZXdGb3JtYXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3Rm9ybWF0KTsKQEAgLTEzNTUsMTcgKzE0MTcsMTYgQEAKICAgICAvLyBQSUNUVVJFX1NJWkUKICAgICBuZXdQYXJhbXMuZ2V0UGljdHVyZVNpemUoJnZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGgsCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQpOwotICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoID09IHBpY3R1cmVXaWR0aCB8fAotICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQgPT0gcGljdHVyZUhlaWdodCkgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVQaWN0dXJlU2l6ZXMgPQotICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVQaWN0dXJlU2l6ZXMuY291bnQ7IGkrPTIpIHsKLSAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlUGljdHVyZVNpemVzLmRhdGEuaTMyW2ldID09CisgICAgaWYgKHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGggIT0gcGljdHVyZVdpZHRoIHx8CisgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZUhlaWdodCAhPSBwaWN0dXJlSGVpZ2h0KSB7CisgICAgICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVQaWN0dXJlU2l6ZXMgPSBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVBpY3R1cmVTaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKChhdmFpbGFibGVQaWN0dXJlU2l6ZXNbaV0ud2lkdGggPT0KICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVXaWR0aCkgJiYKLSAgICAgICAgICAgICAgICAoYXZhaWxhYmxlUGljdHVyZVNpemVzLmRhdGEuaTMyW2krMV0gPT0KKyAgICAgICAgICAgICAgICAoYXZhaWxhYmxlUGljdHVyZVNpemVzW2ldLmhlaWdodCA9PQogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZUhlaWdodCkpIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IGF2YWlsYWJsZVBpY3R1cmVTaXplcy5jb3VudCkgeworICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVQaWN0dXJlU2l6ZXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCBwaWN0dXJlIHNpemUgJWQgeCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoLAogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZUhlaWdodCk7CkBAIC0xNTIyLDcgKzE1ODMsNyBAQAogICAgICAgICBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TQ0VORV9NT0RFKSApOwogICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMuc2NlbmVNb2RlICE9IHNjZW5lTW9kZSAmJgogICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPQotICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQpIHsKKyAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVNjZW5lTW9kZXMgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX1NDRU5FX01PREVTKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVNjZW5lTW9kZXMuY291bnQ7IGkrKykgewpAQCAtMTUzNyw3ICsxNTk4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBib29sIHNjZW5lTW9kZVNldCA9Ci0gICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMuc2NlbmVNb2RlICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKIAogICAgIC8vIEZMQVNIX01PREUKICAgICBpZiAoc2NlbmVNb2RlU2V0KSB7CkBAIC0xNTU1LDcgKzE2MTYsOSBAQAogICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMuZmxhc2hNb2RlICE9IGZsYXNoTW9kZSkgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBmbGFzaEF2YWlsYWJsZSA9CiAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUsIDEsIDEpOwotICAgICAgICBpZiAoIWZsYXNoQXZhaWxhYmxlLmRhdGEudThbMF0gJiYKKyAgICAgICAgYm9vbCBpc0ZsYXNoQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICBmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdID09IEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEVfVFJVRTsKKyAgICAgICAgaWYgKCFpc0ZsYXNoQXZhaWxhYmxlICYmCiAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLmZsYXNoTW9kZSAhPSBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRikgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgZmxhc2ggbW9kZSBcIiVzXCIgaXMgbm90IHN1cHBvcnRlZDogIgogICAgICAgICAgICAgICAgICAgICAiTm8gZmxhc2ggb24gZGV2aWNlIiwgX19GVU5DVElPTl9fLApAQCAtMTU4MCw5ICsxNjQzLDExIEBACiAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUpKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIGluIGNhc2Ugb2Ygb3ZlcnJpZGUKLSAgICAgICAgbmV3UGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSwKLSAgICAgICAgICAgICAgICBmbGFzaE1vZGVFbnVtVG9TdHJpbmcodmFsaWRhdGVkUGFyYW1zLmZsYXNoTW9kZSkpOworICAgICAgICAvLyBVcGRhdGUgaW4gY2FzZSBvZiBvdmVycmlkZSwgYnV0IG9ubHkgaWYgZmxhc2ggaXMgc3VwcG9ydGVkCisgICAgICAgIGlmIChpc0ZsYXNoQXZhaWxhYmxlKSB7CisgICAgICAgICAgICBuZXdQYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAorICAgICAgICAgICAgICAgICAgICBmbGFzaE1vZGVFbnVtVG9TdHJpbmcodmFsaWRhdGVkUGFyYW1zLmZsYXNoTW9kZSkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gV0hJVEVfQkFMQU5DRQpAQCAtMTY2NywxMCArMTczMiwxMSBAQAogICAgIC8vIEZPQ1VTX0FSRUFTCiAgICAgcmVzID0gcGFyc2VBcmVhcyhuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19BUkVBUyksCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLmZvY3VzaW5nQXJlYXMpOwotICAgIHNpemVfdCBtYXgzYVJlZ2lvbnMgPQotICAgICAgICAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLCAxLCAxKS5kYXRhLmkzMlswXTsKKyAgICBzaXplX3QgbWF4QWZSZWdpb25zID0gKHNpemVfdClzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTikuCisgICAgICAgICAgICAgIGRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRl07CiAgICAgaWYgKHJlcyA9PSBPSykgcmVzID0gdmFsaWRhdGVBcmVhcyh2YWxpZGF0ZWRQYXJhbXMuZm9jdXNpbmdBcmVhcywKLSAgICAgICAgICAgIG1heDNhUmVnaW9ucywgQVJFQV9LSU5EX0ZPQ1VTKTsKKyAgICAgICAgICAgIG1heEFmUmVnaW9ucywgQVJFQV9LSU5EX0ZPQ1VTKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIGZvY3VzIGFyZWFzIGFyZSBtYWxmb3JtZWQ6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTKSk7CkBAIC0xNzAwLDEwICsxNzY2LDEzIEBACiAgICAgICAgIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0FVVE9fV0hJVEVCQUxBTkNFX0xPQ0spKTsKIAogICAgIC8vIE1FVEVSSU5HX0FSRUFTCisgICAgc2l6ZV90IG1heEFlUmVnaW9ucyA9IChzaXplX3Qpc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCisgICAgICAgICAgICBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OLCBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKS4KKyAgICAgICAgICAgIGRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRV07CiAgICAgcmVzID0gcGFyc2VBcmVhcyhuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NRVRFUklOR19BUkVBUyksCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLm1ldGVyaW5nQXJlYXMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVBcmVhcyh2YWxpZGF0ZWRQYXJhbXMubWV0ZXJpbmdBcmVhcywgbWF4M2FSZWdpb25zLAorICAgICAgICByZXMgPSB2YWxpZGF0ZUFyZWFzKHZhbGlkYXRlZFBhcmFtcy5tZXRlcmluZ0FyZWFzLCBtYXhBZVJlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJFQV9LSU5EX01FVEVSSU5HKTsKICAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMTcyOCwyMSArMTc5NywyNiBAQAogICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCAhPSB2aWRlb1dpZHRoIHx8CiAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQgIT0gdmlkZW9IZWlnaHQpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFJFQ09SRCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBWaWRlbyBzaXplIGNhbm5vdCBiZSB1cGRhdGVkIHdoZW4gcmVjb3JkaW5nIGlzIGFjdGl2ZSEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlUHJldmlld1NpemVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKGF2YWlsYWJsZVByZXZpZXdTaXplc1tpXS53aWR0aCA9PQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCkgJiYKLSAgICAgICAgICAgICAgICAoYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLmhlaWdodCA9PQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQpKSBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVQcmV2aWV3U2l6ZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCB2aWRlbyBzaXplICVkIHggJWQgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgsCisgICAgICAgICAgICBBTE9HVygiJXM6IFZpZGVvIHNpemUgY2Fubm90IGJlIHVwZGF0ZWQgKGZyb20gJWQgeCAlZCB0byAlZCB4ICVkKSIKKyAgICAgICAgICAgICAgICAgICAgIiB3aGVuIHJlY29yZGluZyBpcyBhY3RpdmUhIElnbm9yZSB0aGUgc2l6ZSB1cGRhdGUhIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOworICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CisgICAgICAgICAgICBuZXdQYXJhbXMuc2V0VmlkZW9TaXplKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVWaWRlb1NpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChhdmFpbGFibGVWaWRlb1NpemVzW2ldLndpZHRoID09CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZVZpZGVvU2l6ZXNbaV0uaGVpZ2h0ID09CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQpKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IGF2YWlsYWJsZVZpZGVvU2l6ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgdmlkZW8gc2l6ZSAlZCB4ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTc2NCw2ICsxODM4LDcgQEAKICAgICAvKiogVXBkYXRlIGludGVybmFsIHBhcmFtZXRlcnMgKi8KIAogICAgICp0aGlzID0gdmFsaWRhdGVkUGFyYW1zOworICAgIHVwZGF0ZU92ZXJyaWRkZW5KcGVnU2l6ZSgpOwogCiAgICAgLyoqIFVwZGF0ZSBleHRlcm5hbCBwYXJhbWV0ZXJzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW50ZXJuYWwgb25lcyAqLwogCkBAIC0xODI2LDYgKzE5MDEsOSBAQAogCiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgaW50ZW50ID0KICAgICAgICAgICAgIHJlcXVlc3QtPmZpbmQoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UKTsKKworICAgIGlmIChpbnRlbnQuY291bnQgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKwogICAgIGlmIChpbnRlbnQuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSkgewogICAgICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsCiAgICAgICAgICAgICAgICAgZmFzdEluZm8uYmVzdFN0aWxsQ2FwdHVyZUZwc1JhbmdlLCAyKTsKQEAgLTE4NTIsNyArMTkzMCw3IEBACiAgICAgLy8gKGZhY2UgZGV0ZWN0aW9uIHN0YXRpc3RpY3MgYW5kIGZhY2UgcHJpb3JpdHkgc2NlbmUgbW9kZSkuIE1hcCBmcm9tIG90aGVyCiAgICAgLy8gdG8gdGhlIG90aGVyLgogICAgIGJvb2wgc2NlbmVNb2RlQWN0aXZlID0KLSAgICAgICAgICAgIHNjZW5lTW9kZSAhPSAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHNjZW5lTW9kZSAhPSAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKICAgICB1aW50OF90IHJlcUNvbnRyb2xNb2RlID0gQU5EUk9JRF9DT05UUk9MX01PREVfQVVUTzsKICAgICBpZiAoZW5hYmxlRmFjZURldGVjdCB8fCBzY2VuZU1vZGVBY3RpdmUpIHsKICAgICAgICAgcmVxQ29udHJvbE1vZGUgPSBBTkRST0lEX0NPTlRST0xfTU9ERV9VU0VfU0NFTkVfTU9ERTsKQEAgLTE4NjQsNyArMTk0Miw3IEBACiAgICAgdWludDhfdCByZXFTY2VuZU1vZGUgPQogICAgICAgICAgICAgc2NlbmVNb2RlQWN0aXZlID8gc2NlbmVNb2RlIDoKICAgICAgICAgICAgIGVuYWJsZUZhY2VEZXRlY3QgPyAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9GQUNFX1BSSU9SSVRZIDoKLSAgICAgICAgICAgICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgKHVpbnQ4X3QpQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CiAgICAgcmVzID0gcmVxdWVzdC0+dXBkYXRlKEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFLAogICAgICAgICAgICAgJnJlcVNjZW5lTW9kZSwgMSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKQEAgLTE5ODUsNiArMjA2MywyMyBAQAogICAgICAgICAgICAgcmVxTWV0ZXJpbmdBcmVhcywgcmVxTWV0ZXJpbmdBcmVhc1NpemUpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKKyAgICAvLyBTZXQgYXdiIHJlZ2lvbnMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG1ldGVyaW5nIHJlZ2lvbnMgaWYgYWxsb3dlZAorICAgIHNpemVfdCBtYXhBd2JSZWdpb25zID0gKHNpemVfdClzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pLgorICAgICAgICAgICAgZGF0YS5pMzJbUGFyYW1ldGVyczo6UkVHSU9OX0FXQl07CisgICAgaWYgKG1heEF3YlJlZ2lvbnMgPiAwKSB7CisgICAgICAgIGlmIChtYXhBd2JSZWdpb25zID49IG1ldGVyaW5nQXJlYXMuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9SRUdJT05TLAorICAgICAgICAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzLCByZXFNZXRlcmluZ0FyZWFzU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGF3YiByZWdpb25zIGFyZSB6ZXJvZWQgaWYgdGhlIHJlZ2lvbiBjb3VudCBpcyB0b28gaGlnaC4KKyAgICAgICAgICAgIGludDMyX3QgemVyb2VkQXdiQXJlYXNbNV0gPSB7MCwgMCwgMCwgMCwgMH07CisgICAgICAgICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9SRUdJT05TLAorICAgICAgICAgICAgICAgICAgICB6ZXJvZWRBd2JBcmVhcywgc2l6ZW9mKHplcm9lZEF3YkFyZWFzKS9zaXplb2YoaW50MzJfdCkpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfQorCiAgICAgZGVsZXRlW10gcmVxTWV0ZXJpbmdBcmVhczsKIAogICAgIC8qIGRvbid0IGluY2x1ZGUganBlZyB0aHVtYm5haWwgc2l6ZSAtIGl0J3MgdmFsaWQgZm9yCkBAIC0yMDYxLDYgKzIxNTYsNTIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFBhcmFtZXRlcnM6Om92ZXJyaWRlSnBlZ1NpemVCeVZpZGVvU2l6ZSgpIHsKKyAgICBpZiAocGljdHVyZVNpemVPdmVycmlkZW4pIHsKKyAgICAgICAgQUxPR1YoIlBpY3R1cmUgc2l6ZSBoYXMgYmVlbiBvdmVycmlkZGVuLiBTa2lwIG92ZXJyaWRpbmciKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHBpY3R1cmVTaXplT3ZlcnJpZGVuID0gdHJ1ZTsKKyAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOworICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKKyAgICBwaWN0dXJlV2lkdGggPSB2aWRlb1dpZHRoOworICAgIHBpY3R1cmVIZWlnaHQgPSB2aWRlb0hlaWdodDsKKyAgICAvLyBUaGlzIGNoYW5nZSBvZiBwaWN0dXJlIHNpemUgaXMgaW52aXNpYmxlIHRvIGFwcCBsYXllci4KKyAgICAvLyBEbyBub3QgdXBkYXRlIGFwcCB2aXNpYmxlIHBhcmFtcworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgUGFyYW1ldGVyczo6dXBkYXRlT3ZlcnJpZGRlbkpwZWdTaXplKCkgeworICAgIGlmICghcGljdHVyZVNpemVPdmVycmlkZW4pIHsKKyAgICAgICAgQUxPR1YoIlBpY3R1cmUgc2l6ZSBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbi4gU2tpcCBjaGVja2luZyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CisKKyAgICBpZiAocGljdHVyZVdpZHRoIDw9IHZpZGVvV2lkdGggJiYgcGljdHVyZUhlaWdodCA8PSB2aWRlb0hlaWdodCkgeworICAgICAgICAvLyBQaWN0dXJlIHNpemUgaXMgbm93IHNtYWxsZXIgdGhhbiB2aWRlbyBzaXplLiBObyBuZWVkIHRvIG92ZXJyaWRlIGFueW1vcmUKKyAgICAgICAgcmV0dXJuIHJlY292ZXJPdmVycmlkZGVuSnBlZ1NpemUoKTsKKyAgICB9CisKKyAgICBwaWN0dXJlV2lkdGggPSB2aWRlb1dpZHRoOworICAgIHBpY3R1cmVIZWlnaHQgPSB2aWRlb0hlaWdodDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgUGFyYW1ldGVyczo6cmVjb3Zlck92ZXJyaWRkZW5KcGVnU2l6ZSgpIHsKKyAgICBpZiAoIXBpY3R1cmVTaXplT3ZlcnJpZGVuKSB7CisgICAgICAgIEFMT0dWKCJQaWN0dXJlIHNpemUgaGFzIG5vdCBiZWVuIG92ZXJyaWRkZW4uIFNraXAgcmVjb3ZlcmluZyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHBpY3R1cmVTaXplT3ZlcnJpZGVuID0gZmFsc2U7CisgICAgcGljdHVyZVdpZHRoID0gcGljdHVyZVdpZHRoTGFzdFNldDsKKyAgICBwaWN0dXJlSGVpZ2h0ID0gcGljdHVyZUhlaWdodExhc3RTZXQ7CisgICAgcmV0dXJuIE9LOworfQogCiBjb25zdCBjaGFyKiBQYXJhbWV0ZXJzOjpnZXRTdGF0ZU5hbWUoU3RhdGUgc3RhdGUpIHsKICNkZWZpbmUgQ0FTRV9FTlVNX1RPX0NIQVIoeCkgY2FzZSB4OiByZXR1cm4oI3gpOyBicmVhazsKQEAgLTIwODAsMjQgKzIyMjEsNyBAQAogfQogCiBpbnQgUGFyYW1ldGVyczo6Zm9ybWF0U3RyaW5nVG9FbnVtKGNvbnN0IGNoYXIgKmZvcm1hdCkgewotICAgIHJldHVybgotICAgICAgICAhZm9ybWF0ID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQIDoKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJTUCkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1AgOiAvLyBOVjE2Ci0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwU1ApID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQIDogLy8gTlYyMQotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMkkpID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0kgOiAgLy8gWVVZMgotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFApID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiA6ICAgICAgICAgLy8gWVYxMgotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQjU2NSkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1IDogICAgICAvLyBSR0I1NjUKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SR0JBODg4OCkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggOiAgICAvLyBSR0I4ODg4Ci0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfQkFZRVJfUkdHQikgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfU0VOU09SIDogICAvLyBSYXcgc2Vuc29yIGRhdGEKLSAgICAgICAgLTE7CisgICAgcmV0dXJuIENhbWVyYVBhcmFtZXRlcnM6OnByZXZpZXdGb3JtYXRUb0VudW0oZm9ybWF0KTsKIH0KIAogY29uc3QgY2hhciogUGFyYW1ldGVyczo6Zm9ybWF0RW51bVRvU3RyaW5nKGludCBmb3JtYXQpIHsKQEAgLTIyMjUsOSArMjM0OSw5IEBACiBpbnQgUGFyYW1ldGVyczo6c2NlbmVNb2RlU3RyaW5nVG9FbnVtKGNvbnN0IGNoYXIgKnNjZW5lTW9kZSkgewogICAgIHJldHVybgogICAgICAgICAhc2NlbmVNb2RlID8KLSAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEIDoKKyAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEIDoKICAgICAgICAgIXN0cmNtcChzY2VuZU1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVfQVVUTykgPwotICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQgOgorICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQgOgogICAgICAgICAhc3RyY21wKHNjZW5lTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BQ1RJT04pID8KICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0FDVElPTiA6CiAgICAgICAgICFzdHJjbXAoc2NlbmVNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX1BPUlRSQUlUKSA/CkBAIC0yMjY1LDcgKzIzODksNyBAQAogICAgICAgICBjb25zdCBjaGFyICpmbGFzaE1vZGUpIHsKICAgICByZXR1cm4KICAgICAgICAgIWZsYXNoTW9kZSA/Ci0gICAgICAgICAgICBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX0lOVkFMSUQgOgorICAgICAgICAgICAgUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYgOgogICAgICAgICAhc3RyY21wKGZsYXNoTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYpID8KICAgICAgICAgICAgIFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGIDoKICAgICAgICAgIXN0cmNtcChmbGFzaE1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfQVVUTykgPwpAQCAtMjQwNiw3ICsyNTMwLDcgQEAKICAgICB9CiAKICAgICBpZiAoYXJlYXMuc2l6ZSgpID4gbWF4UmVnaW9ucykgewotICAgICAgICBBTE9HRSgiJXM6IFRvbyBtYW55IGFyZWFzIHJlcXVlc3RlZDogJWQiLAorICAgICAgICBBTE9HRSgiJXM6IFRvbyBtYW55IGFyZWFzIHJlcXVlc3RlZDogJXp1IiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFyZWFzLnNpemUoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMjU2Niw3ICsyNjkwLDcgQEAKICAgICByZXR1cm4gY3JvcFlUb0FycmF5KG5vcm1hbGl6ZWRZVG9Dcm9wKHkpKTsKIH0KIAotc3RhdHVzX3QgUGFyYW1ldGVyczo6Z2V0RmlsdGVyZWRQcmV2aWV3U2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcykgeworc3RhdHVzX3QgUGFyYW1ldGVyczo6Z2V0RmlsdGVyZWRTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKSB7CiAgICAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IFN0YXRpYyBtZXRhZGF0YSBpcyBub3QgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTI1NzUsMjIgKzI2OTksMzcgQEAKICAgICAgICAgQUxPR0UoIiVzOiBJbnB1dCBzaXplIGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBzaXplcy0+Y2xlYXIoKTsKIAotICAgIGNvbnN0IHNpemVfdCBTSVpFX0NPVU5UID0gc2l6ZW9mKFNpemUpIC8gc2l6ZW9mKGludCk7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9QUk9DRVNTRURfU0laRVMsIFNJWkVfQ09VTlQpOwotICAgIGlmIChhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudCA8IFNJWkVfQ09VTlQpIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBTaXplIHByZXZpZXdTaXplOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQ7IGkgKz0gU0laRV9DT1VOVCkgewotICAgICAgICBwcmV2aWV3U2l6ZS53aWR0aCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2ldOwotICAgICAgICBwcmV2aWV3U2l6ZS5oZWlnaHQgPSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5kYXRhLmkzMltpKzFdOwotICAgICAgICAgICAgLy8gTmVlZCBza2lwIHRoZSBwcmV2aWV3IHNpemVzIHRoYXQgYXJlIHRvbyBsYXJnZS4KLSAgICAgICAgICAgIGlmIChwcmV2aWV3U2l6ZS53aWR0aCA8PSBsaW1pdC53aWR0aCAmJgotICAgICAgICAgICAgICAgICAgICBwcmV2aWV3U2l6ZS5oZWlnaHQgPD0gbGltaXQuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2gocHJldmlld1NpemUpOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzID0gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgc2NzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBTdHJlYW1Db25maWd1cmF0aW9uICZzYyA9IHNjc1tpXTsKKyAgICAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICYmCisgICAgICAgICAgICAgICAgICAgIHNjLmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICAgICAgICAgc2Mud2lkdGggPD0gbGltaXQud2lkdGggJiYgc2MuaGVpZ2h0IDw9IGxpbWl0LmhlaWdodCkgeworICAgICAgICAgICAgICAgIFNpemUgc3ogPSB7c2Mud2lkdGgsIHNjLmhlaWdodH07CisgICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2goc3opOwogICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkVfQ09VTlQgPSBzaXplb2YoU2l6ZSkgLyBzaXplb2YoaW50KTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMgPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX1NJWkVTLCBTSVpFX0NPVU5UKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50IDwgU0laRV9DT1VOVCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgICAgICBTaXplIGZpbHRlcmVkU2l6ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudDsgaSArPSBTSVpFX0NPVU5UKSB7CisgICAgICAgICAgICBmaWx0ZXJlZFNpemUud2lkdGggPSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5kYXRhLmkzMltpXTsKKyAgICAgICAgICAgIGZpbHRlcmVkU2l6ZS5oZWlnaHQgPSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5kYXRhLmkzMltpKzFdOworICAgICAgICAgICAgICAgIC8vIE5lZWQgc2tpcCB0aGUgcHJldmlldyBzaXplcyB0aGF0IGFyZSB0b28gbGFyZ2UuCisgICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkU2l6ZS53aWR0aCA8PSBsaW1pdC53aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRTaXplLmhlaWdodCA8PSBsaW1pdC5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2goZmlsdGVyZWRTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICBpZiAoc2l6ZXMtPmlzRW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiZ2VuZXJhdGVkIHByZXZpZXcgc2l6ZSBsaXN0IGlzIGVtcHR5ISEiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTI2MjQsNiArMjc2Myw3OCBAQAogICAgIHJldHVybiBtYXhTaXplOwogfQogCitWZWN0b3I8UGFyYW1ldGVyczo6U3RyZWFtQ29uZmlndXJhdGlvbj4gUGFyYW1ldGVyczo6Z2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKSB7CisgICAgY29uc3QgaW50IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA0OworICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7CisgICAgY29uc3QgaW50IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAxOworICAgIGNvbnN0IGludCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDI7CisgICAgY29uc3QgaW50IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3M7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgQUxPR0UoIlN0cmVhbUNvbmZpZ3VyYXRpb24gaXMgb25seSB2YWxpZCBhZnRlciBkZXZpY2UgSEFMIDMuMiEiKTsKKyAgICAgICAgcmV0dXJuIHNjczsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbiBzYyA9IHtmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlzSW5wdXR9OworICAgICAgICBzY3MuYWRkKHNjKTsKKyAgICB9CisgICAgcmV0dXJuIHNjczsKK30KKworU29ydGVkVmVjdG9yPGludDMyX3Q+IFBhcmFtZXRlcnM6OmdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKSB7CisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IG91dHB1dEZvcm1hdHM7IC8vIE5vbi1kdXBsaWNhdGVkIG91dHB1dCBmb3JtYXRzCisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOworICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXRzLmFkZChzYy5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9ybWF0cyA9IHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdHMuYWRkKGF2YWlsYWJsZUZvcm1hdHMuZGF0YS5pMzJbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXRGb3JtYXRzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0QXZhaWxhYmxlSnBlZ1NpemVzKCkgeworICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBqcGVnU2l6ZXM7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOworICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgIFNpemUgc3ogPSB7c2Mud2lkdGgsIHNjLmhlaWdodH07CisgICAgICAgICAgICAgICAganBlZ1NpemVzLmFkZChzeik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgSlBFR19TSVpFX0VOVFJZX0NPVU5UID0gMjsKKyAgICAgICAgY29uc3QgaW50IFdJRFRIX09GRlNFVCA9IDA7CisgICAgICAgIGNvbnN0IGludCBIRUlHSFRfT0ZGU0VUID0gMTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlSnBlZ1NpemVzID0KKyAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQ7IGkrPSBKUEVHX1NJWkVfRU5UUllfQ09VTlQpIHsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludCBoZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSArIEhFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgU2l6ZSBzeiA9IHt3aWR0aCwgaGVpZ2h0fTsKKyAgICAgICAgICAgIGpwZWdTaXplcy5hZGQoc3opOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBqcGVnU2l6ZXM7Cit9CisKIFBhcmFtZXRlcnM6OkNyb3BSZWdpb24gUGFyYW1ldGVyczo6Y2FsY3VsYXRlQ3JvcFJlZ2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uOjpPdXRwdXRzIG91dHB1dHMpIGNvbnN0IHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggZGEwN2NjZi4uODE1Y2M1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC01Miw2ICs1Miw5IEBACiAgICAgaW50IHByZXZpZXdUcmFuc2Zvcm07IC8vIHNldCBieSBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OCiAKICAgICBpbnQgcGljdHVyZVdpZHRoLCBwaWN0dXJlSGVpZ2h0OworICAgIC8vIFN0b3JlIHRoZSBwaWN0dXJlIHNpemUgYmVmb3JlIHRoZXkgYXJlIG92ZXJyaWRlbiBieSB2aWRlbyBzbmFwc2hvdAorICAgIGludCBwaWN0dXJlV2lkdGhMYXN0U2V0LCBwaWN0dXJlSGVpZ2h0TGFzdFNldDsKKyAgICBib29sIHBpY3R1cmVTaXplT3ZlcnJpZGVuOwogCiAgICAgaW50MzJfdCBqcGVnVGh1bWJTaXplWzJdOwogICAgIHVpbnQ4X3QganBlZ1F1YWxpdHksIGpwZWdUaHVtYlF1YWxpdHk7CkBAIC0xMTQsNiArMTE3LDE0IEBACiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrOwogICAgIGJvb2wgYXV0b1doaXRlQmFsYW5jZUxvY2s7CiAKKyAgICAvLyAzQSByZWdpb24gdHlwZXMsIGZvciB1c2Ugd2l0aCBBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMKKyAgICBlbnVtIHJlZ2lvbl90IHsKKyAgICAgICAgUkVHSU9OX0FFID0gMCwKKyAgICAgICAgUkVHSU9OX0FXQiwKKyAgICAgICAgUkVHSU9OX0FGLAorICAgICAgICBOVU1fUkVHSU9OIC8vIE51bWJlciBvZiByZWdpb24gdHlwZXMKKyAgICB9IHJlZ2lvbjsKKwogICAgIFZlY3RvcjxBcmVhPiBtZXRlcmluZ0FyZWFzOwogCiAgICAgaW50IHpvb207CkBAIC0xNjgsOCArMTc5LDEzIEBACiAgICAgLy8gTnVtYmVyIG9mIHpvb20gc3RlcHMgdG8gc2ltdWxhdGUKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9aT09NX1NURVBTID0gMTAwOwogICAgIC8vIE1heCBwcmV2aWV3IHNpemUgYWxsb3dlZAorICAgIC8vIFRoaXMgaXMgc2V0IHRvIGEgMToxIHZhbHVlIHRvIGFsbG93IGZvciBhbnkgYXNwZWN0IHJhdGlvIHRoYXQgaGFzCisgICAgLy8gYSBtYXggbG9uZyBzaWRlIG9mIDE5MjAgcGl4ZWxzCiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfUFJFVklFV19XSURUSCA9IDE5MjA7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfUFJFVklFV19IRUlHSFQgPSAxMDgwOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTUFYX1BSRVZJRVdfSEVJR0hUID0gMTkyMDsKKyAgICAvLyBJbml0aWFsIG1heCBwcmV2aWV3L3JlY29yZGluZyBzaXplIGJvdW5kCisgICAgc3RhdGljIGNvbnN0IGludCBNQVhfSU5JVElBTF9QUkVWSUVXX1dJRFRIID0gMTkyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9JTklUSUFMX1BSRVZJRVdfSEVJR0hUID0gMTA4MDsKICAgICAvLyBBc3BlY3QgcmF0aW8gdG9sZXJhbmNlCiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IEFTUEVDVF9SQVRJT19UT0xFUkFOQ0UgPSAwLjAwMTsKIApAQCAtMjE5LDcgKzIzNSw3IEBACiAgICAgflBhcmFtZXRlcnMoKTsKIAogICAgIC8vIFNldHMgdXAgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAqaW5mbyk7CisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAqaW5mbywgaW50IGRldmljZVZlcnNpb24pOwogCiAgICAgLy8gQnVpbGQgZmFzdC1hY2Nlc3MgZGV2aWNlIHN0YXRpYyBpbmZvIGZyb20gc3RhdGljIGluZm8KICAgICBzdGF0dXNfdCBidWlsZEZhc3RJbmZvKCk7CkBAIC0yNDUsNiArMjYxLDEyIEBACiAgICAgLy8gQWRkL3VwZGF0ZSBKUEVHIGVudHJpZXMgaW4gbWV0YWRhdGEKICAgICBzdGF0dXNfdCB1cGRhdGVSZXF1ZXN0SnBlZyhDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgY29uc3Q7CiAKKyAgICAvKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG92ZXJyaWRlIGpwZWcgc2l6ZSBmb3IgdmlkZW8gc25hcHNob3QgKi8KKyAgICAvLyBPdmVycmlkZSBqcGVnIHNpemUgYnkgdmlkZW8gc2l6ZS4gQ2FsbGVkIGR1cmluZyBzdGFydFJlY29yZGluZy4KKyAgICBzdGF0dXNfdCBvdmVycmlkZUpwZWdTaXplQnlWaWRlb1NpemUoKTsKKyAgICAvLyBSZWNvdmVyIG92ZXJyaWRkZW4ganBlZyBzaXplLiAgQ2FsbGVkIGR1cmluZyBzdG9wUmVjb3JkaW5nLgorICAgIHN0YXR1c190IHJlY292ZXJPdmVycmlkZGVuSnBlZ1NpemUoKTsKKwogICAgIC8vIENhbGN1bGF0ZSB0aGUgY3JvcCByZWdpb24gcmVjdGFuZ2xlIGJhc2VkIG9uIGN1cnJlbnQgc3RyZWFtIHNpemVzCiAgICAgc3RydWN0IENyb3BSZWdpb24gewogICAgICAgICBmbG9hdCBsZWZ0OwpAQCAtMzM0LDEwICszNTYsMzUgQEAKICAgICBpbnQgbm9ybWFsaXplZFlUb0Nyb3AoaW50IHkpIGNvbnN0OwogCiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZVByZXZpZXdTaXplczsKKyAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlVmlkZW9TaXplczsKICAgICAvLyBHZXQgc2l6ZSBsaXN0ICh0aGF0IGFyZSBubyBsYXJnZXIgdGhhbiBsaW1pdCkgZnJvbSBzdGF0aWMgbWV0YWRhdGEuCi0gICAgc3RhdHVzX3QgZ2V0RmlsdGVyZWRQcmV2aWV3U2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcyk7CisgICAgc3RhdHVzX3QgZ2V0RmlsdGVyZWRTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKTsKICAgICAvLyBHZXQgbWF4IHNpemUgKGZyb20gdGhlIHNpemUgYXJyYXkpIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gYXNwZWN0IHJhdGlvLgogICAgIFNpemUgZ2V0TWF4U2l6ZUZvclJhdGlvKGZsb2F0IHJhdGlvLCBjb25zdCBpbnQzMl90KiBzaXplQXJyYXksIHNpemVfdCBjb3VudCk7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIG92ZXJyaWRpbmcganBlZyBzaXplIGZvciB2aWRlbyBzbmFwc2hvdAorICAgIC8vIENoZWNrIGlmIG92ZXJyaWRkZW4ganBlZyBzaXplIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgUGFyYW1ldGVyczo6c2V0LgorICAgIC8vIFRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRhaWxvcmVkIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBQYXJhbWV0ZXJzOjpzZXQuCisgICAgLy8gRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBvdGhlciBwdXJwb3NlLgorICAgIHN0YXR1c190IHVwZGF0ZU92ZXJyaWRkZW5KcGVnU2l6ZSgpOworCisgICAgc3RydWN0IFN0cmVhbUNvbmZpZ3VyYXRpb24geworICAgICAgICBpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgaW50MzJfdCB3aWR0aDsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgICAgIGludDMyX3QgaXNJbnB1dDsKKyAgICB9OworICAgIC8vIEhlbHBlciBmdW5jdGlvbiBleHRyYWN0IGF2YWlsYWJsZSBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgIC8vIE9ubHkgdmFsaWQgc2luY2UgZGV2aWNlIEhBTCB2ZXJzaW9uIDMuMgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgVmVjdG9yIGlmIGRldmljZSBIQUwgdmVyc2lvbiBkb2VzIHN1cHBvcnQgaXQKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgbm9uLWR1cGxpY2F0ZWQgYXZhaWxhYmxlIG91dHB1dCBmb3JtYXRzCisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKTsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGF2YWlsYWJsZSBvdXRwdXQganBlZyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKKworICAgIGludCBtRGV2aWNlVmVyc2lvbjsKIH07CiAKIC8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBQYXJhbWV0ZXJzIGNsYXNzIHNvIHRoYXQgaXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKaW5kZXggNjA3NmRhZS4uOWU3ZmZmOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKQEAgLTg5LDggKzg5LDI2IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOwogICAgIGlmIChtUHJldmlld1JlcXVlc3QuZW50cnlDb3VudCgpID09IDApIHsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCi0gICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOworICAgICAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDbGllbnQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2UgQ0FNRVJBM19URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHIGZvciBaU0wgc3RyZWFtaW5nIGNhc2UuCisgICAgICAgIGlmIChjbGllbnQtPmdldENhbWVyYURldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAgICAgaWYgKHBhcmFtcy56c2xNb2RlICYmICFwYXJhbXMucmVjb3JkaW5nSGludCkgeworICAgICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBM19URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKKyAgICAgICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBkZWZhdWx0IHByZXZpZXcgcmVxdWVzdDogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE2Myw4ICsxODEsNyBAQAogICAgIGlmIChtUHJldmlld1N0cmVhbUlkID09IE5PX1NUUkVBTSkgewogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtUHJldmlld1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucHJldmlld1dpZHRoLCBwYXJhbXMucHJldmlld0hlaWdodCwKLSAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAwLAotICAgICAgICAgICAgICAgICZtUHJldmlld1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAmbVByZXZpZXdTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gY3JlYXRlIHByZXZpZXcgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMjI1LDE0ICsyNDIsMTQgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gc3VwcG9ydCB0aGlzIG1hbnkgYnVmZmVyIHNsb3RzCiAgICAgaWYgKGNvdW50ID4gQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRvbyBtYW55IHJlY29yZGluZyBidWZmZXJzIHJlcXVlc3RlZDogJWQsIG1heCAlZCIsCisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBUb28gbWFueSByZWNvcmRpbmcgYnVmZmVycyByZXF1ZXN0ZWQ6ICV6dSwgbWF4ICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgY291bnQsIEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOwogCi0gICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5ldyByZWNvcmRpbmcgYnVmZmVyIGNvdW50IGZyb20gZW5jb2RlcjogJWQiLAorICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOZXcgcmVjb3JkaW5nIGJ1ZmZlciBjb3VudCBmcm9tIGVuY29kZXI6ICV6dSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgY291bnQpOwogCiAgICAgLy8gTmVlZCB0byByZS1zaXplIGNvbnN1bWVyIGFuZCBoZWFwCkBAIC0zMDEsNiArMzE4LDQ0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnJlY29yZGluZ1N0cmVhbU5lZWRzVXBkYXRlKAorICAgICAgICBjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsIGJvb2wgKm5lZWRzVXBkYXRlKSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgaWYgKG5lZWRzVXBkYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IGludmFsaWQgYXJndW1lbnQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVJlY29yZGluZ1N0cmVhbUlkID09IE5PX1NUUkVBTSkgeworICAgICAgICAqbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldmljZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBEZXZpY2UgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CisgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKKyAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyByZWNvcmRpbmcgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCisgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAobVJlY29yZGluZ0NvbnN1bWVyID09IDAgfHwgY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9XaWR0aCB8fAorICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0KSB7CisgICAgICAgICpuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgfQorICAgICpuZWVkc1VwZGF0ZSA9IGZhbHNlOworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IFN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMzE0LDE4ICszNjksMjAgQEAKIAogICAgIGJvb2wgbmV3Q29uc3VtZXIgPSBmYWxzZTsKICAgICBpZiAobVJlY29yZGluZ0NvbnN1bWVyID09IDApIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlY29yZGluZyBjb25zdW1lciB3aXRoICVkICsgMSAiCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZWNvcmRpbmcgY29uc3VtZXIgd2l0aCAlenUgKyAxICIKICAgICAgICAgICAgICAgICAiY29uc3VtZXItc2lkZSBidWZmZXJzIiwgX19GVU5DVElPTl9fLCBtSWQsIG1SZWNvcmRpbmdIZWFwQ291bnQpOwogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludC4gV2UgbmVlZCBvbmUgbW9yZSBidWZmZXIgaGVyZSBzbyB0aGF0IHdlIGNhbgogICAgICAgICAvLyBhbHdheXMgYWNxdWlyZSBhbmQgZnJlZSBhIGJ1ZmZlciB3aGVuIHRoZSBoZWFwIGlzIGZ1bGw7IG90aGVyd2lzZSB0aGUgY29uc3VtZXIKICAgICAgICAgLy8gd2lsbCBoYXZlIGJ1ZmZlcnMgaW4gZmxpZ2h0IHdlJ2xsIG5ldmVyIGNsZWFyIG91dC4KLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1SZWNvcmRpbmdDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoYnEsCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihjb25zdW1lciwKICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCiAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBDb3VudCArIDEpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyLVJlY29yZGluZ0NvbnN1bWVyIikpOwotICAgICAgICBtUmVjb3JkaW5nV2luZG93ID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICBtUmVjb3JkaW5nV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgICAgICBuZXdDb25zdW1lciA9IHRydWU7CiAgICAgICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBsYXRlciwgc2luY2Ugd2UgZG9uJ3Qga25vdyBidWZmZXIgc2l6ZSB1bnRpbCByZWNlaXB0CiAgICAgfQpAQCAtMzY1LDcgKzQyMiw3IEBACiAgICAgICAgIG1SZWNvcmRpbmdGcmFtZUNvdW50ID0gMDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVJlY29yZGluZ1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMudmlkZW9XaWR0aCwgcGFyYW1zLnZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsIDAsICZtUmVjb3JkaW5nU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsICZtUmVjb3JkaW5nU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIHJlY29yZGluZzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtNDI4LDE0ICs0ODUsMTcgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBtKG1NdXRleCk7CiAKLSAgICAvLyBJZiBhIHJlY29yZGluZyBzdHJlYW0gaXMgYmVpbmcgc3RhcnRlZCB1cCwgZnJlZSB1cCBhbnkKLSAgICAvLyBvdXRzdGFuZGluZyBidWZmZXJzIGxlZnQgZnJvbSB0aGUgcHJldmlvdXMgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAgLy8gVGhlcmUgc2hvdWxkIG5ldmVyIGJlIGFueSwgc28gaWYgdGhlcmUgYXJlLCB3YXJuIGFib3V0IGl0LgotICAgIGlmIChpc1N0cmVhbUFjdGl2ZShvdXRwdXRTdHJlYW1zLCBtUmVjb3JkaW5nU3RyZWFtSWQpKSB7CisgICAgLy8gSWYgYSByZWNvcmRpbmcgc3RyZWFtIGlzIGJlaW5nIHN0YXJ0ZWQgdXAgYW5kIG5vIHJlY29yZGluZworICAgIC8vIHN0cmVhbSBpcyBhY3RpdmUgeWV0LCBmcmVlIHVwIGFueSBvdXRzdGFuZGluZyBidWZmZXJzIGxlZnQKKyAgICAvLyBmcm9tIHRoZSBwcmV2aW91cyByZWNvcmRpbmcgc2Vzc2lvbi4gVGhlcmUgc2hvdWxkIG5ldmVyIGJlCisgICAgLy8gYW55LCBzbyBpZiB0aGVyZSBhcmUsIHdhcm4gYWJvdXQgaXQuCisgICAgYm9vbCBpc1JlY29yZGluZ1N0cmVhbUlkbGUgPSAhaXNTdHJlYW1BY3RpdmUobUFjdGl2ZVN0cmVhbUlkcywgbVJlY29yZGluZ1N0cmVhbUlkKTsKKyAgICBib29sIHN0YXJ0UmVjb3JkaW5nU3RyZWFtID0gaXNTdHJlYW1BY3RpdmUob3V0cHV0U3RyZWFtcywgbVJlY29yZGluZ1N0cmVhbUlkKTsKKyAgICBpZiAoc3RhcnRSZWNvcmRpbmdTdHJlYW0gJiYgaXNSZWNvcmRpbmdTdHJlYW1JZGxlKSB7CiAgICAgICAgIHJlbGVhc2VBbGxSZWNvcmRpbmdGcmFtZXNMb2NrZWQoKTsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogJXMgc3RhcnRlZCwgcmVjb3JkaW5nIGhlYXAgaGFzICVkIGZyZWUgb2YgJWQiLAorICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiAlcyBzdGFydGVkLCByZWNvcmRpbmcgaGVhcCBoYXMgJXp1IGZyZWUgb2YgJXp1IiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCAodHlwZSA9PSBQUkVWSUVXKSA/ICJwcmV2aWV3IiA6ICJyZWNvcmRpbmciLAogICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBGcmVlLCBtUmVjb3JkaW5nSGVhcENvdW50KTsKIApAQCAtNjU4LDggKzcxOCw4IEBACiAKICAgICAgICAgaWYgKG1SZWNvcmRpbmdIZWFwID09IDApIHsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpOwotICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlY29yZGluZyBoZWFwIHdpdGggJWQgYnVmZmVycyBvZiAiCi0gICAgICAgICAgICAgICAgICAgICJzaXplICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLCBtSWQsCisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ3JlYXRpbmcgcmVjb3JkaW5nIGhlYXAgd2l0aCAlenUgYnVmZmVycyBvZiAiCisgICAgICAgICAgICAgICAgICAgICJzaXplICV6dSBieXRlcyIsIF9fRlVOQ1RJT05fXywgbUlkLAogICAgICAgICAgICAgICAgICAgICBtUmVjb3JkaW5nSGVhcENvdW50LCBidWZmZXJTaXplKTsKIAogICAgICAgICAgICAgbVJlY29yZGluZ0hlYXAgPSBuZXcgQ2FtZXJhMkhlYXAoYnVmZmVyU2l6ZSwgbVJlY29yZGluZ0hlYXBDb3VudCwKQEAgLTgxOSwxMCArODc5LDEwIEBACiAgICAgfQogCiAgICAgaWYgKHJlbGVhc2VkQ291bnQgPiAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBGb3JjZS1mcmVlZCAlZCBvdXRzdGFuZGluZyBidWZmZXJzICIKKyAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEZvcmNlLWZyZWVkICV6dSBvdXRzdGFuZGluZyBidWZmZXJzICIKICAgICAgICAgICAgICAgICAiZnJvbSBwcmV2aW91cyByZWNvcmRpbmcgc2Vzc2lvbiIsIF9fRlVOQ1RJT05fXywgbUlkLCByZWxlYXNlZENvdW50KTsKICAgICAgICAgQUxPR0VfSUYocmVsZWFzZWRDb3VudCAhPSBtUmVjb3JkaW5nSGVhcENvdW50IC0gbVJlY29yZGluZ0hlYXBGcmVlLAotICAgICAgICAgICAgIiVzOiBDYW1lcmEgJWQ6IEZvcmNlLWZyZWVkICVkIGJ1ZmZlcnMsIGJ1dCBleHBlY3RlZCAlZCIsCisgICAgICAgICAgICAiJXM6IENhbWVyYSAlZDogRm9yY2UtZnJlZWQgJXp1IGJ1ZmZlcnMsIGJ1dCBleHBlY3RlZCAlenUiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHJlbGVhc2VkQ291bnQsIG1SZWNvcmRpbmdIZWFwQ291bnQgLSBtUmVjb3JkaW5nSGVhcEZyZWUpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCmluZGV4IDgzM2JiOGYuLjg0NjZhZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKQEAgLTU0LDYgKzU0LDkgQEAKIAogICAgIHN0YXR1c190IHNldFJlY29yZGluZ0J1ZmZlckNvdW50KHNpemVfdCBjb3VudCk7CiAgICAgc3RhdHVzX3QgdXBkYXRlUmVjb3JkaW5nUmVxdWVzdChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOworICAgIC8vIElmIG5lZWRzVXBkYXRlIGlzIHNldCB0byB0cnVlLCBhIHVwZGF0ZVJlY29yZGluZ1N0cmVhbSBjYWxsIHdpdGggcGFyYW1zIHdpbGwgcmVjcmVhdGUKKyAgICAvLyByZWNvcmRpbmcgc3RyZWFtCisgICAgc3RhdHVzX3QgcmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLCBib29sICpuZWVkc1VwZGF0ZSk7CiAgICAgc3RhdHVzX3QgdXBkYXRlUmVjb3JkaW5nU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgc3RhdHVzX3QgZGVsZXRlUmVjb3JkaW5nU3RyZWFtKCk7CiAgICAgaW50IGdldFJlY29yZGluZ1N0cmVhbUlkKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCmluZGV4IDQyMDdiYTkuLjhmNzgxMDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCkBAIC0yNSw2ICsyNSw4IEBACiAjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQogI2VuZGlmCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgpAQCAtNDYsNiArNDgsNyBAQAogICAgICAgICBtRGV2aWNlKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCkpLAogICAgICAgICBtU2VxdWVuY2VyKHNlcXVlbmNlciksCiAgICAgICAgIG1JZChjbGllbnQtPmdldENhbWVyYUlkKCkpLAorICAgICAgICBtRGVsZXRlZChmYWxzZSksCiAgICAgICAgIG1ac2xCdWZmZXJBdmFpbGFibGUoZmFsc2UpLAogICAgICAgICBtWnNsU3RyZWFtSWQoTk9fU1RSRUFNKSwKICAgICAgICAgbVpzbFJlcHJvY2Vzc1N0cmVhbUlkKE5PX1NUUkVBTSksCkBAIC02MCw3ICs2Myw3IEBACiAKIFpzbFByb2Nlc3Nvcjo6flpzbFByb2Nlc3NvcigpIHsKICAgICBBTE9HVigiJXM6IEV4aXQiLCBfX0ZVTkNUSU9OX18pOwotICAgIGRlbGV0ZVN0cmVhbSgpOworICAgIGRpc2Nvbm5lY3QoKTsKIH0KIAogdm9pZCBac2xQcm9jZXNzb3I6Om9uRnJhbWVBdmFpbGFibGUoKSB7CkBAIC03MSwxOCArNzQsMTkgQEAKICAgICB9CiB9CiAKLXZvaWQgWnNsUHJvY2Vzc29yOjpvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgLypyZXF1ZXN0SWQqLywKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKSB7Cit2b2lkIFpzbFByb2Nlc3Nvcjo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7Ci0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGVudHJ5LmRhdGEuaTY0WzBdOwogICAgICh2b2lkKXRpbWVzdGFtcDsKLSAgICBBTE9HVlYoIkdvdCBwcmV2aWV3IGZyYW1lIGZvciB0aW1lc3RhbXAgJWxsZCIsIHRpbWVzdGFtcCk7CisgICAgQUxPR1ZWKCJHb3QgcHJldmlldyBmcmFtZSBmb3IgdGltZXN0YW1wICUiIFBSSWQ2NCwgdGltZXN0YW1wKTsKIAogICAgIGlmIChtU3RhdGUgIT0gUlVOTklORykgcmV0dXJuOwogCi0gICAgbUZyYW1lTGlzdC5lZGl0SXRlbUF0KG1GcmFtZUxpc3RIZWFkKSA9IGZyYW1lOworICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSByZXN1bHQubU1ldGFkYXRhOwogICAgIG1GcmFtZUxpc3RIZWFkID0gKG1GcmFtZUxpc3RIZWFkICsgMSkgJSBrRnJhbWVMaXN0RGVwdGg7CiAKICAgICBmaW5kTWF0Y2hlc0xvY2tlZCgpOwpAQCAtMTI4LDEzICsxMzIsMTUgQEAKIAogICAgIGlmIChtWnNsQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludAotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbVpzbENvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihicSwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtWnNsQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMLAogICAgICAgICAgICAga1pzbEJ1ZmZlckRlcHRoKTsKICAgICAgICAgbVpzbENvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtWnNsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6WnNsQ29uc3VtZXIiKSk7Ci0gICAgICAgIG1ac2xXaW5kb3cgPSBuZXcgU3VyZmFjZShicSk7CisgICAgICAgIG1ac2xXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgfQogCiAgICAgaWYgKG1ac2xTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKQEAgLTE3MCw2ICsxNzYsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbURlbGV0ZWQgPSBmYWxzZTsKKwogICAgIGlmIChtWnNsU3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENyZWF0ZSBzdHJlYW0gZm9yIEhBTCBwcm9kdWN0aW9uCiAgICAgICAgIC8vIFRPRE86IFNvcnQgb3V0IGJldHRlciB3YXkgdG8gc2VsZWN0IHJlc29sdXRpb24gZm9yIFpTTApAQCAtMTc4LDggKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgKGludClIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1ac2xXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGgsIHBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCAwLAotICAgICAgICAgICAgICAgICZtWnNsU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsICZtWnNsU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIFpTTDogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtMTk3LDEzICsyMDQsMjIgQEAKICAgICB9CiAgICAgY2xpZW50LT5yZWdpc3RlckZyYW1lTGlzdGVuZXIoQ2FtZXJhMkNsaWVudDo6a1ByZXZpZXdSZXF1ZXN0SWRTdGFydCwKICAgICAgICAgICAgIENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkRW5kLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgWnNsUHJvY2Vzc29yOjpkZWxldGVTdHJlYW0oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CisgICAgLy8gV0FSKGIvMTU0MDgxMjgpOiBkbyBub3QgZGVsZXRlIHN0cmVhbSB1bmxlc3MgY2xpZW50IGlzIGJlaW5nIGRpc2Nvbm5lY3RlZC4KKyAgICBtRGVsZXRlZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBac2xQcm9jZXNzb3I6OmRpc2Nvbm5lY3QoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CkBAIC00NjEsNyArNDc3LDcgQEAKIAogICAgIG1ac2xRdWV1ZUhlYWQgPSAobVpzbFF1ZXVlSGVhZCArIDEpICUga1pzbEJ1ZmZlckRlcHRoOwogCi0gICAgQUxPR1ZWKCIgIEFjcXVpcmVkIGJ1ZmZlciwgdGltZXN0YW1wICVsbGQiLCBxdWV1ZUhlYWQuYnVmZmVyLm1UaW1lc3RhbXApOworICAgIEFMT0dWVigiICBBY3F1aXJlZCBidWZmZXIsIHRpbWVzdGFtcCAlIiBQUklkNjQsIHF1ZXVlSGVhZC5idWZmZXIubVRpbWVzdGFtcCk7CiAKICAgICBmaW5kTWF0Y2hlc0xvY2tlZCgpOwogCkBAIC00ODAsNyArNDk2LDcgQEAKICAgICAgICAgICAgICAgICBlbnRyeSA9IHF1ZXVlRW50cnkuZnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgICAgICAgICAgICAgIGZyYW1lVGltZXN0YW1wID0gZW50cnkuZGF0YS5pNjRbMF07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVlYoIiAgICVkOiBiOiAlbGxkXHRmOiAlbGxkIiwgaSwKKyAgICAgICAgICAgIEFMT0dWVigiICAgJWQ6IGI6ICUiIFBSSWQ2NCAiXHRmOiAlIiBQUklkNjQsIGksCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclRpbWVzdGFtcCwgZnJhbWVUaW1lc3RhbXAgKTsKICAgICAgICAgfQogICAgICAgICBpZiAocXVldWVFbnRyeS5mcmFtZS5pc0VtcHR5KCkgJiYgYnVmZmVyVGltZXN0YW1wICE9IDApIHsKQEAgLTQ5OCwxMyArNTE0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBmcmFtZVRpbWVzdGFtcCA9IGVudHJ5LmRhdGEuaTY0WzBdOwogICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyVGltZXN0YW1wID09IGZyYW1lVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIiVzOiBGb3VuZCBtYXRjaCAlbGxkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCIlczogRm91bmQgbWF0Y2ggJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsdGEgPSBhYnMoYnVmZmVyVGltZXN0YW1wIC0gZnJhbWVUaW1lc3RhbXApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWx0YSA8IDEwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIiVzOiBGb3VuZCBjbG9zZSBtYXRjaCAlbGxkIChkZWx0YSAlbGxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCIlczogRm91bmQgY2xvc2UgbWF0Y2ggJSIgUFJJZDY0ICIgKGRlbHRhICUiIFBSSWQ2NCAiKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlclRpbWVzdGFtcCwgZGVsdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU0MCw3ICs1NTYsNyBAQAogICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgZnJhbWVBZVN0YXRlID0gZW50cnkuZGF0YS51OFswXTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmc4IHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIgICAlZDogYjogJWxsZFx0ZjogJWxsZCwgQUUgc3RhdGU6ICVkIiwgaSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiAgICV6dTogYjogJSIgUFJJZDY0ICJcdGY6ICUiIFBSSWQ2NCAiLCBBRSBzdGF0ZTogJWQiLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVGltZXN0YW1wLCBmcmFtZVRpbWVzdGFtcCwgZnJhbWVBZVN0YXRlKTsKICAgICAgICAgQUxPR1YoIiVzIiwgcmVzdWx0LnN0cmluZygpKTsKICAgICAgICAgaWYgKGZkICE9IC0xKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKaW5kZXggNmQzY2I4NS4uYjY1MzNjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgiCkBAIC01NCw3ICs1NSw3IEBACiAgICAgLy8gRnJvbSBtWnNsQ29uc3VtZXIKICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOwogICAgIC8vIEZyb20gRnJhbWVQcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlKTsKIApAQCAtNjYsNiArNjcsNyBAQAogCiAgICAgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CisgICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwogICAgIGludCBnZXRTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgcHVzaFRvUmVwcm9jZXNzKGludDMyX3QgcmVxdWVzdElkKTsKQEAgLTg1LDYgKzg3LDggQEAKICAgICB3cDxDYXB0dXJlU2VxdWVuY2VyPiBtU2VxdWVuY2VyOwogICAgIGludCBtSWQ7CiAKKyAgICBib29sIG1EZWxldGVkOworCiAgICAgbXV0YWJsZSBNdXRleCBtSW5wdXRNdXRleDsKICAgICBib29sIG1ac2xCdWZmZXJBdmFpbGFibGU7CiAgICAgQ29uZGl0aW9uIG1ac2xCdWZmZXJBdmFpbGFibGVTaWduYWw7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKaW5kZXggNzc2ZWJlMi4uZjExMGI2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcApAQCAtMjUsNiArMjUsOCBAQAogI2RlZmluZSBBTE9HVlYoLi4uKSAoKHZvaWQpMCkKICNlbmRpZgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KQEAgLTQyLDYgKzQ0LDcgQEAKICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQsCiAgICAgd3A8Q2FwdHVyZVNlcXVlbmNlcj4gc2VxdWVuY2VyKToKICAgICAgICAgVGhyZWFkKGZhbHNlKSwKKyAgICAgICAgbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXAoMCksCiAgICAgICAgIG1TdGF0ZShSVU5OSU5HKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLAogICAgICAgICBtU2VxdWVuY2VyKHNlcXVlbmNlciksCkBAIC00OSw5ICs1Miw0MiBAQAogICAgICAgICBtWnNsU3RyZWFtSWQoTk9fU1RSRUFNKSwKICAgICAgICAgbUZyYW1lTGlzdEhlYWQoMCksCiAgICAgICAgIG1ac2xRdWV1ZUhlYWQoMCksCi0gICAgICAgIG1ac2xRdWV1ZVRhaWwoMCkgewotICAgIG1ac2xRdWV1ZS5pbnNlcnRBdCgwLCBrWnNsQnVmZmVyRGVwdGgpOwotICAgIG1GcmFtZUxpc3QuaW5zZXJ0QXQoMCwga0ZyYW1lTGlzdERlcHRoKTsKKyAgICAgICAgbVpzbFF1ZXVlVGFpbCgwKSwKKyAgICAgICAgbUhhc0ZvY3VzZXIoZmFsc2UpIHsKKyAgICAvLyBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZSBhbmQgZnJhbWUgbGlzdCBiYXNlZCBvbiBwaXBlbGluZSBtYXggZGVwdGguCisgICAgc2l6ZV90IHBpcGVsaW5lTWF4RGVwdGggPSBrRGVmYXVsdE1heFBpcGVsaW5lRGVwdGg7CisgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IGRldmljZSA9CisgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYTNEZXZpY2UqPihjbGllbnQtPmdldENhbWVyYURldmljZSgpLmdldCgpKTsKKyAgICAgICAgaWYgKGRldmljZSAhPSAwKSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9CisgICAgICAgICAgICAgICAgZGV2aWNlLT5pbmZvKCkuZmluZChBTkRST0lEX1JFUVVFU1RfUElQRUxJTkVfTUFYX0RFUFRIKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcGlwZWxpbmVNYXhEZXB0aCA9IGVudHJ5LmRhdGEudThbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGZpbmQgdGhlIGFuZHJvaWQucmVxdWVzdC5waXBlbGluZU1heERlcHRoLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgdXNlIGRlZmF1bHQgcGlwZWxpbmUgbWF4IGRlcHRoICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0TWF4UGlwZWxpbmVEZXB0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5ID0gZGV2aWNlLT5pbmZvKCkuZmluZChBTkRST0lEX0xFTlNfSU5GT19NSU5JTVVNX0ZPQ1VTX0RJU1RBTkNFKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDAgJiYgZW50cnkuZGF0YS5mWzBdICE9IDAuKSB7CisgICAgICAgICAgICAgICAgbUhhc0ZvY3VzZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZSBhbmQgZnJhbWUgbGlzdCBkZXB0aCBiYXNlZCBvbiBtYXggcGlwZWxpbmUgZGVwdGggKCVkKSIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBwaXBlbGluZU1heERlcHRoKTsKKyAgICAvLyBOZWVkIHRvIGtlZXAgYnVmZmVyIHF1ZXVlIGxvbmdlciB0aGFuIG1ldGFkYXRhIHF1ZXVlIGJlY2F1c2Ugc29tZXRpbWVzIGJ1ZmZlciBhcnJpdmVzCisgICAgLy8gZWFybGllciB0aGFuIG1ldGFkYXRhIHdoaWNoIGNhdXNlcyB0aGUgYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gb2xkZXN0IG1ldGFkYXRhIGJlaW5nCisgICAgLy8gcmVtb3ZlZC4KKyAgICBtRnJhbWVMaXN0RGVwdGggPSBwaXBlbGluZU1heERlcHRoOworICAgIG1CdWZmZXJRdWV1ZURlcHRoID0gbUZyYW1lTGlzdERlcHRoICsgMTsKKworCisgICAgbVpzbFF1ZXVlLmluc2VydEF0KDAsIG1CdWZmZXJRdWV1ZURlcHRoKTsKKyAgICBtRnJhbWVMaXN0Lmluc2VydEF0KDAsIG1GcmFtZUxpc3REZXB0aCk7CiAgICAgc3A8Q2FwdHVyZVNlcXVlbmNlcj4gY2FwdHVyZVNlcXVlbmNlciA9IG1TZXF1ZW5jZXIucHJvbW90ZSgpOwogICAgIGlmIChjYXB0dXJlU2VxdWVuY2VyICE9IDApIGNhcHR1cmVTZXF1ZW5jZXItPnNldFpzbFByb2Nlc3Nvcih0aGlzKTsKIH0KQEAgLTYxLDE5ICs5NywzNCBAQAogICAgIGRlbGV0ZVN0cmVhbSgpOwogfQogCi12b2lkIFpzbFByb2Nlc3NvcjM6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCAvKnJlcXVlc3RJZCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgewordm9pZCBac2xQcm9jZXNzb3IzOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczoiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgIG5zZWNzX3QgdGltZXN0YW1wID0gZW50cnkuZGF0YS5pNjRbMF07Ci0gICAgKHZvaWQpdGltZXN0YW1wOwotICAgIEFMT0dWVigiR290IHByZXZpZXcgbWV0YWRhdGEgZm9yIHRpbWVzdGFtcCAlbGxkIiwgdGltZXN0YW1wKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGRvZXNuJ3QgaGF2ZSB0aW1lc3RhbXAsIHNraXAgdGhpcyByZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5UKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGRvZXNuJ3QgaGF2ZSBmcmFtZSBudW1iZXIsIHNraXAgdGhpcyByZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBlbnRyeS5kYXRhLmkzMlswXTsKKworICAgIEFMT0dWVigiR290IHByZXZpZXcgbWV0YWRhdGEgZm9yIGZyYW1lICVkIHdpdGggdGltZXN0YW1wICUiIFBSSWQ2NCwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCk7CiAKICAgICBpZiAobVN0YXRlICE9IFJVTk5JTkcpIHJldHVybjsKIAotICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSBmcmFtZTsKLSAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUga0ZyYW1lTGlzdERlcHRoOworICAgIC8vIENvcnJlc3BvbmRpbmcgYnVmZmVyIGhhcyBiZWVuIGNsZWFyZWQuIE5vIG5lZWQgdG8gcHVzaCBpbnRvIG1GcmFtZUxpc3QKKyAgICBpZiAodGltZXN0YW1wIDw9IG1MYXRlc3RDbGVhcmVkQnVmZmVyVGltZXN0YW1wKSByZXR1cm47CisKKyAgICBtRnJhbWVMaXN0LmVkaXRJdGVtQXQobUZyYW1lTGlzdEhlYWQpID0gcmVzdWx0Lm1NZXRhZGF0YTsKKyAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUgbUZyYW1lTGlzdERlcHRoOwogfQogCiBzdGF0dXNfdCBac2xQcm9jZXNzb3IzOjp1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CkBAIC0xMzMsNyArMTg0LDcgQEAKICAgICAgICAgLy8gTm90ZSB0aGF0IGZvcm1hdCBzcGVjaWZpZWQgaW50ZXJuYWxseSBpbiBDYW1lcmEzWnNsU3RyZWFtCiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlWnNsU3RyZWFtKAogICAgICAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5hcnJheVdpZHRoLCBwYXJhbXMuZmFzdEluZm8uYXJyYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAga1pzbEJ1ZmZlckRlcHRoLAorICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZURlcHRoLAogICAgICAgICAgICAgICAgICZtWnNsU3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgJm1ac2xTdHJlYW0pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0xNDIsMTAgKzE5MywxNSBAQAogICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KKworICAgICAgICAvLyBPbmx5IGFkZCB0aGUgY2FtZXJhMyBidWZmZXIgbGlzdGVuZXIgd2hlbiB0aGUgc3RyZWFtIGlzIGNyZWF0ZWQuCisgICAgICAgIG1ac2xTdHJlYW0tPmFkZEJ1ZmZlckxpc3RlbmVyKHRoaXMpOwogICAgIH0KKwogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkU3RhcnQsCiAgICAgICAgICAgICBDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZEVuZCwKLSAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIC8qc2VuZFBhcnRpYWxzKi9mYWxzZSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xODgsNiArMjQ0LDQ2IEBACiAgICAgcmV0dXJuIG1ac2xTdHJlYW1JZDsKIH0KIAorc3RhdHVzX3QgWnNsUHJvY2Vzc29yMzo6dXBkYXRlUmVxdWVzdFdpdGhEZWZhdWx0U3RpbGxSZXF1ZXN0KENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSBjb25zdCB7CisgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CisgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDbGllbnQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8Q2FtZXJhM0RldmljZT4gZGV2aWNlID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhM0RldmljZSo+KGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCkuZ2V0KCkpOworICAgIGlmIChkZXZpY2UgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRGV2aWNlIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgc3RpbGxUZW1wbGF0ZTsKKyAgICBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJnN0aWxsVGVtcGxhdGUpOworCisgICAgLy8gRmluZCBzb21lIG9mIHRoZSBwb3N0LXByb2Nlc3NpbmcgdGFncywgYW5kIGFzc2lnbiB0aGUgdmFsdWUgZnJvbSB0ZW1wbGF0ZSB0byB0aGUgcmVxdWVzdC4KKyAgICAvLyBPbmx5IGNoZWNrIHRoZSBhYmVycmF0aW9uIG1vZGUgYW5kIG5vaXNlIHJlZHVjdGlvbiBtb2RlIGZvciBub3csIGFzIHRoZXkgYXJlIHZlcnkgaW1wb3J0YW50CisgICAgLy8gZm9yIGltYWdlIHF1YWxpdHkuCisgICAgdWludDMyX3QgcG9zdFByb2Nlc3NpbmdUYWdzW10gPSB7CisgICAgICAgICAgICBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9UT05FTUFQX01PREUsCisgICAgICAgICAgICBBTkRST0lEX1NIQURJTkdfTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfSE9UX1BJWEVMX01PREUsCisgICAgICAgICAgICBBTkRST0lEX0VER0VfTU9ERQorICAgIH07CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihwb3N0UHJvY2Vzc2luZ1RhZ3MpIC8gc2l6ZW9mKHVpbnQzMl90KTsgaSsrKSB7CisgICAgICAgIGVudHJ5ID0gc3RpbGxUZW1wbGF0ZS5maW5kKHBvc3RQcm9jZXNzaW5nVGFnc1tpXSk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJlcXVlc3QudXBkYXRlKHBvc3RQcm9jZXNzaW5nVGFnc1tpXSwgZW50cnkuZGF0YS51OCwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFpzbFByb2Nlc3NvcjM6OnB1c2hUb1JlcHJvY2VzcyhpbnQzMl90IHJlcXVlc3RJZCkgewogICAgIEFMT0dWKCIlczogU2VuZCBpbiByZXByb2Nlc3MgcmVxdWVzdCB3aXRoIGlkICVkIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkKTsKQEAgLTI0NywxOCArMzQzLDQ1IEBACiAgICAgICAgIHVpbnQ4X3QgcmVxdWVzdFR5cGUgPSBBTkRST0lEX1JFUVVFU1RfVFlQRV9SRVBST0NFU1M7CiAgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9UWVBFLAogICAgICAgICAgICAgICAgICZyZXF1ZXN0VHlwZSwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSByZXF1ZXN0IHR5cGUiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1zWzFdID0KICAgICAgICAgICAgICAgICB7IG1ac2xTdHJlYW1JZCB9OwotICAgICAgICBpZiAocmVzID09IE9LKSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUywKKyAgICAgICAgcmVzID0gcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMsCiAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1zLCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gdXBkYXRlIHJlcXVlc3QgaW5wdXQgc3RyZWFtcyIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCBjYXB0dXJlSW50ZW50ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSk7CisgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwKKyAgICAgICAgICAgICAgICAmY2FwdHVyZUludGVudCwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byB1cGRhdGUgcmVxdWVzdCBjYXB0dXJlIGludGVudCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKICAgICAgICAgLy8gVE9ETzogU2hvdWxkbid0IHdlIGFsc28gdXBkYXRlIHRoZSBsYXRlc3QgcHJldmlldyBmcmFtZT8KICAgICAgICAgaW50MzJfdCBvdXRwdXRTdHJlYW1zWzFdID0KICAgICAgICAgICAgICAgICB7IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCkgfTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLAorICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCiAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtcywgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSByZXF1ZXN0IG91dHB1dCBzdHJlYW1zIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKwogICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsCiAgICAgICAgICAgICAgICAgJnJlcXVlc3RJZCwgMSk7Ci0KICAgICAgICAgaWYgKHJlcyAhPSBPSyApIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSBmcmFtZSB0byBhIHJlcHJvY2VzcyByZXF1ZXN0IiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CkBAIC0yODYsNiArNDA5LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBVcGRhdGUgcG9zdC1wcm9jZXNzaW5nIHNldHRpbmdzCisgICAgICAgIHJlcyA9IHVwZGF0ZVJlcXVlc3RXaXRoRGVmYXVsdFN0aWxsUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gdXBkYXRlIHBvc3QtcHJvY2Vzc2luZyB0YWdzLCB0aGUgcmVwcm9jZXNzZWQgaW1hZ2UgcXVhbGl0eSAiCisgICAgICAgICAgICAgICAgICAgICJtYXkgYmUgY29tcHJvbWlzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKICAgICAgICAgbUxhdGVzdENhcHR1cmVkUmVxdWVzdCA9IHJlcXVlc3Q7CiAgICAgICAgIHJlcyA9IGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCktPmNhcHR1cmUocmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0sgKSB7CkBAIC0zMTAsMTEgKzQ0MCwxOSBAQAogCiBzdGF0dXNfdCBac2xQcm9jZXNzb3IzOjpjbGVhclpzbFF1ZXVlTG9ja2VkKCkgewogICAgIGlmIChtWnNsU3RyZWFtICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1ac2xTdHJlYW0tPmNsZWFySW5wdXRSaW5nQnVmZmVyKCk7CisgICAgICAgIC8vIGNsZWFyIHJlc3VsdCBtZXRhZGF0YSBsaXN0IGZpcnN0LgorICAgICAgICBjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCk7CisgICAgICAgIHJldHVybiBtWnNsU3RyZWFtLT5jbGVhcklucHV0UmluZ0J1ZmZlcigmbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXApOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgWnNsUHJvY2Vzc29yMzo6Y2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpIHsKKyAgICBtRnJhbWVMaXN0LmNsZWFyKCk7CisgICAgbUZyYW1lTGlzdEhlYWQgPSAwOworICAgIG1GcmFtZUxpc3QuaW5zZXJ0QXQoMCwgbUZyYW1lTGlzdERlcHRoKTsKK30KKwogdm9pZCBac2xQcm9jZXNzb3IzOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAgICAgaWYgKCFtTGF0ZXN0Q2FwdHVyZWRSZXF1ZXN0LmlzRW1wdHkoKSkgewpAQCAtMzU1LDcgKzQ5Myw3IEBACiAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSBmcmFtZUFlU3RhdGUgPSBlbnRyeS5kYXRhLnU4WzBdOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZzggcmVzdWx0ID0KLSAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiAgICVkOiBiOiAlbGxkXHRmOiAlbGxkLCBBRSBzdGF0ZTogJWQiLCBpLAorICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiICAgJXp1OiBiOiAlIiBQUklkNjQgIlx0ZjogJSIgUFJJZDY0ICIsIEFFIHN0YXRlOiAlZCIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJUaW1lc3RhbXAsIGZyYW1lVGltZXN0YW1wLCBmcmFtZUFlU3RhdGUpOwogICAgICAgICBBTE9HVigiJXMiLCByZXN1bHQuc3RyaW5nKCkpOwogICAgICAgICBpZiAoZmQgIT0gLTEpIHsKQEAgLTM2Niw2ICs1MDQsMjMgQEAKICAgICB9CiB9CiAKK2Jvb2wgWnNsUHJvY2Vzc29yMzo6aXNGaXhlZEZvY3VzTW9kZSh1aW50OF90IGFmTW9kZSkgY29uc3QgeworICAgIHN3aXRjaCAoYWZNb2RlKSB7CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfQVVUTzoKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9DT05USU5VT1VTX1ZJREVPOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfUElDVFVSRToKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9NQUNSTzoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX09GRjoKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9FRE9GOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVua25vd24gZm9jdXMgbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgYWZNb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKIG5zZWNzX3QgWnNsUHJvY2Vzc29yMzo6Z2V0Q2FuZGlkYXRlVGltZXN0YW1wTG9ja2VkKHNpemVfdCogbWV0YWRhdGFJZHgpIGNvbnN0IHsKICAgICAvKioKICAgICAgKiBGaW5kIHRoZSBzbWFsbGVzdCB0aW1lc3RhbXAgd2Uga25vdyBhYm91dCBzbyBmYXIKQEAgLTQxMSwxMSArNTY2LDQzIEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX0NPTlRST0xfQUZfTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBaU0wgcXVldWUgZnJhbWUgaGFzIG5vIEFGIG1vZGUgZmllbGQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDhfdCBhZk1vZGUgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgICAgICAgICAgICAgIGlmIChhZk1vZGUgPT0gQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIHRoZSBaU0wgYnVmZmVyIGZvciBtYW51YWwgQUYgbW9kZSwgYXMgd2UgZG9uJ3QgcmVhbGx5CisgICAgICAgICAgICAgICAgICAgIC8vIGtub3cgdGhlIGFmIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBBRiBzdGF0ZSBpZiBkZXZpY2UgaGFzIGZvY3VzZXIgYW5kIGZvY3VzIG1vZGUgaXNuJ3QgZml4ZWQKKyAgICAgICAgICAgICAgICBpZiAobUhhc0ZvY3VzZXIgJiYgIWlzRml4ZWRGb2N1c01vZGUoYWZNb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbmRpZGF0ZSBmcmFtZSBoYXMgZ29vZCBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFpTTCBxdWV1ZSBmcmFtZSBoYXMgbm8gQUYgc3RhdGUgZmllbGQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWZTdGF0ZSA9IGVudHJ5LmRhdGEudThbMF07CisgICAgICAgICAgICAgICAgICAgIGlmIChhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9QQVNTSVZFX0ZPQ1VTRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmU3RhdGUgIT0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX05PVF9GT0NVU0VEX0xPQ0tFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBaU0wgcXVldWUgZnJhbWUgQUYgc3RhdGUgaXMgJWQgaXMgbm90IGdvb2QgZm9yIGNhcHR1cmUsIHNraXAgaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFmU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtaW5UaW1lc3RhbXAgPSBmcmFtZVRpbWVzdGFtcDsKICAgICAgICAgICAgICAgICBpZHggPSBqOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVlYoIiVzOiBTYXcgdGltZXN0YW1wICVsbGQiLCBfX0ZVTkNUSU9OX18sIGZyYW1lVGltZXN0YW1wKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXM6IFNhdyB0aW1lc3RhbXAgJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sIGZyYW1lVGltZXN0YW1wKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDM1LDcgKzYyMiw3IEBACiAgICAgICAgIEFMT0dXKCIlczogWlNMIHF1ZXVlIGhhcyBubyBtZXRhZGF0YSBmcmFtZXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogQ2FuZGlkYXRlIHRpbWVzdGFtcCAlbGxkIChpZHggJWQpLCBlbXB0eSBmcmFtZXM6ICVkIiwKKyAgICBBTE9HVigiJXM6IENhbmRpZGF0ZSB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgKGlkeCAlenUpLCBlbXB0eSBmcmFtZXM6ICV6dSIsCiAgICAgICAgICAgX19GVU5DVElPTl9fLCBtaW5UaW1lc3RhbXAsIGlkeCwgZW1wdHlDb3VudCk7CiAKICAgICBpZiAobWV0YWRhdGFJZHgpIHsKQEAgLTQ1MSwxMyArNjM4LDE1IEBACiB9CiAKIHZvaWQgWnNsUHJvY2Vzc29yMzo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogCiAgICAgLy8gaWdub3JlIG91dHB1dCBidWZmZXJzCiAgICAgaWYgKGJ1ZmZlckluZm8ubU91dHB1dCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gTG9jayBtdXRleCBvbmx5IG9uY2Ugd2Uga25vdyB0aGlzIGlzIGFuIGlucHV0IGJ1ZmZlciByZXR1cm5lZCB0byBhdm9pZAorICAgIC8vIHBvdGVudGlhbCBkZWFkbG9jaworICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICAvLyBUT0RPOiBWZXJpZnkgdGhhdCB0aGUgYnVmZmVyIGlzIGluIG91ciBxdWV1ZSBieSBsb29raW5nIGF0IHRpbWVzdGFtcAogICAgIC8vIHRoZW9yZXRpY2FsbHkgdW5uZWNlc3NhcnkgdW5sZXNzIHdlIGNoYW5nZSB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgogICAgIC8vIC0tIG9ubHkgMSBidWZmZXIgcmVwcm9jZXNzZWQgYXQgYSB0aW1lICh3aGljaCBpcyB0aGUgY2FzZSBub3cpCkBAIC00NjgsMTEgKzY1NywxNyBAQAogICAgIC8vIFdlIG5lZWQgdG8gZ3VhcmFudGVlIHRoYXQgaWYgd2UgZG8gdHdvIGJhY2stdG8tYmFjayBjYXB0dXJlcywKICAgICAvLyB0aGUgc2Vjb25kIHdvbid0IHVzZSBhIGJ1ZmZlciB0aGF0J3Mgb2xkZXIvdGhlIHNhbWUgYXMgdGhlIGZpcnN0LCB3aGljaAogICAgIC8vIGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgaWYgd2UgZG9uJ3QgY2xlYXIgb3V0IHRoZSBxdWV1ZSBhbmQgdGhlCi0gICAgLy8gc2VsZWN0aW9uIGNyaXRlcmlhIGlzIHNvbWV0aGluZyBsaWtlICduZXdlc3QnLiBDbGVhcmluZyBvdXQgdGhlIHF1ZXVlCi0gICAgLy8gb24gYSBjb21wbGV0ZWQgY2FwdHVyZSBlbnN1cmVzIHdlJ2xsIG9ubHkgdXNlIG5ldyBkYXRhLgorICAgIC8vIHNlbGVjdGlvbiBjcml0ZXJpYSBpcyBzb21ldGhpbmcgbGlrZSAnbmV3ZXN0Jy4gQ2xlYXJpbmcgb3V0IHRoZSByZXN1bHQKKyAgICAvLyBtZXRhZGF0YSBxdWV1ZSBvbiBhIGNvbXBsZXRlZCBjYXB0dXJlIGVuc3VyZXMgd2UnbGwgb25seSB1c2UgbmV3IHRpbWVzdGFtcC4KKyAgICAvLyBDYWxsaW5nIGNsZWFyWnNsUXVldWVMb2NrZWQgaXMgYSBndWFyYW50ZWVkIGRlYWRsb2NrIGJlY2F1c2UgdGhpcyBjYWxsYmFjaworICAgIC8vIGhvbGRzIHRoZSBDYW1lcmEzU3RyZWFtIGludGVybmFsIGxvY2sgKG1Mb2NrKSwgYW5kIGNsZWFyWnNsUXVldWVMb2NrZWQgcmVxdWlyZXMKKyAgICAvLyB0byBob2xkIHRoZSBzYW1lIGxvY2suCisgICAgLy8gVE9ETzogbmVlZCBmaWd1cmUgb3V0IGEgd2F5IHRvIGNsZWFyIHRoZSBac2wgYnVmZmVyIHF1ZXVlIHByb3Blcmx5LiBSaWdodCBub3cKKyAgICAvLyBpdCBpcyBzYWZlIG5vdCB0byBkbyBzbywgYXMgYmFjayB0byBiYWNrIFpTTCBjYXB0dXJlIHJlcXVpcmVzIHN0b3AgYW5kIHN0YXJ0CisgICAgLy8gcHJldmlldywgd2hpY2ggd2lsbCBmbHVzaCBaU0wgcXVldWUgYXV0b21hdGljYWxseS4KICAgICBBTE9HVigiJXM6IE1lbW9yeSBvcHRpbWl6YXRpb24sIGNsZWFyaW5nIFpTTCBxdWV1ZSIsCiAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICBjbGVhclpzbFF1ZXVlTG9ja2VkKCk7CisgICAgY2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpOwogCiAgICAgLy8gUmVxdWlyZWQgc28gd2UgYWNjZXB0IG1vcmUgWlNMIHJlcXVlc3RzCiAgICAgbVN0YXRlID0gUlVOTklORzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oCmluZGV4IGQyZjgzMjIuLmZjOWY3MGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaApAQCAtNTAsOCArNTAsOCBAQAogICAgIFpzbFByb2Nlc3NvcjMoc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LCB3cDxDYXB0dXJlU2VxdWVuY2VyPiBzZXF1ZW5jZXIpOwogICAgIH5ac2xQcm9jZXNzb3IzKCk7CiAKLSAgICAvLyBGcm9tIEZyYW1lUHJvY2Vzc29yCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSk7CisgICAgLy8gRnJvbSBGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcgorICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCiAgICAgLyoqCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgyLDYgKzgyLDcgQEAKIAogICBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKKyAgICBuc2Vjc190IG1MYXRlc3RDbGVhcmVkQnVmZmVyVGltZXN0YW1wOwogCiAgICAgZW51bSB7CiAgICAgICAgIFJVTk5JTkcsCkBAIC0xMDcsOCArMTA4LDkgQEAKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWU7CiAgICAgfTsKIAotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1pzbEJ1ZmZlckRlcHRoID0gNDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZUxpc3REZXB0aCA9IGtac2xCdWZmZXJEZXB0aCAqIDI7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRNYXhQaXBlbGluZURlcHRoID0gNDsKKyAgICBzaXplX3QgbUJ1ZmZlclF1ZXVlRGVwdGg7CisgICAgc2l6ZV90IG1GcmFtZUxpc3REZXB0aDsKICAgICBWZWN0b3I8Q2FtZXJhTWV0YWRhdGE+IG1GcmFtZUxpc3Q7CiAgICAgc2l6ZV90IG1GcmFtZUxpc3RIZWFkOwogCkBAIC0xMjAsMTMgKzEyMiwyMiBAQAogCiAgICAgQ2FtZXJhTWV0YWRhdGEgbUxhdGVzdENhcHR1cmVkUmVxdWVzdDsKIAorICAgIGJvb2wgbUhhc0ZvY3VzZXI7CisKICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwogCiAgICAgc3RhdHVzX3QgY2xlYXJac2xRdWV1ZUxvY2tlZCgpOwogCisgICAgdm9pZCBjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCk7CisKICAgICB2b2lkIGR1bXBac2xRdWV1ZShpbnQgaWQpIGNvbnN0OwogCiAgICAgbnNlY3NfdCBnZXRDYW5kaWRhdGVUaW1lc3RhbXBMb2NrZWQoc2l6ZV90KiBtZXRhZGF0YUlkeCkgY29uc3Q7CisKKyAgICBib29sIGlzRml4ZWRGb2N1c01vZGUodWludDhfdCBhZk1vZGUpIGNvbnN0OworCisgICAgLy8gVXBkYXRlIHRoZSBwb3N0LXByb2Nlc3NpbmcgbWV0YWRhdGEgd2l0aCB0aGUgZGVmYXVsdCBzdGlsbCBjYXB0dXJlIHJlcXVlc3QgdGVtcGxhdGUKKyAgICBzdGF0dXNfdCB1cGRhdGVSZXF1ZXN0V2l0aERlZmF1bHRTdGlsbFJlcXVlc3QoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIGNvbnN0OwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcAppbmRleCAxM2NhYzZkLi45ZWZlYWJhCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSAiWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgiCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMiB7CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK3N0YXR1c190IFpzbFByb2Nlc3NvckludGVyZmFjZTo6ZGlzY29ubmVjdCgpIHsKKyAgICByZXR1cm4gT0s7Cit9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK307IC8vbmFtZXNwYWNlIGNhbWVyYTIKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oCmluZGV4IDE4M2MwYzIuLjllMjY2ZTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMiB7CkBAIC0zNyw2ICszOSw5IEBACiAgICAgLy8gRGVsZXRlIHRoZSB1bmRlcmx5aW5nIENhbWVyYURldmljZSBzdHJlYW1zCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKSA9IDA7CiAKKyAgICAvLyBDbGVhciBhbnkgYWRkaXRpb25hbCBzdGF0ZSBuZWNlc3NhcnkgYmVmb3JlIHRoZSBDYW1lcmFEZXZpY2UgaXMgZGlzY29ubmVjdGVkCisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CisKICAgICAvKioKICAgICAgKiBTdWJtaXRzIGEgWlNMIGNhcHR1cmUgcmVxdWVzdCAoaWQgPSByZXF1ZXN0SWQpCiAgICAgICoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCAxY2RmOGRjLi5lMzMwMWFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC0xNiwxMyArMTYsMTQgQEAKIAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFEZXZpY2VDbGllbnQiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgpAQCAtODIsNyArODMsNyBAQAogICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVnaXN0ZXJMaXN0ZW5lcihGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxpc3RlbmVyKi90aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnF1aXJrU2VuZFBhcnRpYWxzKi90cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL3RydWUpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTEsNzkgKzkyLDEwMSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgeworICAgIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3Q7CisgICAgcmVxdWVzdExpc3QucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgc3RyZWFtaW5nLCBsYXN0RnJhbWVOdW1iZXIpOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQUxPR1YoIiVzLXN0YXJ0IG9mIGZ1bmN0aW9uLiBSZXF1ZXN0IGxpc3Qgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RzLnNpemUoKSk7CiAKICAgICBzdGF0dXNfdCByZXM7Ci0KICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKIAotICAgIGlmIChyZXF1ZXN0ID09IDApIHsKKyAgICBpZiAocmVxdWVzdHMuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBudWxsIHJlcXVlc3QuIFJlamVjdGluZyByZXF1ZXN0LiIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YShyZXF1ZXN0LT5tTWV0YWRhdGEpOworICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+IG1ldGFkYXRhUmVxdWVzdExpc3Q7CisgICAgaW50MzJfdCByZXF1ZXN0SWQgPSBtUmVxdWVzdElkQ291bnRlcjsKKyAgICB1aW50MzJfdCBsb29wQ291bnRlciA9IDA7CiAKLSAgICBpZiAobWV0YWRhdGEuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTZW50IGVtcHR5IG1ldGFkYXRhIHBhY2tldC4gUmVqZWN0aW5nIHJlcXVlc3QuIiwKLSAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogUmVxdWVzdHMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdXJmYWNlIHRhcmdldC4gIgotICAgICAgICAgICAgICAiUmVqZWN0aW5nIHJlcXVlc3QuIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmICghZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhtZXRhZGF0YSkpIHsKLSAgICAgICAgLy8gQ2FsbGVlIGxvZ3MKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGluIHRoZSBvdXRwdXQgc3RyZWFtIElEcyB3aGljaCB3ZSBjYWxjdWxhdGUgZnJvbQotICAgICAqIHRoZSBjYXB0dXJlIHJlcXVlc3QncyBsaXN0IG9mIHN1cmZhY2UgdGFyZ2V0cwotICAgICAqLwotICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgb3V0cHV0U3RyZWFtSWRzLnNldENhcGFjaXR5KHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSByZXF1ZXN0LT5tU3VyZmFjZUxpc3RbaV07Ci0KLSAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7Ci0KLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotICAgICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KGdicC0+YXNCaW5kZXIoKSk7Ci0KLSAgICAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCi0gICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCi0gICAgICAgICAgICAgICAgICAiIHdlIGhhdmUgbm90IGNhbGxlZCBjcmVhdGVTdHJlYW0gb24iLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsgKytpdCkgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9ICppdDsKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgbnVsbCByZXF1ZXN0LiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgc3RyZWFtSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKLSAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnB1c2hfYmFjayhzdHJlYW1JZCk7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBcHBlbmRpbmcgb3V0cHV0IHN0cmVhbSAlZCB0byByZXF1ZXN0IiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEocmVxdWVzdC0+bU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKG1ldGFkYXRhLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgZW1wdHkgbWV0YWRhdGEgcGFja2V0LiBSZWplY3RpbmcgcmVxdWVzdC4iLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC0+bVN1cmZhY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFJlcXVlc3RzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VyZmFjZSB0YXJnZXQuICIKKyAgICAgICAgICAgICAgICAgICJSZWplY3RpbmcgcmVxdWVzdC4iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKG1ldGFkYXRhKSkgeworICAgICAgICAgICAgLy8gQ2FsbGVlIGxvZ3MKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBpbiB0aGUgb3V0cHV0IHN0cmVhbSBJRHMgd2hpY2ggd2UgY2FsY3VsYXRlIGZyb20KKyAgICAgICAgICogdGhlIGNhcHR1cmUgcmVxdWVzdCdzIGxpc3Qgb2Ygc3VyZmFjZSB0YXJnZXRzCisgICAgICAgICAqLworICAgICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMuc2V0Q2FwYWNpdHkocmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gcmVxdWVzdC0+bVN1cmZhY2VMaXN0W2ldOworICAgICAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7CisKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCA9IHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoZ2JwLT5hc0JpbmRlcigpKTsKKworICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCisgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2UgdGhhdCIKKyAgICAgICAgICAgICAgICAgICAgICAiIHdlIGhhdmUgbm90IGNhbGxlZCBjcmVhdGVTdHJlYW0gb24iLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5wdXNoX2JhY2soc3RyZWFtSWQpOworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFwcGVuZGluZyBvdXRwdXQgc3RyZWFtICVkIHRvIHJlcXVlc3QiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsICZvdXRwdXRTdHJlYW1JZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMuc2l6ZSgpKTsKKworICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELCAmcmVxdWVzdElkLCAvKnNpemUqLzEpOworICAgICAgICBsb29wQ291bnRlcisrOyAvLyBsb29wQ291bnRlciBzdGFydHMgZnJvbSAxCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZXF1ZXN0IHdpdGggSUQgJWQgKCVkIG9mICV6dSkiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVxdWVzdElkLCBsb29wQ291bnRlciwgcmVxdWVzdHMuc2l6ZSgpKTsKKworICAgICAgICBtZXRhZGF0YVJlcXVlc3RMaXN0LnB1c2hfYmFjayhtZXRhZGF0YSk7CiAgICAgfQotCi0gICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywgJm91dHB1dFN0cmVhbUlkc1swXSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnNpemUoKSk7Ci0KLSAgICBpbnQzMl90IHJlcXVlc3RJZCA9IG1SZXF1ZXN0SWRDb3VudGVyKys7Ci0gICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJnJlcXVlc3RJZCwgLypzaXplKi8xKTsKLSAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VibWl0dGluZyByZXF1ZXN0IHdpdGggSUQgJWQiLAotICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXF1ZXN0SWQpOworICAgIG1SZXF1ZXN0SWRDb3VudGVyKys7CiAKICAgICBpZiAoc3RyZWFtaW5nKSB7Ci0gICAgICAgIHJlcyA9IG1EZXZpY2UtPnNldFN0cmVhbWluZ1JlcXVlc3QobWV0YWRhdGEpOworICAgICAgICByZXMgPSBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChtZXRhZGF0YVJlcXVlc3RMaXN0LCBsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogIEdvdCBlcnJvciAlZCBhZnRlciB0cnlpbmcgdG8gc2V0IHN0cmVhbWluZyAiCiAgICAgICAgICAgICAgICAgICAicmVxdWVzdCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXMpOwpAQCAtMTcxLDExICsxOTQsMTIgQEAKICAgICAgICAgICAgIG1TdHJlYW1pbmdSZXF1ZXN0TGlzdC5wdXNoX2JhY2socmVxdWVzdElkKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IG1EZXZpY2UtPmNhcHR1cmUobWV0YWRhdGEpOworICAgICAgICByZXMgPSBtRGV2aWNlLT5jYXB0dXJlTGlzdChtZXRhZGF0YVJlcXVlc3RMaXN0LCBsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogR290IGVycm9yICVkIGFmdGVyIHRyeWluZyB0byBzZXQgY2FwdHVyZSIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVzKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVzKTsKICAgICAgICAgfQorICAgICAgICBBTE9HVigiJXM6IHJlcXVlc3RJZCA9ICVkICIsIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkKTsKICAgICB9CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRW5kIG9mIGZ1bmN0aW9uIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwpAQCAtMTg2LDcgKzIxMCw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpIHsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Y2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcywgcmVxdWVzdElkID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RJZCk7CiAKQEAgLTIxMiw3ICsyMzYsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHJlcyA9IG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHJlcyA9IG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdChsYXN0RnJhbWVOdW1iZXIpOwogCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VjY2Vzc2Z1bGx5IGNsZWFyZWQgc3RyZWFtaW5nIHJlcXVlc3QiLApAQCAtMjIzLDYgKzI0NywyNiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6YmVnaW5Db25maWd1cmUoKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMuCisgICAgQUxPR0UoIiVzOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZSgpIHsKKyAgICBBTE9HVigiJXM6IGVuZGluZyBjb25maWd1cmUgKCV6dSBzdHJlYW1zKSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1TdHJlYW1NYXAuc2l6ZSgpKTsKKworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisKKyAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKKworICAgIHJldHVybiBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKCk7Cit9CisKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIChzdHJlYW1JZCA9IDB4JXgpIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CkBAIC0yNTksOCArMzAzLDYgQEAKICAgICB9IGVsc2UgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBtU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogCi0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdWNjZXNzZnVsbHkgZGVsZXRlZCBzdHJlYW0gSUQgKCVkKSIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKQEAgLTI3Nyw2ICszMTksMTAgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAorICAgIGlmIChidWZmZXJQcm9kdWNlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmZmVyUHJvZHVjZXIgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCiAgICAgLy8gRG9uJ3QgY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgZm9yIHRoZSBzYW1lIHRhcmdldCBzdXJmYWNlCkBAIC0yODQsNyArMzMwLDcgQEAKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKSk7CiAgICAgICAgIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEJ1ZmZlciBwcm9kdWNlciBhbHJlYWR5IGhhcyBhIHN0cmVhbSBmb3IgaXQgIgotICAgICAgICAgICAgICAgICAgIihJRCAlZCkiLAorICAgICAgICAgICAgICAgICAgIihJRCAlemQpIiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBpbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CiAgICAgICAgIH0KQEAgLTM0NiwyMyArMzkyLDcgQEAKICAgICAvLyBhZnRlciBlYWNoIGNhbGwsIGJ1dCBvbmx5IG9uY2Ugd2UgYXJlIGRvbmUgd2l0aCBhbGwuCiAKICAgICBpbnQgc3RyZWFtSWQgPSAtMTsKLSAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewotICAgICAgICAvLyBKUEVHIGJ1ZmZlcnMgbmVlZCB0byBiZSBzaXplZCBmb3IgbWF4aW11bSBwb3NzaWJsZSBjb21wcmVzc2VkIHNpemUKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKLSAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIG1heGltdW0gSlBFRyBzaXplIGluICIKLSAgICAgICAgICAgICAgICAgICAgInN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBtYXhKcGVnU2l6ZSA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgICAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oYW53LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG1heEpwZWdTaXplLAotICAgICAgICAgICAgICAgICZzdHJlYW1JZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQWxsIG90aGVyIHN0cmVhbXMgYXJlIGEga25vd24gc2l6ZQotICAgICAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oYW53LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIC8qc2l6ZSovMCwKLSAgICAgICAgICAgICAgICAmc3RyZWFtSWQpOwotICAgIH0KKyAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oYW53LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsICZzdHJlYW1JZCk7CiAKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIG1TdHJlYW1NYXAuYWRkKGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpLCBzdHJlYW1JZCk7CkBAIC00NjUsNyArNDk1LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmZsdXNoKCkgeworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpmbHVzaChpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTQ3NiwzMCArNTA2LDQzIEBACiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKIAotICAgIHJldHVybiBtRGV2aWNlLT5mbHVzaCgpOworICAgIG1TdHJlYW1pbmdSZXF1ZXN0TGlzdC5jbGVhcigpOworICAgIHJldHVybiBtRGV2aWNlLT5mbHVzaChsYXN0RnJhbWVOdW1iZXIpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhRGV2aWNlQ2xpZW50WyVkXSAoJXApIFBJRDogJWQsIGR1bXA6XG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYURldmljZUNsaWVudFslZF0gKCVwKSBkdW1wOlxuIiwKICAgICAgICAgICAgIG1DYW1lcmFJZCwKLSAgICAgICAgICAgIGdldFJlbW90ZUNhbGxiYWNrKCktPmFzQmluZGVyKCkuZ2V0KCksCi0gICAgICAgICAgICBtQ2xpZW50UGlkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOiAiKTsKKyAgICAgICAgICAgIGdldFJlbW90ZUNhbGxiYWNrKCktPmFzQmluZGVyKCkuZ2V0KCkpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgQ3VycmVudCBjbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAldSlcbiIsCisgICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksCisgICAgICAgICAgICBtQ2xpZW50UGlkLCBtQ2xpZW50VWlkKTsKIAorICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgUmVxdWVzdCBJRCBjb3VudGVyOiAlZFxuIiwgbVJlcXVlc3RJZENvdW50ZXIpOworICAgIGlmICghbVN0cmVhbU1hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgIEN1cnJlbnQgc3RyZWFtIElEczpcbiIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgIFN0cmVhbSAlZFxuIiwgbVN0cmVhbU1hcC52YWx1ZUF0KGkpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICBObyBzdHJlYW1zIGNvbmZpZ3VyZWQuXG4iKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgLy8gVE9ETzogcHJpbnQgZHluYW1pYy9yZXF1ZXN0IHNlY3Rpb24gZnJvbSBtb3N0IHJlY2VudCByZXF1ZXN0cwogICAgIG1GcmFtZVByb2Nlc3Nvci0+ZHVtcChmZCwgYXJncyk7CiAKICAgICByZXR1cm4gZHVtcERldmljZShmZCwgYXJncyk7CiB9CiAKLQotdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeUVycm9yKCkgewordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKIAogICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7Ci0gICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgfQogfQogCkBAIC01MTIsMTIgKzU1NSwxMiBAQAogICAgIH0KIH0KIAotdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwKK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKICAgICAvLyBUaHJlYWQgc2FmZS4gRG9uJ3QgYm90aGVyIGxvY2tpbmcuCiAgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBnZXRSZW1vdGVDYWxsYmFjaygpOwogICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7Ci0gICAgICAgIHJlbW90ZUNiLT5vbkNhcHR1cmVTdGFydGVkKHJlcXVlc3RJZCwgdGltZXN0YW1wKTsKKyAgICAgICAgcmVtb3RlQ2ItPm9uQ2FwdHVyZVN0YXJ0ZWQocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOwogICAgIH0KIH0KIApAQCAtNTUyLDE2ICs1OTUsMTQgQEAKIH0KIAogLyoqIERldmljZS1yZWxhdGVkIG1ldGhvZHMgKi8KLXZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50OjpvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZnJhbWUpIHsKK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50OjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKICAgICAvLyBUaHJlYWQtc2FmZS4gTm8gbG9jayBuZWNlc3NhcnkuCiAgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBtUmVtb3RlQ2FsbGJhY2s7CiAgICAgaWYgKHJlbW90ZUNiICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBmcmFtZSA9ICVwICIsIF9fRlVOQ1RJT05fXywgJmZyYW1lKTsKLSAgICAgICAgcmVtb3RlQ2ItPm9uUmVzdWx0UmVjZWl2ZWQocmVxdWVzdElkLCBmcmFtZSk7CisgICAgICAgIHJlbW90ZUNiLT5vblJlc3VsdFJlY2VpdmVkKHJlc3VsdC5tTWV0YWRhdGEsIHJlc3VsdC5tUmVzdWx0RXh0cmFzKTsKICAgICB9CiB9CiAKQEAgLTYyMCw2MSArNjYxLDggQEAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Z2V0Um90YXRpb25UcmFuc2Zvcm1Mb2NrZWQoaW50MzJfdCogdHJhbnNmb3JtKSB7CiAgICAgQUxPR1YoIiVzOiBiZWdpbiIsIF9fRlVOQ1RJT05fXyk7CiAKLSAgICBpZiAodHJhbnNmb3JtID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIiVzOiBudWxsIHRyYW5zZm9ybSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgKnRyYW5zZm9ybSA9IDA7Ci0KICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTik7Ci0gICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24gaW4gIgotICAgICAgICAgICAgICAgICJzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaW50MzJfdCYgZmxhZ3MgPSAqdHJhbnNmb3JtOwotCi0gICAgaW50IG9yaWVudGF0aW9uID0gZW50cnkuZGF0YS5pMzJbMF07Ci0gICAgc3dpdGNoIChvcmllbnRhdGlvbikgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmbGFncyA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgwOgotICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMjcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSEFMIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIHZhbHVlOiAlZCIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1hZ2ljIGZsYWcgbWFrZXMgc3VyZmFjZWZsaW5nZXIgdW4tcm90YXRlIHRoZSBidWZmZXJzCi0gICAgICogdG8gY291bnRlciB0aGUgZXh0cmEgZ2xvYmFsIGRldmljZSBVSSByb3RhdGlvbiB3aGVuZXZlciB0aGUgdXNlcgotICAgICAqIHBoeXNpY2FsbHkgcm90YXRlcyB0aGUgZGV2aWNlLgotICAgICAqCi0gICAgICogQnkgZG9pbmcgdGhpcywgdGhlIGNhbWVyYSBidWZmZXIgYWx3YXlzIGVuZHMgdXAgYWxpZ25lZAotICAgICAqIHdpdGggdGhlIHBoeXNpY2FsIGNhbWVyYSBmb3IgYSAic2VlIHRocm91Z2giIGVmZmVjdC4KLSAgICAgKgotICAgICAqIEluIGVzc2VuY2UsIHRoZSBidWZmZXIgb25seSBnZXRzIHJvdGF0ZWQgZHVyaW5nIHByZXZpZXcgdXNlLWNhc2VzLgotICAgICAqIFRoZSB1c2VyIGlzIHN0aWxsIHJlc3BvbnNpYmxlIHRvIHJlLWNyZWF0ZSBzdHJlYW1zIG9mIHRoZSBwcm9wZXIKLSAgICAgKiBhc3BlY3QgcmF0aW8sIG9yIHRoZSBwcmV2aWV3IHdpbGwgZW5kIHVwIGxvb2tpbmcgbm9uLXVuaWZvcm1seQotICAgICAqIHN0cmV0Y2hlZC4KLSAgICAgKi8KLSAgICBmbGFncyB8PSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9JTlZFUlNFX0RJU1BMQVk7Ci0KLSAgICBBTE9HVigiJXM6IGZpbmFsIHRyYW5zZm9ybSA9IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGZsYWdzKTsKLQotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKHN0YXRpY0luZm8sIHRyYW5zZm9ybSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IGI5YzE2YWEuLjk5ODFkZmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtNjMsOSArNjMsMjIgQEAKICAgICAgKi8KIAogICAgIC8vIE5vdGUgdGhhdCB0aGUgY2FsbGVlIGdldHMgYSBjb3B5IG9mIHRoZSBtZXRhZGF0YS4KLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgc3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIC8vIExpc3Qgb2YgcmVxdWVzdHMgYXJlIGNvcGllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICBzdWJtaXRSZXF1ZXN0TGlzdChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBiZWdpbkNvbmZpZ3VyZSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmRDb25maWd1cmUoKTsKIAogICAgIC8vIFJldHVybnMgLUVCVVNZIGlmIGRldmljZSBpcyBub3QgaWRsZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKQEAgLTg5LDcgKzEwMiw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIHdhaXRVbnRpbElkbGUoKTsKIAogICAgIC8vIEZsdXNoIGFsbCBhY3RpdmUgYW5kIHBlbmRpbmcgcmVxdWVzdHMgYXMgZmFzdCBhcyBwb3NzaWJsZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBmbHVzaCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBmbHVzaCgvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQpAQCAtMTE0LDE2ICsxMjgsMTYgQEAKICAgICAgKi8KIAogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlJZGxlKCk7Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeUVycm9yKCk7Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lc3RhbXApOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgbnNlY3NfdCB0aW1lc3RhbXApOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgaW5kZXBlbmRlbnQgY29tcG9uZW50cyBvZiBDYW1lcmFEZXZpY2VDbGllbnQuCiAgICAgICovCiBwcm90ZWN0ZWQ6CiAgICAgLyoqIEZpbHRlcmVkTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKiovCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGZyYW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgZGV0YWNoRGV2aWNlKCk7CiAKICAgICAvLyBDYWxjdWxhdGUgdGhlIEFOYXRpdmVXaW5kb3cgdHJhbnNmb3JtIGZyb20gYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IDFhN2E3YTcuLjJlYTQ2MGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcApAQCAtMjgwLDcgKzI4MCw3IEBACiAgICAgICAgIHdpbmRvdyA9IG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyKTsKICAgICB9CiAKLSAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlU3RyZWFtKHdpbmRvdywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCAvKnNpemUqLzEsCisgICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZVN0cmVhbSh3aW5kb3csIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkKTsKIH0KIApAQCAtMzM2LDExICszMzYsMTEgQEAKICAgICAgICAgICAgIG1DYW1lcmFJZCwKICAgICAgICAgICAgIGdldFJlbW90ZUNhbGxiYWNrKCktPmFzQmluZGVyKCkuZ2V0KCksCiAgICAgICAgICAgICBtQ2xpZW50UGlkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOiAiKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOlxuIik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAKICAgICAvLyBUT0RPOiBwcmludCBkeW5hbWljL3JlcXVlc3Qgc2VjdGlvbiBmcm9tIG1vc3QgcmVjZW50IHJlcXVlc3RzCiAgICAgbUZyYW1lUHJvY2Vzc29yLT5kdW1wKGZkLCBhcmdzKTsKLQogICAgIHJldHVybiBkdW1wRGV2aWNlKGZkLCBhcmdzKTsKIH0KIApAQCAtMzczLDkgKzM3Myw3IEBACiAgICAgQ2FtZXJhMkNsaWVudEJhc2U6OmRldGFjaERldmljZSgpOwogfQogCi0vKiogRGV2aWNlLXJlbGF0ZWQgbWV0aG9kcyAqLwotdm9pZCBQcm9DYW1lcmEyQ2xpZW50OjpvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBmcmFtZSkgewordm9pZCBQcm9DYW1lcmEyQ2xpZW50OjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTM4MywxMyArMzgxLDEyIEBACiAgICAgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzOjpMb2NrIGwobVNoYXJlZENhbWVyYUNhbGxiYWNrcyk7CiAKICAgICBpZiAobVJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgdG1wKGZyYW1lKTsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgdG1wKHJlc3VsdC5tTWV0YWRhdGEpOwogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbWV0YSA9IHRtcC5yZWxlYXNlKCk7CiAgICAgICAgIEFMT0dWKCIlczogbWV0YSA9ICVwICIsIF9fRlVOQ1RJT05fXywgbWV0YSk7Ci0gICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25SZXN1bHRSZWNlaXZlZChyZXF1ZXN0SWQsIG1ldGEpOworICAgICAgICBtUmVtb3RlQ2FsbGJhY2stPm9uUmVzdWx0UmVjZWl2ZWQocmVzdWx0Lm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBtZXRhKTsKICAgICAgICAgdG1wLmFjcXVpcmUobWV0YSk7CiAgICAgfQotCiB9CiAKIGJvb2wgUHJvQ2FtZXJhMkNsaWVudDo6ZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmgKaW5kZXggOGEwZjU0Ny4uOWQ4MzEyMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgiCisjaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC05Nyw4ICs5OCw4IEBACiAKIHByb3RlY3RlZDoKICAgICAvKiogRmlsdGVyZWRMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZnJhbWUpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpOworCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRldGFjaERldmljZSgpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggMmQxMjUzZi4uZDZkYjE1MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCkBAIC01MiwxMCArNTQsMTMgQEAKICAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBUQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAotICAgICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKHJlbW90ZUNhbGxiYWNrKQorICAgICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKHJlbW90ZUNhbGxiYWNrKSwKKyAgICAgICAgbURldmljZVZlcnNpb24oY2FtZXJhU2VydmljZS0+Z2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCkpCiB7Ci0gICAgQUxPR0koIkNhbWVyYSAlZDogT3BlbmVkIiwgY2FtZXJhSWQpOworICAgIEFMT0dJKCJDYW1lcmEgJWQ6IE9wZW5lZC4gQ2xpZW50OiAlcyAoUElEICVkLCBVSUQgJWQpIiwgY2FtZXJhSWQsCisgICAgICAgICAgICBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgY2xpZW50UGlkLCBjbGllbnRVaWQpOwogCisgICAgbUluaXRpYWxDbGllbnRQaWQgPSBjbGllbnRQaWQ7CiAgICAgbURldmljZSA9IENhbWVyYURldmljZUZhY3Rvcnk6OmNyZWF0ZURldmljZShjYW1lcmFJZCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlID09IDAsICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIE5VTEwgaGVyZS4iKTsKIH0KQEAgLTEwOSwxMSArMTE0LDEyIEBACiAKICAgICBUQ2xpZW50QmFzZTo6bURlc3RydWN0aW9uU3RhcnRlZCA9IHRydWU7CiAKLSAgICBUQ2xpZW50QmFzZTo6ZmluaXNoQ2FtZXJhT3BzKCk7Ci0KICAgICBkaXNjb25uZWN0KCk7CiAKLSAgICBBTE9HSSgiQ2xvc2VkIENhbWVyYSAlZCIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWQpOworICAgIEFMT0dJKCJDbG9zZWQgQ2FtZXJhICVkLiBDbGllbnQgd2FzOiAlcyAoUElEICVkLCBVSUQgJXUpIiwKKyAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWQsCisgICAgICAgICAgICBTdHJpbmc4KFRDbGllbnRCYXNlOjptQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLAorICAgICAgICAgICAgbUluaXRpYWxDbGllbnRQaWQsIFRDbGllbnRCYXNlOjptQ2xpZW50VWlkKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMjE5LDEwICsyMjUsMTEgQEAKIC8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlFcnJvcihpbnQgZXJyb3JDb2RlLCBpbnQgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnMikgewotICAgIEFMT0dFKCJFcnJvciBjb25kaXRpb24gJWQgcmVwb3J0ZWQgYnkgSEFMLCBhcmd1bWVudHMgJWQsICVkIiwgZXJyb3JDb2RlLAotICAgICAgICAgIGFyZzEsIGFyZzIpOwordm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUVycm9yKAorICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBTE9HRSgiRXJyb3IgY29uZGl0aW9uICVkIHJlcG9ydGVkIGJ5IEhBTCwgcmVxdWVzdElkICUiIFBSSWQzMiwgZXJyb3JDb2RlLAorICAgICAgICAgIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC0yMzEsMTMgKzIzOCwxMyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci12b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLAordm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKLSAgICAodm9pZClyZXF1ZXN0SWQ7CisgICAgKHZvaWQpcmVzdWx0RXh0cmFzOwogICAgICh2b2lkKXRpbWVzdGFtcDsKIAotICAgIEFMT0dWKCIlczogU2h1dHRlciBub3RpZmljYXRpb24gZm9yIHJlcXVlc3QgaWQgJWQgYXQgdGltZSAlbGxkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkLCB0aW1lc3RhbXApOworICAgIEFMT0dWKCIlczogU2h1dHRlciBub3RpZmljYXRpb24gZm9yIHJlcXVlc3QgaWQgJSIgUFJJZDMyICIgYXQgdGltZSAlIiBQUklkNjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KQEAgLTI3Nyw2ICsyODQsMTEgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgoraW50IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURldmljZVZlcnNpb247Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JiBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmdldENhbWVyYURldmljZSgpIHsKICAgICByZXR1cm4gbURldmljZTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggNjFlNDRmMC4uZDE5OGU0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEyQ0xJRU5UX0JBU0VfSAogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTYxLDkgKzYyLDExIEBACiAgICAgICogQ2FtZXJhRGV2aWNlQmFzZTo6Tm90aWZpY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KICAgICAgKi8KIAotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihpbnQgZXJyb3JDb2RlLCBpbnQgYXJnMSwgaW50IGFyZzIpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlJZGxlKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lc3RhbXApOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9Gb2N1cyh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvV2hpdGViYWxhbmNlKHVpbnQ4X3QgbmV3U3RhdGUsCkBAIC03Myw2ICs3Niw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUlkKCkgY29uc3Q7CiAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYURldmljZSgpOworICAgIGludCAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgY29uc3Q7CiAgICAgY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYVNlcnZpY2UoKTsKIApAQCAtMTAzLDYgKzEwNyw5IEBACiAKIHByb3RlY3RlZDoKIAorICAgIC8vIFRoZSBQSUQgcHJvdmlkZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGNhbGwKKyAgICBwaWRfdCBtSW5pdGlhbENsaWVudFBpZDsKKwogICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gYXNCaW5kZXJXcmFwcGVyKCkgewogICAgICAgICByZXR1cm4gSUludGVyZmFjZTo6YXNCaW5kZXIoKTsKICAgICB9CkBAIC0xMTksNiArMTI2LDcgQEAKIAogICAgIC8qKiBDYW1lcmFEZXZpY2VCYXNlIGluc3RhbmNlIHdyYXBwaW5nIEhBTDIrIGVudHJ5ICovCiAKKyAgICBjb25zdCBpbnQgbURldmljZVZlcnNpb247CiAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCBlODBhYmYxLi5kMjZlMjBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTIyLDkgKzIyLDEzIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMi5oIgorI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ0LDcgKzQ4LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgPSAwOwogCiAgICAgLyoqCiAgICAgICogVGhlIGRldmljZSdzIHN0YXRpYyBjaGFyYWN0ZXJpc3RpY3MgbWV0YWRhdGEgYnVmZmVyCkBAIC01NCwxOSArNTgsMzcgQEAKICAgICAvKioKICAgICAgKiBTdWJtaXQgcmVxdWVzdCBmb3IgY2FwdHVyZS4gVGhlIENhbWVyYURldmljZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlCiAgICAgICogcGFzc2VkLWluIGJ1ZmZlci4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBleHBlY3RlZCBmcmFtZSBudW1iZXIgb2YgdGhpcyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogU3VibWl0IGEgbGlzdCBvZiByZXF1ZXN0cy4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBleHBlY3RlZCBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgbGlzdCBvZiByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIC8qKgogICAgICAqIFN1Ym1pdCByZXF1ZXN0IGZvciBzdHJlYW1pbmcuIFRoZSBDYW1lcmFEZXZpY2UgbWFrZXMgYSBjb3B5IG9mIHRoZQogICAgICAqIHBhc3NlZC1pbiBidWZmZXIgYW5kIHRoZSBjYWxsZXIgcmV0YWlucyBvd25lcnNoaXAuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogU3VibWl0IGEgbGlzdCBvZiByZXF1ZXN0cyBmb3Igc3RyZWFtaW5nLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBzdHJlYW1pbmcgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIC8qKgogICAgICAqIENsZWFyIHRoZSBzdHJlYW1pbmcgcmVxdWVzdCBzbG90LgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBzdHJlYW1pbmcgcmVxdWVzdC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBXYWl0IHVudGlsIGEgcmVxdWVzdCB3aXRoIHRoZSBnaXZlbiBJRCBoYXMgYmVlbiBkZXF1ZXVlZCBieSB0aGUKQEAgLTg3LDggKzEwOSw3IEBACiAgICAgICogb3RoZXIgZm9ybWF0cywgdGhlIHNpemUgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCAqaWQpID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnB1dCByZXByb2Nlc3Mgc3RyZWFtIHRoYXQgdXNlcyBidWZmZXJzIGZyb20gYW4gZXhpc3RpbmcKQEAgLTEyMCw2ICsxNDEsMTggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVJlcHJvY2Vzc1N0cmVhbShpbnQgaWQpID0gMDsKIAogICAgIC8qKgorICAgICAqIFRha2UgdGhlIGN1cnJlbnRseS1kZWZpbmVkIHNldCBvZiBzdHJlYW1zIGFuZCBjb25maWd1cmUgdGhlIEhBTCB0byB1c2UKKyAgICAgKiB0aGVtLiBUaGlzIGlzIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiAobWF5IGJlIHNldmVyYWwgaHVuZGVyZWQgbXMpLgorICAgICAqCisgICAgICogVGhlIGRldmljZSBtdXN0IGJlIGlkbGUgKHNlZSB3YWl0VW50aWxEcmFpbmVkKSBiZWZvcmUgY2FsbGluZyB0aGlzLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzOyBvdGhlcndpc2Ugb24gZXJyb3I6CisgICAgICogLSBCQURfVkFMVUUgaWYgdGhlIHNldCBvZiBzdHJlYW1zIHdhcyBpbnZhbGlkIChlLmcuIGZtdHMgb3Igc2l6ZXMpCisgICAgICogLSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgZGV2aWNlIHdhcyBpbiB0aGUgd3Jvbmcgc3RhdGUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBtZXRhZGF0YSBidWZmZXIgd2l0aCBmaWVsZHMgdGhhdCB0aGUgSEFMIGRldmljZSBiZWxpZXZlcyBhcmUKICAgICAgKiBiZXN0IGZvciB0aGUgZ2l2ZW4gdXNlIGNhc2UKICAgICAgKi8KQEAgLTEzNCw2ICsxNjcsMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbERyYWluZWQoKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBHZXQgSnBlZyBidWZmZXIgc2l6ZSBmb3IgYSBnaXZlbiBqcGVnIHJlc29sdXRpb24uCisgICAgICogTmVnYXRpdmUgdmFsdWVzIGFyZSBlcnJvciBjb2Rlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0SnBlZ0J1ZmZlclNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgPSAwOworCisgICAgLyoqCiAgICAgICogQWJzdHJhY3QgY2xhc3MgZm9yIEhBTCBub3RpZmljYXRpb24gbGlzdGVuZXJzCiAgICAgICovCiAgICAgY2xhc3MgTm90aWZpY2F0aW9uTGlzdGVuZXIgewpAQCAtMTQyLDExICsxODEsMTIgQEAKICAgICAgICAgLy8gQVBJMSBhbmQgQVBJMi4KIAogICAgICAgICAvLyBSZXF1aXJlZCBmb3IgQVBJIDEgYW5kIDIKLSAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIGludCBhcmcxLCBpbnQgYXJnMikgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcykgPSAwOwogCiAgICAgICAgIC8vIFJlcXVpcmVkIG9ubHkgZm9yIEFQSTIKICAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsCisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgPSAwOwogCiAgICAgICAgIC8vIFJlcXVpcmVkIG9ubHkgZm9yIEFQSTEKQEAgLTE3OSwxMSArMjE5LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0Rm9yTmV4dEZyYW1lKG5zZWNzX3QgdGltZW91dCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogR2V0IG5leHQgbWV0YWRhdGEgZnJhbWUgZnJvbSB0aGUgZnJhbWUgcXVldWUuIFJldHVybnMgTlVMTCBpZiB0aGUgcXVldWUKLSAgICAgKiBpcyBlbXB0eTsgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVyLgotICAgICAqIE1heSBiZSBjYWxsZWQgY29uY3VycmVudGx5IHRvIG1vc3QgbWV0aG9kcywgZXhjZXB0IGZvciB3YWl0Rm9yTmV4dEZyYW1lCisgICAgICogR2V0IG5leHQgY2FwdHVyZSByZXN1bHQgZnJhbWUgZnJvbSB0aGUgcmVzdWx0IHF1ZXVlLiBSZXR1cm5zIE5PVF9FTk9VR0hfREFUQQorICAgICAqIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eTsgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVyIGluc2lkZQorICAgICAqIHRoZSBjYXB0dXJlIHJlc3VsdCBvYmplY3QncyBtZXRhZGF0YSBmaWVsZC4KKyAgICAgKiBNYXkgYmUgY2FsbGVkIGNvbmN1cnJlbnRseSB0byBtb3N0IG1ldGhvZHMsIGV4Y2VwdCBmb3Igd2FpdEZvck5leHRGcmFtZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpID0gMDsKIAogICAgIC8qKgogICAgICAqIFRyaWdnZXIgYXV0by1mb2N1cy4gVGhlIGxhdGVzdCBJRCB1c2VkIGluIGEgdHJpZ2dlciBhdXRvZm9jdXMgb3IgY2FuY2VsCkBAIC0yMjQsOSArMjY1LDE0IEBACiAgICAgLyoqCiAgICAgICogRmx1c2ggYWxsIHBlbmRpbmcgYW5kIGluLWZsaWdodCByZXF1ZXN0cy4gQmxvY2tzIHVudGlsIGZsdXNoIGlzCiAgICAgICogY29tcGxldGUuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEhBTCBkZXZpY2UgdmVyc2lvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZVZlcnNpb24oKSA9IDA7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcAppbmRleCBmMjA2NGZiLi4yOWViNzhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcApAQCAtMjksNyArMjksMTcgQEAKIAogRnJhbWVQcm9jZXNzb3JCYXNlOjpGcmFtZVByb2Nlc3NvckJhc2Uod3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlKSA6CiAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKLSAgICBtRGV2aWNlKGRldmljZSkgeworICAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICBtTnVtUGFydGlhbFJlc3VsdHMoMSkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGNhbWVyYURldmljZSA9IGRldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGNhbWVyYURldmljZSAhPSAwICYmCisgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPmdldERldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gY2FtZXJhRGV2aWNlLT5pbmZvKCk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9QQVJUSUFMX1JFU1VMVF9DT1VOVCk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cyA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICB9CisgICAgfQogfQogCiBGcmFtZVByb2Nlc3NvckJhc2U6On5GcmFtZVByb2Nlc3NvckJhc2UoKSB7CkBAIC0zNywxMSArNDcsMjMgQEAKIH0KIAogc3RhdHVzX3QgRnJhbWVQcm9jZXNzb3JCYXNlOjpyZWdpc3Rlckxpc3RlbmVyKGludDMyX3QgbWluSWQsCi0gICAgICAgIGludDMyX3QgbWF4SWQsIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLCBib29sIHF1aXJrU2VuZFBhcnRpYWxzKSB7CisgICAgICAgIGludDMyX3QgbWF4SWQsIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLCBib29sIHNlbmRQYXJ0aWFscykgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKKyAgICBMaXN0PFJhbmdlTGlzdGVuZXI+OjppdGVyYXRvciBpdGVtID0gbVJhbmdlTGlzdGVuZXJzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ZW0gIT0gbVJhbmdlTGlzdGVuZXJzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVtLT5taW5JZCA9PSBtaW5JZCAmJgorICAgICAgICAgICAgICAgIGl0ZW0tPm1heElkID09IG1heElkICYmCisgICAgICAgICAgICAgICAgaXRlbS0+bGlzdGVuZXIgPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIC8vIGFscmVhZHkgcmVnaXN0ZXJlZCwganVzdCByZXR1cm4KKyAgICAgICAgICAgIEFMT0dWKCIlczogQXR0ZW1wdCB0byByZWdpc3RlciB0aGUgc2FtZSBjbGllbnQgdHdpY2UsIGlnbm9yaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBpdGVtKys7CisgICAgfQogICAgIEFMT0dWKCIlczogUmVnaXN0ZXJpbmcgbGlzdGVuZXIgZm9yIGZyYW1lIGlkIHJhbmdlICVkIC0gJWQiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtaW5JZCwgbWF4SWQpOwotICAgIFJhbmdlTGlzdGVuZXIgckxpc3RlbmVyID0geyBtaW5JZCwgbWF4SWQsIGxpc3RlbmVyLCBxdWlya1NlbmRQYXJ0aWFscyB9OworICAgIFJhbmdlTGlzdGVuZXIgckxpc3RlbmVyID0geyBtaW5JZCwgbWF4SWQsIGxpc3RlbmVyLCBzZW5kUGFydGlhbHMgfTsKICAgICBtUmFuZ2VMaXN0ZW5lcnMucHVzaF9iYWNrKHJMaXN0ZW5lcik7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTksMTUgKzEyMSwxNyBAQAogdm9pZCBGcmFtZVByb2Nlc3NvckJhc2U6OnByb2Nlc3NOZXdGcmFtZXMoY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSkgewogICAgIHN0YXR1c190IHJlczsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIENhbWVyYU1ldGFkYXRhIGZyYW1lOworICAgIENhcHR1cmVSZXN1bHQgcmVzdWx0OwogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFByb2Nlc3MgbmV3IGZyYW1lcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKIAotICAgIHdoaWxlICggKHJlcyA9IGRldmljZS0+Z2V0TmV4dEZyYW1lKCZmcmFtZSkpID09IE9LKSB7CisgICAgd2hpbGUgKCAocmVzID0gZGV2aWNlLT5nZXROZXh0UmVzdWx0KCZyZXN1bHQpKSA9PSBPSykgewogCisgICAgICAgIC8vIFRPRE86IGluc3RlYWQgb2YgZ2V0dGluZyBmcmFtZSBudW1iZXIgZnJvbSBtZXRhZGF0YSwgd2Ugc2hvdWxkIHJlYWQKKyAgICAgICAgLy8gdGhpcyBmcm9tIHJlc3VsdC5tUmVzdWx0RXh0cmFzIHdoZW4gQ2FtZXJhRGV2aWNlQmFzZSBpbnRlcmZhY2UgaXMgZml4ZWQuCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwogCi0gICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOworICAgICAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHJlYWRpbmcgZnJhbWUgbnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwpAQCAtMTE1LDEzICsxMzksMTMgQEAKICAgICAgICAgfQogICAgICAgICBBVFJBQ0VfSU5UKCJjYW0yX2ZyYW1lIiwgZW50cnkuZGF0YS5pMzJbMF0pOwogCi0gICAgICAgIGlmICghcHJvY2Vzc1NpbmdsZUZyYW1lKGZyYW1lLCBkZXZpY2UpKSB7CisgICAgICAgIGlmICghcHJvY2Vzc1NpbmdsZUZyYW1lKHJlc3VsdCwgZGV2aWNlKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWZyYW1lLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIXJlc3VsdC5tTWV0YWRhdGEuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhc3RGcmFtZU11dGV4KTsKLSAgICAgICAgICAgIG1MYXN0RnJhbWUuYWNxdWlyZShmcmFtZSk7CisgICAgICAgICAgICBtTGFzdEZyYW1lLmFjcXVpcmUocmVzdWx0Lm1NZXRhZGF0YSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlcyAhPSBOT1RfRU5PVUdIX0RBVEEpIHsKQEAgLTEzMywzMiArMTU3LDQwIEBACiAgICAgcmV0dXJuOwogfQogCi1ib29sIEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhbWVyYU1ldGFkYXRhICZmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7Citib29sIEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhcHR1cmVSZXN1bHQgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSkgewogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBQcm9jZXNzIHNpbmdsZSBmcmFtZSAoaXMgZW1wdHk/ICVkKSIsCi0gICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCksIGZyYW1lLmlzRW1wdHkoKSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NMaXN0ZW5lcnMoZnJhbWUsIGRldmljZSkgPT0gT0s7CisgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCksIHJlc3VsdC5tTWV0YWRhdGEuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gcHJvY2Vzc0xpc3RlbmVycyhyZXN1bHQsIGRldmljZSkgPT0gT0s7CiB9CiAKLXN0YXR1c190IEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc0xpc3RlbmVycyhjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCitzdGF0dXNfdCBGcmFtZVByb2Nlc3NvckJhc2U6OnByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAogICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwogCi0gICAgLy8gUXVpcmtzOiBEb24ndCBkZWxpdmVyIHBhcnRpYWwgcmVzdWx0cyB0byBsaXN0ZW5lcnMgdGhhdCBkb24ndCB3YW50IHRoZW0KLSAgICBib29sIHF1aXJrSXNQYXJ0aWFsID0gZmFsc2U7Ci0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKLSAgICBpZiAoZW50cnkuY291bnQgIT0gMCAmJgotICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA9PSBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOb3QgZm9yd2FyZGluZyBwYXJ0aWFsIHJlc3VsdCB0byBsaXN0ZW5lcnMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKLSAgICAgICAgcXVpcmtJc1BhcnRpYWwgPSB0cnVlOworICAgIC8vIENoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHBhcnRpYWwuCisgICAgYm9vbCBpc1BhcnRpYWxSZXN1bHQgPSBmYWxzZTsKKyAgICBpZiAoZGV2aWNlLT5nZXREZXZpY2VWZXJzaW9uKCkgPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50IDwgbU51bVBhcnRpYWxSZXN1bHRzOworICAgIH0gZWxzZSB7CisgICAgICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ICE9IDAgJiYKKyAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBUaGlzIGlzIGEgcGFydGlhbCByZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCi0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUkVRVUVTVF9JRCk7CisgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBnZXR0aW5nIHJlcXVlc3RJRCBmcm9tIENhbWVyYU1ldGFkYXRhLCB3ZSBzaG91bGQgZ2V0IGl0CisgICAgLy8gZnJvbSBDYXB0dXJlUmVzdWx0RXh0cmFzLiBUaGlzIHdpbGwgcmVxdWlyZSBjaGFuZ2luZyBDYW1lcmEyRGV2aWNlLgorICAgIC8vIEN1cnJlbnRseSBDYW1lcmEyRGV2aWNlIHVzZXMgTWV0YWRhdGFRdWV1ZSB0byBzdG9yZSByZXN1bHRzLCB3aGljaCBkb2VzIG5vdAorICAgIC8vIGluY2x1ZGUgQ2FwdHVyZVJlc3VsdEV4dHJhcy4KKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfSUQpOwogICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciByZWFkaW5nIGZyYW1lIGlkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciByZWFkaW5nIGZyYW1lIGlkIiwgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGVudHJ5LmRhdGEuaTMyWzBdOwpAQCAtMTY4LDEwICsyMDAsMTAgQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogCiAgICAgICAgIExpc3Q8UmFuZ2VMaXN0ZW5lcj46Oml0ZXJhdG9yIGl0ZW0gPSBtUmFuZ2VMaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICAgICAgLy8gRG9uJ3QgZGVsaXZlciBwYXJ0aWFsIHJlc3VsdHMgdG8gbGlzdGVuZXJzIHRoYXQgZG9uJ3Qgd2FudCB0aGVtCiAgICAgICAgIHdoaWxlIChpdGVtICE9IG1SYW5nZUxpc3RlbmVycy5lbmQoKSkgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA+PSBpdGVtLT5taW5JZCAmJgotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPCBpdGVtLT5tYXhJZCAmJgotICAgICAgICAgICAgICAgICAgICAoIXF1aXJrSXNQYXJ0aWFsIHx8IGl0ZW0tPnF1aXJrU2VuZFBhcnRpYWxzKSApIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgPj0gaXRlbS0+bWluSWQgJiYgcmVxdWVzdElkIDwgaXRlbS0+bWF4SWQgJiYKKyAgICAgICAgICAgICAgICAgICAgKCFpc1BhcnRpYWxSZXN1bHQgfHwgaXRlbS0+c2VuZFBhcnRpYWxzKSkgewogICAgICAgICAgICAgICAgIHNwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyID0gaXRlbS0+bGlzdGVuZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBtUmFuZ2VMaXN0ZW5lcnMuZXJhc2UoaXRlbSk7CkBAIC0xODMsMTAgKzIxNSwxMiBAQAogICAgICAgICAgICAgaXRlbSsrOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dWKCJHb3QgJWQgcmFuZ2UgbGlzdGVuZXJzIG91dCBvZiAlZCIsIGxpc3RlbmVycy5zaXplKCksIG1SYW5nZUxpc3RlbmVycy5zaXplKCkpOworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBHb3QgJXp1IHJhbmdlIGxpc3RlbmVycyBvdXQgb2YgJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIGRldmljZS0+Z2V0SWQoKSwgbGlzdGVuZXJzLnNpemUoKSwgbVJhbmdlTGlzdGVuZXJzLnNpemUoKSk7CisKICAgICBMaXN0PHNwPEZpbHRlcmVkTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0ZW0gPSBsaXN0ZW5lcnMuYmVnaW4oKTsKICAgICBmb3IgKDsgaXRlbSAhPSBsaXN0ZW5lcnMuZW5kKCk7IGl0ZW0rKykgewotICAgICAgICAoKml0ZW0pLT5vbkZyYW1lQXZhaWxhYmxlKHJlcXVlc3RJZCwgZnJhbWUpOworICAgICAgICAoKml0ZW0pLT5vblJlc3VsdEF2YWlsYWJsZShyZXN1bHQpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKaW5kZXggODliNjA4YS4uYTYxOGQ4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzksMTYgKzQwLDE2IEBACiAgICAgdmlydHVhbCB+RnJhbWVQcm9jZXNzb3JCYXNlKCk7CiAKICAgICBzdHJ1Y3QgRmlsdGVyZWRMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgPSAwOwogICAgIH07CiAKICAgICAvLyBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciBhIHJhbmdlIG9mIElEcyBbbWluSWQsIG1heElkKS4gTXVsdGlwbGUgbGlzdGVuZXJzCi0gICAgLy8gY2FuIGJlIGxpc3RlbmluZyB0byB0aGUgc2FtZSByYW5nZS4KLSAgICAvLyBRVUlSSzogc2VuZFBhcnRpYWxzIGNvbnRyb2xzIHdoZXRoZXIgcGFydGlhbCByZXN1bHRzIHdpbGwgYmUgc2VudC4KKyAgICAvLyBjYW4gYmUgbGlzdGVuaW5nIHRvIHRoZSBzYW1lIHJhbmdlLiBSZWdpc3RlcmluZyB0aGUgc2FtZSBsaXN0ZW5lciB3aXRoCisgICAgLy8gdGhlIHNhbWUgcmFuZ2Ugb2YgSURzIGhhcyBubyBlZmZlY3QuCisgICAgLy8gc2VuZFBhcnRpYWxzIGNvbnRyb2xzIHdoZXRoZXIgcGFydGlhbCByZXN1bHRzIHdpbGwgYmUgc2VudC4KICAgICBzdGF0dXNfdCByZWdpc3Rlckxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcXVpcmtTZW5kUGFydGlhbHMgPSB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VuZFBhcnRpYWxzID0gdHJ1ZSk7CiAgICAgc3RhdHVzX3QgcmVtb3ZlTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwgaW50MzJfdCBtYXhJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lcik7CiAKQEAgLTY2LDE2ICs2NywxOSBAQAogICAgICAgICBpbnQzMl90IG1pbklkOwogICAgICAgICBpbnQzMl90IG1heElkOwogICAgICAgICB3cDxGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICAgICAgYm9vbCBxdWlya1NlbmRQYXJ0aWFsczsKKyAgICAgICAgYm9vbCBzZW5kUGFydGlhbHM7CiAgICAgfTsKICAgICBMaXN0PFJhbmdlTGlzdGVuZXI+IG1SYW5nZUxpc3RlbmVyczsKIAorICAgIC8vIE51bWJlciBvZiBwYXJ0aWFsIHJlc3VsdCB0aGUgSEFMIHdpbGwgcG90ZW50aWFsbHkgc2VuZC4KKyAgICBpbnQzMl90IG1OdW1QYXJ0aWFsUmVzdWx0czsKKwogICAgIHZvaWQgcHJvY2Vzc05ld0ZyYW1lcyhjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKTsKIAotICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzU2luZ2xlRnJhbWUoQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKLSAgICBzdGF0dXNfdCBwcm9jZXNzTGlzdGVuZXJzKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKKyAgICBzdGF0dXNfdCBwcm9jZXNzTGlzdGVuZXJzKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCiAgICAgQ2FtZXJhTWV0YWRhdGEgbUxhc3RGcmFtZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCA4N2IyODA3Li42Mzg2ODM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC05Miw4ICs5MiwyMiBAQAogICAgIHN0YXR1c190IGluaXRpYWxpemUoaHdfbW9kdWxlX3QgKm1vZHVsZSkKICAgICB7CiAgICAgICAgIEFMT0dJKCJPcGVuaW5nIGNhbWVyYSAlcyIsIG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgaW50IHJjID0gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgbU5hbWUuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpOworICAgICAgICBjYW1lcmFfbW9kdWxlX3QgKmNhbWVyYU1vZHVsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21vZHVsZV90ICo+KG1vZHVsZSk7CisgICAgICAgIGNhbWVyYV9pbmZvIGluZm87CisgICAgICAgIHN0YXR1c190IHJlcyA9IGNhbWVyYU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGF0b2kobU5hbWUuc3RyaW5nKCkpLCAmaW5mbyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisKKyAgICAgICAgaW50IHJjID0gT0s7CisgICAgICAgIGlmIChtb2R1bGUtPm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMyAmJgorICAgICAgICAgICAgaW5mby5kZXZpY2VfdmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CisgICAgICAgICAgICAvLyBPcGVuIGhpZ2hlciB2ZXJzaW9uIGNhbWVyYSBkZXZpY2UgYXMgSEFMMS4wIGRldmljZS4KKyAgICAgICAgICAgIHJjID0gY2FtZXJhTW9kdWxlLT5vcGVuX2xlZ2FjeShtb2R1bGUsIG1OYW1lLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPm1ldGhvZHMtPm9wZW4oCisgICAgICAgICAgICAgICAgbW9kdWxlLCBtTmFtZS5zdHJpbmcoKSwgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHJjICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IG9wZW4gY2FtZXJhICVzOiAlZCIsIG1OYW1lLnN0cmluZygpLCByYyk7CiAgICAgICAgICAgICByZXR1cm4gcmM7CkBAIC02MTEsOSArNjI1LDE0IEBACiAgICAgc3RhdGljIGludCBfX3NldF9idWZmZXJzX2dlb21ldHJ5KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0KQogICAgIHsKKyAgICAgICAgaW50IHJjOwogICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgICAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOworCisgICAgICAgIHJjID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKGEsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAoIXJjKSB7CisgICAgICAgICAgICByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KGEsIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAogICAgIHN0YXRpYyBpbnQgX19zZXRfY3JvcChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKaW5kZXggMmJjMWE4YS4uOGNhYWRkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCkBAIC0yNSwxMCArMjUsMTIgQEAKICNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCiAjZW5kaWYKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlICJDYW1lcmEyRGV2aWNlLmgiCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY2LDggKzY4LDggQEAKIAogICAgIGNhbWVyYTJfZGV2aWNlX3QgKmRldmljZTsKIAotICAgIHJlcyA9IG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oJm1vZHVsZS0+Y29tbW9uLCBuYW1lLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSk7CisgICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKAorICAgICAgICAmbW9kdWxlLT5jb21tb24sIG5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgb3BlbiBjYW1lcmEgJWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCkBAIC0xMTEsMjAgKzExMyw2IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgcmVzID0gZGV2aWNlLT5vcHMtPmdldF9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyhkZXZpY2UsICZtVmVuZG9yVGFnT3BzKTsKLSAgICBpZiAocmVzICE9IE9LICkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHJldHJpZXZlIHRhZyBvcHMgZnJvbSBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmVzID0gc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyhtVmVuZG9yVGFnT3BzKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gc2V0IHRhZyBvcHM6ICVzICglZCkiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSgmZGV2aWNlLT5jb21tb24pOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KICAgICByZXMgPSBkZXZpY2UtPm9wcy0+c2V0X25vdGlmeV9jYWxsYmFjayhkZXZpY2UsIG5vdGlmaWNhdGlvbkNhbGxiYWNrLAogICAgICAgICAgICAgTlVMTCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMTM2LDYgKzEyNCw3IEBACiAKICAgICBtRGV2aWNlSW5mbyA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CiAgICAgbUhhbDJEZXZpY2UgPSBkZXZpY2U7CisgICAgbURldmljZVZlcnNpb24gPSBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjEyLDcgKzIwMSw3IEBACiAgICAgcmV0dXJuIG1EZXZpY2VJbmZvOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0yMjAsMTUgKzIwOSwyOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBDYW1lcmEyRGV2aWNlIGJ1cnN0IGNhcHR1cmUgbm90IGltcGxlbWVudGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgQ2FtZXJhTWV0YWRhdGEgc3RyZWFtUmVxdWVzdChyZXF1ZXN0KTsKICAgICByZXR1cm4gbVJlcXVlc3RRdWV1ZS5zZXRTdHJlYW1TbG90KHN0cmVhbVJlcXVlc3QucmVsZWFzZSgpKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzLCBDYW1lcmEyRGV2aWNlIHN0cmVhbWluZyBidXJzdCBub3QgaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHJldHVybiBtUmVxdWVzdFF1ZXVlLnNldFN0cmVhbVNsb3QoTlVMTCk7CiB9CkBAIC0yMzksMTMgKzI0MiwxNiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLCBpbnQgKmlkKSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgc3A8U3RyZWFtQWRhcHRlcj4gc3RyZWFtID0gbmV3IFN0cmVhbUFkYXB0ZXIobUhhbDJEZXZpY2UpOwotCisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgIHNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CiAgICAgcmVzID0gc3RyZWFtLT5jb25uZWN0VG9EZXZpY2UoY29uc3VtZXIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgc2l6ZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBzdHJlYW0gKCVkIHggJWQsIGZvcm1hdCAleCk6IgpAQCAtMjYwLDYgKzI2NiwxNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBDYW1lcmEyRGV2aWNlOjpnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgLy8gQWx3YXlzIGdpdmUgdGhlIG1heCBqcGVnIGJ1ZmZlciBzaXplIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCBqcGVnIHJlc29sdXRpb24uCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGpwZWdCdWZNYXhTaXplID0gbURldmljZUluZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOworICAgIGlmIChqcGVnQnVmTWF4U2l6ZS5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIG1heGltdW0gSlBFRyBzaXplIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIGpwZWdCdWZNYXhTaXplLmRhdGEuaTMyWzBdOworfQorCiBzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVSZXByb2Nlc3NTdHJlYW1Gcm9tU3RyZWFtKGludCBvdXRwdXRJZCwgaW50ICppZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMzk4LDYgKzQxNSwxOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y29uZmlndXJlU3RyZWFtcygpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAvKioKKyAgICAgKiBIQUwyIGRldmljZXMgZG8gbm90IG5lZWQgdG8gY29uZmlndXJlIHN0cmVhbXM7CisgICAgICogc3RyZWFtcyBhcmUgY3JlYXRlZCBvbiB0aGUgZmx5LgorICAgICAqLworICAgIEFMT0dXKCIlczogTm8tb3AgZm9yIEhBTDIgZGV2aWNlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIAogc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CkBAIC00NjEsNyArNDkxLDEzIEBACiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkgewogICAgICAgICAgICAgY2FzZSBDQU1FUkEyX01TR19FUlJPUjoKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoZXh0MSwgZXh0MiwgZXh0Myk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBiZSBmaXhlZC4gZXh0MiBhbmQgZXh0MyBuZWVkIHRvIGJlIGNvbnNpZGVyZWQuCisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgKChleHQxID09IENBTUVSQTJfTVNHX0VSUk9SX0RFVklDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChleHQxID09IENBTUVSQTJfTVNHX0VSUk9SX0hBUkRXQVJFKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDQU1FUkEyX01TR19TSFVUVEVSOiB7CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogT25seSBuZWVkZWQgZm9yIGNhbWVyYTIgQVBJLCB3aGljaCBpcyB1bnN1cHBvcnRlZApAQCAtNDkwLDE2ICs1MjYsMjIgQEAKICAgICByZXR1cm4gbUZyYW1lUXVldWUud2FpdEZvckJ1ZmZlcih0aW1lb3V0KTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Z2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Z2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogZ2V0IENhcHR1cmVSZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHJlc3VsdCBwb2ludGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBzdGF0dXNfdCByZXM7CiAgICAgY2FtZXJhX21ldGFkYXRhX3QgKnJhd0ZyYW1lOwogICAgIHJlcyA9IG1GcmFtZVF1ZXVlLmRlcXVldWUoJnJhd0ZyYW1lKTsKLSAgICBpZiAocmF3RnJhbWUgID09IE5VTEwpIHsKKyAgICBpZiAocmF3RnJhbWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0gZWxzZSBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIGZyYW1lLT5hY3F1aXJlKHJhd0ZyYW1lKTsKKyAgICAgICAgcmVzdWx0LT5tTWV0YWRhdGEuYWNxdWlyZShyYXdGcmFtZSk7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtNTY5LDEzICs2MTEsMTggQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpmbHVzaCgpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmZsdXNoKGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgbVJlcXVlc3RRdWV1ZS5jbGVhcigpOwogICAgIHJldHVybiB3YWl0VW50aWxEcmFpbmVkKCk7CiB9CiAKK3VpbnQzMl90IENhbWVyYTJEZXZpY2U6OmdldERldmljZVZlcnNpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gbURldmljZVZlcnNpb247Cit9CisKIC8qKgogICogQ2FtZXJhMkRldmljZTo6TWV0YWRhdGFRdWV1ZQogICovCkBAIC04MjIsNyArODY5LDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgU3RyZWFtIHNsb3Q6IEVtcHR5XG4iKTsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtIHNsb3Q6ICVkIGVudHJpZXNcbiIsCisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgIFN0cmVhbSBzbG90OiAlenUgZW50cmllc1xuIiwKICAgICAgICAgICAgICAgICBtU3RyZWFtU2xvdC5zaXplKCkpOwogICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgIGZvciAoTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciByID0gbVN0cmVhbVNsb3QuYmVnaW4oKTsKQEAgLTgzNyw3ICs4ODQsNyBAQAogICAgICAgICByZXN1bHQgPSAiICAgICAgTWFpbiBxdWV1ZSBpcyBlbXB0eVxuIjsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICAgICBNYWluIHF1ZXVlIGhhcyAlZCBlbnRyaWVzOlxuIiwKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICAgICBNYWluIHF1ZXVlIGhhcyAlenUgZW50cmllczpcbiIsCiAgICAgICAgICAgICAgICAgbUVudHJpZXMuc2l6ZSgpKTsKICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICBmb3IgKExpc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPjo6aXRlcmF0b3IgciA9IG1FbnRyaWVzLmJlZ2luKCk7CkBAIC0xMDAwLDcgKzEwNDcsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogTmV3IHN0cmVhbSBwYXJhbWV0ZXJzICVkIHggJWQsIGZvcm1hdCAweCV4LCBzaXplICVkIiwKKyAgICBBTE9HVigiJXM6IE5ldyBzdHJlYW0gcGFyYW1ldGVycyAlZCB4ICVkLCBmb3JtYXQgMHgleCwgc2l6ZSAlenUiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHNpemUpOwogCiAgICAgbUNvbnN1bWVySW50ZXJmYWNlID0gY29uc3VtZXI7CkBAIC0xMDY4LDI1ICsxMTE1LDMzIEBACiAgICAgfQogCiAgICAgaWYgKG1Gb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7Ci0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgICAgIG1TaXplLCAxLCBtRm9ybWF0KTsKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICBtU2l6ZSwgMSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBjb21wcmVzc2VkIHN0cmVhbSBidWZmZXIgZ2VvbWV0cnkiCi0gICAgICAgICAgICAgICAgICAgICIgJWQgeCAlZCwgc2l6ZSAlZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBjb21wcmVzc2VkIHN0cmVhbSBidWZmZXIgZGltZW5zaW9ucyIKKyAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkLCBzaXplICV6dSBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtV2lkdGgsIG1IZWlnaHQsIG1TaXplLCBtSWQpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCk7CisgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZ2VvbWV0cnkiCi0gICAgICAgICAgICAgICAgICAgICIgJWQgeCAlZCwgZm9ybWF0IDB4JXggZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0LCBtSWQpOworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZGltZW5zaW9ucyIKKyAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1XaWR0aCwgbUhlaWdodCwgbUlkKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksIG1Gb3JtYXQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZm9ybWF0IgorICAgICAgICAgICAgICAgICIgJSN4IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUZvcm1hdCwgbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOwogICAgIHJlcyA9IG1Db25zdW1lckludGVyZmFjZS0+cXVlcnkobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAogICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWF4Q29uc3VtZXJCdWZmZXJzKTsKQEAgLTEyMTQsMTEgKzEyNjksMTEgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIFN0cmluZzggcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICAgICBTdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAweCV4XG4iLAogICAgICAgICAgICAgbUlkLCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgc2l6ZSAlZCwgdXNhZ2UgMHgleCwgcmVxdWVzdGVkIGZvcm1hdCAweCV4XG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgc2l6ZSAlenUsIHVzYWdlIDB4JXgsIHJlcXVlc3RlZCBmb3JtYXQgMHgleFxuIiwKICAgICAgICAgICAgIG1TaXplLCBtVXNhZ2UsIG1Gb3JtYXRSZXF1ZXN0ZWQpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgdG90YWwgYnVmZmVyczogJWQsIGRlcXVldWVkIGJ1ZmZlcnM6ICVkXG4iLAogICAgICAgICAgICAgbVRvdGFsQnVmZmVycywgbUFjdGl2ZUJ1ZmZlcnMpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgZnJhbWUgY291bnQ6ICVkLCBsYXN0IHRpbWVzdGFtcCAlbGxkXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgZnJhbWUgY291bnQ6ICVkLCBsYXN0IHRpbWVzdGFtcCAlIiBQUklkNjQgIlxuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaAppbmRleCAxZjUzYzU2Li4yYTNmMWQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaApAQCAtNDcsMzggKzQ3LDQ4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdmlydHVhbCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0VW50aWxSZXF1ZXN0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsIG5zZWNzX3QgdGltZW91dCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCAqaWQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVSZXByb2Nlc3NTdHJlYW1Gcm9tU3RyZWFtKGludCBvdXRwdXRJZCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1JbmZvKGludCBpZCwKICAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1UcmFuc2Zvcm0oaW50IGlkLCBpbnQgdHJhbnNmb3JtKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCk7CisgICAgLy8gTm8tb3Agb24gSEFMMiBkZXZpY2VzCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKICAgICB2aXJ0dWFsIGJvb2wgICAgIHdpbGxOb3RpZnkzQSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdEZvck5leHRGcmFtZShuc2Vjc190IHRpbWVvdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKmZyYW1lKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJBdXRvZm9jdXModWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckNhbmNlbEF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyUHJlY2FwdHVyZU1ldGVyaW5nKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHB1c2hSZXByb2Nlc3NCdWZmZXIoaW50IHJlcHJvY2Vzc1N0cmVhbUlkLAogICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHdwPEJ1ZmZlclJlbGVhc2VkTGlzdGVuZXI+IGxpc3RlbmVyKTsKICAgICAvLyBGbHVzaCBpbXBsZW1lbnRlZCBhcyBqdXN0IGEgd2FpdAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpOworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdDsKKwogICBwcml2YXRlOgogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY2FtZXJhMl9kZXZpY2VfdCAqbUhhbDJEZXZpY2U7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtRGV2aWNlSW5mbzsKLSAgICB2ZW5kb3JfdGFnX3F1ZXJ5X29wc190ICptVmVuZG9yVGFnT3BzOworCisgICAgdWludDMyX3QgbURldmljZVZlcnNpb247CiAKICAgICAvKioKICAgICAgKiBRdWV1ZSBjbGFzcyBmb3IgYm90aCBzZW5kaW5nIHJlcXVlc3RzIHRvIGEgY2FtZXJhMiBkZXZpY2UsIGFuZCBmb3IKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IDNkYmMxYjAuLjZhN2Y5ZTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtMzcsNiArMzcsOCBAQAogICAgICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgICAgICAgICAgICAgICAgICAgIFwKICAgICAjI19fVkFfQVJHU19fKQogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CkBAIC00Niw2ICs0OCw4IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIgorI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CiAKQEAgLTU1LDcgKzU5LDggQEAKICAgICAgICAgbUlkKGlkKSwKICAgICAgICAgbUhhbDNEZXZpY2UoTlVMTCksCiAgICAgICAgIG1TdGF0dXMoU1RBVFVTX1VOSU5JVElBTElaRUQpLAotICAgICAgICBtVXNlUGFydGlhbFJlc3VsdFF1aXJrKGZhbHNlKSwKKyAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQoZmFsc2UpLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMoMSksCiAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGlzdGVuZXIoTlVMTCkKQEAgLTEwMCw4ICsxMDUsMTEgQEAKIAogICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZTsKIAotICAgIHJlcyA9IG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oJm1vZHVsZS0+Y29tbW9uLCBkZXZpY2VOYW1lLnN0cmluZygpLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSk7CisgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5vcGVuIik7CisgICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKAorICAgICAgICAmbW9kdWxlLT5jb21tb24sIGRldmljZU5hbWUuc3RyaW5nKCksCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpKTsKKyAgICBBVFJBQ0VfRU5EKCk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IG9wZW4gY2FtZXJhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMDksMTAgKzExNyw5IEBACiAgICAgfQogCiAgICAgLyoqIENyb3NzLWNoZWNrIGRldmljZSB2ZXJzaW9uICovCi0KLSAgICBpZiAoZGV2aWNlLT5jb21tb24udmVyc2lvbiAhPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgIGlmIChkZXZpY2UtPmNvbW1vbi52ZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmE6ICIKLSAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBpcyBub3QgdmVyc2lvbiAleCwgcmVwb3J0cyAleCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBzaG91bGQgYmUgYXQgbGVhc3QgJXgsIHJlcG9ydHMgJXggaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAsCiAgICAgICAgICAgICAgICAgZGV2aWNlLT5jb21tb24udmVyc2lvbik7CiAgICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7CkBAIC0xMjAsMTMgKzEyNywxNCBAQAogICAgIH0KIAogICAgIGNhbWVyYV9pbmZvIGluZm87Ci0gICAgcmVzID0gbW9kdWxlLT5nZXRfY2FtZXJhX2luZm8obUlkLCAmaW5mbyk7CisgICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShtb2R1bGUtPmdldF9jYW1lcmFfaW5mbygKKyAgICAgICAgbUlkLCAmaW5mbykpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBpZiAoaW5mby5kZXZpY2VfdmVyc2lvbiAhPSBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiSEFMIHJlcG9ydGluZyBtaXNtYXRjaGVkIGNhbWVyYV9pbmZvIHZlcnNpb24gKCV4KSIKICAgICAgICAgICAgICAgICAiIGFuZCBkZXZpY2UgdmVyc2lvbiAoJXgpLiIsCi0gICAgICAgICAgICAgICAgZGV2aWNlLT5jb21tb24udmVyc2lvbiwgaW5mby5kZXZpY2VfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgaW5mby5kZXZpY2VfdmVyc2lvbiwgZGV2aWNlLT5jb21tb24udmVyc2lvbik7CiAgICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMTQ0LDI0ICsxNTIsNiBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8qKiBHZXQgdmVuZG9yIG1ldGFkYXRhIHRhZ3MgKi8KLQotICAgIG1WZW5kb3JUYWdPcHMuZ2V0X2NhbWVyYV92ZW5kb3Jfc2VjdGlvbl9uYW1lID0gTlVMTDsKLQotICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzIik7Ci0gICAgZGV2aWNlLT5vcHMtPmdldF9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyhkZXZpY2UsICZtVmVuZG9yVGFnT3BzKTsKLSAgICBBVFJBQ0VfRU5EKCk7Ci0KLSAgICBpZiAobVZlbmRvclRhZ09wcy5nZXRfY2FtZXJhX3ZlbmRvcl9zZWN0aW9uX25hbWUgIT0gTlVMTCkgewotICAgICAgICByZXMgPSBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKCZtVmVuZG9yVGFnT3BzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc2V0IHRhZyBvcHM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqIFN0YXJ0IHVwIHN0YXR1cyB0cmFja2VyIHRocmVhZCAqLwogICAgIG1TdGF0dXNUcmFja2VyID0gbmV3IFN0YXR1c1RyYWNrZXIodGhpcyk7CiAgICAgcmVzID0gbVN0YXR1c1RyYWNrZXItPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVkLVN0YXR1cyIsIG1JZCkuc3RyaW5nKCkpOwpAQCAtMTg3LDIwICsxNzcsMjkgQEAKIAogICAgIC8qKiBFdmVyeXRoaW5nIGlzIGdvb2QgdG8gZ28gKi8KIAorICAgIG1EZXZpY2VWZXJzaW9uID0gZGV2aWNlLT5jb21tb24udmVyc2lvbjsKICAgICBtRGV2aWNlSW5mbyA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CiAgICAgbUhhbDNEZXZpY2UgPSBkZXZpY2U7CiAgICAgbVN0YXR1cyA9IFNUQVRVU19VTkNPTkZJR1VSRUQ7CiAgICAgbU5leHRTdHJlYW1JZCA9IDA7CisgICAgbUR1bW15U3RyZWFtSWQgPSBOT19TVFJFQU07CiAgICAgbU5lZWRDb25maWcgPSB0cnVlOwogICAgIG1QYXVzZVN0YXRlTm90aWZ5ID0gZmFsc2U7CiAKLSAgICAvKiogQ2hlY2sgZm9yIHF1aXJrcyAqLwotCiAgICAgLy8gV2lsbCB0aGUgSEFMIGJlIHNlbmRpbmcgaW4gZWFybHkgcGFydGlhbCByZXN1bHQgbWV0YWRhdGE/Ci0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHBhcnRpYWxSZXN1bHRzUXVpcmsgPQotICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1FVSVJLU19VU0VfUEFSVElBTF9SRVNVTFQpOwotICAgIGlmIChwYXJ0aWFsUmVzdWx0c1F1aXJrLmNvdW50ID4gMCAmJiBwYXJ0aWFsUmVzdWx0c1F1aXJrLmRhdGEudThbMF0gPT0gMSkgewotICAgICAgICBtVXNlUGFydGlhbFJlc3VsdFF1aXJrID0gdHJ1ZTsKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHBhcnRpYWxSZXN1bHRzQ291bnQgPQorICAgICAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICAgICAgaWYgKHBhcnRpYWxSZXN1bHRzQ291bnQuY291bnQgPiAwKSB7CisgICAgICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMgPSBwYXJ0aWFsUmVzdWx0c0NvdW50LmRhdGEuaTMyWzBdOworICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQgPSAobU51bVBhcnRpYWxSZXN1bHRzID4gMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgcGFydGlhbFJlc3VsdHNRdWlyayA9CisgICAgICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1FVSVJLU19VU0VfUEFSVElBTF9SRVNVTFQpOworICAgICAgICBpZiAocGFydGlhbFJlc3VsdHNRdWlyay5jb3VudCA+IDAgJiYgcGFydGlhbFJlc3VsdHNRdWlyay5kYXRhLnU4WzBdID09IDEpIHsKKyAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTI2OSw3ICsyNjgsOSBAQAogICAgICAgICBtU3RhdHVzVHJhY2tlci5jbGVhcigpOwogCiAgICAgICAgIGlmIChtSGFsM0RldmljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPmNsb3NlIik7CiAgICAgICAgICAgICBtSGFsM0RldmljZS0+Y29tbW9uLmNsb3NlKCZtSGFsM0RldmljZS0+Y29tbW9uKTsKKyAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgICAgIG1IYWwzRGV2aWNlID0gTlVMTDsKICAgICAgICAgfQogCkBAIC0yOTYsNiArMjk3LDg1IEBACiAgICAgcmV0dXJuIGdvdExvY2s7CiB9CiAKK0NhbWVyYTNEZXZpY2U6OlNpemUgQ2FtZXJhM0RldmljZTo6Z2V0TWF4SnBlZ1Jlc29sdXRpb24oKSBjb25zdCB7CisgICAgaW50MzJfdCBtYXhKcGVnV2lkdGggPSAwLCBtYXhKcGVnSGVpZ2h0ID0gMDsKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA0OworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDE7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDI7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgPT0gMCB8fAorICAgICAgICAgICAgICAgIGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgJSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTaXplKDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgICAgICBpZiAoaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVAorICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmCisgICAgICAgICAgICAgICAgICAgICh3aWR0aCAqIGhlaWdodCA+IG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbWF4SnBlZ1dpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgbWF4SnBlZ0hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVKcGVnU2l6ZXMgPQorICAgICAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOworICAgICAgICBpZiAoYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50ID09IDAgfHwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50ICUgMiAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gU2l6ZSgwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSArPSAyKSB7CisgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpXSAqIGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgMV0pCisgICAgICAgICAgICAgICAgICAgID4gKG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbWF4SnBlZ1dpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2ldOworICAgICAgICAgICAgICAgIG1heEpwZWdIZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTaXplKG1heEpwZWdXaWR0aCwgbWF4SnBlZ0hlaWdodCk7Cit9CisKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6Z2V0SnBlZ0J1ZmZlclNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgorICAgIFNpemUgbWF4SnBlZ1Jlc29sdXRpb24gPSBnZXRNYXhKcGVnUmVzb2x1dGlvbigpOworICAgIGlmIChtYXhKcGVnUmVzb2x1dGlvbi53aWR0aCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIGZpbmQgdmFsaWQgYXZhaWxhYmxlIGpwZWcgc2l6ZXMgaW4gc3RhdGljIG1ldGFkYXRhISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEdldCBtYXgganBlZyBidWZmZXIgc2l6ZQorICAgIHNzaXplX3QgbWF4SnBlZ0J1ZmZlclNpemUgPSAwOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBqcGVnQnVmTWF4U2l6ZSA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKKyAgICBpZiAoanBlZ0J1Zk1heFNpemUuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBtYXhpbXVtIEpQRUcgc2l6ZSBpbiBzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtYXhKcGVnQnVmZmVyU2l6ZSA9IGpwZWdCdWZNYXhTaXplLmRhdGEuaTMyWzBdOworCisgICAgLy8gQ2FsY3VsYXRlIGZpbmFsIGpwZWcgYnVmZmVyIHNpemUgZm9yIHRoZSBnaXZlbiByZXNvbHV0aW9uLgorICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gKChmbG9hdCkgKHdpZHRoICogaGVpZ2h0KSkgLworICAgICAgICAgICAgKG1heEpwZWdSZXNvbHV0aW9uLndpZHRoICogbWF4SnBlZ1Jlc29sdXRpb24uaGVpZ2h0KTsKKyAgICBzc2l6ZV90IGpwZWdCdWZmZXJTaXplID0gc2NhbGVGYWN0b3IgKiBtYXhKcGVnQnVmZmVyU2l6ZTsKKyAgICAvLyBCb3VuZCB0aGUgYnVmZmVyIHNpemUgdG8gW01JTl9KUEVHX0JVRkZFUl9TSVpFLCBtYXhKcGVnQnVmZmVyU2l6ZV0uCisgICAgaWYgKGpwZWdCdWZmZXJTaXplID4gbWF4SnBlZ0J1ZmZlclNpemUpIHsKKyAgICAgICAganBlZ0J1ZmZlclNpemUgPSBtYXhKcGVnQnVmZmVyU2l6ZTsKKyAgICB9IGVsc2UgaWYgKGpwZWdCdWZmZXJTaXplIDwga01pbkpwZWdCdWZmZXJTaXplKSB7CisgICAgICAgIGpwZWdCdWZmZXJTaXplID0ga01pbkpwZWdCdWZmZXJTaXplOworICAgIH0KKworICAgIHJldHVybiBqcGVnQnVmZmVyU2l6ZTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgICh2b2lkKWFyZ3M7CkBAIC0zNDUsNyArNDI1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbkZsaWdodE1hcC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0IHIgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWUgJWQgfCAgVGltZXN0YW1wOiAlbGxkLCBtZXRhZGF0YSIKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWUgJWQgfCAgVGltZXN0YW1wOiAlIiBQUklkNjQgIiwgbWV0YWRhdGEiCiAgICAgICAgICAgICAgICAgICAgICIgYXJyaXZlZDogJXMsIGJ1ZmZlcnMgbGVmdDogJWRcbiIsIG1JbkZsaWdodE1hcC5rZXlBdChpKSwKICAgICAgICAgICAgICAgICAgICAgci5jYXB0dXJlVGltZXN0YW1wLCByLmhhdmVSZXN1bHRNZXRhZGF0YSA/ICJ0cnVlIiA6ICJmYWxzZSIsCiAgICAgICAgICAgICAgICAgICAgIHIubnVtQnVmZmVyc0xlZnQpOwpAQCAtMzg0LDE0ICs0NjQsNyBAQAogICAgIHJldHVybiBtRGV2aWNlSW5mbzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotCi0gICAgLy8gVE9ETzogdGFrZSBvd25lcnNoaXAgb2YgdGhlIHJlcXVlc3QKLQorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0dXMpIHsKICAgICAgICAgY2FzZSBTVEFUVVNfRVJST1I6CiAgICAgICAgICAgICBDTE9HRSgiRGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiKTsKQEAgLTQwMCw3ICs0NzMsNiBAQAogICAgICAgICAgICAgQ0xPR0UoIkRldmljZSBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgY2FzZSBTVEFUVVNfVU5DT05GSUdVUkVEOgotICAgICAgICAgICAgLy8gTWF5IGJlIGxhemlseSBjb25maWd1cmluZyBzdHJlYW1zLCB3aWxsIGNoZWNrIGR1cmluZyBzZXR1cAogICAgICAgICBjYXNlIFNUQVRVU19DT05GSUdVUkVEOgogICAgICAgICBjYXNlIFNUQVRVU19BQ1RJVkU6CiAgICAgICAgICAgICAvLyBPSwpAQCAtNDA5LDcxICs0ODEsMTE5IEBACiAgICAgICAgICAgICBTRVRfRVJSX0woIlVuZXhwZWN0ZWQgc3RhdHVzOiAlZCIsIG1TdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CiAKLSAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVxdWVzdCA9IHNldFVwUmVxdWVzdExvY2tlZChyZXF1ZXN0KTsKLSAgICBpZiAobmV3UmVxdWVzdCA9PSBOVUxMKSB7Ci0gICAgICAgIENMT0dFKCJDYW4ndCBjcmVhdGUgY2FwdHVyZSByZXF1ZXN0Iik7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCgKKyAgICAgICAgY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJm1ldGFkYXRhTGlzdCwgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KSB7CisgICAgaWYgKHJlcXVlc3RMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgQ0xPR0UoInJlcXVlc3RMaXN0IGNhbm5vdCBiZSBOVUxMLiIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVJlcXVlc3QobmV3UmVxdWVzdCk7Ci0gICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyB0cnVlLCBrQWN0aXZlVGltZW91dCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgdHJhbnNpdGlvbiB0byBhY3RpdmUgaW4gJWYgc2Vjb25kcyEiLAotICAgICAgICAgICAgICAgICAgICBrQWN0aXZlVGltZW91dC8xZTkpOworICAgIGludDMyX3QgYnVyc3RJZCA9IDA7CisgICAgZm9yIChMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXRhZGF0YUxpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1ldGFkYXRhTGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVxdWVzdCA9IHNldFVwUmVxdWVzdExvY2tlZCgqaXQpOworICAgICAgICBpZiAobmV3UmVxdWVzdCA9PSAwKSB7CisgICAgICAgICAgICBDTE9HRSgiQ2FuJ3QgY3JlYXRlIGNhcHR1cmUgcmVxdWVzdCIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiBDYXB0dXJlIHJlcXVlc3QgZW5xdWV1ZWQiLCBtSWQpOworCisgICAgICAgIC8vIFNldHVwIGJ1cnN0IElkIGFuZCByZXF1ZXN0IElkCisgICAgICAgIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCA9IGJ1cnN0SWQrKzsKKyAgICAgICAgaWYgKGl0LT5leGlzdHMoQU5EUk9JRF9SRVFVRVNUX0lEKSkgeworICAgICAgICAgICAgaWYgKGl0LT5maW5kKEFORFJPSURfUkVRVUVTVF9JRCkuY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0SUQgZW50cnkgZXhpc3RzOyBidXQgbXVzdCBub3QgYmUgZW1wdHkgaW4gbWV0YWRhdGEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPSBpdC0+ZmluZChBTkRST0lEX1JFUVVFU1RfSUQpLmRhdGEuaTMyWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3RJRCBkb2VzIG5vdCBleGlzdCBpbiBtZXRhZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3RMaXN0LT5wdXNoX2JhY2sobmV3UmVxdWVzdCk7CisKKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgPSAlIiBQUklkMzIsIF9fRlVOQ1RJT05fXywgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOwogICAgIH0KLSAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBPSzsKIH0KIAotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7CisKKyAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiByZXF1ZXN0czsKKyAgICByZXF1ZXN0cy5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzSGVscGVyKAorICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAvKm91dCovCisgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzd2l0Y2ggKG1TdGF0dXMpIHsKLSAgICAgICAgY2FzZSBTVEFUVVNfRVJST1I6Ci0gICAgICAgICAgICBDTE9HRSgiRGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBTVEFUVVNfVU5JTklUSUFMSVpFRDoKLSAgICAgICAgICAgIENMT0dFKCJEZXZpY2Ugbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgU1RBVFVTX1VOQ09ORklHVVJFRDoKLSAgICAgICAgICAgIC8vIE1heSBiZSBsYXppbHkgY29uZmlndXJpbmcgc3RyZWFtcywgd2lsbCBjaGVjayBkdXJpbmcgc2V0dXAKLSAgICAgICAgY2FzZSBTVEFUVVNfQ09ORklHVVJFRDoKLSAgICAgICAgY2FzZSBTVEFUVVNfQUNUSVZFOgotICAgICAgICAgICAgLy8gT0sKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmV4cGVjdGVkIHN0YXR1czogJWQiLCBtU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBlcnJvciBsb2dnZWQgYnkgcHJldmlvdXMgY2FsbAorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBuZXdSZXBlYXRpbmdSZXF1ZXN0ID0gc2V0VXBSZXF1ZXN0TG9ja2VkKHJlcXVlc3QpOwotICAgIGlmIChuZXdSZXBlYXRpbmdSZXF1ZXN0ID09IE5VTEwpIHsKLSAgICAgICAgQ0xPR0UoIkNhbid0IGNyZWF0ZSByZXBlYXRpbmcgcmVxdWVzdCIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIFJlcXVlc3RMaXN0IHJlcXVlc3RMaXN0OworCisgICAgcmVzID0gY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQocmVxdWVzdHMsIC8qb3V0Ki8mcmVxdWVzdExpc3QpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gZXJyb3IgbG9nZ2VkIGJ5IHByZXZpb3VzIGNhbGwKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBSZXF1ZXN0TGlzdCBuZXdSZXBlYXRpbmdSZXF1ZXN0czsKLSAgICBuZXdSZXBlYXRpbmdSZXF1ZXN0cy5wdXNoX2JhY2sobmV3UmVwZWF0aW5nUmVxdWVzdCk7CisgICAgaWYgKHJlcGVhdGluZykgeworICAgICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+c2V0UmVwZWF0aW5nUmVxdWVzdHMocmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnF1ZXVlUmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfQogCi0gICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnNldFJlcGVhdGluZ1JlcXVlc3RzKG5ld1JlcGVhdGluZ1JlcXVlc3RzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIHRydWUsIGtBY3RpdmVUaW1lb3V0KTsKKyAgICAgICAgd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi90cnVlLCBrQWN0aXZlVGltZW91dCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgdHJhbnNpdGlvbiB0byBhY3RpdmUgaW4gJWYgc2Vjb25kcyEiLAogICAgICAgICAgICAgICAgICAgICBrQWN0aXZlVGltZW91dC8xZTkpOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IFJlcGVhdGluZyByZXF1ZXN0IHNldCIsIG1JZCk7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENhcHR1cmUgcmVxdWVzdCAlIiBQUklkMzIgIiBlbnF1ZXVlZCIsIG1JZCwKKyAgICAgICAgICAgICAgKCoocmVxdWVzdExpc3QuYmVnaW4oKSkpLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0xPR0UoIkNhbm5vdCBxdWV1ZSByZXF1ZXN0LiBJbXBvc3NpYmxlLiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHMsIC8qcmVwZWF0aW5nKi9mYWxzZSwgbGFzdEZyYW1lTnVtYmVyKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiByZXF1ZXN0czsKKyAgICByZXF1ZXN0cy5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgcmV0dXJuIHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KHJlcXVlc3RzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHMsIC8qcmVwZWF0aW5nKi90cnVlLCBsYXN0RnJhbWVOdW1iZXIpOworfQogCiBzcDxDYW1lcmEzRGV2aWNlOjpDYXB0dXJlUmVxdWVzdD4gQ2FtZXJhM0RldmljZTo6c2V0VXBSZXF1ZXN0TG9ja2VkKAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgewpAQCAtNDgxLDEwICs2MDEsMTggQEAKIAogICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19VTkNPTkZJR1VSRUQgfHwgbU5lZWRDb25maWcpIHsKICAgICAgICAgcmVzID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZCgpOworICAgICAgICAvLyBTdHJlYW0gY29uZmlndXJhdGlvbiBmYWlsZWQgZHVlIHRvIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIC8vIERldmljZSBiYWNrIHRvIHVuY29uZmlndXJlZCBzdGF0ZS4gQ2xpZW50IG1pZ2h0IHRyeSBvdGhlciBjb25maWd1cmFpdG9ucworICAgICAgICBpZiAocmVzID09IEJBRF9WQUxVRSAmJiBtU3RhdHVzID09IFNUQVRVU19VTkNPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgIENMT0dFKCJObyBzdHJlYW1zIGNvbmZpZ3VyZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZCBmb3Igb3RoZXIgcmVhc29uLiBGYXRhbC4KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBzZXQgdXAgc3RyZWFtczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KKyAgICAgICAgLy8gU3RyZWFtIGNvbmZpZ3VyYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZSB0byBlbXB0eSBzdHJlYW0gY29uZmlndXJhdGlvbi4KICAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOQ09ORklHVVJFRCkgewogICAgICAgICAgICAgQ0xPR0UoIk5vIHN0cmVhbXMgY29uZmlndXJlZCIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00OTUsNyArNjIzLDcgQEAKICAgICByZXR1cm4gbmV3UmVxdWVzdDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC01MTcsNyArNjQ1LDggQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgQUxPR1YoIkNhbWVyYSAlZDogQ2xlYXJpbmcgcmVwZWF0aW5nIHJlcXVlc3QiLCBtSWQpOwotICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpOworCisgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KSB7CkBAIC02NTIsNiArNzgxLDggQEAKICAgICB9CiAgICAgbUlucHV0U3RyZWFtID0gbmV3U3RyZWFtOwogCisgICAgbU5lZWRDb25maWcgPSB0cnVlOworCiAgICAgKmlkID0gbU5leHRTdHJlYW1JZCsrOwogICAgICp6c2xTdHJlYW0gPSBuZXdTdHJlYW07CiAKQEAgLTY3MiwxMiArODAzLDEyIEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgc2l6ZV90IHNpemUsIGludCAqaWQpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgQUxPR1YoIkNhbWVyYSAlZDogQ3JlYXRpbmcgbmV3IHN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0ICVkLCBzaXplICVkIiwKLSAgICAgICAgICAgIG1JZCwgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBzaXplKTsKKyAgICBBTE9HVigiQ2FtZXJhICVkOiBDcmVhdGluZyBuZXcgc3RyZWFtICVkOiAlZCB4ICVkLCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgbUlkLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CkBAIC03MTAsOCArODQxLDE0IEBACiAKICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtPiBuZXdTdHJlYW07CiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgc3NpemVfdCBqcGVnQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAoanBlZ0J1ZmZlclNpemUgPD0gMCkgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwganBlZ0J1ZmZlclNpemUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHNpemUsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwganBlZ0J1ZmZlclNpemUsIGZvcm1hdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXIsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKQEAgLTgzNiwxNiArOTczLDIwIEBACiAgICAgfQogCiAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKKyAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKICAgICAgICAgZGVsZXRlZFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICB9CisKKyAgICAvLyBEZWxldGUgb3V0cHV0IHN0cmVhbSBvciB0aGUgb3V0cHV0IHBhcnQgb2YgYSBiaS1kaXJlY3Rpb25hbCBzdHJlYW0uCisgICAgaWYgKG91dHB1dFN0cmVhbUlkeCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKICAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbShpZCk7CiAgICAgfQogCkBAIC04NjksNiArMTAxMCwxNSBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29uZmlndXJlU3RyZWFtcygpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHJldHVybiBjb25maWd1cmVTdHJlYW1zTG9ja2VkKCk7Cit9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgewpAQCAtODk0LDYgKzEwNDQsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBpZiAoIW1SZXF1ZXN0VGVtcGxhdGVDYWNoZVt0ZW1wbGF0ZUlkXS5pc0VtcHR5KCkpIHsKKyAgICAgICAgKnJlcXVlc3QgPSBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbdGVtcGxhdGVJZF07CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3UmVxdWVzdDsKICAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPmNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MiKTsKICAgICByYXdSZXF1ZXN0ID0gbUhhbDNEZXZpY2UtPm9wcy0+Y29uc3RydWN0X2RlZmF1bHRfcmVxdWVzdF9zZXR0aW5ncygKQEAgLTkwNSw2ICsxMDYwLDcgQEAKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICAqcmVxdWVzdCA9IHJhd1JlcXVlc3Q7CisgICAgbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW3RlbXBsYXRlSWRdID0gcmF3UmVxdWVzdDsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTkxNCw2ICsxMDcwLDEwIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKKyAgICByZXR1cm4gd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCkgewogICAgIHN3aXRjaCAobVN0YXR1cykgewogICAgICAgICBjYXNlIFNUQVRVU19VTklOSVRJQUxJWkVEOgogICAgICAgICBjYXNlIFNUQVRVU19VTkNPTkZJR1VSRUQ6CkBAIC05MzIsNiArMTA5MiwxMCBAQAogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdW50aWwgaWRsZSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICBzdGF0dXNfdCByZXMgPSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyBmYWxzZSwga1NodXRkb3duVGltZW91dCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSX0woIkVycm9yIHdhaXRpbmcgZm9yIEhBTCB0byBkcmFpbjogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgIHJlcyk7CisgICAgfQogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTEwMDEsNiArMTE2NSw3IEBACiAgICAgICAgIEFMT0dXKCIlczogUmVwbGFjaW5nIG9sZCBjYWxsYmFjayBsaXN0ZW5lciIsIF9fRlVOQ1RJT05fXyk7CiAgICAgfQogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXROb3RpZnlDYWxsYmFjayhsaXN0ZW5lcik7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMDE4LDcgKzExODMsNyBAQAogICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBObyBmcmFtZSBpbiAlbGxkIG5zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBObyBmcmFtZSBpbiAlIiBQUklkNjQgIiBuczogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCB0aW1lb3V0LCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KQEAgLTEwMjYsNyArMTE5MSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKmZyYW1lKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKQEAgLTEwMzQsOCArMTE5OSwxNCBAQAogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIENhbWVyYU1ldGFkYXRhICZyZXN1bHQgPSAqKG1SZXN1bHRRdWV1ZS5iZWdpbigpKTsKLSAgICBmcmFtZS0+YWNxdWlyZShyZXN1bHQpOworICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogYXJndW1lbnQgY2Fubm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIENhcHR1cmVSZXN1bHQgJnJlc3VsdCA9ICoobVJlc3VsdFF1ZXVlLmJlZ2luKCkpOworICAgIGZyYW1lLT5tUmVzdWx0RXh0cmFzID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXM7CisgICAgZnJhbWUtPm1NZXRhZGF0YS5hY3F1aXJlKHJlc3VsdC5tTWV0YWRhdGEpOwogICAgIG1SZXN1bHRRdWV1ZS5lcmFzZShtUmVzdWx0UXVldWUuYmVnaW4oKSk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMDU1LDcgKzEyMjYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMDc2LDcgKzEyNDcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMDk3LDcgKzEyNjgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMTEzLDE0ICsxMjg0LDM3IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpmbHVzaCgpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmZsdXNoKGludDY0X3QgKmZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRmx1c2hpbmcgYWxsIHJlcXVlc3RzIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyKCk7Ci0gICAgcmV0dXJuIG1IYWwzRGV2aWNlLT5vcHMtPmZsdXNoKG1IYWwzRGV2aWNlKTsKKyAgICBOb3RpZmljYXRpb25MaXN0ZW5lciogbGlzdGVuZXI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIobGlzdGVuZXIsIC8qb3V0Ki9mcmFtZU51bWJlcik7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmIChtSGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzEpIHsKKyAgICAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+Zmx1c2gobUhhbDNEZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcmVzID0gd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IENhbWVyYTNEZXZpY2U6OmdldERldmljZVZlcnNpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKIH0KIAogLyoqCkBAIC0xMjQ0LDYgKzE0MzgsMTUgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIC8vIFdvcmthcm91bmQgZm9yIGRldmljZSBIQUx2My4yIG9yIG9sZGVyIHNwZWMgYnVnIC0gemVybyBzdHJlYW1zIHJlcXVpcmVzCisgICAgLy8gYWRkaW5nIGEgZHVtbXkgc3RyZWFtIGluc3RlYWQuCisgICAgLy8gVE9ETzogQnVnOiAxNzMyMTQwNCBmb3IgZml4aW5nIHRoZSBIQUwgc3BlYyBhbmQgcmVtb3ZpbmcgdGhpcyB3b3JrYXJvdW5kLgorICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICBhZGREdW1teVN0cmVhbUxvY2tlZCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyeVJlbW92ZUR1bW15U3RyZWFtTG9ja2VkKCk7CisgICAgfQorCiAgICAgLy8gU3RhcnQgY29uZmlndXJpbmcgdGhlIHN0cmVhbXMKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3RhcnRpbmcgc3RyZWFtIGNvbmZpZ3VyYXRpb24iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAKQEAgLTEyOTEsNyArMTQ5NCw0MiBAQAogICAgIHJlcyA9IG1IYWwzRGV2aWNlLT5vcHMtPmNvbmZpZ3VyZV9zdHJlYW1zKG1IYWwzRGV2aWNlLCAmY29uZmlnKTsKICAgICBBVFJBQ0VfRU5EKCk7CiAKLSAgICBpZiAocmVzICE9IE9LKSB7CisgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUpIHsKKyAgICAgICAgLy8gSEFMIHJlamVjdGVkIHRoaXMgc2V0IG9mIHN0cmVhbXMgYXMgdW5zdXBwb3J0ZWQsIGNsZWFuIHVwIGNvbmZpZworICAgICAgICAvLyBhdHRlbXB0IGFuZCByZXR1cm4gdG8gdW5jb25maWd1cmVkIHN0YXRlCisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBtSW5wdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgeworICAgICAgICAgICAgcmVzID0gbUlucHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBjYW5jZWwgY29uZmlndXJpbmcgaW5wdXQgc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7CisgICAgICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY2FuY2VsIGNvbmZpZ3VyaW5nIG91dHB1dCBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT5nZXRJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gc3RhdGUgdG8gdGhhdCBhdCBzdGFydCBvZiBjYWxsLCBzbyB0aGF0IGZ1dHVyZSBjb25maWd1cmVzCisgICAgICAgIC8vIHByb3Blcmx5IGNsZWFuIHRoaW5ncyB1cAorICAgICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKKyAgICAgICAgbU5lZWRDb25maWcgPSB0cnVlOworCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdHJlYW0gY29uZmlndXJhdGlvbiBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gU29tZSBvdGhlciBraW5kIG9mIGVycm9yIGZyb20gY29uZmlndXJlX3N0cmVhbXMgLSB0aGlzIGlzIG5vdAorICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtcyB3aXRoIEhBTDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0xMzMxLDcgKzE1NjksNyBAQAogCiAgICAgbU5lZWRDb25maWcgPSBmYWxzZTsKIAotICAgIGlmIChjb25maWcubnVtX3N0cmVhbXMgPiAwKSB7CisgICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgewogICAgICAgICBtU3RhdHVzID0gU1RBVFVTX0NPTkZJR1VSRUQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19VTkNPTkZJR1VSRUQ7CkBAIC0xMzM5LDkgKzE1NzcsNzUgQEAKIAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdHJlYW0gY29uZmlndXJhdGlvbiBjb21wbGV0ZSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKIAorICAgIC8vIHRlYXIgZG93biB0aGUgZGVsZXRlZCBzdHJlYW1zIGFmdGVyIGNvbmZpZ3VyZSBzdHJlYW1zLgorICAgIG1EZWxldGVkU3RyZWFtcy5jbGVhcigpOworCiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjphZGREdW1teVN0cmVhbUxvY2tlZCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlczsKKworICAgIGlmIChtRHVtbXlTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKKyAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGJlIGFkZGluZyBhIHNlY29uZCBkdW1teSBzdHJlYW0gd2hlbiBvbmUgaXMgYWxyZWFkeQorICAgICAgICAvLyBhY3RpdmUKKyAgICAgICAgU0VUX0VSUl9MKCIlczogQ2FtZXJhICVkOiBBIGR1bW15IHN0cmVhbSBhbHJlYWR5IGV4aXN0cyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBZGRpbmcgYSBkdW1teSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBkdW1teVN0cmVhbSA9CisgICAgICAgICAgICBuZXcgQ2FtZXJhM0R1bW15U3RyZWFtKG1OZXh0U3RyZWFtSWQpOworCisgICAgcmVzID0gbU91dHB1dFN0cmVhbXMuYWRkKG1OZXh0U3RyZWFtSWQsIGR1bW15U3RyZWFtKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBTRVRfRVJSX0woIkNhbid0IGFkZCBkdW1teSBzdHJlYW0gdG8gc2V0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUR1bW15U3RyZWFtSWQgPSBtTmV4dFN0cmVhbUlkOworICAgIG1OZXh0U3RyZWFtSWQrKzsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6dHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSByZXR1cm4gT0s7CisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSA9PSAxKSByZXR1cm4gT0s7CisKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUmVtb3ZpbmcgdGhlIGR1bW15IHN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKworICAgIC8vIE9rLCBoYXZlIGEgZHVtbXkgc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAorICAgIC8vIHNvIHJlbW92ZSB0aGUgZHVtbXkKKworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW07CisgICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KG1EdW1teVN0cmVhbUlkKTsKKyAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIFNFVF9FUlJfTCgiRHVtbXkgc3RyZWFtICVkIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCIsIG1EdW1teVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQob3V0cHV0U3RyZWFtSWR4KTsKKworICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCisgICAgcmVzID0gZGVsZXRlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBkaXNjb25uZWN0IGRlbGV0ZWQgZHVtbXkgc3RyZWFtICVkIiwgbUR1bW15U3RyZWFtSWQpOworICAgICAgICAvLyBmYWxsIHRocm91Z2ggc2luY2Ugd2Ugd2FudCB0byBzdGlsbCBsaXN0IHRoZSBzdHJlYW0gYXMgZGVsZXRlZC4KKyAgICB9CisgICAgbURlbGV0ZWRTdHJlYW1zLmFkZChkZWxldGVkU3RyZWFtKTsKKyAgICBtRHVtbXlTdHJlYW1JZCA9IE5PX1NUUkVBTTsKKworICAgIHJldHVybiByZXM7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6c2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICB2YV9saXN0IGFyZ3M7CkBAIC0xMzc0LDQwICsxNjc4LDQ1IEBACiAgICAgLy8gQnV0IG9ubHkgZG8gZXJyb3Igc3RhdGUgdHJhbnNpdGlvbiBzdGVwcyBmb3IgdGhlIGZpcnN0IGVycm9yCiAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SIHx8IG1TdGF0dXMgPT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHJldHVybjsKIAotICAgIC8vIFNhdmUgc3RhY2sgdHJhY2UuIFZpZXcgYnkgZHVtcGluZyBpdCBsYXRlci4KLSAgICBDYW1lcmFUcmFjZXM6OnNhdmVUcmFjZSgpOwotICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBlcnJvckNhdXNlIGFuZCBjbGllbnQgcGlkL3Byb2NuYW1lCi0KICAgICBtRXJyb3JDYXVzZSA9IGVycm9yQ2F1c2U7CiAKICAgICBtUmVxdWVzdFRocmVhZC0+c2V0UGF1c2VkKHRydWUpOwogICAgIG1TdGF0dXMgPSBTVEFUVVNfRVJST1I7CisKKyAgICAvLyBOb3RpZnkgdXBzdHJlYW0gYWJvdXQgYSBkZXZpY2UgZXJyb3IKKyAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFLAorICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CisgICAgfQorCisgICAgLy8gU2F2ZSBzdGFjayB0cmFjZS4gVmlldyBieSBkdW1waW5nIGl0IGxhdGVyLgorICAgIENhbWVyYVRyYWNlczo6c2F2ZVRyYWNlKCk7CisgICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIGVycm9yQ2F1c2UgYW5kIGNsaWVudCBwaWQvcHJvY25hbWUKIH0KIAogLyoqCiAgKiBJbi1mbGlnaHQgcmVxdWVzdCBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodChpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCwgaW50MzJfdCBudW1CdWZmZXJzKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwotICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChyZXF1ZXN0SWQsIG51bUJ1ZmZlcnMpKTsKKyAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCkpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiAvKioKLSAqIFFVSVJLKHBhcnRpYWwgcmVzdWx0cykKICAqIENoZWNrIGlmIGFsbCAzQSBmaWVsZHMgYXJlIHJlYWR5LCBhbmQgc2VuZCBvZmYgYSBwYXJ0aWFsIDNBLW9ubHkgcmVzdWx0CiAgKiB0byB0aGUgb3V0cHV0IGZyYW1lIHF1ZXVlCiAgKi8KLWJvb2wgQ2FtZXJhM0RldmljZTo6cHJvY2Vzc1BhcnRpYWwzQVF1aXJrKAotICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHBhcnRpYWwpIHsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6cHJvY2Vzc1BhcnRpYWwzQVJlc3VsdCgKKyAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBwYXJ0aWFsLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKIAogICAgIC8vIENoZWNrIGlmIGFsbCAzQSBzdGF0ZXMgYXJlIHByZXNlbnQKICAgICAvLyBUaGUgZnVsbCBsaXN0IG9mIGZpZWxkcyBpcwpAQCAtMTQyNyw4ICsxNzM2LDYgQEAKICAgICB1aW50OF90IGFlU3RhdGU7CiAgICAgdWludDhfdCBhZlN0YXRlOwogICAgIHVpbnQ4X3QgYXdiU3RhdGU7Ci0gICAgaW50MzJfdCBhZlRyaWdnZXJJZDsKLSAgICBpbnQzMl90IGFlVHJpZ2dlcklkOwogCiAgICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAmYWZNb2RlLCBmcmFtZU51bWJlcik7CkBAIC0xNDQ1LDg4ICsxNzUyLDkyIEBACiAgICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICZhd2JTdGF0ZSwgZnJhbWVOdW1iZXIpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAotICAgICAgICAmYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKTsKLQotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzQVJlc3VsdChwYXJ0aWFsLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKLSAgICAgICAgJmFlVHJpZ2dlcklkLCBmcmFtZU51bWJlcik7Ci0KICAgICBpZiAoIWdvdEFsbFN0YXRlcykgcmV0dXJuIGZhbHNlOwogCiAgICAgQUxPR1ZWKCIlczogQ2FtZXJhICVkOiBGcmFtZSAlZCwgUmVxdWVzdCBJRCAlZDogQUYgbW9kZSAlZCwgQVdCIG1vZGUgJWQsICIKICAgICAgICAgIkFGIHN0YXRlICVkLCBBRSBzdGF0ZSAlZCwgQVdCIHN0YXRlICVkLCAiCiAgICAgICAgICJBRiB0cmlnZ2VyICVkLCBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgJWQiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZnJhbWVOdW1iZXIsIHJlcXVlc3RJZCwKKyAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGZyYW1lTnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLAogICAgICAgICBhZk1vZGUsIGF3Yk1vZGUsCiAgICAgICAgIGFmU3RhdGUsIGFlU3RhdGUsIGF3YlN0YXRlLAotICAgICAgICBhZlRyaWdnZXJJZCwgYWVUcmlnZ2VySWQpOworICAgICAgICByZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQsIHJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkKTsKIAogICAgIC8vIEdvdCBhbGwgc3RhdGVzLCBzbyBjb25zdHJ1Y3QgYSBtaW5pbWFsIHJlc3VsdCB0byBzZW5kCiAgICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGZpZWxkcywgdGhpcyBtZWFucyBhZGRpbmcgaW4KICAgICAvLyAgIGFuZHJvaWQucmVxdWVzdC5mcmFtZUNvdW50CiAgICAgLy8gICBhbmRyb2lkLnJlcXVlc3QucmVxdWVzdElkCi0gICAgLy8gICBhbmRyb2lkLnF1aXJrcy5wYXJ0aWFsUmVzdWx0CisgICAgLy8gICBhbmRyb2lkLnF1aXJrcy5wYXJ0aWFsUmVzdWx0IChmb3IgSEFMIHZlcnNpb24gYmVsb3cgSEFMMy4yKQogCiAgICAgY29uc3Qgc2l6ZV90IGtNaW5pbWFsM0FSZXN1bHRFbnRyaWVzID0gMTA7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKLSAgICBDYW1lcmFNZXRhZGF0YSYgbWluM0FSZXN1bHQgPQotICAgICAgICAgICAgKm1SZXN1bHRRdWV1ZS5pbnNlcnQoCi0gICAgICAgICAgICAgICAgbVJlc3VsdFF1ZXVlLmVuZCgpLAotICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKGtNaW5pbWFsM0FSZXN1bHRFbnRyaWVzLCAvKmRhdGFDYXBhY2l0eSovIDApKTsKKyAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CisgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOworICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhID0gQ2FtZXJhTWV0YWRhdGEoa01pbmltYWwzQVJlc3VsdEVudHJpZXMsIC8qZGF0YUNhcGFjaXR5Ki8gMCk7CisgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgdG8gc3A8Q2FwdHVyZVJlc3VsdD4uIFRoaXMgd2lsbCBuZWVkIG90aGVyIGNoYW5nZXMsIGluY2x1ZGluZywKKyAgICAvLyBidXQgbm90IGxpbWl0ZWQgdG8gQ2FtZXJhRGV2aWNlQmFzZTo6Z2V0TmV4dFJlc3VsdAorICAgIENhcHR1cmVSZXN1bHQmIG1pbjNBUmVzdWx0ID0KKyAgICAgICAgICAgICptUmVzdWx0UXVldWUuaW5zZXJ0KG1SZXN1bHRRdWV1ZS5lbmQoKSwgY2FwdHVyZVJlc3VsdCk7CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCi0gICAgICAgICAgICAmZnJhbWVOdW1iZXIsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGlzIHByb2JsZW1hdGljIGNhc3RpbmcuIE5lZWQgdG8gZml4IENhbWVyYU1ldGFkYXRhLgorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmZyYW1lTnVtYmVyKSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX1JFUVVFU1RfSUQsCisgICAgaW50MzJfdCByZXF1ZXN0SWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1JFUVVFU1RfSUQsCiAgICAgICAgICAgICAmcmVxdWVzdElkLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHBhcnRpYWxSZXN1bHQgPSBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMOwotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxULAotICAgICAgICAgICAgJnBhcnRpYWxSZXN1bHQsIGZyYW1lTnVtYmVyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGFydGlhbFJlc3VsdCA9IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUw7CisgICAgICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAmcGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmYWZNb2RlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJmF3Yk1vZGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmYWVTdGF0ZSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZhZlN0YXRlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICAgICAmYXdiU3RhdGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsCi0gICAgICAgICAgICAmYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKKyAgICAgICAgICAgICZyZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQsCi0gICAgICAgICAgICAmYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKKyAgICAgICAgICAgICZyZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvLyBXZSBvbmx5IHNlbmQgdGhlIGFnZ3JlZ2F0ZWQgcGFydGlhbCB3aGVuIGFsbCAzQSByZWxhdGVkIG1ldGFkYXRhIGFyZSBhdmFpbGFibGUKKyAgICAvLyBGb3IgYm90aCBBUEkxIGFuZCBBUEkyLgorICAgIC8vIFRPRE86IHdlIHByb2JhYmx5IHNob3VsZCBwYXNzIHRocm91Z2ggYWxsIHBhcnRpYWxzIHRvIEFQSTIgdW5jb25kaXRpb25hbGx5LgogICAgIG1SZXN1bHRTaWduYWwuc2lnbmFsKCk7CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE1MzQsNyArMTg0NSw3IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBib29sIENhbWVyYTNEZXZpY2U6OmdldDNBUmVzdWx0KGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXN1bHQsIGludDMyX3QgdGFnLAotICAgICAgICBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcikgeworICAgICAgICBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpIHsKICAgICAodm9pZCkgZnJhbWVOdW1iZXI7CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKQEAgLTE1NTksNyArMTg3MCw3IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBib29sIENhbWVyYTNEZXZpY2U6Omluc2VydDNBUmVzdWx0KENhbWVyYU1ldGFkYXRhJiByZXN1bHQsIGludDMyX3QgdGFnLAotICAgICAgICBjb25zdCBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcikgeworICAgICAgICBjb25zdCBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpIHsKICAgICBpZiAocmVzdWx0LnVwZGF0ZSh0YWcsIHZhbHVlLCAxKSAhPSBOT19FUlJPUikgewogICAgICAgICBtUmVzdWx0UXVldWUuZXJhc2UoLS1tUmVzdWx0UXVldWUuZW5kKCksIG1SZXN1bHRRdWV1ZS5lbmQoKSk7CiAgICAgICAgIFNFVF9FUlIoIkZyYW1lICVkOiBGYWlsZWQgdG8gc2V0ICVzIGluIHBhcnRpYWwgbWV0YWRhdGEiLApAQCAtMTU3OSwxOCArMTg5MCwzNCBAQAogICAgIHN0YXR1c190IHJlczsKIAogICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyID0gcmVzdWx0LT5mcmFtZV9udW1iZXI7Ci0gICAgaWYgKHJlc3VsdC0+cmVzdWx0ID09IE5VTEwgJiYgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMgPT0gMCkgeworICAgIGlmIChyZXN1bHQtPnJlc3VsdCA9PSBOVUxMICYmIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzID09IDAgJiYKKyAgICAgICAgICAgIHJlc3VsdC0+aW5wdXRfYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgU0VUX0VSUigiTm8gcmVzdWx0IGRhdGEgcHJvdmlkZWQgYnkgSEFMIGZvciBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJvb2wgcGFydGlhbFJlc3VsdFF1aXJrID0gZmFsc2U7Ci0gICAgQ2FtZXJhTWV0YWRhdGEgY29sbGVjdGVkUXVpcmtSZXN1bHQ7CiAKLSAgICAvLyBHZXQgY2FwdHVyZSB0aW1lc3RhbXAgZnJvbSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cywgd2hlcmUgaXQgd2FzIGFkZGVkCi0gICAgLy8gYnkgdGhlIHNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciB0aGlzIGZyYW1lLiBUaGVuIHVwZGF0ZSB0aGUgaW4tZmxpZ2h0Ci0gICAgLy8gc3RhdHVzIGFuZCByZW1vdmUgdGhlIGluLWZsaWdodCBlbnRyeSBpZiBhbGwgcmVzdWx0IGRhdGEgaGFzIGJlZW4KLSAgICAvLyByZWNlaXZlZC4KKyAgICAvLyBGb3IgSEFMMy4yIG9yIGFib3ZlLCBJZiBIQUwgZG9lc24ndCBzdXBwb3J0IHBhcnRpYWwsIGl0IG11c3QgYWx3YXlzIHNldAorICAgIC8vIHBhcnRpYWxfcmVzdWx0IHRvIDEgd2hlbiBtZXRhZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGlzIHJlc3VsdC4KKyAgICBpZiAoIW1Vc2VQYXJ0aWFsUmVzdWx0ICYmCisgICAgICAgICAgICBtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMiAmJgorICAgICAgICAgICAgcmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJgorICAgICAgICAgICAgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCAhPSAxKSB7CisgICAgICAgIFNFVF9FUlIoIlJlc3VsdCBpcyBtYWxmb3JtZWQgZm9yIGZyYW1lICVkOiBwYXJ0aWFsX3Jlc3VsdCAldSBtdXN0IGJlIDEiCisgICAgICAgICAgICAgICAgIiBpZiBwYXJ0aWFsIHJlc3VsdCBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOworICAgIENhbWVyYU1ldGFkYXRhIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7CisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CisgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlckluUmVxdWVzdCA9IGZhbHNlOworCisgICAgLy8gR2V0IGNhcHR1cmUgdGltZXN0YW1wIGFuZCByZXN1bHRFeHRyYXMgZnJvbSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cywKKyAgICAvLyB3aGVyZSBpdCB3YXMgYWRkZWQgYnkgdGhlIHNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciB0aGlzIGZyYW1lLgorICAgIC8vIFRoZW4gdXBkYXRlIHRoZSBpbi1mbGlnaHQgc3RhdHVzIGFuZCByZW1vdmUgdGhlIGluLWZsaWdodCBlbnRyeSBpZgorICAgIC8vIGFsbCByZXN1bHQgZGF0YSBoYXMgYmVlbiByZWNlaXZlZC4KICAgICBuc2Vjc190IHRpbWVzdGFtcCA9IDA7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKQEAgLTE2MDEsNzEgKzE5MjgsMTA4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyZXF1ZXN0ID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7CisgICAgICAgIEFMT0dWVigiJXM6IGdvdCBJbkZsaWdodFJlcXVlc3QgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcXVlc3QucmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgcmVxdWVzdC5yZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMuYnVyc3RJZCk7CisgICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgdGhlIHBhcnRpYWwgY291bnQgdG8gdGhlIGxhdGVzdCBvbmUuIFdoZW4gZnJhbWV3b3JrIGFnZ3JlZ2F0ZXMgYWRqYWNlbnQKKyAgICAgICAgLy8gcGFydGlhbCByZXN1bHRzIGludG8gb25lLCB0aGUgbGF0ZXN0IHBhcnRpYWwgY291bnQgd2lsbCBiZSB1c2VkLgorICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPSByZXN1bHQtPnBhcnRpYWxfcmVzdWx0OwogCiAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVzdWx0IGNhcnJpZXMgb25seSBwYXJ0aWFsIG1ldGFkYXRhCi0gICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdFF1aXJrICYmIHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IHBhcnRpYWxSZXN1bHRFbnRyeTsKLSAgICAgICAgICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlc3VsdC0+cmVzdWx0LAotICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwgJnBhcnRpYWxSZXN1bHRFbnRyeSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE5BTUVfTk9UX0ZPVU5EICYmCi0gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5jb3VudCA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmRhdGEudThbMF0gPT0KLSAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgewotICAgICAgICAgICAgICAgIC8vIEEgcGFydGlhbCByZXN1bHQuIEZsYWcgdGhpcyBhcyBzdWNoLCBhbmQgY29sbGVjdCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gc2V0IG9mIG1ldGFkYXRhIGludG8gdGhlIGluLWZsaWdodCBlbnRyeS4KLSAgICAgICAgICAgICAgICBwYXJ0aWFsUmVzdWx0UXVpcmsgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdC5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+cmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQuZXJhc2UoCi0gICAgICAgICAgICAgICAgICAgIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKKyAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0ICYmIHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQtPnBhcnRpYWxfcmVzdWx0ID4gbU51bVBhcnRpYWxSZXN1bHRzIHx8IHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlc3VsdCBpcyBtYWxmb3JtZWQgZm9yIGZyYW1lICVkOiBwYXJ0aWFsX3Jlc3VsdCAldSBtdXN0IGJlICBpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZSByYW5nZSBvZiBbMSwgJWRdIHdoZW4gbWV0YWRhdGEgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHJlc3VsdC0+cGFydGlhbF9yZXN1bHQsIG1OdW1QYXJ0aWFsUmVzdWx0cyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gKHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPCBtTnVtUGFydGlhbFJlc3VsdHMpOworICAgICAgICAgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdC5hcHBlbmQocmVzdWx0LT5yZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgcGFydGlhbFJlc3VsdEVudHJ5OworICAgICAgICAgICAgICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlc3VsdC0+cmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQsICZwYXJ0aWFsUmVzdWx0RW50cnkpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gTkFNRV9OT1RfRk9VTkQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5jb3VudCA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5kYXRhLnU4WzBdID09CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEEgcGFydGlhbCByZXN1bHQuIEZsYWcgdGhpcyBhcyBzdWNoLCBhbmQgY29sbGVjdCB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvZiBtZXRhZGF0YSBpbnRvIHRoZSBpbi1mbGlnaHQgZW50cnkuCisgICAgICAgICAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LmVyYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgICAgIC8vIEZpcmUgb2ZmIGEgM0Etb25seSByZXN1bHQgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmhhdmVTZW50M0EpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuaGF2ZVNlbnQzQSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcnRpYWwzQVF1aXJrKGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQpOworICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmhhdmVTZW50M0EpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmhhdmVTZW50M0EgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJ0aWFsM0FSZXN1bHQoZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHRpbWVzdGFtcCA9IHJlcXVlc3QuY2FwdHVyZVRpbWVzdGFtcDsKKyAgICAgICAgcmVzdWx0RXh0cmFzID0gcmVxdWVzdC5yZXN1bHRFeHRyYXM7CisgICAgICAgIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0ID0gcmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcjsKKwogICAgICAgICAvKioKICAgICAgICAgICogT25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBoYXBwZW4gYmVmb3JlIGl0J3MgbGVnYWwgdG8gY2FsbCBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0LAogICAgICAgICAgKiB1bmxlc3MgcGFydGlhbCBtZXRhZGF0YSBpcyBiZWluZyBwcm92aWRlZDoKICAgICAgICAgICogLSBDQU1FUkEzX01TR19TSFVUVEVSIChleHBlY3RlZCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbikKICAgICAgICAgICogLSBDQU1FUkEzX01TR19FUlJPUiAoZXhwZWN0ZWQgZHVyaW5nIGZsdXNoKQogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdFN0YXR1cyA9PSBPSyAmJiB0aW1lc3RhbXAgPT0gMCAmJiAhcGFydGlhbFJlc3VsdFF1aXJrKSB7CisgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgPT0gT0sgJiYgdGltZXN0YW1wID09IDAgJiYgIWlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgU0VUX0VSUigiQ2FsbGVkIGJlZm9yZSBzaHV0dGVyIG5vdGlmeSBmb3IgZnJhbWUgJWQiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICAvLyBEaWQgd2UgZ2V0IHRoZSAoZmluYWwpIHJlc3VsdCBtZXRhZGF0YSBmb3IgdGhpcyBjYXB0dXJlPwotICAgICAgICBpZiAocmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJiAhcGFydGlhbFJlc3VsdFF1aXJrKSB7CisgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSkgewogICAgICAgICAgICAgICAgIFNFVF9FUlIoIkNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIG1ldGFkYXRhIGZvciBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsgJiYKLSAgICAgICAgICAgICAgICAgICAgIXJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjb2xsZWN0ZWRRdWlya1Jlc3VsdC5hY3F1aXJlKAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQpOworICAgICAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0ICYmCisgICAgICAgICAgICAgICAgICAgICFyZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQuYWNxdWlyZSgKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0IC09IHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzOwotCisgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnNSZXR1cm5lZCA9IHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzOworICAgICAgICBpZiAocmVzdWx0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc1JldHVybmVkICs9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogSW5wdXQgYnVmZmVyIHNob3VsZCBiZSBOVUxMIGlmIHRoZXJlIGlzIG5vIGlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBidWZmZXIgc2VudCBpbiB0aGUgcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgLT0gbnVtQnVmZmVyc1JldHVybmVkOwogICAgICAgICBpZiAocmVxdWVzdC5udW1CdWZmZXJzTGVmdCA8IDApIHsKICAgICAgICAgICAgIFNFVF9FUlIoIlRvbyBtYW55IGJ1ZmZlcnMgcmV0dXJuZWQgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQ2hlY2sgaWYgZXZlcnl0aGluZyBoYXMgYXJyaXZlZCBmb3IgdGhpcyByZXN1bHQgKGJ1ZmZlcnMgYW5kIG1ldGFkYXRhKQotICAgICAgICBpZiAocmVxdWVzdC5oYXZlUmVzdWx0TWV0YWRhdGEgJiYgcmVxdWVzdC5udW1CdWZmZXJzTGVmdCA9PSAwKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGV2ZXJ5dGhpbmcgaGFzIGFycml2ZWQgZm9yIHRoaXMgcmVzdWx0IChidWZmZXJzIGFuZCBtZXRhZGF0YSksIHJlbW92ZSBpdCBmcm9tCisgICAgICAgIC8vIEluRmxpZ2h0TWFwIGlmIGJvdGggYXJyaXZlZCBvciBIQUwgcmVwb3J0cyBlcnJvciBmb3IgdGhpcyByZXF1ZXN0IChpLmUuIGR1cmluZyBmbHVzaCkuCisgICAgICAgIGlmICgocmVxdWVzdC5yZXF1ZXN0U3RhdHVzICE9IE9LKSB8fAorICAgICAgICAgICAgICAgIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSAmJiByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDApKSB7CiAgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJmcmFtZSBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgbUluRmxpZ2h0TWFwLnJlbW92ZUl0ZW1zQXQoaWR4LCAxKTsKICAgICAgICAgfQpAQCAtMTY3MywzMSArMjAzNywzMyBAQAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiB3ZSBoYXZlIHRvbyBtYW55IGluLWZsaWdodCBmcmFtZXMsIHNvbWV0aGluZyBoYXMKICAgICAgICAgLy8gbGlrZWx5IGdvbmUgd3JvbmcKICAgICAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPiBrSW5GbGlnaHRXYXJuTGltaXQpIHsKLSAgICAgICAgICAgIENMT0dFKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2U6ICVkIiwgbUluRmxpZ2h0TWFwLnNpemUoKSk7CisgICAgICAgICAgICBDTE9HRSgiSW4tZmxpZ2h0IGxpc3QgdG9vIGxhcmdlOiAlenUiLCBtSW5GbGlnaHRNYXAuc2l6ZSgpKTsKICAgICAgICAgfQogCiAgICAgfQogCiAgICAgLy8gUHJvY2VzcyB0aGUgcmVzdWx0IG1ldGFkYXRhLCBpZiBwcm92aWRlZAogICAgIGJvb2wgZ290UmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIXBhcnRpYWxSZXN1bHRRdWlyaykgeworICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwogCiAgICAgICAgIGdvdFJlc3VsdCA9IHRydWU7CiAKLSAgICAgICAgaWYgKGZyYW1lTnVtYmVyICE9IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlcgorICAgICAgICBpZiAoZnJhbWVOdW1iZXIgPCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJPdXQtb2Ytb3JkZXIgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgc3VibWl0dGVkISAiCiAgICAgICAgICAgICAgICAgICAgICIoZ290IGZyYW1lIG51bWJlciAlZCwgZXhwZWN0aW5nICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKys7CisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CiAKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY2FwdHVyZVJlc3VsdDsKLSAgICAgICAgY2FwdHVyZVJlc3VsdCA9IHJlc3VsdC0+cmVzdWx0OworICAgICAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CisgICAgICAgIGNhcHR1cmVSZXN1bHQubVJlc3VsdEV4dHJhcyA9IHJlc3VsdEV4dHJhczsKKyAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKIAotICAgICAgICBpZiAoY2FwdHVyZVJlc3VsdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSZmcmFtZU51bWJlciwgMSkgIT0gT0spIHsKKyAgICAgICAgaWYgKGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCisgICAgICAgICAgICAgICAgKGludDMyX3QqKSZmcmFtZU51bWJlciwgMSkgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBzZXQgZnJhbWUjIGluIG1ldGFkYXRhICglZCkiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICBnb3RSZXN1bHQgPSBmYWxzZTsKQEAgLTE3MDcsMzIgKzIwNzMsMzYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEFwcGVuZCBhbnkgcHJldmlvdXMgcGFydGlhbHMgdG8gZm9ybSBhIGNvbXBsZXRlIHJlc3VsdAotICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHRRdWlyayAmJiAhY29sbGVjdGVkUXVpcmtSZXN1bHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVzdWx0LmFwcGVuZChjb2xsZWN0ZWRRdWlya1Jlc3VsdCk7CisgICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdCAmJiAhY29sbGVjdGVkUGFydGlhbFJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLmFwcGVuZChjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0KTsKICAgICAgICAgfQogCi0gICAgICAgIGNhcHR1cmVSZXN1bHQuc29ydCgpOworICAgICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YS5zb3J0KCk7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSdzIGEgdGltZXN0YW1wIGluIHRoZSByZXN1bHQgbWV0YWRhdGEKIAogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPQotICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKICAgICAgICAgICAgIFNFVF9FUlIoIk5vIHRpbWVzdGFtcCBwcm92aWRlZCBieSBIQUwgZm9yIGZyYW1lICVkISIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIGdvdFJlc3VsdCA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYgKHRpbWVzdGFtcCAhPSBlbnRyeS5kYXRhLmk2NFswXSkgewogICAgICAgICAgICAgU0VUX0VSUigiVGltZXN0YW1wIG1pc21hdGNoIGJldHdlZW4gc2h1dHRlciBub3RpZnkgYW5kIHJlc3VsdCIKLSAgICAgICAgICAgICAgICAgICAgIiBtZXRhZGF0YSBmb3IgZnJhbWUgJWQgKCVsbGQgdnMgJWxsZCByZXNwZWN0aXZlbHkpIiwKKyAgICAgICAgICAgICAgICAgICAgIiBtZXRhZGF0YSBmb3IgZnJhbWUgJWQgKCUiIFBSSWQ2NCAiIHZzICUiIFBSSWQ2NCAiIHJlc3BlY3RpdmVseSkiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeS5kYXRhLmk2NFswXSk7CiAgICAgICAgICAgICBnb3RSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChnb3RSZXN1bHQpIHsKICAgICAgICAgICAgIC8vIFZhbGlkIHJlc3VsdCwgaW5zZXJ0IGludG8gcXVldWUKLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBxdWV1ZWRSZXN1bHQgPQotICAgICAgICAgICAgICAgICptUmVzdWx0UXVldWUuaW5zZXJ0KG1SZXN1bHRRdWV1ZS5lbmQoKSwgQ2FtZXJhTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICBxdWV1ZWRSZXN1bHQuc3dhcChjYXB0dXJlUmVzdWx0KTsKKyAgICAgICAgICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD46Oml0ZXJhdG9yIHF1ZXVlZFJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBDYXB0dXJlUmVzdWx0KGNhcHR1cmVSZXN1bHQpKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXM6IHJlc3VsdCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgcXVldWVkUmVzdWx0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgcXVldWVkUmVzdWx0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQpOwogICAgICAgICB9CiAgICAgfSAvLyBzY29wZSBmb3IgbU91dHB1dExvY2sKIApAQCAtMTc0NSwxMSArMjExNSwzMCBAQAogICAgICAgICAvLyBOb3RlOiBzdHJlYW0gbWF5IGJlIGRlYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQsIGlmIHRoaXMgYnVmZmVyIHdhcyB0aGUKICAgICAgICAgLy8gbGFzdCByZWZlcmVuY2UgdG8gaXQuCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW4ndCByZXR1cm4gYnVmZmVyICVkIGZvciBmcmFtZSAlZCB0byBpdHMgc3RyZWFtOiAiCisgICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciAlenUgZm9yIGZyYW1lICVkIHRvIGl0cyBzdHJlYW06ICIKICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgaSwgZnJhbWVOdW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHJlc3VsdC0+aW5wdXRfYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0KSB7CisgICAgICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPQorICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW06OmNhc3QocmVzdWx0LT5pbnB1dF9idWZmZXItPnN0cmVhbSk7CisgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybklucHV0QnVmZmVyKCoocmVzdWx0LT5pbnB1dF9idWZmZXIpKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzIHRoZQorICAgICAgICAgICAgLy8gbGFzdCByZWZlcmVuY2UgdG8gaXQuCisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0VGhyZWFkOiBDYW4ndCByZXR1cm4gaW5wdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKKyAgICAgICAgICAgICAgICAgICAgICAiICBpdHMgc3RyZWFtOiVzICglZCkiLCAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogSW5wdXQgYnVmZmVyIHNob3VsZCBiZSBOVUxMIGlmIHRoZXJlIGlzIG5vIGlucHV0IgorICAgICAgICAgICAgICAgICAgICAiIGJ1ZmZlciBzZW50IGluIHRoZSByZXF1ZXN0LCBza2lwcGluZyBpbnB1dCBidWZmZXIgcmV0dXJuLiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBGaW5hbGx5LCBzaWduYWwgYW55IHdhaXRlcnMgZm9yIG5ldyBmcmFtZXMKIAogICAgIGlmIChnb3RSZXN1bHQpIHsKQEAgLTE3NTgsOCArMjE0Nyw2IEBACiAKIH0KIAotCi0KIHZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5KGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZyAqbXNnKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXI7CkBAIC0xNzc1LDcyICsyMTYyLDExIEBACiAKICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkgewogICAgICAgICBjYXNlIENBTUVSQTNfTVNHX0VSUk9SOiB7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSAwOwotICAgICAgICAgICAgaWYgKG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmEzU3RyZWFtOjpjYXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0pOwotICAgICAgICAgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtLT5nZXRJZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlZDogJXM6IEhBTCBlcnJvciwgZnJhbWUgJWQsIHN0cmVhbSAlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICBtSWQsIF9fRlVOQ1RJT05fXywgbXNnLT5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlKTsKLQotICAgICAgICAgICAgLy8gU2V0IHJlcXVlc3QgZXJyb3Igc3RhdHVzIGZvciB0aGUgcmVxdWVzdCBpbiB0aGUgaW4tZmxpZ2h0IHRyYWNraW5nCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShtc2ctPm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCkucmVxdWVzdFN0YXR1cyA9IG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IobXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2ctPm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlFcnJvcihtc2ctPm1lc3NhZ2UuZXJyb3IsIGxpc3RlbmVyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQ0FNRVJBM19NU0dfU0hVVFRFUjogewotICAgICAgICAgICAgc3NpemVfdCBpZHg7Ci0gICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciA9IG1zZy0+bWVzc2FnZS5zaHV0dGVyLmZyYW1lX251bWJlcjsKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wID0gbXNnLT5tZXNzYWdlLnNodXR0ZXIudGltZXN0YW1wOwotICAgICAgICAgICAgLy8gVmVyaWZ5IG9yZGVyaW5nIG9mIHNodXR0ZXIgbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVOdW1iZXIgIT0gbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiU2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbiBmb3IgZnJhbWUgJWQsIGdvdCBmcmFtZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsIGZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdElkID0gLTE7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKLSAgICAgICAgICAgIC8vIGFuZCBnZXQgdGhlIHJlcXVlc3QgSUQgdG8gc2VuZCB1cHN0cmVhbQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwotICAgICAgICAgICAgICAgIGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KGZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7Ci0gICAgICAgICAgICAgICAgICAgIHIuY2FwdHVyZVRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkID0gci5yZXF1ZXN0SWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlkeCA8IDApIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3Igbm9uLWV4aXN0ZW50IGZyYW1lIG51bWJlciAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVlYoIkNhbWVyYSAlZDogJXM6IFNodXR0ZXIgZmlyZWQgZm9yIGZyYW1lICVkIChpZCAlZCkgYXQgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlciwgcmVxdWVzdElkLCB0aW1lc3RhbXApOwotICAgICAgICAgICAgLy8gQ2FsbCBsaXN0ZW5lciwgaWYgYW55Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlTaHV0dGVyKHJlcXVlc3RJZCwgdGltZXN0YW1wKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeVNodXR0ZXIobXNnLT5tZXNzYWdlLnNodXR0ZXIsIGxpc3RlbmVyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xODQ5LDYgKzIxNzUsMTIxIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeUVycm9yKGNvbnN0IGNhbWVyYTNfZXJyb3JfbXNnX3QgJm1zZywKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CisKKyAgICAvLyBNYXAgY2FtZXJhIEhBTCBlcnJvciBjb2RlcyB0byBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgZXJyb3IgY29kZXMKKyAgICAvLyBJbmRleCBpbnRvIHRoaXMgd2l0aCB0aGUgSEFMIGVycm9yIGNvZGUKKyAgICBzdGF0aWMgY29uc3QgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlCisgICAgICAgICAgICBoYWxFcnJvck1hcFtDQU1FUkEzX01TR19OVU1fRVJST1JTXSA9IHsKKyAgICAgICAgLy8gMCA9IFVudXNlZCBlcnJvciBjb2RlCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SLAorICAgICAgICAvLyAxID0gQ0FNRVJBM19NU0dfRVJST1JfREVWSUNFCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UsCisgICAgICAgIC8vIDIgPSBDQU1FUkEzX01TR19FUlJPUl9SRVFVRVNUCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAorICAgICAgICAvLyAzID0gQ0FNRVJBM19NU0dfRVJST1JfUkVTVUxUCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQsCisgICAgICAgIC8vIDQgPSBDQU1FUkEzX01TR19FUlJPUl9CVUZGRVIKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUgorICAgIH07CisKKyAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlID0KKyAgICAgICAgICAgICgobXNnLmVycm9yX2NvZGUgPj0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1zZy5lcnJvcl9jb2RlIDwgQ0FNRVJBM19NU0dfTlVNX0VSUk9SUykpID8KKyAgICAgICAgICAgIGhhbEVycm9yTWFwW21zZy5lcnJvcl9jb2RlXSA6CisgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUjsKKworICAgIGludCBzdHJlYW1JZCA9IDA7CisgICAgaWYgKG1zZy5lcnJvcl9zdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPQorICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW06OmNhc3QobXNnLmVycm9yX3N0cmVhbSk7CisgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtLT5nZXRJZCgpOworICAgIH0KKyAgICBBTE9HVigiQ2FtZXJhICVkOiAlczogSEFMIGVycm9yLCBmcmFtZSAlZCwgc3RyZWFtICVkOiAlZCIsCisgICAgICAgICAgICBtSWQsIF9fRlVOQ1RJT05fXywgbXNnLmZyYW1lX251bWJlciwKKyAgICAgICAgICAgIHN0cmVhbUlkLCBtc2cuZXJyb3JfY29kZSk7CisKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0U6CisgICAgICAgICAgICAvLyBTRVRfRVJSIGNhbGxzIG5vdGlmeUVycm9yCisgICAgICAgICAgICBTRVRfRVJSKCJDYW1lcmEgSEFMIHJlcG9ydGVkIHNlcmlvdXMgZGV2aWNlIGVycm9yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUOgorICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CisgICAgICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7CisgICAgICAgICAgICAgICAgICAgIHIucmVxdWVzdFN0YXR1cyA9IG1zZy5lcnJvcl9jb2RlOworICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMgPSByLnJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBtc2cuZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVkOiAlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IHJlcXVlc3Qgb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZSAlIiBQUklkNjQgIiBlcnJvciIsIG1JZCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVkOiAlczogbm8gbGlzdGVuZXIgYXZhaWxhYmxlIiwgbUlkLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBTRVRfRVJSIGNhbGxzIG5vdGlmeUVycm9yCisgICAgICAgICAgICBTRVRfRVJSKCJVbmtub3duIGVycm9yIG1lc3NhZ2UgZnJvbSBIQUw6ICVkIiwgbXNnLmVycm9yX2NvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeVNodXR0ZXIoY29uc3QgY2FtZXJhM19zaHV0dGVyX21zZ190ICZtc2csCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcikgeworICAgIHNzaXplX3QgaWR4OworICAgIC8vIFZlcmlmeSBvcmRlcmluZyBvZiBzaHV0dGVyIG5vdGlmaWNhdGlvbnMKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlci4KKyAgICAgICAgaWYgKG1zZy5mcmFtZV9udW1iZXIgPCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgeworICAgICAgICAgICAgU0VUX0VSUigiU2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICJub3RpZmljYXRpb24gZm9yIGZyYW1lICVkLCBnb3QgZnJhbWUgJWQiLAorICAgICAgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwgbXNnLmZyYW1lX251bWJlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIgPSBtc2cuZnJhbWVfbnVtYmVyICsgMTsKKyAgICB9CisKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKworICAgIC8vIFNldCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKKyAgICAvLyBhbmQgZ2V0IHRoZSByZXF1ZXN0IElEIHRvIHNlbmQgdXBzdHJlYW0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOworICAgICAgICBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIHIuY2FwdHVyZVRpbWVzdGFtcCA9IG1zZy50aW1lc3RhbXA7CisgICAgICAgICAgICByZXN1bHRFeHRyYXMgPSByLnJlc3VsdEV4dHJhczsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3Igbm9uLWV4aXN0ZW50IGZyYW1lIG51bWJlciAlZCIsCisgICAgICAgICAgICAgICAgbXNnLmZyYW1lX251bWJlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1ZWKCJDYW1lcmEgJWQ6ICVzOiBTaHV0dGVyIGZpcmVkIGZvciBmcmFtZSAlZCAoaWQgJWQpIGF0ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbXNnLmZyYW1lX251bWJlciwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbXNnLnRpbWVzdGFtcCk7CisgICAgLy8gQ2FsbCBsaXN0ZW5lciwgaWYgYW55CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeVNodXR0ZXIocmVzdWx0RXh0cmFzLCBtc2cudGltZXN0YW1wKTsKKyAgICB9Cit9CisKKwogQ2FtZXJhTWV0YWRhdGEgQ2FtZXJhM0RldmljZTo6Z2V0TGF0ZXN0UmVxdWVzdExvY2tlZCgpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0xODYxLDYgKzIzMDIsNyBAQAogICAgIHJldHVybiByZXRWYWw7CiB9CiAKKwogLyoqCiAgKiBSZXF1ZXN0VGhyZWFkIGlubmVyIGNsYXNzIG1ldGhvZHMKICAqLwpAQCAtMTg3NywxOSArMjMxOSw0MCBAQAogICAgICAgICBtRG9QYXVzZShmYWxzZSksCiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCiAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKLSAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCkgeworICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKKyAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKKyAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkKDApLAorICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyKE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTKSB7CiAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0Tm90aWZ5Q2FsbGJhY2soCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y29uZmlndXJhdGlvbkNvbXBsZXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlY29uZmlndXJlZCA9IHRydWU7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnF1ZXVlUmVxdWVzdCgKLSAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpxdWV1ZVJlcXVlc3RMaXN0KAorICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+ICZyZXF1ZXN0cywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwotICAgIG1SZXF1ZXN0UXVldWUucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsKKyAgICAgICAgICAgICsraXQpIHsKKyAgICAgICAgbVJlcXVlc3RRdWV1ZS5wdXNoX2JhY2soKml0KTsKKyAgICB9CisKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1GcmFtZU51bWJlciArIG1SZXF1ZXN0UXVldWUuc2l6ZSgpIC0gMTsKKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgJWQsIG1GcmFtZU51bWJlciAlIiBQUklkMzIgIiwgbGFzdEZyYW1lTnVtYmVyICUiIFBSSWQ2NCAiLiIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKCoocmVxdWVzdHMuYmVnaW4oKSkpLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAqbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CiAKICAgICB1bnBhdXNlRm9yTmV3UmVxdWVzdHMoKTsKIApAQCAtMTk1MywyOCArMjQxNiw3MiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXRSZXBlYXRpbmdSZXF1ZXN0cygKLSAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzKSB7CisgICAgICAgIGNvbnN0IFJlcXVlc3RMaXN0ICZyZXF1ZXN0cywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKKyAgICB9CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmluc2VydChtUmVwZWF0aW5nUmVxdWVzdHMuYmVnaW4oKSwKICAgICAgICAgICAgIHJlcXVlc3RzLmJlZ2luKCksIHJlcXVlc3RzLmVuZCgpKTsKIAogICAgIHVucGF1c2VGb3JOZXdSZXF1ZXN0cygpOwogCisgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpIHsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6aXNSZXBlYXRpbmdSZXF1ZXN0TG9ja2VkKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0SW4pIHsKKyAgICBpZiAobVJlcGVhdGluZ1JlcXVlc3RzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IHJlcXVlc3RJZCA9IHJlcXVlc3RJbi0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcGVhdFJlcXVlc3RzID0gbVJlcGVhdGluZ1JlcXVlc3RzOworICAgIC8vIEFsbCByZXBlYXRpbmcgcmVxdWVzdHMgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBzYW1lIGlkIHNvIG9ubHkgY2hlY2sgZmlyc3QgcXVlc3QKKyAgICBjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4gZmlyc3RSZXF1ZXN0ID0gKnJlcGVhdFJlcXVlc3RzLmJlZ2luKCk7CisgICAgcmV0dXJuIChmaXJzdFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkID09IHJlcXVlc3RJZCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOworICAgIH0KKyAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVM7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhcigpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyKAorICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIsCisgICAgICAgIC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIEFMT0dWKCJSZXF1ZXN0VGhyZWFkOjolczoiLCBfX0ZVTkNUSU9OX18pOworCiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisKKyAgICAvLyBTZW5kIGVycm9ycyBmb3IgYWxsIHJlcXVlc3RzIHBlbmRpbmcgaW4gdGhlIHJlcXVlc3QgcXVldWUsIGluY2x1ZGluZworICAgIC8vIHBlbmRpbmcgcmVwZWF0aW5nIHJlcXVlc3RzCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChSZXF1ZXN0TGlzdDo6aXRlcmF0b3IgaXQgPSBtUmVxdWVzdFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIGl0ICE9IG1SZXF1ZXN0UXVldWUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgZnJhbWUgbnVtYmVyIHRoaXMgcmVxdWVzdCB3b3VsZCBoYXZlIGhhZCwgaWYgaXQKKyAgICAgICAgICAgIC8vIGhhZCBiZWVuIHN1Ym1pdHRlZDsgdGhpcyBmcmFtZSBudW1iZXIgd2lsbCBub3QgYmUgcmV1c2VkLgorICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RJZCBhbmQgYnVyc3RJZCBmaWVsZHMgd2VyZSBzZXQgd2hlbiB0aGUgcmVxdWVzdCB3YXMKKyAgICAgICAgICAgIC8vIHN1Ym1pdHRlZCBvcmlnaW5hbGx5IChpbiBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCkKKyAgICAgICAgICAgICgqaXQpLT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICgqaXQpLT5tUmVzdWx0RXh0cmFzKTsKKyAgICAgICAgfQorICAgIH0KICAgICBtUmVxdWVzdFF1ZXVlLmNsZWFyKCk7CiAgICAgbVRyaWdnZXJNYXAuY2xlYXIoKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisgICAgfQorICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIwMjYsNiArMjUzMyw3IEBACiAKICAgICAvLyBDcmVhdGUgcmVxdWVzdCB0byBIQUwKICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IHJlcXVlc3QgPSBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KCk7CisgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIgPSBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnM7CiAKICAgICAvLyBHZXQgdGhlIHJlcXVlc3QgSUQsIGlmIGFueQpAQCAtMjA0Niw3ICsyNTU0LDcgQEAKICAgICBpZiAocmVzIDwgMCkgewogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IHRyaWdnZXJzICIKICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgKG1GcmFtZU51bWJlcisxKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yMDY0LDcgKzI1NzIsNyBAQAogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IGR1bW15IHRyaWdnZXIgSURzICIKICAgICAgICAgICAgICAgICAgICAgIihjYXB0dXJlIHJlcXVlc3QgJWQsIEhBTCBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAobUZyYW1lTnVtYmVyKzEpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yMDg4LDcgKzI1OTYsNyBAQAogICAgICAgICAgICAgaWYgKGUuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0IChmcmFtZSBudW0gJWQpIGhhZCBBRiB0cmlnZ2VyIDB4JXgiLAogICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVOdW1iZXIrMSwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGEudThbMF0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMDk5LDYgKzI2MDcsNyBAQAogICAgIH0KIAogICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOworICAgIHVpbnQzMl90IHRvdGFsTnVtQnVmZmVycyA9IDA7CiAKICAgICAvLyBGaWxsIGluIGJ1ZmZlcnMKIApAQCAtMjEwNiwxMSArMjYxNSwyMSBAQAogICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlciA9ICZpbnB1dEJ1ZmZlcjsKICAgICAgICAgcmVzID0gbmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+Z2V0SW5wdXRCdWZmZXIoJmlucHV0QnVmZmVyKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bworICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkIHF1ZXVlIG9yIG90aGVyIHByb2R1Y2VyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgLy8gZXJyb3IKICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgdG90YWxOdW1CdWZmZXJzICs9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmVxdWVzdC5pbnB1dF9idWZmZXIgPSBOVUxMOwogICAgIH0KQEAgLTIxMjIsMjYgKzI2NDEsNDEgQEAKICAgICAgICAgcmVzID0gbmV4dFJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPgogICAgICAgICAgICAgICAgIGdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGkpKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KKyAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKKyAgICAgICAgICAgIC8vIGVycm9yCiAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXF1ZXN0Lm51bV9vdXRwdXRfYnVmZmVycysrOwogICAgIH0KLQotICAgIHJlcXVlc3QuZnJhbWVfbnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgdG90YWxOdW1CdWZmZXJzICs9IHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzOwogCiAgICAgLy8gTG9nIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCBxdWV1ZQogICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgeworICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiwgYW5kIG5vd2hlcmUgdG8gc2VuZCBlcnJvcnMgdG8sIHNvIGp1c3QgbG9nIGl0CiAgICAgICAgIENMT0dFKCJSZXF1ZXN0VGhyZWFkOiBQYXJlbnQgaXMgZ29uZSIpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQocmVxdWVzdC5mcmFtZV9udW1iZXIsIHJlcXVlc3RJZCwKLSAgICAgICAgICAgIHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzKTsKKyAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQocmVxdWVzdC5mcmFtZV9udW1iZXIsCisgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgLypoYXNJbnB1dCovcmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCk7CisgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CisgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHJlZ2lzdGVyIG5ldyBpbi1mbGlnaHQgcmVxdWVzdDoiCiAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0yMTY0LDYgKzI2OTgsOSBAQAogICAgIEFUUkFDRV9FTkQoKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gU2hvdWxkIG9ubHkgZ2V0IGEgZmFpbHVyZSBoZXJlIGZvciBtYWxmb3JtZWQgcmVxdWVzdHMgb3IgZGV2aWNlLWxldmVsCisgICAgICAgIC8vIGVycm9ycywgc28gY29uc2lkZXIgYWxsIGVycm9ycyBmYXRhbC4gIEJhZCBtZXRhZGF0YSBmYWlsdXJlcyBzaG91bGQKKyAgICAgICAgLy8gY29tZSB0aHJvdWdoIG5vdGlmeS4KICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgJWQgdG8gSEFMIgogICAgICAgICAgICAgICAgICIgZGV2aWNlOiAlcyAoJWQpIiwgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CkBAIC0yMTkyLDIxICsyNzI5LDYgQEAKICAgICB9CiAgICAgbVByZXZUcmlnZ2VycyA9IHRyaWdnZXJDb3VudDsKIAotICAgIC8vIFJldHVybiBpbnB1dCBidWZmZXIgYmFjayB0byBmcmFtZXdvcmsKLSAgICBpZiAocmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCkgewotICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPQotICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXF1ZXN0LmlucHV0X2J1ZmZlci0+c3RyZWFtKTsKLSAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcigqKHJlcXVlc3QuaW5wdXRfYnVmZmVyKSk7Ci0gICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzIHRoZQotICAgICAgICAvLyBsYXN0IHJlZmVyZW5jZSB0byBpdC4KLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0VGhyZWFkOiBDYW4ndCByZXR1cm4gaW5wdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKLSAgICAgICAgICAgICAgICAgICAgIiAgaXRzIHN0cmVhbTolcyAoJWQpIiwgIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgLy8gVE9ETzogUmVwb3J0IGVycm9yIHVwc3RyZWFtCi0gICAgICAgIH0KLSAgICB9Ci0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjIxOCw2ICsyNzQwLDcgQEAKICAgICByZXR1cm4gbUxhdGVzdFJlcXVlc3Q7CiB9CiAKKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhblVwRmFpbGVkUmVxdWVzdCgKICAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAmcmVxdWVzdCwKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZuZXh0UmVxdWVzdCwKQEAgLTIyNTksNiArMjc4Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICsrZmlyc3RSZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cy5lbmQoKSk7CiAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHdhaXQgYW55IGxvbmdlcgorCisgICAgICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyICsgcmVxdWVzdHMuc2l6ZSgpIC0gMTsKKwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjMxMCw2ICsyODM2LDExIEBACiAgICAgICAgIG1SZWNvbmZpZ3VyZWQgPSBmYWxzZTsKICAgICB9CiAKKyAgICBpZiAobmV4dFJlcXVlc3QgIT0gTlVMTCkgeworICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IG1GcmFtZU51bWJlcisrOworICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZCA9IG1DdXJyZW50QWZUcmlnZ2VySWQ7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQgPSBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQ7CisgICAgfQogICAgIHJldHVybiBuZXh0UmVxdWVzdDsKIH0KIApAQCAtMjM3MiwxMyArMjkwMywzNCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1UcmlnZ2VyTXV0ZXgpOwogCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgIENMT0dFKCJSZXF1ZXN0VGhyZWFkOiBQYXJlbnQgaXMgZ29uZSIpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCiAgICAgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gcmVxdWVzdC0+bVNldHRpbmdzOwogICAgIHNpemVfdCBjb3VudCA9IG1UcmlnZ2VyTWFwLnNpemUoKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICBSZXF1ZXN0VHJpZ2dlciB0cmlnZ2VyID0gbVRyaWdnZXJNYXAudmFsdWVBdChpKTsKLQogICAgICAgICB1aW50MzJfdCB0YWcgPSB0cmlnZ2VyLm1ldGFkYXRhVGFnOworCisgICAgICAgIGlmICh0YWcgPT0gQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQgfHwgdGFnID09IEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lEKSB7CisgICAgICAgICAgICBib29sIGlzQWVUcmlnZ2VyID0gKHRyaWdnZXIubWV0YWRhdGFUYWcgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQpOworICAgICAgICAgICAgdWludDMyX3QgdHJpZ2dlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRyaWdnZXIuZW50cnlWYWx1ZSk7CisgICAgICAgICAgICBpZiAoaXNBZVRyaWdnZXIpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkID0gdHJpZ2dlcklkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkID0gdHJpZ2dlcklkOworICAgICAgICAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyZW50LT5tRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUcmlnZ2VyIElEIHRhZyBpcyBkZXByZWNhdGVkIHNpbmNlIGRldmljZSBIQUwgMy4yCisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKHRhZyk7CiAKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCA0NjhmNjQxLi5lYzZiYmExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCkBAIC01NCw3ICs1Niw3IEBACiB9CiAKIC8qKgotICogQ2FtZXJhRGV2aWNlIGZvciBIQUwgZGV2aWNlcyB3aXRoIHZlcnNpb24gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAKKyAqIENhbWVyYURldmljZSBmb3IgSEFMIGRldmljZXMgd2l0aCB2ZXJzaW9uIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIG9yIGhpZ2hlci4KICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKQEAgLTc4LDkgKzgwLDE0IEBACiAKICAgICAvLyBDYXB0dXJlIGFuZCBzZXRTdHJlYW1pbmdSZXF1ZXN0IHdpbGwgY29uZmlndXJlIHN0cmVhbXMgaWYgY3VycmVudGx5IGluCiAgICAgLy8gaWRsZSBzdGF0ZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KTsKIApAQCAtODgsOCArOTUsNyBAQAogICAgIC8vIElmIGFkZGluZyBzdHJlYW1zIHdoaWxlIGFjdGl2ZWx5IGNhcHR1cmluZywgd2lsbCBwYXVzZSBkZXZpY2UgYmVmb3JlIGFkZGluZwogICAgIC8vIHN0cmVhbSwgcmVjb25maWd1cmluZyBkZXZpY2UsIGFuZCB1bnBhdXNpbmcuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCAqaWQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSgKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBpbnQgKmlkKTsKQEAgLTEwOCw2ICsxMTQsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVSZXByb2Nlc3NTdHJlYW0oaW50IGlkKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOwogCiAgICAgLy8gVHJhbnNpdGlvbnMgdG8gdGhlIGlkbGUgc3RhdGUgb24gc3VjY2VzcwpAQCAtMTE2LDcgKzEyNCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgd2lsbE5vdGlmeTNBKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0Rm9yTmV4dEZyYW1lKG5zZWNzX3QgdGltZW91dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyQXV0b2ZvY3VzKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJDYW5jZWxBdXRvZm9jdXModWludDMyX3QgaWQpOwpAQCAtMTI1LDcgKzEzMywxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHVzaFJlcHJvY2Vzc0J1ZmZlcihpbnQgcmVwcm9jZXNzU3RyZWFtSWQsCiAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgd3A8QnVmZmVyUmVsZWFzZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZVZlcnNpb24oKTsKKworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdDsKIAogICAgIC8vIE1ldGhvZHMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMKICAgICB2b2lkICAgICAgICAgICAgIG5vdGlmeVN0YXR1cyhib29sIGlkbGUpOyAvLyB1cGRhdGVzIGZyb20gU3RhdHVzVHJhY2tlcgpAQCAtMTM3LDYgKzE0OSwxMCBAQAogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtTaHV0ZG93blRpbWVvdXQgICA9IDUwMDAwMDAwMDA7IC8vIDUgc2VjCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0FjdGl2ZVRpbWVvdXQgICAgID0gNTAwMDAwMDAwOyAgLy8gNTAwIG1zCiAgICAgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFRyaWdnZXI7CisgICAgLy8gbWluaW1hbCBqcGVnIGJ1ZmZlciBzaXplOiAyNTZLQiArIGJsb2IgaGVhZGVyCisgICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0gMjU2ICogMTAyNCArIHNpemVvZihjYW1lcmEzX2pwZWdfYmxvYik7CisgICAgLy8gQ29uc3RhbnQgdG8gdXNlIGZvciBzdHJlYW0gSUQgd2hlbiBvbmUgZG9lc24ndCBleGlzdAorICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgICAgIE5PX1NUUkVBTSA9IC0xOwogCiAgICAgLy8gQSBsb2NrIHRvIGVuZm9yY2Ugc2VyaWFsaXphdGlvbiBvbiB0aGUgaW5wdXQvY29uZmlndXJlIHNpZGUKICAgICAvLyBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KQEAgLTE1Nyw3ICsxNzMsMTAgQEAKICAgICBjYW1lcmEzX2RldmljZV90ICAgICAgICAgICptSGFsM0RldmljZTsKIAogICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgIG1EZXZpY2VJbmZvOwotICAgIHZlbmRvcl90YWdfcXVlcnlfb3BzX3QgICAgIG1WZW5kb3JUYWdPcHM7CisKKyAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICAgICBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbQ0FNRVJBM19URU1QTEFURV9DT1VOVF07CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBtRGV2aWNlVmVyc2lvbjsKIAogICAgIGVudW0gU3RhdHVzIHsKICAgICAgICAgU1RBVFVTX0VSUk9SLApAQCAtMTgxLDYgKzIwMCw4IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTdHJlYW1JZDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtTmVlZENvbmZpZzsKIAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1teVN0cmVhbUlkOworCiAgICAgLy8gV2hldGhlciB0byBzZW5kIHN0YXRlIHVwZGF0ZXMgdXBzdHJlYW0KICAgICAvLyBQYXVzZSB3aGVuIGRvaW5nIHRyYW5zcGFyZW50IHJlY29uZmlndXJhdGlvbgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1QYXVzZVN0YXRlTm90aWZ5OwpAQCAtMTg4LDggKzIwOSwxMSBAQAogICAgIC8vIE5lZWQgdG8gaG9sZCBvbiB0byBzdHJlYW0gcmVmZXJlbmNlcyB1bnRpbCBjb25maWd1cmUgY29tcGxldGVzLgogICAgIFZlY3RvcjxzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiA+IG1EZWxldGVkU3RyZWFtczsKIAotICAgIC8vIFdoZXRoZXIgcXVpcmsgQU5EUk9JRF9RVUlSS1NfVVNFX1BBUlRJQUxfUkVTVUxUIGlzIGVuYWJsZWQKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdFF1aXJrOworICAgIC8vIFdoZXRoZXIgdGhlIEhBTCB3aWxsIHNlbmQgcGFydGlhbCByZXN1bHQKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdDsKKworICAgIC8vIE51bWJlciBvZiBwYXJ0aWFsIHJlc3VsdHMgdGhhdCB3aWxsIGJlIGRlbGl2ZXJlZCBieSB0aGUgSEFMLgorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0czsKIAogICAgIC8qKioqIEVuZCBzY29wZSBmb3IgbUxvY2sgKioqKi8KIApAQCAtMTk5LDkgKzIyMywyMCBAQAogICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiAgICAgICAgICBtSW5wdXRTdHJlYW07CiAgICAgICAgIFZlY3RvcjxzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zOworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICAgICAgICAgICAgICAgICBtUmVzdWx0RXh0cmFzOwogICAgIH07CiAgICAgdHlwZWRlZiBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IFJlcXVlc3RMaXN0OwogCisgICAgc3RhdHVzX3QgY2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpOworCisgICAgc3RhdHVzX3QgY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmbWV0YWRhdGFMaXN0LAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KTsKKworICAgIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RzSGVscGVyKGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywgYm9vbCByZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGxhc3QgcmVxdWVzdCBzdWJtaXR0ZWQgdG8gdGhlIGhhbCBieSB0aGUgcmVxdWVzdCB0aHJlYWQuCiAgICAgICoKQEAgLTIzNyw2ICsyNzIsMTMgQEAKICAgICBzdGF0dXNfdCB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soYm9vbCBhY3RpdmUsIG5zZWNzX3QgdGltZW91dCk7CiAKICAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB3YWl0VW50aWxEcmFpbmVkLiBPbiBzdWNjZXNzLCB3aWxsIHRyYW5zaXRpb24gdG8gSURMRSBzdGF0ZS4KKyAgICAgKgorICAgICAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggbUxvY2sgYW5kIG1JbnRlcmZhY2VMb2NrIGhlbGQuCisgICAgICovCisgICAgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworCisgICAgLyoqCiAgICAgICogRG8gY29tbW9uIHdvcmsgZm9yIHNldHRpbmcgdXAgYSBzdHJlYW1pbmcgb3Igc2luZ2xlIGNhcHR1cmUgcmVxdWVzdC4KICAgICAgKiBPbiBzdWNjZXNzLCB3aWxsIHRyYW5zaXRpb24gdG8gQUNUSVZFIGlmIGluIElETEUuCiAgICAgICovCkBAIC0yNTUsNiArMjk3LDE3IEBACiAgICAgc3RhdHVzX3QgICAgICAgICAgIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKTsKIAogICAgIC8qKgorICAgICAqIEFkZCBhIGR1bW15IHN0cmVhbSB0byB0aGUgY3VycmVudCBzdHJlYW0gc2V0IGFzIGEgd29ya2Fyb3VuZCBmb3IKKyAgICAgKiBub3QgYWxsb3dpbmcgMCBzdHJlYW1zIGluIHRoZSBjYW1lcmEgSEFMIHNwZWMuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgIGFkZER1bW15U3RyZWFtTG9ja2VkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBkdW1teSBzdHJlYW0gaWYgdGhlIGN1cnJlbnQgY29uZmlnIGluY2x1ZGVzIHJlYWwgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgdHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKTsKKworICAgIC8qKgogICAgICAqIFNldCBkZXZpY2UgaW50byBhbiBlcnJvciBzdGF0ZSBkdWUgdG8gc29tZSBmYXRhbCBmYWlsdXJlLCBhbmQgc2V0IGFuCiAgICAgICogZXJyb3IgbWVzc2FnZSB0byBpbmRpY2F0ZSB3aHkuIE9ubHkgdGhlIGZpcnN0IGNhbGwncyBtZXNzYWdlIHdpbGwgYmUKICAgICAgKiB1c2VkLiBUaGUgbWVzc2FnZSBpcyBhbHNvIHNlbnQgdG8gdGhlIGxvZy4KQEAgLTI3MCw2ICszMjMsMTggQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgICAgdHJ5TG9ja1NwaW5SaWdodFJvdW5kKE11dGV4JiBsb2NrKTsKIAorICAgIHN0cnVjdCBTaXplIHsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAgICBpbnQgaGVpZ2h0OworICAgICAgICBTaXplKGludCB3LCBpbnQgaCkgOiB3aWR0aCh3KSwgaGVpZ2h0KGgpe30KKyAgICB9OworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGFyZ2VzdCBKcGVnIHJlc29sdXRpb24gKGluIGFyZWEpCisgICAgICogUmV0dXJuIFNpemUoMCwgMCkgaWYgc3RhdGljIG1ldGF0ZGF0YSBpcyBpbnZhbGlkCisgICAgICovCisgICAgU2l6ZSBnZXRNYXhKcGVnUmVzb2x1dGlvbigpIGNvbnN0OworCiAgICAgc3RydWN0IFJlcXVlc3RUcmlnZ2VyIHsKICAgICAgICAgLy8gTWV0YWRhdGEgdGFnIG51bWJlciwgZS5nLiBhbmRyb2lkLmNvbnRyb2wuYWVQcmVjYXB0dXJlVHJpZ2dlcgogICAgICAgICB1aW50MzJfdCBtZXRhZGF0YVRhZzsKQEAgLTI5OCw2ICszNjMsOCBAQAogICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCiAgICAgICAgICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqaGFsM0RldmljZSk7CiAKKyAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKKwogICAgICAgICAvKioKICAgICAgICAgICogQ2FsbCBhZnRlciBzdHJlYW0gKHJlKS1jb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlZC4KICAgICAgICAgICovCkBAIC0zMDgsMTUgKzM3NSwyMiBAQAogICAgICAgICAgKiBvbiBlaXRoZXIuIFVzZSB3YWl0VW50aWxQYXVzZWQgdG8gd2FpdCB1bnRpbCByZXF1ZXN0IHF1ZXVlCiAgICAgICAgICAqIGhhcyBlbXB0aWVkIG91dC4KICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzKGNvbnN0IFJlcXVlc3RMaXN0JiByZXF1ZXN0cyk7Ci0gICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHMoY29uc3QgUmVxdWVzdExpc3QmIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCBjbGVhclJlcGVhdGluZ1JlcXVlc3RzKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAotICAgICAgICBzdGF0dXNfdCBxdWV1ZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QpOworICAgICAgICBzdGF0dXNfdCBxdWV1ZVJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUmVtb3ZlIGFsbCBxdWV1ZWQgYW5kIHJlcGVhdGluZyByZXF1ZXN0cywgYW5kIHBlbmRpbmcgdHJpZ2dlcnMKICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IGNsZWFyKCk7CisgICAgICAgIHN0YXR1c190IGNsZWFyKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUXVldWUgYSB0cmlnZ2VyIHRvIGJlIGRpc3BhdGNoZWQgd2l0aCB0aGUgbmV4dCBvdXRnb2luZwpAQCAtMzkxLDEwICs0NjUsMTUgQEAKICAgICAgICAgLy8gUmVsYXkgZXJyb3IgdG8gcGFyZW50IGRldmljZSBvYmplY3Qgc2V0RXJyb3JTdGF0ZQogICAgICAgICB2b2lkICAgICAgICAgICAgICAgc2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IHJlcXVlc3QgaXMgaW4gbVJlcGVhdGluZ1JlcXVlc3RzLiBNdXN0IGJlIGNhbGxlZCB3aXRoIG1SZXF1ZXN0TG9jayBob2xkCisgICAgICAgIGJvb2wgaXNSZXBlYXRpbmdSZXF1ZXN0TG9ja2VkKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0Pik7CisKICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gIG1QYXJlbnQ7CiAgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+ICBtU3RhdHVzVHJhY2tlcjsKICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAgKm1IYWwzRGV2aWNlOwogCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICptTGlzdGVuZXI7CisKICAgICAgICAgY29uc3QgaW50ICAgICAgICAgIG1JZDsgICAgICAgLy8gVGhlIGNhbWVyYSBJRAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgbVN0YXR1c0lkOyAvLyBUaGUgUmVxdWVzdFRocmVhZCdzIGNvbXBvbmVudCBJRCBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdHVzIHRyYWNraW5nCkBAIC00MjksNiArNTA4LDEwIEBACiAgICAgICAgIFRyaWdnZXJNYXAgICAgICAgICBtVHJpZ2dlck1hcDsKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyUmVtb3ZlZE1hcDsKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyUmVwbGFjZWRNYXA7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkOworCisgICAgICAgIGludDY0X3QgICAgICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOwogICAgIH07CiAgICAgc3A8UmVxdWVzdFRocmVhZD4gbVJlcXVlc3RUaHJlYWQ7CiAKQEAgLTQzNyw3MSArNTIwLDkwIEBACiAgICAgICovCiAKICAgICBzdHJ1Y3QgSW5GbGlnaHRSZXF1ZXN0IHsKLSAgICAgICAgLy8gYW5kcm9pZC5yZXF1ZXN0LmlkIGZvciB0aGUgcmVxdWVzdAotICAgICAgICBpbnQgICAgIHJlcXVlc3RJZDsKICAgICAgICAgLy8gU2V0IGJ5IG5vdGlmeSgpIFNIVVRURVIgY2FsbC4KICAgICAgICAgbnNlY3NfdCBjYXB0dXJlVGltZXN0YW1wOwogICAgICAgICBpbnQgICAgIHJlcXVlc3RTdGF0dXM7CiAgICAgICAgIC8vIFNldCBieSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IGNhbGwgd2l0aCB2YWxpZCBtZXRhZGF0YQogICAgICAgICBib29sICAgIGhhdmVSZXN1bHRNZXRhZGF0YTsKICAgICAgICAgLy8gRGVjcmVtZW50ZWQgYnkgY2FsbHMgdG8gcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCB3aXRoIHZhbGlkIG91dHB1dAotICAgICAgICAvLyBidWZmZXJzCisgICAgICAgIC8vIGFuZCBpbnB1dCBidWZmZXJzCiAgICAgICAgIGludCAgICAgbnVtQnVmZmVyc0xlZnQ7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgICAgICAvLyBJZiB0aGlzIHJlcXVlc3QgaGFzIGFueSBpbnB1dCBidWZmZXIKKyAgICAgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlcjsKIAotICAgICAgICAvLyBGaWVsZHMgdXNlZCBieSB0aGUgcGFydGlhbCByZXN1bHQgcXVpcmsgb25seQotICAgICAgICBzdHJ1Y3QgUGFydGlhbFJlc3VsdFF1aXJrSW5GbGlnaHQgeworICAgICAgICAvLyBGaWVsZHMgdXNlZCBieSB0aGUgcGFydGlhbCByZXN1bHQgb25seQorICAgICAgICBzdHJ1Y3QgUGFydGlhbFJlc3VsdEluRmxpZ2h0IHsKICAgICAgICAgICAgIC8vIFNldCBieSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IG9uY2UgM0EgaGFzIGJlZW4gc2VudCB0byBjbGllbnRzCiAgICAgICAgICAgICBib29sICAgIGhhdmVTZW50M0E7CiAgICAgICAgICAgICAvLyBSZXN1bHQgbWV0YWRhdGEgY29sbGVjdGVkIHNvIGZhciwgd2hlbiBwYXJ0aWFsIHJlc3VsdHMgYXJlIGluIHVzZQogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY29sbGVjdGVkUmVzdWx0OwogCi0gICAgICAgICAgICBQYXJ0aWFsUmVzdWx0UXVpcmtJbkZsaWdodCgpOgorICAgICAgICAgICAgUGFydGlhbFJlc3VsdEluRmxpZ2h0KCk6CiAgICAgICAgICAgICAgICAgICAgIGhhdmVTZW50M0EoZmFsc2UpIHsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBwYXJ0aWFsUmVzdWx0UXVpcms7CisgICAgICAgIH0gcGFydGlhbFJlc3VsdDsKIAogICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBieSBLZXllZFZlY3RvcgogICAgICAgICBJbkZsaWdodFJlcXVlc3QoKSA6Ci0gICAgICAgICAgICAgICAgcmVxdWVzdElkKDApLAogICAgICAgICAgICAgICAgIGNhcHR1cmVUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCiAgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSB7CisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQoMCksCisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpewogICAgICAgICB9CiAKLSAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBpZCwgaW50IG51bUJ1ZmZlcnMpIDoKLSAgICAgICAgICAgICAgICByZXF1ZXN0SWQoaWQpLAorICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMpIDoKICAgICAgICAgICAgICAgICBjYXB0dXJlVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAogICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCi0gICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycykgeworICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKXsKICAgICAgICAgfQotICAgIH07CisKKyAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcykgOgorICAgICAgICAgICAgICAgIGNhcHR1cmVUaW1lc3RhbXAoMCksCisgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCisgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdChudW1CdWZmZXJzKSwKKyAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMoZXh0cmFzKSwKKyAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSl7CisgICAgICAgIH0KKworICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0KSA6CisgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKKyAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAorICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAorICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGhhc0lucHV0KXsKKyAgICAgICAgfQorfTsKICAgICAvLyBNYXAgZnJvbSBmcmFtZSBudW1iZXIgdG8gdGhlIGluLWZsaWdodCByZXF1ZXN0IHN0YXRlCiAgICAgdHlwZWRlZiBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW5GbGlnaHRSZXF1ZXN0PiBJbkZsaWdodE1hcDsKIAogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0TG9jazsgLy8gUHJvdGVjdHMgbUluRmxpZ2h0TWFwCiAgICAgSW5GbGlnaHRNYXAgICAgICAgICAgICBtSW5GbGlnaHRNYXA7CiAKLSAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzKTsKKyAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCk7CiAKICAgICAvKioKLSAgICAgKiBGb3IgdGhlIHBhcnRpYWwgcmVzdWx0IHF1aXJrLCBjaGVjayBpZiBhbGwgM0Egc3RhdGUgZmllbGRzIGFyZSBhdmFpbGFibGUKKyAgICAgKiBGb3IgdGhlIHBhcnRpYWwgcmVzdWx0LCBjaGVjayBpZiBhbGwgM0Egc3RhdGUgZmllbGRzIGFyZSBhdmFpbGFibGUKICAgICAgKiBhbmQgaWYgc28sIHF1ZXVlIHVwIDNBLW9ubHkgcmVzdWx0IHRvIHRoZSBjbGllbnQuIFJldHVybnMgdHJ1ZSBpZiAzQQogICAgICAqIGlzIHNlbnQuCiAgICAgICovCi0gICAgYm9vbCBwcm9jZXNzUGFydGlhbDNBUXVpcmsoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcGFydGlhbCk7CisgICAgYm9vbCBwcm9jZXNzUGFydGlhbDNBUmVzdWx0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHBhcnRpYWwsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAKICAgICAvLyBIZWxwZXJzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIDNBIG1ldGFkYXRhIGludG8gdG8vZnJvbSBwYXJ0aWFsIHJlc3VsdHMKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgIGJvb2wgZ2V0M0FSZXN1bHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCwgaW50MzJfdCB0YWcsCi0gICAgICAgICAgICBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpOwogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBib29sIGluc2VydDNBUmVzdWx0KENhbWVyYU1ldGFkYXRhICZyZXN1bHQsIGludDMyX3QgdGFnLCBjb25zdCBUKiB2YWx1ZSwKLSAgICAgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIpOwogICAgIC8qKgogICAgICAqIFRyYWNraW5nIGZvciBpZGxlIGRldGVjdGlvbgogICAgICAqLwpAQCAtNTE4LDcgKzYyMCw3IEBACiAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcjsKLSAgICBMaXN0PENhbWVyYU1ldGFkYXRhPiAgIG1SZXN1bHRRdWV1ZTsKKyAgICBMaXN0PENhcHR1cmVSZXN1bHQ+ICAgbVJlc3VsdFF1ZXVlOwogICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgbVJlc3VsdFNpZ25hbDsKICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAgKm1MaXN0ZW5lcjsKIApAQCAtNTMxLDYgKzYzMywxMiBAQAogCiAgICAgdm9pZCBub3RpZnkoY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpOwogCisgICAgLy8gU3BlY2lmaWMgbm90aWZ5IGhhbmRsZXJzCisgICAgdm9pZCBub3RpZnlFcnJvcihjb25zdCBjYW1lcmEzX2Vycm9yX21zZ190ICZtc2csCisgICAgICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOworICAgIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBjYW1lcmEzX3NodXR0ZXJfbXNnX3QgJm1zZywKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CisKICAgICAvKioKICAgICAgKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1NmIwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUR1bW15U3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkNhbWVyYTNEdW1teVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworQ2FtZXJhM0R1bW15U3RyZWFtOjpDYW1lcmEzRHVtbXlTdHJlYW0oaW50IGlkKSA6CisgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgRFVNTVlfV0lEVEgsIERVTU1ZX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIERVTU1ZX0ZPUk1BVCkgeworCit9CisKK0NhbWVyYTNEdW1teVN0cmVhbTo6fkNhbWVyYTNEdW1teVN0cmVhbSgpIHsKKworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcHJvZHVjZSBidWZmZXJzISIsIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKKyAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBtSWQpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpyZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAorICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit2b2lkIENhbWVyYTNEdW1teVN0cmVhbTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKKyAgICAodm9pZCkgYXJnczsKKyAgICBTdHJpbmc4IGxpbmVzOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIFN0cmVhbVslZF06IER1bW15XG4iLCBtSWQpOworICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKKworICAgIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoZmQsIGFyZ3MpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICAvLyBEbyBub3RoaW5nCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkgeworICAgIC8vIERvIG5vdGhpbmcKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKKyAgICBtU3RhdGUgPSAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSA/IFNUQVRFX0lOX0NPTkZJRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU1RBVEVfQ09OU1RSVUNURUQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSB7CisgICAgKnVzYWdlID0gRFVNTVlfVVNBR0U7CisgICAgcmV0dXJuIE9LOworfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0MjYyMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfRFVNTVlfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfRFVNTVlfU1RSRUFNX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorCisjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbS5oIgorI2luY2x1ZGUgIkNhbWVyYTNJT1N0cmVhbUJhc2UuaCIKKyNpbmNsdWRlICJDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworLyoqCisgKiBBIGR1bW15IG91dHB1dCBzdHJlYW0gY2xhc3MsIHRvIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciB3aGVuIG5vIHZhbGlkCisgKiBzdHJlYW1zIGFyZSBjb25maWd1cmVkIGJ5IHRoZSBjbGllbnQuCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNhbWVyYSBIQUwgdjMuMiBvciBvbGRlciBkaXNhbGxvdyBjb25maWd1cmluZworICogMCBvdXRwdXQgc3RyZWFtcywgd2hpbGUgdGhlIHB1YmxpYyBjYW1lcmEyIEFQSSBhbGxvd3MgZm9yIGl0LgorICovCitjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0gOgorICAgICAgICBwdWJsaWMgQ2FtZXJhM0lPU3RyZWFtQmFzZSwKKyAgICAgICAgcHVibGljIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UgeworCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgYSBkdW1teSBzdHJlYW07IGRvZXNuJ3QgYWN0dWFsbHkgY29ubmVjdCB0byBhbnl0aGluZywgYW5kIHVzZXMKKyAgICAgKiBhIGRlZmF1bHQgZHVtbXkgZm9ybWF0IGFuZCBzaXplLgorICAgICAqLworICAgIENhbWVyYTNEdW1teVN0cmVhbShpbnQgaWQpOworCisgICAgdmlydHVhbCB+Q2FtZXJhM0R1bW15U3RyZWFtKCk7CisKKyAgICAvKioKKyAgICAgKiBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQorICAgICAqLworCisgICAgdmlydHVhbCB2b2lkICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisKKyAgICBzdGF0dXNfdCAgICAgICAgIHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgd2UgcmVsZWFzZSB0aGUgbG9jayBicmllZmx5IGluIHRoaXMgZnVuY3Rpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKworICBwcml2YXRlOgorCisgICAgLy8gRGVmYXVsdCBkdW1teSBwYXJhbWV0ZXJzOyAzMjB4MjQwIGlzIGEgcmVxdWlyZWQgc2l6ZSBmb3IgYWxsIGRldmljZXMsCisgICAgLy8gb3RoZXJ3aXNlIGFjdCBsaWtlIGEgU3VyZmFjZVZpZXcgd291bGQuCisgICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9XSURUSCA9IDMyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0hFSUdIVCA9IDI0MDsKKyAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRFVNTVlfVVNBR0UgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpOworCit9OyAvLyBjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggZGE1MTIyOC4uY2M2NjQ1OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0xOCw4ICsxOCw3IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHN0ZGludC5oIHRvIGRlZmluZSBJTlQ2NF9NQVggaW4gQysrCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KQEAgLTM1LDcgKzM0LDggQEAKICAgICAgICAgQ2FtZXJhM1N0cmVhbShpZCwgdHlwZSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLCBmb3JtYXQpLAogICAgICAgICBtVG90YWxCdWZmZXJDb3VudCgwKSwKLSAgICAgICAgbURlcXVldWVkQnVmZmVyQ291bnQoMCksCisgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCgwKSwKKyAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUZyYW1lQ291bnQoMCksCiAgICAgICAgIG1MYXN0VGltZXN0YW1wKDApIHsKIApAQCAtNTQsMTAgKzU0LDEwIEBACiAKIGJvb2wgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6aGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCkgY29uc3QgewogICAgIG5zZWNzX3Qgc2lnbmFsVGltZSA9IG1Db21iaW5lZEZlbmNlLT5nZXRTaWduYWxUaW1lKCk7Ci0gICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQ6IEhhcyAlZCBvdXRzdGFuZGluZyBidWZmZXJzLCIKLSAgICAgICAgICAgICIgYnVmZmVyIHNpZ25hbCB0aW1lIGlzICVsbGQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1EZXF1ZXVlZEJ1ZmZlckNvdW50LCBzaWduYWxUaW1lKTsKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPiAwIHx8IHNpZ25hbFRpbWUgPT0gSU5UNjRfTUFYKSB7CisgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQ6IEhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVycywiCisgICAgICAgICAgICAiIGJ1ZmZlciBzaWduYWwgdGltZSBpcyAlIiBQUklkNjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50LCBzaWduYWxUaW1lKTsKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID4gMCB8fCBzaWduYWxUaW1lID09IElOVDY0X01BWCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzAsMTMgKzcwLDEzIEBACiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBEaW1zOiAlZCB4ICVkLCBmb3JtYXQgMHgleFxuIiwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOwotICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgTWF4IHNpemU6ICVkXG4iLCBtTWF4U2l6ZSk7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJXp1XG4iLCBtTWF4U2l6ZSk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBVc2FnZTogJWQsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZXMgcHJvZHVjZWQ6ICVkLCBsYXN0IHRpbWVzdGFtcDogJWxsZCBuc1xuIiwKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlZCwgY3VycmVudGx5IGRlcXVldWVkOiAlZFxuIiwKLSAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50LCBtRGVxdWV1ZWRCdWZmZXJDb3VudCk7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlenUsIGN1cnJlbnRseSBkZXF1ZXVlZDogJXp1XG4iLAorICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQsIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCk7CiAgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwogfQogCkBAIC0xMDUsNiArMTA1LDE0IEBACiAgICAgcmV0dXJuIG1Ub3RhbEJ1ZmZlckNvdW50OwogfQogCitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgeworICAgIHJldHVybiBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OworfQorCitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CisgICAgcmV0dXJuIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgLSBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX0lOX1JFQ09ORklHOgpAQCAtMTE4LDkgKzEyNiw5IEBACiAgICAgICAgICAgICByZXR1cm4gLUVOT1RDT05OOwogICAgIH0KIAotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA+IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBkaXNjb25uZWN0IHdpdGggJWQgYnVmZmVycyBzdGlsbCBkZXF1ZXVlZCEiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURlcXVldWVkQnVmZmVyQ291bnQpOworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPiAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZGlzY29ubmVjdCB3aXRoICV6dSBidWZmZXJzIHN0aWxsIGRlcXVldWVkISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xMzEsNyArMTM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWxlYXNlRmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0KSB7CiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IGFsbCBmZW5jZXMgYXJlIG5vdyBvd25lZCBieSBIQUwuCiAgICAgICovCkBAIC0xNDUsMTQgKzE1NCwyNSBAQAogICAgIGJ1ZmZlci5zdGF0dXMgPSBzdGF0dXM7CiAKICAgICAvLyBJbmZvcm0gdHJhY2tlciBhYm91dCBiZWNvbWluZyBidXN5Ci0gICAgaWYgKG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgorICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCiAgICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF2b2lkIGEgc3B1cmlvdXMgSURMRS0+QUNUSVZFLT5JRExFIHRyYW5zaXRpb24gd2hlbiB1c2luZyBidWZmZXJzCisgICAgICAgICAqIGJlZm9yZS9hZnRlciByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBkdXJpbmcgaW5pdGlhbCBjb25maWd1cmF0aW9uCisgICAgICAgICAqIG9yIHJlLWNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IElOX0NPTkZJRyBhbmQgSU5fUkVDT05GSUcgY2hlY2tzIG9ubHkgbWFrZSBzZW5zZSBmb3IgPEhBTDMuMgorICAgICAgICAgKi8KICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgewogICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtU3RhdHVzSWQpOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50Kys7CisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50Kys7CisKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQrKzsKKyAgICB9CiB9CiAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3QgewpAQCAtMTY0LDE1ICsxODQsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgLy8gT25seSBsaW1pdCBkZXF1ZXVlIGFtb3VudCB3aGVuIGZ1bGx5IGNvbmZpZ3VyZWQKLSAgICBpZiAobVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQgJiYKLSAgICAgICAgICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID09IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycykgewotICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQWxyZWFkeSBkZXF1ZXVlZCBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMiCi0gICAgICAgICAgICAgICAgIiBidWZmZXJzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xODQsNyArMTk1LDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCkgeworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogTm8gYnVmZmVycyBvdXRzdGFuZGluZyB0byByZXR1cm4iLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbUlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjIyLDkgKzIzMywyMCBAQAogICAgICAgICBtQ29tYmluZWRGZW5jZSA9IEZlbmNlOjptZXJnZShtTmFtZSwgbUNvbWJpbmVkRmVuY2UsIHJlbGVhc2VGZW5jZSk7CiAgICAgfQogCi0gICAgbURlcXVldWVkQnVmZmVyQ291bnQtLTsKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCisgICAgaWYgKG91dHB1dCkgeworICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50LS07CisgICAgfQorCisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50LS07CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgeworICAgICAgICAvKioKKyAgICAgICAgICogQXZvaWQgYSBzcHVyaW91cyBJRExFLT5BQ1RJVkUtPklETEUgdHJhbnNpdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlcnMKKyAgICAgICAgICogYmVmb3JlL2FmdGVyIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGR1cmluZyBpbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBjaGVja3Mgb25seSBtYWtlIHNlbnNlIGZvciA8SEFMMy4yCisgICAgICAgICAqLwogICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZDogQWxsIGJ1ZmZlcnMgcmV0dXJuZWQ7IG5vdyBpZGxlIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIG1JZCk7CiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IGZjYjlkMDQuLmEzNWMyOTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC00OCw3ICs0OCwxMCBAQAogICBwcm90ZWN0ZWQ6CiAgICAgc2l6ZV90ICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQ7CiAgICAgLy8gc3VtIG9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB0aGF0IGFyZSBjdXJyZW50bHkgYWNxdWlyZWQgYnkgSEFMCi0gICAgc2l6ZV90ICAgICAgICAgICAgbURlcXVldWVkQnVmZmVyQ291bnQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50OworICAgIC8vIG51bWJlciBvZiBvdXRwdXQgYnVmZmVycyB0aGF0IGFyZSBjdXJyZW50bHkgYWNxdWlyZWQgYnkgSEFMLiBUaGlzIHdpbGwgYmUKKyAgICAvLyBSZWR1bmRhbnQgd2hlbiBjYW1lcmEzIHN0cmVhbXMgYXJlIG5vIGxvbmdlciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMuCisgICAgc2l6ZV90ICAgICAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudDsKICAgICBDb25kaXRpb24gICAgICAgICBtQnVmZmVyUmV0dXJuZWRTaWduYWw7CiAgICAgdWludDMyX3QgICAgICAgICAgbUZyYW1lQ291bnQ7CiAgICAgLy8gTGFzdCByZWNlaXZlZCBvdXRwdXQgYnVmZmVyJ3MgdGltZXN0YW1wCkBAIC03Niw2ICs3OSwxMCBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpID0gMDsKIAogICAgIHN0YXR1c190IGdldEJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3Q7CkBAIC05Miw3ICs5OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZV9mZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbGVhc2VfZmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdXRwdXQpOwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzSU9TdHJlYW1CYXNlCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAppbmRleCA1YWE5YTNlLi4zMTliZTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCkBAIC04MSw3ICs4MSw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL2ZhbHNlKTsKICAgICBtQnVmZmVyc0luRmxpZ2h0LnB1c2hfYmFjayhidWZmZXJJdGVtKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTE5OSwxNCArMTk5LDM2IEBACiAgICAgYXNzZXJ0KG1NYXhTaXplID09IDApOwogICAgIGFzc2VydChjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQik7CiAKLSAgICBtVG90YWxCdWZmZXJDb3VudCA9IEJ1ZmZlclF1ZXVlOjpNSU5fVU5ERVFVRVVFRF9CVUZGRVJTICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVyczsKLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCA9IDA7CisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID0gMDsKICAgICBtRnJhbWVDb3VudCA9IDA7CiAKICAgICBpZiAobUNvbnN1bWVyLmdldCgpID09IDApIHsKLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoYnEsIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworCisgICAgICAgIGludCBtaW5VbmRlcXVldWVkQnVmZmVycyA9IDA7CisgICAgICAgIHJlcyA9IHByb2R1Y2VyLT5xdWVyeShOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgfHwgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ291bGQgbm90IHF1ZXJ5IG1pbiB1bmRlcXVldWVkIGJ1ZmZlcnMgKGVycm9yICVkLCBidWZDb3VudCAlZCkiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHJlcywgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgbWluQnVmcyA9IHN0YXRpY19jYXN0PHNpemVfdD4obWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgICAgICAvKgorICAgICAgICAgKiBXZSBwcm9taXNlIG5ldmVyIHRvICdhY3F1aXJlJyBtb3JlIHRoYW4gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzCisgICAgICAgICAqIGF0IGFueSBvbmUgdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQm9vc3QgdGhlIG51bWJlciB1cCB0byBtZWV0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIGJ1ZmZlciBjb3VudC4KKyAgICAgICAgICoKKyAgICAgICAgICogKE5vdGUgdGhhdCB0aGlzIHNldHMgY29uc3VtZXItc2lkZSBidWZmZXIgY291bnQgb25seSwKKyAgICAgICAgICogYW5kIG5vdCB0aGUgc3VtIG9mIHByb2R1Y2VyK2NvbnN1bWVyIHNpZGUgYXMgaW4gb3RoZXIgY2FtZXJhIHN0cmVhbXMpLgorICAgICAgICAgKi8KKyAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQgPSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPiBtaW5CdWZzID8KKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA6IG1pbkJ1ZnM7CisgICAgICAgIC8vIFRPRE86IHNvbWVob3cgc2V0IHRoZSB0b3RhbCBidWZmZXIgY291bnQgd2hlbiBwcm9kdWNlciBjb25uZWN0cz8KKworICAgICAgICBtQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLCBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQpOwogICAgICAgICBtQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEzLUlucHV0U3RyZWFtLSVkIiwgbUlkKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggNjgxZDY4NC4uYWU0OTQ2NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC00NCw2ICs0NCw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKIAorICAgIC8vIFRPRE86IGV4cG9zZSBhbiBpbnRlcmZhY2UgdG8gZ2V0IHRoZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisKICAgcHJpdmF0ZToKIAogICAgIHR5cGVkZWYgQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtIEJ1ZmZlckl0ZW07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCA2ODI3NTVkLi43N2FkNTAzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTM3LDcgKzM3LDggQEAKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0KSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKLSAgICAgICAgbVRyYW5zZm9ybSgwKSB7CisgICAgICAgIG1UcmFuc2Zvcm0oMCksCisgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpIHsKIAogICAgIGlmIChtQ29uc3VtZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IENvbnN1bWVyIGlzIE5VTEwhIiwgX19GVU5DVElPTl9fKTsKQEAgLTUxLDcgKzUyLDggQEAKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCi0gICAgICAgIG1UcmFuc2Zvcm0oMCkgeworICAgICAgICBtVHJhbnNmb3JtKDApLAorICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSB7CiAKICAgICBpZiAoZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICBBTE9HRSgiJXM6IEJhZCBmb3JtYXQgZm9yIHNpemUtb25seSBzdHJlYW06ICVkIiwgX19GVU5DVElPTl9fLApAQCAtMTE5LDcgKzEyMSw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL3RydWUpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjAyLDYgKzIwNCwxNSBAQAogICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1UcmFjZUZpcnN0QnVmZmVyICYmIChzdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQpKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciB0cmFjZUxvZ1s0OF07CisgICAgICAgICAgICAgICAgc25wcmludGYodHJhY2VMb2csIHNpemVvZih0cmFjZUxvZyksICJTdHJlYW0gJWQ6IGZpcnN0IGZ1bGwgYnVmZmVyXG4iLCBtSWQpOworICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKHRyYWNlTG9nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyID0gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPnF1ZXVlQnVmZmVyKGN1cnJlbnRDb25zdW1lci5nZXQoKSwKICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YoYnVmZmVyLmJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKSwKICAgICAgICAgICAgICAgICBhbndSZWxlYXNlRmVuY2UpOwpAQCAtMjU3LDYgKzI2OCw3IEBACiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpjb25maWd1cmVRdWV1ZUxvY2tlZCgpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKKyAgICBtVHJhY2VGaXJzdEJ1ZmZlciA9IHRydWU7CiAgICAgaWYgKChyZXMgPSBDYW1lcmEzSU9TdHJlYW1CYXNlOjpjb25maWd1cmVRdWV1ZUxvY2tlZCgpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTI4OSwyMCArMzAxLDI1IEBACiAKICAgICBpZiAobU1heFNpemUgPT0gMCkgewogICAgICAgICAvLyBGb3IgYnVmZmVycyBvZiBrbm93biBzaXplCi0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUNvbnN1bWVyLmdldCgpLAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0KTsKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1Db25zdW1lci5nZXQoKSwKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGgsIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEZvciBidWZmZXJzIHdpdGggYm91bmRlZCBzaXplCi0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUNvbnN1bWVyLmdldCgpLAotICAgICAgICAgICAgICAgIG1NYXhTaXplLCAxLAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOworICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobUNvbnN1bWVyLmdldCgpLAorICAgICAgICAgICAgICAgIG1NYXhTaXplLCAxKTsKICAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBnZW9tZXRyeSIKLSAgICAgICAgICAgICAgICAiICVkIHggJWQsIGZvcm1hdCAleCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZGltZW5zaW9ucyIKKyAgICAgICAgICAgICAgICAiICVkIHggJWQgKG1heFNpemUgJXp1KSBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCBtSWQpOworICAgICAgICAgICAgICAgIG1NYXhTaXplLCBtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtQ29uc3VtZXIuZ2V0KCksCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGZvcm1hdCAlI3ggZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCBtSWQpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIApAQCAtMzI0LDcgKzM0MSw3IEBACiAgICAgfQogCiAgICAgbVRvdGFsQnVmZmVyQ291bnQgPSBtYXhDb25zdW1lckJ1ZmZlcnMgKyBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7Ci0gICAgbURlcXVldWVkQnVmZmVyQ291bnQgPSAwOworICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9IDA7CiAgICAgbUZyYW1lQ291bnQgPSAwOwogICAgIG1MYXN0VGltZXN0YW1wID0gMDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCA2Y2JiOWY0Li5iZTI3OGM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtNzYsMTIgKzc2LDE2IEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1Db25zdW1lcjsKICAgcHJpdmF0ZToKICAgICBpbnQgICAgICAgICAgICAgICBtVHJhbnNmb3JtOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgc2V0VHJhbnNmb3JtTG9ja2VkKGludCB0cmFuc2Zvcm0pOwogCisgICAgYm9vbCBtVHJhY2VGaXJzdEJ1ZmZlcjsKKwogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCkBAIC05MSw3ICs5NSw2IEBACiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggNmQyY2Y5NC4uM2MwZTkwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKQEAgLTEzNyw2ICsxMzksNyBAQAogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQ09OU1RSVUNURUQpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5fQ09ORklHOwogICAgIH0gZWxzZSB7IC8vIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVECisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQsICJJbnZhbGlkIHN0YXRlOiAweCV4IiwgbVN0YXRlKTsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5fUkVDT05GSUc7CiAgICAgfQogCkBAIC0yMDYsMTEgKzIwOSw2MSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmNhbmNlbENvbmZpZ3VyYXRpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW4gZXJyb3Igc3RhdGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIFNUQVRFX0lOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBTVEFURV9JTl9SRUNPTkZJRzoKKyAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9DT05TVFJVQ1RFRDoKKyAgICAgICAgY2FzZSBTVEFURV9DT05GSUdVUkVEOgorICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgY2FuY2VsIGNvbmZpZ3VyYXRpb24gdGhhdCBoYXNuJ3QgYmVlbiBzdGFydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdGF0ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY2FtZXJhM19zdHJlYW06OnVzYWdlID0gb2xkVXNhZ2U7CisgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID0gb2xkTWF4QnVmZmVyczsKKworICAgIG1TdGF0ZSA9IChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcpID8gU1RBVEVfQ09ORklHVVJFRCA6IFNUQVRFX0NPTlNUUlVDVEVEOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0QnVmZmVyKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKLSAgICBzdGF0dXNfdCByZXMgPSBnZXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY29uZmlndXJlZCBhbHJlYWR5LgorICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IGJ1ZmZlcnMgaWYgc3RyZWFtIGlzIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KKyAgICBpZiAoZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogQWxyZWFkeSBkZXF1ZXVlZCBtYXggb3V0cHV0IGJ1ZmZlcnMgKCVkKSwgd2FpdCBmb3IgbmV4dCByZXR1cm5lZCBvbmUuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgICAgIHJlcyA9IG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdCBmb3Igb3V0cHV0IGJ1ZmZlciByZXR1cm4gdGltZWQgb3V0IGFmdGVyICVsbGRtcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gLyAxMDAwMDAwTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGdldEJ1ZmZlckxvY2tlZChidWZmZXIpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZCgqYnVmZmVyLCAvKmFjcXVpcmVkKi90cnVlLCAvKm91dHB1dCovdHJ1ZSk7CiAgICAgfQpAQCAtMjIzLDkgKzI3NiwxOCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCisgICAgLyoqCisgICAgICogVE9ETzogQ2hlY2sgdGhhdCB0aGUgc3RhdGUgaXMgdmFsaWQgZmlyc3QuCisgICAgICoKKyAgICAgKiA8SEFMMy4yIElOX0NPTkZJRyBhbmQgSU5fUkVDT05GSUcgaW4gYWRkaXRpb24gdG8gQ09ORklHVVJFRC4KKyAgICAgKiA+PSBIQUwzLjIgQ09ORklHVVJFRCBvbmx5CisgICAgICoKKyAgICAgKiBEbyB0aGlzIGZvciBnZXRCdWZmZXIgYXMgd2VsbC4KKyAgICAgKi8KICAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXApOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgICAgIG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC5zaWduYWwoKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtMjM0LDggKzI5NiwzMCBAQAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0SW5wdXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIHN0YXR1c190IHJlcyA9IGdldElucHV0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbmZpZ3VyZWQgYWxyZWFkeS4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBpbnB1dCBidWZmZXJzIGlmIHN0cmVhbSBpcyBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciBuZXcgYnVmZmVyIHJldHVybmVkIGJhY2sgaWYgd2UgYXJlIHJ1bm5pbmcgaW50byB0aGUgbGltaXQuCisgICAgaWYgKGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogQWxyZWFkeSBkZXF1ZXVlZCBtYXggaW5wdXQgYnVmZmVycyAoJWQpLCB3YWl0IGZvciBuZXh0IHJldHVybmVkIG9uZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICAgICAgcmVzID0gbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWwud2FpdFJlbGF0aXZlKG1Mb2NrLCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHdhaXQgZm9yIGlucHV0IGJ1ZmZlciByZXR1cm4gdGltZWQgb3V0IGFmdGVyICVsbGRtcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gLyAxMDAwMDAwTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGdldElucHV0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKCpidWZmZXIsIC8qYWNxdWlyZWQqL3RydWUsIC8qb3V0cHV0Ki9mYWxzZSk7CiAgICAgfQpAQCAtMjUwLDYgKzMzNCw3IEBACiAgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYnVmZmVyLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL2ZhbHNlKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWwuc2lnbmFsKCk7CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC0zMTQsMTIgKzM5OSwzNSBAQAogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZWdpc3RlckJ1ZmZlcnNMb2NrZWQoY2FtZXJhM19kZXZpY2UgKmhhbDNEZXZpY2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgLyoqCisgICAgICogPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICoKKyAgICAgKiBjYW1lcmEzX2RldmljZV90LT5vcHMtPnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzKCkgaXMgbm90IGNhbGxlZCBhbmQgbXVzdAorICAgICAqIGJlIE5VTEwuCisgICAgICovCisgICAgaWYgKGhhbDNEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIEFMT0dWKCIlczogcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgdW51c2VkIGFzIG9mIEhBTDMuMiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgaWYgKGhhbDNEZXZpY2UtPm9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgIT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBpcyBkZXByZWNhdGVkIGluIEhBTDMuMjsgIgorICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBzZXQgdG8gTlVMTCBpbiBjYW1lcmEzX2RldmljZTo6b3BzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCIlczogU2tpcHBpbmcgTlVMTCBjaGVjayBmb3IgZGVwcmVjYXRlZCByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyB1c2luZyBkZXByZWNhdGVkIGNvZGUgcGF0aCIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKIAogICAgIFZlY3RvcjxidWZmZXJfaGFuZGxlX3QqPiBidWZmZXJzOwotICAgIGJ1ZmZlcnMuaW5zZXJ0QXQoTlVMTCwgMCwgYnVmZmVyQ291bnQpOworICAgIGJ1ZmZlcnMuaW5zZXJ0QXQoLypwcm90b3R5cGVfaXRlbSovTlVMTCwgLyppbmRleCovMCwgYnVmZmVyQ291bnQpOwogCiAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3NldCBidWZmZXJTZXQgPSBjYW1lcmEzX3N0cmVhbV9idWZmZXJfc2V0KCk7CiAgICAgYnVmZmVyU2V0LnN0cmVhbSA9IHRoaXM7CkBAIC0zMjcsNyArNDM1LDcgQEAKICAgICBidWZmZXJTZXQuYnVmZmVycyA9IGJ1ZmZlcnMuZWRpdEFycmF5KCk7CiAKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IHN0cmVhbUJ1ZmZlcnM7Ci0gICAgc3RyZWFtQnVmZmVycy5pbnNlcnRBdChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCgpLCAwLCBidWZmZXJDb3VudCk7CisgICAgc3RyZWFtQnVmZmVycy5pbnNlcnRBdChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCgpLCAvKmluZGV4Ki8wLCBidWZmZXJDb3VudCk7CiAKICAgICAvLyBSZWdpc3RlciBhbGwgYnVmZmVycyB3aXRoIHRoZSBIQUwuIFRoaXMgbWVhbnMgZ2V0dGluZyBhbGwgdGhlIGJ1ZmZlcnMKICAgICAvLyBmcm9tIHRoZSBzdHJlYW0sIHByb3ZpZGluZyB0aGVtIHRvIHRoZSBIQUwgd2l0aCB0aGUKQEAgLTM1Myw3ICs0NjEsNyBAQAogICAgIH0KICAgICBpZiAoYnVmZmVySWR4ID09IGJ1ZmZlckNvdW50KSB7CiAgICAgICAgIC8vIEdvdCBhbGwgYnVmZmVycywgcmVnaXN0ZXIgd2l0aCBIQUwKLSAgICAgICAgQUxPR1YoIiVzOiBSZWdpc3RlcmluZyAlZCBidWZmZXJzIHdpdGggY2FtZXJhIEhBTCIsCisgICAgICAgIEFMT0dWKCIlczogUmVnaXN0ZXJpbmcgJXp1IGJ1ZmZlcnMgd2l0aCBjYW1lcmEgSEFMIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlckNvdW50KTsKICAgICAgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5yZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyIpOwogICAgICAgICByZXMgPSBoYWwzRGV2aWNlLT5vcHMtPnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzKGhhbDNEZXZpY2UsCkBAIC0zOTQsNiArNTAyLDE4IEBACiB2b2lkIENhbWVyYTNTdHJlYW06OmFkZEJ1ZmZlckxpc3RlbmVyKAogICAgICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+IGxpc3RlbmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7CisgICAgZm9yIChpdCA9IG1CdWZmZXJMaXN0ZW5lckxpc3QuYmVnaW4oKSwgZW5kID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5lbmQoKTsKKyAgICAgICAgIGl0ICE9IGVuZDsKKyAgICAgICAgICkgeworICAgICAgICBpZiAoKml0ID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyeSB0byBhZGQgdGhlIHNhbWUgbGlzdGVuZXIgdHdpY2UsIGlnbm9yaW5nLi4uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpdCsrOworICAgIH0KKwogICAgIG1CdWZmZXJMaXN0ZW5lckxpc3QucHVzaF9iYWNrKGxpc3RlbmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCA2ZWViNzIxLi5kMGUxMzM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtODIsNiArODIsMjMgQEAKICAqICAgIFNUQVRFX0NPTkZJR1VSRUQgICAgID0+IFNUQVRFX0NPTlNUUlVDVEVEOgogICogICAgICAgIFdoZW4gZGlzY29ubmVjdCgpIGlzIGNhbGxlZCBhZnRlciBtYWtpbmcgc3VyZSBzdHJlYW0gaXMgaWRsZSB3aXRoCiAgKiAgICAgICAgd2FpdFVudGlsSWRsZSgpLgorICoKKyAqIFN0YXR1cyBUcmFja2luZzoKKyAqICAgIEVhY2ggc3RyZWFtIGlzIHRyYWNrZWQgYnkgU3RhdHVzVHJhY2tlciBhcyBhIHNlcGFyYXRlIGNvbXBvbmVudCwKKyAqICAgIGRlcGVuZGluZyBvbiB0aGUgaGFuZGVkIG91dCBidWZmZXIgY291bnQuIFRoZSBzdGF0ZSBtdXN0IGJlIFNUQVRFX0NPTkZJR1VSRUQKKyAqICAgIGluIG9yZGVyIGZvciB0aGUgY29tcG9uZW50IHRvIGJlIG1hcmtlZC4KKyAqCisgKiAgICBJdCdzIG1hcmtlZCBpbiBvbmUgb2YgdHdvIHdheXM6CisgKgorICogICAgLSBBQ1RJVkU6IE9uZSBvciBtb3JlIGJ1ZmZlcnMgaGF2ZSBiZWVuIGhhbmRlZCBvdXQgKHdpdGggI2dldEJ1ZmZlcikuCisgKiAgICAtIElETEU6IEFsbCBidWZmZXJzIGhhdmUgYmVlbiByZXR1cm5lZCAod2l0aCAjcmV0dXJuQnVmZmVyKSwgYW5kIHRoZWlyCisgKiAgICAgICAgICByZXNwZWN0aXZlIHJlbGVhc2VfZmVuY2UocykgaGF2ZSBiZWVuIHNpZ25hbGVkLgorICoKKyAqICAgIEEgdHlwaWNhbCB1c2UgY2FzZSBpcyBvdXRwdXQgc3RyZWFtcy4gV2hlbiB0aGUgSEFMIGhhcyBhbnkgYnVmZmVycworICogICAgZGVxdWV1ZWQsIHRoZSBzdHJlYW0gaXMgbWFya2VkIEFDVElWRS4gV2hlbiB0aGUgSEFMIHJldHVybnMgYWxsIGJ1ZmZlcnMKKyAqICAgIChlLmcuIGlmIG5vIGNhcHR1cmUgcmVxdWVzdHMgYXJlIGFjdGl2ZSksIHRoZSBzdHJlYW0gaXMgbWFya2VkIElETEUuCisgKiAgICBJbiB0aGlzIHVzZSBjYXNlLCB0aGUgYXBwIGNvbnN1bWVyIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcG9uZW50IHN0YXR1cy4KKyAqCiAgKi8KIGNsYXNzIENhbWVyYTNTdHJlYW0gOgogICAgICAgICBwcm90ZWN0ZWQgY2FtZXJhM19zdHJlYW0sCkBAIC0xNDIsNiArMTU5LDEzIEBACiAgICAgc3RhdHVzX3QgICAgICAgICBmaW5pc2hDb25maWd1cmF0aW9uKGNhbWVyYTNfZGV2aWNlICpoYWwzRGV2aWNlKTsKIAogICAgIC8qKgorICAgICAqIENhbmNlbHMgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIHByb2Nlc3MuIFRoaXMgcmV0dXJucyB0aGUgc3RyZWFtIHRvIHRoZQorICAgICAqIGluaXRpYWwgc3RhdGUsIGFsbG93aW5nIGl0IHRvIGJlIGNvbmZpZ3VyZWQgYWdhaW4gbGF0ZXIuCisgICAgICogVGhpcyBpcyBkb25lIGlmIHRoZSBIQUwgcmVqZWN0cyB0aGUgcHJvcG9zZWQgY29tYmluZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgIGNhbmNlbENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKQEAgLTIwOSw4ICsyMzMsMTcgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjYW1lcmEzIGJ1ZmZlciBsaXN0ZW5lci4gQWRkaW5nIHRoZSBzYW1lIGxpc3RlbmVyIHR3aWNlIGhhcworICAgICAqIG5vIGVmZmVjdC4KKyAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgIGFkZEJ1ZmZlckxpc3RlbmVyKAogICAgICAgICAgICAgd3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjYW1lcmEzIGJ1ZmZlciBsaXN0ZW5lci4gUmVtb3ZpbmcgdGhlIHNhbWUgbGlzdGVuZXIgdHdpY2UKKyAgICAgKiBvciB0aGUgbGlzdGVuZXIgdGhhdCB3YXMgbmV2ZXIgYWRkZWQgaGFzIG5vIGVmZmVjdC4KKyAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgIHJlbW92ZUJ1ZmZlckxpc3RlbmVyKAogICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiYgbGlzdGVuZXIpOwogCkBAIC0yNjIsNiArMjk1LDEyIEBACiAgICAgLy8gR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcXVldWUKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwogCisgICAgLy8gR2V0IGhhbmRvdXQgb3V0cHV0IGJ1ZmZlciBjb3VudC4KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKKworICAgIC8vIEdldCBoYW5kb3V0IGlucHV0IGJ1ZmZlciBjb3VudC4KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworCiAgICAgLy8gR2V0IHRoZSB1c2FnZSBmbGFncyBmb3IgdGhlIG90aGVyIGVuZHBvaW50LCBvciByZXR1cm4KICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpZiB0aGV5IGNhbm5vdCBiZSBvYnRhaW5lZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSA9IDA7CkBAIC0yNzQsNiArMzEzLDkgQEAKICAgcHJpdmF0ZToKICAgICB1aW50MzJfdCBvbGRVc2FnZTsKICAgICB1aW50MzJfdCBvbGRNYXhCdWZmZXJzOworICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CisgICAgQ29uZGl0aW9uIG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gPSAzMDAwMDAwMDAwTEw7IC8vIDMwMDAgbXMKIAogICAgIC8vIEdldHMgYWxsIGJ1ZmZlcnMgZnJvbSBlbmRwb2ludCBhbmQgcmVnaXN0ZXJzIHRoZW0gd2l0aCB0aGUgSEFMLgogICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyc0xvY2tlZChjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IGM5M2FlMTUuLmRhOTg5Y2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC04Miw2ICs4MiwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluaXNoQ29uZmlndXJhdGlvbihjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSkgPSAwOwogCiAgICAgLyoqCisgICAgICogQ2FuY2VscyB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gVGhpcyByZXR1cm5zIHRoZSBzdHJlYW0gdG8gdGhlCisgICAgICogaW5pdGlhbCBzdGF0ZSwgYWxsb3dpbmcgaXQgdG8gYmUgY29uZmlndXJlZCBhZ2FpbiBsYXRlci4KKyAgICAgKiBUaGlzIGlzIGRvbmUgaWYgdGhlIEhBTCByZWplY3RzIHRoZSBwcm9wb3NlZCBjb21iaW5lZCBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsQ29uZmlndXJhdGlvbigpID0gMDsKKworICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCmluZGV4IDA0ZjVkYzUuLjgxMzMwZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcApAQCAtMTgsNiArMTgsOCBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlICJDYW1lcmEzWnNsU3RyZWFtLmgiCkBAIC0xMDksMTUgKzExMSwxNyBAQAogfSAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCiAKIENhbWVyYTNac2xTdHJlYW06OkNhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICBpbnQgZGVwdGgpIDoKKyAgICAgICAgaW50IGJ1ZmZlckNvdW50KSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpLAotICAgICAgICBtRGVwdGgoZGVwdGgpIHsKKyAgICAgICAgbURlcHRoKGJ1ZmZlckNvdW50KSB7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBtUHJvZHVjZXIgPSBuZXcgUmluZ0J1ZmZlckNvbnN1bWVyKGJxLCBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsIGRlcHRoKTsKLSAgICBtQ29uc3VtZXIgPSBuZXcgU3VyZmFjZShicSk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtUHJvZHVjZXIgPSBuZXcgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN1bWVyLCBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsIGJ1ZmZlckNvdW50KTsKKyAgICBtQ29uc3VtZXIgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiB9CiAKIENhbWVyYTNac2xTdHJlYW06On5DYW1lcmEzWnNsU3RyZWFtKCkgewpAQCAtMTcyLDcgKzE3Niw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spOworICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovZmFsc2UpOwogCiAgICAgbUJ1ZmZlcnNJbkZsaWdodC5wdXNoX2JhY2soYnVmZmVySXRlbSk7CiAKQEAgLTI3MSw3ICsyNzUsNyBAQAogICAgIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoZmQsIGFyZ3MpOwogCiAgICAgbGluZXMgPSBTdHJpbmc4KCk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBJbnB1dCBidWZmZXJzIHBlbmRpbmc6ICVkLCBpbiBmbGlnaHQgJWRcbiIsCisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBJbnB1dCBidWZmZXJzIHBlbmRpbmc6ICV6dSwgaW4gZmxpZ2h0ICV6dVxuIiwKICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLnNpemUoKSwgbUJ1ZmZlcnNJbkZsaWdodC5zaXplKCkpOwogICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKIH0KQEAgLTI5Niw4ICszMDAsOSBAQAogICAgIG5zZWNzX3QgYWN0dWFsID0gcGlubmVkQnVmZmVyLT5nZXRCdWZmZXJJdGVtKCkubVRpbWVzdGFtcDsKIAogICAgIGlmIChhY3R1YWwgIT0gdGltZXN0YW1wKSB7CisgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgcHJvYmxlbWF0aWMsIHdlJ2xsIGVuZCB1cCB3aXRoIHVzaW5nIHdyb25nIHJlc3VsdCBmb3IgdGhpcyBwaW5uZWQgYnVmZmVyLgogICAgICAgICBBTE9HVygiJXM6IFpTTCBidWZmZXIgY2FuZGlkYXRlIHNlYXJjaCBkaWRuJ3QgZmluZCBhbiBleGFjdCBtYXRjaCAtLSIKLSAgICAgICAgICAgICAgIiByZXF1ZXN0ZWQgdGltZXN0YW1wID0gJWxsZCwgYWN0dWFsIHRpbWVzdGFtcCA9ICVsbGQiLAorICAgICAgICAgICAgICAiIHJlcXVlc3RlZCB0aW1lc3RhbXAgPSAlIiBQUklkNjQgIiwgYWN0dWFsIHRpbWVzdGFtcCA9ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0aW1lc3RhbXAsIGFjdHVhbCk7CiAgICAgfQogCkBAIC0zMTAsMTQgKzMxNSwyOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6Y2xlYXJJbnB1dFJpbmdCdWZmZXIoKSB7CitzdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpjbGVhcklucHV0UmluZ0J1ZmZlcihuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKKyAgICByZXR1cm4gY2xlYXJJbnB1dFJpbmdCdWZmZXJMb2NrZWQobGF0ZXN0VGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6Y2xlYXJJbnB1dFJpbmdCdWZmZXJMb2NrZWQobnNlY3NfdCogbGF0ZXN0VGltZXN0YW1wKSB7CisKKyAgICBpZiAobGF0ZXN0VGltZXN0YW1wKSB7CisgICAgICAgICpsYXRlc3RUaW1lc3RhbXAgPSBtUHJvZHVjZXItPmdldExhdGVzdFRpbWVzdGFtcCgpOworICAgIH0KICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5jbGVhcigpOwogCiAgICAgcmV0dXJuIG1Qcm9kdWNlci0+Y2xlYXIoKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKKyAgICBjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChOVUxMKTsKKworICAgIHJldHVybiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCk7Cit9CisKIHN0YXR1c190IENhbWVyYTNac2xTdHJlYW06OnNldFRyYW5zZm9ybShpbnQgLyp0cmFuc2Zvcm0qLykgewogICAgIEFMT0dWKCIlczogTm90IGltcGxlbWVudGVkIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oCmluZGV4IGM3ZjQ0OTAuLjUzMjNhNDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oCkBAIC0zNywxMCArMzcsMTAgQEAKICAgICAgICAgcHVibGljIENhbWVyYTNPdXRwdXRTdHJlYW0gewogICBwdWJsaWM6CiAgICAgLyoqCi0gICAgICogU2V0IHVwIGEgWlNMIHN0cmVhbSBvZiBhIGdpdmVuIHJlc29sdXRpb24uIERlcHRoIGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycworICAgICAqIFNldCB1cCBhIFpTTCBzdHJlYW0gb2YgYSBnaXZlbiByZXNvbHV0aW9uLiBidWZmZXJDb3VudCBpcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMKICAgICAgKiBjYWNoZWQgd2l0aGluIHRoZSBzdHJlYW0gdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZvciBpbnB1dC4KICAgICAgKi8KLSAgICBDYW1lcmEzWnNsU3RyZWFtKGludCBpZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGRlcHRoKTsKKyAgICBDYW1lcmEzWnNsU3RyZWFtKGludCBpZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGJ1ZmZlckNvdW50KTsKICAgICB+Q2FtZXJhM1pzbFN0cmVhbSgpOwogCiAgICAgdmlydHVhbCB2b2lkICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CkBAIC01OSw4ICs1OSwxMCBAQAogCiAgICAgLyoqCiAgICAgICogQ2xlYXJzIHRoZSBidWZmZXJzIHRoYXQgY2FuIGJlIHVzZWQgYnkgZW5xdWV1ZUlucHV0QnVmZmVyQnlUaW1lc3RhbXAKKyAgICAgKiBsYXRlc3RUaW1lc3RhbXAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbGFyZ2VzdCB0aW1lc3RhbXAgb2YgYnVmZmVycworICAgICAqIGJlaW5nIGNsZWFyZWQsIDAgaWYgdGhlcmUgaXMgbm8gYnVmZmVyIGJlaW5nIGNsZWFyLgogICAgICAqLwotICAgIHN0YXR1c190IGNsZWFySW5wdXRSaW5nQnVmZmVyKCk7CisgICAgc3RhdHVzX3QgY2xlYXJJbnB1dFJpbmdCdWZmZXIobnNlY3NfdCogbGF0ZXN0VGltZXN0YW1wKTsKIAogICBwcm90ZWN0ZWQ6CiAKQEAgLTk2LDYgKzk4LDEyIEBACiAgICAgICAgICAgICBib29sIG91dHB1dCwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKKworICAgIC8vIERpc2Nvbm5ldCB0aGUgQ2FtZXJhM1pzbFN0cmVhbSBzcGVjaWZpYyBidWZmZXJRdWV1ZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CisKKyAgICBzdGF0dXNfdCBjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApOworCiB9OyAvLyBjbGFzcyBDYW1lcmEzWnNsU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcAppbmRleCBhYjU0MTlmLi43MjNiNWMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5jcHAKQEAgLTE4LDkgKzE4LDYgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0vLyBUaGlzIGlzIG5lZWRlZCBmb3Igc3RkaW50LmggdG8gZGVmaW5lIElOVDY0X01BWCBpbiBDKysKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDx1aS9GZW5jZS5oPgpAQCAtNTIsNyArNDksNyBAQAogICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBuZXcgY29tcG9uZW50ICVkIiwgX19GVU5DVElPTl9fLCBpZCk7CiAKICAgICAgICAgZXJyID0gbVN0YXRlcy5hZGQoaWQsIElETEUpOwotICAgICAgICBBTE9HRV9JRihlcnIgPCAwLCAiJXM6IENhbid0IGFkZCBuZXcgY29tcG9uZW50ICVkOiAlcyAoJWQpIiwKKyAgICAgICAgQUxPR0VfSUYoZXJyIDwgMCwgIiVzOiBDYW4ndCBhZGQgbmV3IGNvbXBvbmVudCAlZDogJXMgKCV6ZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQsIHN0cmVycm9yKC1lcnIpLCBlcnIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAppbmRleCA5YTZkYzI4Li5mODU2MmVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcApAQCAtMTcsNiArMTcsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJSaW5nQnVmZmVyQ29uc3VtZXIiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8Z3VpL1JpbmdCdWZmZXJDb25zdW1lci5oPgpAQCAtMzgsNyArNDEsOCBAQAogICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLAogICAgICAgICBpbnQgYnVmZmVyQ291bnQpIDoKICAgICBDb25zdW1lckJhc2UoY29uc3VtZXIpLAotICAgIG1CdWZmZXJDb3VudChidWZmZXJDb3VudCkKKyAgICBtQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpLAorICAgIG1MYXRlc3RUaW1lc3RhbXAoMCkKIHsKICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKGNvbnN1bWVyVXNhZ2UpOwogICAgIG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CkBAIC0xNDksNiArMTUzLDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCituc2Vjc190IFJpbmdCdWZmZXJDb25zdW1lcjo6Z2V0TGF0ZXN0VGltZXN0YW1wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIGlmIChtQnVmZmVySXRlbUxpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtTGF0ZXN0VGltZXN0YW1wOworfQorCiB2b2lkIFJpbmdCdWZmZXJDb25zdW1lcjo6cGluQnVmZmVyTG9ja2VkKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKICAgICBMaXN0PFJpbmdCdWZmZXJJdGVtPjo6aXRlcmF0b3IgaXQsIGVuZDsKIApAQCAtMTY0LDEwICsxNzYsMTAgQEAKICAgICB9CiAKICAgICBpZiAoaXQgPT0gZW5kKSB7Ci0gICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byBwaW4gYnVmZmVyICh0aW1lc3RhbXAgJWxsZCwgZnJhbWVudW1iZXIgJWxsZCkiLAorICAgICAgICBCSV9MT0dFKCJGYWlsZWQgdG8gcGluIGJ1ZmZlciAodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQgIikiLAogICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBCSV9MT0dWKCJQaW5uZWQgYnVmZmVyIChmcmFtZSAlbGxkLCB0aW1lc3RhbXAgJWxsZCkiLAorICAgICAgICBCSV9MT0dWKCJQaW5uZWQgYnVmZmVyIChmcmFtZSAlIiBQUkl1NjQgIiwgdGltZXN0YW1wICUiIFBSSWQ2NCAiKSIsCiAgICAgICAgICAgICAgICAgaXRlbS5tRnJhbWVOdW1iZXIsIGl0ZW0ubVRpbWVzdGFtcCk7CiAgICAgfQogfQpAQCAtMjIyLDEyICsyMzQsMTIgQEAKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBCSV9MT0dFKCJGYWlsZWQgdG8gYWRkIHJlbGVhc2UgZmVuY2UgdG8gYnVmZmVyICIKLSAgICAgICAgICAgICAgICAgICAgIih0aW1lc3RhbXAgJWxsZCwgZnJhbWVudW1iZXIgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICIodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQsCiAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwgaXRlbS5tRnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIEJJX0xPR1YoIkF0dGVtcHRpbmcgdG8gcmVsZWFzZSBidWZmZXIgdGltZXN0YW1wICVsbGQsIGZyYW1lICVsbGQiLAorICAgICAgICBCSV9MT0dWKCJBdHRlbXB0aW5nIHRvIHJlbGVhc2UgYnVmZmVyIHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgZnJhbWUgJSIgUFJJdTY0LAogICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwgaXRlbS5tRnJhbWVOdW1iZXIpOwogCiAgICAgICAgIC8vIGl0ZW0ubUdyYXBoaWNCdWZmZXIgd2FzIHBvcHVsYXRlZCB3aXRoIHRoZSBwcm9wZXIgZ3JhcGhpYy1idWZmZXIKQEAgLTI0MSw3ICsyNTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIEJJX0xPR1YoIkJ1ZmZlciB0aW1lc3RhbXAgJWxsZCwgZnJhbWUgJWxsZCBldmljdGVkIiwKKyAgICAgICAgQklfTE9HVigiQnVmZmVyIHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgZnJhbWUgJSIgUFJJdTY0ICIgZXZpY3RlZCIsCiAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAKICAgICAgICAgc2l6ZV90IGN1cnJlbnRTaXplID0gbUJ1ZmZlckl0ZW1MaXN0LnNpemUoKTsKQEAgLTI5NCwxMSArMzA2LDE4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBCSV9MT0dWKCJOZXcgYnVmZmVyIGFjcXVpcmVkICh0aW1lc3RhbXAgJWxsZCksICIKLSAgICAgICAgICAgICAgICAiYnVmZmVyIGl0ZW1zICV1IG91dCBvZiAlZCIsCisgICAgICAgIEJJX0xPR1YoIk5ldyBidWZmZXIgYWNxdWlyZWQgKHRpbWVzdGFtcCAlIiBQUklkNjQgIiksICIKKyAgICAgICAgICAgICAgICAiYnVmZmVyIGl0ZW1zICV6dSBvdXQgb2YgJWQiLAogICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICBtQnVmZmVySXRlbUxpc3Quc2l6ZSgpLCBtQnVmZmVyQ291bnQpOwogCisgICAgICAgIGlmIChpdGVtLm1UaW1lc3RhbXAgPCBtTGF0ZXN0VGltZXN0YW1wKSB7CisgICAgICAgICAgICBCSV9MT0dFKCJUaW1lc3RhbXAgIGRlY3JlYXNlcyBmcm9tICUiIFBSSWQ2NCAiIHRvICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgbUxhdGVzdFRpbWVzdGFtcCwgaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXRlc3RUaW1lc3RhbXAgPSBpdGVtLm1UaW1lc3RhbXA7CisKICAgICAgICAgaXRlbS5tR3JhcGhpY0J1ZmZlciA9IG1TbG90c1tpdGVtLm1CdWZdLm1HcmFwaGljQnVmZmVyOwogICAgIH0gLy8gZW5kIG9mIG1NdXRleCBsb2NrCiAKQEAgLTMyMSw3ICszNDAsNyBAQAogCiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQklfTE9HRSgiRmFpbGVkIHRvIGFkZCByZWxlYXNlIGZlbmNlIHRvIGJ1ZmZlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0zMzMsMTAgKzM1MiwxMCBAQAogCiAgICAgaWYgKGl0ID09IGVuZCkgewogICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIElmIGl0IGhhcHBlbnMsIHdlIGhhdmUgYSBidWcuCi0gICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byB1bnBpbiBidWZmZXIgKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkKSIsCisgICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byB1bnBpbiBidWZmZXIgKHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgZnJhbWVudW1iZXIgJSIgUFJJdTY0ICIpIiwKICAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQklfTE9HVigiVW5waW5uZWQgYnVmZmVyICh0aW1lc3RhbXAgJWxsZCwgZnJhbWVudW1iZXIgJWxsZCkiLAorICAgICAgICBCSV9MT0dWKCJVbnBpbm5lZCBidWZmZXIgKHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgZnJhbWVudW1iZXIgJSIgUFJJdTY0ICIpIiwKICAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCmluZGV4IGI0YWQ4MjQuLmRhOTdhMTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAvLyBidWZmZXJDb3VudCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtYW55IGJ1ZmZlcnMgY2FuIGJlIHBpbm5lZCBmb3IgdXNlcgogICAgIC8vIGFjY2VzcyBhdCB0aGUgc2FtZSB0aW1lLgogICAgIFJpbmdCdWZmZXJDb25zdW1lcihjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgY29uc3VtZXIsIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCi0gICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQgPSBCdWZmZXJRdWV1ZTo6TUlOX1VOREVRVUVVRURfQlVGRkVSUyk7CisgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQpOwogCiAgICAgdmlydHVhbCB+UmluZ0J1ZmZlckNvbnN1bWVyKCk7CiAKQEAgLTE1OSw2ICsxNTksOSBAQAogICAgIC8vIFJlbGVhc2UgYWxsIHRoZSBub24tcGlubmVkIGJ1ZmZlcnMgaW4gdGhlIHJpbmcgYnVmZmVyCiAgICAgc3RhdHVzX3QgY2xlYXIoKTsKIAorICAgIC8vIFJldHVybiAwIGlmIFJpbmdCdWZmZXIgaXMgZW1wdHksIG90aGVyd2lzZSByZXR1cm4gdGltZXN0YW1wIG9mIGxhdGVzdCBidWZmZXIuCisgICAgbnNlY3NfdCBnZXRMYXRlc3RUaW1lc3RhbXAoKTsKKwogICBwcml2YXRlOgogCiAgICAgLy8gT3ZlcnJpZGUgQ29uc3VtZXJCYXNlOjpvbkZyYW1lQXZhaWxhYmxlCkBAIC0xODAsNiArMTgzLDkgQEAKICAgICAvLyBMaXN0IG9mIGFjcXVpcmVkIGJ1ZmZlcnMgaW4gb3VyIHJpbmcgYnVmZmVyCiAgICAgTGlzdDxSaW5nQnVmZmVySXRlbT4gICAgICAgbUJ1ZmZlckl0ZW1MaXN0OwogICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgIG1CdWZmZXJDb3VudDsKKworICAgIC8vIFRpbWVzdGFtcCBvZiBsYXRlc3QgYnVmZmVyCisgICAgbnNlY3NfdCBtTGF0ZXN0VGltZXN0YW1wOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5jcHAKaW5kZXggMzQ2ZTE1Zi4uMzc0ZGM1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwCkBAIC03NCwxMCArNzQsMTAgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBmZHByaW50ZihmZCwgIkNhbWVyYSB0cmFjZXMgKCV6dSk6XG4iLCBwY3NMaXN0LnNpemUoKSk7CisgICAgZHByaW50ZihmZCwgIkNhbWVyYSB0cmFjZXMgKCV6dSk6XG4iLCBwY3NMaXN0LnNpemUoKSk7CiAKICAgICBpZiAocGNzTGlzdC5lbXB0eSgpKSB7Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiICBObyBjYW1lcmEgdHJhY2VzIGNvbGxlY3RlZC5cbiIpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBjYW1lcmEgdHJhY2VzIGNvbGxlY3RlZC5cbiIpOwogICAgIH0KIAogICAgIC8vIFByaW50IG5ld2VzdCBpdGVtcyBmaXJzdApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKaW5kZXggMDgwMDZjOC4uOTVmMmZlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCkBAIC04LDQgKzgsNiBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYWxvZ3NlcnZpY2UKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCA2ODNmZGYzLi40MWRhYjFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKQEAgLTU0LDEzICs1NCwxMyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTWVkaWFMb2dTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3N0YXR1c190IE1lZGlhTG9nU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgLy8gRklYTUUgbWVyZ2Ugd2l0aCBzaW1pbGFyIGJ1dCBub3QgaWRlbnRpY2FsIGNvZGUgYXQgc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwogICAgIGlmICghKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUEgfHwKICAgICAgICAgICAgIFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCkpKSB7Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgbWVkaWEubG9nIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBtZWRpYS5sb2cgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNzQsNyArNzQsNyBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZWRSZWFkZXJzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IE5hbWVkUmVhZGVyJiBuYW1lZFJlYWRlciA9IG5hbWVkUmVhZGVyc1tpXTsKICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiXG4lczpcbiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lczpcbiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HSSgiJXM6IiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzJhZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NSBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKworaWZlcSAoJChTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRSksIDEpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKK2VuZGlmCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAorICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKKyAgICBsaWJ1aSBcCisgICAgbGlibG9nIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYmluZGVyIFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYmhhcmR3YXJlIFwKKyAgICBsaWJzb3VuZHRyaWdnZXIgXAorICAgIGxpYm1lZGlhCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYnNlcnZpY2V1dGlsaXR5CisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCisKK0xPQ0FMX01PRFVMRTo9IGxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFhZWUzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTAsMCArMSw4MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckh3U2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvc291bmRfdHJpZ2dlci5oPgorI2luY2x1ZGUgPFNlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKKyNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAic3R1YiIKKyNlbHNlCisjZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInByaW1hcnkiCisjZW5kaWYKKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpTb3VuZFRyaWdnZXJId1NlcnZpY2UoKQorICAgIDogQm5Tb3VuZFRyaWdnZXJId1NlcnZpY2UoKSwKKyAgICAgIG1OZXh0VW5pcXVlSWQoMSksCisgICAgICBtTWVtb3J5RGVhbGVyKG5ldyBNZW1vcnlEZWFsZXIoMTAyNCAqIDEwMjQsICJTb3VuZFRyaWdnZXJId1NlcnZpY2UiKSksCisgICAgICBtQ2FwdHVyZVN0YXRlKGZhbHNlKQoreworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6b25GaXJzdFJlZigpCit7CisgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKKyAgICBpbnQgcmM7CisgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2UgKmRldjsKKworICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgSFdfTU9EVUxFX1BSRUZJWCwgJm1vZCk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgc291bmQgdHJpZ2dlciBtb2R1bGUgJXMuJXMgKCVzKSIsCisgICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJjID0gc291bmRfdHJpZ2dlcl9od19kZXZpY2Vfb3Blbihtb2QsICZkZXYpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIGluICVzLiVzICglcykiLAorICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgInByaW1hcnkiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZGV2LT5jb21tb24udmVyc2lvbiAhPSBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7CisgICAgICAgIEFMT0dFKCJ3cm9uZyBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBkZXYtPmNvbW1vbi52ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgICByYyA9IGRldi0+Z2V0X3Byb3BlcnRpZXMoZGV2LCAmZGVzY3JpcHRvci5wcm9wZXJ0aWVzKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IHJlYWQgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcyIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRlc2NyaXB0b3IuaGFuZGxlID0KKyAgICAgICAgICAgIChzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdClhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworICAgIEFMT0dJKCJsb2FkZWQgZGVmYXVsdCBtb2R1bGUgJXMsIGhhbmRsZSAlZCIsIGRlc2NyaXB0b3IucHJvcGVydGllcy5kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmhhbmRsZSk7CisKKyAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBuZXcgTW9kdWxlKHRoaXMsIGRldiwgZGVzY3JpcHRvciwgY2xpZW50KTsKKyAgICBtTW9kdWxlcy5hZGQoZGVzY3JpcHRvci5oYW5kbGUsIG1vZHVsZSk7CisgICAgbUNhbGxiYWNrVGhyZWFkID0gbmV3IENhbGxiYWNrVGhyZWFkKHRoaXMpOworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6On5Tb3VuZFRyaWdnZXJId1NlcnZpY2UoKQoreworICAgIGlmIChtQ2FsbGJhY2tUaHJlYWQgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2tUaHJlYWQtPmV4aXQoKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9jbG9zZShtTW9kdWxlcy52YWx1ZUF0KGkpLT5od0RldmljZSgpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6bGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQoreworICAgIEFMT0dWKCJsaXN0TW9kdWxlcyIpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBtb2R1bGVzID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNpemVfdCBtYXhNb2R1bGVzID0gKm51bU1vZHVsZXM7CisgICAgKm51bU1vZHVsZXMgPSBtTW9kdWxlcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCkgJiYgaSA8IG1heE1vZHVsZXM7IGkrKykgeworICAgICAgICBtb2R1bGVzW2ldID0gbU1vZHVsZXMudmFsdWVBdChpKS0+ZGVzY3JpcHRvcigpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6YXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlSW50ZXJmYWNlKQoreworICAgIEFMT0dWKCJhdHRhY2ggbW9kdWxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIG1vZHVsZUludGVyZmFjZS5jbGVhcigpOworICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzc2l6ZV90IGluZGV4ID0gbU1vZHVsZXMuaW5kZXhPZktleShoYW5kbGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGluZGV4KTsKKworICAgIG1vZHVsZS0+c2V0Q2xpZW50KGNsaWVudCk7CisgICAgY2xpZW50LT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChtb2R1bGUpOworICAgIG1vZHVsZUludGVyZmFjZSA9IG1vZHVsZTsKKworICAgIG1vZHVsZS0+c2V0Q2FwdHVyZVN0YXRlX2wobUNhcHR1cmVTdGF0ZSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKQoreworICAgIEFMT0dWKCJzZXRDYXB0dXJlU3RhdGUgJWQiLCBhY3RpdmUpOworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgbUNhcHR1cmVTdGF0ZSA9IGFjdGl2ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Nb2R1bGVzLnZhbHVlQXQoaSktPnNldENhcHR1cmVTdGF0ZV9sKGFjdGl2ZSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6ZGV0YWNoTW9kdWxlKHNwPE1vZHVsZT4gbW9kdWxlKQoreworICAgIEFMT0dWKCJkZXRhY2hNb2R1bGUiKTsKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIG1vZHVsZS0+Y2xlYXJDbGllbnQoKTsKK30KKworCitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXAgPSA2MDAwMDsKKworc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCit7CisgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgeworICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwKTsKKyAgICB9CisgICAgcmV0dXJuIGxvY2tlZDsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBTb3VuZFRyaWdnZXJId1NlcnZpY2UiKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gU291bmRUcmlnZ2VySHdTZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKKyAgICAgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlNvdW5kVHJpZ2dlckh3U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIik7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgeworICAgIHJldHVybiBCblNvdW5kVHJpZ2dlckh3U2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworfQorCisKKy8vIHN0YXRpYwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnJlY29nbml0aW9uQ2FsbGJhY2soc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQoreworICAgIE1vZHVsZSAqbW9kdWxlID0gKE1vZHVsZSAqKWNvb2tpZTsKKyAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBtb2R1bGUtPnNlcnZpY2UoKS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2VydmljZS0+c2VuZFJlY29nbml0aW9uRXZlbnQoZXZlbnQsIG1vZHVsZSk7Cit9CisKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CisKKyAgICAvL3Nhbml0aXplIGV2ZW50CisgICAgc3dpdGNoIChldmVudC0+dHlwZSkgeworICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0U6CisgICAgICAgIEFMT0dXX0lGKGV2ZW50LT5kYXRhX3NpemUgIT0gMCAmJiBldmVudC0+ZGF0YV9vZmZzZXQgIT0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCksCisgICAgICAgICAgICAgICAgICAgICJwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKCk6IGludmFsaWQgZGF0YSBvZmZzZXQgJXUgZm9yIGtleXBocmFzZSBldmVudCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9VTktOT1dOOgorICAgICAgICBBTE9HV19JRihldmVudC0+ZGF0YV9zaXplICE9IDAgJiYgZXZlbnQtPmRhdGFfb2Zmc2V0ICE9CisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCksCisgICAgICAgICAgICAgICAgICAgICJwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKCk6IGludmFsaWQgZGF0YSBvZmZzZXQgJXUgZm9yIHVua25vd24gZXZlbnQgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5kYXRhX29mZnNldCk7CisgICAgICAgIGV2ZW50LT5kYXRhX29mZnNldCA9IHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSA9IGV2ZW50LT5kYXRhX29mZnNldCArIGV2ZW50LT5kYXRhX3NpemU7CisgICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKyAgICBtZW1jcHkoZXZlbnRNZW1vcnktPnBvaW50ZXIoKSwgZXZlbnQsIHNpemUpOworCisgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZFJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQorIHsKKyAgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKGV2ZW50KTsKKyAgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICBzcDxNb2R1bGU+IHN0cm9uZ01vZHVsZTsKKyAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7CisgICAgICAgICAgICAgc3Ryb25nTW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBpZiAoc3Ryb25nTW9kdWxlID09IDApIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIHNlbmRDYWxsYmFja0V2ZW50X2wobmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnksIHN0cm9uZ01vZHVsZSkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzb3VuZE1vZGVsQ2FsbGJhY2soc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCit7CisgICAgTW9kdWxlICptb2R1bGUgPSAoTW9kdWxlICopY29va2llOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IG1vZHVsZS0+c2VydmljZSgpLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXJ2aWNlLT5zZW5kU291bmRNb2RlbEV2ZW50KGV2ZW50LCBtb2R1bGUpOworfQorCitzcDxJTWVtb3J5PiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnByZXBhcmVTb3VuZE1vZGVsRXZlbnRfbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IGV2ZW50LT5kYXRhX29mZnNldCArIGV2ZW50LT5kYXRhX3NpemU7CisgICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKyAgICBtZW1jcHkoZXZlbnRNZW1vcnktPnBvaW50ZXIoKSwgZXZlbnQsIHNpemUpOworCisgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZFNvdW5kTW9kZWxFdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKm1vZHVsZSkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNvdW5kTW9kZWxFdmVudF9sKGV2ZW50KTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7CisgICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2VuZENhbGxiYWNrRXZlbnRfbChuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1NPVU5ETU9ERUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnksIHN0cm9uZ01vZHVsZSkpOworfQorCisKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCk7CisgICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKyAgICAqKChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCkpID0gc3RhdGU7CisgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworfQorCisvLyBjYWxsIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICptb2R1bGUpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlU2VydmljZVN0YXRlRXZlbnRfbChzdGF0ZSk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxNb2R1bGU+IHN0cm9uZ01vZHVsZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTW9kdWxlcy52YWx1ZUF0KGkpLmdldCgpID09IG1vZHVsZSkgeworICAgICAgICAgICAgc3Ryb25nTW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJvbmdNb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNlbmRDYWxsYmFja0V2ZW50X2wobmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TWVtb3J5LCBzdHJvbmdNb2R1bGUpKTsKK30KKworLy8gY2FsbCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZENhbGxiYWNrRXZlbnRfbChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCit7CisgICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kQ2FsbGJhY2tFdmVudChldmVudCk7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQoreworICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQiKTsKKyAgICBzcDxNb2R1bGU+IG1vZHVsZTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIG1vZHVsZSA9IGV2ZW50LT5tTW9kdWxlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbW9kdWxlLT5vbkNhbGxiYWNrRXZlbnQoZXZlbnQpOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgLy8gY2xlYXIgbm93IHRvIGV4ZWN1dGUgd2l0aCBtU2VydmljZUxvY2sgbG9ja2VkCisgICAgICAgIGV2ZW50LT5tTWVtb3J5LmNsZWFyKCk7CisgICAgfQorfQorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkIgorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpDYWxsYmFja1RocmVhZChjb25zdCB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlKQorICAgIDogbVNlcnZpY2Uoc2VydmljZSkKK3sKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6fkNhbGxiYWNrVGhyZWFkKCkKK3sKKyAgICB3aGlsZSAoIW1FdmVudFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICBtRXZlbnRRdWV1ZVswXS0+bU1lbW9yeS5jbGVhcigpOworICAgICAgICBtRXZlbnRRdWV1ZS5yZW1vdmVBdCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6b25GaXJzdFJlZigpCit7CisgICAgcnVuKCJzb3VuZFRyaWdnZXIgY2JrIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOworfQorCitib29sIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkgeworICAgICAgICBzcDxDYWxsYmFja0V2ZW50PiBldmVudDsKKyAgICAgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgICAgICAgICB3aGlsZSAobUV2ZW50UXVldWUuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgc2xlZXAiKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kLndhaXQobUNhbGxiYWNrTG9jayk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgd2FrZSB1cCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV2ZW50ID0gbUV2ZW50UXVldWVbMF07CisgICAgICAgICAgICBtRXZlbnRRdWV1ZS5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcnZpY2UgIT0gMCkgeworICAgICAgICAgICAgc2VydmljZS0+b25DYWxsYmFja0V2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6ZXhpdCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgbUNhbGxiYWNrQ29uZC5icm9hZGNhc3QoKTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpzZW5kQ2FsbGJhY2tFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQoreworICAgIEF1dG9NdXRleCBsb2NrKG1DYWxsYmFja0xvY2spOworICAgIG1FdmVudFF1ZXVlLmFkZChldmVudCk7CisgICAgbUNhbGxiYWNrQ29uZC5zaWduYWwoKTsKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja0V2ZW50OjpDYWxsYmFja0V2ZW50KGV2ZW50X3R5cGUgdHlwZSwgc3A8SU1lbW9yeT4gbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPE1vZHVsZT4gbW9kdWxlKQorICAgIDogbVR5cGUodHlwZSksIG1NZW1vcnkobWVtb3J5KSwgbU1vZHVsZShtb2R1bGUpCit7Cit9CisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tFdmVudDo6fkNhbGxiYWNrRXZlbnQoKQoreworfQorCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlIgorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6TW9kdWxlKGNvbnN0IHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiBod0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50KQorIDogbVNlcnZpY2Uoc2VydmljZSksIG1Id0RldmljZShod0RldmljZSksIG1EZXNjcmlwdG9yKGRlc2NyaXB0b3IpLAorICAgbUNsaWVudChjbGllbnQpLCBtU2VydmljZVN0YXRlKFNPVU5EX1RSSUdHRVJfU1RBVEVfTk9fSU5JVCkKK3sKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6On5Nb2R1bGUoKSB7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmRldGFjaCgpIHsKKyAgICBBTE9HVigiZGV0YWNoKCkiKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZGVscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gbU1vZGVscy52YWx1ZUF0KGkpOworICAgICAgICAgICAgQUxPR1YoImRldGFjaCgpIHVubG9hZGluZyBtb2RlbCAlZCIsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSHdEZXZpY2UtPnVubG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtTW9kZWxzLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtQ2xpZW50ICE9IDApIHsKKyAgICAgICAgbUNsaWVudC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICB9CisgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXJ2aWNlLT5kZXRhY2hNb2R1bGUodGhpcyk7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgQUxPR1YoImxvYWRTb3VuZE1vZGVsKCkgaGFuZGxlIik7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgaWYgKG1vZGVsTWVtb3J5ID09IDAgfHwgbW9kZWxNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJsb2FkU291bmRNb2RlbCgpIG1vZGVsTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCA9CisgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKiltb2RlbE1lbW9yeS0+cG9pbnRlcigpOworCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Id0RldmljZS0+bG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNvdW5kTW9kZWxDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7CisKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oJnNlc3Npb24sICZpb0hhbmRsZSwgJmRldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNwPE1vZGVsPiBtb2RlbCA9IG5ldyBNb2RlbCgqaGFuZGxlLCBzZXNzaW9uLCBpb0hhbmRsZSwgZGV2aWNlLCBzb3VuZF9tb2RlbC0+dHlwZSk7CisgICAgbU1vZGVscy5yZXBsYWNlVmFsdWVGb3IoKmhhbmRsZSwgbW9kZWwpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJ1bmxvYWRTb3VuZE1vZGVsKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1Nb2RlbHMuaW5kZXhPZktleShoYW5kbGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8TW9kZWw+IG1vZGVsID0gbU1vZGVscy52YWx1ZUF0KGluZGV4KTsKKyAgICBtTW9kZWxzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSA9PSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICB9CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKG1vZGVsLT5tQ2FwdHVyZVNlc3Npb24pOworICAgIHJldHVybiBtSHdEZXZpY2UtPnVubG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQoreworICAgIEFMT0dWKCJzdGFydFJlY29nbml0aW9uKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBpZiAoZGF0YU1lbW9yeSAhPSAwICYmIGRhdGFNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uKCkgZGF0YU1lbW9yeSBpcyBub24tMCBidXQgaGFzIE5VTEwgcG9pbnRlcigpIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtU2VydmljZVN0YXRlID09IFNPVU5EX1RSSUdHRVJfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoZGF0YU1lbW9yeSA9PSAwKSB8fAorICAgICAgICAgICAgKGRhdGFNZW1vcnktPnNpemUoKSA8IHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnID0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKilkYXRhTWVtb3J5LT5wb2ludGVyKCk7CisKKyAgICAvL1RPRE86IGdldCBjYXB0dXJlIGhhbmRsZSBhbmQgZGV2aWNlIGZyb20gYXVkaW8gcG9saWN5IHNlcnZpY2UKKyAgICBjb25maWctPmNhcHR1cmVfaGFuZGxlID0gbW9kZWwtPm1DYXB0dXJlSU9IYW5kbGU7CisgICAgY29uZmlnLT5jYXB0dXJlX2RldmljZSA9IG1vZGVsLT5tQ2FwdHVyZURldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSHdEZXZpY2UtPnN0YXJ0X3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlLCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpyZWNvZ25pdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtb2RlbC0+bVN0YXRlID0gTW9kZWw6OlNUQVRFX0FDVElWRTsKKyAgICAgICAgbW9kZWwtPm1Db25maWcgPSAqY29uZmlnOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJzdG9wUmVjb2duaXRpb24oKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1vZGVsLT5tU3RhdGUgIT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSk7CisgICAgbW9kZWwtPm1TdGF0ZSA9IE1vZGVsOjpTVEFURV9JRExFOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQoreworICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CisKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IGV2ZW50LT5tTWVtb3J5OworCisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1DbGllbnQgPT0gMCkgeworICAgICAgICBBTE9HSSgiJXMgbUNsaWVudCA9PSAwIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChldmVudC0+bVR5cGUpIHsKKyAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfUkVDT0dOSVRJT046IHsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKnJlY29nbml0aW9uRXZlbnQgPQorICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7CisgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwocmVjb2duaXRpb25FdmVudC0+bW9kZWwpOworICAgICAgICAgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgbW9kZWwgPT0gMCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobW9kZWwtPm1TdGF0ZSAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCBtb2RlbC0+bVN0YXRlICVkICE9IE1vZGVsOjpTVEFURV9BQ1RJVkUiLCBtb2RlbC0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlY29nbml0aW9uRXZlbnQtPmNhcHR1cmVfc2Vzc2lvbiA9IG1vZGVsLT5tQ2FwdHVyZVNlc3Npb247CisgICAgICAgICAgICBtb2RlbC0+bVN0YXRlID0gTW9kZWw6OlNUQVRFX0lETEU7CisgICAgICAgICAgICBjbGllbnQgPSBtQ2xpZW50OworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5vblJlY29nbml0aW9uRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfU09VTkRNT0RFTDogeworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqc291bmRtb2RlbEV2ZW50ID0KKyAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOworICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKHNvdW5kbW9kZWxFdmVudC0+bW9kZWwpOworICAgICAgICAgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgbW9kZWwgPT0gMCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGllbnQgPSBtQ2xpZW50OworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5vblNvdW5kTW9kZWxFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFOiB7CisgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+b25TZXJ2aWNlU3RhdGVDaGFuZ2UoZXZlbnRNZW1vcnkpOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJvbkNhbGxiYWNrRXZlbnQgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKKyAgICB9Cit9CisKK3NwPFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kZWw+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpnZXRNb2RlbCgKKyAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHNwPE1vZGVsPiBtb2RlbDsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU1vZGVscy5pbmRleE9mS2V5KGhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gbW9kZWw7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmJpbmRlckRpZWQoCisgICAgY29uc3Qgd3A8SUJpbmRlcj4gJndobyBfX3VudXNlZCkgeworICAgIEFMT0dXKCJjbGllbnQgYmluZGVyIGRpZWQgZm9yIG1vZHVsZSAlZCIsIG1EZXNjcmlwdG9yLmhhbmRsZSk7CisgICAgZGV0YWNoKCk7Cit9CisKKy8vIENhbGxlZCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpzZXRDYXB0dXJlU3RhdGVfbChib29sIGFjdGl2ZSkKK3sKKyAgICBBTE9HVigiTW9kdWxlOjpzZXRDYXB0dXJlU3RhdGVfbCAlZCIsIGFjdGl2ZSk7CisgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlOworICAgIHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlOworCisgICAgVmVjdG9yPCBzcDxJTWVtb3J5PiA+IGV2ZW50czsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgc3RhdGUgPSAoYWN0aXZlICYmICFtRGVzY3JpcHRvci5wcm9wZXJ0aWVzLmNvbmN1cnJlbnRfY2FwdHVyZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfU1RBVEVfRElTQUJMRUQgOiBTT1VORF9UUklHR0VSX1NUQVRFX0VOQUJMRUQ7CisKKyAgICAgICAgaWYgKHN0YXRlID09IG1TZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1TZXJ2aWNlU3RhdGUgPSBzdGF0ZTsKKworICAgICAgICBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGUgPT0gU09VTkRfVFJJR0dFUl9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2RlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPE1vZGVsPiBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8ga2VlcCBtb2RlbCBpbiBBQ1RJVkUgc3RhdGUgc28gdGhhdCBldmVudCBpcyBwcm9jZXNzZWQgYnkgb25DYWxsYmFja0V2ZW50KCkKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgcGhyYXNlRXZlbnQ7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlbC0+bVR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFOgorICAgICAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5udW1fcGhyYXNlcyA9IG1vZGVsLT5tQ29uZmlnLm51bV9waHJhc2VzOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBocmFzZUV2ZW50Lm51bV9waHJhc2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LnBocmFzZV9leHRyYXNbaV0gPSBtb2RlbC0+bUNvbmZpZy5waHJhc2VzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9VTktOT1dOOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5jb21tb24uc3RhdHVzID0gUkVDT0dOSVRJT05fU1RBVFVTX0FCT1JUOworICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LmNvbW1vbi50eXBlID0gbW9kZWwtPm1UeXBlOworICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LmNvbW1vbi5tb2RlbCA9IG1vZGVsLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LmNvbW1vbi5kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gc2VydmljZS0+cHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgmcGhyYXNlRXZlbnQuY29tbW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRNZW1vcnkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBldmVudHMuYWRkKGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzZXJ2aWNlLT5zZW5kQ2FsbGJhY2tFdmVudF9sKG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfUkVDT0dOSVRJT04sIGV2ZW50c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcykpOworICAgIH0KKworZXhpdDoKKyAgICBzZXJ2aWNlLT5zZW5kU2VydmljZVN0YXRlRXZlbnRfbChzdGF0ZSwgdGhpcyk7Cit9CisKKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2RlbDo6TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbF90eXBlX3QgdHlwZSkgOgorICAgIG1IYW5kbGUoaGFuZGxlKSwgbVN0YXRlKFNUQVRFX0lETEUpLCBtQ2FwdHVyZVNlc3Npb24oc2Vzc2lvbiksCisgICAgbUNhcHR1cmVJT0hhbmRsZShpb0hhbmRsZSksIG1DYXB0dXJlRGV2aWNlKGRldmljZSksIG1UeXBlKHR5cGUpCit7CisKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmR1bXAoaW50IGZkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVkYWNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9TRVJWSUNFX0gKKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorLy8jaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUFwcE9wc0NhbGxiYWNrLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVtb3J5SGVhcEJhc2U7CisKK2NsYXNzIFNvdW5kVHJpZ2dlckh3U2VydmljZSA6CisgICAgcHVibGljIEJpbmRlclNlcnZpY2U8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiwKKyAgICBwdWJsaWMgQm5Tb3VuZFRyaWdnZXJId1NlcnZpY2UKK3sKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxTb3VuZFRyaWdnZXJId1NlcnZpY2U+OworcHVibGljOgorICAgIGNsYXNzIE1vZHVsZTsKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5zb3VuZF90cmlnZ2VyX2h3IjsgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Tb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKworICAgIC8vIElTb3VuZFRyaWdnZXJId1NlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgIGNsYXNzIE1vZGVsIDogcHVibGljIFJlZkJhc2UgeworICAgICBwdWJsaWM6CisKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBTVEFURV9JRExFLAorICAgICAgICAgICAgU1RBVEVfQUNUSVZFCisgICAgICAgIH07CisKKyAgICAgICAgTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWxfdHlwZV90IHR5cGUpOworICAgICAgICB+TW9kZWwoKSB7fQorCisgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICAgIG1IYW5kbGU7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZTsKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbUNhcHR1cmVTZXNzaW9uOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtQ2FwdHVyZUlPSGFuZGxlOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtQ2FwdHVyZURldmljZTsKKyAgICAgICAgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbF90eXBlX3QgbVR5cGU7CisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyBtQ29uZmlnOworICAgIH07CisKKyAgICBjbGFzcyBDYWxsYmFja0V2ZW50IDogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgICAgIFRZUEVfUkVDT0dOSVRJT04sCisgICAgICAgICAgICBUWVBFX1NPVU5ETU9ERUwsCisgICAgICAgICAgICBUWVBFX1NFUlZJQ0VfU1RBVEUsCisgICAgICAgIH0gZXZlbnRfdHlwZTsKKyAgICAgICAgQ2FsbGJhY2tFdmVudChldmVudF90eXBlIHR5cGUsIHNwPElNZW1vcnk+IG1lbW9yeSwgd3A8TW9kdWxlPiBtb2R1bGUpOworCisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkNhbGxiYWNrRXZlbnQoKTsKKworICAgICAgICBldmVudF90eXBlIG1UeXBlOworICAgICAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgICAgICB3cDxNb2R1bGU+IG1Nb2R1bGU7CisgICAgfTsKKworICAgIGNsYXNzIE1vZHVsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsCisgICAgICAgICAgICAgICAgICAgcHVibGljIEJuU291bmRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCAgICAgeworICAgIHB1YmxpYzoKKworICAgICAgIE1vZHVsZShjb25zdCBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlLAorICAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSogaHdEZXZpY2UsCisgICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCk7CisKKyAgICAgICB2aXJ0dWFsIH5Nb2R1bGUoKTsKKworICAgICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mIG1vZGVsTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKworICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlICpod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQorICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IoKSB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQorICAgICAgIHZvaWQgc2V0Q2xpZW50KHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudCkgeyBtQ2xpZW50ID0gY2xpZW50OyB9CisgICAgICAgdm9pZCBjbGVhckNsaWVudCgpIHsgbUNsaWVudC5jbGVhcigpOyB9CisgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50KCkgY29uc3QgeyByZXR1cm4gbUNsaWVudDsgfQorICAgICAgIHdwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIG1TZXJ2aWNlOyB9CisKKyAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOworCisgICAgICAgc3A8TW9kZWw+IGdldE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICB2b2lkIHNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKTsKKworICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgcHJpdmF0ZToKKworICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKKyAgICAgICAgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiAgICAgICAgICAgICAgbVNlcnZpY2U7CisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSogICAgICAgIG1Id0RldmljZTsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgbURlc2NyaXB0b3I7CisgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+ICAgICAgICAgICAgICAgIG1DbGllbnQ7CisgICAgICAgIERlZmF1bHRLZXllZFZlY3Rvcjwgc291bmRfbW9kZWxfaGFuZGxlX3QsIHNwPE1vZGVsPiA+ICAgICBtTW9kZWxzOworICAgICAgICBzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCAgICAgICAgICBtU2VydmljZVN0YXRlOworICAgIH07IC8vIGNsYXNzIE1vZHVsZQorCisgICAgY2xhc3MgQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSk7CisKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Q2FsbGJhY2tUaHJlYWQoKTsKKworICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisKKyAgICAgICAgLy8gUmVmQmFzZQorICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiAgIG1TZXJ2aWNlOworICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29uZDsKKyAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0xvY2s7CisgICAgICAgIFZlY3Rvcjwgc3A8Q2FsbGJhY2tFdmVudD4gPiBtRXZlbnRRdWV1ZTsKKyAgICB9OworCisgICAgICAgICAgIHZvaWQgZGV0YWNoTW9kdWxlKHNwPE1vZHVsZT4gbW9kdWxlKTsKKworICAgIHN0YXRpYyB2b2lkIHJlY29nbml0aW9uQ2FsbGJhY2soc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LCB2b2lkICpjb29raWUpOworICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCk7CisgICAgICAgICAgIHZvaWQgc2VuZFJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LCBNb2R1bGUgKm1vZHVsZSk7CisKKyAgICBzdGF0aWMgdm9pZCBzb3VuZE1vZGVsQ2FsbGJhY2soc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LCB2b2lkICpjb29raWUpOworICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlU291bmRNb2RlbEV2ZW50X2woc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KTsKKyAgICAgICAgICAgdm9pZCBzZW5kU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwgTW9kdWxlICptb2R1bGUpOworCisgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKTsKKyAgICAgICAgICAgdm9pZCBzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwgTW9kdWxlICptb2R1bGUpOworCisgICAgICAgICAgIHZvaWQgc2VuZENhbGxiYWNrRXZlbnRfbChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOworICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOworCitwcml2YXRlOgorCisgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKKworICAgIE11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOworICAgIHZvbGF0aWxlIGludDMyX3QgICAgbU5leHRVbmlxdWVJZDsKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90LCBzcDxNb2R1bGU+ID4gICAgIG1Nb2R1bGVzOworICAgIHNwPENhbGxiYWNrVGhyZWFkPiAgbUNhbGxiYWNrVGhyZWFkOworICAgIHNwPE1lbW9yeURlYWxlcj4gICAgbU1lbW9yeURlYWxlcjsKKyAgICBib29sICAgICAgICAgICAgICAgIG1DYXB0dXJlU3RhdGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tayBiL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWM0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCVNvdW5kVHJpZ2dlci5jcHAgXAorCUlTb3VuZFRyaWdnZXIuY3BwIFwKKwlJU291bmRUcmlnZ2VyQ2xpZW50LmNwcCBcCisJSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKwlsaWJ1dGlscyBcCisJbGlibG9nIFwKKwlsaWJiaW5kZXIgXAorCWxpYmhhcmR3YXJlCisKKyNMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRTo9IGxpYnNvdW5kdHJpZ2dlcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyODBkMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJJU291bmRUcmlnZ2VyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBERVRBQ0ggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIExPQURfU09VTkRfTU9ERUwsCisgICAgVU5MT0FEX1NPVU5EX01PREVMLAorICAgIFNUQVJUX1JFQ09HTklUSU9OLAorICAgIFNUT1BfUkVDT0dOSVRJT04sCit9OworCitjbGFzcyBCcFNvdW5kVHJpZ2dlcjogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXI+Cit7CitwdWJsaWM6CisgICAgQnBTb3VuZFRyaWdnZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkZXRhY2goKQorICAgIHsKKyAgICAgICAgQUxPR1YoImRldGFjaCIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVUQUNILCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHN0YXR1c190IGxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiAgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQorICAgIHsKKyAgICAgICAgaWYgKG1vZGVsTWVtb3J5ID09IDAgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihtb2RlbE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMT0FEX1NPVU5EX01PREVMLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVU5MT0FEX1NPVU5EX01PREVMLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIGlmIChkYXRhTWVtb3J5ID09IDApIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkYXRhTWVtb3J5LT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZGF0YU1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9SRUNPR05JVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfUkVDT0dOSVRJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlciwgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlciIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuU291bmRUcmlnZ2VyOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBERVRBQ0g6IHsKKyAgICAgICAgICAgIEFMT0dWKCJERVRBQ0giKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBkZXRhY2goKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBMT0FEX1NPVU5EX01PREVMOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gbW9kZWxNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsb2FkU291bmRNb2RlbChtb2RlbE1lbW9yeSwgJmhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFVOTE9BRF9TT1VORF9NT0RFTDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHVubG9hZFNvdW5kTW9kZWwoaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTVEFSVF9SRUNPR05JVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGRhdGFNZW1vcnk7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGF0YU1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0UmVjb2duaXRpb24oaGFuZGxlLCBkYXRhTWVtb3J5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTVE9QX1JFQ09HTklUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjQ0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBPTl9SRUNPR05JVElPTl9FVkVOVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgT05fU09VTkRNT0RFTF9FVkVOVCwKKyAgICBPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRQorfTsKKworY2xhc3MgQnBTb3VuZFRyaWdnZXJDbGllbnQ6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyQ2xpZW50PgoreworCitwdWJsaWM6CisgICAgQnBTb3VuZFRyaWdnZXJDbGllbnQoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckNsaWVudD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGV2ZW50TWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX1JFQ09HTklUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZXZlbnRNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fU09VTkRNT0RFTF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2UoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihldmVudE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlckNsaWVudCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuU291bmRUcmlnZ2VyQ2xpZW50OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBPTl9SRUNPR05JVElPTl9FVkVOVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCisgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgb25SZWNvZ25pdGlvbkV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBPTl9TT1VORE1PREVMX0VWRU5UOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBvblNvdW5kTW9kZWxFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgT05fU0VSVklDRV9TVEFURV9DSEFOR0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KAorICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIG9uU2VydmljZVN0YXRlQ2hhbmdlKGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3MjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJCcFNvdW5kVHJpZ2dlckh3U2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgTElTVF9NT0RVTEVTID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBBVFRBQ0gsCisgICAgU0VUX0NBUFRVUkVfU1RBVEUsCit9OworCitjbGFzcyBCcFNvdW5kVHJpZ2dlckh3U2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgQnBTb3VuZFRyaWdnZXJId1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQorICAgIHsKKyAgICAgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBtb2R1bGVzID09IE5VTEwpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gKG1vZHVsZXMgPT0gTlVMTCkgPyAwIDogKm51bU1vZHVsZXM7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1Nb2R1bGVzUmVxKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfTU9EVUxFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKm51bU1vZHVsZXMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIHN0YXR1cyAlZCBnb3QgKm51bU1vZHVsZXMgJWQiLCBzdGF0dXMsICpudW1Nb2R1bGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAqbnVtTW9kdWxlcykgeworICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSAqbnVtTW9kdWxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gMCkgeworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQobW9kdWxlcywgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICBtb2R1bGUgPSBpbnRlcmZhY2VfY2FzdDxJU291bmRUcmlnZ2VyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYWN0aXZlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DQVBUVVJFX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckh3U2VydmljZSwgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlckh3U2VydmljZSIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBMSVNUX01PRFVMRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlcyA9IG51bU1vZHVsZXNSZXE7CisgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqKWNhbGxvYyhudW1Nb2R1bGVzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0TW9kdWxlcyhtb2R1bGVzLCAmbnVtTW9kdWxlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtTW9kdWxlcyk7CisgICAgICAgICAgICBBTE9HVigiTElTVF9NT0RVTEVTIHN0YXR1cyAlZCBnb3QgbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgbnVtTW9kdWxlcyk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IG51bU1vZHVsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IG51bU1vZHVsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShtb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKG1vZHVsZXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBVFRBQ0g6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KSk7CisgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJU291bmRUcmlnZ2VyQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiBtb2R1bGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2goaGFuZGxlLCBjbGllbnQsIG1vZHVsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKG1vZHVsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKG1vZHVsZS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX0NBUFRVUkVfU1RBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRDYXB0dXJlU3RhdGUoKGJvb2wpZGF0YS5yZWFkSW50MzIoKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDE1YzMwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKQEAgLTAsMCArMSwyODggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IChDKSAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKworI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+IGdTb3VuZFRyaWdnZXJId1NlcnZpY2U7CisgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAga1NvdW5kVHJpZ2dlckh3U2VydmljZVBvbGxEZWxheSA9IDUwMDAwMDsgLy8gMC41cworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgIGtTb3VuZFRyaWdnZXJId1NlcnZpY2VOYW1lICAgICAgPSAibWVkaWEuc291bmRfdHJpZ2dlcl9odyI7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgZ0xvY2s7CisKKyAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgRGVhdGhOb3RpZmllcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJiaW5kZXJEaWVkIik7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgICAgICAgICAgZ1NvdW5kVHJpZ2dlckh3U2VydmljZS5jbGVhcigpOworICAgICAgICAgICAgQUxPR1coIlNvdW5kIHRyaWdnZXIgc2VydmljZSBkaWVkISIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHNwPERlYXRoTm90aWZpZXI+ICAgICAgICAgZ0RlYXRoTm90aWZpZXI7Cit9OyAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCisKK2NvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBTb3VuZFRyaWdnZXI6OmdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICBpZiAoZ1NvdW5kVHJpZ2dlckh3U2VydmljZS5nZXQoKSA9PSAwKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNihrU291bmRUcmlnZ2VySHdTZXJ2aWNlTmFtZSkpOworICAgICAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVygiU291bmRUcmlnZ2VySHdTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrU291bmRUcmlnZ2VySHdTZXJ2aWNlUG9sbERlbGF5KTsKKyAgICAgICAgfSB3aGlsZSh0cnVlKTsKKyAgICAgICAgaWYgKGdEZWF0aE5vdGlmaWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdEZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIoKTsKKyAgICAgICAgfQorICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGdEZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgZ1NvdW5kVHJpZ2dlckh3U2VydmljZSA9IGludGVyZmFjZV9jYXN0PElTb3VuZFRyaWdnZXJId1NlcnZpY2U+KGJpbmRlcik7CisgICAgfQorICAgIEFMT0dFX0lGKGdTb3VuZFRyaWdnZXJId1NlcnZpY2UgPT0gMCwgIm5vIFNvdW5kVHJpZ2dlckh3U2VydmljZSE/Iik7CisgICAgcmV0dXJuIGdTb3VuZFRyaWdnZXJId1NlcnZpY2U7Cit9CisKKy8vIFN0YXRpYyBtZXRob2RzCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6Omxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCit7CisgICAgQUxPR1YoImxpc3RNb2R1bGVzKCkiKTsKKyAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSA9IGdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT5saXN0TW9kdWxlcyhtb2R1bGVzLCBudW1Nb2R1bGVzKTsKK30KKworc3A8U291bmRUcmlnZ2VyPiBTb3VuZFRyaWdnZXI6OmF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgQUxPR1YoImF0dGFjaCgpIik7CisgICAgc3A8U291bmRUcmlnZ2VyPiBzb3VuZFRyaWdnZXI7CisgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UgPSBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBzb3VuZFRyaWdnZXI7CisgICAgfQorICAgIHNvdW5kVHJpZ2dlciA9IG5ldyBTb3VuZFRyaWdnZXIobW9kdWxlLCBjYWxsYmFjayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKG1vZHVsZSwgc291bmRUcmlnZ2VyLCBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlciAhPSAwKSB7CisgICAgICAgIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXItPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKHNvdW5kVHJpZ2dlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIiwgc3RhdHVzKTsKKyAgICAgICAgc291bmRUcmlnZ2VyLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBzb3VuZFRyaWdnZXI7Cit9CisKKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpCit7CisgICAgQUxPR1YoInNldENhcHR1cmVTdGF0ZSglZCkiLCBhY3RpdmUpOworICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0U291bmRUcmlnZ2VySHdTZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHNlcnZpY2UtPnNldENhcHR1cmVTdGF0ZShhY3RpdmUpOworfQorCisvLyBTb3VuZFRyaWdnZXIKK1NvdW5kVHJpZ2dlcjo6U291bmRUcmlnZ2VyKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiYgY2FsbGJhY2spCisgICAgOiBtTW9kdWxlKG1vZHVsZSksIG1DYWxsYmFjayhjYWxsYmFjaykKK3sKK30KKworU291bmRUcmlnZ2VyOjp+U291bmRUcmlnZ2VyKCkKK3sKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgIT0gMCkgeworICAgICAgICBtSVNvdW5kVHJpZ2dlci0+ZGV0YWNoKCk7CisgICAgfQorfQorCisKK3ZvaWQgU291bmRUcmlnZ2VyOjpkZXRhY2goKSB7CisgICAgQUxPR1YoImRldGFjaCgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgIT0gMCkgeworICAgICAgICBtSVNvdW5kVHJpZ2dlci0+ZGV0YWNoKCk7CisgICAgICAgIG1JU291bmRUcmlnZ2VyLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBtSVNvdW5kVHJpZ2dlciA9IDA7CisgICAgfQorfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OmxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+bG9hZFNvdW5kTW9kZWwobW9kZWxNZW1vcnksIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6dW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT51bmxvYWRTb3VuZE1vZGVsKGhhbmRsZSk7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6c3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKGhhbmRsZSwgZGF0YU1lbW9yeSk7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6c3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOworfQorCisvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAordm9pZCBTb3VuZFRyaWdnZXI6Om9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2stPm9uUmVjb2duaXRpb25FdmVudCgKKyAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICB9Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VyOjpvblNvdW5kTW9kZWxFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2stPm9uU291bmRNb2RlbEV2ZW50KAorICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCkpOworICAgIH0KK30KKwordm9pZCBTb3VuZFRyaWdnZXI6Om9uU2VydmljZVN0YXRlQ2hhbmdlKGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25TZXJ2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgICAgICAgICAgKigoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3QgKilldmVudE1lbW9yeS0+cG9pbnRlcigpKSk7CisgICAgfQorfQorCisvL0lCaW5kZXI6OkRlYXRoUmVjaXBpZW50Cit2b2lkIFNvdW5kVHJpZ2dlcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVygiU291bmRUcmlnZ2VyIHNlcnZlciBiaW5kZXIgRGllZCAiKTsKKyAgICBtSVNvdW5kVHJpZ2dlciA9IDA7CisgICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25TZXJ2aWNlRGllZCgpOworICAgIH0KK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBzb3VuZF90cmlnZ2VyX3V1aWRfdCAqZ3VpZCkKK3sKKyAgICBpZiAoc3RyID09IE5VTEwgfHwgZ3VpZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBndWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKKyAgICBndWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKKyAgICBndWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKKyAgICBndWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107CisgICAgZ3VpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKKyAgICBndWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOworICAgIGd1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07CisgICAgZ3VpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKKyAgICBndWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOworICAgIGd1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6Z3VpZFRvU3RyaW5nKGNvbnN0IHNvdW5kX3RyaWdnZXJfdXVpZF90ICpndWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pCit7CisgICAgaWYgKGd1aWQgPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNucHJpbnRmKHN0ciwgbWF4TGVuLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgZ3VpZC0+dGltZUxvdywKKyAgICAgICAgICAgIGd1aWQtPnRpbWVNaWQsCisgICAgICAgICAgICBndWlkLT50aW1lSGlBbmRWZXJzaW9uLAorICAgICAgICAgICAgZ3VpZC0+Y2xvY2tTZXEsCisgICAgICAgICAgICBndWlkLT5ub2RlWzBdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVsxXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbMl0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzNdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVs0XSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbNV0pOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAgYi90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcAppbmRleCBjYzNkNTA5Li42MmVkZGNhIDEwMDY0NAotLS0gYS90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcAorKysgYi90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcApAQCAtMjAsMTUgKzIwLDI1IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLXN0YXRpYyBkb3VibGUgc2luYyhkb3VibGUgeCkgeworc3RhdGljIGlubGluZSBkb3VibGUgc2luYyhkb3VibGUgeCkgewogICAgIGlmIChmYWJzKHgpID09IDAuMGYpIHJldHVybiAxLjBmOwogICAgIHJldHVybiBzaW4oeCkgLyB4OwogfQogCi1zdGF0aWMgZG91YmxlIHNxcihkb3VibGUgeCkgeworc3RhdGljIGlubGluZSBkb3VibGUgc3FyKGRvdWJsZSB4KSB7CiAgICAgcmV0dXJuIHgqeDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQ2NF90IHRvaW50KGRvdWJsZSB4LCBpbnQ2NF90IG1heHZhbCkgeworICAgIGludDY0X3QgdjsKKworICAgIHYgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihmbG9vcih4ICogbWF4dmFsICsgMC41KSk7CisgICAgaWYgKHYgPj0gbWF4dmFsKSB7CisgICAgICAgIHJldHVybiBtYXh2YWwgLSAxOyAvLyBlcnJvciEKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKIHN0YXRpYyBkb3VibGUgSTAoZG91YmxlIHgpIHsKICAgICAvLyBmcm9tIHRoZSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDIHAuIDIzNwogICAgIGRvdWJsZSBheCxhbnMseTsKQEAgLTU0LDExICs2NCwxMiBAQAogICAgIHJldHVybiBJMChiZXRhICogc3FydCgxLjAgLSBzcXIoKDIuMCprKS9OIC0gMS4wKSkpIC8gSTAoYmV0YSk7CiB9CiAKLQogc3RhdGljIHZvaWQgdXNhZ2UoY2hhciogbmFtZSkgewogICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgInVzYWdlOiAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSBbLWYge2Zsb2F0fGZpeGVkfV0gWy1iIGJldGFdIFstdiBkQkZTXSBbLWwgbGVycF1cbiIKLSAgICAgICAgICAgICIgICAgICAgJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10gWy1mIHtmbG9hdHxmaXhlZH1dIFstYiBiZXRhXSBbLXYgZEJGU10gLXAgTS9OXG4iCisgICAgICAgICAgICAidXNhZ2U6ICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIgorICAgICAgICAgICAgIiBbLWYge2Zsb2F0fGZpeGVkfGZpeGVkMTZ9XSBbLWIgYmV0YV0gWy12IGRCRlNdIFstbCBsZXJwXVxuIgorICAgICAgICAgICAgIiAgICAgICAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSIKKyAgICAgICAgICAgICIgWy1mIHtmbG9hdHxmaXhlZHxmaXhlZDE2fV0gWy1iIGJldGFdIFstdiBkQkZTXSAtcCBNL05cbiIKICAgICAgICAgICAgICIgICAgLWggICAgdGhpcyBoZWxwIG1lc3NhZ2VcbiIKICAgICAgICAgICAgICIgICAgLWQgICAgZGVidWcsIHByaW50IGNvbW1hLXNlcGFyYXRlZCBjb2VmZmljaWVudCB0YWJsZVxuIgogICAgICAgICAgICAgIiAgICAtcCAgICBnZW5lcmF0ZSBwb2x5LXBoYXNlIGZpbHRlciBjb2VmZmljaWVudHMsIHdpdGggc2FtcGxlIGluY3JlbWVudCBNL05cbiIKQEAgLTY2LDYgKzc3LDcgQEAKICAgICAgICAgICAgICIgICAgLWMgICAgY3V0LW9mZiBmcmVxdWVuY3kgKDIwNDc4KVxuIgogICAgICAgICAgICAgIiAgICAtbiAgICBudW1iZXIgb2YgemVyby1jcm9zc2luZ3Mgb24gb25lIHNpZGUgKDgpXG4iCiAgICAgICAgICAgICAiICAgIC1sICAgIG51bWJlciBvZiBsZXJwaW5nIGJpdHMgKDQpXG4iCisgICAgICAgICAgICAiICAgIC1tICAgIG51bWJlciBvZiBwb2x5cGhhc2VzIChyZWxhdGVkIHRvIC1sLCBkZWZhdWx0IDE2KVxuIgogICAgICAgICAgICAgIiAgICAtZiAgICBvdXRwdXQgZm9ybWF0LCBjYW4gYmUgZml4ZWQtcG9pbnQgb3IgZmxvYXRpbmctcG9pbnQgKGZpeGVkKVxuIgogICAgICAgICAgICAgIiAgICAtYiAgICBrYWlzZXIgd2luZG93IHBhcmFtZXRlciBiZXRhICg3Ljg2NSBbLTgwZEJdKVxuIgogICAgICAgICAgICAgIiAgICAtdiAgICBhdHRlbnVhdGlvbiBpbiBkQkZTICgwKVxuIiwKQEAgLTc3LDggKzg5LDcgQEAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKIHsKICAgICAvLyBuYyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gc3RvcmUgdGhlIGNvZWZmaWNpZW50cwotICAgIGNvbnN0IGludCBuYyA9IDMyOwotCisgICAgaW50IG5jID0gMzI7CiAgICAgYm9vbCBwb2x5cGhhc2UgPSBmYWxzZTsKICAgICB1bnNpZ25lZCBpbnQgcG9seU0gPSAxNjA7CiAgICAgdW5zaWduZWQgaW50IHBvbHlOID0gMTQ3OwpAQCAtODgsNyArOTksNiBAQAogICAgIGRvdWJsZSBhdHRlbiA9IDE7CiAgICAgaW50IGZvcm1hdCA9IDA7CiAKLQogICAgIC8vIGluIG9yZGVyIHRvIGtlZXAgdGhlIGVycm9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmVhcgogICAgIC8vIGludGVycG9sYXRpb24gb2YgdGhlIGNvZWZmaWNpZW50cyBiZWxvdyB0aGUgcXVhbnRpemF0aW9uIGVycm9yCiAgICAgLy8gd2UgbXVzdCBzYXRpc2Z5OgpAQCAtMTA0LDcgKzExNCw2IEBACiAgICAgLy8gU21pdGgsIEouTy4gRGlnaXRhbCBBdWRpbyBSZXNhbXBsaW5nIEhvbWUgUGFnZQogICAgIC8vIGh0dHBzOi8vY2NybWEuc3RhbmZvcmQuZWR1L35qb3MvcmVzYW1wbGUvLCAyMDExLTAzLTI5CiAgICAgLy8KLSAgICBpbnQgbnogPSA0OwogCiAgICAgLy8gICAgICAgICB8IDAuMTEwMiooQSAtIDguNykgICAgICAgICAgICAgICAgICAgICAgICAgQSA+IDUwCiAgICAgLy8gIGJldGEgPSB8IDAuNTg0MiooQSAtIDIxKV4wLjQgKyAwLjA3ODg2KihBIC0gMjEpICAgMjEgPD0gQSA8PSA1MApAQCAtMTIzLDMzICsxMzIsMzMgQEAKICAgICAvLyAgIDEwMCBkQiAgIDEwLjA1NgogICAgIGRvdWJsZSBiZXRhID0gNy44NjU7CiAKLQogICAgIC8vIDIqbnpjID0gKEEgLSA4KSAvICgyLjI4NSAqIGR3KQogICAgIC8vICAgICAgd2l0aCBkdyB0aGUgdHJhbnNpdGlvbiB3aWR0aCA9IDIqcGkqZEYvRnMKICAgICAvLwogICAgIGludCBuemMgPSA4OwogCi0gICAgLy8KLSAgICAvLyBFeGFtcGxlOgotICAgIC8vIDQ0LjEgS0h6IHRvIDQ4IEtIeiByZXNhbXBsaW5nCi0gICAgLy8gMTAwIGRCIHJlamVjdGlvbiBhYm92ZSAyOCBLSHoKLSAgICAvLyAgICh0aGUgc3BlY3RydW0gd2lsbCBmb2xkIGFyb3VuZCAyNCBLSHogYW5kIHdlIHdhbnQgMTAwIGRCIHJlamVjdGlvbgotICAgIC8vICAgIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZm9sZGluZyByZWFjaGVzIDIwIEtIeikKLSAgICAvLyAgLi4uX19ffF9fX19fCi0gICAgLy8gICAgICAgIHwgICAgIFx8Ci0gICAgLy8gICAgICAgIHwgX19fXy98XF9fX18KLSAgICAvLyAgICAgICAgfC9hbGlhc3wgICAgIFwKLSAgICAvLyAgLS0tLS0tLy0tLS0tLSstLS0tLS1cLS0tLS0tLS0tPiBLSHoKLSAgICAvLyAgICAgICAyMCAgICAgMjQgICAgIDI4CisgICAgLyoKKyAgICAgKiBFeGFtcGxlOgorICAgICAqIDQ0LjEgS0h6IHRvIDQ4IEtIeiByZXNhbXBsaW5nCisgICAgICogMTAwIGRCIHJlamVjdGlvbiBhYm92ZSAyOCBLSHoKKyAgICAgKiAgICh0aGUgc3BlY3RydW0gd2lsbCBmb2xkIGFyb3VuZCAyNCBLSHogYW5kIHdlIHdhbnQgMTAwIGRCIHJlamVjdGlvbgorICAgICAqICAgIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZm9sZGluZyByZWFjaGVzIDIwIEtIeikKKyAgICAgKiAgLi4uX19ffF9fX19fCisgICAgICogICAgICAgIHwgICAgIFx8CisgICAgICogICAgICAgIHwgX19fXy98XF9fX18KKyAgICAgKiAgICAgICAgfC9hbGlhc3wgICAgIFwKKyAgICAgKiAgLS0tLS0tLy0tLS0tLSstLS0tLS1cLS0tLS0tLS0tPiBLSHoKKyAgICAgKiAgICAgICAyMCAgICAgMjQgICAgIDI4CisgICAgICoKKyAgICAgKiBUcmFuc2l0aW9uIGJhbmQgOCBLSHosIG9yIGR3ID0gMS4wNDcyCisgICAgICoKKyAgICAgKiBiZXRhID0gMTAuMDU2CisgICAgICogbnpjICA9IDIwCisgICAgICovCiAKLSAgICAvLyBUcmFuc2l0aW9uIGJhbmQgOCBLSHosIG9yIGR3ID0gMS4wNDcyCi0gICAgLy8KLSAgICAvLyBiZXRhID0gMTAuMDU2Ci0gICAgLy8gbnpjICA9IDIwCi0gICAgLy8KLQorICAgIGludCBNID0gMSA8PCA0OyAvLyBudW1iZXIgb2YgcGhhc2VzIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgaW50IGNoOwotICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIjpoZHM6YzpuOmY6bDpiOnA6djoiKSkgIT0gLTEpIHsKKyAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICI6aGRzOmM6bjpmOmw6bTpiOnA6djp6OiIpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICBkZWJ1ZyA9IHRydWU7CkBAIC0xNjksMTMgKzE3OCwyNiBAQAogICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICAgbnpjID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgICAgTSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2wnOgotICAgICAgICAgICAgICAgIG56ID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIE0gPSAxIDw8IGF0b2kob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG9wdGFyZywiZml4ZWQiKSkgZm9ybWF0ID0gMDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywiZmxvYXQiKSkgZm9ybWF0ID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG9wdGFyZywgImZpeGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJmaXhlZDE2IikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbmMgPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJmbG9hdCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgICAgICBiZXRhID0gYXRvZihvcHRhcmcpOwpAQCAtMTkzLDExICsyMTUsMTQgQEAKICAgICAvLyBjdXQgb2ZmIGZyZXF1ZW5jeSByYXRpbyBGYy9GcwogICAgIGRvdWJsZSBGY3IgPSBGYyAvIEZzOwogCi0KICAgICAvLyB0b3RhbCBudW1iZXIgb2YgY29lZmZpY2llbnRzIChvbmUgc2lkZSkKLSAgICBjb25zdCBpbnQgTSA9ICgxIDw8IG56KTsKKwogICAgIGNvbnN0IGludCBOID0gTSAqIG56YzsKIAorICAgIC8vIGxlcnAgKHdoaWNoIGlzIG1vc3QgdXNlZnVsIGlmIE0gaXMgYSBwb3dlciBvZiAyKQorCisgICAgaW50IG56ID0gMDsgLy8gcmVjYWxjdWxhdGUgbnogYXMgdGhlIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCBNCisgICAgZm9yIChpbnQgaSA9IE0tMSA7IGk7IGk+Pj0xLCBueisrKTsKICAgICAvLyBnZW5lcmF0ZSB0aGUgcmlnaHQgaGFsZiBvZiB0aGUgZmlsdGVyCiAgICAgaWYgKCFkZWJ1ZykgewogICAgICAgICBwcmludGYoIi8vIGNtZC1saW5lOiAiKTsKQEAgLTIwNyw3ICsyMzIsNyBAQAogICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgIGlmICghcG9seXBoYXNlKSB7CiAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX1NJWkUgICAgICAgICAgID0gJWQ7XG4iLCBOKTsKLSAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTEVSUF9JTlRfQklUUyAgPSAlZDtcbiIsIG56KTsKKyAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfSU5UX1BIQVNFUyAgICAgPSAlZDtcbiIsIE0pOwogICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9OVU1fQ09FRiAgICAgICA9ICVkO1xuIiwgbnpjKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfU0laRSAgICAgICAgICAgPSAlZDtcbiIsIDIqbnpjKnBvbHlOKTsKQEAgLTIyNCw3ICsyNDksNyBAQAogICAgICAgICBmb3IgKGludCBpPTAgOyBpPD1NIDsgaSsrKSB7IC8vIGFuIGV4dHJhIHNldCBvZiBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgogICAgICAgICAgICAgZm9yIChpbnQgaj0wIDsgajxuemMgOyBqKyspIHsKICAgICAgICAgICAgICAgICBpbnQgaXggPSBqKk0gKyBpOwotICAgICAgICAgICAgICAgIGRvdWJsZSB4ID0gKDIuMCAqIE1fUEkgKiBpeCAqIEZjcikgLyAoMSA8PCBueik7CisgICAgICAgICAgICAgICAgZG91YmxlIHggPSAoMi4wICogTV9QSSAqIGl4ICogRmNyKSAvIE07CiAgICAgICAgICAgICAgICAgZG91YmxlIHkgPSBrYWlzZXIoaXgrTiwgMipOLCBiZXRhKSAqIHNpbmMoeCkgKiAyLjAgKiBGY3I7CiAgICAgICAgICAgICAgICAgeSAqPSBhdHRlbjsKIApAQCAtMjMyLDE4ICsyNTcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICAgIik7CiAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IGZsb29yKHkgKiAoKDFVTEw8PChuYy0xKSkpICsgMC41KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHlpID49ICgxTEw8PChuYy0xKSkpIHlpID0gKDFMTDw8KG5jLTEpKS0xOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwgIiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHlpID0gdG9pbnQoeSwgMVVMTDw8KG5jLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5jID4gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4LCAiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA0eCwgIiwgaW50MzJfdCh5aSkmMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJS45ZyVzICIsIHksIGRlYnVnID8gIiwiIDogImYsIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajxwb2x5TiA7IGorKykgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBqPTAgOyBqPHBvbHlOIDsgaisrKSB7CiAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHBoYXNlCiAgICAgICAgICAgICBkb3VibGUgcCA9ICgocG9seU0qaikgJSBwb2x5TikgLyBkb3VibGUocG9seU4pOwogICAgICAgICAgICAgaWYgKCFkZWJ1ZykgcHJpbnRmKCJcbiAgICAiKTsKQEAgLTI1NCw5ICsyODEsMTIgQEAKICAgICAgICAgICAgICAgICBkb3VibGUgeSA9IGthaXNlcihpK04sIDIqTiwgYmV0YSkgKiBzaW5jKHgpICogMi4wICogRmNyOzsKICAgICAgICAgICAgICAgICB5ICo9IGF0dGVuOwogICAgICAgICAgICAgICAgIGlmICghZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSBmbG9vcih5ICogKCgxVUxMPDwobmMtMSkpKSArIDAuNSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh5aSA+PSAoMUxMPDwobmMtMSkpKSB5aSA9ICgxTEw8PChuYy0xKSktMTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSB0b2ludCh5LCAxVUxMPDwobmMtMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmMgPiAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCAiLCBpbnQzMl90KHlpKSYweGZmZmYpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMiLCB5LCBkZWJ1ZyA/ICIiIDogImYiKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNzcsNSArMzA3LDMgQEAKIH0KIAogLy8gaHR0cDovL3d3dy5jc2VlLnVtYmMuZWR1L2hlbHAvc291bmQvQUZzcC1WMlIxL2h0bWwvYXVkaW8vUmVzYW1wQXVkaW8uaHRtbAotCi0K